netgen-mesher 6.2.2506.post35.dev0__cp314-cp314-win_amd64.whl

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (340) hide show
  1. netgen/NgOCC.py +7 -0
  2. netgen/__init__.py +114 -0
  3. netgen/__init__.pyi +22 -0
  4. netgen/__main__.py +53 -0
  5. netgen/cmake/NetgenConfig.cmake +79 -0
  6. netgen/cmake/netgen-targets-release.cmake +69 -0
  7. netgen/cmake/netgen-targets.cmake +146 -0
  8. netgen/config/__init__.py +1 -0
  9. netgen/config/__init__.pyi +52 -0
  10. netgen/config/__main__.py +4 -0
  11. netgen/config/config.py +68 -0
  12. netgen/config/config.pyi +54 -0
  13. netgen/csg.py +25 -0
  14. netgen/geom2d.py +178 -0
  15. netgen/gui.py +82 -0
  16. netgen/include/core/archive.hpp +1256 -0
  17. netgen/include/core/array.hpp +1760 -0
  18. netgen/include/core/autodiff.hpp +1131 -0
  19. netgen/include/core/autodiffdiff.hpp +733 -0
  20. netgen/include/core/bitarray.hpp +240 -0
  21. netgen/include/core/concurrentqueue.h +3619 -0
  22. netgen/include/core/exception.hpp +145 -0
  23. netgen/include/core/flags.hpp +199 -0
  24. netgen/include/core/hashtable.hpp +1281 -0
  25. netgen/include/core/localheap.hpp +318 -0
  26. netgen/include/core/logging.hpp +117 -0
  27. netgen/include/core/memtracer.hpp +221 -0
  28. netgen/include/core/mpi4py_pycapi.h +245 -0
  29. netgen/include/core/mpi_wrapper.hpp +643 -0
  30. netgen/include/core/ng_mpi.hpp +94 -0
  31. netgen/include/core/ng_mpi_generated_declarations.hpp +155 -0
  32. netgen/include/core/ng_mpi_native.hpp +25 -0
  33. netgen/include/core/ngcore.hpp +32 -0
  34. netgen/include/core/ngcore_api.hpp +152 -0
  35. netgen/include/core/ngstream.hpp +115 -0
  36. netgen/include/core/paje_trace.hpp +279 -0
  37. netgen/include/core/profiler.hpp +382 -0
  38. netgen/include/core/python_ngcore.hpp +457 -0
  39. netgen/include/core/ranges.hpp +109 -0
  40. netgen/include/core/register_archive.hpp +100 -0
  41. netgen/include/core/signal.hpp +82 -0
  42. netgen/include/core/simd.hpp +160 -0
  43. netgen/include/core/simd_arm64.hpp +407 -0
  44. netgen/include/core/simd_avx.hpp +394 -0
  45. netgen/include/core/simd_avx512.hpp +285 -0
  46. netgen/include/core/simd_generic.hpp +1053 -0
  47. netgen/include/core/simd_math.hpp +178 -0
  48. netgen/include/core/simd_sse.hpp +289 -0
  49. netgen/include/core/statushandler.hpp +37 -0
  50. netgen/include/core/symboltable.hpp +153 -0
  51. netgen/include/core/table.hpp +810 -0
  52. netgen/include/core/taskmanager.hpp +1161 -0
  53. netgen/include/core/type_traits.hpp +65 -0
  54. netgen/include/core/utils.hpp +385 -0
  55. netgen/include/core/version.hpp +102 -0
  56. netgen/include/core/xbool.hpp +47 -0
  57. netgen/include/csg/algprim.hpp +563 -0
  58. netgen/include/csg/brick.hpp +150 -0
  59. netgen/include/csg/csg.hpp +43 -0
  60. netgen/include/csg/csgeom.hpp +389 -0
  61. netgen/include/csg/csgparser.hpp +101 -0
  62. netgen/include/csg/curve2d.hpp +67 -0
  63. netgen/include/csg/edgeflw.hpp +112 -0
  64. netgen/include/csg/explicitcurve2d.hpp +113 -0
  65. netgen/include/csg/extrusion.hpp +185 -0
  66. netgen/include/csg/gencyl.hpp +70 -0
  67. netgen/include/csg/geoml.hpp +16 -0
  68. netgen/include/csg/identify.hpp +213 -0
  69. netgen/include/csg/manifold.hpp +29 -0
  70. netgen/include/csg/meshsurf.hpp +46 -0
  71. netgen/include/csg/polyhedra.hpp +121 -0
  72. netgen/include/csg/revolution.hpp +180 -0
  73. netgen/include/csg/singularref.hpp +84 -0
  74. netgen/include/csg/solid.hpp +295 -0
  75. netgen/include/csg/specpoin.hpp +194 -0
  76. netgen/include/csg/spline3d.hpp +99 -0
  77. netgen/include/csg/splinesurface.hpp +85 -0
  78. netgen/include/csg/surface.hpp +394 -0
  79. netgen/include/csg/triapprox.hpp +63 -0
  80. netgen/include/csg/vscsg.hpp +34 -0
  81. netgen/include/general/autodiff.hpp +356 -0
  82. netgen/include/general/autoptr.hpp +39 -0
  83. netgen/include/general/gzstream.h +121 -0
  84. netgen/include/general/hashtabl.hpp +1692 -0
  85. netgen/include/general/myadt.hpp +48 -0
  86. netgen/include/general/mystring.hpp +226 -0
  87. netgen/include/general/netgenout.hpp +205 -0
  88. netgen/include/general/ngarray.hpp +797 -0
  89. netgen/include/general/ngbitarray.hpp +149 -0
  90. netgen/include/general/ngpython.hpp +74 -0
  91. netgen/include/general/optmem.hpp +44 -0
  92. netgen/include/general/parthreads.hpp +138 -0
  93. netgen/include/general/seti.hpp +50 -0
  94. netgen/include/general/sort.hpp +47 -0
  95. netgen/include/general/spbita2d.hpp +59 -0
  96. netgen/include/general/stack.hpp +114 -0
  97. netgen/include/general/table.hpp +280 -0
  98. netgen/include/general/template.hpp +509 -0
  99. netgen/include/geom2d/csg2d.hpp +750 -0
  100. netgen/include/geom2d/geometry2d.hpp +280 -0
  101. netgen/include/geom2d/spline2d.hpp +234 -0
  102. netgen/include/geom2d/vsgeom2d.hpp +28 -0
  103. netgen/include/gprim/adtree.hpp +1392 -0
  104. netgen/include/gprim/geom2d.hpp +858 -0
  105. netgen/include/gprim/geom3d.hpp +749 -0
  106. netgen/include/gprim/geomfuncs.hpp +212 -0
  107. netgen/include/gprim/geomobjects.hpp +544 -0
  108. netgen/include/gprim/geomops.hpp +404 -0
  109. netgen/include/gprim/geomtest3d.hpp +101 -0
  110. netgen/include/gprim/gprim.hpp +33 -0
  111. netgen/include/gprim/spline.hpp +778 -0
  112. netgen/include/gprim/splinegeometry.hpp +73 -0
  113. netgen/include/gprim/transform3d.hpp +216 -0
  114. netgen/include/include/acisgeom.hpp +3 -0
  115. netgen/include/include/csg.hpp +1 -0
  116. netgen/include/include/geometry2d.hpp +1 -0
  117. netgen/include/include/gprim.hpp +1 -0
  118. netgen/include/include/incopengl.hpp +62 -0
  119. netgen/include/include/inctcl.hpp +13 -0
  120. netgen/include/include/incvis.hpp +6 -0
  121. netgen/include/include/linalg.hpp +1 -0
  122. netgen/include/include/meshing.hpp +1 -0
  123. netgen/include/include/myadt.hpp +1 -0
  124. netgen/include/include/mydefs.hpp +70 -0
  125. netgen/include/include/mystdlib.h +59 -0
  126. netgen/include/include/netgen_config.hpp +27 -0
  127. netgen/include/include/netgen_version.hpp +9 -0
  128. netgen/include/include/nginterface_v2_impl.hpp +395 -0
  129. netgen/include/include/ngsimd.hpp +1 -0
  130. netgen/include/include/occgeom.hpp +1 -0
  131. netgen/include/include/opti.hpp +1 -0
  132. netgen/include/include/parallel.hpp +1 -0
  133. netgen/include/include/stlgeom.hpp +1 -0
  134. netgen/include/include/visual.hpp +1 -0
  135. netgen/include/interface/rw_medit.hpp +11 -0
  136. netgen/include/interface/writeuser.hpp +80 -0
  137. netgen/include/linalg/densemat.hpp +414 -0
  138. netgen/include/linalg/linalg.hpp +29 -0
  139. netgen/include/linalg/opti.hpp +142 -0
  140. netgen/include/linalg/polynomial.hpp +47 -0
  141. netgen/include/linalg/vector.hpp +217 -0
  142. netgen/include/meshing/adfront2.hpp +274 -0
  143. netgen/include/meshing/adfront3.hpp +332 -0
  144. netgen/include/meshing/basegeom.hpp +370 -0
  145. netgen/include/meshing/bcfunctions.hpp +53 -0
  146. netgen/include/meshing/bisect.hpp +72 -0
  147. netgen/include/meshing/boundarylayer.hpp +113 -0
  148. netgen/include/meshing/classifyhpel.hpp +1984 -0
  149. netgen/include/meshing/clusters.hpp +46 -0
  150. netgen/include/meshing/curvedelems.hpp +274 -0
  151. netgen/include/meshing/delaunay2d.hpp +73 -0
  152. netgen/include/meshing/fieldlines.hpp +103 -0
  153. netgen/include/meshing/findip.hpp +198 -0
  154. netgen/include/meshing/findip2.hpp +103 -0
  155. netgen/include/meshing/geomsearch.hpp +69 -0
  156. netgen/include/meshing/global.hpp +54 -0
  157. netgen/include/meshing/hpref_hex.hpp +330 -0
  158. netgen/include/meshing/hpref_prism.hpp +3405 -0
  159. netgen/include/meshing/hpref_pyramid.hpp +154 -0
  160. netgen/include/meshing/hpref_quad.hpp +2082 -0
  161. netgen/include/meshing/hpref_segm.hpp +122 -0
  162. netgen/include/meshing/hpref_tet.hpp +4230 -0
  163. netgen/include/meshing/hpref_trig.hpp +848 -0
  164. netgen/include/meshing/hprefinement.hpp +366 -0
  165. netgen/include/meshing/improve2.hpp +178 -0
  166. netgen/include/meshing/improve3.hpp +151 -0
  167. netgen/include/meshing/localh.hpp +223 -0
  168. netgen/include/meshing/meshclass.hpp +1076 -0
  169. netgen/include/meshing/meshfunc.hpp +47 -0
  170. netgen/include/meshing/meshing.hpp +63 -0
  171. netgen/include/meshing/meshing2.hpp +163 -0
  172. netgen/include/meshing/meshing3.hpp +123 -0
  173. netgen/include/meshing/meshtool.hpp +90 -0
  174. netgen/include/meshing/meshtype.hpp +1930 -0
  175. netgen/include/meshing/msghandler.hpp +62 -0
  176. netgen/include/meshing/paralleltop.hpp +172 -0
  177. netgen/include/meshing/python_mesh.hpp +206 -0
  178. netgen/include/meshing/ruler2.hpp +172 -0
  179. netgen/include/meshing/ruler3.hpp +211 -0
  180. netgen/include/meshing/soldata.hpp +141 -0
  181. netgen/include/meshing/specials.hpp +17 -0
  182. netgen/include/meshing/surfacegeom.hpp +73 -0
  183. netgen/include/meshing/topology.hpp +1003 -0
  184. netgen/include/meshing/validate.hpp +21 -0
  185. netgen/include/meshing/visual_interface.hpp +71 -0
  186. netgen/include/mydefs.hpp +70 -0
  187. netgen/include/nginterface.h +474 -0
  188. netgen/include/nginterface_v2.hpp +406 -0
  189. netgen/include/nglib.h +697 -0
  190. netgen/include/nglib_occ.h +50 -0
  191. netgen/include/occ/occ_edge.hpp +47 -0
  192. netgen/include/occ/occ_face.hpp +52 -0
  193. netgen/include/occ/occ_solid.hpp +23 -0
  194. netgen/include/occ/occ_utils.hpp +376 -0
  195. netgen/include/occ/occ_vertex.hpp +30 -0
  196. netgen/include/occ/occgeom.hpp +659 -0
  197. netgen/include/occ/occmeshsurf.hpp +168 -0
  198. netgen/include/occ/vsocc.hpp +33 -0
  199. netgen/include/pybind11/LICENSE +29 -0
  200. netgen/include/pybind11/attr.h +722 -0
  201. netgen/include/pybind11/buffer_info.h +208 -0
  202. netgen/include/pybind11/cast.h +2361 -0
  203. netgen/include/pybind11/chrono.h +228 -0
  204. netgen/include/pybind11/common.h +2 -0
  205. netgen/include/pybind11/complex.h +74 -0
  206. netgen/include/pybind11/conduit/README.txt +15 -0
  207. netgen/include/pybind11/conduit/pybind11_conduit_v1.h +116 -0
  208. netgen/include/pybind11/conduit/pybind11_platform_abi_id.h +87 -0
  209. netgen/include/pybind11/conduit/wrap_include_python_h.h +72 -0
  210. netgen/include/pybind11/critical_section.h +56 -0
  211. netgen/include/pybind11/detail/class.h +823 -0
  212. netgen/include/pybind11/detail/common.h +1348 -0
  213. netgen/include/pybind11/detail/cpp_conduit.h +75 -0
  214. netgen/include/pybind11/detail/descr.h +226 -0
  215. netgen/include/pybind11/detail/dynamic_raw_ptr_cast_if_possible.h +39 -0
  216. netgen/include/pybind11/detail/exception_translation.h +71 -0
  217. netgen/include/pybind11/detail/function_record_pyobject.h +191 -0
  218. netgen/include/pybind11/detail/init.h +538 -0
  219. netgen/include/pybind11/detail/internals.h +799 -0
  220. netgen/include/pybind11/detail/native_enum_data.h +209 -0
  221. netgen/include/pybind11/detail/pybind11_namespace_macros.h +82 -0
  222. netgen/include/pybind11/detail/struct_smart_holder.h +378 -0
  223. netgen/include/pybind11/detail/type_caster_base.h +1591 -0
  224. netgen/include/pybind11/detail/typeid.h +65 -0
  225. netgen/include/pybind11/detail/using_smart_holder.h +22 -0
  226. netgen/include/pybind11/detail/value_and_holder.h +90 -0
  227. netgen/include/pybind11/eigen/common.h +9 -0
  228. netgen/include/pybind11/eigen/matrix.h +723 -0
  229. netgen/include/pybind11/eigen/tensor.h +521 -0
  230. netgen/include/pybind11/eigen.h +12 -0
  231. netgen/include/pybind11/embed.h +320 -0
  232. netgen/include/pybind11/eval.h +161 -0
  233. netgen/include/pybind11/functional.h +147 -0
  234. netgen/include/pybind11/gil.h +199 -0
  235. netgen/include/pybind11/gil_safe_call_once.h +102 -0
  236. netgen/include/pybind11/gil_simple.h +37 -0
  237. netgen/include/pybind11/iostream.h +265 -0
  238. netgen/include/pybind11/native_enum.h +67 -0
  239. netgen/include/pybind11/numpy.h +2312 -0
  240. netgen/include/pybind11/operators.h +202 -0
  241. netgen/include/pybind11/options.h +92 -0
  242. netgen/include/pybind11/pybind11.h +3645 -0
  243. netgen/include/pybind11/pytypes.h +2680 -0
  244. netgen/include/pybind11/stl/filesystem.h +114 -0
  245. netgen/include/pybind11/stl.h +666 -0
  246. netgen/include/pybind11/stl_bind.h +858 -0
  247. netgen/include/pybind11/subinterpreter.h +299 -0
  248. netgen/include/pybind11/trampoline_self_life_support.h +65 -0
  249. netgen/include/pybind11/type_caster_pyobject_ptr.h +61 -0
  250. netgen/include/pybind11/typing.h +298 -0
  251. netgen/include/pybind11/warnings.h +75 -0
  252. netgen/include/stlgeom/meshstlsurface.hpp +67 -0
  253. netgen/include/stlgeom/stlgeom.hpp +491 -0
  254. netgen/include/stlgeom/stlline.hpp +193 -0
  255. netgen/include/stlgeom/stltool.hpp +331 -0
  256. netgen/include/stlgeom/stltopology.hpp +419 -0
  257. netgen/include/stlgeom/vsstl.hpp +58 -0
  258. netgen/include/visualization/meshdoc.hpp +42 -0
  259. netgen/include/visualization/mvdraw.hpp +325 -0
  260. netgen/include/visualization/vispar.hpp +128 -0
  261. netgen/include/visualization/visual.hpp +28 -0
  262. netgen/include/visualization/visual_api.hpp +10 -0
  263. netgen/include/visualization/vssolution.hpp +399 -0
  264. netgen/lib/libnggui.lib +0 -0
  265. netgen/lib/ngcore.lib +0 -0
  266. netgen/lib/nglib.lib +0 -0
  267. netgen/lib/togl.lib +0 -0
  268. netgen/libnggui.dll +0 -0
  269. netgen/libngguipy.lib +0 -0
  270. netgen/libngguipy.pyd +0 -0
  271. netgen/libngpy/_NgOCC.pyi +1545 -0
  272. netgen/libngpy/__init__.pyi +7 -0
  273. netgen/libngpy/_csg.pyi +259 -0
  274. netgen/libngpy/_geom2d.pyi +323 -0
  275. netgen/libngpy/_meshing.pyi +1111 -0
  276. netgen/libngpy/_stl.pyi +131 -0
  277. netgen/libngpy.lib +0 -0
  278. netgen/libngpy.pyd +0 -0
  279. netgen/meshing.py +65 -0
  280. netgen/ngcore.dll +0 -0
  281. netgen/nglib.dll +0 -0
  282. netgen/occ.py +52 -0
  283. netgen/read_gmsh.py +259 -0
  284. netgen/read_meshio.py +22 -0
  285. netgen/stl.py +2 -0
  286. netgen/togl.dll +0 -0
  287. netgen/version.py +2 -0
  288. netgen/webgui.py +529 -0
  289. netgen_mesher-6.2.2506.post35.dev0.data/data/share/netgen/boundarycondition.geo +16 -0
  290. netgen_mesher-6.2.2506.post35.dev0.data/data/share/netgen/boxcyl.geo +32 -0
  291. netgen_mesher-6.2.2506.post35.dev0.data/data/share/netgen/circle_on_cube.geo +27 -0
  292. netgen_mesher-6.2.2506.post35.dev0.data/data/share/netgen/cone.geo +13 -0
  293. netgen_mesher-6.2.2506.post35.dev0.data/data/share/netgen/cube.geo +16 -0
  294. netgen_mesher-6.2.2506.post35.dev0.data/data/share/netgen/cubeandring.geo +55 -0
  295. netgen_mesher-6.2.2506.post35.dev0.data/data/share/netgen/cubeandspheres.geo +21 -0
  296. netgen_mesher-6.2.2506.post35.dev0.data/data/share/netgen/cubemcyl.geo +18 -0
  297. netgen_mesher-6.2.2506.post35.dev0.data/data/share/netgen/cubemsphere.geo +19 -0
  298. netgen_mesher-6.2.2506.post35.dev0.data/data/share/netgen/cylinder.geo +12 -0
  299. netgen_mesher-6.2.2506.post35.dev0.data/data/share/netgen/cylsphere.geo +12 -0
  300. netgen_mesher-6.2.2506.post35.dev0.data/data/share/netgen/doc/ng4.pdf +0 -0
  301. netgen_mesher-6.2.2506.post35.dev0.data/data/share/netgen/ellipsoid.geo +8 -0
  302. netgen_mesher-6.2.2506.post35.dev0.data/data/share/netgen/ellipticcyl.geo +10 -0
  303. netgen_mesher-6.2.2506.post35.dev0.data/data/share/netgen/extrusion.geo +99 -0
  304. netgen_mesher-6.2.2506.post35.dev0.data/data/share/netgen/fichera.geo +24 -0
  305. netgen_mesher-6.2.2506.post35.dev0.data/data/share/netgen/frame.step +11683 -0
  306. netgen_mesher-6.2.2506.post35.dev0.data/data/share/netgen/hinge.stl +8486 -0
  307. netgen_mesher-6.2.2506.post35.dev0.data/data/share/netgen/lshape3d.geo +26 -0
  308. netgen_mesher-6.2.2506.post35.dev0.data/data/share/netgen/manyholes.geo +26 -0
  309. netgen_mesher-6.2.2506.post35.dev0.data/data/share/netgen/manyholes2.geo +26 -0
  310. netgen_mesher-6.2.2506.post35.dev0.data/data/share/netgen/matrix.geo +27 -0
  311. netgen_mesher-6.2.2506.post35.dev0.data/data/share/netgen/ortho.geo +11 -0
  312. netgen_mesher-6.2.2506.post35.dev0.data/data/share/netgen/part1.stl +2662 -0
  313. netgen_mesher-6.2.2506.post35.dev0.data/data/share/netgen/period.geo +33 -0
  314. netgen_mesher-6.2.2506.post35.dev0.data/data/share/netgen/py_tutorials/exportNeutral.py +26 -0
  315. netgen_mesher-6.2.2506.post35.dev0.data/data/share/netgen/py_tutorials/mesh.py +19 -0
  316. netgen_mesher-6.2.2506.post35.dev0.data/data/share/netgen/py_tutorials/shaft.geo +65 -0
  317. netgen_mesher-6.2.2506.post35.dev0.data/data/share/netgen/revolution.geo +18 -0
  318. netgen_mesher-6.2.2506.post35.dev0.data/data/share/netgen/screw.step +1694 -0
  319. netgen_mesher-6.2.2506.post35.dev0.data/data/share/netgen/sculpture.geo +13 -0
  320. netgen_mesher-6.2.2506.post35.dev0.data/data/share/netgen/shaft.geo +65 -0
  321. netgen_mesher-6.2.2506.post35.dev0.data/data/share/netgen/shell.geo +10 -0
  322. netgen_mesher-6.2.2506.post35.dev0.data/data/share/netgen/sphere.geo +8 -0
  323. netgen_mesher-6.2.2506.post35.dev0.data/data/share/netgen/sphereincube.geo +17 -0
  324. netgen_mesher-6.2.2506.post35.dev0.data/data/share/netgen/square.in2d +35 -0
  325. netgen_mesher-6.2.2506.post35.dev0.data/data/share/netgen/squarecircle.in2d +48 -0
  326. netgen_mesher-6.2.2506.post35.dev0.data/data/share/netgen/squarehole.in2d +47 -0
  327. netgen_mesher-6.2.2506.post35.dev0.data/data/share/netgen/torus.geo +8 -0
  328. netgen_mesher-6.2.2506.post35.dev0.data/data/share/netgen/trafo.geo +57 -0
  329. netgen_mesher-6.2.2506.post35.dev0.data/data/share/netgen/twobricks.geo +15 -0
  330. netgen_mesher-6.2.2506.post35.dev0.data/data/share/netgen/twocubes.geo +18 -0
  331. netgen_mesher-6.2.2506.post35.dev0.data/data/share/netgen/twocyl.geo +16 -0
  332. netgen_mesher-6.2.2506.post35.dev0.dist-info/METADATA +15 -0
  333. netgen_mesher-6.2.2506.post35.dev0.dist-info/RECORD +340 -0
  334. netgen_mesher-6.2.2506.post35.dev0.dist-info/WHEEL +5 -0
  335. netgen_mesher-6.2.2506.post35.dev0.dist-info/entry_points.txt +2 -0
  336. netgen_mesher-6.2.2506.post35.dev0.dist-info/licenses/AUTHORS +1 -0
  337. netgen_mesher-6.2.2506.post35.dev0.dist-info/licenses/LICENSE +504 -0
  338. netgen_mesher-6.2.2506.post35.dev0.dist-info/top_level.txt +2 -0
  339. pyngcore/__init__.py +1 -0
  340. pyngcore/pyngcore.cp314-win_amd64.pyd +0 -0
@@ -0,0 +1,1984 @@
1
+ // typename INDEX_2_HASHTABLE<int> HT_EDGEPOINT_DOM;
2
+ typedef ClosedHashTable<tuple<int, PointIndex>, int> HT_EDGEPOINT_DOM;
3
+
4
+
5
+ HPREF_ELEMENT_TYPE ClassifyTet(HPRefElement & el, INDEX_2_HASHTABLE<int> & edges, HT_EDGEPOINT_DOM & edgepoint_dom,
6
+ TBitArray<PointIndex> & cornerpoint, TBitArray<PointIndex> & edgepoint, INDEX_3_HASHTABLE<int> & faces, INDEX_2_HASHTABLE<int> & face_edges,
7
+ INDEX_2_HASHTABLE<int> & surf_edges, Array<int, PointIndex> & facepoint)
8
+ {
9
+ int ep1(0), ep2(0), ep3(0), ep4(0), cp1(0), cp2(0), cp3(0), cp4(0), fp1, fp2, fp3, fp4;
10
+ int isedge1(0), isedge2(0), isedge3(0), isedge4(0), isedge5(0), isedge6(0);
11
+ int isfedge1, isfedge2, isfedge3, isfedge4, isfedge5, isfedge6;
12
+ bool isface[4];
13
+
14
+ HPREF_ELEMENT_TYPE type = HP_NONE;
15
+
16
+ int debug = 0;
17
+ /*
18
+ for (int j = 0;j < 4; j++)
19
+ {
20
+ if (el.pnums[j] == 444) debug++;
21
+ if (el.pnums[j] == 115) debug++;
22
+ if (el.pnums[j] == 382) debug++;
23
+ if (el.pnums[j] == 281) debug++;
24
+ }
25
+ if (debug < 4) debug = 0;
26
+ */
27
+
28
+ // *testout << "new el" << endl;
29
+
30
+ for (int j = 0; j < 4; j++)
31
+ for (int k = 0; k < 4; k++)
32
+ {
33
+ if (j == k) continue;
34
+ if (type) break;
35
+
36
+ int pi3 = 0;
37
+ while (pi3 == j || pi3 == k) pi3++;
38
+ int pi4 = 6 - j - k - pi3;
39
+
40
+ // preserve orientation
41
+ int sort[4];
42
+ sort[0] = j; sort[1] = k; sort[2] = pi3; sort[3] = pi4;
43
+ int cnt = 0;
44
+ for (int jj = 0; jj < 4; jj++)
45
+ for (int kk = 0; kk < 3; kk++)
46
+ if (sort[kk] > sort[kk+1])
47
+ {
48
+ cnt++;
49
+ Swap (sort[kk], sort[kk+1]);
50
+ }
51
+ if (cnt % 2 == 1) Swap (pi3, pi4);
52
+
53
+ ep1 = edgepoint.Test (el.pnums[j]);
54
+ ep2 = edgepoint.Test (el.pnums[k]);
55
+ ep3 = edgepoint.Test (el.pnums[pi3]);
56
+ ep4 = edgepoint.Test (el.pnums[pi4]);
57
+
58
+ cp1 = cornerpoint.Test (el.pnums[j]);
59
+ cp2 = cornerpoint.Test (el.pnums[k]);
60
+ cp3 = cornerpoint.Test (el.pnums[pi3]);
61
+ cp4 = cornerpoint.Test (el.pnums[pi4]);
62
+
63
+ isedge1 = edges.Used (PointIndices<2>::Sort (el.pnums[j], el.pnums[k]));
64
+ isedge2 = edges.Used (PointIndices<2>::Sort (el.pnums[j], el.pnums[pi3]));
65
+ isedge3 = edges.Used (PointIndices<2>::Sort (el.pnums[j], el.pnums[pi4]));
66
+ isedge4 = edges.Used (PointIndices<2>::Sort (el.pnums[k], el.pnums[pi3]));
67
+ isedge5 = edges.Used (PointIndices<2>::Sort (el.pnums[k], el.pnums[pi4]));
68
+ isedge6 = edges.Used (PointIndices<2>::Sort (el.pnums[pi3], el.pnums[pi4]));
69
+
70
+ if (debug)
71
+ {
72
+ cout << "debug" << endl;
73
+ *testout << "debug" << endl;
74
+ *testout << "ep = " << ep1 << ep2 << ep3 << ep4 << endl;
75
+ *testout << "cp = " << cp1 << cp2 << cp3 << cp4 << endl;
76
+ *testout << "edge = " << isedge1 << isedge2 << isedge3 << isedge4 << isedge5 << isedge6 << endl;
77
+ }
78
+
79
+
80
+ for (int j = 0; j < 4; j++) isface[j] = false;
81
+ for (int l = 0; l < 4; l++)
82
+ {
83
+ PointIndices<3> i3(PointIndex::INVALID, PointIndex::INVALID, PointIndex::INVALID);
84
+ switch (l)
85
+ {
86
+ case 0: i3[0] = el.pnums[k]; i3[1] = el.pnums[pi3]; i3[2] = el.pnums[pi4]; break;
87
+ case 1: i3[0] = el.pnums[j]; i3[1] = el.pnums[pi3]; i3[2] = el.pnums[pi4]; break;
88
+ case 2: i3[0] = el.pnums[j]; i3[1] = el.pnums[k]; i3[2] = el.pnums[pi4]; break;
89
+ case 3: i3[0] = el.pnums[j]; i3[1] = el.pnums[k]; i3[2] = el.pnums[pi3]; break;
90
+ }
91
+ i3.Sort();
92
+ if (faces.Used (i3))
93
+ {
94
+ int domnr = faces.Get(i3);
95
+ if (domnr == -1 || domnr == el.GetIndex())
96
+ isface[l] = true;
97
+ }
98
+ }
99
+ /*
100
+ isface1 = faces.Used (INDEX_3::Sort (el.pnums[k], el.pnums[pi3], el.pnums[pi4]));
101
+ isface2 = faces.Used (INDEX_3::Sort (el.pnums[j], el.pnums[pi3], el.pnums[pi4]));
102
+ isface3 = faces.Used (INDEX_3::Sort (el.pnums[j], el.pnums[k], el.pnums[pi4]));
103
+ isface4 = faces.Used (INDEX_3::Sort (el.pnums[j], el.pnums[k], el.pnums[pi3]));
104
+ */
105
+
106
+ isfedge1 = isfedge2 = isfedge3 = isfedge4 = isfedge5 = isfedge6 = 0;
107
+ for (int l = 0; l < 6; l++)
108
+ {
109
+ PointIndices<2> i2(PointIndex::INVALID, PointIndex::INVALID);
110
+ switch (l)
111
+ {
112
+ case 0: i2[0] = el.pnums[j]; i2[1] = el[k]; break;
113
+ case 1: i2[0] = el.pnums[j]; i2[1] = el.pnums[pi3]; break;
114
+ case 2: i2[0] = el.pnums[j]; i2[1] = el.pnums[pi4]; break;
115
+ case 3: i2[0] = el.pnums[k]; i2[1] = el.pnums[pi3]; break;
116
+ case 4: i2[0] = el.pnums[k]; i2[1] = el.pnums[pi4]; break;
117
+ case 5: i2[0] = el.pnums[pi3]; i2[1] = el.pnums[pi4]; break;
118
+ }
119
+ i2.Sort();
120
+ if (face_edges.Used (i2))
121
+ {
122
+ int domnr = face_edges.Get(i2);
123
+ if (domnr == -1 || domnr == el.GetIndex())
124
+ {
125
+ switch (l)
126
+ {
127
+ case 0: isfedge1 = 1; break;
128
+ case 1: isfedge2 = 1; break;
129
+ case 2: isfedge3 = 1; break;
130
+ case 3: isfedge4 = 1; break;
131
+ case 4: isfedge5 = 1; break;
132
+ case 5: isfedge6 = 1; break;
133
+ }
134
+ }
135
+ }
136
+ }
137
+ /*
138
+ isfedge1 = face_edges.Used (INDEX_2::Sort (el.pnums[j], el.pnums[k]));
139
+ isfedge2 = face_edges.Used (INDEX_2::Sort (el.pnums[j], el.pnums[pi3]));
140
+ isfedge3 = face_edges.Used (INDEX_2::Sort (el.pnums[j], el.pnums[pi4]));
141
+ isfedge4 = face_edges.Used (INDEX_2::Sort (el.pnums[k], el.pnums[pi3]));
142
+ isfedge5 = face_edges.Used (INDEX_2::Sort (el.pnums[k], el.pnums[pi4]));
143
+ isfedge6 = face_edges.Used (INDEX_2::Sort (el.pnums[pi3], el.pnums[pi4]));
144
+ */
145
+
146
+ fp1 = fp2 = fp3 = fp4 = 0;
147
+ for (int l = 0; l < 4; l++)
148
+ {
149
+ PointIndex pti = PointIndex::INVALID;
150
+ switch (l)
151
+ {
152
+ case 0: pti = el.pnums[j]; break;
153
+ case 1: pti = el.pnums[k]; break;
154
+ case 2: pti = el.pnums[pi3]; break;
155
+ case 3: pti = el.pnums[pi4]; break;
156
+ }
157
+ int domnr = facepoint[pti];
158
+ if (domnr == -1 || domnr == el.GetIndex())
159
+ {
160
+ switch (l)
161
+ {
162
+ case 0: fp1 = 1; break;
163
+ case 1: fp2 = 1; break;
164
+ case 2: fp3 = 1; break;
165
+ case 3: fp4 = 1; break;
166
+ }
167
+ }
168
+ }
169
+
170
+ /*
171
+ ep1 |= cp1;
172
+ ep2 |= cp2;
173
+ ep3 |= cp3;
174
+ ep4 |= cp4;
175
+
176
+ fp1 |= ep1;
177
+ fp2 |= ep2;
178
+ fp3 |= ep3;
179
+ fp4 |= ep4;
180
+ */
181
+
182
+ /*
183
+ fp1 = facepoint[el.pnums[j]] != 0;
184
+ fp2 = facepoint[el.pnums[k]] != 0;
185
+ fp3 = facepoint[el.pnums[pi3]] != 0;
186
+ fp4 = facepoint[el.pnums[pi4]] != 0;
187
+ */
188
+
189
+ // cout << "marked faces: "
190
+ // << isface[0] << isface[1] << isface[2] << isface[3]
191
+ // << ", num = " << isface[0]+isface[1]+isface[2]+isface[3] << endl;
192
+
193
+
194
+ bool sp1 = cp1
195
+ || (ep1 && !isedge1 && !isedge2 && !isedge3)
196
+ || (fp1 && !isfedge1 && !isfedge2 && !isfedge3);
197
+
198
+ bool sp2 = cp2
199
+ || (ep2 && !isedge1 && !isedge4 && !isedge5)
200
+ || (fp2 && !isfedge1 && !isfedge4 && !isfedge5);
201
+
202
+ bool sp3 = cp3
203
+ || (ep3 && !isedge2 && !isedge4 && !isedge6)
204
+ || (fp3 && !isfedge2 && !isfedge4 && !isfedge6);
205
+
206
+ bool sp4 = cp4
207
+ || (ep4 && !isedge3 && !isedge5 && !isedge6)
208
+ || (fp4 && !isfedge3 && !isfedge5 && !isfedge6);
209
+
210
+ bool se1 = isedge1 || (isfedge1 && !isface[2] && !isface[3]);
211
+ bool se2 = isedge2 || (isfedge2 && !isface[1] && !isface[3]);
212
+ bool se3 = isedge3 || (isfedge3 && !isface[1] && !isface[2]);
213
+ bool se4 = isedge4 || (isfedge4 && !isface[0] && !isface[3]);
214
+ bool se5 = isedge5 || (isfedge5 && !isface[0] && !isface[2]);
215
+ bool se6 = isedge6 || (isfedge6 && !isface[0] && !isface[1]);
216
+
217
+ // *testout << "sp = " << sp1 << sp2 << sp3 << sp4 << endl;
218
+ // *testout << "se = " << se1 << se2 << se3 << se4 << se5 << se6 << endl;
219
+ // *testout << "sf = " << isface[0] << isface[1] << isface[2] << isface[3] << endl;
220
+
221
+
222
+ switch (isface[0]+isface[1]+isface[2]+isface[3])
223
+ {
224
+ case 0:
225
+ {
226
+ isedge1 |= isfedge1;
227
+ isedge2 |= isfedge2;
228
+ isedge3 |= isfedge3;
229
+ isedge4 |= isfedge4;
230
+ isedge5 |= isfedge5;
231
+ isedge6 |= isfedge6;
232
+
233
+ ep1 |= fp1;
234
+ ep2 |= fp2;
235
+ ep3 |= fp3;
236
+ ep4 |= fp4;
237
+
238
+ switch (isedge1+isedge2+isedge3+isedge4+isedge5+isedge6)
239
+ {
240
+ case 0:
241
+ {
242
+ if (!sp1 && !sp2 && !sp3 && !sp4)
243
+ type = HP_TET;
244
+
245
+ if (sp1 && !sp2 && !sp3 && !sp4)
246
+ type = HP_TET_0E_1V;
247
+
248
+ if (sp1 && sp2 && !sp3 && !sp4)
249
+ type = HP_TET_0E_2V;
250
+
251
+ if (sp1 && sp2 && sp3 && !sp4)
252
+ type = HP_TET_0E_3V;
253
+
254
+ if (sp1 && sp2 && sp3 && sp4)
255
+ type = HP_TET_0E_4V;
256
+
257
+ break;
258
+ }
259
+
260
+ case 1:
261
+ {
262
+ if (!isedge1) break;
263
+
264
+ if (!sp1 && !sp2 && !sp3 && !sp4)
265
+ type = HP_TET_1E_0V;
266
+
267
+ if (sp1 && !sp2 && !sp3 && !sp4)
268
+ type = HP_TET_1E_1VA;
269
+
270
+ if (!sp1 && !sp2 && !sp3 && sp4)
271
+ type = HP_TET_1E_1VB;
272
+
273
+ if (sp1 && sp2 && !sp3 && !sp4)
274
+ type = HP_TET_1E_2VA;
275
+
276
+ if (sp1 && !sp2 && sp3 && !sp4)
277
+ type = HP_TET_1E_2VB;
278
+
279
+ if (sp1 && !sp2 && !sp3 && sp4)
280
+ type = HP_TET_1E_2VC;
281
+
282
+ if (!sp1 && !sp2 && sp3 && sp4)
283
+ type = HP_TET_1E_2VD;
284
+
285
+ if (sp1 && sp2 && sp3 && !sp4)
286
+ type = HP_TET_1E_3VA;
287
+
288
+ if (sp1 && !sp2 && sp3 && sp4)
289
+ type = HP_TET_1E_3VB;
290
+
291
+ if (sp1 && sp2 && sp3 && sp4)
292
+ type = HP_TET_1E_4V;
293
+
294
+ break;
295
+ }
296
+ case 2:
297
+ {
298
+ if (isedge1 && isedge2)
299
+ {
300
+ if (!sp2 && !sp3 && !sp4)
301
+ type = HP_TET_2EA_0V;
302
+
303
+ if (sp2 && !sp3 && !sp4)
304
+ type = HP_TET_2EA_1VA;
305
+ if (!sp2 && sp3 && !sp4)
306
+ type = HP_TET_2EA_1VB;
307
+
308
+ if (!sp2 && !sp3 && sp4)
309
+ type = HP_TET_2EA_1VC;
310
+
311
+ if (sp2 && sp3 && !sp4)
312
+ type = HP_TET_2EA_2VA;
313
+ if (sp2 && !sp3 && sp4)
314
+ type = HP_TET_2EA_2VB;
315
+ if (!sp2 && sp3 && sp4)
316
+ type = HP_TET_2EA_2VC;
317
+
318
+ if (sp2 && sp3 && sp4)
319
+ type = HP_TET_2EA_3V;
320
+ }
321
+ if (isedge1 && isedge6)
322
+ {
323
+ if (!sp1 && !sp2 && !sp3 && !sp4)
324
+ type = HP_TET_2EB_0V;
325
+ if (sp1 && !sp2 && !sp3 && !sp4)
326
+ type = HP_TET_2EB_1V;
327
+ if (sp1 && sp2 && !sp3 && !sp4)
328
+ type = HP_TET_2EB_2VA;
329
+ if (sp1 && !sp2 && sp3 && !sp4)
330
+ type = HP_TET_2EB_2VB;
331
+ if (sp1 && !sp2 && !sp3 && sp4)
332
+ type = HP_TET_2EB_2VC;
333
+ if (sp1 && sp2 && sp3 && !sp4)
334
+ type = HP_TET_2EB_3V;
335
+ if (sp1 && sp2 && sp3 && sp4)
336
+ type = HP_TET_2EB_4V;
337
+ }
338
+ break;
339
+ }
340
+ case 3:
341
+ {
342
+ if (isedge1 && isedge2 && isedge3)
343
+ {
344
+ if (!sp2 && !sp3 && !sp4)
345
+ type = HP_TET_3EA_0V;
346
+ if (sp2 && !sp3 && !sp4)
347
+ type = HP_TET_3EA_1V;
348
+ if (sp2 && sp3 && !sp4)
349
+ type = HP_TET_3EA_2V;
350
+ if (sp2 && sp3 && sp4)
351
+ type = HP_TET_3EA_3V;
352
+ }
353
+ if (isedge1 && isedge3 && isedge4)
354
+ {
355
+ if (!sp3 && !sp4)
356
+ type = HP_TET_3EB_0V;
357
+ if (sp3 && !sp4)
358
+ type = HP_TET_3EB_1V;
359
+ if (sp3 && sp4)
360
+ type = HP_TET_3EB_2V;
361
+ }
362
+ if (isedge1 && isedge2 && isedge5)
363
+ {
364
+ if (!sp3 && !sp4)
365
+ type = HP_TET_3EC_0V;
366
+ if (sp3 && !sp4)
367
+ type = HP_TET_3EC_1V;
368
+ if (sp3 && sp4)
369
+ type = HP_TET_3EC_2V;
370
+ }
371
+ if (isedge1 && isedge2 && isedge4)
372
+ {
373
+ if (!sp4)
374
+ type = HP_TET_3ED_3V; // a loop
375
+ }
376
+
377
+ break;
378
+ }
379
+ }
380
+ break;
381
+ }
382
+
383
+
384
+
385
+ case 1: // one singular face
386
+ {
387
+ if (!isface[0]) break;
388
+
389
+ /*
390
+ cout << "1F and 1E, isedge = " << isedge1 << isedge2 << isedge3 << isedge4 << isedge5 << isedge6 << endl;
391
+ cout << "spoints = " << sp1 << sp2 << sp3 << sp4 << endl;
392
+ cout << "cpoints = " << cp1 << cp2 << cp3 << cp4 << endl;
393
+ cout << "epoints = " << ep1 << ep2 << ep3 << ep4 << endl;
394
+ cout << "fpoints = " << fp1 << fp2 << fp3 << fp4 << endl;
395
+ */
396
+
397
+ isedge1 |= isfedge1;
398
+ isedge2 |= isfedge2;
399
+ isedge3 |= isfedge3;
400
+
401
+ // switch (isedge1+isedge2+isedge3+isedge4+isedge5+isedge6)
402
+ switch (se1+se2+se3+se4+se5+se6)
403
+ {
404
+ case 0:
405
+ {
406
+ if (!fp1 && !ep2 && !ep3 && !ep4)
407
+ type = HP_TET_1F_0E_0V;
408
+ if (fp1 && !ep2 && !ep3 && !ep4)
409
+ type = HP_TET_1F_0E_1VB;
410
+ if (!fp1 && ep2 && !ep3 & !ep4)
411
+ type = HP_TET_1F_0E_1VA;
412
+ if (!fp1 && ep2 && ep3 & !ep4)
413
+ type = HP_TET_1F_0E_2V;
414
+
415
+ if (!sp1 && sp2 && sp3 && sp4)
416
+ type = HP_TET_1F_0E_3V;
417
+ break;
418
+ }
419
+ case 1:
420
+ {
421
+ if (se1)
422
+ {
423
+ if (!sp1 && !sp3 && !sp4)
424
+ type = HP_TET_1F_1EA_0V;
425
+ if (!sp1 && sp2 && sp3 && !sp4)
426
+ type = HP_TET_1F_1E_2VA;
427
+ if (!sp1 && sp2 && !sp3 && sp4)
428
+ type = HP_TET_1F_1E_2VB;
429
+ if (!sp1 && !sp2 && sp3 && sp4)
430
+ type = HP_TET_1F_1E_2VC;
431
+ if (!sp1 && sp2 && sp3 && sp4)
432
+ type = HP_TET_1F_1EA_3V;
433
+ }
434
+ if (se4) // V2-V3
435
+ {
436
+ if (!sp1 && !sp2 && !sp3 && !sp4)
437
+ type = HP_TET_1F_1EB_0V;
438
+ if (!sp1 && sp2 && !sp3 && !sp4)
439
+ type = HP_TET_1F_1E_1VA;
440
+ if (!sp1 && sp2 && sp3 && sp4)
441
+ type = HP_TET_1F_1E_3V;
442
+ }
443
+ if (se5) // V2-V4
444
+ {
445
+ if (!sp1 && sp2 && !sp3 && !sp4)
446
+ type = HP_TET_1F_1E_1VB;
447
+ }
448
+ break;
449
+ }
450
+ case 2:
451
+ {
452
+ if (isedge1 && isedge2)
453
+ {
454
+ if (sp1 && sp2 && sp3 && !sp4)
455
+ type = HP_TET_1F_2Eoo_3V;
456
+ }
457
+ if (isedge6 && isedge3)
458
+ if (!cp1 && !cp2 && !cp3)
459
+ type = HP_TET_1F_2E_0VA;
460
+ if (isedge6 && isedge2)
461
+ {
462
+ if (!cp1 && !cp2 && !cp4)
463
+ type = HP_TET_1F_2E_0VB;
464
+ }
465
+ if (se4 && se5)
466
+ { // 2 edges in face
467
+ if (!sp1 && sp2 && !sp3 && !sp4)
468
+ type = HP_TET_1F_2E_1V;
469
+ if (!sp1 && sp2 && sp3 && sp4)
470
+ type = HP_TET_1F_2E_3V;
471
+ }
472
+ break;
473
+ }
474
+ default:
475
+ ;
476
+ }
477
+ break;
478
+ }
479
+
480
+
481
+ case 2: // two singular faces
482
+ {
483
+ if (!isface[0] || !isface[1]) break;
484
+
485
+ switch (isfedge1+isedge2+isedge3+isedge4+isedge5)
486
+ {
487
+ case 0:
488
+ {
489
+ if (!ep1 && !ep2 && !cp3 && !cp4)
490
+ {
491
+ type = HP_TET_2F_0E_0V;
492
+ break;
493
+ }
494
+ if (!ep1 && !ep2 && !cp3 && cp4)
495
+ {
496
+ type = HP_TET_2F_0E_1V;
497
+ break;
498
+ }
499
+ break;
500
+ }
501
+ case 1:
502
+ {
503
+ // *testout << "so far: 2F, 1E, sp = " << sp1 << sp2 << sp3 << sp4 << endl;
504
+
505
+ if (isedge4)
506
+ {
507
+ if (!ep1 && !cp2 && !cp4)
508
+ {
509
+ type = HP_TET_2F_1E_0VA;
510
+ break;
511
+ }
512
+ if (!sp1 && sp2 && sp3 && sp4)
513
+ {
514
+ type = HP_TET_2F_1E_3VA;
515
+ break;
516
+ }
517
+ if (sp1 && sp2 && sp3 && sp4)
518
+ {
519
+ type = HP_TET_2F_1E_4VA;
520
+ break;
521
+ }
522
+ }
523
+
524
+ if (isedge5 && !ep1 && !cp2 && !cp3)
525
+ {
526
+ type = HP_TET_2F_1E_0VB;
527
+ break;
528
+ }
529
+ break;
530
+ }
531
+ default:
532
+ *testout << "2F, 2E or more not implemented so far" << endl;
533
+ }
534
+ break;
535
+ }
536
+
537
+ case 3:
538
+ {
539
+ if (!isface[3])
540
+ if (!cp1 && !cp2 && !cp3)
541
+ {
542
+ type = HP_TET_3F_0E_0V;
543
+ break;
544
+ }
545
+ break;
546
+ }
547
+ case 4:
548
+ {
549
+ *testout << "4 singular faces" << endl;
550
+ }
551
+ }
552
+
553
+ if (type != HP_NONE)
554
+ {
555
+ PointIndex pnums[4];
556
+ pnums[0] = el.pnums[j];
557
+ pnums[1] = el.pnums[k];
558
+ pnums[2] = el.pnums[pi3];
559
+ pnums[3] = el.pnums[pi4];
560
+ for(k=0;k<4;k++) el.pnums[k] = pnums[k];
561
+ break;
562
+ }
563
+ }
564
+
565
+
566
+ if (debug) cout << "type = " << type << endl;
567
+
568
+ if (type == HP_NONE)
569
+ {
570
+ // cnt_undef++;
571
+ (*testout) << "unclassified element "
572
+ << el.pnums[0] << " "
573
+ << el.pnums[1] << " "
574
+ << el.pnums[2] << " "
575
+ << el.pnums[3] << endl
576
+ << "cp = " << cp1 << cp2 << cp3 << cp4 << endl
577
+ << "ep = " << ep1 << ep2 << ep3 << ep4 << endl
578
+ << "fp = " << fp1 << fp2 << fp3 << fp4 << endl
579
+ << "isedge = " << isedge1 << isedge2 << isedge3
580
+ << isedge4 << isedge5 << isedge6 << endl
581
+ << "isfedge = " << isfedge1 << isfedge2 << isfedge3
582
+ << isfedge4 << isfedge5 << isfedge6 << endl
583
+ << "isface = " << isface[0] << isface[1] << isface[2] << isface[3] << endl;
584
+ cout << "unclassified element !!! " << endl;
585
+
586
+
587
+ }
588
+ return(type);
589
+ }
590
+
591
+
592
+
593
+ HPREF_ELEMENT_TYPE ClassifyPrism(HPRefElement & el, INDEX_2_HASHTABLE<int> & edges, HT_EDGEPOINT_DOM & edgepoint_dom,
594
+ TBitArray<PointIndex> & cornerpoint, TBitArray<PointIndex> & edgepoint, INDEX_3_HASHTABLE<int> & faces, INDEX_2_HASHTABLE<int> & face_edges,
595
+ INDEX_2_HASHTABLE<int> & surf_edges, Array<int, PointIndex> & facepoint)
596
+ {
597
+
598
+ HPREF_ELEMENT_TYPE type = HP_NONE;
599
+
600
+ int p[6];
601
+ for(int m=1;m<=6;m++)
602
+ {
603
+ int point_sing[6]={0,0,0,0,0,0};
604
+ int face_sing[5]={0,0,0,0,0};
605
+ int edge_sing[9]={0,0,0,0,0,0,0,0,0};
606
+
607
+ if(m<4)
608
+ {
609
+ p[0]= m; p[1]=m%3+1; p[2]=(m%3+1)%3+1;
610
+ for(int l=3;l<6;l++) p[l]=p[l-3]+3;
611
+ }
612
+ else
613
+ {
614
+ p[0] = m; p[1]=(m%3+1)%3+4; p[2]=m%3+4;
615
+ for(int l=3;l<6;l++) p[l]=p[l-3]-3;
616
+ }
617
+
618
+ for(int j=0;j<6;j++)
619
+ {
620
+ if(cornerpoint.Test(el.PNum(p[j]))) { point_sing[p[j]-1]=3;}
621
+ else if(edgepoint.Test(el.PNum(p[j]))) point_sing[p[j]-1]=2;
622
+ else if (facepoint[el.PNum(p[j])] == -1 || facepoint[el.PNum(p[j])] == el.GetIndex())
623
+ point_sing[p[j]-1] = 1;
624
+ }
625
+
626
+ const ELEMENT_EDGE * eledges = MeshTopology::GetEdges1 (PRISM);
627
+ for(int k=0;k<9;k++)
628
+ {
629
+ PointIndices<2> i2 = PointIndices<2> :: Sort(el.PNum(p[eledges[k][0]-1]),el.PNum(p[eledges[k][1]-1]));
630
+ if (edges.Used(i2)) edge_sing[k] = 2;
631
+ else edge_sing[k] = face_edges.Used(i2);
632
+ }
633
+
634
+ const ELEMENT_FACE * elfaces = MeshTopology::GetFaces1 (PRISM);
635
+ for (int k=0;k<5;k++)
636
+ {
637
+ PointIndices<3> i3;
638
+
639
+ if(k<2)
640
+ i3 = PointIndices<3>::Sort(el.pnums[p[elfaces[k][0]-1]-1], el.pnums[p[elfaces[k][1]-1]-1],
641
+ el.pnums[p[elfaces[k][2]-1]-1]);
642
+ else
643
+ {
644
+ PointIndices<4> i4 (el.pnums[p[elfaces[k][0]-1]-1], el.pnums[p[elfaces[k][1]-1]-1],
645
+ el.pnums[p[elfaces[k][2]-1]-1],el.pnums[p[elfaces[k][3]-1]-1]);
646
+ i4.Sort();
647
+ i3 = PointIndices<3>(i4[0], i4[1], i4[2]);
648
+ }
649
+
650
+ if (faces.Used (i3))
651
+ {
652
+ int domnr = faces.Get(i3);
653
+ if (domnr == -1 || domnr == el.GetIndex())
654
+ face_sing[k] = 1;
655
+
656
+ }
657
+ }
658
+ if (face_sing[1] > face_sing[0]) {m=m+2; continue;}
659
+
660
+
661
+ //int cp = 0;
662
+
663
+ int qfsing = face_sing[2] + face_sing[3] + face_sing[4];
664
+ int tfsing = face_sing[0] + face_sing[1];
665
+ int evsing = edge_sing[6] + edge_sing[7] + edge_sing[8];
666
+ int ehsing = edge_sing[0] + edge_sing[1] + edge_sing[2] + edge_sing[3] + edge_sing[4] + edge_sing[5];
667
+
668
+ if (qfsing + tfsing + evsing + ehsing == 0)
669
+ { type = HP_PRISM; break;}
670
+
671
+ HPREF_ELEMENT_TYPE types[] = {HP_NONE,HP_NONE,HP_NONE};
672
+
673
+ int fb = (1-face_sing[4])* face_sing[3] * (face_sing[2] + face_sing[3]) + 3*face_sing[4]*face_sing[3]*face_sing[2];
674
+ int sve[3] = {edge_sing[7] , edge_sing[8], edge_sing[6]};
675
+
676
+
677
+ if(fb!=qfsing) continue;
678
+
679
+
680
+ switch(fb)
681
+ {
682
+ case 0:
683
+ if (evsing == 0 && ehsing==3*tfsing)
684
+ {
685
+ types[0] = HP_PRISM;
686
+ types[1] = HP_PRISM_1FA_0E_0V;
687
+ types[2] = HP_PRISM_2FA_0E_0V;
688
+ }
689
+ if(evsing > 0 && sve[0] == evsing) // 1 vertical edge 1-4
690
+ {
691
+ types[0] = HP_PRISM_SINGEDGE;
692
+ types[1] = HP_PRISM_1FA_1E_0V;
693
+ types[2] = HP_PRISM_2FA_1E_0V;
694
+ }
695
+
696
+ if(sve[0] > 0 && sve[1] > 0 && sve[2] == 0)
697
+ {
698
+ types[0] = HP_PRISM_SINGEDGE_V12;
699
+ types[1] = HP_PRISM_1FA_2E_0V;
700
+ types[2] = HP_PRISM_2FA_2E_0V;
701
+ }
702
+ if(sve[0] > 0 && sve[1] > 0 && sve[2] > 0)
703
+ {
704
+ types[0] = HP_PRISM_3E_0V;
705
+ types[1] = HP_PRISM_1FA_3E_0V;
706
+ types[2] = HP_PRISM_2FA_3E_0V;
707
+
708
+ if ( edge_sing[0] > 1 && edge_sing[2] > 1 &&
709
+ edge_sing[4] > 1 && edge_sing[5] > 1 && tfsing==0)
710
+ types[0] = HP_PRISM_3E_4EH;
711
+ }
712
+
713
+ break;
714
+ case 1:
715
+ if(sve[0] <= 1 && sve[1] <= 1)
716
+ {
717
+ if(sve[2]==0)
718
+ {
719
+ types[0] = HP_PRISM_1FB_0E_0V;
720
+ types[1] = HP_PRISM_1FA_1FB_0E_0V;
721
+ types[2] = HP_PRISM_2FA_1FB_0E_0V;
722
+ }
723
+ else
724
+ {
725
+ types[0] = HP_PRISM_1FB_1EC_0V;
726
+ types[1] = HP_PRISM_1FA_1FB_1EC_0V;
727
+ types[2] = HP_PRISM_2FA_1FB_1EC_0V;
728
+ }
729
+ }
730
+
731
+ if(sve[0] > 1 && sve[2] >= 1 && sve[1] <= 1)
732
+ {
733
+ types[0] = HP_PRISM_1FB_2EB_0V;
734
+ types[1] = HP_PRISM_1FA_1FB_2EB_0V;
735
+ types[2] = HP_PRISM_2FA_1FB_2EB_0V;
736
+ }
737
+
738
+ if(sve[0] > 1 && sve[1] <= 1 && sve[2] == 0) // ea && !eb
739
+ {
740
+ types[0] = HP_PRISM_1FB_1EA_0V;
741
+ types[1] = HP_PRISM_1FA_1FB_1EA_0V;
742
+ types[2] = HP_PRISM_2FA_1FB_1EA_0V;
743
+ }
744
+
745
+ if(sve[0] <= 1 && sve[1] > 1 && sve[2] == 0)
746
+ types[1] = HP_PRISM_1FA_1FB_1EB_0V;
747
+
748
+ if(sve[0] > 1 && sve[1]>1)
749
+ if(sve[2] == 0) // ea && eb
750
+ {
751
+ types[0] = HP_PRISM_1FB_2EA_0V;
752
+ types[1] = HP_PRISM_1FA_1FB_2EA_0V;
753
+ types[2] = HP_PRISM_2FA_1FB_2EA_0V;
754
+ }
755
+ if(sve[0] <= 1 && sve[1] > 1 && sve[2] >0)
756
+ types[1] = HP_PRISM_1FA_1FB_2EC_0V;
757
+
758
+ if(sve[0] > 1 && sve[1] > 1 && sve[2] >= 1) //sve[2] can also be a face-edge
759
+ {
760
+ types[0] = HP_PRISM_1FB_3E_0V;
761
+ types[1] = HP_PRISM_1FA_1FB_3E_0V;
762
+ types[2] = HP_PRISM_2FA_1FB_3E_0V;
763
+ }
764
+
765
+ break;
766
+
767
+ case 2:
768
+ if(sve[0] <= 1)
769
+ cout << " **** WARNING: Edge between to different singular faces should be marked singular " << endl;
770
+
771
+ if(sve[1] <= 1)
772
+ if(sve[2] <=1)
773
+ {
774
+ types[0] = HP_PRISM_2FB_0E_0V;
775
+ types[1] = HP_PRISM_1FA_2FB_0E_0V;
776
+ types[2] = HP_PRISM_2FA_2FB_0E_0V;
777
+ }
778
+ else
779
+ {
780
+ types[0] = HP_PRISM_2FB_1EC_0V;
781
+ types[1] = HP_PRISM_1FA_2FB_1EC_0V;
782
+ types[2] = HP_PRISM_2FA_2FB_1EC_0V;
783
+ }
784
+ else
785
+ if(sve[2] <= 1)
786
+ types[1] = HP_PRISM_1FA_2FB_1EB_0V;
787
+ else
788
+ {
789
+ types[0] = HP_PRISM_2FB_3E_0V;
790
+ types[1] = HP_PRISM_1FA_2FB_3E_0V;
791
+ types[2] = HP_PRISM_2FA_2FB_3E_0V;
792
+ }
793
+
794
+ break;
795
+
796
+ case 3:
797
+ types[0] = HP_PRISM_3FB_0V;
798
+ types[1] = HP_PRISM_1FA_3FB_0V;
799
+ types[2] = HP_PRISM_2FA_3FB_0V;
800
+ break;
801
+ }
802
+ type = types[tfsing];
803
+
804
+
805
+ if(type != HP_NONE)
806
+ break;
807
+ }
808
+
809
+ /*
810
+ *testout << " Prism with pnums " << endl;
811
+ for(int j=0;j<6;j++) *testout << el.pnums[j] << "\t";
812
+ *testout << endl;
813
+ */
814
+
815
+ if(type != HP_NONE)
816
+ {
817
+ PointIndex pnums[6];
818
+ for(int j=0;j<6;j++) pnums[j] = el.PNum (p[j]);
819
+ for(int k=0;k<6;k++) el.pnums[k] = pnums[k];
820
+ }
821
+
822
+ /* *testout << " Classified Prism with pnums " << endl;
823
+ for(int j=0;j<6;j++) *testout << el.pnums[j] << "\t";
824
+ *testout << endl;
825
+ */
826
+ return(type);
827
+ }
828
+
829
+
830
+ // #ifdef SABINE
831
+
832
+
833
+ HPREF_ELEMENT_TYPE ClassifyTrig(HPRefElement & el, INDEX_2_HASHTABLE<int> & edges, HT_EDGEPOINT_DOM & edgepoint_dom,
834
+ TBitArray<PointIndex> & cornerpoint, TBitArray<PointIndex> & edgepoint, INDEX_3_HASHTABLE<int> & faces, INDEX_2_HASHTABLE<int> & face_edges,
835
+ INDEX_2_HASHTABLE<int> & surf_edges, Array<int, PointIndex> & facepoint, int dim, const FaceDescriptor & fd)
836
+
837
+ {
838
+ HPREF_ELEMENT_TYPE type = HP_NONE;
839
+
840
+ PointIndex pnums[3];
841
+ int p[3];
842
+
843
+ PointIndices<3> i3 (el.pnums[0], el.pnums[1], el.pnums[2]);
844
+ i3.Sort();
845
+ bool sing_face = faces.Used (i3);
846
+
847
+ // *testout << " facepoint " << facepoint << endl;
848
+
849
+
850
+ // Try all rotations of the trig
851
+ for (int j=0;j<3;j++)
852
+ {
853
+ int point_sing[3] = {0,0,0};
854
+ int edge_sing[3] = {0,0,0};
855
+ // *testout << " actual rotation of trig points " ;
856
+ for(int m=0;m<3;m++)
857
+ {
858
+ p[m] = (j+m)%3 +1; // local vertex number
859
+ pnums[m] = el.PNum(p[m]); // global vertex number
860
+ // *testout << pnums[m] << " \t ";
861
+ }
862
+ // *testout << endl ;
863
+
864
+ if(dim == 3)
865
+ {
866
+ // face point
867
+ for(int k=0;k<3;k++)
868
+ if(!sing_face)
869
+ {
870
+ // *testout << " fp [" << k << "] = " << facepoint[pnums[k]] << endl;
871
+ // *testout << " fd.DomainIn()" << fd.DomainIn() << endl;
872
+ // *testout << " fd.DomainOut()" << fd.DomainOut() << endl;
873
+ if( facepoint[pnums[k]] && (facepoint[pnums[k]] ==-1 ||
874
+ facepoint[pnums[k]] == fd.DomainIn() || facepoint[pnums[k]] == fd.DomainOut()))
875
+ point_sing[p[k]-1] = 1;
876
+ }
877
+ // if point is on face_edge in next step sing = 2
878
+
879
+ /* *testout << " pointsing NACH FACEPOints ... FALLS EDGEPOINT UMSETZEN" ;
880
+ for (int k=0;k<3;k++) *testout << "\t" << point_sing[p[k]-1] ;
881
+ *testout << endl; */
882
+ }
883
+
884
+ const ELEMENT_EDGE * eledges = MeshTopology::GetEdges1(TRIG);
885
+
886
+ if(dim==3)
887
+ {
888
+ for(int k=0;k<3;k++)
889
+ {
890
+ int ep1=p[eledges[k][0]-1];
891
+ int ep2=p[eledges[k][1]-1];
892
+ PointIndices<2> i2(el.PNum(ep1),el.PNum(ep2));
893
+
894
+ if(edges.Used(i2))
895
+ {
896
+
897
+ edge_sing[k]=2;
898
+ point_sing[ep1-1] = 2;
899
+ point_sing[ep2-1] = 2;
900
+ }
901
+ else // face_edge?
902
+ {
903
+ i2.Sort();
904
+ if(surf_edges.Used(i2) && surf_edges.Get(i2) != fd.SurfNr()+1) // edge not face_edge acc. to surface in which trig lies
905
+ {
906
+ if(face_edges.Get(i2)==-1 ||face_edges.Get(i2) == fd.DomainIn() || face_edges.Get(i2) == fd.DomainOut() )
907
+ {
908
+ edge_sing[k]=1;
909
+ }
910
+ else
911
+ {
912
+ point_sing[ep1-1] = 0; // set to edge_point
913
+ point_sing[ep2-1] = 0; // set to edge_point
914
+ }
915
+ }
916
+ }
917
+
918
+ /* *testout << " pointsing NACH edges UND FACEEDGES UMSETZEN ... " ;
919
+ for (int k=0;k<3;k++) *testout << "\t" << point_sing[p[k]-1] ;
920
+ *testout << endl;
921
+ */
922
+ }
923
+ }
924
+ /*
925
+ *testout << " dim " << dim << endl;
926
+ *testout << " edgepoint_dom " << edgepoint_dom << endl;
927
+ */
928
+ if(dim==2)
929
+ {
930
+ for(int k=0;k<3;k++)
931
+ {
932
+ int ep1=p[eledges[k][0]-1];
933
+ int ep2=p[eledges[k][1]-1];
934
+
935
+ PointIndices<2> i2 = PointIndices<2>::Sort(el.PNum(ep1),el.PNum(ep2));
936
+
937
+ if(edges.Used(i2))
938
+ {
939
+ if(edgepoint_dom.Used( { fd.SurfNr(),pnums[ep1-1] } ) ||
940
+ edgepoint_dom.Used( { -1,pnums[ep1-1] } ) ||
941
+ edgepoint_dom.Used( { fd.SurfNr(), pnums[ep2-1]} ) ||
942
+ edgepoint_dom.Used( { -1,pnums[ep2-1] } ))
943
+ {
944
+ edge_sing[k]=2;
945
+ point_sing[ep1-1] = 2;
946
+ point_sing[ep2-1] = 2;
947
+ }
948
+ }
949
+
950
+ }
951
+ }
952
+
953
+
954
+
955
+ for (int k=0;k<3;k++)
956
+ if (edgepoint.Test(pnums[k]) &&
957
+ (dim==3 || edgepoint_dom.Used( { fd.SurfNr(),pnums[k] } ) || edgepoint_dom.Used( { -1,pnums[k] } )))
958
+ //edgepoint, but not member of sing_edge on trig -> cp
959
+ {
960
+ PointIndices<2> i2a = PointIndices<2>::Sort(el.PNum(p[k]), el.PNum(p[(k+1)%3]));
961
+ PointIndices<2> i2b = PointIndices<2>::Sort(el.PNum(p[k]), el.PNum(p[(k+2)%3]));
962
+
963
+ if(!edges.Used(i2a) && !edges.Used(i2b))
964
+ point_sing[p[k]-1] = 3;
965
+ }
966
+
967
+ for(int k=0;k<3;k++)
968
+ if(cornerpoint.Test(el.PNum(p[k])))
969
+ point_sing[p[k]-1] = 3;
970
+
971
+ // *testout << "point_sing = " << point_sing[0] << point_sing[1] << point_sing[2] << endl;
972
+
973
+ if(edge_sing[0] + edge_sing[1] + edge_sing[2] == 0)
974
+ {
975
+ int ps = point_sing[0] + point_sing[1] + point_sing[2];
976
+
977
+ if(ps==0)
978
+ type = HP_TRIG;
979
+ else if(point_sing[p[0]-1] && !point_sing[p[1]-1] && !point_sing[p[2]-1])
980
+ type = HP_TRIG_SINGCORNER;
981
+ else if(point_sing[p[0]-1] && point_sing[p[1]-1] && !point_sing[p[2]-1])
982
+ type = HP_TRIG_SINGCORNER12;
983
+ else if(point_sing[p[0]-1] && point_sing[p[1]-1] && point_sing[p[2]-1])
984
+ {
985
+ if(dim==2) type = HP_TRIG_SINGCORNER123_2D;
986
+ else type = HP_TRIG_SINGCORNER123;
987
+ }
988
+ }
989
+ else
990
+ if (edge_sing[2] && !edge_sing[0] && !edge_sing[1]) //E[2]=(1,2)
991
+ {
992
+ int code = 0;
993
+ if(point_sing[p[0]-1] > edge_sing[2]) code+=1;
994
+ if(point_sing[p[1]-1] > edge_sing[2]) code+=2;
995
+ if(point_sing[p[2]-1]) code+=4;
996
+
997
+ HPREF_ELEMENT_TYPE types[] =
998
+ {
999
+ HP_TRIG_SINGEDGE,
1000
+ HP_TRIG_SINGEDGECORNER1,
1001
+ HP_TRIG_SINGEDGECORNER2,
1002
+ HP_TRIG_SINGEDGECORNER12,
1003
+ HP_TRIG_SINGEDGECORNER3,
1004
+ HP_TRIG_SINGEDGECORNER13,
1005
+ HP_TRIG_SINGEDGECORNER23,
1006
+ HP_TRIG_SINGEDGECORNER123,
1007
+ };
1008
+ type = types[code];
1009
+
1010
+ } // E[0] = [0,2], E[1] =[1,2], E[2] = [0,1]
1011
+ else
1012
+ if(edge_sing[2] && !edge_sing[1] && edge_sing[0])
1013
+ {
1014
+ if(point_sing[p[2]-1] <= edge_sing[0] )
1015
+ {
1016
+ if(point_sing[p[1]-1]<= edge_sing[2]) type = HP_TRIG_SINGEDGES;
1017
+ else type = HP_TRIG_SINGEDGES2;
1018
+ }
1019
+ else
1020
+ {
1021
+ if(point_sing[p[1]-1]<= edge_sing[2])
1022
+ type = HP_TRIG_SINGEDGES3;
1023
+ else type = HP_TRIG_SINGEDGES23;
1024
+ }
1025
+ }
1026
+ else if (edge_sing[2] && edge_sing[1] && edge_sing[0])
1027
+ type = HP_TRIG_3SINGEDGES;
1028
+
1029
+ // cout << " run for " << j << " gives type " << type << endl;
1030
+ //*testout << " run for " << j << " gives type " << type << endl;
1031
+
1032
+ if(type!=HP_NONE) break;
1033
+ }
1034
+
1035
+ // *testout << "type = " << type << endl;
1036
+
1037
+ for(int k=0;k<3;k++) el[k] = pnums[k];
1038
+ /*if(type != HP_NONE)
1039
+ {
1040
+
1041
+ cout << " TRIG with pnums " << pnums[0] << "\t" <<
1042
+ pnums[1] << "\t" << pnums[2] << endl;
1043
+ cout << " type " << type << endl;
1044
+ }
1045
+ */
1046
+ return(type);
1047
+ }
1048
+ #ifdef HPREF_OLD
1049
+ HPREF_ELEMENT_TYPE ClassifyTrig(HPRefElement & el, INDEX_2_HASHTABLE<int> & edges, INDEX_2_HASHTABLE<int> & edgepoint_dom,
1050
+ NgBitArray & cornerpoint, NgBitArray & edgepoint, INDEX_3_HASHTABLE<int> & faces, INDEX_2_HASHTABLE<int> & face_edges,
1051
+ INDEX_2_HASHTABLE<int> & surf_edges, NgArray<int, PointIndex::BASE> & facepoint, int dim, const FaceDescriptor & fd)
1052
+ {
1053
+ HPREF_ELEMENT_TYPE type = HP_NONE;
1054
+
1055
+ int pnums[3];
1056
+
1057
+ INDEX_3 i3 (el.pnums[0], el.pnums[1], el.pnums[2]);
1058
+ i3.Sort();
1059
+ bool sing_face = faces.Used (i3);
1060
+
1061
+
1062
+ for (int j = 1; j <= 3; j++)
1063
+ {
1064
+ int ep1 = edgepoint.Test (el.PNumMod (j));
1065
+ int ep2 = edgepoint.Test (el.PNumMod (j+1));
1066
+ int ep3 = edgepoint.Test (el.PNumMod (j+2));
1067
+
1068
+ if (dim == 2)
1069
+ {
1070
+ // JS, Dec 11
1071
+ ep1 = edgepoint_dom.Used (INDEX_2 (fd.SurfNr(), el.PNumMod(j))) ||
1072
+ edgepoint_dom.Used (INDEX_2 (-1, el.PNumMod(j)));
1073
+ ep2 = edgepoint_dom.Used (INDEX_2 (fd.SurfNr(), el.PNumMod(j+1))) ||
1074
+ edgepoint_dom.Used (INDEX_2 (-1, el.PNumMod(j+1)));
1075
+ ep3 = edgepoint_dom.Used (INDEX_2 (fd.SurfNr(), el.PNumMod(j+2))) ||
1076
+ edgepoint_dom.Used (INDEX_2 (-1, el.PNumMod(j+2)));
1077
+ /*
1078
+ ep1 = edgepoint_dom.Used (INDEX_2 (el.index, el.PNumMod(j)));
1079
+ ep2 = edgepoint_dom.Used (INDEX_2 (el.index, el.PNumMod(j+1)));
1080
+ ep3 = edgepoint_dom.Used (INDEX_2 (el.index, el.PNumMod(j+2)));
1081
+ */
1082
+ // ep3 = edgepoint_dom.Used (INDEX_2 (mesh.SurfaceElement(i).GetIndex(), el.PNumMod(j+2)));
1083
+ }
1084
+
1085
+
1086
+
1087
+ int cp1 = cornerpoint.Test (el.PNumMod (j));
1088
+ int cp2 = cornerpoint.Test (el.PNumMod (j+1));
1089
+ int cp3 = cornerpoint.Test (el.PNumMod (j+2));
1090
+
1091
+ ep1 |= cp1;
1092
+ ep2 |= cp2;
1093
+ ep3 |= cp3;
1094
+
1095
+
1096
+ // (*testout) << "cp = " << cp1 << cp2 << cp3 << ", ep = " << ep1 << ep2 << ep3 << endl;
1097
+
1098
+ int p[3] = { el.PNumMod (j), el.PNumMod (j+1), el.PNumMod (j+2)};
1099
+ if(ep1)
1100
+ {
1101
+ INDEX_2 i2a=INDEX_2::Sort(p[0], p[1]);
1102
+ INDEX_2 i2b=INDEX_2::Sort(p[0], p[2]);
1103
+ if(!edges.Used(i2a) && !edges.Used(i2b))
1104
+ cp1 = 1;
1105
+ }
1106
+ if(ep2)
1107
+ {
1108
+ INDEX_2 i2a=INDEX_2::Sort(p[1], p[0]);
1109
+ INDEX_2 i2b=INDEX_2::Sort(p[1], p[2]);
1110
+ if(!edges.Used(i2a) && !edges.Used(i2b))
1111
+ cp2 = 1;
1112
+ }
1113
+ if(ep3)
1114
+ {
1115
+ INDEX_2 i2a=INDEX_2::Sort(p[2], p[0]);
1116
+ INDEX_2 i2b=INDEX_2::Sort(p[2], p[1]);
1117
+ if(!edges.Used(i2a) && !edges.Used(i2b))
1118
+ cp3= 1;
1119
+ }
1120
+
1121
+
1122
+ int isedge1=0, isedge2=0, isedge3=0;
1123
+ if(dim == 3 )
1124
+ {
1125
+ INDEX_2 i2;
1126
+ i2 = INDEX_2(el.PNumMod (j), el.PNumMod (j+1));
1127
+ isedge1 = edges.Used (i2);
1128
+ i2.Sort();
1129
+ if(surf_edges.Used(i2) && surf_edges.Get(i2) != fd.SurfNr()+1 &&
1130
+ (face_edges.Get(i2) == -1 || face_edges.Get(i2) == fd.DomainIn() || face_edges.Get(i2) == fd.DomainOut()) )
1131
+ {
1132
+ isedge1=1;
1133
+ ep1 = 1; ep2=1;
1134
+ }
1135
+
1136
+ i2 = INDEX_2(el.PNumMod (j+1), el.PNumMod (j+2));
1137
+ isedge2 = edges.Used (i2);
1138
+ i2.Sort();
1139
+ if(surf_edges.Used(i2) && surf_edges.Get(i2) != fd.SurfNr()+1 &&
1140
+ (face_edges.Get(i2) == -1 || face_edges.Get(i2) == fd.DomainIn() || face_edges.Get(i2) == fd.DomainOut()) )
1141
+ {
1142
+ isedge2=1;
1143
+ ep2 = 1; ep3=1;
1144
+ }
1145
+ i2 = INDEX_2(el.PNumMod (j+2), el.PNumMod (j+3));
1146
+ isedge3 = edges.Used (i2);
1147
+ i2.Sort();
1148
+ if(surf_edges.Used(i2) && surf_edges.Get(i2) != fd.SurfNr()+1 &&
1149
+ (face_edges.Get(i2) == -1 || face_edges.Get(i2) == fd.DomainIn() || face_edges.Get(i2) == fd.DomainOut()) )
1150
+ {
1151
+ isedge3=1;
1152
+ ep1 = 1; ep3=1;
1153
+ }
1154
+
1155
+ // cout << " isedge " << isedge1 << " \t " << isedge2 << " \t " << isedge3 << endl;
1156
+
1157
+ if (!sing_face)
1158
+ {
1159
+ /*
1160
+ if (!isedge1) { cp1 |= ep1; cp2 |= ep2; }
1161
+ if (!isedge2) { cp2 |= ep2; cp3 |= ep3; }
1162
+ if (!isedge3) { cp3 |= ep3; cp1 |= ep1; }
1163
+ */
1164
+ ep1 |= facepoint [el.PNumMod(j)] != 0;
1165
+ ep2 |= facepoint [el.PNumMod(j+1)] != 0;
1166
+ ep3 |= facepoint [el.PNumMod(j+2)] != 0;
1167
+
1168
+
1169
+ isedge1 |= face_edges.Used (INDEX_2::Sort (el.PNumMod(j), el.PNumMod(j+1)));
1170
+ isedge2 |= face_edges.Used (INDEX_2::Sort (el.PNumMod(j+1), el.PNumMod(j+2)));
1171
+ isedge3 |= face_edges.Used (INDEX_2::Sort (el.PNumMod(j+2), el.PNumMod(j+3)));
1172
+ }
1173
+ }
1174
+
1175
+ if(dim ==2)
1176
+ {
1177
+ INDEX_2 i2;
1178
+ i2 = INDEX_2(el.PNumMod (j), el.PNumMod (j+1));
1179
+ i2.Sort();
1180
+ isedge1 = edges.Used (i2);
1181
+ if(isedge1)
1182
+ {
1183
+ ep1 = 1; ep2=1;
1184
+ }
1185
+
1186
+ i2 = INDEX_2(el.PNumMod (j+1), el.PNumMod (j+2));
1187
+ i2.Sort();
1188
+ isedge2 = edges.Used (i2);
1189
+ if(isedge2)
1190
+ {
1191
+ ep2 = 1; ep3=1;
1192
+ }
1193
+ i2 = INDEX_2(el.PNumMod (j+2), el.PNumMod (j+3));
1194
+ i2.Sort();
1195
+ isedge3 = edges.Used (i2);
1196
+ if(isedge3)
1197
+ {
1198
+ ep1 = 1; ep3=1;
1199
+ }
1200
+
1201
+
1202
+ }
1203
+
1204
+
1205
+ /*
1206
+ cout << " used " << face_edges.Used (INDEX_2::Sort (el.PNumMod(j), el.PNumMod(j+1))) << endl;
1207
+
1208
+ cout << " isedge " << isedge1 << " \t " << isedge2 << " \t " << isedge3 << endl;
1209
+ cout << " ep " << ep1 << "\t" << ep2 << " \t " << ep3 << endl;
1210
+ cout << " cp " << cp1 << "\t" << cp2 << " \t " << cp3 << endl;
1211
+ */
1212
+
1213
+
1214
+
1215
+ if (isedge1 + isedge2 + isedge3 == 0)
1216
+ {
1217
+ if (!ep1 && !ep2 && !ep3)
1218
+ type = HP_TRIG;
1219
+
1220
+ if (ep1 && !ep2 && !ep3)
1221
+ type = HP_TRIG_SINGCORNER;
1222
+
1223
+ if (ep1 && ep2 && !ep3)
1224
+ type = HP_TRIG_SINGCORNER12;
1225
+
1226
+ if (ep1 && ep2 && ep3)
1227
+ {
1228
+ if (dim == 2)
1229
+ type = HP_TRIG_SINGCORNER123_2D;
1230
+ else
1231
+ type = HP_TRIG_SINGCORNER123;
1232
+ }
1233
+
1234
+ if (type != HP_NONE)
1235
+ {
1236
+ pnums[0] = el.PNumMod (j);
1237
+ pnums[1] = el.PNumMod (j+1);
1238
+ pnums[2] = el.PNumMod (j+2);
1239
+ break;
1240
+ }
1241
+ }
1242
+
1243
+ if (isedge1 && !isedge2 && !isedge3)
1244
+ {
1245
+ int code = 0;
1246
+ if (cp1) code += 1;
1247
+ if (cp2) code += 2;
1248
+ if (ep3) code += 4;
1249
+
1250
+ HPREF_ELEMENT_TYPE types[] =
1251
+ {
1252
+ HP_TRIG_SINGEDGE,
1253
+ HP_TRIG_SINGEDGECORNER1,
1254
+ HP_TRIG_SINGEDGECORNER2,
1255
+ HP_TRIG_SINGEDGECORNER12,
1256
+ HP_TRIG_SINGEDGECORNER3,
1257
+ HP_TRIG_SINGEDGECORNER13,
1258
+ HP_TRIG_SINGEDGECORNER23,
1259
+ HP_TRIG_SINGEDGECORNER123,
1260
+ };
1261
+ type = types[code];
1262
+ pnums[0] = el.PNumMod (j);
1263
+ pnums[1] = el.PNumMod (j+1);
1264
+ pnums[2] = el.PNumMod (j+2);
1265
+ break;
1266
+ }
1267
+
1268
+
1269
+ if (isedge1 && !isedge2 && isedge3)
1270
+ {
1271
+ if (!cp3)
1272
+ {
1273
+ if (!cp2) type = HP_TRIG_SINGEDGES;
1274
+ else type = HP_TRIG_SINGEDGES2;
1275
+ }
1276
+ else
1277
+ {
1278
+ if (!cp2) type = HP_TRIG_SINGEDGES3;
1279
+ else type = HP_TRIG_SINGEDGES23;
1280
+ }
1281
+
1282
+ pnums[0] = el.PNumMod (j);
1283
+ pnums[1] = el.PNumMod (j+1);
1284
+ pnums[2] = el.PNumMod (j+2);
1285
+ break;
1286
+ }
1287
+
1288
+ if (isedge1 && isedge2 && isedge3)
1289
+ {
1290
+ type = HP_TRIG_3SINGEDGES;
1291
+ pnums[0] = el.PNumMod (j);
1292
+ pnums[1] = el.PNumMod (j+1);
1293
+ pnums[2] = el.PNumMod (j+2);
1294
+ break;
1295
+ }
1296
+ }
1297
+
1298
+ for(int k=0;k<3;k++) el[k] = pnums[k];
1299
+ /*if(type != HP_NONE)
1300
+ {
1301
+
1302
+ cout << " TRIG with pnums " << pnums[0] << "\t" <<
1303
+ pnums[1] << "\t" << pnums[2] << endl;
1304
+ cout << " type " << type << endl;
1305
+ }
1306
+ */
1307
+ return(type);
1308
+ }
1309
+ #endif
1310
+ HPREF_ELEMENT_TYPE ClassifyQuad(HPRefElement & el, INDEX_2_HASHTABLE<int> & edges, HT_EDGEPOINT_DOM & edgepoint_dom,
1311
+ TBitArray<PointIndex> & cornerpoint, TBitArray<PointIndex> & edgepoint, INDEX_3_HASHTABLE<int> & faces, INDEX_2_HASHTABLE<int> & face_edges,
1312
+ INDEX_2_HASHTABLE<int> & surf_edges, Array<int, PointIndex> & facepoint, int dim, const FaceDescriptor & fd)
1313
+ {
1314
+ HPREF_ELEMENT_TYPE type = HP_NONE;
1315
+
1316
+ int ep1(-1), ep2(-1), ep3(-1), ep4(-1), cp1(-1), cp2(-1), cp3(-1), cp4(-1);
1317
+ int isedge1, isedge2, isedge3, isedge4;
1318
+
1319
+ // *testout << "edges = " << edges << endl;
1320
+
1321
+ for (int j = 1; j <= 4; j++)
1322
+ {
1323
+ ep1 = edgepoint.Test (el.PNumMod (j));
1324
+ ep2 = edgepoint.Test (el.PNumMod (j+1));
1325
+ ep3 = edgepoint.Test (el.PNumMod (j+2));
1326
+ ep4 = edgepoint.Test (el.PNumMod (j+3));
1327
+
1328
+ if (dim == 2)
1329
+ {
1330
+ ep1 = edgepoint_dom.Used ( { el.GetIndex(), el.PNumMod(j) } );
1331
+ ep2 = edgepoint_dom.Used ( { el.GetIndex(), el.PNumMod(j+1) } );
1332
+ ep3 = edgepoint_dom.Used ( { el.GetIndex(), el.PNumMod(j+2) });
1333
+ ep4 = edgepoint_dom.Used ( { el.GetIndex(), el.PNumMod(j+3) });
1334
+ }
1335
+
1336
+ cp1 = cornerpoint.Test (el.PNumMod (j));
1337
+ cp2 = cornerpoint.Test (el.PNumMod (j+1));
1338
+ cp3 = cornerpoint.Test (el.PNumMod (j+2));
1339
+ cp4 = cornerpoint.Test (el.PNumMod (j+3));
1340
+
1341
+ ep1 |= cp1;
1342
+ ep2 |= cp2;
1343
+ ep3 |= cp3;
1344
+ ep4 |= cp4;
1345
+
1346
+ PointIndex p[4] = { el.PNumMod (j), el.PNumMod (j+1), el.PNumMod (j+2), el.PNumMod(j+4)};
1347
+ //int epp[4] = { ep1, ep2, ep3, ep4};
1348
+ int cpp[4] = { cp1, cp2, cp3, cp4};
1349
+ for(int k=0;k<0;k++)
1350
+ {
1351
+ INDEX_2 i2a=INDEX_2::Sort(p[k], p[(k+1)%4]);
1352
+ INDEX_2 i2b=INDEX_2::Sort(p[k], p[(k-1)%4]);
1353
+ if(!edges.Used(i2a) && !edges.Used(i2b))
1354
+ cpp[k] = 1;
1355
+ }
1356
+ cp1= cpp[0]; cp2=cpp[1]; cp3=cpp[2]; cp4=cpp[3];
1357
+
1358
+
1359
+ if(dim ==3)
1360
+ {
1361
+ PointIndices<2> i2 = PointIndices<2>(el.PNumMod (j), el.PNumMod (j+1));
1362
+ // i2.Sort();
1363
+ isedge1 = edges.Used (i2);
1364
+ i2.Sort();
1365
+ if(surf_edges.Used(i2) && surf_edges.Get(i2) != fd.SurfNr()+1 &&
1366
+ (face_edges.Get(i2) == -1 || face_edges.Get(i2) == fd.DomainIn() || face_edges.Get(i2) == fd.DomainOut()) )
1367
+ {
1368
+ isedge1=1;
1369
+ ep1 = 1; ep2=1;
1370
+ }
1371
+ i2 = INDEX_2(el.PNumMod (j+1), el.PNumMod (j+2));
1372
+ // i2.Sort();
1373
+ isedge2 = edges.Used (i2);
1374
+ i2.Sort();
1375
+ if(surf_edges.Used(i2) && surf_edges.Get(i2) != fd.SurfNr()+1 &&
1376
+ (face_edges.Get(i2) == -1 || face_edges.Get(i2) == fd.DomainIn() || face_edges.Get(i2) == fd.DomainOut()) )
1377
+ {
1378
+ isedge2=1;
1379
+ ep2=1; ep3=1;
1380
+ }
1381
+ i2 = INDEX_2(el.PNumMod (j+2), el.PNumMod (j+3));
1382
+ // i2.Sort();
1383
+ isedge3 = edges.Used (i2);
1384
+ i2.Sort();
1385
+ if(surf_edges.Used(i2) && surf_edges.Get(i2) != fd.SurfNr()+1 && (face_edges.Get(i2) == -1 || face_edges.Get(i2) == fd.DomainIn() || face_edges.Get(i2) == fd.DomainOut()) )
1386
+ {
1387
+ isedge3=1;
1388
+ ep3=1; ep4=1;
1389
+ }
1390
+ i2 = INDEX_2(el.PNumMod (j+3), el.PNumMod (j+4));
1391
+ // i2.Sort();
1392
+ isedge4 = edges.Used (i2);
1393
+ i2.Sort();
1394
+ if(surf_edges.Used(i2) && surf_edges.Get(i2) != fd.SurfNr()+1 &&
1395
+ (face_edges.Get(i2) == -1 || face_edges.Get(i2) == fd.DomainIn() || face_edges.Get(i2) == fd.DomainOut()) )
1396
+ {
1397
+ isedge4=1;
1398
+ ep4=1; ep1=1;
1399
+ }
1400
+
1401
+
1402
+ //MH***********************************************************************************************************
1403
+ if(ep1)
1404
+ if(edgepoint.Test(p[0]))
1405
+ {
1406
+ INDEX_2 i2a=INDEX_2::Sort(p[0], p[1]);
1407
+ INDEX_2 i2b=INDEX_2::Sort(p[0], p[3]);
1408
+ if(!edges.Used(i2a) && !edges.Used(i2b))
1409
+ cp1 = 1;
1410
+ }
1411
+ if(ep2)
1412
+ if(edgepoint.Test(p[1]))
1413
+ {
1414
+ INDEX_2 i2a=INDEX_2::Sort(p[0], p[1]);
1415
+ INDEX_2 i2b=INDEX_2::Sort(p[1], p[2]);
1416
+ if(!edges.Used(i2a) && !edges.Used(i2b))
1417
+ cp2 = 1;
1418
+ }
1419
+ if(ep3)
1420
+ if(edgepoint.Test(p[2]))
1421
+ {
1422
+ INDEX_2 i2a=INDEX_2::Sort(p[2], p[1]);
1423
+ INDEX_2 i2b=INDEX_2::Sort(p[3], p[2]);
1424
+ if(!edges.Used(i2a) && !edges.Used(i2b))
1425
+ cp3 = 1;
1426
+ }
1427
+ if(ep4)
1428
+ if(edgepoint.Test(p[3]))
1429
+ {
1430
+ INDEX_2 i2a=INDEX_2::Sort(p[0], p[3]);
1431
+ INDEX_2 i2b=INDEX_2::Sort(p[3], p[2]);
1432
+ if(!edges.Used(i2a) && !edges.Used(i2b))
1433
+ cp4 = 1;
1434
+ }
1435
+ //MH*****************************************************************************************************************************
1436
+ }
1437
+ else
1438
+ {
1439
+ INDEX_2 i2;
1440
+ i2 = INDEX_2(el.PNumMod (j), el.PNumMod (j+1));
1441
+ i2.Sort();
1442
+ isedge1 = edges.Used (i2);
1443
+ if(isedge1)
1444
+ {
1445
+ ep1 = 1; ep2=1;
1446
+ }
1447
+ i2 = INDEX_2(el.PNumMod (j+1), el.PNumMod (j+2));
1448
+ i2.Sort();
1449
+ isedge2 = edges.Used (i2);
1450
+ if(isedge2)
1451
+ {
1452
+ ep2=1; ep3=1;
1453
+ }
1454
+ i2 = INDEX_2(el.PNumMod (j+2), el.PNumMod (j+3));
1455
+ i2.Sort();
1456
+ isedge3 = edges.Used (i2);
1457
+
1458
+ if(isedge3)
1459
+ {
1460
+ ep3=1; ep4=1;
1461
+ }
1462
+ i2 = INDEX_2(el.PNumMod (j+3), el.PNumMod (j+4));
1463
+ i2.Sort();
1464
+ isedge4 = edges.Used (i2);
1465
+ if(isedge4)
1466
+ {
1467
+ ep4=1; ep1=1;
1468
+ }
1469
+ }
1470
+
1471
+ int sumcp = cp1 + cp2 + cp3 + cp4;
1472
+ int sumep = ep1 + ep2 + ep3 + ep4;
1473
+ int sumedge = isedge1 + isedge2 + isedge3 + isedge4;
1474
+
1475
+ *testout << "isedge = " << isedge1 << isedge2 << isedge3 << isedge4 << endl;
1476
+ *testout << "iscp = " << cp1 << cp2 << cp3 << cp4 << endl;
1477
+ *testout << "isep = " << ep1 << ep2 << ep3 << ep4 << endl;
1478
+
1479
+ switch (sumedge)
1480
+ {
1481
+ case 0:
1482
+ {
1483
+ switch (sumep)
1484
+ {
1485
+ case 0:
1486
+ type = HP_QUAD;
1487
+ break;
1488
+ case 1:
1489
+ if (ep1) type = HP_QUAD_SINGCORNER;
1490
+ break;
1491
+ case 2:
1492
+ {
1493
+ if (ep1 && ep2) type = HP_QUAD_0E_2VA;
1494
+ if (ep1 && ep3) type = HP_QUAD_0E_2VB;
1495
+ break;
1496
+ }
1497
+ case 3:
1498
+ if (!ep4) type = HP_QUAD_0E_3V;
1499
+ break;
1500
+ case 4:
1501
+ type = HP_QUAD_0E_4V;
1502
+ break;
1503
+ }
1504
+ break;
1505
+ }
1506
+ case 1:
1507
+ {
1508
+ if (isedge1)
1509
+ {
1510
+ switch (cp1+cp2+ep3+ep4)
1511
+ {
1512
+ case 0:
1513
+ type = HP_QUAD_SINGEDGE;
1514
+ break;
1515
+ case 1:
1516
+ {
1517
+ if (cp1) type = HP_QUAD_1E_1VA;
1518
+ if (cp2) type = HP_QUAD_1E_1VB;
1519
+ if (ep3) type = HP_QUAD_1E_1VC;
1520
+ if (ep4) type = HP_QUAD_1E_1VD;
1521
+ break;
1522
+ }
1523
+ case 2:
1524
+ {
1525
+ if (cp1 && cp2) type = HP_QUAD_1E_2VA;
1526
+ if (cp1 && ep3) type = HP_QUAD_1E_2VB;
1527
+ if (cp1 && ep4) type = HP_QUAD_1E_2VC;
1528
+ if (cp2 && ep3) type = HP_QUAD_1E_2VD;
1529
+ if (cp2 && ep4) type = HP_QUAD_1E_2VE;
1530
+ if (ep3 && ep4) type = HP_QUAD_1E_2VF;
1531
+ break;
1532
+ }
1533
+ case 3:
1534
+ {
1535
+ if (cp1 && cp2 && ep3) type = HP_QUAD_1E_3VA;
1536
+ if (cp1 && cp2 && ep4) type = HP_QUAD_1E_3VB;
1537
+ if (cp1 && ep3 && ep4) type = HP_QUAD_1E_3VC;
1538
+ if (cp2 && ep3 && ep4) type = HP_QUAD_1E_3VD;
1539
+ break;
1540
+ }
1541
+ case 4:
1542
+ {
1543
+ type = HP_QUAD_1E_4V;
1544
+ break;
1545
+ }
1546
+ }
1547
+ }
1548
+ break;
1549
+ }
1550
+ case 2:
1551
+ {
1552
+ if (isedge1 && isedge4)
1553
+ {
1554
+ if (!cp2 && !ep3 && !cp4)
1555
+ type = HP_QUAD_2E;
1556
+
1557
+ if (cp2 && !ep3 && !cp4)
1558
+ type = HP_QUAD_2E_1VA;
1559
+ if (!cp2 && ep3 && !cp4)
1560
+ type = HP_QUAD_2E_1VB;
1561
+ if (!cp2 && !ep3 && cp4)
1562
+ type = HP_QUAD_2E_1VC;
1563
+
1564
+ if (cp2 && ep3 && !cp4)
1565
+ type = HP_QUAD_2E_2VA;
1566
+ if (cp2 && !ep3 && cp4)
1567
+ type = HP_QUAD_2E_2VB;
1568
+ if (!cp2 && ep3 && cp4)
1569
+ type = HP_QUAD_2E_2VC;
1570
+
1571
+ if (cp2 && ep3 && cp4)
1572
+ type = HP_QUAD_2E_3V;
1573
+ }
1574
+ if (isedge1 && isedge3)
1575
+ {
1576
+ switch (sumcp)
1577
+ {
1578
+ case 0:
1579
+ type = HP_QUAD_2EB_0V; break;
1580
+ case 1:
1581
+ {
1582
+ if (cp1) type = HP_QUAD_2EB_1VA;
1583
+ if (cp2) type = HP_QUAD_2EB_1VB;
1584
+ break;
1585
+ }
1586
+ case 2:
1587
+ {
1588
+ if (cp1 && cp2) { type = HP_QUAD_2EB_2VA; }
1589
+ if (cp1 && cp3) { type = HP_QUAD_2EB_2VB; }
1590
+ if (cp1 && cp4) { type = HP_QUAD_2EB_2VC; }
1591
+ if (cp2 && cp4) { type = HP_QUAD_2EB_2VD; }
1592
+ break;
1593
+ }
1594
+ case 3:
1595
+ {
1596
+ if (cp1 && cp2 && cp3) { type = HP_QUAD_2EB_3VA; }
1597
+ if (cp1 && cp2 && cp4) { type = HP_QUAD_2EB_3VB; }
1598
+ break;
1599
+ }
1600
+ case 4:
1601
+ {
1602
+ type = HP_QUAD_2EB_4V; break;
1603
+ }
1604
+ }
1605
+ }
1606
+ break;
1607
+ }
1608
+
1609
+ case 3:
1610
+ {
1611
+ if (isedge1 && isedge2 && isedge4)
1612
+ {
1613
+ if (!cp3 && !cp4) type = HP_QUAD_3E;
1614
+ if (cp3 && !cp4) type = HP_QUAD_3E_3VA;
1615
+ if (!cp3 && cp4) type = HP_QUAD_3E_3VB;
1616
+ if (cp3 && cp4) type = HP_QUAD_3E_4V;
1617
+ }
1618
+ break;
1619
+ }
1620
+
1621
+ case 4:
1622
+ {
1623
+ type = HP_QUAD_4E;
1624
+ break;
1625
+ }
1626
+ }
1627
+
1628
+ if (type != HP_NONE)
1629
+ {
1630
+ int pnums[4];
1631
+ pnums[0] = el.PNumMod (j);
1632
+ pnums[1] = el.PNumMod (j+1);
1633
+ pnums[2] = el.PNumMod (j+2);
1634
+ pnums[3] = el.PNumMod (j+3);
1635
+ for (int k=0;k<4;k++) el[k] = pnums[k];
1636
+
1637
+ /* cout << " QUAD with pnums " << pnums[0] << "\t" <<
1638
+ pnums[1] << "\t" << pnums[2] << "\t" << pnums[3]
1639
+ << endl << " of type " << type << endl; */
1640
+
1641
+ break;
1642
+ }
1643
+ }
1644
+ if (type == HP_NONE)
1645
+ {
1646
+ (*testout) << "undefined element" << endl
1647
+ << "cp = " << cp1 << cp2 << cp3 << cp4 << endl
1648
+ << "ep = " << ep1 << ep2 << ep3 << ep4 << endl
1649
+ << "isedge = " << isedge1 << isedge2 << isedge3
1650
+ << isedge4 << endl;
1651
+ }
1652
+
1653
+ *testout << "quad type = " << type << endl;
1654
+
1655
+ return type;
1656
+ }
1657
+
1658
+
1659
+ HPREF_ELEMENT_TYPE ClassifyHex(HPRefElement & el, INDEX_2_HASHTABLE<int> & edges, HT_EDGEPOINT_DOM & edgepoint_dom,
1660
+ TBitArray<PointIndex> & cornerpoint, TBitArray<PointIndex> & edgepoint, INDEX_3_HASHTABLE<int> & faces, INDEX_2_HASHTABLE<int> & face_edges,
1661
+ INDEX_2_HASHTABLE<int> & surf_edges, Array<int, PointIndex> & facepoint)
1662
+ {
1663
+ HPREF_ELEMENT_TYPE type = HP_NONE;
1664
+
1665
+ // implementation only for HP_HEX_1F_0E_0V
1666
+ // HP_HEX_1FA_1FB_0E_0V
1667
+ // HP_HEX
1668
+ // up to now other cases are refine dummies
1669
+
1670
+ // indices of bot,top-faces combinations
1671
+ int index[6][2] = {{0,1},{1,0},{2,4},{4,2},{3,5},{5,3}};
1672
+ int p[8];
1673
+ const ELEMENT_FACE * elfaces = MeshTopology::GetFaces1 (HEX);
1674
+ const ELEMENT_EDGE * eledges = MeshTopology::GetEdges1 (HEX);
1675
+
1676
+ for(int m=0;m<6 && type == HP_NONE;m++)
1677
+ for(int j=0;j<4 && type == HP_NONE;j++)
1678
+ {
1679
+ int point_sing[8]={0,0,0,0,0,0,0,0};
1680
+ int face_sing[6] = {0,0,0,0,0,0};
1681
+ int edge_sing[12] = {0,0,0,0,0,0,0,0,0,0,0,0};
1682
+ int spoint=0, sface=0, sedge=0;
1683
+ for(int l=0;l<4;l++)
1684
+ {
1685
+ p[l] = elfaces[index[m][0]][(4-j-l)%4];
1686
+ p[l+4] = elfaces[index[m][1]][(j+l)%4];
1687
+ }
1688
+
1689
+ for(int l=0;l<8;l++)
1690
+ if(cornerpoint.Test(el.PNum(p[l])))
1691
+ {
1692
+ point_sing[p[l]-1]=3;
1693
+ spoint++;
1694
+ }
1695
+ else if(edgepoint.Test(el.PNum(p[l]))) point_sing[p[l]-1]=2;
1696
+ else if (facepoint[el.PNum(p[l])] == -1 || facepoint[el.PNum(p[l])] == el.GetIndex())
1697
+ point_sing[p[l]-1] = 1;
1698
+
1699
+ for(int k=0;k<12;k++)
1700
+ {
1701
+ INDEX_2 i2 = INDEX_2 :: Sort(el.PNum(p[eledges[k][0]-1]),el.PNum(p[eledges[k][1]-1]));
1702
+ if (edges.Used(i2))
1703
+ {
1704
+ edge_sing[k] = 2;
1705
+ sedge++;
1706
+ }
1707
+ else edge_sing[k] = face_edges.Used(i2);
1708
+ }
1709
+
1710
+ for (int k=0;k<6;k++)
1711
+ {
1712
+ INDEX_3 i3;
1713
+
1714
+
1715
+ INDEX_4 i4 = INDEX_4(el.pnums[p[elfaces[k][0]-1]-1], el.pnums[p[elfaces[k][1]-1]-1], el.pnums[p[elfaces[k][2]-1]-1],el.pnums[p[elfaces[k][3]-1]-1]);
1716
+ i4.Sort();
1717
+ i3 = INDEX_3(i4.I1(), i4.I2(), i4.I3());
1718
+
1719
+ if (faces.Used (i3))
1720
+ {
1721
+
1722
+ int domnr = faces.Get(i3);
1723
+ if (domnr == -1 || domnr == el.GetIndex())
1724
+ {
1725
+ face_sing[k] = 1;
1726
+ sface++;
1727
+ }
1728
+
1729
+ }
1730
+ }
1731
+
1732
+ if(!sface && !sedge && !spoint) type = HP_HEX;
1733
+ if(!sedge && !spoint)
1734
+ {
1735
+ if(face_sing[0] && face_sing[2] && sface==2)
1736
+ type = HP_HEX_1FA_1FB_0E_0V;
1737
+ if (face_sing[0] && sface==1)
1738
+ type = HP_HEX_1F_0E_0V;
1739
+ }
1740
+
1741
+ el.type=type;
1742
+
1743
+ if(type != HP_NONE)
1744
+ {
1745
+ int pnums[8];
1746
+ for(int l=0;l<8;l++) pnums[l] = el[p[l]-1];
1747
+ for(int l=0;l<8;l++) el[l] = pnums[l];
1748
+ /* cout << " HEX with pnums " << pnums[0] << "\t" <<
1749
+ pnums[1] << "\t" << pnums[2] << "\t" << pnums[3] << "\t" <<
1750
+ pnums[4] << "\t" << pnums[5] << endl << " of type " << type << endl; */
1751
+ break;
1752
+ }
1753
+ }
1754
+
1755
+ return (type);
1756
+
1757
+ }
1758
+
1759
+
1760
+
1761
+
1762
+
1763
+
1764
+ HPREF_ELEMENT_TYPE ClassifyHex7 (HPRefElement & el, INDEX_2_HASHTABLE<int> & edges, HT_EDGEPOINT_DOM & edgepoint_dom,
1765
+ TBitArray<PointIndex> & cornerpoint, TBitArray<PointIndex> & edgepoint,
1766
+ INDEX_3_HASHTABLE<int> & faces, INDEX_2_HASHTABLE<int> & face_edges,
1767
+ INDEX_2_HASHTABLE<int> & surf_edges, Array<int, PointIndex> & facepoint)
1768
+ {
1769
+ // HPREF_ELEMENT_TYPE type = HP_NONE;
1770
+
1771
+ // no singular
1772
+ // singular bottom
1773
+ // singular top
1774
+
1775
+ // indices of bot,top-faces combinations
1776
+ // int index[6][2] = {{0,1},{1,0},{2,4},{4,2},{3,5},{5,3}};
1777
+ // int p[8];
1778
+ // const ELEMENT_FACE * elfaces = MeshTopology::GetFaces1 (HEX);
1779
+ // const ELEMENT_EDGE * eledges = MeshTopology::GetEdges1 (HEX);
1780
+
1781
+ INDEX_4 fbot4 = { el.pnums[0], el.pnums[1], el.pnums[2], el.pnums[3] };
1782
+ INDEX_3 ftop = { el.pnums[4], el.pnums[5], el.pnums[6] };
1783
+ fbot4.Sort();
1784
+ INDEX_3 fbot = { fbot4[0], fbot4[1], fbot4[2] };
1785
+ ftop.Sort();
1786
+
1787
+ bool singbot = faces.Used(fbot);
1788
+ bool singtop = faces.Used(ftop);
1789
+
1790
+ if (singbot)
1791
+ el.type = HP_HEX7_1FA;
1792
+ else if (singtop)
1793
+ el.type = HP_HEX7_1FB;
1794
+ else
1795
+ el.type = HP_HEX7;
1796
+
1797
+ return el.type;
1798
+ }
1799
+
1800
+
1801
+
1802
+
1803
+
1804
+ HPREF_ELEMENT_TYPE ClassifySegm(HPRefElement & hpel, INDEX_2_HASHTABLE<int> & edges, HT_EDGEPOINT_DOM & edgepoint_dom,
1805
+ TBitArray<PointIndex> & cornerpoint, TBitArray<PointIndex> & edgepoint,
1806
+ INDEX_3_HASHTABLE<int> & faces, INDEX_2_HASHTABLE<int> & face_edges,
1807
+ INDEX_2_HASHTABLE<int> & surf_edges, Array<int, PointIndex> & facepoint)
1808
+ {
1809
+
1810
+ int cp1 = cornerpoint.Test (hpel[0]);
1811
+ int cp2 = cornerpoint.Test (hpel[1]);
1812
+
1813
+ INDEX_2 i2;
1814
+ i2 = INDEX_2(hpel[0], hpel[1]);
1815
+ i2.Sort();
1816
+ if (!edges.Used (i2))
1817
+ {
1818
+ cp1 = edgepoint.Test (hpel[0]);
1819
+ cp2 = edgepoint.Test (hpel[1]);
1820
+ }
1821
+
1822
+ if(!edges.Used(i2) && !face_edges.Used(i2))
1823
+ {
1824
+ if(facepoint[hpel[0]]!=0) cp1=1;
1825
+ if(facepoint[hpel[1]]!=0) cp2=1;
1826
+ }
1827
+
1828
+ if(edges.Used(i2) && !face_edges.Used(i2))
1829
+ {
1830
+ if(facepoint[hpel[0]]) cp1 = 1;
1831
+ if(facepoint[hpel[1]]) cp2 = 1;
1832
+ }
1833
+
1834
+ if (!cp1 && !cp2)
1835
+ hpel.type = HP_SEGM;
1836
+ else if (cp1 && !cp2)
1837
+ hpel.type = HP_SEGM_SINGCORNERL;
1838
+ else if (!cp1 && cp2)
1839
+ hpel.type = HP_SEGM_SINGCORNERR;
1840
+ else
1841
+ hpel.type = HP_SEGM_SINGCORNERS;
1842
+
1843
+ // cout << " SEGM found with " << hpel[0] << " \t" << hpel[1] << endl << " of type " << hpel.type << endl;
1844
+ return(hpel.type) ;
1845
+ }
1846
+
1847
+
1848
+ HPREF_ELEMENT_TYPE ClassifyPyramid(HPRefElement & el, INDEX_2_HASHTABLE<int> & edges, HT_EDGEPOINT_DOM & edgepoint_dom,
1849
+ TBitArray<PointIndex> & cornerpoint, TBitArray<PointIndex> & edgepoint,
1850
+ INDEX_3_HASHTABLE<int> & faces, INDEX_2_HASHTABLE<int> & face_edges,
1851
+ INDEX_2_HASHTABLE<int> & surf_edges, Array<int, PointIndex> & facepoint)
1852
+ {
1853
+ // *testout << "classify pyramid, pnums = ";
1854
+ // for (int i = 0; i < 5; i++) *testout << el.pnums[i] << " ";
1855
+ // *testout << endl;
1856
+
1857
+
1858
+ HPREF_ELEMENT_TYPE type = HP_NONE;
1859
+
1860
+ // implementation only for HP_PYRAMID
1861
+ // HP_PYRAMID_0E_1V
1862
+ // HP_PYRAMID_EDGES
1863
+ // HP_PYRAMID_1FB_0E_1VA
1864
+ // up to now other cases are refine dummies
1865
+
1866
+ // indices of bot,top-faces combinations
1867
+ // int index[6][2] = {{0,1},{1,0},{2,4},{4,2},{3,5},{5,3}};
1868
+
1869
+ const ELEMENT_FACE * elfaces = MeshTopology::GetFaces1 (PYRAMID);
1870
+ const ELEMENT_EDGE * eledges = MeshTopology::GetEdges1 (PYRAMID);
1871
+
1872
+ int point_sing[5]={0,0,0,0,0};
1873
+ int face_sing[5] = {0,0,0,0,0};
1874
+ int edge_sing[8] = {0,0,0,0,0,0,0,0};
1875
+
1876
+ int spoint=0, sedge=0, sface=0;
1877
+
1878
+ for(int m=0;m<4 && type == HP_NONE;m++)
1879
+ {
1880
+ *testout << "m = " << m << endl;
1881
+ int p[5] = {m%4, m%4+1, m%4+2, m%4+3, 4};
1882
+
1883
+ for(int l=0;l<5;l++)
1884
+ {
1885
+ if(cornerpoint.Test(el.pnums[p[l]]))
1886
+ point_sing[l]=3;
1887
+
1888
+ else if(edgepoint.Test(el.pnums[p[l]]))
1889
+ point_sing[l]=2;
1890
+
1891
+ else if (facepoint[el.pnums[p[l]]] == -1 || facepoint[el.pnums[p[l]]] == el.GetIndex())
1892
+ point_sing[l] = 1;
1893
+
1894
+ spoint += point_sing[l];
1895
+ }
1896
+
1897
+ for(int k=0;k<8;k++)
1898
+ {
1899
+ INDEX_2 i2 = INDEX_2 :: Sort(el.pnums[p[eledges[k][0]-1]],
1900
+ el.pnums[p[eledges[k][1]-1]]);
1901
+ if (edges.Used(i2))
1902
+ edge_sing[k] = 2;
1903
+ else
1904
+ edge_sing[k] = face_edges.Used(i2);
1905
+
1906
+ sedge += edge_sing[k];
1907
+ }
1908
+
1909
+ for (int k=0;k<5;k++)
1910
+ {
1911
+ INDEX_3 i3;
1912
+ /*
1913
+ INDEX_4 i4 = INDEX_4(el.pnums[p[elfaces[k][0]-1]], el.pnums[p[elfaces[k][1]-1]], el.pnums[p[elfaces[k][2]-1]],
1914
+ el.pnums[p[elfaces[k][3]-1]]);
1915
+ i4.Sort();
1916
+ i3 = INDEX_3(i4.I1(), i4.I2(), i4.I3());
1917
+ */
1918
+ if (k < 4)
1919
+ {
1920
+ i3 = INDEX_3(el.pnums[p[elfaces[k][0]-1]], el.pnums[p[elfaces[k][1]-1]], el.pnums[p[elfaces[k][2]-1]]);
1921
+ i3.Sort();
1922
+ }
1923
+ else
1924
+ {
1925
+ INDEX_4 i4 = INDEX_4(el.pnums[p[elfaces[k][0]-1]], el.pnums[p[elfaces[k][1]-1]], el.pnums[p[elfaces[k][2]-1]],
1926
+ el.pnums[p[elfaces[k][3]-1]]);
1927
+ i4.Sort();
1928
+ i3 = INDEX_3(i4.I1(), i4.I2(), i4.I3());
1929
+ }
1930
+
1931
+
1932
+ if (faces.Used (i3))
1933
+ {
1934
+
1935
+ int domnr = faces.Get(i3);
1936
+ if (domnr == -1 || domnr == el.GetIndex())
1937
+ face_sing[k] = 1;
1938
+ }
1939
+ sface +=face_sing[k];
1940
+ }
1941
+
1942
+ *testout << "point_sing: ";
1943
+ for (int k = 0; k < 5; k++) *testout << point_sing[k] << " ";
1944
+ *testout << endl;
1945
+
1946
+ *testout << "edge_sing: ";
1947
+ for (int k = 0; k < 4; k++) *testout << edge_sing[k] << " ";
1948
+ *testout << endl;
1949
+
1950
+ *testout << "face_sing: ";
1951
+ for (int k = 0; k < 5; k++) *testout << face_sing[k] << " ";
1952
+ *testout << endl;
1953
+
1954
+ if(!sface && !spoint && !sedge) return(HP_PYRAMID);
1955
+
1956
+ if(!sface && !sedge && point_sing[p[0]] == spoint)
1957
+ type = HP_PYRAMID_0E_1V;
1958
+
1959
+ if(!sface && edge_sing[0] + edge_sing[2] == sedge &&
1960
+ spoint == point_sing[0] + point_sing[1] + point_sing[3])
1961
+ type = HP_PYRAMID_EDGES;
1962
+
1963
+ if(sface && sface == face_sing[0] && spoint == point_sing[4] + 2)
1964
+ {
1965
+ if (point_sing[4] == 1)
1966
+ type = HP_PYRAMID_1FB_0E_0V;
1967
+ else
1968
+ type = HP_PYRAMID_1FB_0E_1VA;
1969
+ }
1970
+
1971
+
1972
+ if(type != HP_NONE)
1973
+ {
1974
+ int pnums[8];
1975
+ for(int l=0;l<5;l++) pnums[l] = el[p[l]];
1976
+ for(int l=0;l<5;l++) el[l] = pnums[l];
1977
+ el.type=type;
1978
+ break;
1979
+ }
1980
+ }
1981
+
1982
+ return (type);
1983
+
1984
+ }