ngsolve 6.2.2506.post75.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.
Potentially problematic release.
This version of ngsolve might be problematic. Click here for more details.
- ngsolve-6.2.2506.post75.dev0.data/data/bin/ngs_nvcc +14 -0
- ngsolve-6.2.2506.post75.dev0.data/data/bin/ngs_nvlink +14 -0
- ngsolve-6.2.2506.post75.dev0.data/data/bin/ngscxx +15 -0
- ngsolve-6.2.2506.post75.dev0.data/data/bin/ngsld +11 -0
- ngsolve-6.2.2506.post75.dev0.data/data/bin/ngsolve.tcl +648 -0
- ngsolve-6.2.2506.post75.dev0.data/data/bin/ngspy +2 -0
- ngsolve-6.2.2506.post75.dev0.data/data/include/netgen/analytic_integrals.hpp +10 -0
- ngsolve-6.2.2506.post75.dev0.data/data/include/netgen/arnoldi.hpp +55 -0
- ngsolve-6.2.2506.post75.dev0.data/data/include/netgen/bandmatrix.hpp +334 -0
- ngsolve-6.2.2506.post75.dev0.data/data/include/netgen/basematrix.hpp +957 -0
- ngsolve-6.2.2506.post75.dev0.data/data/include/netgen/basevector.hpp +1268 -0
- ngsolve-6.2.2506.post75.dev0.data/data/include/netgen/bdbequations.hpp +2805 -0
- ngsolve-6.2.2506.post75.dev0.data/data/include/netgen/bdbintegrator.hpp +1660 -0
- ngsolve-6.2.2506.post75.dev0.data/data/include/netgen/bem_diffops.hpp +475 -0
- ngsolve-6.2.2506.post75.dev0.data/data/include/netgen/bessel.hpp +1064 -0
- ngsolve-6.2.2506.post75.dev0.data/data/include/netgen/bilinearform.hpp +963 -0
- ngsolve-6.2.2506.post75.dev0.data/data/include/netgen/bla.hpp +29 -0
- ngsolve-6.2.2506.post75.dev0.data/data/include/netgen/blockalloc.hpp +95 -0
- ngsolve-6.2.2506.post75.dev0.data/data/include/netgen/blockjacobi.hpp +328 -0
- ngsolve-6.2.2506.post75.dev0.data/data/include/netgen/bspline.hpp +116 -0
- ngsolve-6.2.2506.post75.dev0.data/data/include/netgen/calcinverse.hpp +141 -0
- ngsolve-6.2.2506.post75.dev0.data/data/include/netgen/cg.hpp +368 -0
- ngsolve-6.2.2506.post75.dev0.data/data/include/netgen/chebyshev.hpp +44 -0
- ngsolve-6.2.2506.post75.dev0.data/data/include/netgen/cholesky.hpp +720 -0
- ngsolve-6.2.2506.post75.dev0.data/data/include/netgen/clapack.h +7254 -0
- ngsolve-6.2.2506.post75.dev0.data/data/include/netgen/code_generation.hpp +296 -0
- ngsolve-6.2.2506.post75.dev0.data/data/include/netgen/coefficient.hpp +2033 -0
- ngsolve-6.2.2506.post75.dev0.data/data/include/netgen/coefficient_impl.hpp +19 -0
- ngsolve-6.2.2506.post75.dev0.data/data/include/netgen/coefficient_stdmath.hpp +167 -0
- ngsolve-6.2.2506.post75.dev0.data/data/include/netgen/commutingAMG.hpp +106 -0
- ngsolve-6.2.2506.post75.dev0.data/data/include/netgen/comp.hpp +79 -0
- ngsolve-6.2.2506.post75.dev0.data/data/include/netgen/compatibility.hpp +41 -0
- ngsolve-6.2.2506.post75.dev0.data/data/include/netgen/complex_wrapper.hpp +73 -0
- ngsolve-6.2.2506.post75.dev0.data/data/include/netgen/compressedfespace.hpp +110 -0
- ngsolve-6.2.2506.post75.dev0.data/data/include/netgen/contact.hpp +235 -0
- ngsolve-6.2.2506.post75.dev0.data/data/include/netgen/cuda_linalg.hpp +175 -0
- ngsolve-6.2.2506.post75.dev0.data/data/include/netgen/cuda_ngbla.hpp +226 -0
- ngsolve-6.2.2506.post75.dev0.data/data/include/netgen/cuda_ngstd.hpp +527 -0
- ngsolve-6.2.2506.post75.dev0.data/data/include/netgen/cuda_profiler.hpp +240 -0
- ngsolve-6.2.2506.post75.dev0.data/data/include/netgen/diagonalmatrix.hpp +154 -0
- ngsolve-6.2.2506.post75.dev0.data/data/include/netgen/differentialoperator.hpp +276 -0
- ngsolve-6.2.2506.post75.dev0.data/data/include/netgen/diffop.hpp +1286 -0
- ngsolve-6.2.2506.post75.dev0.data/data/include/netgen/diffop_impl.hpp +328 -0
- ngsolve-6.2.2506.post75.dev0.data/data/include/netgen/diffopwithfactor.hpp +123 -0
- ngsolve-6.2.2506.post75.dev0.data/data/include/netgen/discontinuous.hpp +84 -0
- ngsolve-6.2.2506.post75.dev0.data/data/include/netgen/dump.hpp +949 -0
- ngsolve-6.2.2506.post75.dev0.data/data/include/netgen/ectypes.hpp +121 -0
- ngsolve-6.2.2506.post75.dev0.data/data/include/netgen/eigen.hpp +60 -0
- ngsolve-6.2.2506.post75.dev0.data/data/include/netgen/eigensystem.hpp +18 -0
- ngsolve-6.2.2506.post75.dev0.data/data/include/netgen/elasticity_equations.hpp +595 -0
- ngsolve-6.2.2506.post75.dev0.data/data/include/netgen/elementbyelement.hpp +195 -0
- ngsolve-6.2.2506.post75.dev0.data/data/include/netgen/elementtopology.hpp +1760 -0
- ngsolve-6.2.2506.post75.dev0.data/data/include/netgen/elementtransformation.hpp +339 -0
- ngsolve-6.2.2506.post75.dev0.data/data/include/netgen/evalfunc.hpp +405 -0
- ngsolve-6.2.2506.post75.dev0.data/data/include/netgen/expr.hpp +1686 -0
- ngsolve-6.2.2506.post75.dev0.data/data/include/netgen/facetfe.hpp +175 -0
- ngsolve-6.2.2506.post75.dev0.data/data/include/netgen/facetfespace.hpp +180 -0
- ngsolve-6.2.2506.post75.dev0.data/data/include/netgen/facethofe.hpp +111 -0
- ngsolve-6.2.2506.post75.dev0.data/data/include/netgen/facetsurffespace.hpp +112 -0
- ngsolve-6.2.2506.post75.dev0.data/data/include/netgen/fe_interfaces.hpp +32 -0
- ngsolve-6.2.2506.post75.dev0.data/data/include/netgen/fem.hpp +87 -0
- ngsolve-6.2.2506.post75.dev0.data/data/include/netgen/fesconvert.hpp +14 -0
- ngsolve-6.2.2506.post75.dev0.data/data/include/netgen/fespace.hpp +1449 -0
- ngsolve-6.2.2506.post75.dev0.data/data/include/netgen/finiteelement.hpp +286 -0
- ngsolve-6.2.2506.post75.dev0.data/data/include/netgen/globalinterfacespace.hpp +77 -0
- ngsolve-6.2.2506.post75.dev0.data/data/include/netgen/globalspace.hpp +115 -0
- ngsolve-6.2.2506.post75.dev0.data/data/include/netgen/gridfunction.hpp +525 -0
- ngsolve-6.2.2506.post75.dev0.data/data/include/netgen/h1amg.hpp +124 -0
- ngsolve-6.2.2506.post75.dev0.data/data/include/netgen/h1hofe.hpp +188 -0
- ngsolve-6.2.2506.post75.dev0.data/data/include/netgen/h1hofe_impl.hpp +1262 -0
- ngsolve-6.2.2506.post75.dev0.data/data/include/netgen/h1hofefo.hpp +148 -0
- ngsolve-6.2.2506.post75.dev0.data/data/include/netgen/h1hofefo_impl.hpp +185 -0
- ngsolve-6.2.2506.post75.dev0.data/data/include/netgen/h1hofespace.hpp +167 -0
- ngsolve-6.2.2506.post75.dev0.data/data/include/netgen/h1lofe.hpp +1240 -0
- ngsolve-6.2.2506.post75.dev0.data/data/include/netgen/h1lumping.hpp +41 -0
- ngsolve-6.2.2506.post75.dev0.data/data/include/netgen/hcurl_equations.hpp +1381 -0
- ngsolve-6.2.2506.post75.dev0.data/data/include/netgen/hcurlcurlfe.hpp +2241 -0
- ngsolve-6.2.2506.post75.dev0.data/data/include/netgen/hcurlcurlfespace.hpp +78 -0
- ngsolve-6.2.2506.post75.dev0.data/data/include/netgen/hcurlfe.hpp +259 -0
- ngsolve-6.2.2506.post75.dev0.data/data/include/netgen/hcurlfe_utils.hpp +107 -0
- ngsolve-6.2.2506.post75.dev0.data/data/include/netgen/hcurlhdiv_dshape.hpp +857 -0
- ngsolve-6.2.2506.post75.dev0.data/data/include/netgen/hcurlhdivfes.hpp +308 -0
- ngsolve-6.2.2506.post75.dev0.data/data/include/netgen/hcurlhofe.hpp +175 -0
- ngsolve-6.2.2506.post75.dev0.data/data/include/netgen/hcurlhofe_impl.hpp +1871 -0
- ngsolve-6.2.2506.post75.dev0.data/data/include/netgen/hcurlhofespace.hpp +193 -0
- ngsolve-6.2.2506.post75.dev0.data/data/include/netgen/hcurllofe.hpp +1146 -0
- ngsolve-6.2.2506.post75.dev0.data/data/include/netgen/hdiv_equations.hpp +880 -0
- ngsolve-6.2.2506.post75.dev0.data/data/include/netgen/hdivdivfe.hpp +2923 -0
- ngsolve-6.2.2506.post75.dev0.data/data/include/netgen/hdivdivsurfacespace.hpp +76 -0
- ngsolve-6.2.2506.post75.dev0.data/data/include/netgen/hdivfe.hpp +206 -0
- ngsolve-6.2.2506.post75.dev0.data/data/include/netgen/hdivfe_utils.hpp +717 -0
- ngsolve-6.2.2506.post75.dev0.data/data/include/netgen/hdivfes.hpp +75 -0
- ngsolve-6.2.2506.post75.dev0.data/data/include/netgen/hdivhofe.hpp +447 -0
- ngsolve-6.2.2506.post75.dev0.data/data/include/netgen/hdivhofe_impl.hpp +1107 -0
- ngsolve-6.2.2506.post75.dev0.data/data/include/netgen/hdivhofefo.hpp +229 -0
- ngsolve-6.2.2506.post75.dev0.data/data/include/netgen/hdivhofespace.hpp +177 -0
- ngsolve-6.2.2506.post75.dev0.data/data/include/netgen/hdivhosurfacefespace.hpp +106 -0
- ngsolve-6.2.2506.post75.dev0.data/data/include/netgen/hdivlofe.hpp +773 -0
- ngsolve-6.2.2506.post75.dev0.data/data/include/netgen/hidden.hpp +74 -0
- ngsolve-6.2.2506.post75.dev0.data/data/include/netgen/householder.hpp +181 -0
- ngsolve-6.2.2506.post75.dev0.data/data/include/netgen/hypre_ams_precond.hpp +123 -0
- ngsolve-6.2.2506.post75.dev0.data/data/include/netgen/hypre_precond.hpp +73 -0
- ngsolve-6.2.2506.post75.dev0.data/data/include/netgen/integrator.hpp +2012 -0
- ngsolve-6.2.2506.post75.dev0.data/data/include/netgen/integratorcf.hpp +253 -0
- ngsolve-6.2.2506.post75.dev0.data/data/include/netgen/interpolate.hpp +49 -0
- ngsolve-6.2.2506.post75.dev0.data/data/include/netgen/intrule.hpp +2542 -0
- ngsolve-6.2.2506.post75.dev0.data/data/include/netgen/intrules_SauterSchwab.hpp +25 -0
- ngsolve-6.2.2506.post75.dev0.data/data/include/netgen/irspace.hpp +49 -0
- ngsolve-6.2.2506.post75.dev0.data/data/include/netgen/jacobi.hpp +153 -0
- ngsolve-6.2.2506.post75.dev0.data/data/include/netgen/kernels.hpp +762 -0
- ngsolve-6.2.2506.post75.dev0.data/data/include/netgen/l2hofe.hpp +194 -0
- ngsolve-6.2.2506.post75.dev0.data/data/include/netgen/l2hofe_impl.hpp +564 -0
- ngsolve-6.2.2506.post75.dev0.data/data/include/netgen/l2hofefo.hpp +542 -0
- ngsolve-6.2.2506.post75.dev0.data/data/include/netgen/l2hofespace.hpp +344 -0
- ngsolve-6.2.2506.post75.dev0.data/data/include/netgen/la.hpp +38 -0
- ngsolve-6.2.2506.post75.dev0.data/data/include/netgen/linalg_kernels.hpp +102 -0
- ngsolve-6.2.2506.post75.dev0.data/data/include/netgen/linearform.hpp +266 -0
- ngsolve-6.2.2506.post75.dev0.data/data/include/netgen/matrix.hpp +2140 -0
- ngsolve-6.2.2506.post75.dev0.data/data/include/netgen/memusage.hpp +41 -0
- ngsolve-6.2.2506.post75.dev0.data/data/include/netgen/meshaccess.hpp +1359 -0
- ngsolve-6.2.2506.post75.dev0.data/data/include/netgen/mgpre.hpp +204 -0
- ngsolve-6.2.2506.post75.dev0.data/data/include/netgen/mp_coefficient.hpp +145 -0
- ngsolve-6.2.2506.post75.dev0.data/data/include/netgen/mptools.hpp +2281 -0
- ngsolve-6.2.2506.post75.dev0.data/data/include/netgen/multigrid.hpp +42 -0
- ngsolve-6.2.2506.post75.dev0.data/data/include/netgen/multivector.hpp +447 -0
- ngsolve-6.2.2506.post75.dev0.data/data/include/netgen/mumpsinverse.hpp +187 -0
- ngsolve-6.2.2506.post75.dev0.data/data/include/netgen/mycomplex.hpp +361 -0
- ngsolve-6.2.2506.post75.dev0.data/data/include/netgen/ng_lapack.hpp +1661 -0
- ngsolve-6.2.2506.post75.dev0.data/data/include/netgen/ngblas.hpp +1232 -0
- ngsolve-6.2.2506.post75.dev0.data/data/include/netgen/ngs_defines.hpp +30 -0
- ngsolve-6.2.2506.post75.dev0.data/data/include/netgen/ngs_stdcpp_include.hpp +106 -0
- ngsolve-6.2.2506.post75.dev0.data/data/include/netgen/ngs_utils.hpp +121 -0
- ngsolve-6.2.2506.post75.dev0.data/data/include/netgen/ngsobject.hpp +1019 -0
- ngsolve-6.2.2506.post75.dev0.data/data/include/netgen/ngsstream.hpp +113 -0
- ngsolve-6.2.2506.post75.dev0.data/data/include/netgen/ngstd.hpp +72 -0
- ngsolve-6.2.2506.post75.dev0.data/data/include/netgen/nodalhofe.hpp +96 -0
- ngsolve-6.2.2506.post75.dev0.data/data/include/netgen/nodalhofe_impl.hpp +141 -0
- ngsolve-6.2.2506.post75.dev0.data/data/include/netgen/normalfacetfe.hpp +223 -0
- ngsolve-6.2.2506.post75.dev0.data/data/include/netgen/normalfacetfespace.hpp +98 -0
- ngsolve-6.2.2506.post75.dev0.data/data/include/netgen/normalfacetsurfacefespace.hpp +84 -0
- ngsolve-6.2.2506.post75.dev0.data/data/include/netgen/order.hpp +251 -0
- ngsolve-6.2.2506.post75.dev0.data/data/include/netgen/parallel_matrices.hpp +222 -0
- ngsolve-6.2.2506.post75.dev0.data/data/include/netgen/paralleldofs.hpp +340 -0
- ngsolve-6.2.2506.post75.dev0.data/data/include/netgen/parallelngs.hpp +23 -0
- ngsolve-6.2.2506.post75.dev0.data/data/include/netgen/parallelvector.hpp +269 -0
- ngsolve-6.2.2506.post75.dev0.data/data/include/netgen/pardisoinverse.hpp +200 -0
- ngsolve-6.2.2506.post75.dev0.data/data/include/netgen/periodic.hpp +129 -0
- ngsolve-6.2.2506.post75.dev0.data/data/include/netgen/plateaufespace.hpp +25 -0
- ngsolve-6.2.2506.post75.dev0.data/data/include/netgen/pml.hpp +275 -0
- ngsolve-6.2.2506.post75.dev0.data/data/include/netgen/pmltrafo.hpp +631 -0
- ngsolve-6.2.2506.post75.dev0.data/data/include/netgen/postproc.hpp +142 -0
- ngsolve-6.2.2506.post75.dev0.data/data/include/netgen/potentialtools.hpp +22 -0
- ngsolve-6.2.2506.post75.dev0.data/data/include/netgen/precomp.hpp +60 -0
- ngsolve-6.2.2506.post75.dev0.data/data/include/netgen/preconditioner.hpp +602 -0
- ngsolve-6.2.2506.post75.dev0.data/data/include/netgen/prolongation.hpp +377 -0
- ngsolve-6.2.2506.post75.dev0.data/data/include/netgen/python_comp.hpp +107 -0
- ngsolve-6.2.2506.post75.dev0.data/data/include/netgen/python_fem.hpp +89 -0
- ngsolve-6.2.2506.post75.dev0.data/data/include/netgen/python_linalg.hpp +58 -0
- ngsolve-6.2.2506.post75.dev0.data/data/include/netgen/python_ngstd.hpp +386 -0
- ngsolve-6.2.2506.post75.dev0.data/data/include/netgen/recursive_pol.hpp +4896 -0
- ngsolve-6.2.2506.post75.dev0.data/data/include/netgen/recursive_pol_tet.hpp +395 -0
- ngsolve-6.2.2506.post75.dev0.data/data/include/netgen/recursive_pol_trig.hpp +492 -0
- ngsolve-6.2.2506.post75.dev0.data/data/include/netgen/reorderedfespace.hpp +81 -0
- ngsolve-6.2.2506.post75.dev0.data/data/include/netgen/sample_sort.hpp +105 -0
- ngsolve-6.2.2506.post75.dev0.data/data/include/netgen/scalarfe.hpp +335 -0
- ngsolve-6.2.2506.post75.dev0.data/data/include/netgen/shapefunction_utils.hpp +113 -0
- ngsolve-6.2.2506.post75.dev0.data/data/include/netgen/simd_complex.hpp +329 -0
- ngsolve-6.2.2506.post75.dev0.data/data/include/netgen/smoother.hpp +253 -0
- ngsolve-6.2.2506.post75.dev0.data/data/include/netgen/solve.hpp +89 -0
- ngsolve-6.2.2506.post75.dev0.data/data/include/netgen/sparsecholesky.hpp +313 -0
- ngsolve-6.2.2506.post75.dev0.data/data/include/netgen/sparsematrix.hpp +1038 -0
- ngsolve-6.2.2506.post75.dev0.data/data/include/netgen/sparsematrix_dyn.hpp +90 -0
- ngsolve-6.2.2506.post75.dev0.data/data/include/netgen/sparsematrix_impl.hpp +1013 -0
- ngsolve-6.2.2506.post75.dev0.data/data/include/netgen/special_matrix.hpp +463 -0
- ngsolve-6.2.2506.post75.dev0.data/data/include/netgen/specialelement.hpp +125 -0
- ngsolve-6.2.2506.post75.dev0.data/data/include/netgen/statushandler.hpp +33 -0
- ngsolve-6.2.2506.post75.dev0.data/data/include/netgen/stringops.hpp +12 -0
- ngsolve-6.2.2506.post75.dev0.data/data/include/netgen/superluinverse.hpp +136 -0
- ngsolve-6.2.2506.post75.dev0.data/data/include/netgen/symbolicintegrator.hpp +850 -0
- ngsolve-6.2.2506.post75.dev0.data/data/include/netgen/symmetricmatrix.hpp +144 -0
- ngsolve-6.2.2506.post75.dev0.data/data/include/netgen/tangentialfacetfe.hpp +224 -0
- ngsolve-6.2.2506.post75.dev0.data/data/include/netgen/tangentialfacetfespace.hpp +91 -0
- ngsolve-6.2.2506.post75.dev0.data/data/include/netgen/tensor.hpp +522 -0
- ngsolve-6.2.2506.post75.dev0.data/data/include/netgen/tensorcoefficient.hpp +446 -0
- ngsolve-6.2.2506.post75.dev0.data/data/include/netgen/tensorproductintegrator.hpp +113 -0
- ngsolve-6.2.2506.post75.dev0.data/data/include/netgen/thcurlfe.hpp +128 -0
- ngsolve-6.2.2506.post75.dev0.data/data/include/netgen/thcurlfe_impl.hpp +380 -0
- ngsolve-6.2.2506.post75.dev0.data/data/include/netgen/thdivfe.hpp +80 -0
- ngsolve-6.2.2506.post75.dev0.data/data/include/netgen/thdivfe_impl.hpp +492 -0
- ngsolve-6.2.2506.post75.dev0.data/data/include/netgen/tpdiffop.hpp +461 -0
- ngsolve-6.2.2506.post75.dev0.data/data/include/netgen/tpfes.hpp +133 -0
- ngsolve-6.2.2506.post75.dev0.data/data/include/netgen/tpintrule.hpp +224 -0
- ngsolve-6.2.2506.post75.dev0.data/data/include/netgen/triangular.hpp +465 -0
- ngsolve-6.2.2506.post75.dev0.data/data/include/netgen/tscalarfe.hpp +245 -0
- ngsolve-6.2.2506.post75.dev0.data/data/include/netgen/tscalarfe_impl.hpp +1029 -0
- ngsolve-6.2.2506.post75.dev0.data/data/include/netgen/umfpackinverse.hpp +148 -0
- ngsolve-6.2.2506.post75.dev0.data/data/include/netgen/unifiedvector.hpp +103 -0
- ngsolve-6.2.2506.post75.dev0.data/data/include/netgen/vector.hpp +1273 -0
- ngsolve-6.2.2506.post75.dev0.data/data/include/netgen/voxelcoefficientfunction.hpp +41 -0
- ngsolve-6.2.2506.post75.dev0.data/data/include/netgen/vtkoutput.hpp +198 -0
- ngsolve-6.2.2506.post75.dev0.data/data/include/netgen/vvector.hpp +208 -0
- ngsolve-6.2.2506.post75.dev0.data/data/include/netgen/webgui.hpp +92 -0
- ngsolve-6.2.2506.post75.dev0.data/data/lib/cmake/ngsolve/NGSolveConfig.cmake +102 -0
- ngsolve-6.2.2506.post75.dev0.data/data/lib/cmake/ngsolve/ngsolve-targets-release.cmake +89 -0
- ngsolve-6.2.2506.post75.dev0.data/data/lib/cmake/ngsolve/ngsolve-targets.cmake +173 -0
- ngsolve-6.2.2506.post75.dev0.data/data/lib/python3.14/site-packages/netgen_mesher.libs/libngbla.so +0 -0
- ngsolve-6.2.2506.post75.dev0.data/data/lib/python3.14/site-packages/netgen_mesher.libs/libngcomp.so +0 -0
- ngsolve-6.2.2506.post75.dev0.data/data/lib/python3.14/site-packages/netgen_mesher.libs/libngfem.so +0 -0
- ngsolve-6.2.2506.post75.dev0.data/data/lib/python3.14/site-packages/netgen_mesher.libs/libngla.so +0 -0
- ngsolve-6.2.2506.post75.dev0.data/data/lib/python3.14/site-packages/netgen_mesher.libs/libngsbem.so +0 -0
- ngsolve-6.2.2506.post75.dev0.data/data/lib/python3.14/site-packages/netgen_mesher.libs/libngscudalib.so +0 -0
- ngsolve-6.2.2506.post75.dev0.data/data/lib/python3.14/site-packages/netgen_mesher.libs/libngsolve.so +0 -0
- ngsolve-6.2.2506.post75.dev0.data/data/lib/python3.14/site-packages/netgen_mesher.libs/libngstd.so +0 -0
- ngsolve-6.2.2506.post75.dev0.data/data/lib/python3.14/site-packages/ngsolve/TensorProductTools.py +210 -0
- ngsolve-6.2.2506.post75.dev0.data/data/lib/python3.14/site-packages/ngsolve/__console.py +94 -0
- ngsolve-6.2.2506.post75.dev0.data/data/lib/python3.14/site-packages/ngsolve/__expr.py +181 -0
- ngsolve-6.2.2506.post75.dev0.data/data/lib/python3.14/site-packages/ngsolve/__init__.py +148 -0
- ngsolve-6.2.2506.post75.dev0.data/data/lib/python3.14/site-packages/ngsolve/_scikit_build_core_dependencies.py +30 -0
- ngsolve-6.2.2506.post75.dev0.data/data/lib/python3.14/site-packages/ngsolve/bvp.py +78 -0
- ngsolve-6.2.2506.post75.dev0.data/data/lib/python3.14/site-packages/ngsolve/config/__init__.py +1 -0
- ngsolve-6.2.2506.post75.dev0.data/data/lib/python3.14/site-packages/ngsolve/config/__main__.py +4 -0
- ngsolve-6.2.2506.post75.dev0.data/data/lib/python3.14/site-packages/ngsolve/config/config.py +60 -0
- ngsolve-6.2.2506.post75.dev0.data/data/lib/python3.14/site-packages/ngsolve/demos/TensorProduct/__init__.py +0 -0
- ngsolve-6.2.2506.post75.dev0.data/data/lib/python3.14/site-packages/ngsolve/demos/TensorProduct/tp_dg_1d_1d.py +80 -0
- ngsolve-6.2.2506.post75.dev0.data/data/lib/python3.14/site-packages/ngsolve/demos/TensorProduct/tp_dg_1d_2d.py +73 -0
- ngsolve-6.2.2506.post75.dev0.data/data/lib/python3.14/site-packages/ngsolve/demos/TensorProduct/tp_dg_2d_1d.py +72 -0
- ngsolve-6.2.2506.post75.dev0.data/data/lib/python3.14/site-packages/ngsolve/demos/TensorProduct/tp_dg_2d_2d.py +66 -0
- ngsolve-6.2.2506.post75.dev0.data/data/lib/python3.14/site-packages/ngsolve/demos/__init__.py +0 -0
- ngsolve-6.2.2506.post75.dev0.data/data/lib/python3.14/site-packages/ngsolve/demos/howto/__init__.py +0 -0
- ngsolve-6.2.2506.post75.dev0.data/data/lib/python3.14/site-packages/ngsolve/demos/howto/hhj.py +44 -0
- ngsolve-6.2.2506.post75.dev0.data/data/lib/python3.14/site-packages/ngsolve/demos/howto/hybrid_dg.py +53 -0
- ngsolve-6.2.2506.post75.dev0.data/data/lib/python3.14/site-packages/ngsolve/demos/howto/mixed.py +30 -0
- ngsolve-6.2.2506.post75.dev0.data/data/lib/python3.14/site-packages/ngsolve/demos/howto/nonlin.py +29 -0
- ngsolve-6.2.2506.post75.dev0.data/data/lib/python3.14/site-packages/ngsolve/demos/howto/pickling.py +26 -0
- ngsolve-6.2.2506.post75.dev0.data/data/lib/python3.14/site-packages/ngsolve/demos/howto/pml.py +31 -0
- ngsolve-6.2.2506.post75.dev0.data/data/lib/python3.14/site-packages/ngsolve/demos/howto/taskmanager.py +20 -0
- ngsolve-6.2.2506.post75.dev0.data/data/lib/python3.14/site-packages/ngsolve/demos/howto/tdnns.py +47 -0
- ngsolve-6.2.2506.post75.dev0.data/data/lib/python3.14/site-packages/ngsolve/demos/howto/timeDG-skeleton.py +45 -0
- ngsolve-6.2.2506.post75.dev0.data/data/lib/python3.14/site-packages/ngsolve/demos/howto/timeDG.py +38 -0
- ngsolve-6.2.2506.post75.dev0.data/data/lib/python3.14/site-packages/ngsolve/demos/howto/timeDGlap.py +42 -0
- ngsolve-6.2.2506.post75.dev0.data/data/lib/python3.14/site-packages/ngsolve/demos/howto/timeDGwave.py +61 -0
- ngsolve-6.2.2506.post75.dev0.data/data/lib/python3.14/site-packages/ngsolve/demos/intro/__init__.py +0 -0
- ngsolve-6.2.2506.post75.dev0.data/data/lib/python3.14/site-packages/ngsolve/demos/intro/adaptive.py +123 -0
- ngsolve-6.2.2506.post75.dev0.data/data/lib/python3.14/site-packages/ngsolve/demos/intro/cmagnet.py +59 -0
- ngsolve-6.2.2506.post75.dev0.data/data/lib/python3.14/site-packages/ngsolve/demos/intro/elasticity.py +76 -0
- ngsolve-6.2.2506.post75.dev0.data/data/lib/python3.14/site-packages/ngsolve/demos/intro/navierstokes.py +74 -0
- ngsolve-6.2.2506.post75.dev0.data/data/lib/python3.14/site-packages/ngsolve/demos/intro/poisson.ipynb +170 -0
- ngsolve-6.2.2506.post75.dev0.data/data/lib/python3.14/site-packages/ngsolve/demos/intro/poisson.py +41 -0
- ngsolve-6.2.2506.post75.dev0.data/data/lib/python3.14/site-packages/ngsolve/demos/mpi/__init__.py +0 -0
- ngsolve-6.2.2506.post75.dev0.data/data/lib/python3.14/site-packages/ngsolve/demos/mpi/mpi_cmagnet.py +87 -0
- ngsolve-6.2.2506.post75.dev0.data/data/lib/python3.14/site-packages/ngsolve/demos/mpi/mpi_navierstokes.py +117 -0
- ngsolve-6.2.2506.post75.dev0.data/data/lib/python3.14/site-packages/ngsolve/demos/mpi/mpi_poisson.py +89 -0
- ngsolve-6.2.2506.post75.dev0.data/data/lib/python3.14/site-packages/ngsolve/demos/mpi/mpi_timeDG.py +82 -0
- ngsolve-6.2.2506.post75.dev0.data/data/lib/python3.14/site-packages/ngsolve/directsolvers.py +26 -0
- ngsolve-6.2.2506.post75.dev0.data/data/lib/python3.14/site-packages/ngsolve/eigenvalues.py +364 -0
- ngsolve-6.2.2506.post75.dev0.data/data/lib/python3.14/site-packages/ngsolve/internal.py +89 -0
- ngsolve-6.2.2506.post75.dev0.data/data/lib/python3.14/site-packages/ngsolve/krylovspace.py +1013 -0
- ngsolve-6.2.2506.post75.dev0.data/data/lib/python3.14/site-packages/ngsolve/meshes.py +748 -0
- ngsolve-6.2.2506.post75.dev0.data/data/lib/python3.14/site-packages/ngsolve/ngs2petsc.py +310 -0
- ngsolve-6.2.2506.post75.dev0.data/data/lib/python3.14/site-packages/ngsolve/ngscuda.so +0 -0
- ngsolve-6.2.2506.post75.dev0.data/data/lib/python3.14/site-packages/ngsolve/ngscxx.py +42 -0
- ngsolve-6.2.2506.post75.dev0.data/data/lib/python3.14/site-packages/ngsolve/ngslib.so +0 -0
- ngsolve-6.2.2506.post75.dev0.data/data/lib/python3.14/site-packages/ngsolve/nonlinearsolvers.py +203 -0
- ngsolve-6.2.2506.post75.dev0.data/data/lib/python3.14/site-packages/ngsolve/preconditioners.py +11 -0
- ngsolve-6.2.2506.post75.dev0.data/data/lib/python3.14/site-packages/ngsolve/solve_implementation.py +168 -0
- ngsolve-6.2.2506.post75.dev0.data/data/lib/python3.14/site-packages/ngsolve/solvers.py +7 -0
- ngsolve-6.2.2506.post75.dev0.data/data/lib/python3.14/site-packages/ngsolve/timestepping.py +185 -0
- ngsolve-6.2.2506.post75.dev0.data/data/lib/python3.14/site-packages/ngsolve/timing.py +108 -0
- ngsolve-6.2.2506.post75.dev0.data/data/lib/python3.14/site-packages/ngsolve/utils.py +167 -0
- ngsolve-6.2.2506.post75.dev0.data/data/lib/python3.14/site-packages/ngsolve/webgui.py +670 -0
- ngsolve-6.2.2506.post75.dev0.data/data/share/ngsolve/beam.geo +17 -0
- ngsolve-6.2.2506.post75.dev0.data/data/share/ngsolve/beam.vol +240 -0
- ngsolve-6.2.2506.post75.dev0.data/data/share/ngsolve/chip.in2d +41 -0
- ngsolve-6.2.2506.post75.dev0.data/data/share/ngsolve/chip.vol +614 -0
- ngsolve-6.2.2506.post75.dev0.data/data/share/ngsolve/coil.geo +12 -0
- ngsolve-6.2.2506.post75.dev0.data/data/share/ngsolve/coil.vol +2560 -0
- ngsolve-6.2.2506.post75.dev0.data/data/share/ngsolve/coilshield.geo +24 -0
- ngsolve-6.2.2506.post75.dev0.data/data/share/ngsolve/coilshield.vol +3179 -0
- ngsolve-6.2.2506.post75.dev0.data/data/share/ngsolve/cube.geo +19 -0
- ngsolve-6.2.2506.post75.dev0.data/data/share/ngsolve/cube.vol +1832 -0
- ngsolve-6.2.2506.post75.dev0.data/data/share/ngsolve/d10_DGdoubleglazing.pde +50 -0
- ngsolve-6.2.2506.post75.dev0.data/data/share/ngsolve/d11_chip_nitsche.pde +40 -0
- ngsolve-6.2.2506.post75.dev0.data/data/share/ngsolve/d1_square.pde +43 -0
- ngsolve-6.2.2506.post75.dev0.data/data/share/ngsolve/d2_chip.pde +35 -0
- ngsolve-6.2.2506.post75.dev0.data/data/share/ngsolve/d3_helmholtz.pde +22 -0
- ngsolve-6.2.2506.post75.dev0.data/data/share/ngsolve/d4_cube.pde +46 -0
- ngsolve-6.2.2506.post75.dev0.data/data/share/ngsolve/d5_beam.pde +74 -0
- ngsolve-6.2.2506.post75.dev0.data/data/share/ngsolve/d6_shaft.pde +73 -0
- ngsolve-6.2.2506.post75.dev0.data/data/share/ngsolve/d7_coil.pde +50 -0
- ngsolve-6.2.2506.post75.dev0.data/data/share/ngsolve/d8_coilshield.pde +49 -0
- ngsolve-6.2.2506.post75.dev0.data/data/share/ngsolve/d9_hybridDG.pde +72 -0
- ngsolve-6.2.2506.post75.dev0.data/data/share/ngsolve/doubleglazing.in2d +27 -0
- ngsolve-6.2.2506.post75.dev0.data/data/share/ngsolve/doubleglazing.vol +737 -0
- ngsolve-6.2.2506.post75.dev0.data/data/share/ngsolve/piezo2d40round4.vol.gz +0 -0
- ngsolve-6.2.2506.post75.dev0.data/data/share/ngsolve/shaft.geo +73 -0
- ngsolve-6.2.2506.post75.dev0.data/data/share/ngsolve/shaft.vol +4291 -0
- ngsolve-6.2.2506.post75.dev0.data/data/share/ngsolve/square.in2d +17 -0
- ngsolve-6.2.2506.post75.dev0.data/data/share/ngsolve/square.vol +149 -0
- ngsolve-6.2.2506.post75.dev0.dist-info/METADATA +14 -0
- ngsolve-6.2.2506.post75.dev0.dist-info/RECORD +303 -0
- ngsolve-6.2.2506.post75.dev0.dist-info/WHEEL +5 -0
- ngsolve-6.2.2506.post75.dev0.dist-info/licenses/LICENSE +504 -0
- ngsolve-6.2.2506.post75.dev0.dist-info/top_level.txt +1 -0
|
@@ -0,0 +1,1273 @@
|
|
|
1
|
+
#ifndef FILE_VECTOR_EXPR
|
|
2
|
+
#define FILE_VECTOR_EXPR
|
|
3
|
+
|
|
4
|
+
/**************************************************************************/
|
|
5
|
+
/* File: vector.hpp */
|
|
6
|
+
/* Author: Joachim Schoeberl */
|
|
7
|
+
/* Date: 01. Jan. 02 */
|
|
8
|
+
/**************************************************************************/
|
|
9
|
+
|
|
10
|
+
#include "expr.hpp"
|
|
11
|
+
#include <core/hashtable.hpp> // for SparseVector
|
|
12
|
+
|
|
13
|
+
namespace ngbla
|
|
14
|
+
{
|
|
15
|
+
|
|
16
|
+
template <typename T=double, typename TS=size_t, typename TDIST=IC<1>> class VectorView;
|
|
17
|
+
|
|
18
|
+
|
|
19
|
+
template <typename T, typename ...Args>
|
|
20
|
+
INLINE void SetVector (typename mat_traits<T>::TSCAL val, VectorView<T,Args...> vec) NETGEN_NOEXCEPT
|
|
21
|
+
{
|
|
22
|
+
for (size_t i : Range(vec))
|
|
23
|
+
vec[i] = val;
|
|
24
|
+
}
|
|
25
|
+
|
|
26
|
+
|
|
27
|
+
|
|
28
|
+
template <typename T = double>
|
|
29
|
+
using FlatVector = VectorView<T,size_t,IC<1>>;
|
|
30
|
+
|
|
31
|
+
template <typename T, typename TELEM=typename T::TELEM>
|
|
32
|
+
constexpr bool IsConvertibleToFlatVector () {
|
|
33
|
+
return is_constructible_v<FlatVector<TELEM>,T>;
|
|
34
|
+
}
|
|
35
|
+
|
|
36
|
+
template <typename T, typename TELEM=typename T::TELEM>
|
|
37
|
+
auto make_FlatVector (const T & v) {
|
|
38
|
+
return FlatVector<TELEM> (v);
|
|
39
|
+
}
|
|
40
|
+
|
|
41
|
+
|
|
42
|
+
|
|
43
|
+
template <typename T = double>
|
|
44
|
+
using SliceVector = VectorView<T,size_t,size_t>;
|
|
45
|
+
|
|
46
|
+
template <typename T, typename TELEM=typename T::TELEM>
|
|
47
|
+
constexpr bool IsConvertibleToSliceVector () {
|
|
48
|
+
return is_constructible_v<SliceVector<TELEM>,T>;
|
|
49
|
+
}
|
|
50
|
+
|
|
51
|
+
template <typename T, typename TELEM=typename T::TELEM>
|
|
52
|
+
auto make_SliceVector (const T & v) {
|
|
53
|
+
return SliceVector<TELEM> (v);
|
|
54
|
+
}
|
|
55
|
+
|
|
56
|
+
|
|
57
|
+
|
|
58
|
+
|
|
59
|
+
template <typename T = double>
|
|
60
|
+
using BareSliceVector = VectorView<T,undefined_size,size_t>;
|
|
61
|
+
|
|
62
|
+
template <typename T, typename TELEM=typename T::TELEM>
|
|
63
|
+
constexpr bool IsConvertibleToBareSliceVector () {
|
|
64
|
+
return is_constructible_v<BareSliceVector<TELEM>,T>;
|
|
65
|
+
}
|
|
66
|
+
|
|
67
|
+
template <typename T, typename TELEM=typename T::TELEM>
|
|
68
|
+
auto make_BareSliceVector (const T & v) {
|
|
69
|
+
return BareSliceVector<TELEM> (v);
|
|
70
|
+
}
|
|
71
|
+
|
|
72
|
+
|
|
73
|
+
|
|
74
|
+
template <typename T = double>
|
|
75
|
+
using BareVector = VectorView<T,undefined_size,IC<1>>;
|
|
76
|
+
|
|
77
|
+
template <typename T, typename TELEM=typename T::TELEM>
|
|
78
|
+
constexpr bool IsConvertibleToBareVector () {
|
|
79
|
+
return is_constructible_v<BareVector<TELEM>,T>;
|
|
80
|
+
}
|
|
81
|
+
|
|
82
|
+
template <typename T, typename TELEM=typename T::TELEM>
|
|
83
|
+
auto make_BareVector (const T & v) {
|
|
84
|
+
return BareVector<TELEM> (v);
|
|
85
|
+
}
|
|
86
|
+
|
|
87
|
+
|
|
88
|
+
template <typename T, typename TS>
|
|
89
|
+
using LinearVector = VectorView<T,TS,IC<1>>;
|
|
90
|
+
|
|
91
|
+
|
|
92
|
+
|
|
93
|
+
|
|
94
|
+
|
|
95
|
+
|
|
96
|
+
template <int S, class T> class Vec;
|
|
97
|
+
|
|
98
|
+
template <int S, typename T = double>
|
|
99
|
+
using FlatVec = VectorView<T,IC<S>,IC<1>>;
|
|
100
|
+
|
|
101
|
+
template <int S, int D, typename T = double>
|
|
102
|
+
using FlatSliceVec = VectorView<T,IC<S>,IC<D>>;
|
|
103
|
+
|
|
104
|
+
template <int D, typename T = double>
|
|
105
|
+
using FixSliceVec = VectorView<T,size_t,IC<D>>;
|
|
106
|
+
|
|
107
|
+
|
|
108
|
+
|
|
109
|
+
template <class T> class SysVector;
|
|
110
|
+
template <class T = double> class Vector;
|
|
111
|
+
template <int DIST, typename T> class FixSliceVector;
|
|
112
|
+
|
|
113
|
+
#ifdef WIN32
|
|
114
|
+
// #pragma warning( disable : 4848) // support for standard attribute 'no_unique_address' in C++17 and earlier is a vendor extension
|
|
115
|
+
// #define NO_UNIQUE_ADDRESS [[msvc::no_unique_address]]
|
|
116
|
+
|
|
117
|
+
// Disable this optimization with MSVC because it creates inconsistent results with different versions.
|
|
118
|
+
// Following code returns 8 for compilers up to MSVC version 19.31, and returns 16 from version 19.32, see https://godbolt.org/z/v6P5vsq1M
|
|
119
|
+
#define NO_UNIQUE_ADDRESS
|
|
120
|
+
/*
|
|
121
|
+
struct Base{};
|
|
122
|
+
struct Empty {};
|
|
123
|
+
|
|
124
|
+
template <typename T, typename TS>
|
|
125
|
+
class Class : public Base{
|
|
126
|
+
T* data;
|
|
127
|
+
[[msvc::no_unique_address]] TS size;
|
|
128
|
+
};
|
|
129
|
+
|
|
130
|
+
int f() {
|
|
131
|
+
return sizeof(Class<void, Empty>);
|
|
132
|
+
}
|
|
133
|
+
*/
|
|
134
|
+
|
|
135
|
+
#else
|
|
136
|
+
#define NO_UNIQUE_ADDRESS [[no_unique_address]]
|
|
137
|
+
#endif
|
|
138
|
+
|
|
139
|
+
template <typename T, typename TS, typename TDIST>
|
|
140
|
+
class VectorView : public MatExpr<VectorView<T,TS,TDIST>>
|
|
141
|
+
{
|
|
142
|
+
protected:
|
|
143
|
+
typedef MatExpr<VectorView> BASE;
|
|
144
|
+
T * __restrict data;
|
|
145
|
+
NO_UNIQUE_ADDRESS TS size;
|
|
146
|
+
NO_UNIQUE_ADDRESS TDIST dist;
|
|
147
|
+
public:
|
|
148
|
+
typedef T TELEM;
|
|
149
|
+
typedef typename mat_traits<T>::TSCAL TSCAL;
|
|
150
|
+
typedef TDIST type_dist;
|
|
151
|
+
|
|
152
|
+
/// linear element access ?
|
|
153
|
+
static constexpr bool IsLinear() { return std::is_same<type_dist,IC<1>>(); }
|
|
154
|
+
|
|
155
|
+
INLINE VectorView () = default;
|
|
156
|
+
INLINE VectorView (const VectorView&) = default;
|
|
157
|
+
INLINE VectorView (VectorView&&) = default;
|
|
158
|
+
|
|
159
|
+
template <typename T2, typename TS2, typename TDIST2,
|
|
160
|
+
enable_if_t<is_convertible<T2*,T*>::value, int> =0,
|
|
161
|
+
enable_if_t<is_constructible<TS,TS2>::value, int> =0,
|
|
162
|
+
enable_if_t<is_constructible<TDIST,TDIST2>::value, int> =0>
|
|
163
|
+
INLINE VectorView (const VectorView<T2,TS2,TDIST2> & v2)
|
|
164
|
+
: data{v2.Data()}, size{TS(v2.Size())}, dist{TDIST(v2.Dist())} { }
|
|
165
|
+
|
|
166
|
+
INLINE explicit VectorView (T * adata)
|
|
167
|
+
: data(adata)
|
|
168
|
+
{
|
|
169
|
+
; // static_assert(std::is_same<type_dist,IC<1>>());
|
|
170
|
+
}
|
|
171
|
+
INLINE VectorView (TS asize, T * adata)
|
|
172
|
+
: data(adata), size(asize)
|
|
173
|
+
{
|
|
174
|
+
static_assert(std::is_same<type_dist,IC<1>>());
|
|
175
|
+
}
|
|
176
|
+
INLINE VectorView (TS asize, TDIST adist, T * adata)
|
|
177
|
+
: data(adata), size(asize), dist(adist) { }
|
|
178
|
+
|
|
179
|
+
/// allocate FlatVector on local heap
|
|
180
|
+
INLINE VectorView (size_t as, LocalHeap & lh)
|
|
181
|
+
: data(lh.Alloc<T> (as)), size(as), dist(IC<1>()) { }
|
|
182
|
+
|
|
183
|
+
template <typename EXPR>
|
|
184
|
+
INLINE VectorView(LocalHeapExpr<EXPR>&& lhe)
|
|
185
|
+
: VectorView(lhe.Height(), lhe.GetLocalHeap())
|
|
186
|
+
{
|
|
187
|
+
*this = lhe.A();
|
|
188
|
+
}
|
|
189
|
+
|
|
190
|
+
/// put FlatVector over fixed size vector
|
|
191
|
+
|
|
192
|
+
template <int S>
|
|
193
|
+
INLINE VectorView (Vec<S,T> & v)
|
|
194
|
+
: data(v.Data()), size(v.Size()), dist(IC<1>()) { }
|
|
195
|
+
|
|
196
|
+
|
|
197
|
+
/*
|
|
198
|
+
template <int S>
|
|
199
|
+
INLINE VectorView (Vec<S,T> & v)
|
|
200
|
+
: data(const_cast<T*>(v.Data())), size(v.Size()), dist(IC<1>()) { }
|
|
201
|
+
*/
|
|
202
|
+
template <int S>
|
|
203
|
+
INLINE VectorView (const Vec<S,T> & v)
|
|
204
|
+
: data(const_cast<T*>(v.Data())), size(v.Size()), dist(IC<1>()) { }
|
|
205
|
+
/*
|
|
206
|
+
template <int S>
|
|
207
|
+
INLINE VectorView (Vec<S,const T> & v)
|
|
208
|
+
: data(const_cast<T*>(v.Data())), size(v.Size()), dist(IC<1>()) { }
|
|
209
|
+
template <int S>
|
|
210
|
+
INLINE VectorView (const Vec<S,const T> & v)
|
|
211
|
+
: data(const_cast<T*>(v.Data())), size(v.Size()), dist(IC<1>()) { }
|
|
212
|
+
*/
|
|
213
|
+
|
|
214
|
+
INLINE auto Size() const { return size; }
|
|
215
|
+
INLINE auto Dist() const { return dist; }
|
|
216
|
+
INLINE auto Shape() const { return tuple(size); }
|
|
217
|
+
|
|
218
|
+
|
|
219
|
+
INLINE auto Height () const { return size; }
|
|
220
|
+
INLINE auto Width () const { return IC<1>(); }
|
|
221
|
+
|
|
222
|
+
INLINE auto Range () const { return IntRange (0, size); }
|
|
223
|
+
|
|
224
|
+
INLINE T * Addr(size_t i) const { return data+i*dist; }
|
|
225
|
+
INLINE T * Data() const { return data; }
|
|
226
|
+
|
|
227
|
+
INLINE auto View() const { return VectorView(*this); }
|
|
228
|
+
INLINE auto ViewRW() { return this->View(); }
|
|
229
|
+
|
|
230
|
+
|
|
231
|
+
|
|
232
|
+
/// assign memory for vector on local heap
|
|
233
|
+
INLINE void AssignMemory (size_t as, LocalHeap & lh)
|
|
234
|
+
{
|
|
235
|
+
size = as;
|
|
236
|
+
dist = IC<1>();
|
|
237
|
+
data = lh.Alloc<T>(size);
|
|
238
|
+
}
|
|
239
|
+
|
|
240
|
+
/// assign memory for vector
|
|
241
|
+
void AssignMemory (size_t as, T * mem)
|
|
242
|
+
{
|
|
243
|
+
size = as;
|
|
244
|
+
dist = IC<1>();
|
|
245
|
+
data = mem;
|
|
246
|
+
}
|
|
247
|
+
|
|
248
|
+
INLINE auto & operator= (const VectorView & v)
|
|
249
|
+
{
|
|
250
|
+
/*
|
|
251
|
+
auto cs = CombinedSize(this->Size(), v.Size());
|
|
252
|
+
for (size_t i = 0; i < cs; i++)
|
|
253
|
+
data[i*dist] = v(i);
|
|
254
|
+
*/
|
|
255
|
+
this->template Assign<typename BASE::As> (v);
|
|
256
|
+
return *this;
|
|
257
|
+
}
|
|
258
|
+
INLINE auto & operator= (VectorView && v)
|
|
259
|
+
{
|
|
260
|
+
/*
|
|
261
|
+
auto cs = CombinedSize(this->Size(), v.Size());
|
|
262
|
+
for (size_t i = 0; i < cs; i++)
|
|
263
|
+
data[i*dist] = v(i);
|
|
264
|
+
*/
|
|
265
|
+
this->template Assign<typename BASE::As> (v);
|
|
266
|
+
return *this;
|
|
267
|
+
}
|
|
268
|
+
|
|
269
|
+
/// copy vector. sizes must match
|
|
270
|
+
template <typename ...Args>
|
|
271
|
+
INLINE auto & operator= (const VectorView<Args...> & v)
|
|
272
|
+
{
|
|
273
|
+
// BASE::operator= (v);
|
|
274
|
+
this->template Assign<typename BASE::As> (v);
|
|
275
|
+
return *this;
|
|
276
|
+
}
|
|
277
|
+
|
|
278
|
+
template<typename TB>
|
|
279
|
+
INLINE auto & operator= (const Expr<TB> & v)
|
|
280
|
+
{
|
|
281
|
+
// BASE::operator= (v);
|
|
282
|
+
this->template Assign<typename BASE::As> (v);
|
|
283
|
+
return *this;
|
|
284
|
+
}
|
|
285
|
+
|
|
286
|
+
/// assign constant value
|
|
287
|
+
INLINE auto & operator= (TSCAL scal) const
|
|
288
|
+
{
|
|
289
|
+
SetVector (scal, *this);
|
|
290
|
+
return *this;
|
|
291
|
+
}
|
|
292
|
+
|
|
293
|
+
template <int D, typename TSCAL2>
|
|
294
|
+
INLINE auto & operator= (const Vec<D,TSCAL2> & v)
|
|
295
|
+
{
|
|
296
|
+
NETGEN_CHECK_RANGE(D,0,Size()+1);
|
|
297
|
+
for (int i = 0; i < D; i++)
|
|
298
|
+
data[i*dist] = v(i);
|
|
299
|
+
return *this;
|
|
300
|
+
}
|
|
301
|
+
|
|
302
|
+
/// access element
|
|
303
|
+
INLINE TELEM & operator[] (size_t i)
|
|
304
|
+
{
|
|
305
|
+
NETGEN_CHECK_RANGE(i,0,Size());
|
|
306
|
+
return data[i*dist];
|
|
307
|
+
}
|
|
308
|
+
|
|
309
|
+
INLINE const TELEM & operator[] (size_t i) const
|
|
310
|
+
{
|
|
311
|
+
NETGEN_CHECK_RANGE(i,0,Size());
|
|
312
|
+
return data[i*dist];
|
|
313
|
+
}
|
|
314
|
+
|
|
315
|
+
|
|
316
|
+
/// constant element access
|
|
317
|
+
// template<typename I, typename std::enable_if<std::is_integral<I>::value, int>::type = 0>
|
|
318
|
+
template<typename I, typename std::enable_if<std::is_convertible<I,size_t>::value, int>::type = 0>
|
|
319
|
+
INLINE TELEM & operator() (I i) const
|
|
320
|
+
{
|
|
321
|
+
NETGEN_CHECK_RANGE(i,0,Size());
|
|
322
|
+
return data[i*dist];
|
|
323
|
+
}
|
|
324
|
+
|
|
325
|
+
/// element access. index j is ignored
|
|
326
|
+
INLINE TELEM & operator() (size_t i, size_t j) const
|
|
327
|
+
{
|
|
328
|
+
NETGEN_CHECK_RANGE(i,0,Size());
|
|
329
|
+
return data[i*dist];
|
|
330
|
+
}
|
|
331
|
+
|
|
332
|
+
RowsArrayExpr<VectorView> operator() (FlatArray<int> rows) const
|
|
333
|
+
{
|
|
334
|
+
return RowsArrayExpr<VectorView> (*this, rows);
|
|
335
|
+
}
|
|
336
|
+
|
|
337
|
+
INLINE auto Range (size_t first, size_t next) const
|
|
338
|
+
{
|
|
339
|
+
NETGEN_CHECK_RANGE(next,first,Size()+1);
|
|
340
|
+
return VectorView<T,size_t,TDIST> (next-first, dist, data+first*dist);
|
|
341
|
+
}
|
|
342
|
+
|
|
343
|
+
INLINE auto Range (size_t next) const
|
|
344
|
+
{
|
|
345
|
+
return Range(0, next);
|
|
346
|
+
}
|
|
347
|
+
|
|
348
|
+
INLINE auto Range (IntRange range) const
|
|
349
|
+
{
|
|
350
|
+
return Range (range.First(), range.Next());
|
|
351
|
+
}
|
|
352
|
+
|
|
353
|
+
INLINE auto RangeN (size_t first, size_t n) const
|
|
354
|
+
{
|
|
355
|
+
NETGEN_CHECK_RANGE(first+n,first,Size()+1);
|
|
356
|
+
return VectorView<T,size_t,TDIST> (n, dist, data+first*dist);
|
|
357
|
+
}
|
|
358
|
+
|
|
359
|
+
|
|
360
|
+
|
|
361
|
+
/*
|
|
362
|
+
template <int S>
|
|
363
|
+
INLINE auto Range (IC<S> r) const
|
|
364
|
+
{
|
|
365
|
+
return VectorView<T,IC<S>,TDIST> (r, Dist(), Data());
|
|
366
|
+
}
|
|
367
|
+
*/
|
|
368
|
+
|
|
369
|
+
INLINE auto Slice(size_t first, size_t dist2) const
|
|
370
|
+
{
|
|
371
|
+
// return VectorView<T,decltype(declval<TS>()/size_t()), decltype(declval<TDIST>()*size_t())> (size/dist2, dist2*dist, Addr(first));
|
|
372
|
+
return VectorView<T,decltype(declval<TS>()/size_t()), decltype(declval<TDIST>()*size_t())> ( (size-first+dist2-1)/dist2, dist2*dist, Addr(first));
|
|
373
|
+
}
|
|
374
|
+
|
|
375
|
+
INLINE auto Reversed() const
|
|
376
|
+
{
|
|
377
|
+
// return VectorView { Size(), -Dist(), Addr(Size()-1) };
|
|
378
|
+
return VectorView<T,TS,decltype(-declval<TDIST>())> { Size(), -Dist(), Addr(Size()-1) };
|
|
379
|
+
}
|
|
380
|
+
|
|
381
|
+
INLINE auto operator+(int i) const { return VectorView(size-i, dist, data+i*dist); }
|
|
382
|
+
|
|
383
|
+
INLINE auto RemoveConst() const { return VectorView<typename remove_const<T>::type,TS,TDIST>(size, dist, const_cast<typename remove_const<T>::type*> (data)); }
|
|
384
|
+
|
|
385
|
+
INLINE auto AsMatrix (size_t h, size_t w) const
|
|
386
|
+
{
|
|
387
|
+
// todo: checking
|
|
388
|
+
static_assert(std::is_same<TDIST,IC<1>>());
|
|
389
|
+
return FlatMatrix<T> (h,w, data);
|
|
390
|
+
}
|
|
391
|
+
|
|
392
|
+
class Iterator
|
|
393
|
+
{
|
|
394
|
+
VectorView vec;
|
|
395
|
+
size_t ind;
|
|
396
|
+
public:
|
|
397
|
+
INLINE Iterator (VectorView avec, size_t ai) : vec(avec), ind(ai) { ; }
|
|
398
|
+
INLINE Iterator operator++ (int) { return Iterator(vec, ind++); }
|
|
399
|
+
INLINE Iterator operator++ () { return Iterator(vec, ++ind); }
|
|
400
|
+
INLINE TELEM operator*() const { return vec[ind]; }
|
|
401
|
+
INLINE TELEM & operator*() { return vec[ind]; }
|
|
402
|
+
INLINE bool operator != (Iterator d2) { return ind != d2.ind; }
|
|
403
|
+
INLINE bool operator == (Iterator d2) { return ind == d2.ind; }
|
|
404
|
+
};
|
|
405
|
+
|
|
406
|
+
INLINE Iterator begin() const { return Iterator (*this, 0); }
|
|
407
|
+
INLINE Iterator end() const { return Iterator (*this, size); }
|
|
408
|
+
|
|
409
|
+
};
|
|
410
|
+
|
|
411
|
+
|
|
412
|
+
|
|
413
|
+
|
|
414
|
+
|
|
415
|
+
|
|
416
|
+
|
|
417
|
+
|
|
418
|
+
|
|
419
|
+
|
|
420
|
+
|
|
421
|
+
|
|
422
|
+
/**
|
|
423
|
+
A Vector class with memory allocation/deallocation
|
|
424
|
+
*/
|
|
425
|
+
template <typename T>
|
|
426
|
+
class Vector : public FlatVector<T>
|
|
427
|
+
{
|
|
428
|
+
// using FlatVector<T>::data;
|
|
429
|
+
// using FlatVector<T>::size;
|
|
430
|
+
public:
|
|
431
|
+
typedef typename mat_traits<T>::TSCAL TSCAL;
|
|
432
|
+
|
|
433
|
+
/// default constructor
|
|
434
|
+
Vector () : FlatVector<T> (0, (T*)nullptr) { ; }
|
|
435
|
+
|
|
436
|
+
/// allocate vector
|
|
437
|
+
explicit Vector (size_t as) : FlatVector<T> (as, new T[as]) { ; }
|
|
438
|
+
|
|
439
|
+
|
|
440
|
+
/// allocate and copy vector
|
|
441
|
+
Vector (const Vector & v2)
|
|
442
|
+
: FlatVector<T> (v2.Size(), new T[v2.Size()])
|
|
443
|
+
{
|
|
444
|
+
FlatVector<T>::operator= (v2);
|
|
445
|
+
}
|
|
446
|
+
|
|
447
|
+
Vector (Vector && v2)
|
|
448
|
+
: FlatVector<T> (v2.size, v2.data)
|
|
449
|
+
{ v2.data = nullptr; v2.size = 0; }
|
|
450
|
+
|
|
451
|
+
/// allocate and compute
|
|
452
|
+
template<typename TB>
|
|
453
|
+
Vector (const Expr<TB> & v2)
|
|
454
|
+
: FlatVector<T> (v2.Height(), new T[v2.Height()])
|
|
455
|
+
{
|
|
456
|
+
FlatVector<T>::operator= (v2);
|
|
457
|
+
}
|
|
458
|
+
|
|
459
|
+
|
|
460
|
+
Vector (initializer_list<T> list)
|
|
461
|
+
: FlatVector<T> (list.size(), new T[list.size()])
|
|
462
|
+
{
|
|
463
|
+
size_t cnt = 0;
|
|
464
|
+
for (auto val : list)
|
|
465
|
+
(*this)[cnt++] = val;
|
|
466
|
+
}
|
|
467
|
+
|
|
468
|
+
|
|
469
|
+
/// deallocate vector
|
|
470
|
+
~Vector() { delete [] this->data; }
|
|
471
|
+
|
|
472
|
+
/// set vector to constant values
|
|
473
|
+
Vector & operator= (TSCAL scal)
|
|
474
|
+
{
|
|
475
|
+
FlatVector<T>::operator= (scal);
|
|
476
|
+
return *this;
|
|
477
|
+
}
|
|
478
|
+
|
|
479
|
+
/// set vector size
|
|
480
|
+
void SetSize(size_t as)
|
|
481
|
+
{
|
|
482
|
+
if (this->size == as) return;
|
|
483
|
+
delete [] this->data;
|
|
484
|
+
this->size = as;
|
|
485
|
+
if (as != 0)
|
|
486
|
+
this->data = new T[this->size];
|
|
487
|
+
else
|
|
488
|
+
this->data = nullptr;
|
|
489
|
+
}
|
|
490
|
+
|
|
491
|
+
/// evaluate matrix expression
|
|
492
|
+
template<typename TB>
|
|
493
|
+
Vector & operator= (const Expr<TB> & v)
|
|
494
|
+
{
|
|
495
|
+
MatExpr<FlatVector<T> >::operator= (v);
|
|
496
|
+
return *this;
|
|
497
|
+
}
|
|
498
|
+
|
|
499
|
+
Vector & operator= (const Vector & v2)
|
|
500
|
+
{
|
|
501
|
+
FlatVector<T>::operator= (static_cast<FlatVector<T> >(v2));
|
|
502
|
+
// MatExpr<FlatVector<T> >::operator= (v2); // does not work, we don't know why
|
|
503
|
+
return *this;
|
|
504
|
+
}
|
|
505
|
+
|
|
506
|
+
Vector & operator= (Vector && v2)
|
|
507
|
+
{
|
|
508
|
+
this->size = v2.size;
|
|
509
|
+
Swap (this->data, v2.data);
|
|
510
|
+
return *this;
|
|
511
|
+
}
|
|
512
|
+
|
|
513
|
+
Vector & operator= (initializer_list<T> list)
|
|
514
|
+
{
|
|
515
|
+
SetSize (list.size());
|
|
516
|
+
size_t cnt = 0;
|
|
517
|
+
for (auto val : list)
|
|
518
|
+
(*this)[cnt++] = val;
|
|
519
|
+
return *this;
|
|
520
|
+
}
|
|
521
|
+
|
|
522
|
+
};
|
|
523
|
+
|
|
524
|
+
|
|
525
|
+
|
|
526
|
+
|
|
527
|
+
/**
|
|
528
|
+
A Vector class with memory allocation/deallocation. At
|
|
529
|
+
compile-time, a certain amount of vector entries is defined. If the
|
|
530
|
+
dynamic size fits into this memory, the vector is allocated in this memory.
|
|
531
|
+
Otherwise, dynamic memory is allocated.
|
|
532
|
+
*/
|
|
533
|
+
template <int S, typename T = double>
|
|
534
|
+
class VectorMem : public FlatVector<T>
|
|
535
|
+
{
|
|
536
|
+
T mem[S];
|
|
537
|
+
public:
|
|
538
|
+
/// the scalar type
|
|
539
|
+
typedef typename mat_traits<T>::TSCAL TSCAL;
|
|
540
|
+
|
|
541
|
+
/** allocate vector.
|
|
542
|
+
If the dynamic size fits into the static size, use static memory. Otherwise use dynamic alloation
|
|
543
|
+
*/
|
|
544
|
+
explicit INLINE VectorMem (size_t as) : FlatVector<T> (as, (as <= S) ?
|
|
545
|
+
&mem[0] : new T[as]) { ; }
|
|
546
|
+
|
|
547
|
+
/// deallocates dynamic memory
|
|
548
|
+
INLINE ~VectorMem() { if (this->Size() > S) delete [] this->data; }
|
|
549
|
+
|
|
550
|
+
/// assigns constant value
|
|
551
|
+
INLINE VectorMem & operator= (TSCAL scal)
|
|
552
|
+
{
|
|
553
|
+
FlatVector<T>::operator= (scal);
|
|
554
|
+
return *this;
|
|
555
|
+
}
|
|
556
|
+
|
|
557
|
+
/// evaluates matrix expression
|
|
558
|
+
template<typename TB>
|
|
559
|
+
INLINE VectorMem & operator= (const Expr<TB> & v)
|
|
560
|
+
{
|
|
561
|
+
MatExpr<FlatVector<T> >::operator= (v);
|
|
562
|
+
return *this;
|
|
563
|
+
}
|
|
564
|
+
};
|
|
565
|
+
|
|
566
|
+
|
|
567
|
+
|
|
568
|
+
|
|
569
|
+
|
|
570
|
+
|
|
571
|
+
|
|
572
|
+
|
|
573
|
+
|
|
574
|
+
|
|
575
|
+
|
|
576
|
+
|
|
577
|
+
|
|
578
|
+
|
|
579
|
+
|
|
580
|
+
// A system vector (not completely functional)
|
|
581
|
+
template <typename T = double>
|
|
582
|
+
class FlatSysVector : public MatExpr<FlatSysVector<T> >
|
|
583
|
+
{
|
|
584
|
+
protected:
|
|
585
|
+
size_t s;
|
|
586
|
+
size_t blocksize;
|
|
587
|
+
T * __restrict data;
|
|
588
|
+
public:
|
|
589
|
+
typedef FlatVector<T> TELEM;
|
|
590
|
+
typedef typename mat_traits<T>::TSCAL TSCAL;
|
|
591
|
+
|
|
592
|
+
INLINE FlatSysVector (size_t as, size_t bs, T * adata)
|
|
593
|
+
: s(as), blocksize(bs), data(adata) { ; }
|
|
594
|
+
|
|
595
|
+
INLINE FlatSysVector (size_t as, size_t bs, LocalHeap & lh)
|
|
596
|
+
: s(as), blocksize(bs), data (new (lh) T[as*bs])
|
|
597
|
+
{ ; }
|
|
598
|
+
|
|
599
|
+
/*
|
|
600
|
+
FlatSysVector (const FlatSysVector<TSCAL> & sv)
|
|
601
|
+
: s(sv.Size()),
|
|
602
|
+
blocksize(sv.BlockSize()),
|
|
603
|
+
data (sv(0))
|
|
604
|
+
{
|
|
605
|
+
;
|
|
606
|
+
}
|
|
607
|
+
*/
|
|
608
|
+
|
|
609
|
+
INLINE FlatSysVector & operator= (const FlatSysVector & v)
|
|
610
|
+
{
|
|
611
|
+
for (size_t i = 0; i < this->s * this->blocksize; i++)
|
|
612
|
+
data[i] = v.data[i];
|
|
613
|
+
return *this;
|
|
614
|
+
}
|
|
615
|
+
|
|
616
|
+
template<typename TB>
|
|
617
|
+
INLINE FlatSysVector & operator= (const Expr<TB> & v)
|
|
618
|
+
{
|
|
619
|
+
return MatExpr<FlatSysVector>::operator= (v);
|
|
620
|
+
}
|
|
621
|
+
|
|
622
|
+
INLINE FlatSysVector & operator= (TSCAL s)
|
|
623
|
+
{
|
|
624
|
+
for (size_t i = 0; i < this->s*this->blocksize; i++)
|
|
625
|
+
data[i] = s;
|
|
626
|
+
return *this;
|
|
627
|
+
}
|
|
628
|
+
|
|
629
|
+
|
|
630
|
+
|
|
631
|
+
INLINE auto operator() (size_t i)
|
|
632
|
+
{
|
|
633
|
+
return FlatVector<T> (blocksize, &data[i*blocksize]);
|
|
634
|
+
}
|
|
635
|
+
|
|
636
|
+
INLINE auto operator() (size_t i) const
|
|
637
|
+
{
|
|
638
|
+
return FlatVector<T> (blocksize, &data[i*blocksize]);
|
|
639
|
+
}
|
|
640
|
+
|
|
641
|
+
INLINE const TELEM operator() (size_t i, size_t j) const
|
|
642
|
+
{
|
|
643
|
+
return FlatVector<T> (blocksize, &data[i*blocksize]);
|
|
644
|
+
}
|
|
645
|
+
|
|
646
|
+
INLINE SliceVector<T> Comp (size_t comp) const
|
|
647
|
+
{
|
|
648
|
+
return SliceVector<T> (s, blocksize, data+comp);
|
|
649
|
+
}
|
|
650
|
+
|
|
651
|
+
INLINE FlatSysVector<T> Range(size_t first, size_t last)
|
|
652
|
+
{ return FlatSysVector<T> (last-first, blocksize, data+(first*blocksize)); }
|
|
653
|
+
INLINE /* const */ FlatSysVector<T> Range(size_t first, size_t last) const
|
|
654
|
+
{ return FlatSysVector<T> (last-first, blocksize, data+(first*blocksize)); }
|
|
655
|
+
|
|
656
|
+
INLINE size_t Size () const { return s; }
|
|
657
|
+
INLINE size_t Height () const { return s; }
|
|
658
|
+
INLINE constexpr size_t Width () const { return 1; }
|
|
659
|
+
};
|
|
660
|
+
|
|
661
|
+
|
|
662
|
+
|
|
663
|
+
/**
|
|
664
|
+
A vector of fixed size.
|
|
665
|
+
Useful as entry type in system vectors.
|
|
666
|
+
*/
|
|
667
|
+
template <int S, typename T = double>
|
|
668
|
+
class Vec : public MatExpr<Vec<S,T> > // , protected BaseVec
|
|
669
|
+
{
|
|
670
|
+
/// the values
|
|
671
|
+
// T data[S];
|
|
672
|
+
HTArray<S,T> data;
|
|
673
|
+
public:
|
|
674
|
+
/// type of the elements
|
|
675
|
+
typedef T TELEM;
|
|
676
|
+
/// is the element double or complex ?
|
|
677
|
+
typedef typename mat_traits<T>::TSCAL TSCAL;
|
|
678
|
+
static constexpr bool IsLinear() { return true; }
|
|
679
|
+
|
|
680
|
+
|
|
681
|
+
/// a vec is a S times 1 matrix, the according colume vector
|
|
682
|
+
typedef Vec<S, typename mat_traits<T>::TV_COL> TV_COL;
|
|
683
|
+
/// a vec is a S times 1 matrix, the according row vector
|
|
684
|
+
typedef Vec<1, typename mat_traits<T>::TV_ROW> TV_ROW;
|
|
685
|
+
|
|
686
|
+
enum { SIZE = S };
|
|
687
|
+
/// height of matrix
|
|
688
|
+
enum { HEIGHT = S };
|
|
689
|
+
/// with of matrix
|
|
690
|
+
enum { WIDTH = 1 };
|
|
691
|
+
|
|
692
|
+
/// constructor, no initialization
|
|
693
|
+
INLINE Vec () { ; }
|
|
694
|
+
/// copy vector
|
|
695
|
+
/*
|
|
696
|
+
INLINE Vec (const Vec & v) : MatExpr<Vec> ()
|
|
697
|
+
{
|
|
698
|
+
for (size_t i = 0; i < S; i++)
|
|
699
|
+
data[i] = v.data[i];
|
|
700
|
+
}
|
|
701
|
+
*/
|
|
702
|
+
|
|
703
|
+
Vec (const Vec &) = default;
|
|
704
|
+
auto & HTData() { return data; }
|
|
705
|
+
const auto & HTData() const { return data; }
|
|
706
|
+
template <typename T2>
|
|
707
|
+
Vec (const Vec<S,T2> & v2) : data(v2.HTData()) { ; }
|
|
708
|
+
|
|
709
|
+
|
|
710
|
+
/// initialize with values
|
|
711
|
+
INLINE Vec (const TELEM & scal)
|
|
712
|
+
{
|
|
713
|
+
for (size_t i = 0; i < S; i++)
|
|
714
|
+
data[i] = scal;
|
|
715
|
+
}
|
|
716
|
+
|
|
717
|
+
/// initialize with expression
|
|
718
|
+
template<typename TB>
|
|
719
|
+
INLINE Vec (const Expr<TB> & v)
|
|
720
|
+
{
|
|
721
|
+
(*this) = v;
|
|
722
|
+
}
|
|
723
|
+
|
|
724
|
+
/*
|
|
725
|
+
template <int D>
|
|
726
|
+
INLINE Vec(FlatSliceVec<S,D,T> fsv)
|
|
727
|
+
{
|
|
728
|
+
for (int i = 0; i < S; i++)
|
|
729
|
+
data[i] = fsv(i);
|
|
730
|
+
}
|
|
731
|
+
*/
|
|
732
|
+
template <typename T2, typename S2, typename D2>
|
|
733
|
+
INLINE Vec(VectorView<T2,S2,D2> fsv)
|
|
734
|
+
{
|
|
735
|
+
for (int i = 0; i < S; i++)
|
|
736
|
+
data[i] = fsv(i);
|
|
737
|
+
}
|
|
738
|
+
|
|
739
|
+
|
|
740
|
+
// Helper function for variadic constructor
|
|
741
|
+
template <int I, class... T2>
|
|
742
|
+
void Set(const TELEM &v, T2... rest)
|
|
743
|
+
{
|
|
744
|
+
data[I] = v;
|
|
745
|
+
Set<I+1>(rest...);
|
|
746
|
+
}
|
|
747
|
+
|
|
748
|
+
template <int I>
|
|
749
|
+
void Set(const TELEM &v)
|
|
750
|
+
{
|
|
751
|
+
data[I] = v;
|
|
752
|
+
}
|
|
753
|
+
|
|
754
|
+
template <class... T2,
|
|
755
|
+
enable_if_t<S==1+sizeof...(T2),bool> = true>
|
|
756
|
+
Vec(const TELEM &v, T2... rest) {
|
|
757
|
+
Set<0>(v, rest...);
|
|
758
|
+
}
|
|
759
|
+
|
|
760
|
+
/// copy vector
|
|
761
|
+
INLINE Vec & operator= (const Vec & v)
|
|
762
|
+
{
|
|
763
|
+
for (size_t i = 0; i < S; i++)
|
|
764
|
+
data[i] = v.data[i];
|
|
765
|
+
return *this;
|
|
766
|
+
}
|
|
767
|
+
|
|
768
|
+
|
|
769
|
+
/// assign scalar value
|
|
770
|
+
INLINE Vec & operator= (const TELEM & scal)
|
|
771
|
+
{
|
|
772
|
+
for (size_t i = 0; i < S; i++)
|
|
773
|
+
data[i] = scal;
|
|
774
|
+
return *this;
|
|
775
|
+
}
|
|
776
|
+
|
|
777
|
+
/// assign expression
|
|
778
|
+
template<typename TB>
|
|
779
|
+
INLINE Vec & operator= (const Expr<TB> & v)
|
|
780
|
+
{
|
|
781
|
+
for (size_t i = 0; i < S; i++)
|
|
782
|
+
data[i] = v.Spec()(i);
|
|
783
|
+
return *this;
|
|
784
|
+
}
|
|
785
|
+
|
|
786
|
+
// auto View() const { return FlatVec(const_cast<Vec&>(*this)); }
|
|
787
|
+
// auto View() const { return Vec(*this); }
|
|
788
|
+
INLINE auto View() const { return Vec<S,const T>{*this}; }
|
|
789
|
+
INLINE auto Shape() const { return tuple { IC<S>() }; }
|
|
790
|
+
|
|
791
|
+
/// access vector
|
|
792
|
+
INLINE TELEM & operator() (size_t i)
|
|
793
|
+
{
|
|
794
|
+
NETGEN_CHECK_RANGE(i,0,Size());
|
|
795
|
+
return data[i];
|
|
796
|
+
}
|
|
797
|
+
|
|
798
|
+
/// access vector
|
|
799
|
+
INLINE const TELEM & operator() (size_t i) const
|
|
800
|
+
{
|
|
801
|
+
NETGEN_CHECK_RANGE(i,0,Size());
|
|
802
|
+
return data[i];
|
|
803
|
+
}
|
|
804
|
+
|
|
805
|
+
|
|
806
|
+
/// access vector
|
|
807
|
+
INLINE TELEM & operator[] (size_t i)
|
|
808
|
+
{
|
|
809
|
+
NETGEN_CHECK_RANGE(i,0,Size());
|
|
810
|
+
return data[i];
|
|
811
|
+
}
|
|
812
|
+
|
|
813
|
+
/// access vector
|
|
814
|
+
INLINE const TELEM & operator[] (size_t i) const
|
|
815
|
+
{
|
|
816
|
+
NETGEN_CHECK_RANGE(i,0,Size());
|
|
817
|
+
return data[i];
|
|
818
|
+
}
|
|
819
|
+
|
|
820
|
+
/// access vector
|
|
821
|
+
INLINE TELEM & operator() (size_t i, size_t j)
|
|
822
|
+
{
|
|
823
|
+
NETGEN_CHECK_RANGE(i,0,Size());
|
|
824
|
+
return data[i];
|
|
825
|
+
}
|
|
826
|
+
|
|
827
|
+
/// access vector
|
|
828
|
+
INLINE const TELEM & operator() (size_t i, size_t j) const
|
|
829
|
+
{
|
|
830
|
+
NETGEN_CHECK_RANGE(i,0,Size());
|
|
831
|
+
return data[i];
|
|
832
|
+
}
|
|
833
|
+
|
|
834
|
+
/// vector size
|
|
835
|
+
INLINE auto Size () const { return IC<S>(); }
|
|
836
|
+
/// corresponding matrix height
|
|
837
|
+
INLINE constexpr size_t Height () const { return S; }
|
|
838
|
+
/// corresponding matrix with
|
|
839
|
+
INLINE constexpr size_t Width () const { return 1; }
|
|
840
|
+
INLINE T* Data() { return data.Ptr(); }
|
|
841
|
+
INLINE const T* Data() const { return data.Ptr(); }
|
|
842
|
+
|
|
843
|
+
INLINE /* const */ FlatVector<const T> Range(size_t first, size_t next) const
|
|
844
|
+
{ return FlatVector<const T> (next-first, data+first); }
|
|
845
|
+
|
|
846
|
+
INLINE /* const */ FlatVector<T> Range(size_t first, size_t next)
|
|
847
|
+
{ return FlatVector<T> (next-first, data+first); }
|
|
848
|
+
|
|
849
|
+
const T * begin() const { return data.Ptr(); }
|
|
850
|
+
const T * end() const { return data.Ptr()+S; }
|
|
851
|
+
T * begin() { return data.Ptr(); }
|
|
852
|
+
T * end() { return data.Ptr()+S; }
|
|
853
|
+
};
|
|
854
|
+
|
|
855
|
+
|
|
856
|
+
|
|
857
|
+
template <typename T>
|
|
858
|
+
class Vec<0,T> : public MatExpr<Vec<0,T> >
|
|
859
|
+
{
|
|
860
|
+
public:
|
|
861
|
+
static constexpr bool IsLinear() { return true; }
|
|
862
|
+
INLINE Vec () { }
|
|
863
|
+
INLINE Vec (const Vec &d) { }
|
|
864
|
+
INLINE Vec (T d) { }
|
|
865
|
+
template<typename TB>
|
|
866
|
+
INLINE Vec (const Expr<TB> & v) {;}
|
|
867
|
+
INLINE auto View() const { return Vec(*this); }
|
|
868
|
+
INLINE auto Shape() const { return tuple(IC<0>()); }
|
|
869
|
+
INLINE constexpr size_t Size() const { return 0; }
|
|
870
|
+
INLINE constexpr size_t Height() const { return 0; }
|
|
871
|
+
INLINE constexpr size_t Width() const { return 1; }
|
|
872
|
+
template<typename TB>
|
|
873
|
+
INLINE Vec & operator= (const Expr<TB> & v) { return *this;}
|
|
874
|
+
INLINE Vec & operator= (const T & /* scal */) { return *this; }
|
|
875
|
+
|
|
876
|
+
INLINE T & operator[] (int i) const { return *(T*)(void*)(this); }
|
|
877
|
+
INLINE T & operator() (int i) const { return *(T*)(void*)(this); }
|
|
878
|
+
INLINE T & operator() (int i, int j) const { return *(T*)(void*)(this); }
|
|
879
|
+
INLINE T* Data() { return nullptr; }
|
|
880
|
+
INLINE const T* Data() const { return nullptr; }
|
|
881
|
+
INLINE FlatVector<const T> Range(size_t first, size_t next) const
|
|
882
|
+
{ return FlatVector<const T> (next-first, (T*)nullptr); }
|
|
883
|
+
INLINE FlatVector<T> Range(size_t first, size_t next)
|
|
884
|
+
{ return FlatVector<T> (next-first, (T*)nullptr); }
|
|
885
|
+
};
|
|
886
|
+
|
|
887
|
+
|
|
888
|
+
template <int S, typename T>
|
|
889
|
+
class mat_traits<Vec<S,T>>
|
|
890
|
+
{
|
|
891
|
+
public:
|
|
892
|
+
/// matrix element
|
|
893
|
+
typedef T TELEM;
|
|
894
|
+
/// field of matrix element
|
|
895
|
+
typedef typename mat_traits<T>::TSCAL TSCAL;
|
|
896
|
+
/// type of column vector
|
|
897
|
+
typedef Vec<S, typename mat_traits<T>::TV_COL> TV_COL;
|
|
898
|
+
/// a vec is a S times 1 matrix, the according row vector
|
|
899
|
+
typedef Vec<1, typename mat_traits<T>::TV_ROW> TV_ROW;
|
|
900
|
+
/// matrix height
|
|
901
|
+
enum { HEIGHT = S };
|
|
902
|
+
/// matrix with
|
|
903
|
+
enum { WIDTH = 1 };
|
|
904
|
+
///
|
|
905
|
+
// enum { IS_COMPLEX = mat_traits<TSCAL>::IS_COMPLEX };
|
|
906
|
+
};
|
|
907
|
+
|
|
908
|
+
|
|
909
|
+
|
|
910
|
+
template <typename T> struct ConstVecSize { static constexpr int VSIZE = -1; };
|
|
911
|
+
template <int S, typename T> struct ConstVecSize<Vec<S,T>> { static constexpr int VSIZE = S; };
|
|
912
|
+
template <int S, typename T> struct ConstVecSize<FlatVec<S,T>> { static constexpr int VSIZE = S; };
|
|
913
|
+
template <int S, int D, typename T> struct ConstVecSize<FlatSliceVec<S,D,T>> { static constexpr int VSIZE = S; };
|
|
914
|
+
template <typename T>
|
|
915
|
+
constexpr auto ConstVectorSize() { return ConstVecSize<T>::VSIZE; }
|
|
916
|
+
|
|
917
|
+
/// cross product of 3-vectors
|
|
918
|
+
template <typename TA, typename TB,
|
|
919
|
+
std::enable_if_t<ConstVecSize<TA>::VSIZE == 3, bool> = true,
|
|
920
|
+
std::enable_if_t<ConstVecSize<TB>::VSIZE == 3, bool> = true>
|
|
921
|
+
INLINE auto Cross (const TA & a, const TB & b)
|
|
922
|
+
{
|
|
923
|
+
typedef decltype (a(0)*b(0)) T;
|
|
924
|
+
return Vec<3,T>{ a(1)*b(2)-a(2)*b(1), a(2)*b(0)-a(0)*b(2), a(0)*b(1)-a(1)*b(0) };
|
|
925
|
+
}
|
|
926
|
+
|
|
927
|
+
template <typename S>
|
|
928
|
+
INLINE Vec<1,S> Cross (const Vec<2,S> & a, const Vec<2,S> & b)
|
|
929
|
+
{
|
|
930
|
+
return Vec<1,S> ( { a(0) * b(1) - a(1) * b(0) } );
|
|
931
|
+
}
|
|
932
|
+
|
|
933
|
+
template <typename S>
|
|
934
|
+
INLINE Vec<0,S> Cross (const Vec<1,S> & a, const Vec<1,S> & b)
|
|
935
|
+
{
|
|
936
|
+
return Vec<0,S>();
|
|
937
|
+
}
|
|
938
|
+
|
|
939
|
+
/// output vector
|
|
940
|
+
template<int S, typename T>
|
|
941
|
+
inline ostream & operator<< (ostream & ost, const Vec<S,T> & v)
|
|
942
|
+
{
|
|
943
|
+
for (int i = 0; i < S; i++)
|
|
944
|
+
ost << " " << setw(7) << v(i);
|
|
945
|
+
return ost;
|
|
946
|
+
}
|
|
947
|
+
|
|
948
|
+
|
|
949
|
+
template<int S, typename T, typename TB>
|
|
950
|
+
INLINE Vec<S,T> & operator+= (Vec<S,T> & v, const Expr<TB> & v2)
|
|
951
|
+
{
|
|
952
|
+
for (int i = 0; i < S; i++)
|
|
953
|
+
v(i) += v2.Spec()(i,0);
|
|
954
|
+
return v;
|
|
955
|
+
}
|
|
956
|
+
|
|
957
|
+
template<int S, typename T, typename TB>
|
|
958
|
+
INLINE Vec<S,T> & operator-= (Vec<S,T> & v, const Expr<TB> & v2)
|
|
959
|
+
{
|
|
960
|
+
for (int i = 0; i < S; i++)
|
|
961
|
+
v(i) -= v2.Spec()(i,0);
|
|
962
|
+
return v;
|
|
963
|
+
}
|
|
964
|
+
|
|
965
|
+
|
|
966
|
+
|
|
967
|
+
|
|
968
|
+
|
|
969
|
+
|
|
970
|
+
|
|
971
|
+
/// output vector.
|
|
972
|
+
template<int S, typename T>
|
|
973
|
+
inline ostream & operator<< (ostream & ost, const FlatVec<S,T> & v)
|
|
974
|
+
{
|
|
975
|
+
for (int i = 0; i < S; i++)
|
|
976
|
+
ost << " " << setw(7) << v(i);
|
|
977
|
+
return ost;
|
|
978
|
+
}
|
|
979
|
+
|
|
980
|
+
|
|
981
|
+
template <int S, typename T = double>
|
|
982
|
+
auto UnitVec(size_t i)
|
|
983
|
+
{
|
|
984
|
+
Vec<S,T> ei = T(0.0);
|
|
985
|
+
ei(i) = T(1.0);
|
|
986
|
+
return ei;
|
|
987
|
+
}
|
|
988
|
+
|
|
989
|
+
template <class TV, class TSCAL> class Scalar2ElemVector
|
|
990
|
+
{
|
|
991
|
+
public:
|
|
992
|
+
FlatVector<TSCAL> vec;
|
|
993
|
+
Scalar2ElemVector (FlatVector<TSCAL> avec) : vec(avec) { }
|
|
994
|
+
|
|
995
|
+
enum { H = mat_traits<TV>::HEIGHT };
|
|
996
|
+
|
|
997
|
+
FlatVec<H,TSCAL> operator() (int i) const
|
|
998
|
+
{
|
|
999
|
+
return FlatVec<H,TSCAL> (&vec(i*H));
|
|
1000
|
+
}
|
|
1001
|
+
|
|
1002
|
+
};
|
|
1003
|
+
|
|
1004
|
+
|
|
1005
|
+
template <class TSCAL> class Scalar2ElemVector<TSCAL,TSCAL>
|
|
1006
|
+
{
|
|
1007
|
+
public:
|
|
1008
|
+
FlatVector<TSCAL> vec;
|
|
1009
|
+
Scalar2ElemVector (FlatVector<TSCAL> avec) : vec(avec) { }
|
|
1010
|
+
|
|
1011
|
+
|
|
1012
|
+
const TSCAL & operator() (int i) const
|
|
1013
|
+
{
|
|
1014
|
+
return vec(i);
|
|
1015
|
+
}
|
|
1016
|
+
|
|
1017
|
+
TSCAL & operator() (int i)
|
|
1018
|
+
{
|
|
1019
|
+
return vec(i);
|
|
1020
|
+
}
|
|
1021
|
+
|
|
1022
|
+
};
|
|
1023
|
+
|
|
1024
|
+
|
|
1025
|
+
template <typename T=double>
|
|
1026
|
+
class SparseVector
|
|
1027
|
+
{
|
|
1028
|
+
size_t size;
|
|
1029
|
+
ClosedHashTable<size_t, T> data;
|
|
1030
|
+
public:
|
|
1031
|
+
SparseVector (size_t asize) : size(asize), data(10) { }
|
|
1032
|
+
size_t Size() const { return size; }
|
|
1033
|
+
T operator[] (size_t i) const { return data[i]; }
|
|
1034
|
+
T & operator[] (size_t i) { return data[i]; }
|
|
1035
|
+
T InnerProduct (FlatVector<T> v2) const
|
|
1036
|
+
{
|
|
1037
|
+
T sum = 0;
|
|
1038
|
+
for (auto [i,v] : data)
|
|
1039
|
+
sum += v * v2(i);
|
|
1040
|
+
return sum;
|
|
1041
|
+
}
|
|
1042
|
+
auto & Data() const { return data; }
|
|
1043
|
+
};
|
|
1044
|
+
|
|
1045
|
+
template <typename T>
|
|
1046
|
+
inline ostream & operator<< (ostream & ost, const SparseVector<T> & sv) {
|
|
1047
|
+
for (auto [i,v] : sv.Data())
|
|
1048
|
+
ost << i << ": " << v << ", ";
|
|
1049
|
+
return ost;
|
|
1050
|
+
}
|
|
1051
|
+
|
|
1052
|
+
|
|
1053
|
+
template <class T>
|
|
1054
|
+
class mat_traits<FlatVector<T> >
|
|
1055
|
+
{
|
|
1056
|
+
public:
|
|
1057
|
+
typedef T TELEM;
|
|
1058
|
+
typedef T TSCAL;
|
|
1059
|
+
};
|
|
1060
|
+
|
|
1061
|
+
|
|
1062
|
+
template <int S, typename T>
|
|
1063
|
+
INLINE auto operator* (double a, const Vec<S,T> & vec)
|
|
1064
|
+
{
|
|
1065
|
+
// typedef decltype(RemoveConst(a*vec(0))) TRES;
|
|
1066
|
+
typedef typename std::remove_const<decltype(a*std::declval<T>())>::type TRES;
|
|
1067
|
+
Vec<S, TRES> res;
|
|
1068
|
+
for (int i = 0; i < S; i++)
|
|
1069
|
+
res(i) = a * vec(i);
|
|
1070
|
+
return res;
|
|
1071
|
+
}
|
|
1072
|
+
|
|
1073
|
+
template <int S, typename T>
|
|
1074
|
+
INLINE auto operator* (int a, const Vec<S,T> & vec) { return double(a)*vec; }
|
|
1075
|
+
|
|
1076
|
+
template <int S, typename T>
|
|
1077
|
+
INLINE auto operator* (Complex a, const Vec<S,T> & vec)
|
|
1078
|
+
{
|
|
1079
|
+
// typedef decltype(RemoveConst(a*vec(0))) TRES;
|
|
1080
|
+
typedef typename std::remove_const<decltype(a*std::declval<T>())>::type TRES;
|
|
1081
|
+
Vec<S, TRES> res;
|
|
1082
|
+
for (int i = 0; i < S; i++)
|
|
1083
|
+
res(i) = a * vec(i);
|
|
1084
|
+
return res;
|
|
1085
|
+
}
|
|
1086
|
+
|
|
1087
|
+
// all other cases ...
|
|
1088
|
+
template <int S, typename T,
|
|
1089
|
+
typename enable_if<!is_convertible_v<T,Complex>,int>::type=0>
|
|
1090
|
+
INLINE auto operator* (T a, const Vec<S,T> & vec)
|
|
1091
|
+
{
|
|
1092
|
+
// typedef decltype(RemoveConst(a*vec(0))) TRES;
|
|
1093
|
+
typedef typename std::remove_const<decltype(a*std::declval<T>())>::type TRES;
|
|
1094
|
+
Vec<S, TRES> res;
|
|
1095
|
+
for (int i = 0; i < S; i++)
|
|
1096
|
+
res(i) = a * vec(i);
|
|
1097
|
+
return res;
|
|
1098
|
+
}
|
|
1099
|
+
|
|
1100
|
+
template <int S, typename T>
|
|
1101
|
+
INLINE auto operator+ (const Vec<S,T> & a, const Vec<S,T> & b)
|
|
1102
|
+
{
|
|
1103
|
+
// typedef decltype(RemoveConst(a(0))) TRES;
|
|
1104
|
+
typedef typename std::remove_const<T>::type TRES;
|
|
1105
|
+
Vec<S,TRES> res;
|
|
1106
|
+
for (int i = 0; i < S; i++)
|
|
1107
|
+
res(i) = a(i)+b(i);
|
|
1108
|
+
return res;
|
|
1109
|
+
}
|
|
1110
|
+
|
|
1111
|
+
template <int S, typename T>
|
|
1112
|
+
INLINE auto operator- (const Vec<S,T> & a, const Vec<S,T> & b)
|
|
1113
|
+
{
|
|
1114
|
+
// typedef decltype(RemoveConst(a(0))) TRES;
|
|
1115
|
+
typedef typename std::remove_const<T>::type TRES;
|
|
1116
|
+
Vec<S,TRES> res;
|
|
1117
|
+
for (int i = 0; i < S; i++)
|
|
1118
|
+
res(i) = a(i)-b(i);
|
|
1119
|
+
return res;
|
|
1120
|
+
}
|
|
1121
|
+
|
|
1122
|
+
|
|
1123
|
+
template <int S, typename T>
|
|
1124
|
+
INLINE auto operator* (double a, FlatVec<S,T> vec)
|
|
1125
|
+
// -> Vec<S, decltype(RemoveConst(a*vec(0)))>
|
|
1126
|
+
{
|
|
1127
|
+
// typedef decltype(RemoveConst(a*vec(0))) TRES;
|
|
1128
|
+
typedef typename std::remove_const<decltype(a*std::declval<T>())>::type TRES;
|
|
1129
|
+
Vec<S, TRES> res;
|
|
1130
|
+
for (int i = 0; i < S; i++)
|
|
1131
|
+
res(i) = a * vec(i);
|
|
1132
|
+
return res;
|
|
1133
|
+
}
|
|
1134
|
+
|
|
1135
|
+
|
|
1136
|
+
template <int S, typename T>
|
|
1137
|
+
INLINE auto operator* (Complex a, FlatVec<S,T> vec)
|
|
1138
|
+
// -> Vec<S, decltype(RemoveConst(a*vec(0)))>
|
|
1139
|
+
{
|
|
1140
|
+
// typedef decltype(RemoveConst(a*vec(0))) TRES;
|
|
1141
|
+
typedef typename std::remove_const<decltype(a*std::declval<T>())>::type TRES;
|
|
1142
|
+
Vec<S, TRES> res;
|
|
1143
|
+
for (int i = 0; i < S; i++)
|
|
1144
|
+
res(i) = a * vec(i);
|
|
1145
|
+
return res;
|
|
1146
|
+
}
|
|
1147
|
+
|
|
1148
|
+
template <int S, int D, typename T>
|
|
1149
|
+
INLINE auto operator* (double a, FlatSliceVec<S,D,T> vec)
|
|
1150
|
+
// -> Vec<S, decltype(RemoveConst(a*vec(0)))>
|
|
1151
|
+
{
|
|
1152
|
+
// typedef decltype(RemoveConst(a*vec(0))) TRES;
|
|
1153
|
+
typedef typename std::remove_const<decltype(a*std::declval<T>())>::type TRES;
|
|
1154
|
+
Vec<S, TRES> res;
|
|
1155
|
+
for (int i = 0; i < S; i++)
|
|
1156
|
+
res(i) = a * vec(i);
|
|
1157
|
+
return res;
|
|
1158
|
+
}
|
|
1159
|
+
|
|
1160
|
+
|
|
1161
|
+
template <int S, int D, typename T>
|
|
1162
|
+
INLINE auto operator* (Complex a, FlatSliceVec<S,D,T> vec)
|
|
1163
|
+
// -> Vec<S, decltype(RemoveConst(a*vec(0)))>
|
|
1164
|
+
{
|
|
1165
|
+
// typedef decltype(RemoveConst(a*vec(0))) TRES;
|
|
1166
|
+
typedef typename std::remove_const<decltype(a*std::declval<T>())>::type TRES;
|
|
1167
|
+
Vec<S, TRES> res;
|
|
1168
|
+
for (int i = 0; i < S; i++)
|
|
1169
|
+
res(i) = a * vec(i);
|
|
1170
|
+
return res;
|
|
1171
|
+
}
|
|
1172
|
+
|
|
1173
|
+
|
|
1174
|
+
template <int S, typename T>
|
|
1175
|
+
INLINE auto operator+ (FlatVec<S,T> x, FlatVec<S,T> y) -> Vec<S,T>
|
|
1176
|
+
{
|
|
1177
|
+
Vec<S,T> tmp = x;
|
|
1178
|
+
tmp += y;
|
|
1179
|
+
return tmp;
|
|
1180
|
+
}
|
|
1181
|
+
|
|
1182
|
+
template <int S, typename T>
|
|
1183
|
+
INLINE auto operator- (FlatVec<S,T> x, FlatVec<S,T> y) -> Vec<S,T>
|
|
1184
|
+
{
|
|
1185
|
+
Vec<S,T> tmp = x;
|
|
1186
|
+
tmp -= y;
|
|
1187
|
+
return tmp;
|
|
1188
|
+
}
|
|
1189
|
+
|
|
1190
|
+
|
|
1191
|
+
|
|
1192
|
+
template <int DIM, typename SCAL, typename TANY>
|
|
1193
|
+
inline void AtomicAdd (Vec<DIM,SCAL> & x, TANY y)
|
|
1194
|
+
{
|
|
1195
|
+
for (int i = 0; i < DIM; i++)
|
|
1196
|
+
AtomicAdd (x(i), y(i));
|
|
1197
|
+
}
|
|
1198
|
+
|
|
1199
|
+
template <int DIM, typename SCAL, typename TANY>
|
|
1200
|
+
inline void AtomicAdd (FlatVec<DIM,SCAL> x, TANY y)
|
|
1201
|
+
{
|
|
1202
|
+
for (int i = 0; i < DIM; i++)
|
|
1203
|
+
AtomicAdd (x(i), y(i));
|
|
1204
|
+
}
|
|
1205
|
+
|
|
1206
|
+
|
|
1207
|
+
template <typename T, typename TS, typename TDIST, typename TB>
|
|
1208
|
+
inline void AtomicAdd (VectorView<T,TS,TDIST> v, const Expr<TB> & v2)
|
|
1209
|
+
{
|
|
1210
|
+
auto viewv2 = v2.View();
|
|
1211
|
+
auto combsize = CombinedSize(v.Size(), v2.Height());
|
|
1212
|
+
for (size_t i = 0; i < combsize; i++)
|
|
1213
|
+
AtomicAdd (v(i), viewv2(i));
|
|
1214
|
+
}
|
|
1215
|
+
|
|
1216
|
+
|
|
1217
|
+
}
|
|
1218
|
+
|
|
1219
|
+
|
|
1220
|
+
|
|
1221
|
+
namespace ngstd
|
|
1222
|
+
{
|
|
1223
|
+
template <typename ARCHIVE, int S, typename T>
|
|
1224
|
+
inline auto & operator& (ARCHIVE & ar, ngbla::Vec<S,T> & v)
|
|
1225
|
+
{
|
|
1226
|
+
for (int i = 0; i < S; i++)
|
|
1227
|
+
ar & v(i);
|
|
1228
|
+
return ar;
|
|
1229
|
+
}
|
|
1230
|
+
}
|
|
1231
|
+
|
|
1232
|
+
|
|
1233
|
+
namespace ngcore
|
|
1234
|
+
{
|
|
1235
|
+
|
|
1236
|
+
template <typename T, size_t S> class MakeSimdCl;
|
|
1237
|
+
|
|
1238
|
+
template <typename T, size_t S, int VS>
|
|
1239
|
+
class MakeSimdCl<ngbla::Vec<VS,T>,S>
|
|
1240
|
+
{
|
|
1241
|
+
std::array<ngbla::Vec<VS,T>,S> a;
|
|
1242
|
+
public:
|
|
1243
|
+
MakeSimdCl (std::array<ngbla::Vec<VS,T>,S> aa) : a(aa) { ; }
|
|
1244
|
+
|
|
1245
|
+
auto Get() const
|
|
1246
|
+
{
|
|
1247
|
+
std::array<T,S> ai;
|
|
1248
|
+
ngbla::Vec<VS, decltype(MakeSimd(ai))> res;
|
|
1249
|
+
for (int i = 0; i < VS; i++)
|
|
1250
|
+
{
|
|
1251
|
+
for (int j = 0; j < S; j++)
|
|
1252
|
+
ai[j] = a[j](i);
|
|
1253
|
+
res(i) = MakeSimd(ai);
|
|
1254
|
+
}
|
|
1255
|
+
return res;
|
|
1256
|
+
}
|
|
1257
|
+
};
|
|
1258
|
+
|
|
1259
|
+
|
|
1260
|
+
|
|
1261
|
+
|
|
1262
|
+
|
|
1263
|
+
template<typename T> struct MPI_typetrait;
|
|
1264
|
+
|
|
1265
|
+
template<int S, typename T>
|
|
1266
|
+
struct MPI_typetrait<ngbla::Vec<S, T> > {
|
|
1267
|
+
static auto MPIType () {
|
|
1268
|
+
return MPI_typetrait<std::array<T,S>>::MPIType();
|
|
1269
|
+
}
|
|
1270
|
+
};
|
|
1271
|
+
}
|
|
1272
|
+
|
|
1273
|
+
#endif
|