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.

Files changed (303) hide show
  1. ngsolve-6.2.2506.post75.dev0.data/data/bin/ngs_nvcc +14 -0
  2. ngsolve-6.2.2506.post75.dev0.data/data/bin/ngs_nvlink +14 -0
  3. ngsolve-6.2.2506.post75.dev0.data/data/bin/ngscxx +15 -0
  4. ngsolve-6.2.2506.post75.dev0.data/data/bin/ngsld +11 -0
  5. ngsolve-6.2.2506.post75.dev0.data/data/bin/ngsolve.tcl +648 -0
  6. ngsolve-6.2.2506.post75.dev0.data/data/bin/ngspy +2 -0
  7. ngsolve-6.2.2506.post75.dev0.data/data/include/netgen/analytic_integrals.hpp +10 -0
  8. ngsolve-6.2.2506.post75.dev0.data/data/include/netgen/arnoldi.hpp +55 -0
  9. ngsolve-6.2.2506.post75.dev0.data/data/include/netgen/bandmatrix.hpp +334 -0
  10. ngsolve-6.2.2506.post75.dev0.data/data/include/netgen/basematrix.hpp +957 -0
  11. ngsolve-6.2.2506.post75.dev0.data/data/include/netgen/basevector.hpp +1268 -0
  12. ngsolve-6.2.2506.post75.dev0.data/data/include/netgen/bdbequations.hpp +2805 -0
  13. ngsolve-6.2.2506.post75.dev0.data/data/include/netgen/bdbintegrator.hpp +1660 -0
  14. ngsolve-6.2.2506.post75.dev0.data/data/include/netgen/bem_diffops.hpp +475 -0
  15. ngsolve-6.2.2506.post75.dev0.data/data/include/netgen/bessel.hpp +1064 -0
  16. ngsolve-6.2.2506.post75.dev0.data/data/include/netgen/bilinearform.hpp +963 -0
  17. ngsolve-6.2.2506.post75.dev0.data/data/include/netgen/bla.hpp +29 -0
  18. ngsolve-6.2.2506.post75.dev0.data/data/include/netgen/blockalloc.hpp +95 -0
  19. ngsolve-6.2.2506.post75.dev0.data/data/include/netgen/blockjacobi.hpp +328 -0
  20. ngsolve-6.2.2506.post75.dev0.data/data/include/netgen/bspline.hpp +116 -0
  21. ngsolve-6.2.2506.post75.dev0.data/data/include/netgen/calcinverse.hpp +141 -0
  22. ngsolve-6.2.2506.post75.dev0.data/data/include/netgen/cg.hpp +368 -0
  23. ngsolve-6.2.2506.post75.dev0.data/data/include/netgen/chebyshev.hpp +44 -0
  24. ngsolve-6.2.2506.post75.dev0.data/data/include/netgen/cholesky.hpp +720 -0
  25. ngsolve-6.2.2506.post75.dev0.data/data/include/netgen/clapack.h +7254 -0
  26. ngsolve-6.2.2506.post75.dev0.data/data/include/netgen/code_generation.hpp +296 -0
  27. ngsolve-6.2.2506.post75.dev0.data/data/include/netgen/coefficient.hpp +2033 -0
  28. ngsolve-6.2.2506.post75.dev0.data/data/include/netgen/coefficient_impl.hpp +19 -0
  29. ngsolve-6.2.2506.post75.dev0.data/data/include/netgen/coefficient_stdmath.hpp +167 -0
  30. ngsolve-6.2.2506.post75.dev0.data/data/include/netgen/commutingAMG.hpp +106 -0
  31. ngsolve-6.2.2506.post75.dev0.data/data/include/netgen/comp.hpp +79 -0
  32. ngsolve-6.2.2506.post75.dev0.data/data/include/netgen/compatibility.hpp +41 -0
  33. ngsolve-6.2.2506.post75.dev0.data/data/include/netgen/complex_wrapper.hpp +73 -0
  34. ngsolve-6.2.2506.post75.dev0.data/data/include/netgen/compressedfespace.hpp +110 -0
  35. ngsolve-6.2.2506.post75.dev0.data/data/include/netgen/contact.hpp +235 -0
  36. ngsolve-6.2.2506.post75.dev0.data/data/include/netgen/cuda_linalg.hpp +175 -0
  37. ngsolve-6.2.2506.post75.dev0.data/data/include/netgen/cuda_ngbla.hpp +226 -0
  38. ngsolve-6.2.2506.post75.dev0.data/data/include/netgen/cuda_ngstd.hpp +527 -0
  39. ngsolve-6.2.2506.post75.dev0.data/data/include/netgen/cuda_profiler.hpp +240 -0
  40. ngsolve-6.2.2506.post75.dev0.data/data/include/netgen/diagonalmatrix.hpp +154 -0
  41. ngsolve-6.2.2506.post75.dev0.data/data/include/netgen/differentialoperator.hpp +276 -0
  42. ngsolve-6.2.2506.post75.dev0.data/data/include/netgen/diffop.hpp +1286 -0
  43. ngsolve-6.2.2506.post75.dev0.data/data/include/netgen/diffop_impl.hpp +328 -0
  44. ngsolve-6.2.2506.post75.dev0.data/data/include/netgen/diffopwithfactor.hpp +123 -0
  45. ngsolve-6.2.2506.post75.dev0.data/data/include/netgen/discontinuous.hpp +84 -0
  46. ngsolve-6.2.2506.post75.dev0.data/data/include/netgen/dump.hpp +949 -0
  47. ngsolve-6.2.2506.post75.dev0.data/data/include/netgen/ectypes.hpp +121 -0
  48. ngsolve-6.2.2506.post75.dev0.data/data/include/netgen/eigen.hpp +60 -0
  49. ngsolve-6.2.2506.post75.dev0.data/data/include/netgen/eigensystem.hpp +18 -0
  50. ngsolve-6.2.2506.post75.dev0.data/data/include/netgen/elasticity_equations.hpp +595 -0
  51. ngsolve-6.2.2506.post75.dev0.data/data/include/netgen/elementbyelement.hpp +195 -0
  52. ngsolve-6.2.2506.post75.dev0.data/data/include/netgen/elementtopology.hpp +1760 -0
  53. ngsolve-6.2.2506.post75.dev0.data/data/include/netgen/elementtransformation.hpp +339 -0
  54. ngsolve-6.2.2506.post75.dev0.data/data/include/netgen/evalfunc.hpp +405 -0
  55. ngsolve-6.2.2506.post75.dev0.data/data/include/netgen/expr.hpp +1686 -0
  56. ngsolve-6.2.2506.post75.dev0.data/data/include/netgen/facetfe.hpp +175 -0
  57. ngsolve-6.2.2506.post75.dev0.data/data/include/netgen/facetfespace.hpp +180 -0
  58. ngsolve-6.2.2506.post75.dev0.data/data/include/netgen/facethofe.hpp +111 -0
  59. ngsolve-6.2.2506.post75.dev0.data/data/include/netgen/facetsurffespace.hpp +112 -0
  60. ngsolve-6.2.2506.post75.dev0.data/data/include/netgen/fe_interfaces.hpp +32 -0
  61. ngsolve-6.2.2506.post75.dev0.data/data/include/netgen/fem.hpp +87 -0
  62. ngsolve-6.2.2506.post75.dev0.data/data/include/netgen/fesconvert.hpp +14 -0
  63. ngsolve-6.2.2506.post75.dev0.data/data/include/netgen/fespace.hpp +1449 -0
  64. ngsolve-6.2.2506.post75.dev0.data/data/include/netgen/finiteelement.hpp +286 -0
  65. ngsolve-6.2.2506.post75.dev0.data/data/include/netgen/globalinterfacespace.hpp +77 -0
  66. ngsolve-6.2.2506.post75.dev0.data/data/include/netgen/globalspace.hpp +115 -0
  67. ngsolve-6.2.2506.post75.dev0.data/data/include/netgen/gridfunction.hpp +525 -0
  68. ngsolve-6.2.2506.post75.dev0.data/data/include/netgen/h1amg.hpp +124 -0
  69. ngsolve-6.2.2506.post75.dev0.data/data/include/netgen/h1hofe.hpp +188 -0
  70. ngsolve-6.2.2506.post75.dev0.data/data/include/netgen/h1hofe_impl.hpp +1262 -0
  71. ngsolve-6.2.2506.post75.dev0.data/data/include/netgen/h1hofefo.hpp +148 -0
  72. ngsolve-6.2.2506.post75.dev0.data/data/include/netgen/h1hofefo_impl.hpp +185 -0
  73. ngsolve-6.2.2506.post75.dev0.data/data/include/netgen/h1hofespace.hpp +167 -0
  74. ngsolve-6.2.2506.post75.dev0.data/data/include/netgen/h1lofe.hpp +1240 -0
  75. ngsolve-6.2.2506.post75.dev0.data/data/include/netgen/h1lumping.hpp +41 -0
  76. ngsolve-6.2.2506.post75.dev0.data/data/include/netgen/hcurl_equations.hpp +1381 -0
  77. ngsolve-6.2.2506.post75.dev0.data/data/include/netgen/hcurlcurlfe.hpp +2241 -0
  78. ngsolve-6.2.2506.post75.dev0.data/data/include/netgen/hcurlcurlfespace.hpp +78 -0
  79. ngsolve-6.2.2506.post75.dev0.data/data/include/netgen/hcurlfe.hpp +259 -0
  80. ngsolve-6.2.2506.post75.dev0.data/data/include/netgen/hcurlfe_utils.hpp +107 -0
  81. ngsolve-6.2.2506.post75.dev0.data/data/include/netgen/hcurlhdiv_dshape.hpp +857 -0
  82. ngsolve-6.2.2506.post75.dev0.data/data/include/netgen/hcurlhdivfes.hpp +308 -0
  83. ngsolve-6.2.2506.post75.dev0.data/data/include/netgen/hcurlhofe.hpp +175 -0
  84. ngsolve-6.2.2506.post75.dev0.data/data/include/netgen/hcurlhofe_impl.hpp +1871 -0
  85. ngsolve-6.2.2506.post75.dev0.data/data/include/netgen/hcurlhofespace.hpp +193 -0
  86. ngsolve-6.2.2506.post75.dev0.data/data/include/netgen/hcurllofe.hpp +1146 -0
  87. ngsolve-6.2.2506.post75.dev0.data/data/include/netgen/hdiv_equations.hpp +880 -0
  88. ngsolve-6.2.2506.post75.dev0.data/data/include/netgen/hdivdivfe.hpp +2923 -0
  89. ngsolve-6.2.2506.post75.dev0.data/data/include/netgen/hdivdivsurfacespace.hpp +76 -0
  90. ngsolve-6.2.2506.post75.dev0.data/data/include/netgen/hdivfe.hpp +206 -0
  91. ngsolve-6.2.2506.post75.dev0.data/data/include/netgen/hdivfe_utils.hpp +717 -0
  92. ngsolve-6.2.2506.post75.dev0.data/data/include/netgen/hdivfes.hpp +75 -0
  93. ngsolve-6.2.2506.post75.dev0.data/data/include/netgen/hdivhofe.hpp +447 -0
  94. ngsolve-6.2.2506.post75.dev0.data/data/include/netgen/hdivhofe_impl.hpp +1107 -0
  95. ngsolve-6.2.2506.post75.dev0.data/data/include/netgen/hdivhofefo.hpp +229 -0
  96. ngsolve-6.2.2506.post75.dev0.data/data/include/netgen/hdivhofespace.hpp +177 -0
  97. ngsolve-6.2.2506.post75.dev0.data/data/include/netgen/hdivhosurfacefespace.hpp +106 -0
  98. ngsolve-6.2.2506.post75.dev0.data/data/include/netgen/hdivlofe.hpp +773 -0
  99. ngsolve-6.2.2506.post75.dev0.data/data/include/netgen/hidden.hpp +74 -0
  100. ngsolve-6.2.2506.post75.dev0.data/data/include/netgen/householder.hpp +181 -0
  101. ngsolve-6.2.2506.post75.dev0.data/data/include/netgen/hypre_ams_precond.hpp +123 -0
  102. ngsolve-6.2.2506.post75.dev0.data/data/include/netgen/hypre_precond.hpp +73 -0
  103. ngsolve-6.2.2506.post75.dev0.data/data/include/netgen/integrator.hpp +2012 -0
  104. ngsolve-6.2.2506.post75.dev0.data/data/include/netgen/integratorcf.hpp +253 -0
  105. ngsolve-6.2.2506.post75.dev0.data/data/include/netgen/interpolate.hpp +49 -0
  106. ngsolve-6.2.2506.post75.dev0.data/data/include/netgen/intrule.hpp +2542 -0
  107. ngsolve-6.2.2506.post75.dev0.data/data/include/netgen/intrules_SauterSchwab.hpp +25 -0
  108. ngsolve-6.2.2506.post75.dev0.data/data/include/netgen/irspace.hpp +49 -0
  109. ngsolve-6.2.2506.post75.dev0.data/data/include/netgen/jacobi.hpp +153 -0
  110. ngsolve-6.2.2506.post75.dev0.data/data/include/netgen/kernels.hpp +762 -0
  111. ngsolve-6.2.2506.post75.dev0.data/data/include/netgen/l2hofe.hpp +194 -0
  112. ngsolve-6.2.2506.post75.dev0.data/data/include/netgen/l2hofe_impl.hpp +564 -0
  113. ngsolve-6.2.2506.post75.dev0.data/data/include/netgen/l2hofefo.hpp +542 -0
  114. ngsolve-6.2.2506.post75.dev0.data/data/include/netgen/l2hofespace.hpp +344 -0
  115. ngsolve-6.2.2506.post75.dev0.data/data/include/netgen/la.hpp +38 -0
  116. ngsolve-6.2.2506.post75.dev0.data/data/include/netgen/linalg_kernels.hpp +102 -0
  117. ngsolve-6.2.2506.post75.dev0.data/data/include/netgen/linearform.hpp +266 -0
  118. ngsolve-6.2.2506.post75.dev0.data/data/include/netgen/matrix.hpp +2140 -0
  119. ngsolve-6.2.2506.post75.dev0.data/data/include/netgen/memusage.hpp +41 -0
  120. ngsolve-6.2.2506.post75.dev0.data/data/include/netgen/meshaccess.hpp +1359 -0
  121. ngsolve-6.2.2506.post75.dev0.data/data/include/netgen/mgpre.hpp +204 -0
  122. ngsolve-6.2.2506.post75.dev0.data/data/include/netgen/mp_coefficient.hpp +145 -0
  123. ngsolve-6.2.2506.post75.dev0.data/data/include/netgen/mptools.hpp +2281 -0
  124. ngsolve-6.2.2506.post75.dev0.data/data/include/netgen/multigrid.hpp +42 -0
  125. ngsolve-6.2.2506.post75.dev0.data/data/include/netgen/multivector.hpp +447 -0
  126. ngsolve-6.2.2506.post75.dev0.data/data/include/netgen/mumpsinverse.hpp +187 -0
  127. ngsolve-6.2.2506.post75.dev0.data/data/include/netgen/mycomplex.hpp +361 -0
  128. ngsolve-6.2.2506.post75.dev0.data/data/include/netgen/ng_lapack.hpp +1661 -0
  129. ngsolve-6.2.2506.post75.dev0.data/data/include/netgen/ngblas.hpp +1232 -0
  130. ngsolve-6.2.2506.post75.dev0.data/data/include/netgen/ngs_defines.hpp +30 -0
  131. ngsolve-6.2.2506.post75.dev0.data/data/include/netgen/ngs_stdcpp_include.hpp +106 -0
  132. ngsolve-6.2.2506.post75.dev0.data/data/include/netgen/ngs_utils.hpp +121 -0
  133. ngsolve-6.2.2506.post75.dev0.data/data/include/netgen/ngsobject.hpp +1019 -0
  134. ngsolve-6.2.2506.post75.dev0.data/data/include/netgen/ngsstream.hpp +113 -0
  135. ngsolve-6.2.2506.post75.dev0.data/data/include/netgen/ngstd.hpp +72 -0
  136. ngsolve-6.2.2506.post75.dev0.data/data/include/netgen/nodalhofe.hpp +96 -0
  137. ngsolve-6.2.2506.post75.dev0.data/data/include/netgen/nodalhofe_impl.hpp +141 -0
  138. ngsolve-6.2.2506.post75.dev0.data/data/include/netgen/normalfacetfe.hpp +223 -0
  139. ngsolve-6.2.2506.post75.dev0.data/data/include/netgen/normalfacetfespace.hpp +98 -0
  140. ngsolve-6.2.2506.post75.dev0.data/data/include/netgen/normalfacetsurfacefespace.hpp +84 -0
  141. ngsolve-6.2.2506.post75.dev0.data/data/include/netgen/order.hpp +251 -0
  142. ngsolve-6.2.2506.post75.dev0.data/data/include/netgen/parallel_matrices.hpp +222 -0
  143. ngsolve-6.2.2506.post75.dev0.data/data/include/netgen/paralleldofs.hpp +340 -0
  144. ngsolve-6.2.2506.post75.dev0.data/data/include/netgen/parallelngs.hpp +23 -0
  145. ngsolve-6.2.2506.post75.dev0.data/data/include/netgen/parallelvector.hpp +269 -0
  146. ngsolve-6.2.2506.post75.dev0.data/data/include/netgen/pardisoinverse.hpp +200 -0
  147. ngsolve-6.2.2506.post75.dev0.data/data/include/netgen/periodic.hpp +129 -0
  148. ngsolve-6.2.2506.post75.dev0.data/data/include/netgen/plateaufespace.hpp +25 -0
  149. ngsolve-6.2.2506.post75.dev0.data/data/include/netgen/pml.hpp +275 -0
  150. ngsolve-6.2.2506.post75.dev0.data/data/include/netgen/pmltrafo.hpp +631 -0
  151. ngsolve-6.2.2506.post75.dev0.data/data/include/netgen/postproc.hpp +142 -0
  152. ngsolve-6.2.2506.post75.dev0.data/data/include/netgen/potentialtools.hpp +22 -0
  153. ngsolve-6.2.2506.post75.dev0.data/data/include/netgen/precomp.hpp +60 -0
  154. ngsolve-6.2.2506.post75.dev0.data/data/include/netgen/preconditioner.hpp +602 -0
  155. ngsolve-6.2.2506.post75.dev0.data/data/include/netgen/prolongation.hpp +377 -0
  156. ngsolve-6.2.2506.post75.dev0.data/data/include/netgen/python_comp.hpp +107 -0
  157. ngsolve-6.2.2506.post75.dev0.data/data/include/netgen/python_fem.hpp +89 -0
  158. ngsolve-6.2.2506.post75.dev0.data/data/include/netgen/python_linalg.hpp +58 -0
  159. ngsolve-6.2.2506.post75.dev0.data/data/include/netgen/python_ngstd.hpp +386 -0
  160. ngsolve-6.2.2506.post75.dev0.data/data/include/netgen/recursive_pol.hpp +4896 -0
  161. ngsolve-6.2.2506.post75.dev0.data/data/include/netgen/recursive_pol_tet.hpp +395 -0
  162. ngsolve-6.2.2506.post75.dev0.data/data/include/netgen/recursive_pol_trig.hpp +492 -0
  163. ngsolve-6.2.2506.post75.dev0.data/data/include/netgen/reorderedfespace.hpp +81 -0
  164. ngsolve-6.2.2506.post75.dev0.data/data/include/netgen/sample_sort.hpp +105 -0
  165. ngsolve-6.2.2506.post75.dev0.data/data/include/netgen/scalarfe.hpp +335 -0
  166. ngsolve-6.2.2506.post75.dev0.data/data/include/netgen/shapefunction_utils.hpp +113 -0
  167. ngsolve-6.2.2506.post75.dev0.data/data/include/netgen/simd_complex.hpp +329 -0
  168. ngsolve-6.2.2506.post75.dev0.data/data/include/netgen/smoother.hpp +253 -0
  169. ngsolve-6.2.2506.post75.dev0.data/data/include/netgen/solve.hpp +89 -0
  170. ngsolve-6.2.2506.post75.dev0.data/data/include/netgen/sparsecholesky.hpp +313 -0
  171. ngsolve-6.2.2506.post75.dev0.data/data/include/netgen/sparsematrix.hpp +1038 -0
  172. ngsolve-6.2.2506.post75.dev0.data/data/include/netgen/sparsematrix_dyn.hpp +90 -0
  173. ngsolve-6.2.2506.post75.dev0.data/data/include/netgen/sparsematrix_impl.hpp +1013 -0
  174. ngsolve-6.2.2506.post75.dev0.data/data/include/netgen/special_matrix.hpp +463 -0
  175. ngsolve-6.2.2506.post75.dev0.data/data/include/netgen/specialelement.hpp +125 -0
  176. ngsolve-6.2.2506.post75.dev0.data/data/include/netgen/statushandler.hpp +33 -0
  177. ngsolve-6.2.2506.post75.dev0.data/data/include/netgen/stringops.hpp +12 -0
  178. ngsolve-6.2.2506.post75.dev0.data/data/include/netgen/superluinverse.hpp +136 -0
  179. ngsolve-6.2.2506.post75.dev0.data/data/include/netgen/symbolicintegrator.hpp +850 -0
  180. ngsolve-6.2.2506.post75.dev0.data/data/include/netgen/symmetricmatrix.hpp +144 -0
  181. ngsolve-6.2.2506.post75.dev0.data/data/include/netgen/tangentialfacetfe.hpp +224 -0
  182. ngsolve-6.2.2506.post75.dev0.data/data/include/netgen/tangentialfacetfespace.hpp +91 -0
  183. ngsolve-6.2.2506.post75.dev0.data/data/include/netgen/tensor.hpp +522 -0
  184. ngsolve-6.2.2506.post75.dev0.data/data/include/netgen/tensorcoefficient.hpp +446 -0
  185. ngsolve-6.2.2506.post75.dev0.data/data/include/netgen/tensorproductintegrator.hpp +113 -0
  186. ngsolve-6.2.2506.post75.dev0.data/data/include/netgen/thcurlfe.hpp +128 -0
  187. ngsolve-6.2.2506.post75.dev0.data/data/include/netgen/thcurlfe_impl.hpp +380 -0
  188. ngsolve-6.2.2506.post75.dev0.data/data/include/netgen/thdivfe.hpp +80 -0
  189. ngsolve-6.2.2506.post75.dev0.data/data/include/netgen/thdivfe_impl.hpp +492 -0
  190. ngsolve-6.2.2506.post75.dev0.data/data/include/netgen/tpdiffop.hpp +461 -0
  191. ngsolve-6.2.2506.post75.dev0.data/data/include/netgen/tpfes.hpp +133 -0
  192. ngsolve-6.2.2506.post75.dev0.data/data/include/netgen/tpintrule.hpp +224 -0
  193. ngsolve-6.2.2506.post75.dev0.data/data/include/netgen/triangular.hpp +465 -0
  194. ngsolve-6.2.2506.post75.dev0.data/data/include/netgen/tscalarfe.hpp +245 -0
  195. ngsolve-6.2.2506.post75.dev0.data/data/include/netgen/tscalarfe_impl.hpp +1029 -0
  196. ngsolve-6.2.2506.post75.dev0.data/data/include/netgen/umfpackinverse.hpp +148 -0
  197. ngsolve-6.2.2506.post75.dev0.data/data/include/netgen/unifiedvector.hpp +103 -0
  198. ngsolve-6.2.2506.post75.dev0.data/data/include/netgen/vector.hpp +1273 -0
  199. ngsolve-6.2.2506.post75.dev0.data/data/include/netgen/voxelcoefficientfunction.hpp +41 -0
  200. ngsolve-6.2.2506.post75.dev0.data/data/include/netgen/vtkoutput.hpp +198 -0
  201. ngsolve-6.2.2506.post75.dev0.data/data/include/netgen/vvector.hpp +208 -0
  202. ngsolve-6.2.2506.post75.dev0.data/data/include/netgen/webgui.hpp +92 -0
  203. ngsolve-6.2.2506.post75.dev0.data/data/lib/cmake/ngsolve/NGSolveConfig.cmake +102 -0
  204. ngsolve-6.2.2506.post75.dev0.data/data/lib/cmake/ngsolve/ngsolve-targets-release.cmake +89 -0
  205. ngsolve-6.2.2506.post75.dev0.data/data/lib/cmake/ngsolve/ngsolve-targets.cmake +173 -0
  206. ngsolve-6.2.2506.post75.dev0.data/data/lib/python3.14/site-packages/netgen_mesher.libs/libngbla.so +0 -0
  207. ngsolve-6.2.2506.post75.dev0.data/data/lib/python3.14/site-packages/netgen_mesher.libs/libngcomp.so +0 -0
  208. ngsolve-6.2.2506.post75.dev0.data/data/lib/python3.14/site-packages/netgen_mesher.libs/libngfem.so +0 -0
  209. ngsolve-6.2.2506.post75.dev0.data/data/lib/python3.14/site-packages/netgen_mesher.libs/libngla.so +0 -0
  210. ngsolve-6.2.2506.post75.dev0.data/data/lib/python3.14/site-packages/netgen_mesher.libs/libngsbem.so +0 -0
  211. ngsolve-6.2.2506.post75.dev0.data/data/lib/python3.14/site-packages/netgen_mesher.libs/libngscudalib.so +0 -0
  212. ngsolve-6.2.2506.post75.dev0.data/data/lib/python3.14/site-packages/netgen_mesher.libs/libngsolve.so +0 -0
  213. ngsolve-6.2.2506.post75.dev0.data/data/lib/python3.14/site-packages/netgen_mesher.libs/libngstd.so +0 -0
  214. ngsolve-6.2.2506.post75.dev0.data/data/lib/python3.14/site-packages/ngsolve/TensorProductTools.py +210 -0
  215. ngsolve-6.2.2506.post75.dev0.data/data/lib/python3.14/site-packages/ngsolve/__console.py +94 -0
  216. ngsolve-6.2.2506.post75.dev0.data/data/lib/python3.14/site-packages/ngsolve/__expr.py +181 -0
  217. ngsolve-6.2.2506.post75.dev0.data/data/lib/python3.14/site-packages/ngsolve/__init__.py +148 -0
  218. ngsolve-6.2.2506.post75.dev0.data/data/lib/python3.14/site-packages/ngsolve/_scikit_build_core_dependencies.py +30 -0
  219. ngsolve-6.2.2506.post75.dev0.data/data/lib/python3.14/site-packages/ngsolve/bvp.py +78 -0
  220. ngsolve-6.2.2506.post75.dev0.data/data/lib/python3.14/site-packages/ngsolve/config/__init__.py +1 -0
  221. ngsolve-6.2.2506.post75.dev0.data/data/lib/python3.14/site-packages/ngsolve/config/__main__.py +4 -0
  222. ngsolve-6.2.2506.post75.dev0.data/data/lib/python3.14/site-packages/ngsolve/config/config.py +60 -0
  223. ngsolve-6.2.2506.post75.dev0.data/data/lib/python3.14/site-packages/ngsolve/demos/TensorProduct/__init__.py +0 -0
  224. ngsolve-6.2.2506.post75.dev0.data/data/lib/python3.14/site-packages/ngsolve/demos/TensorProduct/tp_dg_1d_1d.py +80 -0
  225. ngsolve-6.2.2506.post75.dev0.data/data/lib/python3.14/site-packages/ngsolve/demos/TensorProduct/tp_dg_1d_2d.py +73 -0
  226. ngsolve-6.2.2506.post75.dev0.data/data/lib/python3.14/site-packages/ngsolve/demos/TensorProduct/tp_dg_2d_1d.py +72 -0
  227. ngsolve-6.2.2506.post75.dev0.data/data/lib/python3.14/site-packages/ngsolve/demos/TensorProduct/tp_dg_2d_2d.py +66 -0
  228. ngsolve-6.2.2506.post75.dev0.data/data/lib/python3.14/site-packages/ngsolve/demos/__init__.py +0 -0
  229. ngsolve-6.2.2506.post75.dev0.data/data/lib/python3.14/site-packages/ngsolve/demos/howto/__init__.py +0 -0
  230. ngsolve-6.2.2506.post75.dev0.data/data/lib/python3.14/site-packages/ngsolve/demos/howto/hhj.py +44 -0
  231. ngsolve-6.2.2506.post75.dev0.data/data/lib/python3.14/site-packages/ngsolve/demos/howto/hybrid_dg.py +53 -0
  232. ngsolve-6.2.2506.post75.dev0.data/data/lib/python3.14/site-packages/ngsolve/demos/howto/mixed.py +30 -0
  233. ngsolve-6.2.2506.post75.dev0.data/data/lib/python3.14/site-packages/ngsolve/demos/howto/nonlin.py +29 -0
  234. ngsolve-6.2.2506.post75.dev0.data/data/lib/python3.14/site-packages/ngsolve/demos/howto/pickling.py +26 -0
  235. ngsolve-6.2.2506.post75.dev0.data/data/lib/python3.14/site-packages/ngsolve/demos/howto/pml.py +31 -0
  236. ngsolve-6.2.2506.post75.dev0.data/data/lib/python3.14/site-packages/ngsolve/demos/howto/taskmanager.py +20 -0
  237. ngsolve-6.2.2506.post75.dev0.data/data/lib/python3.14/site-packages/ngsolve/demos/howto/tdnns.py +47 -0
  238. ngsolve-6.2.2506.post75.dev0.data/data/lib/python3.14/site-packages/ngsolve/demos/howto/timeDG-skeleton.py +45 -0
  239. ngsolve-6.2.2506.post75.dev0.data/data/lib/python3.14/site-packages/ngsolve/demos/howto/timeDG.py +38 -0
  240. ngsolve-6.2.2506.post75.dev0.data/data/lib/python3.14/site-packages/ngsolve/demos/howto/timeDGlap.py +42 -0
  241. ngsolve-6.2.2506.post75.dev0.data/data/lib/python3.14/site-packages/ngsolve/demos/howto/timeDGwave.py +61 -0
  242. ngsolve-6.2.2506.post75.dev0.data/data/lib/python3.14/site-packages/ngsolve/demos/intro/__init__.py +0 -0
  243. ngsolve-6.2.2506.post75.dev0.data/data/lib/python3.14/site-packages/ngsolve/demos/intro/adaptive.py +123 -0
  244. ngsolve-6.2.2506.post75.dev0.data/data/lib/python3.14/site-packages/ngsolve/demos/intro/cmagnet.py +59 -0
  245. ngsolve-6.2.2506.post75.dev0.data/data/lib/python3.14/site-packages/ngsolve/demos/intro/elasticity.py +76 -0
  246. ngsolve-6.2.2506.post75.dev0.data/data/lib/python3.14/site-packages/ngsolve/demos/intro/navierstokes.py +74 -0
  247. ngsolve-6.2.2506.post75.dev0.data/data/lib/python3.14/site-packages/ngsolve/demos/intro/poisson.ipynb +170 -0
  248. ngsolve-6.2.2506.post75.dev0.data/data/lib/python3.14/site-packages/ngsolve/demos/intro/poisson.py +41 -0
  249. ngsolve-6.2.2506.post75.dev0.data/data/lib/python3.14/site-packages/ngsolve/demos/mpi/__init__.py +0 -0
  250. ngsolve-6.2.2506.post75.dev0.data/data/lib/python3.14/site-packages/ngsolve/demos/mpi/mpi_cmagnet.py +87 -0
  251. ngsolve-6.2.2506.post75.dev0.data/data/lib/python3.14/site-packages/ngsolve/demos/mpi/mpi_navierstokes.py +117 -0
  252. ngsolve-6.2.2506.post75.dev0.data/data/lib/python3.14/site-packages/ngsolve/demos/mpi/mpi_poisson.py +89 -0
  253. ngsolve-6.2.2506.post75.dev0.data/data/lib/python3.14/site-packages/ngsolve/demos/mpi/mpi_timeDG.py +82 -0
  254. ngsolve-6.2.2506.post75.dev0.data/data/lib/python3.14/site-packages/ngsolve/directsolvers.py +26 -0
  255. ngsolve-6.2.2506.post75.dev0.data/data/lib/python3.14/site-packages/ngsolve/eigenvalues.py +364 -0
  256. ngsolve-6.2.2506.post75.dev0.data/data/lib/python3.14/site-packages/ngsolve/internal.py +89 -0
  257. ngsolve-6.2.2506.post75.dev0.data/data/lib/python3.14/site-packages/ngsolve/krylovspace.py +1013 -0
  258. ngsolve-6.2.2506.post75.dev0.data/data/lib/python3.14/site-packages/ngsolve/meshes.py +748 -0
  259. ngsolve-6.2.2506.post75.dev0.data/data/lib/python3.14/site-packages/ngsolve/ngs2petsc.py +310 -0
  260. ngsolve-6.2.2506.post75.dev0.data/data/lib/python3.14/site-packages/ngsolve/ngscuda.so +0 -0
  261. ngsolve-6.2.2506.post75.dev0.data/data/lib/python3.14/site-packages/ngsolve/ngscxx.py +42 -0
  262. ngsolve-6.2.2506.post75.dev0.data/data/lib/python3.14/site-packages/ngsolve/ngslib.so +0 -0
  263. ngsolve-6.2.2506.post75.dev0.data/data/lib/python3.14/site-packages/ngsolve/nonlinearsolvers.py +203 -0
  264. ngsolve-6.2.2506.post75.dev0.data/data/lib/python3.14/site-packages/ngsolve/preconditioners.py +11 -0
  265. ngsolve-6.2.2506.post75.dev0.data/data/lib/python3.14/site-packages/ngsolve/solve_implementation.py +168 -0
  266. ngsolve-6.2.2506.post75.dev0.data/data/lib/python3.14/site-packages/ngsolve/solvers.py +7 -0
  267. ngsolve-6.2.2506.post75.dev0.data/data/lib/python3.14/site-packages/ngsolve/timestepping.py +185 -0
  268. ngsolve-6.2.2506.post75.dev0.data/data/lib/python3.14/site-packages/ngsolve/timing.py +108 -0
  269. ngsolve-6.2.2506.post75.dev0.data/data/lib/python3.14/site-packages/ngsolve/utils.py +167 -0
  270. ngsolve-6.2.2506.post75.dev0.data/data/lib/python3.14/site-packages/ngsolve/webgui.py +670 -0
  271. ngsolve-6.2.2506.post75.dev0.data/data/share/ngsolve/beam.geo +17 -0
  272. ngsolve-6.2.2506.post75.dev0.data/data/share/ngsolve/beam.vol +240 -0
  273. ngsolve-6.2.2506.post75.dev0.data/data/share/ngsolve/chip.in2d +41 -0
  274. ngsolve-6.2.2506.post75.dev0.data/data/share/ngsolve/chip.vol +614 -0
  275. ngsolve-6.2.2506.post75.dev0.data/data/share/ngsolve/coil.geo +12 -0
  276. ngsolve-6.2.2506.post75.dev0.data/data/share/ngsolve/coil.vol +2560 -0
  277. ngsolve-6.2.2506.post75.dev0.data/data/share/ngsolve/coilshield.geo +24 -0
  278. ngsolve-6.2.2506.post75.dev0.data/data/share/ngsolve/coilshield.vol +3179 -0
  279. ngsolve-6.2.2506.post75.dev0.data/data/share/ngsolve/cube.geo +19 -0
  280. ngsolve-6.2.2506.post75.dev0.data/data/share/ngsolve/cube.vol +1832 -0
  281. ngsolve-6.2.2506.post75.dev0.data/data/share/ngsolve/d10_DGdoubleglazing.pde +50 -0
  282. ngsolve-6.2.2506.post75.dev0.data/data/share/ngsolve/d11_chip_nitsche.pde +40 -0
  283. ngsolve-6.2.2506.post75.dev0.data/data/share/ngsolve/d1_square.pde +43 -0
  284. ngsolve-6.2.2506.post75.dev0.data/data/share/ngsolve/d2_chip.pde +35 -0
  285. ngsolve-6.2.2506.post75.dev0.data/data/share/ngsolve/d3_helmholtz.pde +22 -0
  286. ngsolve-6.2.2506.post75.dev0.data/data/share/ngsolve/d4_cube.pde +46 -0
  287. ngsolve-6.2.2506.post75.dev0.data/data/share/ngsolve/d5_beam.pde +74 -0
  288. ngsolve-6.2.2506.post75.dev0.data/data/share/ngsolve/d6_shaft.pde +73 -0
  289. ngsolve-6.2.2506.post75.dev0.data/data/share/ngsolve/d7_coil.pde +50 -0
  290. ngsolve-6.2.2506.post75.dev0.data/data/share/ngsolve/d8_coilshield.pde +49 -0
  291. ngsolve-6.2.2506.post75.dev0.data/data/share/ngsolve/d9_hybridDG.pde +72 -0
  292. ngsolve-6.2.2506.post75.dev0.data/data/share/ngsolve/doubleglazing.in2d +27 -0
  293. ngsolve-6.2.2506.post75.dev0.data/data/share/ngsolve/doubleglazing.vol +737 -0
  294. ngsolve-6.2.2506.post75.dev0.data/data/share/ngsolve/piezo2d40round4.vol.gz +0 -0
  295. ngsolve-6.2.2506.post75.dev0.data/data/share/ngsolve/shaft.geo +73 -0
  296. ngsolve-6.2.2506.post75.dev0.data/data/share/ngsolve/shaft.vol +4291 -0
  297. ngsolve-6.2.2506.post75.dev0.data/data/share/ngsolve/square.in2d +17 -0
  298. ngsolve-6.2.2506.post75.dev0.data/data/share/ngsolve/square.vol +149 -0
  299. ngsolve-6.2.2506.post75.dev0.dist-info/METADATA +14 -0
  300. ngsolve-6.2.2506.post75.dev0.dist-info/RECORD +303 -0
  301. ngsolve-6.2.2506.post75.dev0.dist-info/WHEEL +5 -0
  302. ngsolve-6.2.2506.post75.dev0.dist-info/licenses/LICENSE +504 -0
  303. ngsolve-6.2.2506.post75.dev0.dist-info/top_level.txt +1 -0
@@ -0,0 +1,1760 @@
1
+ #ifndef FILE_TOPOLOGY
2
+ #define FILE_TOPOLOGY
3
+
4
+ /*********************************************************************/
5
+ /* File: topology.hpp */
6
+ /* Author: Joachim Schoeberl */
7
+ /* Date: 25. Mar. 2000 */
8
+ /*********************************************************************/
9
+
10
+
11
+
12
+ #include <bla.hpp>
13
+
14
+ namespace ngfem
15
+ {
16
+ using namespace ngbla;
17
+
18
+ /*
19
+ Toplogy of reference elements
20
+ */
21
+
22
+
23
+ /**
24
+ Geometry of element.
25
+ Possible are ET_POINT, ET_SEGM, ET_TRIG, ET_QUAD, ET_TET, ET_PYRAMID, ET_PRISM, ET_HEX
26
+ */
27
+ enum NGS_DLL_HEADER ELEMENT_TYPE
28
+ { ET_POINT = 0, ET_SEGM = 1,
29
+ ET_TRIG = 10, ET_QUAD = 11,
30
+ ET_TET = 20, ET_PYRAMID = 21, ET_PRISM = 22, ET_HEXAMID = 23, ET_HEX = 24 };
31
+
32
+ // #ifndef WIN32
33
+ static constexpr initializer_list<ELEMENT_TYPE> element_types =
34
+ { ET_POINT, ET_SEGM, ET_TRIG, ET_QUAD,
35
+ ET_TET, ET_PYRAMID, ET_PRISM, ET_HEXAMID, ET_HEX };
36
+ /*
37
+ #else
38
+ // less efficient, but MSVC doesn't like the constexpr here
39
+ static initializer_list<ELEMENT_TYPE> element_types =
40
+ { ET_POINT, ET_SEGM, ET_TRIG, ET_QUAD,
41
+ ET_TET, ET_PYRAMID, ET_PRISM, ET_HEX };
42
+ #endif
43
+ */
44
+
45
+
46
+ /**
47
+ Type of node.
48
+ vertex nodes are 0 dimensional,
49
+ edge nodes are 1 dimensional
50
+ face nodes are 2 dimensional
51
+ cell nodes are 3 dimensional
52
+ global nodes are shared by all procs and have no attached dimension
53
+
54
+ 2D elements have vertex, edge, and face nodes
55
+
56
+ 3D elements have vertex, edge, face and cell nodes
57
+ */
58
+
59
+ enum NODE_TYPE { NT_VERTEX = 0, NT_EDGE = 1, NT_FACE = 2, NT_CELL = 3, NT_ELEMENT = 4, NT_FACET = 5, NT_GLOBAL = 6 };
60
+
61
+ INLINE NODE_TYPE StdNodeType (NODE_TYPE nt, int meshdim)
62
+ {
63
+ switch (nt)
64
+ {
65
+ case NT_ELEMENT: return NODE_TYPE(meshdim);
66
+ case NT_FACET: return NODE_TYPE(meshdim-1);
67
+ default: return nt;
68
+ }
69
+ }
70
+
71
+ INLINE int CoDimension (NODE_TYPE nt, int meshdim)
72
+ {
73
+ int dim(nt);
74
+ if (dim <= 3) // V, E, F C
75
+ return meshdim-dim;
76
+ else
77
+ return dim-NT_ELEMENT;
78
+ }
79
+ // INLINE void operator++(NODE_TYPE & nt, int) { nt = NODE_TYPE(nt+1); }
80
+
81
+ INLINE constexpr int Dim (ELEMENT_TYPE et)
82
+ {
83
+ return (et == ET_POINT) ? 0 :
84
+ (et == ET_SEGM) ? 1 :
85
+ (et == ET_TRIG || et == ET_QUAD) ? 2 : 3;
86
+ }
87
+
88
+
89
+
90
+ /// point coordinates
91
+ typedef double POINT3D[3];
92
+
93
+ /// initial point, end point
94
+ typedef int EDGE[2];
95
+
96
+ /// points, last one is -1 for trig
97
+ typedef int FACE[4];
98
+
99
+ /// normal vector
100
+ typedef double NORMAL[3];
101
+
102
+
103
+
104
+ enum VorB : uint8_t { VOL, BND, BBND, BBBND };
105
+ inline VorB operator++(VorB & vb, int) { VorB vbo = vb; vb = VorB(vb+1); return vbo; }
106
+ inline VorB & operator++(VorB & vb) { vb = VorB(vb+1); return vb; }
107
+ inline ostream & operator<< (ostream & ost, VorB vb)
108
+ {
109
+ if (vb == VOL) ost << "VOL";
110
+ else if (vb==BND) ost << "BND";
111
+ else if (vb==BBND) ost << "BBND";
112
+ else ost << "BBBND";
113
+ return ost;
114
+ }
115
+
116
+ class ElementId
117
+ {
118
+ typedef size_t int_type;
119
+ VorB vb;
120
+ int_type nr;
121
+ public:
122
+ ElementId (VorB avb, int_type anr) : vb(avb), nr(anr) { ; }
123
+ ElementId (int_type anr) : vb(VOL), nr(anr) { ; }
124
+ int_type Nr() const { return nr; }
125
+ explicit operator int_type () const { return nr; }
126
+ explicit operator VorB () const { return vb; }
127
+ VorB VB() const { return vb; }
128
+ bool IsVolume() const { return vb == VOL; }
129
+ bool IsBoundary() const { return vb == BND; }
130
+ bool IsInvalid() const { return nr == -1; }
131
+ bool operator< (int_type nr2) { return nr < nr2; }
132
+ ElementId operator++ (int) { return ElementId(vb,nr++); }
133
+ ElementId operator++ () { return ElementId(vb,++nr); }
134
+ ElementId operator*() const { return *this; }
135
+ bool operator!=(const ElementId id2) const { return nr != id2.nr || vb != id2.vb; }
136
+ bool operator==(const ElementId id2) const { return nr == id2.nr && vb == id2.vb; }
137
+ };
138
+
139
+ inline ostream & operator<< (ostream & ost, ElementId id)
140
+ {
141
+ const char * name[4] = { "VEl", "BEl", "CD2El", "CD3El" };
142
+ return ost << name[id.VB()] << ' ' << id.Nr();
143
+ // return ost << (id.VB()==VOL ? "VEl " : (id.VB()==BND ? "BEl " : "CD2El ")) << ' ' << id.Nr();
144
+ }
145
+
146
+ template <VorB VB,int DIM>
147
+ class T_ElementId
148
+ {
149
+ size_t nr;
150
+ public:
151
+ T_ElementId (size_t anr) : nr(anr) { ; }
152
+ T_ElementId (ElementId ei) : nr(ei.Nr()) { ; }
153
+ operator ElementId() const { return ElementId(VB, nr); }
154
+ size_t Nr() const { return nr; }
155
+ };
156
+
157
+
158
+ /// Topology and coordinate information of master element:
159
+ class NGS_DLL_HEADER ElementTopology
160
+ {
161
+ ELEMENT_TYPE myet;
162
+ public:
163
+ ElementTopology (ELEMENT_TYPE amyet) : myet(amyet) { ; }
164
+ /// returns name of element type
165
+ static const char * GetElementName (ELEMENT_TYPE et);
166
+ const char * GetElementName () { return GetElementName(myet); }
167
+
168
+ /// returns space dimension of element type
169
+ static INLINE int GetSpaceDim (ELEMENT_TYPE et)
170
+ {
171
+ switch (et)
172
+ {
173
+ case ET_POINT: return 0;
174
+ case ET_SEGM: return 1;
175
+ case ET_TRIG: return 2;
176
+ case ET_QUAD: return 2;
177
+ case ET_TET: return 3;
178
+ case ET_PYRAMID: return 3;
179
+ case ET_PRISM: return 3;
180
+ case ET_HEXAMID: return 3;
181
+ case ET_HEX: return 3;
182
+ }
183
+ return 0;
184
+ }
185
+ INLINE int GetSpaceDim () const { return GetSpaceDim(myet); }
186
+
187
+ /// returns number of vertices
188
+ static INLINE int GetNVertices (ELEMENT_TYPE et)
189
+ {
190
+ switch (et)
191
+ {
192
+ case ET_POINT: return 1;
193
+ case ET_SEGM: return 2;
194
+ case ET_TRIG: return 3;
195
+ case ET_QUAD: return 4;
196
+ case ET_TET: return 4;
197
+ case ET_PYRAMID: return 5;
198
+ case ET_PRISM: return 6;
199
+ case ET_HEXAMID: return 7;
200
+ case ET_HEX: return 8;
201
+ }
202
+ return 0;
203
+ }
204
+ INLINE int GetNVertices () const { return GetNVertices(myet); }
205
+
206
+ /// returns number of edges
207
+ static INLINE int GetNEdges (ELEMENT_TYPE et)
208
+ {
209
+ switch (et)
210
+ {
211
+ case ET_POINT: return 0;
212
+ case ET_SEGM: return 1;
213
+ case ET_TRIG: return 3;
214
+ case ET_QUAD: return 4;
215
+ case ET_TET: return 6;
216
+ case ET_PYRAMID: return 8;
217
+ case ET_PRISM: return 9;
218
+ case ET_HEXAMID: return 11;
219
+ case ET_HEX: return 12;
220
+ }
221
+ return 0;
222
+ }
223
+
224
+
225
+ /// returns number of faces
226
+ static INLINE int GetNFaces (ELEMENT_TYPE et)
227
+ {
228
+ switch (et)
229
+ {
230
+ case ET_POINT: return 0;
231
+ case ET_SEGM: return 0;
232
+ case ET_TRIG: return 1;
233
+ case ET_QUAD: return 1;
234
+ case ET_TET: return 4;
235
+ case ET_PYRAMID: return 5;
236
+ case ET_PRISM: return 5;
237
+ case ET_HEXAMID: return 6;
238
+ case ET_HEX: return 6;
239
+ }
240
+ return 0;
241
+ }
242
+
243
+
244
+ /// returns face type
245
+ static INLINE ELEMENT_TYPE GetFaceType (ELEMENT_TYPE et, int k)
246
+ {
247
+ switch (et)
248
+ {
249
+ case ET_SEGM: return ET_POINT;
250
+ case ET_TRIG: return ET_TRIG;
251
+ case ET_QUAD: return ET_QUAD;
252
+ case ET_TET: return ET_TRIG;
253
+ case ET_PYRAMID: return (k<4 ? ET_TRIG : ET_QUAD);
254
+ case ET_PRISM: return (k<2 ? ET_TRIG : ET_QUAD);
255
+ case ET_HEXAMID: return (k==1||k==4) ? ET_TRIG : ET_QUAD;
256
+ case ET_HEX: return ET_QUAD;
257
+ default:
258
+ return ET_SEGM;
259
+ }
260
+ }
261
+
262
+
263
+ static INLINE Vec<4,int> GetNNodes (ELEMENT_TYPE et)
264
+ {
265
+ switch (et)
266
+ {
267
+ case ET_POINT : return Vec<4,int> (1,0,0,0);
268
+ case ET_SEGM : return Vec<4,int> (2,1,0,0);
269
+ case ET_TRIG : return Vec<4,int> (3,3,1,0);
270
+ case ET_QUAD : return Vec<4,int> (4,4,1,0);
271
+ case ET_TET : return Vec<4,int> (4,6,4,1);
272
+ case ET_PYRAMID : return Vec<4,int> (5,8,5,1);
273
+ case ET_PRISM : return Vec<4,int> (6,9,5,1);
274
+ case ET_HEXAMID : return Vec<4,int> (7,11,6,1);
275
+ case ET_HEX : return Vec<4,int> (8,12,6,1);
276
+ }
277
+ return 0;
278
+ }
279
+
280
+ /// returns number of nodes of type nt
281
+ static int GetNNodes (ELEMENT_TYPE et, NODE_TYPE nt)
282
+ {
283
+ static const int nn_point[] = { 1, 0, 0, 0 };
284
+ static const int nn_segm[] = { 2, 1, 0, 0 };
285
+ static const int nn_trig[] = { 3, 3, 1, 0 };
286
+ static const int nn_quad[] = { 4, 4, 1, 0 };
287
+ static const int nn_tet[] = { 4, 6, 4, 1 };
288
+ static const int nn_pyramid[] = { 5, 8, 5, 1 };
289
+ static const int nn_prism[] = { 6, 9, 5, 1 };
290
+ static const int nn_hexamid[] = { 7, 11, 6, 1 };
291
+ static const int nn_hex[] = { 8, 12, 6, 1 };
292
+ switch (et)
293
+ {
294
+ case ET_POINT: return nn_point[nt];
295
+ case ET_SEGM: return nn_segm[nt];
296
+ case ET_TRIG: return nn_trig[nt];
297
+ case ET_QUAD: return nn_quad[nt];
298
+ case ET_TET: return nn_tet[nt];
299
+ case ET_PYRAMID: return nn_pyramid[nt];
300
+ case ET_PRISM: return nn_prism[nt];
301
+ case ET_HEXAMID: return nn_hexamid[nt];
302
+ case ET_HEX: return nn_hex[nt];
303
+ }
304
+ return 0;
305
+ }
306
+
307
+
308
+
309
+
310
+
311
+
312
+
313
+ /// returns number of facets: == GetNFaces in 3D, GetNEdges in 2D
314
+ static INLINE int GetNFacets (ELEMENT_TYPE et)
315
+ {
316
+ switch (et)
317
+ {
318
+ case ET_POINT: return 0;
319
+ case ET_SEGM: return 2;
320
+ case ET_TRIG: return 3;
321
+ case ET_QUAD: return 4;
322
+ case ET_TET: return 4;
323
+ case ET_PYRAMID: return 5;
324
+ case ET_PRISM: return 5;
325
+ case ET_HEXAMID: return 6;
326
+ case ET_HEX: return 6;
327
+ }
328
+ return 0;
329
+ }
330
+
331
+
332
+
333
+
334
+ /// returns number of facets: == GetNFaces in 3D, GetNEdges in 2D
335
+ static INLINE ELEMENT_TYPE GetFacetType (ELEMENT_TYPE et, int k)
336
+ {
337
+ switch (et)
338
+ {
339
+ case ET_SEGM: return ET_POINT;
340
+ case ET_TRIG: return ET_SEGM;
341
+ case ET_QUAD: return ET_SEGM;
342
+ case ET_TET: return ET_TRIG;
343
+ case ET_PYRAMID: return (k<4 ? ET_TRIG : ET_QUAD);
344
+ case ET_PRISM: return (k<2 ? ET_TRIG : ET_QUAD);
345
+ case ET_HEXAMID: return (k==1||k==4) ? ET_TRIG : ET_QUAD;
346
+ case ET_HEX: return ET_QUAD;
347
+ default:
348
+ return ET_POINT; // dummy
349
+ }
350
+ }
351
+
352
+ /// returns vertex coordinates (as 3D points)
353
+ static const POINT3D * GetVertices (ELEMENT_TYPE et);
354
+ INLINE const POINT3D * GetVertices () const
355
+ { return GetVertices(myet); }
356
+
357
+ /// returns edges of elements. zero-based pairs of integers
358
+ static const EDGE * GetEdges (ELEMENT_TYPE et)
359
+ {
360
+ static const int segm_edges[1][2] =
361
+ { { 0, 1 }};
362
+
363
+
364
+ static const int trig_edges[3][2] =
365
+ { { 2, 0 },
366
+ { 1, 2 },
367
+ { 0, 1 }};
368
+
369
+ static const int quad_edges[4][2] =
370
+ { { 0, 1 },
371
+ { 2, 3 },
372
+ { 3, 0 },
373
+ { 1, 2 }};
374
+
375
+ static const int tet_edges[6][2] =
376
+ { { 3, 0 },
377
+ { 3, 1 },
378
+ { 3, 2 },
379
+ { 0, 1 },
380
+ { 0, 2 },
381
+ { 1, 2 }};
382
+
383
+ static const int prism_edges[9][2] =
384
+ { { 2, 0 },
385
+ { 0, 1 },
386
+ { 2, 1 },
387
+ { 5, 3 },
388
+ { 3, 4 },
389
+ { 5, 4 },
390
+ { 2, 5 },
391
+ { 0, 3 },
392
+ { 1, 4 }};
393
+
394
+ static const int pyramid_edges[8][2] =
395
+ { { 0, 1 },
396
+ { 1, 2 },
397
+ { 0, 3 },
398
+ { 3, 2 },
399
+ { 0, 4 },
400
+ { 1, 4 },
401
+ { 2, 4 },
402
+ { 3, 4 }};
403
+
404
+ static const int hexamid_edges[11][2] =
405
+ {
406
+ { 0, 1 },
407
+ { 2, 3 },
408
+ { 3, 0 },
409
+ { 1, 2 },
410
+ { 4, 5 },
411
+ { 6, 4 },
412
+ { 5, 6 },
413
+ { 0, 4 },
414
+ { 1, 5 },
415
+ { 2, 6 },
416
+ { 3, 6 },
417
+ };
418
+
419
+
420
+ static const int hex_edges[12][2] =
421
+ {
422
+ { 0, 1 },
423
+ { 2, 3 },
424
+ { 3, 0 },
425
+ { 1, 2 },
426
+ { 4, 5 },
427
+ { 6, 7 },
428
+ { 7, 4 },
429
+ { 5, 6 },
430
+ { 0, 4 },
431
+ { 1, 5 },
432
+ { 2, 6 },
433
+ { 3, 7 },
434
+ };
435
+
436
+ switch (et)
437
+ {
438
+ case ET_POINT: return nullptr;
439
+ case ET_SEGM: return segm_edges;
440
+ case ET_TRIG: return trig_edges;
441
+ case ET_QUAD: return quad_edges;
442
+ case ET_TET: return tet_edges;
443
+ case ET_PYRAMID: return pyramid_edges;
444
+ case ET_PRISM: return prism_edges;
445
+ case ET_HEXAMID: return hexamid_edges;
446
+ case ET_HEX: return hex_edges;
447
+ default:
448
+ break;
449
+ }
450
+ cerr << "Ng_GetEdges, illegal element type " << et << endl;
451
+ return 0;
452
+ }
453
+
454
+ /// returns faces of elements. zero-based array of 4 integers, last one is -1 for triangles
455
+ static const FACE * GetFaces (ELEMENT_TYPE et)
456
+ {
457
+ static int tet_faces[4][4] =
458
+ { { 3, 1, 2, -1 },
459
+ { 3, 2, 0, -1 },
460
+ { 3, 0, 1, -1 },
461
+ { 0, 2, 1, -1 } }; // all faces point into interior!
462
+
463
+ static int prism_faces[5][4] =
464
+ {
465
+ { 0, 2, 1, -1 },
466
+ { 3, 4, 5, -1 },
467
+ { 2, 0, 3, 5 },
468
+ { 0, 1, 4, 3 },
469
+ { 1, 2, 5, 4 }
470
+ };
471
+
472
+ static int pyramid_faces[5][4] =
473
+ {
474
+ { 0, 1, 4, -1 },
475
+ { 1, 2, 4, -1 },
476
+ { 2, 3, 4, -1 },
477
+ { 3, 0, 4, -1 },
478
+ { 0, 1, 2, 3 } // points into interior!
479
+ };
480
+
481
+ static int hexamid_faces[6][4] =
482
+ {
483
+ { 0, 3, 2, 1 },
484
+ { 4, 5, 6, -1},
485
+ { 0, 1, 5, 4 },
486
+ { 1, 2, 6, 5 },
487
+ { 2, 3, 6, -1},
488
+ { 3, 0, 4, 6 }
489
+ };
490
+
491
+ static int hex_faces[6][4] =
492
+ {
493
+ { 0, 3, 2, 1 },
494
+ { 4, 5, 6, 7 },
495
+ { 0, 1, 5, 4 },
496
+ { 1, 2, 6, 5 },
497
+ { 2, 3, 7, 6 },
498
+ { 3, 0, 4, 7 }
499
+ };
500
+ static int trig_faces[1][4] =
501
+ {
502
+ { 0, 1, 2, -1 },
503
+ };
504
+
505
+ static int quad_faces[1][4] =
506
+ {
507
+ { 0, 1, 2, 3 },
508
+ };
509
+
510
+ switch (et)
511
+ {
512
+ case ET_TET: return tet_faces;
513
+ case ET_PRISM: return prism_faces;
514
+ case ET_PYRAMID: return pyramid_faces;
515
+ case ET_HEXAMID: return hexamid_faces;
516
+ case ET_HEX: return hex_faces;
517
+
518
+ case ET_TRIG: return trig_faces;
519
+ case ET_QUAD: return quad_faces;
520
+
521
+ case ET_SEGM: return nullptr;
522
+ case ET_POINT: return nullptr;
523
+ default:
524
+ break;
525
+ }
526
+
527
+ cerr << "Ng_GetFaces, illegal element type " << et << endl;
528
+ return 0;
529
+ }
530
+
531
+ /// return normals on facets (old style)
532
+ static NORMAL * GetNormals(ELEMENT_TYPE et);
533
+
534
+ template <int D>
535
+ static FlatVector<Vec<D> > GetNormals(ELEMENT_TYPE et);
536
+
537
+
538
+ /// returns number of edge from vertex v1 to vertex v2
539
+ static int GetEdgeNr (ELEMENT_TYPE et, int v1, int v2);
540
+
541
+ /// returns number of face containing vertices v1, v2, v3. (trig only ?)
542
+ static int GetFaceNr (ELEMENT_TYPE et, int v1, int v2, int v3);
543
+ };
544
+
545
+
546
+
547
+ /**
548
+ A Node of an element.
549
+
550
+ A Node has a node type such such NT_VERTEX or NT_FACE, and a node
551
+ number. The number can be with respect to the local element
552
+ numbering, or can be the global numbering on the mesh.
553
+ */
554
+ class /* NGS_DLL_HEADER */ NodeId
555
+ {
556
+ NODE_TYPE nt;
557
+ size_t nodenr;
558
+
559
+ public:
560
+ /// do nothing
561
+ NodeId () { ; }
562
+
563
+ /// construct node from type and number
564
+ NodeId (NODE_TYPE ant, size_t anodenr)
565
+ : nt(ant), nodenr(anodenr) { ; }
566
+
567
+ /// copy constructor
568
+ NodeId (const NodeId & n2)
569
+ { nt = n2.nt; nodenr = n2.nodenr; }
570
+
571
+ /// returns type of the node
572
+ NODE_TYPE GetType () const { return nt; }
573
+
574
+ /// returns number of the node
575
+ size_t GetNr() const { return nodenr; }
576
+
577
+ operator size_t () const { return nodenr; }
578
+ NodeId operator++ (int) { return NodeId(nt,nodenr++); }
579
+ NodeId operator++ () { return NodeId(nt,++nodenr); }
580
+ NodeId operator+ (size_t i) { return NodeId(nt,nodenr+i); }
581
+ // NodeId operator*() const { return *this; }
582
+ bool operator!=(const NodeId id2) const { return nodenr != id2.nodenr || nt != id2.nt; }
583
+ bool operator==(const NodeId id2) const { return nodenr == id2.nodenr && nt == id2.nt; }
584
+ size_t operator- (NodeId id2) const { return nodenr-id2.nodenr; }
585
+ };
586
+ typedef NodeId Node;
587
+
588
+ template <NODE_TYPE nt>
589
+ class T_NodeId
590
+ {
591
+ size_t nodenr;
592
+
593
+ public:
594
+ T_NodeId () = default;
595
+ T_NodeId (const T_NodeId & n2) = default;
596
+
597
+ /// construct node from number
598
+ T_NodeId (size_t anodenr)
599
+ : nodenr(anodenr) { ; }
600
+
601
+ /// returns type of the node
602
+ NODE_TYPE GetType () const { return nt; }
603
+
604
+ /// returns number of the node
605
+ size_t GetNr() const { return nodenr; }
606
+
607
+ operator size_t () const { return nodenr; }
608
+ T_NodeId operator++ (int) { return T_NodeId(nodenr++); }
609
+ T_NodeId operator++ () { return T_NodeId(++nodenr); }
610
+ bool operator!=(const T_NodeId id2) const { return nodenr != id2.nodenr; }
611
+ bool operator==(const T_NodeId id2) const { return nodenr == id2.nodenr; }
612
+ size_t operator- (T_NodeId id2) const { return nodenr-id2.nodenr; }
613
+ operator NodeId () const { return NodeId(nt, nodenr); }
614
+ };
615
+
616
+
617
+
618
+ inline int CalcNodeId (ELEMENT_TYPE et, const NodeId & node)
619
+ {
620
+ switch (et)
621
+ {
622
+ case ET_TRIG:
623
+ {
624
+ static const int nodebase[] = { 0, 3, 6 };
625
+ return nodebase[node.GetType()] + node.GetNr();
626
+ }
627
+
628
+ case ET_TET:
629
+ {
630
+ static const int nodebase[] = { 0, 4, 10, 14 };
631
+ return nodebase[node.GetType()] + node.GetNr();
632
+ }
633
+ default:
634
+ throw Exception (string ("CalcNodeId not implemented for element ") +
635
+ ElementTopology::GetElementName (et));
636
+ }
637
+ }
638
+
639
+ inline NodeId CalcNodeFromId (ELEMENT_TYPE et, int nodeid)
640
+ {
641
+ switch (et)
642
+ {
643
+ case ET_TRIG:
644
+ {
645
+ static const int nodetypes[] = { 0, 0, 0, 1, 1, 1, 2 };
646
+ static const int nodenrs[] = { 0, 1, 2, 0, 1, 2, 0 };
647
+ return NodeId (NODE_TYPE(nodetypes[nodeid]), nodenrs[nodeid]);
648
+ }
649
+ case ET_TET:
650
+ {
651
+ static const int nodetypes[] = { 0, 0, 0, 0, 1, 1, 1, 1, 1, 1, 2, 2, 2, 2, 3 };
652
+ static const int nodenrs[] = { 0, 1, 2, 3, 0, 1, 2, 3, 4, 5, 0, 1, 2, 3, 0 };
653
+ return NodeId (NODE_TYPE(nodetypes[nodeid]), nodenrs[nodeid]);
654
+ }
655
+
656
+ default:
657
+ throw Exception (string ("CalcNodeFromId not implemented for element ") +
658
+ ElementTopology::GetElementName (et));
659
+ }
660
+ }
661
+
662
+
663
+ NGS_DLL_HEADER ostream & operator<< (ostream & ost, ELEMENT_TYPE et);
664
+ NGS_DLL_HEADER ostream & operator<< (ostream & ost, NODE_TYPE nt);
665
+
666
+ NGS_DLL_HEADER ostream & operator<< (ostream & ost, const NodeId & node);
667
+
668
+ /**
669
+ A binary representation of selecting V-E-F-C Nodes.
670
+ */
671
+
672
+
673
+ class NodeSet
674
+ {
675
+ int set;
676
+ public:
677
+
678
+ NodeSet (NODE_TYPE nt1)
679
+ {
680
+ set = 1 << nt1;
681
+ }
682
+
683
+ NodeSet (NODE_TYPE nt1, NODE_TYPE nt2)
684
+ {
685
+ set = (1 << nt1) + (1 << nt2);
686
+ }
687
+
688
+ NodeSet (NODE_TYPE nt1, NODE_TYPE nt2, NODE_TYPE nt3)
689
+ {
690
+ set = (1 << nt1) + (1 << nt2) + (1 << nt3);
691
+ }
692
+
693
+ NodeSet (NODE_TYPE nt1, NODE_TYPE nt2, NODE_TYPE nt3, NODE_TYPE nt4)
694
+ {
695
+ set = (1 << nt1) + (1 << nt2) + (1 << nt3) + (1 << nt4);
696
+ }
697
+ operator int () const { return set; }
698
+ };
699
+
700
+
701
+
702
+
703
+ /*
704
+ class TopologicElement
705
+ {
706
+ ELEMENT_TYPE et;
707
+ ArrayMem<Node, 27> nodes;
708
+
709
+ public:
710
+ void SetElementType (ELEMENT_TYPE aet) { et = aet; }
711
+ void Clear() { nodes.SetSize(0); }
712
+ void AddNode (const Node & node) { nodes.Append (node); }
713
+
714
+
715
+ ELEMENT_TYPE GetType () const { return et; }
716
+ int GetNNodes () const { return nodes.Size(); }
717
+ const Node & GetNode (int i) const { return nodes[i]; }
718
+
719
+ Node GlobalNode (const Node & locnode)
720
+ { return Node (locnode.GetType(), nodes[CalcNodeId (et, locnode)].GetNr() ); }
721
+ };
722
+
723
+ ostream & operator<< (ostream & ost, const TopologicElement & etop);
724
+ */
725
+
726
+ template <int D> class DIM_trait { };
727
+
728
+ template <> class DIM_trait<0>
729
+ {
730
+ public:
731
+ enum { MAX_VERTEX = 1 };
732
+ enum { MAX_EDGE = 0 };
733
+ enum { MAX_FACE = 0 };
734
+ enum { MAX_CELL = 0 };
735
+ };
736
+
737
+ template <> class DIM_trait<1>
738
+ {
739
+ public:
740
+ enum { MAX_VERTEX = 2 };
741
+ enum { MAX_EDGE = 1 };
742
+ enum { MAX_FACE = 0 };
743
+ enum { MAX_CELL = 0 };
744
+ };
745
+
746
+ template <> class DIM_trait<2>
747
+ {
748
+ public:
749
+ enum { MAX_VERTEX = 4 };
750
+ enum { MAX_EDGE = 4 };
751
+ enum { MAX_FACE = 1 };
752
+ enum { MAX_CELL = 0 };
753
+ };
754
+
755
+ template <> class DIM_trait<3>
756
+ {
757
+ public:
758
+ enum { MAX_VERTEX = 8 };
759
+ enum { MAX_EDGE = 12 };
760
+ enum { MAX_FACE = 6 };
761
+ enum { MAX_CELL = 1 };
762
+ };
763
+
764
+
765
+
766
+
767
+
768
+ template <int ET> class ET_trait { };
769
+
770
+ template<> class ET_trait<ET_POINT>
771
+ {
772
+ public:
773
+ enum { DIM = 0 };
774
+ enum { N_VERTEX = 1 };
775
+ enum { N_EDGE = 0 };
776
+ enum { N_FACE = 0 };
777
+ enum { N_CELL = 0 };
778
+ enum { N_FACET = 0 };
779
+
780
+ static constexpr ELEMENT_TYPE ElementType() { return ET_POINT; }
781
+ constexpr operator ELEMENT_TYPE() const { return ET_POINT; }
782
+
783
+ static INLINE int PolDimension (IVec<1> order) { return 1; }
784
+ static INLINE int PolBubbleDimension (IVec<1> order) { return 0; }
785
+
786
+ static INLINE ELEMENT_TYPE FaceType(int i) { return ET_POINT; } // dummy
787
+
788
+
789
+
790
+ static INLINE IVec<2> GetEdge (int /* i */);
791
+ /*
792
+ {
793
+ static const int edges[][2] =
794
+ { { 0, 1 } };
795
+ return IVec<2> (edges[0][0], edges[0][1]);
796
+ }
797
+ */
798
+
799
+ template <typename TVN>
800
+ static INLINE IVec<2> GetEdgeSort (int i, const TVN & vnums);
801
+ /*
802
+ {
803
+ IVec<2> e = GetEdge (i);
804
+ if (vnums[e[0]] > vnums[e[1]]) swap (e[0], e[1]);
805
+ return e;
806
+ }
807
+ */
808
+
809
+ static IVec<4> GetFace (int /* i */ );
810
+ /*
811
+ {
812
+ return IVec<4> (-1, -1, -1, -1);
813
+ }
814
+ */
815
+ template <typename TVN>
816
+ static IVec<4> GetFaceSort (int /* i */ , const TVN & vnums);
817
+ /*
818
+ {
819
+ return GetFace(0);
820
+ }
821
+ */
822
+
823
+ template <typename TVN>
824
+ static INLINE int GetClassNr (const TVN & vnums)
825
+ {
826
+ return 0;
827
+ }
828
+
829
+ template <typename TVN>
830
+ static INLINE int GetFacetClassNr (int facet, const TVN & vnums)
831
+ {
832
+ return 0;
833
+ }
834
+
835
+ };
836
+
837
+
838
+
839
+
840
+
841
+ template<> class ET_trait<ET_SEGM>
842
+ {
843
+ public:
844
+ enum { DIM = 1 };
845
+ enum { N_VERTEX = 2 };
846
+ enum { N_EDGE = 1 };
847
+ enum { N_FACE = 0 };
848
+ enum { N_CELL = 0 };
849
+ enum { N_FACET = 2 };
850
+
851
+ static constexpr ELEMENT_TYPE ElementType() { return ET_SEGM; }
852
+ constexpr operator ELEMENT_TYPE() const { return ET_SEGM; }
853
+
854
+ static INLINE int PolDimension (IVec<1> order) { return order[0]+1; }
855
+ static INLINE int PolBubbleDimension (IVec<1> order) { return (order[0] <= 1) ? 0 : order[0]-1; }
856
+
857
+ static INLINE ELEMENT_TYPE FaceType(int i) { return ET_TRIG; }
858
+
859
+ static INLINE IVec<2> GetEdge (int /* i */)
860
+ {
861
+ const int edges[][2] =
862
+ { { 0, 1 } };
863
+ return IVec<2> (edges[0][0], edges[0][1]);
864
+ }
865
+
866
+ template <typename TVN>
867
+ static INLINE IVec<2> GetEdgeSort (int i, const TVN & vnums)
868
+ {
869
+ IVec<2> e = GetEdge (i);
870
+ if (vnums[e[0]] > vnums[e[1]]) Swap (e[0], e[1]);
871
+ return e;
872
+ }
873
+
874
+
875
+ static INLINE IVec<4> GetFace (int /* i */ )
876
+ {
877
+ return IVec<4> (-1, -1, -1, -1);
878
+ }
879
+
880
+ template <typename TVN>
881
+ static INLINE IVec<4> GetFaceSort (int /* i */ , const TVN & vnums)
882
+ {
883
+ return GetFace(0);
884
+ }
885
+
886
+ template <typename TVN>
887
+ static INLINE int GetClassNr (const TVN & vnums)
888
+ {
889
+ int classnr = 0;
890
+ int sort[3] = { 0, 1 };
891
+ if (vnums[sort[0]] > vnums[sort[1]]) { Swap (sort[0], sort[1]); classnr += 1; }
892
+ return classnr;
893
+ }
894
+
895
+ template <typename TVN>
896
+ static INLINE int GetFacetClassNr (int facet, const TVN & vnums)
897
+ {
898
+ return facet;
899
+ }
900
+ };
901
+
902
+ template<> class ET_trait<ET_TRIG>
903
+ {
904
+ public:
905
+ enum { DIM = 2 };
906
+ enum { N_VERTEX = 3 };
907
+ enum { N_EDGE = 3 };
908
+ enum { N_FACE = 1 };
909
+ enum { N_CELL = 0 };
910
+ enum { N_FACET = 3 };
911
+
912
+ static constexpr ELEMENT_TYPE ElementType() { return ET_TRIG; }
913
+ constexpr operator ELEMENT_TYPE() const { return ET_TRIG; }
914
+
915
+ static constexpr int PolDimension (int order) { return (order+1)*(order+2)/2; }
916
+ static INLINE int PolDimension (IVec<2> order) { return (order[0]+1)*(order[0]+2)/2; }
917
+ static INLINE int PolBubbleDimension (IVec<2> order) { return (order[0] <= 2) ? 0 : (order[0]-1)*(order[0]-2)/2; }
918
+
919
+ static INLINE ELEMENT_TYPE FaceType(int i) { return ET_TRIG; }
920
+
921
+ template <typename Tx, typename Tlam>
922
+ static INLINE void CalcLambda (const Tx & x, Tlam & lam)
923
+ { lam[0] = x[0]; lam[1] = x[1], lam[2] = 1-x[0]-x[1]; }
924
+
925
+
926
+ // static constexpr IVec<2> edges[3] = { { 2, 0 }, { 1, 2 }, { 0, 1 } };
927
+ static constexpr array<IVec<2>,3> edges = { IVec<2>{ 2, 0 }, IVec<2>{ 1, 2 }, IVec<2>{ 0, 1 } };
928
+
929
+ static constexpr IVec<2> GetEdge (int i)
930
+ {
931
+ constexpr IVec<2> edges[] =
932
+ { { 2, 0 },
933
+ { 1, 2 },
934
+ { 0, 1 } };
935
+ return edges[i];
936
+ }
937
+
938
+ template <typename TVN>
939
+ static INLINE IVec<2> GetEdgeSort (int i, const TVN & vnums)
940
+ {
941
+ IVec<2> e = GetEdge (i);
942
+ if (vnums[e[0]] > vnums[e[1]]) Swap (e[0], e[1]);
943
+ return e;
944
+ }
945
+
946
+
947
+ static INLINE IVec<4> GetFace (int /* i */ )
948
+ {
949
+ static const int face[] = { 0, 1, 2, -1 };
950
+ return IVec<4> (face[0], face[1], face[2], -1);
951
+ }
952
+
953
+ template <typename TVN>
954
+ static INLINE IVec<4> GetFaceSort (int /* i */ , const TVN & vnums)
955
+ {
956
+ IVec<4> f = GetFace (0);
957
+ if(vnums[f[0]] > vnums[f[1]]) Swap(f[0],f[1]);
958
+ if(vnums[f[1]] > vnums[f[2]]) Swap(f[1],f[2]);
959
+ if(vnums[f[0]] > vnums[f[1]]) Swap(f[0],f[1]);
960
+
961
+ return f;
962
+ }
963
+
964
+
965
+ template <typename TVN>
966
+ static INLINE int GetClassNr (const TVN & vnums)
967
+ {
968
+ int classnr = 0;
969
+ int sort[3] = { 0, 1, 2 };
970
+ if (vnums[sort[0]] > vnums[sort[1]]) { Swap (sort[0], sort[1]); classnr += 1; }
971
+ if (vnums[sort[1]] > vnums[sort[2]]) { Swap (sort[1], sort[2]); classnr += 2; }
972
+ if (vnums[sort[0]] > vnums[sort[1]]) { Swap (sort[0], sort[1]); classnr += 2; } // tricky !
973
+ return classnr;
974
+ }
975
+
976
+ template <typename TVN>
977
+ static INLINE int GetFacetClassNr (int facet, const TVN & vnums)
978
+ {
979
+ int sort[3] = { 0, 1, 2 };
980
+ if (vnums[sort[0]] > vnums[sort[1]]) { Swap (sort[0], sort[1]); }
981
+ if (vnums[sort[1]] > vnums[sort[2]]) { Swap (sort[1], sort[2]); }
982
+ if (vnums[sort[0]] > vnums[sort[1]]) { Swap (sort[0], sort[1]); }
983
+
984
+ static
985
+ int f2vop[] = { 1, 0, 2 };
986
+ int vop = f2vop[facet];
987
+ for (int i = 0; i < 3; i++)
988
+ if (vop == sort[i])
989
+ return i;
990
+ return -1; // not possible
991
+
992
+ // return GetClassNr (vnums) * 3 + facet;
993
+ }
994
+ };
995
+
996
+ // ******************** QUAD ***********************************
997
+
998
+ template<> class ET_trait<ET_QUAD>
999
+ {
1000
+ public:
1001
+ enum { DIM = 2 };
1002
+ enum { N_VERTEX = 4 };
1003
+ enum { N_EDGE = 4 };
1004
+ enum { N_FACE = 1 };
1005
+ enum { N_CELL = 0 };
1006
+ enum { N_FACET = 4 };
1007
+
1008
+ static constexpr ELEMENT_TYPE ElementType() { return ET_QUAD; }
1009
+ constexpr operator ELEMENT_TYPE() const { return ET_QUAD; }
1010
+
1011
+ static constexpr INLINE int PolDimension (int order) { return (order+1)*(order+1); }
1012
+ static INLINE int PolDimension (IVec<2> order) { return (order[0]+1)*(order[1]+1); }
1013
+ static INLINE int PolBubbleDimension (IVec<2> order) { return (order[0] <= 1 || order[1] <= 1) ? 0 : (order[0]-1)*(order[1]-1); }
1014
+
1015
+
1016
+ static INLINE ELEMENT_TYPE FaceType(int i) { return ET_QUAD; }
1017
+
1018
+
1019
+
1020
+
1021
+ static INLINE IVec<2> GetEdge (int i)
1022
+ {
1023
+ static const int edges[][2] =
1024
+ { { 0, 1 },
1025
+ { 2, 3 },
1026
+ { 3, 0 },
1027
+ { 1, 2 }};
1028
+ return IVec<2> (edges[i][0], edges[i][1]);
1029
+ }
1030
+
1031
+ template <typename TVN>
1032
+ static INLINE IVec<2> GetEdgeSort (int i, const TVN & vnums)
1033
+ {
1034
+ IVec<2> e = GetEdge (i);
1035
+ if (vnums[e[0]] > vnums[e[1]]) swap (e[0], e[1]);
1036
+ return e;
1037
+ }
1038
+
1039
+
1040
+ template <typename Tx, typename TVN>
1041
+ static INLINE Tx XiEdge (int i, Tx hx[], const TVN & vnums)
1042
+ {
1043
+ IVec<2> e = GetEdgeSort (i, vnums);
1044
+ static const int vi[4][2] = { { 0, 0 }, { 1, 0 }, { 1, 1 }, { 0, 1 } };
1045
+ Tx xi(0.0);
1046
+ for (int j = 0; j < 2; j++)
1047
+ {
1048
+ int edir = vi[e[1]][j] - vi[e[0]][j];
1049
+ if (edir == 1) { xi = 2*hx[j]-1; break; }
1050
+ if (edir == -1) { xi = 1-2*hx[j]; break; }
1051
+ }
1052
+ return xi;
1053
+ }
1054
+
1055
+ template <typename Tx>
1056
+ static INLINE Tx LamEdge (int i, Tx hx[])
1057
+ {
1058
+ switch (i)
1059
+ {
1060
+ case 0: return 1-hx[1];
1061
+ case 1: return hx[1];
1062
+ case 2: return 1-hx[0];
1063
+ case 3: default: return hx[0];
1064
+ }
1065
+ }
1066
+
1067
+
1068
+ static INLINE IVec<4> GetFace (int /* i */ )
1069
+ {
1070
+ static const int face[] =
1071
+ { 0, 1, 2, 3 };
1072
+
1073
+ return IVec<4> (face[0], face[1], face[2], face[3]);
1074
+ }
1075
+
1076
+ template <typename TVN>
1077
+ static INLINE IVec<4> GetFaceSort (int /* i */ , const TVN & vnums)
1078
+ {
1079
+ IVec<4> f = GetFace (0);
1080
+
1081
+ int fmax = 0;
1082
+ for (int j=1; j<4; j++)
1083
+ if (vnums[j] < vnums[fmax]) fmax = j;
1084
+
1085
+ int f1 = (fmax+3)%4;
1086
+ int f2 = (fmax+1)%4;
1087
+ int fop = (fmax+2)%4;
1088
+
1089
+ if(vnums[f2]<vnums[f1]) swap(f1,f2); // fmax > f1 > f2
1090
+
1091
+ f[0] = fmax;
1092
+ f[1] = f1;
1093
+ f[2] = fop;
1094
+ f[3] = f2;
1095
+
1096
+ return f;
1097
+ }
1098
+
1099
+ template <typename Tx, typename TVN>
1100
+ static INLINE Vec<2,Tx> XiFace (int /* i */, Tx hx[], const TVN & vnums)
1101
+ {
1102
+ IVec<4> f = GetFaceSort (0, vnums);
1103
+ static const int vi[4][2] = { { 0, 0 }, { 1, 0 }, { 1, 1 }, { 0, 1 } };
1104
+ Tx xi(0), eta(0);
1105
+ for (int j = 0; j < 2; j++)
1106
+ {
1107
+ int edir = vi[f[0]][j] - vi[f[1]][j];
1108
+ if (edir == 1) { xi = 2*hx[j]-1; break; }
1109
+ if (edir == -1) { xi = 1-2*hx[j]; break; }
1110
+ }
1111
+ for (int j = 0; j < 2; j++)
1112
+ {
1113
+ int edir = vi[f[0]][j] - vi[f[3]][j];
1114
+ if (edir == 1) { eta = 2*hx[j]-1; break; }
1115
+ if (edir == -1) { eta = 1-2*hx[j]; break; }
1116
+ }
1117
+ return Vec<2,Tx> (xi, eta);
1118
+ }
1119
+
1120
+ template <typename TVN>
1121
+ static INLINE int GetClassNr (const TVN & vnums)
1122
+ {
1123
+ int classnr = 0;
1124
+
1125
+ int sort[4] = { 0, 1, 2, 3 };
1126
+ if (vnums[sort[0]] > vnums[sort[1]]) { Swap (sort[0], sort[1]); classnr += 1; }
1127
+ if (vnums[sort[2]] > vnums[sort[3]]) { Swap (sort[2], sort[3]); classnr += 2; }
1128
+ if (vnums[sort[0]] > vnums[sort[2]]) { Swap (sort[0], sort[2]); classnr += 4; }
1129
+ if (vnums[sort[1]] > vnums[sort[3]]) { Swap (sort[1], sort[3]); classnr += 8; }
1130
+ if (vnums[sort[1]] > vnums[sort[2]]) { Swap (sort[1], sort[2]); classnr += 16; }
1131
+
1132
+ return classnr;
1133
+ }
1134
+
1135
+
1136
+ template <typename TVN>
1137
+ static INLINE int GetFacetClassNr (int facet, const TVN & vnums)
1138
+ {
1139
+ return GetClassNr (vnums) * 4 + facet;
1140
+ }
1141
+ };
1142
+
1143
+
1144
+ template<> class ET_trait<ET_TET>
1145
+ {
1146
+ public:
1147
+ enum { DIM = 3 };
1148
+ enum { N_VERTEX = 4 };
1149
+ enum { N_EDGE = 6 };
1150
+ enum { N_FACE = 4 };
1151
+ enum { N_CELL = 1 };
1152
+ enum { N_FACET = 4 };
1153
+
1154
+ static constexpr ELEMENT_TYPE ElementType() { return ET_TET; }
1155
+ constexpr operator ELEMENT_TYPE() const { return ET_TET; }
1156
+
1157
+ static constexpr INLINE int PolDimension (int p) { return (p+1)*(p+2)*(p+3)/6; }
1158
+ static INLINE int PolDimension (IVec<3> p) { return (p[0]+1)*(p[0]+2)*(p[0]+3)/6; }
1159
+ static INLINE int PolBubbleDimension (IVec<3> p) { return (p[0] <= 3) ? 0 : (p[0]-1)*(p[0]-2)*(p[0]-3)/6; }
1160
+
1161
+ static INLINE ELEMENT_TYPE FaceType(int i) { return ET_TRIG; }
1162
+
1163
+ static INLINE IVec<2> GetEdge (int i)
1164
+ {
1165
+ static const int edges[6][2] =
1166
+ { { 3, 0 },
1167
+ { 3, 1 },
1168
+ { 3, 2 },
1169
+ { 0, 1 },
1170
+ { 0, 2 },
1171
+ { 1, 2 }};
1172
+ return IVec<2> (edges[i][0], edges[i][1]);
1173
+ }
1174
+
1175
+ template <typename TVN>
1176
+ static INLINE IVec<2> GetEdgeSort (int i, const TVN & vnums)
1177
+ {
1178
+ IVec<2> e = GetEdge (i);
1179
+ if (vnums[e[0]] > vnums[e[1]]) swap (e[0], e[1]);
1180
+ return e;
1181
+ }
1182
+
1183
+
1184
+ static INLINE IVec<4> GetFace (int i )
1185
+ {
1186
+ static const int faces[][4] =
1187
+ { { 3, 1, 2, -1 },
1188
+ { 3, 2, 0, -1 },
1189
+ { 3, 0, 1, -1 },
1190
+ { 0, 2, 1, -1 } };
1191
+
1192
+ return IVec<4> (faces[i][0], faces[i][1], faces[i][2], -1);
1193
+ }
1194
+
1195
+ template <typename TVN>
1196
+ static INLINE IVec<4> GetFaceSort (int i, const TVN & vnums)
1197
+ {
1198
+ IVec<4> f = GetFace (i);
1199
+ if(vnums[f[0]] > vnums[f[1]]) swap(f[0],f[1]);
1200
+ if(vnums[f[1]] > vnums[f[2]]) swap(f[1],f[2]);
1201
+ if(vnums[f[0]] > vnums[f[1]]) swap(f[0],f[1]);
1202
+
1203
+ return f;
1204
+ }
1205
+
1206
+
1207
+ template <typename TVN>
1208
+ static INLINE int GetClassNr (const TVN & vnums)
1209
+ {
1210
+ int classnr = 0;
1211
+
1212
+ int sort[4] = { 0, 1, 2, 3 };
1213
+ if (vnums[sort[0]] > vnums[sort[1]]) { Swap (sort[0], sort[1]); classnr += 1; }
1214
+ if (vnums[sort[2]] > vnums[sort[3]]) { Swap (sort[2], sort[3]); classnr += 2; }
1215
+ if (vnums[sort[0]] > vnums[sort[2]]) { Swap (sort[0], sort[2]); classnr += 4; }
1216
+ if (vnums[sort[1]] > vnums[sort[3]]) { Swap (sort[1], sort[3]); classnr += 8; }
1217
+ if (vnums[sort[1]] > vnums[sort[2]]) { Swap (sort[1], sort[2]); classnr += 16; }
1218
+
1219
+ return classnr;
1220
+ }
1221
+
1222
+ template <typename TVN>
1223
+ static INLINE int GetFacetClassNr (int facet, const TVN & vnums)
1224
+ {
1225
+ int sort[4] = { 0, 1, 2, 3 };
1226
+ if (vnums[sort[0]] > vnums[sort[1]]) { Swap (sort[0], sort[1]); }
1227
+ if (vnums[sort[2]] > vnums[sort[3]]) { Swap (sort[2], sort[3]); }
1228
+ if (vnums[sort[0]] > vnums[sort[2]]) { Swap (sort[0], sort[2]); }
1229
+ if (vnums[sort[1]] > vnums[sort[3]]) { Swap (sort[1], sort[3]); }
1230
+ if (vnums[sort[1]] > vnums[sort[2]]) { Swap (sort[1], sort[2]); }
1231
+
1232
+ for (int i = 0; i < 4; i++)
1233
+ if (facet == sort[i])
1234
+ return i;
1235
+ return -1; // not possible
1236
+
1237
+ // return GetClassNr (vnums) * 4 + facet;
1238
+ }
1239
+
1240
+
1241
+ };
1242
+
1243
+ template<> class ET_trait<ET_PRISM>
1244
+ {
1245
+ public:
1246
+ enum { DIM = 3 };
1247
+ enum { N_VERTEX = 6 };
1248
+ enum { N_EDGE = 9 };
1249
+ enum { N_FACE = 5 };
1250
+ enum { N_CELL = 1 };
1251
+ enum { N_FACET = 5 };
1252
+
1253
+ static constexpr ELEMENT_TYPE ElementType() { return ET_PRISM; }
1254
+ constexpr operator ELEMENT_TYPE() const { return ET_PRISM; }
1255
+
1256
+ static INLINE int PolDimension (IVec<3> order) { return (order[0]+1)*(order[0]+2)*(order[2]+1)/2; }
1257
+ static INLINE int PolBubbleDimension (IVec<3> p) { return (p[0] <= 2) ? 0 : (p[0]-1)*(p[0]-2)*(p[2]-1)/2; }
1258
+
1259
+ static INLINE ELEMENT_TYPE FaceType(int i) { return (i < 2) ? ET_TRIG : ET_QUAD; }
1260
+
1261
+
1262
+ static INLINE IVec<2> GetEdge (int i)
1263
+ {
1264
+ #ifndef __CUDA_ARCH__
1265
+ static
1266
+ #endif
1267
+ const int edges[][2] =
1268
+ { { 2, 0 },
1269
+ { 0, 1 },
1270
+ { 2, 1 },
1271
+ { 5, 3 },
1272
+ { 3, 4 },
1273
+ { 5, 4 },
1274
+ { 2, 5 },
1275
+ { 0, 3 },
1276
+ { 1, 4 }};
1277
+ return IVec<2> (edges[i][0], edges[i][1]);
1278
+ }
1279
+
1280
+ template <typename TVN>
1281
+ static INLINE IVec<2> GetEdgeSort (int i, const TVN & vnums)
1282
+ {
1283
+ IVec<2> e = GetEdge (i);
1284
+ if (vnums[e[0]] > vnums[e[1]]) swap (e[0], e[1]);
1285
+ return e;
1286
+ }
1287
+
1288
+
1289
+ static INLINE IVec<4> GetFace (int i )
1290
+ {
1291
+ #ifndef __CUDA_ARCH__
1292
+ static
1293
+ #endif
1294
+ const int faces[][4] =
1295
+ {
1296
+ { 0, 2, 1, -1 },
1297
+ { 3, 4, 5, -1 },
1298
+ { 2, 0, 3, 5 },
1299
+ { 0, 1, 4, 3 },
1300
+ { 1, 2, 5, 4 }
1301
+ };
1302
+
1303
+ return IVec<4> (faces[i][0], faces[i][1], faces[i][2], faces[i][3]);
1304
+ }
1305
+
1306
+ template <typename TVN>
1307
+ static INLINE IVec<4> GetFaceSort (int i, const TVN & vnums)
1308
+ {
1309
+ IVec<4> f = GetFace (i);
1310
+ if (i < 2)
1311
+ {
1312
+ if(vnums[f[0]] > vnums[f[1]]) swap(f[0],f[1]);
1313
+ if(vnums[f[1]] > vnums[f[2]]) swap(f[1],f[2]);
1314
+ if(vnums[f[0]] > vnums[f[1]]) swap(f[0],f[1]);
1315
+ return f;
1316
+ }
1317
+ else
1318
+ {
1319
+ int fmax = 0;
1320
+ for (int j=1; j<4; j++)
1321
+ if (vnums[f[j]] < vnums[f[fmax]]) fmax = j;
1322
+
1323
+ int f1 = (fmax+3)%4;
1324
+ int f2 = (fmax+1)%4;
1325
+ int fop = (fmax+2)%4;
1326
+
1327
+ if(vnums[f[f2]]<vnums[f[f1]]) swap(f1,f2); // fmax > f1 > f2
1328
+
1329
+ return IVec<4> (f[fmax], f[f1], f[fop], f[f2]);
1330
+ }
1331
+ }
1332
+
1333
+ template <typename TVN>
1334
+ static INLINE int GetClassNr (const TVN & vnums)
1335
+ {
1336
+ int classnr = 0;
1337
+ int sort[3] = { 0, 1, 2 };
1338
+ if (vnums[sort[0]] > vnums[sort[1]]) { Swap (sort[0], sort[1]); classnr += 1; }
1339
+ if (vnums[sort[1]] > vnums[sort[2]]) { Swap (sort[1], sort[2]); classnr += 2; }
1340
+ if (vnums[sort[0]] > vnums[sort[1]]) { Swap (sort[0], sort[1]); classnr += 2; } // tricky !
1341
+ return classnr;
1342
+ }
1343
+
1344
+ template <typename TVN>
1345
+ static INLINE int GetFacetClassNr (int facet, const TVN & vnums)
1346
+ {
1347
+ return 0;
1348
+ }
1349
+
1350
+ };
1351
+
1352
+ template<> class ET_trait<ET_PYRAMID>
1353
+ {
1354
+ public:
1355
+ enum { DIM = 3 };
1356
+ enum { N_VERTEX = 5 };
1357
+ enum { N_EDGE = 8 };
1358
+ enum { N_FACE = 5 };
1359
+ enum { N_CELL = 1 };
1360
+ enum { N_FACET = 5 };
1361
+
1362
+ static constexpr ELEMENT_TYPE ElementType() { return ET_PYRAMID; }
1363
+ constexpr operator ELEMENT_TYPE() const { return ET_PYRAMID; }
1364
+
1365
+ static INLINE ELEMENT_TYPE FaceType(int i) { return (i < 4) ? ET_TRIG : ET_QUAD; }
1366
+
1367
+ static INLINE int PolDimension (IVec<3> order) { return (order[0]+2)*(order[0]+1)*(2*order[0]+3) / 6; }
1368
+ static INLINE int PolBubbleDimension (IVec<3> p) { return (p[0] <= 2) ? 0 : (p[0]-1)*(p[0]-2)*(2*p[0]-3)/6; }
1369
+
1370
+ static INLINE IVec<2> GetEdge (int i)
1371
+ {
1372
+ #ifndef __CUDA_ARCH__
1373
+ static
1374
+ #endif
1375
+ const int edges[][2] =
1376
+ { { 0, 1 },
1377
+ { 1, 2 },
1378
+ { 0, 3 },
1379
+ { 3, 2 },
1380
+ { 0, 4 },
1381
+ { 1, 4 },
1382
+ { 2, 4 },
1383
+ { 3, 4 }};
1384
+
1385
+ return IVec<2> (edges[i][0], edges[i][1]);
1386
+ }
1387
+
1388
+ template <typename TVN>
1389
+ static INLINE IVec<2> GetEdgeSort (int i, const TVN & vnums)
1390
+ {
1391
+ IVec<2> e = GetEdge (i);
1392
+ if (vnums[e[0]] > vnums[e[1]]) swap (e[0], e[1]);
1393
+ return e;
1394
+ }
1395
+
1396
+
1397
+
1398
+ static INLINE IVec<4> GetFace (int i )
1399
+ {
1400
+ #ifndef __CUDA_ARCH__
1401
+ static
1402
+ #endif
1403
+ const int faces[][4] =
1404
+ {
1405
+ { 0, 1, 4, -1 },
1406
+ { 1, 2, 4, -1 },
1407
+ { 2, 3, 4, -1 },
1408
+ { 3, 0, 4, -1 },
1409
+ { 0, 3, 2, 1 }
1410
+ };
1411
+
1412
+ return IVec<4> (faces[i][0], faces[i][1], faces[i][2], faces[i][3]);
1413
+ }
1414
+
1415
+ template <typename TVN>
1416
+ static INLINE IVec<4> GetFaceSort (int i, const TVN & vnums)
1417
+ {
1418
+ IVec<4> f = GetFace (i);
1419
+ if (i < 4)
1420
+ {
1421
+ if(vnums[f[0]] > vnums[f[1]]) swap(f[0],f[1]);
1422
+ if(vnums[f[1]] > vnums[f[2]]) swap(f[1],f[2]);
1423
+ if(vnums[f[0]] > vnums[f[1]]) swap(f[0],f[1]);
1424
+ return f;
1425
+ }
1426
+ else
1427
+ {
1428
+ int fmax = 0;
1429
+ for (int j=1; j<4; j++)
1430
+ if (vnums[f[j]] < vnums[f[fmax]]) fmax = j;
1431
+
1432
+ int f1 = (fmax+3)%4;
1433
+ int f2 = (fmax+1)%4;
1434
+ int fop = (fmax+2)%4;
1435
+
1436
+ if(vnums[f[f2]]<vnums[f[f1]]) swap(f1,f2); // fmax > f1 > f2
1437
+
1438
+ return IVec<4> (f[fmax], f[f1], f[fop], f[f2]);
1439
+ }
1440
+ }
1441
+
1442
+ template <typename TVN>
1443
+ static INLINE int GetClassNr (const TVN & vnums)
1444
+ {
1445
+ return 0;
1446
+ }
1447
+
1448
+ template <typename TVN>
1449
+ static INLINE int GetFacetClassNr (int facet, const TVN & vnums)
1450
+ {
1451
+ return 0;
1452
+ }
1453
+
1454
+ };
1455
+
1456
+
1457
+
1458
+ template<> class ET_trait<ET_HEXAMID>
1459
+ {
1460
+ public:
1461
+ enum { DIM = 3 };
1462
+ enum { N_VERTEX = 7 };
1463
+ enum { N_EDGE = 11 };
1464
+ enum { N_FACE = 6 };
1465
+ enum { N_CELL = 1 };
1466
+ enum { N_FACET = 6 };
1467
+
1468
+ static constexpr ELEMENT_TYPE ElementType() { return ET_HEXAMID; }
1469
+ constexpr operator ELEMENT_TYPE() const { return ET_HEXAMID; }
1470
+
1471
+ static INLINE ELEMENT_TYPE FaceType(int i) { return (i==1||i==4) ? ET_TRIG : ET_QUAD; }
1472
+
1473
+ // TODO
1474
+ static INLINE int PolDimension (IVec<3> order) {
1475
+ int p = order[0];
1476
+ return (p+1)*(p+1)*(p+1) - (p-1) - p*(p-1);
1477
+ }
1478
+ // TODO
1479
+ static INLINE int PolBubbleDimension (IVec<3> p) { return (p[0] < 2) ? 0 : (p[0]-1)*(p[0]-1)*(p[0]-1); }
1480
+
1481
+ static INLINE IVec<2> GetEdge (int i)
1482
+ {
1483
+ #ifndef __CUDA_ARCH__
1484
+ static
1485
+ #endif
1486
+ const int edges[][2] =
1487
+ {
1488
+ { 0, 1 },
1489
+ { 2, 3 },
1490
+ { 3, 0 },
1491
+ { 1, 2 },
1492
+ { 4, 5 },
1493
+ { 6, 4 },
1494
+ { 5, 6 },
1495
+ { 0, 4 },
1496
+ { 1, 5 },
1497
+ { 2, 6 },
1498
+ { 3, 6 },
1499
+ };
1500
+ return IVec<2> (edges[i][0], edges[i][1]);
1501
+ }
1502
+
1503
+ template <typename TVN>
1504
+ static INLINE IVec<2> GetEdgeSort (int i, const TVN & vnums)
1505
+ {
1506
+ IVec<2> e = GetEdge (i);
1507
+ if (vnums[e[0]] > vnums[e[1]]) swap (e[0], e[1]);
1508
+ return e;
1509
+ }
1510
+
1511
+
1512
+
1513
+ static INLINE IVec<4> GetFace (int i )
1514
+ {
1515
+ #ifndef __CUDA_ARCH__
1516
+ static
1517
+ #endif
1518
+ const int faces[][4] =
1519
+ {
1520
+ { 0, 3, 2, 1 },
1521
+ { 4, 5, 6, -1},
1522
+ { 0, 1, 5, 4 },
1523
+ { 1, 2, 6, 5 },
1524
+ { 2, 3, 6, -1},
1525
+ { 3, 0, 4, 6 }
1526
+ };
1527
+
1528
+ return IVec<4> (faces[i][0], faces[i][1], faces[i][2], faces[i][3]);
1529
+ }
1530
+
1531
+ // TODO
1532
+ template <typename TVN>
1533
+ static INLINE IVec<4> GetFaceSort (int i, const TVN & vnums)
1534
+ {
1535
+ IVec<4> f = GetFace (i);
1536
+ if (f[3] < 0)
1537
+ {
1538
+ if(vnums[f[0]] > vnums[f[1]]) swap(f[0],f[1]);
1539
+ if(vnums[f[1]] > vnums[f[2]]) swap(f[1],f[2]);
1540
+ if(vnums[f[0]] > vnums[f[1]]) swap(f[0],f[1]);
1541
+ return f;
1542
+ }
1543
+ else
1544
+ {
1545
+ int fmax = 0;
1546
+ for (int j=1; j<4; j++)
1547
+ if (vnums[f[j]] < vnums[f[fmax]]) fmax = j;
1548
+
1549
+ int f1 = (fmax+3)%4;
1550
+ int f2 = (fmax+1)%4;
1551
+ int fop = (fmax+2)%4;
1552
+
1553
+ if(vnums[f[f2]]<vnums[f[f1]]) swap(f1,f2); // fmax > f1 > f2
1554
+
1555
+ return IVec<4> (f[fmax], f[f1], f[fop], f[f2]);
1556
+ }
1557
+ }
1558
+
1559
+ template <typename TVN>
1560
+ static INLINE int GetClassNr (const TVN & vnums)
1561
+ {
1562
+ return 0;
1563
+ }
1564
+
1565
+ template <typename TVN>
1566
+ static INLINE int GetFacetClassNr (int facet, const TVN & vnums)
1567
+ {
1568
+ return 0;
1569
+ }
1570
+
1571
+ };
1572
+
1573
+
1574
+
1575
+
1576
+
1577
+ template<> class ET_trait<ET_HEX>
1578
+ {
1579
+ public:
1580
+ enum { DIM = 3 };
1581
+ enum { N_VERTEX = 8 };
1582
+ enum { N_EDGE = 12 };
1583
+ enum { N_FACE = 6 };
1584
+ enum { N_CELL = 1 };
1585
+ enum { N_FACET = 6 };
1586
+
1587
+ static constexpr ELEMENT_TYPE ElementType() { return ET_HEX; }
1588
+ constexpr operator ELEMENT_TYPE() const { return ET_HEX; }
1589
+
1590
+ static ELEMENT_TYPE FaceType(int i) { return ET_QUAD; }
1591
+
1592
+ static inline int PolDimension (IVec<3> order) { return (order[0]+1)*(order[1]+1)*(order[2]+1); }
1593
+ static inline int PolBubbleDimension (IVec<3> p) { return (p[0] <= 1) ? 0 : (p[0]-1)*(p[1]-1)*(p[2]-1); }
1594
+
1595
+ static IVec<2> GetEdge (int i)
1596
+ {
1597
+ static const int edges[][2] =
1598
+ {
1599
+ { 0, 1 },
1600
+ { 2, 3 },
1601
+ { 3, 0 },
1602
+ { 1, 2 },
1603
+ { 4, 5 },
1604
+ { 6, 7 },
1605
+ { 7, 4 },
1606
+ { 5, 6 },
1607
+ { 0, 4 },
1608
+ { 1, 5 },
1609
+ { 2, 6 },
1610
+ { 3, 7 },
1611
+ };
1612
+ return IVec<2> (edges[i][0], edges[i][1]);
1613
+ }
1614
+
1615
+ template <typename TVN>
1616
+ static IVec<2> GetEdgeSort (int i, const TVN & vnums)
1617
+ {
1618
+ IVec<2> e = GetEdge (i);
1619
+ if (vnums[e[0]] > vnums[e[1]]) swap (e[0], e[1]);
1620
+ return e;
1621
+ }
1622
+
1623
+
1624
+ static IVec<4> GetFace (int i )
1625
+ {
1626
+ static const int faces[][4] =
1627
+ {
1628
+ { 0, 3, 2, 1 },
1629
+ { 4, 5, 6, 7 },
1630
+ { 0, 1, 5, 4 },
1631
+ { 1, 2, 6, 5 },
1632
+ { 2, 3, 7, 6 },
1633
+ { 3, 0, 4, 7 }
1634
+ };
1635
+
1636
+ return IVec<4> (faces[i][0], faces[i][1], faces[i][2], faces[i][3]);
1637
+ }
1638
+
1639
+
1640
+ template <typename TVN>
1641
+ static IVec<4> GetFaceSort (int i, const TVN & vnums)
1642
+ {
1643
+ IVec<4> f = GetFace (i);
1644
+
1645
+ int fmax = 0;
1646
+ for (int j=1; j<4; j++)
1647
+ if (vnums[f[j]] < vnums[f[fmax]]) fmax = j;
1648
+
1649
+ int f1 = (fmax+3)%4;
1650
+ int f2 = (fmax+1)%4;
1651
+ int fop = (fmax+2)%4;
1652
+
1653
+ if(vnums[f[f2]]<vnums[f[f1]]) swap(f1,f2); // fmax > f1 > f2
1654
+
1655
+ return IVec<4> (f[fmax], f[f1], f[fop], f[f2]);
1656
+ }
1657
+
1658
+
1659
+ template <typename TVN>
1660
+ static int GetClassNr (const TVN & vnums)
1661
+ {
1662
+ int verts[8];
1663
+ for (int j = 0; j < 8; j++)
1664
+ verts[j] = vnums[j];
1665
+
1666
+ int classnr = 0;
1667
+ for (int j = 0; j < 7; j++)
1668
+ {
1669
+ int maxk = 0;
1670
+ for (int k = 0; k < 8-j; k++)
1671
+ if (verts[k] > verts[maxk]) maxk = k;
1672
+ // compress
1673
+ for (int k = maxk; k < 7-j; k++)
1674
+ verts[k] = verts[k+1];
1675
+ classnr = maxk + (8-j) * classnr;
1676
+ }
1677
+ return classnr;
1678
+ }
1679
+
1680
+ template <typename TVN>
1681
+ static int GetFacetClassNr (int facet, const TVN & vnums)
1682
+ {
1683
+ return 0;
1684
+ }
1685
+
1686
+ };
1687
+
1688
+
1689
+ template <typename T>
1690
+ INLINE int PolBubbleDimension (ELEMENT_TYPE ET, IVec<1,T> order)
1691
+ {
1692
+ switch (ET)
1693
+ {
1694
+ case ET_SEGM: return ET_trait<ET_SEGM>::PolBubbleDimension (order);
1695
+ default: return 0;
1696
+ }
1697
+ }
1698
+
1699
+ template <typename T>
1700
+ inline int PolBubbleDimension (ELEMENT_TYPE ET, IVec<2,T> order)
1701
+ {
1702
+ switch (ET)
1703
+ {
1704
+ case ET_TRIG: return ET_trait<ET_TRIG>::PolBubbleDimension (order);
1705
+ case ET_QUAD: return ET_trait<ET_QUAD>::PolBubbleDimension (order);
1706
+ default: return 0;
1707
+ }
1708
+ }
1709
+
1710
+ template <typename T>
1711
+ inline int PolBubbleDimension (ELEMENT_TYPE ET, IVec<3,T> order)
1712
+ {
1713
+ switch (ET)
1714
+ {
1715
+ case ET_TET: return ET_trait<ET_TET>::PolBubbleDimension (order);
1716
+ case ET_PRISM: return ET_trait<ET_PRISM>::PolBubbleDimension (order);
1717
+ case ET_PYRAMID: return ET_trait<ET_PYRAMID>::PolBubbleDimension (order);
1718
+ case ET_HEX: return ET_trait<ET_HEX>::PolBubbleDimension (order);
1719
+ default: return 0;
1720
+ }
1721
+ }
1722
+
1723
+ template <typename FUNC>
1724
+ decltype(auto) SwitchET (ELEMENT_TYPE et, FUNC f)
1725
+ {
1726
+ switch (et)
1727
+ {
1728
+ case ET_POINT: return f(ET_trait<ET_POINT>());
1729
+ case ET_SEGM: return f(ET_trait<ET_SEGM>());
1730
+ case ET_TRIG: return f(ET_trait<ET_TRIG>());
1731
+ case ET_QUAD: return f(ET_trait<ET_QUAD>());
1732
+ case ET_TET: return f(ET_trait<ET_TET>());
1733
+ case ET_PRISM: return f(ET_trait<ET_PRISM>());
1734
+ case ET_PYRAMID: return f(ET_trait<ET_PYRAMID>());
1735
+ case ET_HEXAMID: return f(ET_trait<ET_HEXAMID>());
1736
+ case ET_HEX: return f(ET_trait<ET_HEX>());
1737
+ default:
1738
+ unreachable();
1739
+ }
1740
+ }
1741
+
1742
+ template<ELEMENT_TYPE ET1, typename FUNC>
1743
+ decltype(auto) SwitchET (ELEMENT_TYPE et, FUNC f)
1744
+ {
1745
+ if (et != ET1)
1746
+ throw Exception("Element type not defined!");
1747
+ return f(ET_trait<ET1>());
1748
+ }
1749
+
1750
+ template<ELEMENT_TYPE ET1, ELEMENT_TYPE ET2, ELEMENT_TYPE ... ET_REST, typename FUNC>
1751
+ decltype(auto) SwitchET (ELEMENT_TYPE et, FUNC f)
1752
+ {
1753
+ if (et==ET1)
1754
+ return f(ET_trait<ET1>());
1755
+ else
1756
+ return SwitchET<ET2,ET_REST...>(et,f);
1757
+ }
1758
+ }
1759
+
1760
+ #endif