From 5abb40125bacd6f14c730ad0b84b8d1d27523635 Mon Sep 17 00:00:00 2001 From: Achim Gsell Date: Fri, 12 Apr 2013 12:32:58 +0000 Subject: [PATCH] new trunk merged from old trunk, Roman's master thesis and my changes in the sandbox --- .gitattributes | 631 + .gitignore | 93 + AUTHORS | 10 + COPYING | 71 + ChangeLog | 0 Makefile.am | 13 + NEWS | 376 + README | 0 autogen.sh | 48 + configure.ac | 412 + doc/Doxyfile | 1816 + doc/DoxygenLayout.xml | 188 + doc/Examples/meshexample.dxf | 47962 ++++++++++++++++ doc/Examples/meshexample.txt | 77 + doc/Examples/simple_tet.vtk | 107 + doc/Examples/simple_tet_level0.vtk | 59 + doc/Examples/simple_tet_level1.vtk | 80 + doc/Examples/simple_tet_level2.vtk | 101 + doc/Examples/trimesh_dgraph_level0.metis | 13 + .../trimesh_dgraph_level0.metis.part.2 | 12 + .../trimesh_dgraph_level0.metis.part.3 | 12 + doc/Examples/trimesh_dnode_level1.metis | 49 + .../trimesh_dnode_level1.metis.part.2 | 24 + doc/Examples/trimesh_level0.metis | 13 + doc/Examples/trimesh_level0.metis.epart.2 | 12 + doc/Examples/trimesh_level0.metis.ngraph | 12 + doc/Examples/trimesh_level0.metis.npart.2 | 11 + doc/Examples/trimesh_level1.metis | 41 + doc/Examples/trimesh_level1.metis.part.2 | 20 + doc/H5.dox | 84 + doc/H5X_File_Format.txt | 170 + doc/Makefile.am | 14 + doc/TracFooter.html | 2 + doc/TracHeader.html | 4 + doc/doxyfooter | 2 + doc/doxyheader | 6 + doc/html2twiki | 36 + doc/meshexample.dxf | 6982 +++ doc/postprocess.py | 39 + .../1-edge/edge_01_refined/01.png | Bin 0 -> 8591 bytes .../1-edge/edge_01_refined/01.pvsm | 1697 + .../1-edge/edge_01_refined/01.txt | 10 + .../1-edge/edge_01_refined/01.vtk | 25 + .../1-edge/edge_01_refined/01_smal.png | Bin 0 -> 8142 bytes .../1-edge/edge_01_refined/01_small.png | Bin 0 -> 8142 bytes .../1-edge/edge_12_refined/12.png | Bin 0 -> 8715 bytes .../1-edge/edge_12_refined/12.pvsm | 2225 + .../1-edge/edge_12_refined/12.txt | 10 + .../1-edge/edge_12_refined/12.vtk | 25 + .../1-edge/edge_12_refined/12_small.png | Bin 0 -> 8316 bytes .../1-edge/edge_20_refined/20.png | Bin 0 -> 8930 bytes .../1-edge/edge_20_refined/20.pvsm | 2225 + .../1-edge/edge_20_refined/20.txt | 10 + .../1-edge/edge_20_refined/20.vtk | 25 + .../1-edge/edge_20_refined/20_small.png | Bin 0 -> 9138 bytes .../1-edge/edge_23_refined/23.png | Bin 0 -> 8487 bytes .../1-edge/edge_23_refined/23.pvsm | 2225 + .../1-edge/edge_23_refined/23.txt | 10 + .../1-edge/edge_23_refined/23.vtk | 25 + .../1-edge/edge_23_refined/23_small.png | Bin 0 -> 8602 bytes .../1-edge/edge_30_refined/30.png | Bin 0 -> 8222 bytes .../1-edge/edge_30_refined/30.pvsm | 2225 + .../1-edge/edge_30_refined/30.txt | 10 + .../1-edge/edge_30_refined/30.vtk | 25 + .../1-edge/edge_30_refined/30_small.png | Bin 0 -> 7994 bytes .../1-edge/edge_31_refined/31.png | Bin 0 -> 9313 bytes .../1-edge/edge_31_refined/31.pvsm | 2225 + .../1-edge/edge_31_refined/31.txt | 10 + .../1-edge/edge_31_refined/31.vtk | 25 + .../1-edge/edge_31_refined/31_small.png | Bin 0 -> 8901 bytes .../2-edges/edge_01-12_refined/01-12.png | Bin 0 -> 9008 bytes .../2-edges/edge_01-12_refined/01-12.pvsm | 1697 + .../2-edges/edge_01-12_refined/01-12.txt | 15 + .../2-edges/edge_01-12_refined/01-12.vtk | 29 + .../2-edges/edge_01-12_refined/01-12_smal.png | Bin 0 -> 8743 bytes .../edge_01-12_refined/01-12_small.png | Bin 0 -> 8743 bytes .../2-edges/edge_01-20_refined/01-20.png | Bin 0 -> 9787 bytes .../2-edges/edge_01-20_refined/01-20.pvsm | 1697 + .../2-edges/edge_01-20_refined/01-20.txt | 15 + .../2-edges/edge_01-20_refined/01-20.vtk | 29 + .../edge_01-20_refined/01-20_small.png | Bin 0 -> 9470 bytes .../2-edges/edge_01-23_refined/01-23.png | Bin 0 -> 10861 bytes .../2-edges/edge_01-23_refined/01-23.pvsm | 1697 + .../2-edges/edge_01-23_refined/01-23.txt | 20 + .../2-edges/edge_01-23_refined/01-23.vtk | 32 + .../2-edges/edge_01-23_refined/01-23_smal.png | Bin 0 -> 12185 bytes .../edge_01-23_refined/01-23_small.png | Bin 0 -> 12185 bytes .../2-edges/edge_01-30_refined/01-30.png | Bin 0 -> 10740 bytes .../2-edges/edge_01-30_refined/01-30.pvsm | 1697 + .../2-edges/edge_01-30_refined/01-30.txt | 15 + .../2-edges/edge_01-30_refined/01-30.vtk | 29 + .../edge_01-30_refined/01-30_small.png | Bin 0 -> 11008 bytes .../2-edges/edge_01-31_refined/01-31.png | Bin 0 -> 11377 bytes .../2-edges/edge_01-31_refined/01-31.pvsm | 1697 + .../2-edges/edge_01-31_refined/01-31.txt | 15 + .../2-edges/edge_01-31_refined/01-31.vtk | 29 + .../edge_01-31_refined/01-31_small.png | Bin 0 -> 12429 bytes .../2-edges/edge_12-20_refined/12-20.png | Bin 0 -> 9769 bytes .../2-edges/edge_12-20_refined/12-20.pvsm | 1697 + .../2-edges/edge_12-20_refined/12-20.txt | 15 + .../2-edges/edge_12-20_refined/12-20.vtk | 29 + .../edge_12-20_refined/12-20_small.png | Bin 0 -> 9346 bytes .../2-edges/edge_12-23_refined/12-23.png | Bin 0 -> 11278 bytes .../2-edges/edge_12-23_refined/12-23.pvsm | 1697 + .../2-edges/edge_12-23_refined/12-23.txt | 15 + .../2-edges/edge_12-23_refined/12-23.vtk | 29 + .../edge_12-23_refined/12-23_small.png | Bin 0 -> 12470 bytes .../2-edges/edge_12-30_refined/12-30.png | Bin 0 -> 12286 bytes .../2-edges/edge_12-30_refined/12-30.pvsm | 1697 + .../2-edges/edge_12-30_refined/12-30.txt | 20 + .../2-edges/edge_12-30_refined/12-30.vtk | 32 + .../edge_12-30_refined/12-30_small.png | Bin 0 -> 13490 bytes .../2-edges/edge_12-31_refined/12-31.png | Bin 0 -> 10580 bytes .../2-edges/edge_12-31_refined/12-31.pvsm | 1697 + .../2-edges/edge_12-31_refined/12-31.txt | 15 + .../2-edges/edge_12-31_refined/12-31.vtk | 29 + .../edge_12-31_refined/12-31_small.png | Bin 0 -> 10551 bytes .../2-edges/edge_20-23_refined/20-23.png | Bin 0 -> 9101 bytes .../2-edges/edge_20-23_refined/20-23.pvsm | 1697 + .../2-edges/edge_20-23_refined/20-23.txt | 15 + .../2-edges/edge_20-23_refined/20-23.vtk | 29 + .../edge_20-23_refined/20-23_small.png | Bin 0 -> 8556 bytes .../2-edges/edge_20-30_refined/20-30.png | Bin 0 -> 10525 bytes .../2-edges/edge_20-30_refined/20-30.pvsm | 1697 + .../2-edges/edge_20-30_refined/20-30.txt | 15 + .../2-edges/edge_20-30_refined/20-30.vtk | 29 + .../edge_20-30_refined/20-30_small.png | Bin 0 -> 10014 bytes .../2-edges/edge_20-31_refined/20-31.png | Bin 0 -> 11377 bytes .../2-edges/edge_20-31_refined/20-31.pvsm | 1697 + .../2-edges/edge_20-31_refined/20-31.txt | 20 + .../2-edges/edge_20-31_refined/20-31.vtk | 32 + .../edge_20-31_refined/20-31_small.png | Bin 0 -> 12039 bytes .../2-edges/edge_23-30_refined/23-30.png | Bin 0 -> 10720 bytes .../2-edges/edge_23-30_refined/23-30.pvsm | 1697 + .../2-edges/edge_23-30_refined/23-30.txt | 15 + .../2-edges/edge_23-30_refined/23-30.vtk | 29 + .../edge_23-30_refined/23-30_small.png | Bin 0 -> 11315 bytes .../2-edges/edge_23-31_refined/23-31.png | Bin 0 -> 11334 bytes .../2-edges/edge_23-31_refined/23-31.pvsm | 1697 + .../2-edges/edge_23-31_refined/23-31.txt | 15 + .../2-edges/edge_23-31_refined/23-31.vtk | 29 + .../edge_23-31_refined/23-31_small.png | Bin 0 -> 11262 bytes .../2-edges/edge_30-31_refined/30-31.png | Bin 0 -> 9498 bytes .../2-edges/edge_30-31_refined/30-31.pvsm | 1839 + .../2-edges/edge_30-31_refined/30-31.txt | 15 + .../2-edges/edge_30-31_refined/30-31.vtk | 29 + .../edge_30-31_refined/30-31_small.png | Bin 0 -> 9739 bytes .../edge_01-12-20_refined/01-12-20.png | Bin 0 -> 10363 bytes .../edge_01-12-20_refined/01-12-20.pvsm | 1697 + .../edge_01-12-20_refined/01-12-20.txt | 20 + .../edge_01-12-20_refined/01-12-20.vtk | 33 + .../edge_01-12-20_refined/01-12-20_small.png | Bin 0 -> 10952 bytes .../edge_01-12-23_refined/01-12-23.png | Bin 0 -> 11396 bytes .../edge_01-12-23_refined/01-12-23.pvsm | 1697 + .../edge_01-12-23_refined/01-12-23.txt | 20 + .../edge_01-12-23_refined/01-12-23.vtk | 33 + .../edge_01-12-23_refined/01-12-23_small.png | Bin 0 -> 12489 bytes .../edge_01-12-30_refined/01-12-30.png | Bin 0 -> 10234 bytes .../edge_01-12-30_refined/01-12-30.pvsm | 1697 + .../edge_01-12-30_refined/01-12-30.txt | 20 + .../edge_01-12-30_refined/01-12-30.vtk | 33 + .../edge_01-12-30_refined/01-12-30_small.png | Bin 0 -> 11104 bytes .../edge_01-12-31_refined/01-12-31.png | Bin 0 -> 12876 bytes .../edge_01-12-31_refined/01-12-31.pvsm | 1697 + .../edge_01-12-31_refined/01-12-31.txt | 45 + .../edge_01-12-31_refined/01-12-31.vtk | 49 + .../edge_01-12-31_refined/01-12-31_small.png | Bin 0 -> 15042 bytes .../edge_01-20-23_refined/01-20-23.png | Bin 0 -> 11187 bytes .../edge_01-20-23_refined/01-20-23.pvsm | 1839 + .../edge_01-20-23_refined/01-20-23.txt | 20 + .../edge_01-20-23_refined/01-20-23.vtk | 33 + .../edge_01-20-23_refined/01-20-23_small.png | Bin 0 -> 13097 bytes .../edge_01-20-30_refined/01-20-30.png | Bin 0 -> 12504 bytes .../edge_01-20-30_refined/01-20-30.pvsm | 1839 + .../edge_01-20-30_refined/01-20-30.txt | 45 + .../edge_01-20-30_refined/01-20-30.vtk | 49 + .../edge_01-20-30_refined/01-20-30_small.png | Bin 0 -> 13795 bytes .../edge_01-20-31_refined/01-20-31.png | Bin 0 -> 11184 bytes .../edge_01-20-31_refined/01-20-31.pvsm | 1839 + .../edge_01-20-31_refined/01-20-31.txt | 20 + .../edge_01-20-31_refined/01-20-31.vtk | 33 + .../edge_01-20-31_refined/01-20-31_small.png | Bin 0 -> 11903 bytes .../edge_01-23-30_refined/01-23-30.png | Bin 0 -> 8949 bytes .../edge_01-23-30_refined/01-23-30.pvsm | 1839 + .../edge_01-23-30_refined/01-23-30.txt | 20 + .../edge_01-23-30_refined/01-23-30.vtk | 33 + .../edge_01-23-30_refined/01-23-30_small.png | Bin 0 -> 9206 bytes .../edge_01-23-31_refined/01-23-31.png | Bin 0 -> 11889 bytes .../edge_01-23-31_refined/01-23-31.pvsm | 1839 + .../edge_01-23-31_refined/01-23-31.txt | 20 + .../edge_01-23-31_refined/01-23-31.vtk | 33 + .../edge_01-23-31_refined/01-23-31_small.png | Bin 0 -> 11900 bytes .../edge_01-30-31_refined/01-30-31.png | Bin 0 -> 10969 bytes .../edge_01-30-31_refined/01-30-31.pvsm | 1839 + .../edge_01-30-31_refined/01-30-31.txt | 20 + .../edge_01-30-31_refined/01-30-31.vtk | 33 + .../edge_01-30-31_refined/01-30-31_small.png | Bin 0 -> 12172 bytes .../edge_12-20-23_refined/12-20-23.png | Bin 0 -> 11864 bytes .../edge_12-20-23_refined/12-20-23.pvsm | 1839 + .../edge_12-20-23_refined/12-20-23.txt | 45 + .../edge_12-20-23_refined/12-20-23.vtk | 49 + .../edge_12-20-23_refined/12-20-23_small.png | Bin 0 -> 13838 bytes .../edge_12-20-30_refined/12-20-30.png | Bin 0 -> 10319 bytes .../edge_12-20-30_refined/12-20-30.pvsm | 1839 + .../edge_12-20-30_refined/12-20-30.txt | 20 + .../edge_12-20-30_refined/12-20-30.vtk | 33 + .../edge_12-20-30_refined/12-20-30_small.png | Bin 0 -> 11510 bytes .../edge_12-20-31_refined/12-20-31.png | Bin 0 -> 10317 bytes .../edge_12-20-31_refined/12-20-31.pvsm | 1839 + .../edge_12-20-31_refined/12-20-31.txt | 20 + .../edge_12-20-31_refined/12-20-31.vtk | 33 + .../edge_12-20-31_refined/12-20-31_small.png | Bin 0 -> 10059 bytes .../edge_12-23-30_refined/12-23-30.png | Bin 0 -> 9721 bytes .../edge_12-23-30_refined/12-23-30.pvsm | 1839 + .../edge_12-23-30_refined/12-23-30.txt | 20 + .../edge_12-23-30_refined/12-23-30.vtk | 33 + .../edge_12-23-30_refined/12-23-30_small.png | Bin 0 -> 9754 bytes .../edge_12-23-31_refined/12-23-31.png | Bin 0 -> 9742 bytes .../edge_12-23-31_refined/12-23-31.pvsm | 1839 + .../edge_12-23-31_refined/12-23-31.txt | 20 + .../edge_12-23-31_refined/12-23-31.vtk | 33 + .../edge_12-23-31_refined/12-23-31_small.png | Bin 0 -> 10575 bytes .../edge_12-30-31_refined/12-30-31.png | Bin 0 -> 10665 bytes .../edge_12-30-31_refined/12-30-31.pvsm | 1839 + .../edge_12-30-31_refined/12-30-31.txt | 20 + .../edge_12-30-31_refined/12-30-31.vtk | 33 + .../edge_12-30-31_refined/12-30-31_small.png | Bin 0 -> 11703 bytes .../edge_20-23-30_refined/20-23-30.png | Bin 0 -> 11436 bytes .../edge_20-23-30_refined/20-23-30.pvsm | 1839 + .../edge_20-23-30_refined/20-23-30.txt | 20 + .../edge_20-23-30_refined/20-23-30.vtk | 33 + .../edge_20-23-30_refined/20-23-30_small.png | Bin 0 -> 11443 bytes .../edge_20-23-31_refined/20-23-31.png | Bin 0 -> 9930 bytes .../edge_20-23-31_refined/20-23-31.pvsm | 1839 + .../edge_20-23-31_refined/20-23-31.txt | 20 + .../edge_20-23-31_refined/20-23-31.vtk | 33 + .../edge_20-23-31_refined/20-23-31_small.png | Bin 0 -> 10771 bytes .../edge_20-30-31_refined/20-30-31.png | Bin 0 -> 10304 bytes .../edge_20-30-31_refined/20-30-31.pvsm | 1839 + .../edge_20-30-31_refined/20-30-31.txt | 20 + .../edge_20-30-31_refined/20-30-31.vtk | 33 + .../edge_20-30-31_refined/20-30-31_small.png | Bin 0 -> 11075 bytes .../edge_23-30-31_refined/23-30-31.png | Bin 0 -> 13930 bytes .../edge_23-30-31_refined/23-30-31.pvsm | 1839 + .../edge_23-30-31_refined/23-30-31.txt | 45 + .../edge_23-30-31_refined/23-30-31.vtk | 49 + .../edge_23-30-31_refined/23-30-31_small.png | Bin 0 -> 17172 bytes .../edge_01-12-20-23_refined/01-12-20-23.png | Bin 0 -> 11374 bytes .../edge_01-12-20-23_refined/01-12-20-23.pvsm | 2021 + .../edge_01-12-20-23_refined/01-12-20-23.txt | 25 + .../edge_01-12-20-23_refined/01-12-20-23.vtk | 37 + .../01-12-20-23_small.png | Bin 0 -> 11466 bytes .../edge_01-12-20-30_refined/01-12-20-30.png | Bin 0 -> 11108 bytes .../edge_01-12-20-30_refined/01-12-20-30.pvsm | 2021 + .../edge_01-12-20-30_refined/01-12-20-30.txt | 25 + .../edge_01-12-20-30_refined/01-12-20-30.vtk | 37 + .../01-12-20-30_small.png | Bin 0 -> 11643 bytes .../edge_01-12-20-31_refined/01-12-20-31.png | Bin 0 -> 11314 bytes .../edge_01-12-20-31_refined/01-12-20-31.pvsm | 2021 + .../edge_01-12-20-31_refined/01-12-20-31.txt | 25 + .../edge_01-12-20-31_refined/01-12-20-31.vtk | 37 + .../01-12-20-31_small.png | Bin 0 -> 11660 bytes .../edge_01-12-23-30_refined/01-12-23-30.png | Bin 0 -> 12300 bytes .../edge_01-12-23-30_refined/01-12-23-30.pvsm | 2021 + .../edge_01-12-23-30_refined/01-12-23-30.txt | 30 + .../edge_01-12-23-30_refined/01-12-23-30.vtk | 40 + .../01-12-23-30_small.png | Bin 0 -> 14415 bytes .../edge_01-12-23-31_refined/01-12-23-31.png | Bin 0 -> 11206 bytes .../edge_01-12-23-31_refined/01-12-23-31.pvsm | 2021 + .../edge_01-12-23-31_refined/01-12-23-31.txt | 25 + .../edge_01-12-23-31_refined/01-12-23-31.vtk | 37 + .../01-12-23-31_small.png | Bin 0 -> 11705 bytes .../edge_01-12-30-31_refined/01-12-30-31.png | Bin 0 -> 11100 bytes .../edge_01-12-30-31_refined/01-12-30-31.pvsm | 2021 + .../edge_01-12-30-31_refined/01-12-30-31.txt | 25 + .../edge_01-12-30-31_refined/01-12-30-31.vtk | 37 + .../01-12-30-31_small.png | Bin 0 -> 12300 bytes .../edge_01-20-23-30_refined/01-20-23-30.png | Bin 0 -> 12390 bytes .../edge_01-20-23-30_refined/01-20-23-30.pvsm | 2021 + .../edge_01-20-23-30_refined/01-20-23-30.txt | 25 + .../edge_01-20-23-30_refined/01-20-23-30.vtk | 37 + .../01-20-23-30_small.png | Bin 0 -> 13375 bytes .../edge_01-20-23-31_refined/01-20-23-31.png | Bin 0 -> 11640 bytes .../edge_01-20-23-31_refined/01-20-23-31.pvsm | 2021 + .../edge_01-20-23-31_refined/01-20-23-31.txt | 30 + .../edge_01-20-23-31_refined/01-20-23-31.vtk | 40 + .../01-20-23-31_small.png | Bin 0 -> 13405 bytes .../edge_01-20-30-31_refined/01-20-30-31.png | Bin 0 -> 11131 bytes .../edge_01-20-30-31_refined/01-20-30-31.pvsm | 2021 + .../edge_01-20-30-31_refined/01-20-30-31.txt | 25 + .../edge_01-20-30-31_refined/01-20-30-31.vtk | 37 + .../01-20-30-31_small.png | Bin 0 -> 12651 bytes .../edge_01-23-30-31_refined/01-23-30-31.png | Bin 0 -> 11717 bytes .../edge_01-23-30-31_refined/01-23-30-31.pvsm | 2021 + .../edge_01-23-30-31_refined/01-23-30-31.txt | 25 + .../edge_01-23-30-31_refined/01-23-30-31.vtk | 37 + .../01-23-30-31_small.png | Bin 0 -> 13719 bytes .../edge_12-20-23-30_refined/12-20-23-30.png | Bin 0 -> 12508 bytes .../edge_12-20-23-30_refined/12-20-23-30.pvsm | 2021 + .../edge_12-20-23-30_refined/12-20-23-30.txt | 25 + .../edge_12-20-23-30_refined/12-20-23-30.vtk | 37 + .../12-20-23-30_small.png | Bin 0 -> 13460 bytes .../edge_12-20-23-31_refined/12-20-23-31.png | Bin 0 -> 11339 bytes .../edge_12-20-23-31_refined/12-20-23-31.pvsm | 2021 + .../edge_12-20-23-31_refined/12-20-23-31.txt | 25 + .../edge_12-20-23-31_refined/12-20-23-31.vtk | 37 + .../12-20-23-31_small.png | Bin 0 -> 12206 bytes .../edge_12-20-30-31_refined/12-20-30-31.png | Bin 0 -> 11216 bytes .../edge_12-20-30-31_refined/12-20-30-31.pvsm | 2021 + .../edge_12-20-30-31_refined/12-20-30-31.txt | 30 + .../edge_12-20-30-31_refined/12-20-30-31.vtk | 40 + .../12-20-30-31_small.png | Bin 0 -> 12010 bytes .../edge_12-23-30-31_refined/12-23-30-31.png | Bin 0 -> 11742 bytes .../edge_12-23-30-31_refined/12-23-30-31.pvsm | 2021 + .../edge_12-23-30-31_refined/12-23-30-31.txt | 25 + .../edge_12-23-30-31_refined/12-23-30-31.vtk | 37 + .../12-23-30-31_small.png | Bin 0 -> 12377 bytes .../edge_20-23-30-31_refined/20-23-30-31.png | Bin 0 -> 12485 bytes .../edge_20-23-30-31_refined/20-23-30-31.pvsm | 2021 + .../edge_20-23-30-31_refined/20-23-30-31.txt | 25 + .../edge_20-23-30-31_refined/20-23-30-31.vtk | 37 + .../20-23-30-31_small.png | Bin 0 -> 13974 bytes .../01-12-20-23-30.png | Bin 0 -> 10265 bytes .../01-12-20-23-30.pvsm | 2021 + .../01-12-20-23-30.txt | 35 + .../01-12-20-23-30.vtk | 44 + .../01-12-20-23-30_small.png | Bin 0 -> 12108 bytes .../01-12-20-23-31.png | Bin 0 -> 14204 bytes .../01-12-20-23-31.pvsm | 2225 + .../01-12-20-23-31.txt | 35 + .../01-12-20-23-31.vtk | 44 + .../01-12-20-23-31_small.png | Bin 0 -> 12973 bytes .../01-12-20-30-31.png | Bin 0 -> 13861 bytes .../01-12-20-30-31.pvsm | 2225 + .../01-12-20-30-31.txt | 35 + .../01-12-20-30-31.vtk | 44 + .../01-12-20-30-31_small.png | Bin 0 -> 12074 bytes .../01-12-23-30-31.png | Bin 0 -> 13975 bytes .../01-12-23-30-31.pvsm | 2225 + .../01-12-23-30-31.txt | 35 + .../01-12-23-30-31.vtk | 44 + .../01-12-23-30-31_small.png | Bin 0 -> 12589 bytes .../01-20-23-30-31.png | Bin 0 -> 14640 bytes .../01-20-23-30-31.pvsm | 2225 + .../01-20-23-30-31.txt | 35 + .../01-20-23-30-31.vtk | 44 + .../01-20-23-30-31_small.png | Bin 0 -> 13442 bytes .../12-20-23-30-31.png | Bin 0 -> 14580 bytes .../12-20-23-30-31.pvsm | 2225 + .../12-20-23-30-31.txt | 35 + .../12-20-23-30-31.vtk | 44 + .../12-20-23-30-31_small.png | Bin 0 -> 13160 bytes .../01-12-20-23-30-31.aux | 1 + .../01-12-20-23-30-31.log | 172 + .../01-12-20-23-30-31.pdf | Bin 0 -> 15748 bytes .../01-12-20-23-30-31.png | Bin 0 -> 10862 bytes .../01-12-20-23-30-31.pvsm | 2225 + .../01-12-20-23-30-31.tex | 11 + .../01-12-20-23-30-31.tex.orig | 11 + .../01-12-20-23-30-31.txt | 40 + .../01-12-20-23-30-31.vtk | 48 + .../01-12-20-23-30-31_small.png | Bin 0 -> 12561 bytes .../buildlatex.bash | 36 + .../output_file.jpg | Bin 0 -> 29397 bytes doc/tetrahedron_refinements/README | 5 + doc/tetrahedron_refinements/text2vtk.py | 76 + examples/H5/Makefile.am | 28 + examples/H5/openclose.c | 34 + examples/H5Block/H5BlockExample.pbs | 7 + examples/H5Block/H5BlockExampleF.f90 | 624 + examples/H5Block/Makefile.am | 35 + examples/H5Block/README | 189 + examples/H5Block/fields.c | 45 + examples/H5Block/read_write.c | 568 + examples/H5Fed/Makefile.am | 47 + examples/H5Fed/map_tet2globalid.c | 63 + examples/H5Fed/map_triangle2globalid.c | 63 + examples/H5Fed/tetmesh_adjacencies.c | 566 + examples/H5Fed/tetmesh_read.c | 350 + examples/H5Fed/tetmesh_read_tags.c | 400 + examples/H5Fed/tetmesh_write.c | 83 + examples/H5Fed/tetmesh_write1.c | 75 + examples/H5Fed/tetmesh_write2.c | 109 + examples/H5Fed/tetmesh_write_tags.c | 230 + examples/H5Fed/trimesh_2gnuplot.c | 101 + examples/H5Fed/trimesh_adjacencies.c | 326 + examples/H5Fed/trimesh_read.c | 268 + examples/H5Fed/trimesh_write.c | 69 + examples/H5Fed/trimesh_write_dunetest.c | 70 + examples/H5Fed/write_boundary.c | 100 + examples/H5Part/Bench.c | 263 + examples/H5Part/H5test.c | 296 + examples/H5Part/H5testF.f90 | 920 + examples/H5Part/Makefile.am | 47 + examples/H5Part/core_vfd.c | 48 + examples/H5Part/particles.c | 41 + examples/H5Part/read_canonicalview.c | 27 + examples/H5Part/simplef.f90 | 56 + examples/H5Part/stridedf.f90 | 61 + examples/H5Part/write_setnumparticles.c | 38 + examples/H5Part/write_setview.c | 58 + license.txt | 17 + src/C/Makefile.am | 27 + src/Fortran/H5.c | 395 + src/Fortran/H5Block.c | 199 + src/Fortran/H5BlockF.f90 | 97 + src/Fortran/H5Block_F.c | 324 + src/Fortran/H5Block_attribs.c | 455 + src/Fortran/H5Block_attribsF.f90 | 249 + src/Fortran/H5Block_io.c | 387 + src/Fortran/H5Block_ioF.f90 | 181 + src/Fortran/H5Block_readwrite_F.c | 677 + src/Fortran/H5F.f90 | 215 + src/Fortran/H5Part.c | 219 + src/Fortran/H5PartF.f90 | 127 + src/Fortran/H5Part_F.c | 345 + src/Fortran/H5Part_io.c | 191 + src/Fortran/H5Part_ioF.f90 | 83 + src/Fortran/H5_F.c | 216 + src/Fortran/H5_attribs.c | 649 + src/Fortran/H5_attribsF.f90 | 366 + src/Fortran/H5_attribs_F.c | 561 + src/Fortran/H5_constF.f90 | 61 + src/Fortran/Makefile.am | 59 + src/Fortran/TestUnderscore.f | 12 + src/Fortran/TestUnderscoreC.c | 36 + src/Fortran/h5_private.h | 83 + src/Makefile.am | 4 + src/h5core/Makefile.am | 114 + src/h5core/h5_attach.c | 336 + src/h5core/h5_attribs.c | 351 + src/h5core/h5_attribs_private.h | 42 + src/h5core/h5_debug_private.h | 48 + src/h5core/h5_errorhandling.c | 243 + src/h5core/h5_errorhandling_private.h | 29 + src/h5core/h5_fcmp.c | 44 + src/h5core/h5_fcmp_private.h | 21 + src/h5core/h5_hdf5.c | 385 + src/h5core/h5_hdf5_private.h | 1453 + src/h5core/h5_hsearch.c | 380 + src/h5core/h5_hsearch_private.h | 77 + src/h5core/h5_init.c | 689 + src/h5core/h5_init_private.h | 29 + src/h5core/h5_lustre.c | 170 + src/h5core/h5_lustre_private.h | 19 + src/h5core/h5_maps.c | 271 + src/h5core/h5_maps_private.h | 213 + src/h5core/h5_model.c | 224 + src/h5core/h5_model_private.h | 45 + src/h5core/h5_mpi.c | 246 + src/h5core/h5_mpi_private.h | 299 + src/h5core/h5_openclose.c | 634 + src/h5core/h5_private.h | 22 + src/h5core/h5_qsort.c | 197 + src/h5core/h5_qsort_private.h | 31 + src/h5core/h5_qsort_r.c | 8 + src/h5core/h5_readwrite.c | 157 + src/h5core/h5_readwrite_private.h | 96 + src/h5core/h5_syscall.c | 42 + src/h5core/h5_syscall_private.h | 28 + src/h5core/h5_types_private.h | 77 + src/h5core/h5_va_macros.h | 25 + src/h5core/h5b_attribs.c | 252 + src/h5core/h5b_model.c | 1021 + src/h5core/h5b_model_private.h | 48 + src/h5core/h5b_readwrite.c | 458 + src/h5core/h5b_readwrite_private.h | 24 + src/h5core/h5b_types_private.h | 39 + src/h5core/h5t_access_private.h | 352 + src/h5core/h5t_access_tetm.c | 721 + src/h5core/h5t_access_trim.c | 420 + src/h5core/h5t_adjacencies.c | 56 + src/h5core/h5t_adjacencies_private.h | 44 + src/h5core/h5t_adjacencies_tetm.c | 802 + src/h5core/h5t_adjacencies_trim.c | 466 + src/h5core/h5t_core.c | 431 + src/h5core/h5t_core_private.h | 204 + src/h5core/h5t_core_tetm.c | 289 + src/h5core/h5t_core_trim.c | 276 + src/h5core/h5t_errorhandling_private.h | 53 + src/h5core/h5t_map.c | 571 + src/h5core/h5t_map_private.h | 120 + src/h5core/h5t_model.c | 598 + src/h5core/h5t_model_private.h | 128 + src/h5core/h5t_model_tetm.c | 240 + src/h5core/h5t_model_trim.c | 266 + src/h5core/h5t_octree.c | 3251 ++ src/h5core/h5t_octree_private.h | 180 + src/h5core/h5t_readwrite.c | 3005 + src/h5core/h5t_readwrite_private.h | 147 + src/h5core/h5t_readwrite_tetm.c | 214 + src/h5core/h5t_readwrite_trim.c | 253 + src/h5core/h5t_ref_elements.c | 223 + src/h5core/h5t_ref_elements_private.h | 73 + src/h5core/h5t_retrieve.c | 364 + src/h5core/h5t_retrieve_private.h | 34 + src/h5core/h5t_retrieve_tetm.c | 47 + src/h5core/h5t_retrieve_trim.c | 43 + src/h5core/h5t_store.c | 2744 + src/h5core/h5t_store_private.h | 85 + src/h5core/h5t_store_tetm.c | 342 + src/h5core/h5t_store_trim.c | 292 + src/h5core/h5t_tags.c | 896 + src/h5core/h5t_tags_private.h | 102 + src/h5core/h5t_types_private.h | 330 + src/h5core/h5u_errorhandling_private.h | 17 + src/h5core/h5u_model.c | 630 + src/h5core/h5u_readwrite.c | 243 + src/h5core/h5u_readwrite_private.h | 24 + src/h5core/h5u_types_private.h | 29 + src/include/H5.h | 366 + src/include/H5Block.h | 41 + src/include/H5Block_attribs.h | 733 + src/include/H5Block_io.h | 464 + src/include/H5Block_model.h | 425 + src/include/H5Fed.h | 137 + src/include/H5Fed_adjacency.h | 48 + src/include/H5Fed_model.h | 184 + src/include/H5Fed_retrieve.h | 218 + src/include/H5Fed_store.h | 218 + src/include/H5Fed_tags.h | 221 + src/include/H5Part.h | 16 + src/include/H5Part_io.h | 274 + src/include/H5Part_model.h | 395 + src/include/H5_attribs.h | 650 + src/include/H5_model.h | 314 + src/include/H5hut.h | 18 + src/include/Makefile.am | 29 + src/include/h5core/h5.h | 123 + src/include/h5core/h5_attribs.h | 57 + src/include/h5core/h5_debug.h | 142 + src/include/h5core/h5_errorhandling.h | 321 + src/include/h5core/h5_model.h | 55 + src/include/h5core/h5_syscall.h | 97 + src/include/h5core/h5_types.h | 162 + src/include/h5core/h5b_attribs.h | 55 + src/include/h5core/h5b_io.h | 43 + src/include/h5core/h5b_model.h | 102 + src/include/h5core/h5t_adjacencies.h | 45 + src/include/h5core/h5t_map.h | 117 + src/include/h5core/h5t_model.h | 92 + src/include/h5core/h5t_octree.h | 58 + src/include/h5core/h5t_retrieve.h | 96 + src/include/h5core/h5t_store.h | 83 + src/include/h5core/h5t_tags.h | 57 + src/include/h5core/h5u_io.h | 34 + src/include/h5core/h5u_model.h | 101 + test/Makefile.am | 38 + test/h5_attach_test.c | 34 + test/h5b_read.c | 283 + test/h5b_test.c | 118 + test/h5b_write.c | 225 + test/h5u_read.c | 536 + test/h5u_test.c | 73 + test/h5u_write.c | 466 + test/params.h | 27 + test/testframe.c | 679 + test/testframe.h | 181 + tools/H5PartMerge/AUTHORS | 1 + tools/H5PartMerge/COPYING | 0 tools/H5PartMerge/ChangeLog | 0 tools/H5PartMerge/INSTALL | 17 + tools/H5PartMerge/NEWS | 0 tools/H5PartMerge/README | 0 tools/H5PartMerge/autogen.sh | 7 + tools/H5PartMerge/configure.ac | 160 + tools/H5PartMerge/makefile.am | 13 + tools/H5PartMerge/src/H5merge.cpp | 897 + tools/H5PartMerge/src/optparse.cpp | 309 + tools/H5PartMerge/src/optparse.hh | 180 + tools/Makefile.am | 34 + tools/README | 356 + tools/h5PartDcToVtk.cc | 655 + tools/h5PartSurfaceToVtk.cc | 528 + tools/h5hutcc.in | 276 + tools/h5pAttrib.cc | 1267 + tools/h5pToGNUplot.cc | 461 + tools/vtk2h5grid/Makefile.am | 16 + tools/vtk2h5grid/vtk2h5grid.cc | 203 + visit_plugins/databases/H5Part/.depend | 626 + visit_plugins/databases/H5Part/Makefile | 104 + visit_plugins/databases/H5Part/README.txt | 21 + .../databases/H5Part/avth5partFileFormat.C | 597 + .../databases/H5Part/avth5partFileFormat.h | 77 + visit_plugins/databases/H5Part/h5part.xml | 14 + .../databases/H5Part/h5partCommonPluginInfo.C | 65 + .../databases/H5Part/h5partEnginePluginInfo.C | 39 + .../H5Part/h5partMDServerPluginInfo.C | 25 + .../databases/H5Part/h5partPluginInfo.C | 124 + .../databases/H5Part/h5partPluginInfo.h | 60 + visit_plugins/operators/BinnerFilter/.depend | 1505 + .../operators/BinnerFilter/Binner.xml | 11 + .../BinnerFilter/BinnerCommonPluginInfo.C | 47 + .../BinnerFilter/BinnerEnginePluginInfo.C | 44 + .../operators/BinnerFilter/BinnerFilter.C | 535 + .../operators/BinnerFilter/BinnerFilter.h | 66 + .../operators/BinnerFilter/BinnerFilter.java | 116 + .../BinnerFilter/BinnerGUIPluginInfo.C | 92 + .../operators/BinnerFilter/BinnerMakefile | 113 + .../operators/BinnerFilter/BinnerPluginInfo.C | 107 + .../operators/BinnerFilter/BinnerPluginInfo.h | 85 + .../BinnerFilter/BinnerScriptingPluginInfo.C | 142 + .../BinnerFilter/BinnerViewerPluginInfo.C | 175 + .../operators/BinnerFilter/Binnerreplace.txt | 1 + visit_plugins/operators/BinnerFilter/Makefile | 114 + .../operators/BinnerFilter/PyBinner.C | 422 + .../operators/BinnerFilter/PyBinner.h | 21 + .../operators/BinnerFilter/QvisBinnerWindow.C | 279 + .../operators/BinnerFilter/QvisBinnerWindow.h | 67 + .../operators/BinnerFilter/avtBinnerFilter.C | 350 + .../operators/BinnerFilter/avtBinnerFilter.h | 68 + visit_plugins/operators/BinnerFilter/icon.xpm | 519 + visit_plugins/operators/RandomSample/.depend | 1519 + .../H5PartRandomSampleAttributes.C | 470 + .../H5PartRandomSampleAttributes.h | 60 + .../H5PartRandomSampleAttributes.java | 76 + .../H5PartRandomSampleCommonPluginInfo.C | 47 + .../H5PartRandomSampleEnginePluginInfo.C | 44 + .../H5PartRandomSampleGUIPluginInfo.C | 92 + .../H5PartRandomSamplePluginInfo.C | 107 + .../H5PartRandomSamplePluginInfo.h | 85 + .../H5PartRandomSampleScriptingPluginInfo.C | 142 + .../H5PartRandomSampleViewerPluginInfo.C | 175 + visit_plugins/operators/RandomSample/Makefile | 113 + .../PyH5PartRandomSampleAttributes.C | 358 + .../PyH5PartRandomSampleAttributes.h | 21 + .../QvisH5PartRandomSampleWindow.C | 199 + .../QvisH5PartRandomSampleWindow.h | 61 + .../operators/RandomSample/RandomSample.xml | 8 + .../avtH5PartRandomSampleFilter.C | 177 + .../avtH5PartRandomSampleFilter.h | 58 + visit_plugins/operators/RandomSample/icon.xpm | 23828 ++++++++ 632 files changed, 273799 insertions(+) create mode 100644 .gitattributes create mode 100644 .gitignore create mode 100644 AUTHORS create mode 100644 COPYING create mode 100644 ChangeLog create mode 100644 Makefile.am create mode 100644 NEWS create mode 100644 README create mode 100755 autogen.sh create mode 100644 configure.ac create mode 100644 doc/Doxyfile create mode 100644 doc/DoxygenLayout.xml create mode 100644 doc/Examples/meshexample.dxf create mode 100644 doc/Examples/meshexample.txt create mode 100644 doc/Examples/simple_tet.vtk create mode 100644 doc/Examples/simple_tet_level0.vtk create mode 100644 doc/Examples/simple_tet_level1.vtk create mode 100644 doc/Examples/simple_tet_level2.vtk create mode 100644 doc/Examples/trimesh_dgraph_level0.metis create mode 100644 doc/Examples/trimesh_dgraph_level0.metis.part.2 create mode 100644 doc/Examples/trimesh_dgraph_level0.metis.part.3 create mode 100644 doc/Examples/trimesh_dnode_level1.metis create mode 100644 doc/Examples/trimesh_dnode_level1.metis.part.2 create mode 100644 doc/Examples/trimesh_level0.metis create mode 100644 doc/Examples/trimesh_level0.metis.epart.2 create mode 100644 doc/Examples/trimesh_level0.metis.ngraph create mode 100644 doc/Examples/trimesh_level0.metis.npart.2 create mode 100644 doc/Examples/trimesh_level1.metis create mode 100644 doc/Examples/trimesh_level1.metis.part.2 create mode 100644 doc/H5.dox create mode 100644 doc/H5X_File_Format.txt create mode 100644 doc/Makefile.am create mode 100644 doc/TracFooter.html create mode 100644 doc/TracHeader.html create mode 100644 doc/doxyfooter create mode 100644 doc/doxyheader create mode 100755 doc/html2twiki create mode 100644 doc/meshexample.dxf create mode 100755 doc/postprocess.py create mode 100644 doc/tetrahedron_refinements/1-edge/edge_01_refined/01.png create mode 100644 doc/tetrahedron_refinements/1-edge/edge_01_refined/01.pvsm create mode 100644 doc/tetrahedron_refinements/1-edge/edge_01_refined/01.txt create mode 100644 doc/tetrahedron_refinements/1-edge/edge_01_refined/01.vtk create mode 100644 doc/tetrahedron_refinements/1-edge/edge_01_refined/01_smal.png create mode 100644 doc/tetrahedron_refinements/1-edge/edge_01_refined/01_small.png create mode 100644 doc/tetrahedron_refinements/1-edge/edge_12_refined/12.png create mode 100644 doc/tetrahedron_refinements/1-edge/edge_12_refined/12.pvsm create mode 100644 doc/tetrahedron_refinements/1-edge/edge_12_refined/12.txt create mode 100644 doc/tetrahedron_refinements/1-edge/edge_12_refined/12.vtk create mode 100644 doc/tetrahedron_refinements/1-edge/edge_12_refined/12_small.png create mode 100644 doc/tetrahedron_refinements/1-edge/edge_20_refined/20.png create mode 100644 doc/tetrahedron_refinements/1-edge/edge_20_refined/20.pvsm create mode 100644 doc/tetrahedron_refinements/1-edge/edge_20_refined/20.txt create mode 100644 doc/tetrahedron_refinements/1-edge/edge_20_refined/20.vtk create mode 100644 doc/tetrahedron_refinements/1-edge/edge_20_refined/20_small.png create mode 100644 doc/tetrahedron_refinements/1-edge/edge_23_refined/23.png create mode 100644 doc/tetrahedron_refinements/1-edge/edge_23_refined/23.pvsm create mode 100644 doc/tetrahedron_refinements/1-edge/edge_23_refined/23.txt create mode 100644 doc/tetrahedron_refinements/1-edge/edge_23_refined/23.vtk create mode 100644 doc/tetrahedron_refinements/1-edge/edge_23_refined/23_small.png create mode 100644 doc/tetrahedron_refinements/1-edge/edge_30_refined/30.png create mode 100644 doc/tetrahedron_refinements/1-edge/edge_30_refined/30.pvsm create mode 100644 doc/tetrahedron_refinements/1-edge/edge_30_refined/30.txt create mode 100644 doc/tetrahedron_refinements/1-edge/edge_30_refined/30.vtk create mode 100644 doc/tetrahedron_refinements/1-edge/edge_30_refined/30_small.png create mode 100644 doc/tetrahedron_refinements/1-edge/edge_31_refined/31.png create mode 100644 doc/tetrahedron_refinements/1-edge/edge_31_refined/31.pvsm create mode 100644 doc/tetrahedron_refinements/1-edge/edge_31_refined/31.txt create mode 100644 doc/tetrahedron_refinements/1-edge/edge_31_refined/31.vtk create mode 100644 doc/tetrahedron_refinements/1-edge/edge_31_refined/31_small.png create mode 100644 doc/tetrahedron_refinements/2-edges/edge_01-12_refined/01-12.png create mode 100644 doc/tetrahedron_refinements/2-edges/edge_01-12_refined/01-12.pvsm create mode 100644 doc/tetrahedron_refinements/2-edges/edge_01-12_refined/01-12.txt create mode 100644 doc/tetrahedron_refinements/2-edges/edge_01-12_refined/01-12.vtk create mode 100644 doc/tetrahedron_refinements/2-edges/edge_01-12_refined/01-12_smal.png create mode 100644 doc/tetrahedron_refinements/2-edges/edge_01-12_refined/01-12_small.png create mode 100644 doc/tetrahedron_refinements/2-edges/edge_01-20_refined/01-20.png create mode 100644 doc/tetrahedron_refinements/2-edges/edge_01-20_refined/01-20.pvsm create mode 100644 doc/tetrahedron_refinements/2-edges/edge_01-20_refined/01-20.txt create mode 100644 doc/tetrahedron_refinements/2-edges/edge_01-20_refined/01-20.vtk create mode 100644 doc/tetrahedron_refinements/2-edges/edge_01-20_refined/01-20_small.png create mode 100644 doc/tetrahedron_refinements/2-edges/edge_01-23_refined/01-23.png create mode 100644 doc/tetrahedron_refinements/2-edges/edge_01-23_refined/01-23.pvsm create mode 100644 doc/tetrahedron_refinements/2-edges/edge_01-23_refined/01-23.txt create mode 100644 doc/tetrahedron_refinements/2-edges/edge_01-23_refined/01-23.vtk create mode 100644 doc/tetrahedron_refinements/2-edges/edge_01-23_refined/01-23_smal.png create mode 100644 doc/tetrahedron_refinements/2-edges/edge_01-23_refined/01-23_small.png create mode 100644 doc/tetrahedron_refinements/2-edges/edge_01-30_refined/01-30.png create mode 100644 doc/tetrahedron_refinements/2-edges/edge_01-30_refined/01-30.pvsm create mode 100644 doc/tetrahedron_refinements/2-edges/edge_01-30_refined/01-30.txt create mode 100644 doc/tetrahedron_refinements/2-edges/edge_01-30_refined/01-30.vtk create mode 100644 doc/tetrahedron_refinements/2-edges/edge_01-30_refined/01-30_small.png create mode 100644 doc/tetrahedron_refinements/2-edges/edge_01-31_refined/01-31.png create mode 100644 doc/tetrahedron_refinements/2-edges/edge_01-31_refined/01-31.pvsm create mode 100644 doc/tetrahedron_refinements/2-edges/edge_01-31_refined/01-31.txt create mode 100644 doc/tetrahedron_refinements/2-edges/edge_01-31_refined/01-31.vtk create mode 100644 doc/tetrahedron_refinements/2-edges/edge_01-31_refined/01-31_small.png create mode 100644 doc/tetrahedron_refinements/2-edges/edge_12-20_refined/12-20.png create mode 100644 doc/tetrahedron_refinements/2-edges/edge_12-20_refined/12-20.pvsm create mode 100644 doc/tetrahedron_refinements/2-edges/edge_12-20_refined/12-20.txt create mode 100644 doc/tetrahedron_refinements/2-edges/edge_12-20_refined/12-20.vtk create mode 100644 doc/tetrahedron_refinements/2-edges/edge_12-20_refined/12-20_small.png create mode 100644 doc/tetrahedron_refinements/2-edges/edge_12-23_refined/12-23.png create mode 100644 doc/tetrahedron_refinements/2-edges/edge_12-23_refined/12-23.pvsm create mode 100644 doc/tetrahedron_refinements/2-edges/edge_12-23_refined/12-23.txt create mode 100644 doc/tetrahedron_refinements/2-edges/edge_12-23_refined/12-23.vtk create mode 100644 doc/tetrahedron_refinements/2-edges/edge_12-23_refined/12-23_small.png create mode 100644 doc/tetrahedron_refinements/2-edges/edge_12-30_refined/12-30.png create mode 100644 doc/tetrahedron_refinements/2-edges/edge_12-30_refined/12-30.pvsm create mode 100644 doc/tetrahedron_refinements/2-edges/edge_12-30_refined/12-30.txt create mode 100644 doc/tetrahedron_refinements/2-edges/edge_12-30_refined/12-30.vtk create mode 100644 doc/tetrahedron_refinements/2-edges/edge_12-30_refined/12-30_small.png create mode 100644 doc/tetrahedron_refinements/2-edges/edge_12-31_refined/12-31.png create mode 100644 doc/tetrahedron_refinements/2-edges/edge_12-31_refined/12-31.pvsm create mode 100644 doc/tetrahedron_refinements/2-edges/edge_12-31_refined/12-31.txt create mode 100644 doc/tetrahedron_refinements/2-edges/edge_12-31_refined/12-31.vtk create mode 100644 doc/tetrahedron_refinements/2-edges/edge_12-31_refined/12-31_small.png create mode 100644 doc/tetrahedron_refinements/2-edges/edge_20-23_refined/20-23.png create mode 100644 doc/tetrahedron_refinements/2-edges/edge_20-23_refined/20-23.pvsm create mode 100644 doc/tetrahedron_refinements/2-edges/edge_20-23_refined/20-23.txt create mode 100644 doc/tetrahedron_refinements/2-edges/edge_20-23_refined/20-23.vtk create mode 100644 doc/tetrahedron_refinements/2-edges/edge_20-23_refined/20-23_small.png create mode 100644 doc/tetrahedron_refinements/2-edges/edge_20-30_refined/20-30.png create mode 100644 doc/tetrahedron_refinements/2-edges/edge_20-30_refined/20-30.pvsm create mode 100644 doc/tetrahedron_refinements/2-edges/edge_20-30_refined/20-30.txt create mode 100644 doc/tetrahedron_refinements/2-edges/edge_20-30_refined/20-30.vtk create mode 100644 doc/tetrahedron_refinements/2-edges/edge_20-30_refined/20-30_small.png create mode 100644 doc/tetrahedron_refinements/2-edges/edge_20-31_refined/20-31.png create mode 100644 doc/tetrahedron_refinements/2-edges/edge_20-31_refined/20-31.pvsm create mode 100644 doc/tetrahedron_refinements/2-edges/edge_20-31_refined/20-31.txt create mode 100644 doc/tetrahedron_refinements/2-edges/edge_20-31_refined/20-31.vtk create mode 100644 doc/tetrahedron_refinements/2-edges/edge_20-31_refined/20-31_small.png create mode 100644 doc/tetrahedron_refinements/2-edges/edge_23-30_refined/23-30.png create mode 100644 doc/tetrahedron_refinements/2-edges/edge_23-30_refined/23-30.pvsm create mode 100644 doc/tetrahedron_refinements/2-edges/edge_23-30_refined/23-30.txt create mode 100644 doc/tetrahedron_refinements/2-edges/edge_23-30_refined/23-30.vtk create mode 100644 doc/tetrahedron_refinements/2-edges/edge_23-30_refined/23-30_small.png create mode 100644 doc/tetrahedron_refinements/2-edges/edge_23-31_refined/23-31.png create mode 100644 doc/tetrahedron_refinements/2-edges/edge_23-31_refined/23-31.pvsm create mode 100644 doc/tetrahedron_refinements/2-edges/edge_23-31_refined/23-31.txt create mode 100644 doc/tetrahedron_refinements/2-edges/edge_23-31_refined/23-31.vtk create mode 100644 doc/tetrahedron_refinements/2-edges/edge_23-31_refined/23-31_small.png create mode 100644 doc/tetrahedron_refinements/2-edges/edge_30-31_refined/30-31.png create mode 100644 doc/tetrahedron_refinements/2-edges/edge_30-31_refined/30-31.pvsm create mode 100644 doc/tetrahedron_refinements/2-edges/edge_30-31_refined/30-31.txt create mode 100644 doc/tetrahedron_refinements/2-edges/edge_30-31_refined/30-31.vtk create mode 100644 doc/tetrahedron_refinements/2-edges/edge_30-31_refined/30-31_small.png create mode 100644 doc/tetrahedron_refinements/3-edges/edge_01-12-20_refined/01-12-20.png create mode 100644 doc/tetrahedron_refinements/3-edges/edge_01-12-20_refined/01-12-20.pvsm create mode 100644 doc/tetrahedron_refinements/3-edges/edge_01-12-20_refined/01-12-20.txt create mode 100644 doc/tetrahedron_refinements/3-edges/edge_01-12-20_refined/01-12-20.vtk create mode 100644 doc/tetrahedron_refinements/3-edges/edge_01-12-20_refined/01-12-20_small.png create mode 100644 doc/tetrahedron_refinements/3-edges/edge_01-12-23_refined/01-12-23.png create mode 100644 doc/tetrahedron_refinements/3-edges/edge_01-12-23_refined/01-12-23.pvsm create mode 100644 doc/tetrahedron_refinements/3-edges/edge_01-12-23_refined/01-12-23.txt create mode 100644 doc/tetrahedron_refinements/3-edges/edge_01-12-23_refined/01-12-23.vtk create mode 100644 doc/tetrahedron_refinements/3-edges/edge_01-12-23_refined/01-12-23_small.png create mode 100644 doc/tetrahedron_refinements/3-edges/edge_01-12-30_refined/01-12-30.png create mode 100644 doc/tetrahedron_refinements/3-edges/edge_01-12-30_refined/01-12-30.pvsm create mode 100644 doc/tetrahedron_refinements/3-edges/edge_01-12-30_refined/01-12-30.txt create mode 100644 doc/tetrahedron_refinements/3-edges/edge_01-12-30_refined/01-12-30.vtk create mode 100644 doc/tetrahedron_refinements/3-edges/edge_01-12-30_refined/01-12-30_small.png create mode 100644 doc/tetrahedron_refinements/3-edges/edge_01-12-31_refined/01-12-31.png create mode 100644 doc/tetrahedron_refinements/3-edges/edge_01-12-31_refined/01-12-31.pvsm create mode 100644 doc/tetrahedron_refinements/3-edges/edge_01-12-31_refined/01-12-31.txt create mode 100644 doc/tetrahedron_refinements/3-edges/edge_01-12-31_refined/01-12-31.vtk create mode 100644 doc/tetrahedron_refinements/3-edges/edge_01-12-31_refined/01-12-31_small.png create mode 100644 doc/tetrahedron_refinements/3-edges/edge_01-20-23_refined/01-20-23.png create mode 100644 doc/tetrahedron_refinements/3-edges/edge_01-20-23_refined/01-20-23.pvsm create mode 100644 doc/tetrahedron_refinements/3-edges/edge_01-20-23_refined/01-20-23.txt create mode 100644 doc/tetrahedron_refinements/3-edges/edge_01-20-23_refined/01-20-23.vtk create mode 100644 doc/tetrahedron_refinements/3-edges/edge_01-20-23_refined/01-20-23_small.png create mode 100644 doc/tetrahedron_refinements/3-edges/edge_01-20-30_refined/01-20-30.png create mode 100644 doc/tetrahedron_refinements/3-edges/edge_01-20-30_refined/01-20-30.pvsm create mode 100644 doc/tetrahedron_refinements/3-edges/edge_01-20-30_refined/01-20-30.txt create mode 100644 doc/tetrahedron_refinements/3-edges/edge_01-20-30_refined/01-20-30.vtk create mode 100644 doc/tetrahedron_refinements/3-edges/edge_01-20-30_refined/01-20-30_small.png create mode 100644 doc/tetrahedron_refinements/3-edges/edge_01-20-31_refined/01-20-31.png create mode 100644 doc/tetrahedron_refinements/3-edges/edge_01-20-31_refined/01-20-31.pvsm create mode 100644 doc/tetrahedron_refinements/3-edges/edge_01-20-31_refined/01-20-31.txt create mode 100644 doc/tetrahedron_refinements/3-edges/edge_01-20-31_refined/01-20-31.vtk create mode 100644 doc/tetrahedron_refinements/3-edges/edge_01-20-31_refined/01-20-31_small.png create mode 100644 doc/tetrahedron_refinements/3-edges/edge_01-23-30_refined/01-23-30.png create mode 100644 doc/tetrahedron_refinements/3-edges/edge_01-23-30_refined/01-23-30.pvsm create mode 100644 doc/tetrahedron_refinements/3-edges/edge_01-23-30_refined/01-23-30.txt create mode 100644 doc/tetrahedron_refinements/3-edges/edge_01-23-30_refined/01-23-30.vtk create mode 100644 doc/tetrahedron_refinements/3-edges/edge_01-23-30_refined/01-23-30_small.png create mode 100644 doc/tetrahedron_refinements/3-edges/edge_01-23-31_refined/01-23-31.png create mode 100644 doc/tetrahedron_refinements/3-edges/edge_01-23-31_refined/01-23-31.pvsm create mode 100644 doc/tetrahedron_refinements/3-edges/edge_01-23-31_refined/01-23-31.txt create mode 100644 doc/tetrahedron_refinements/3-edges/edge_01-23-31_refined/01-23-31.vtk create mode 100644 doc/tetrahedron_refinements/3-edges/edge_01-23-31_refined/01-23-31_small.png create mode 100644 doc/tetrahedron_refinements/3-edges/edge_01-30-31_refined/01-30-31.png create mode 100644 doc/tetrahedron_refinements/3-edges/edge_01-30-31_refined/01-30-31.pvsm create mode 100644 doc/tetrahedron_refinements/3-edges/edge_01-30-31_refined/01-30-31.txt create mode 100644 doc/tetrahedron_refinements/3-edges/edge_01-30-31_refined/01-30-31.vtk create mode 100644 doc/tetrahedron_refinements/3-edges/edge_01-30-31_refined/01-30-31_small.png create mode 100644 doc/tetrahedron_refinements/3-edges/edge_12-20-23_refined/12-20-23.png create mode 100644 doc/tetrahedron_refinements/3-edges/edge_12-20-23_refined/12-20-23.pvsm create mode 100644 doc/tetrahedron_refinements/3-edges/edge_12-20-23_refined/12-20-23.txt create mode 100644 doc/tetrahedron_refinements/3-edges/edge_12-20-23_refined/12-20-23.vtk create mode 100644 doc/tetrahedron_refinements/3-edges/edge_12-20-23_refined/12-20-23_small.png create mode 100644 doc/tetrahedron_refinements/3-edges/edge_12-20-30_refined/12-20-30.png create mode 100644 doc/tetrahedron_refinements/3-edges/edge_12-20-30_refined/12-20-30.pvsm create mode 100644 doc/tetrahedron_refinements/3-edges/edge_12-20-30_refined/12-20-30.txt create mode 100644 doc/tetrahedron_refinements/3-edges/edge_12-20-30_refined/12-20-30.vtk create mode 100644 doc/tetrahedron_refinements/3-edges/edge_12-20-30_refined/12-20-30_small.png create mode 100644 doc/tetrahedron_refinements/3-edges/edge_12-20-31_refined/12-20-31.png create mode 100644 doc/tetrahedron_refinements/3-edges/edge_12-20-31_refined/12-20-31.pvsm create mode 100644 doc/tetrahedron_refinements/3-edges/edge_12-20-31_refined/12-20-31.txt create mode 100644 doc/tetrahedron_refinements/3-edges/edge_12-20-31_refined/12-20-31.vtk create mode 100644 doc/tetrahedron_refinements/3-edges/edge_12-20-31_refined/12-20-31_small.png create mode 100644 doc/tetrahedron_refinements/3-edges/edge_12-23-30_refined/12-23-30.png create mode 100644 doc/tetrahedron_refinements/3-edges/edge_12-23-30_refined/12-23-30.pvsm create mode 100644 doc/tetrahedron_refinements/3-edges/edge_12-23-30_refined/12-23-30.txt create mode 100644 doc/tetrahedron_refinements/3-edges/edge_12-23-30_refined/12-23-30.vtk create mode 100644 doc/tetrahedron_refinements/3-edges/edge_12-23-30_refined/12-23-30_small.png create mode 100644 doc/tetrahedron_refinements/3-edges/edge_12-23-31_refined/12-23-31.png create mode 100644 doc/tetrahedron_refinements/3-edges/edge_12-23-31_refined/12-23-31.pvsm create mode 100644 doc/tetrahedron_refinements/3-edges/edge_12-23-31_refined/12-23-31.txt create mode 100644 doc/tetrahedron_refinements/3-edges/edge_12-23-31_refined/12-23-31.vtk create mode 100644 doc/tetrahedron_refinements/3-edges/edge_12-23-31_refined/12-23-31_small.png create mode 100644 doc/tetrahedron_refinements/3-edges/edge_12-30-31_refined/12-30-31.png create mode 100644 doc/tetrahedron_refinements/3-edges/edge_12-30-31_refined/12-30-31.pvsm create mode 100644 doc/tetrahedron_refinements/3-edges/edge_12-30-31_refined/12-30-31.txt create mode 100644 doc/tetrahedron_refinements/3-edges/edge_12-30-31_refined/12-30-31.vtk create mode 100644 doc/tetrahedron_refinements/3-edges/edge_12-30-31_refined/12-30-31_small.png create mode 100644 doc/tetrahedron_refinements/3-edges/edge_20-23-30_refined/20-23-30.png create mode 100644 doc/tetrahedron_refinements/3-edges/edge_20-23-30_refined/20-23-30.pvsm create mode 100644 doc/tetrahedron_refinements/3-edges/edge_20-23-30_refined/20-23-30.txt create mode 100644 doc/tetrahedron_refinements/3-edges/edge_20-23-30_refined/20-23-30.vtk create mode 100644 doc/tetrahedron_refinements/3-edges/edge_20-23-30_refined/20-23-30_small.png create mode 100644 doc/tetrahedron_refinements/3-edges/edge_20-23-31_refined/20-23-31.png create mode 100644 doc/tetrahedron_refinements/3-edges/edge_20-23-31_refined/20-23-31.pvsm create mode 100644 doc/tetrahedron_refinements/3-edges/edge_20-23-31_refined/20-23-31.txt create mode 100644 doc/tetrahedron_refinements/3-edges/edge_20-23-31_refined/20-23-31.vtk create mode 100644 doc/tetrahedron_refinements/3-edges/edge_20-23-31_refined/20-23-31_small.png create mode 100644 doc/tetrahedron_refinements/3-edges/edge_20-30-31_refined/20-30-31.png create mode 100644 doc/tetrahedron_refinements/3-edges/edge_20-30-31_refined/20-30-31.pvsm create mode 100644 doc/tetrahedron_refinements/3-edges/edge_20-30-31_refined/20-30-31.txt create mode 100644 doc/tetrahedron_refinements/3-edges/edge_20-30-31_refined/20-30-31.vtk create mode 100644 doc/tetrahedron_refinements/3-edges/edge_20-30-31_refined/20-30-31_small.png create mode 100644 doc/tetrahedron_refinements/3-edges/edge_23-30-31_refined/23-30-31.png create mode 100644 doc/tetrahedron_refinements/3-edges/edge_23-30-31_refined/23-30-31.pvsm create mode 100644 doc/tetrahedron_refinements/3-edges/edge_23-30-31_refined/23-30-31.txt create mode 100644 doc/tetrahedron_refinements/3-edges/edge_23-30-31_refined/23-30-31.vtk create mode 100644 doc/tetrahedron_refinements/3-edges/edge_23-30-31_refined/23-30-31_small.png create mode 100644 doc/tetrahedron_refinements/4-edges/edge_01-12-20-23_refined/01-12-20-23.png create mode 100644 doc/tetrahedron_refinements/4-edges/edge_01-12-20-23_refined/01-12-20-23.pvsm create mode 100644 doc/tetrahedron_refinements/4-edges/edge_01-12-20-23_refined/01-12-20-23.txt create mode 100644 doc/tetrahedron_refinements/4-edges/edge_01-12-20-23_refined/01-12-20-23.vtk create mode 100644 doc/tetrahedron_refinements/4-edges/edge_01-12-20-23_refined/01-12-20-23_small.png create mode 100644 doc/tetrahedron_refinements/4-edges/edge_01-12-20-30_refined/01-12-20-30.png create mode 100644 doc/tetrahedron_refinements/4-edges/edge_01-12-20-30_refined/01-12-20-30.pvsm create mode 100644 doc/tetrahedron_refinements/4-edges/edge_01-12-20-30_refined/01-12-20-30.txt create mode 100644 doc/tetrahedron_refinements/4-edges/edge_01-12-20-30_refined/01-12-20-30.vtk create mode 100644 doc/tetrahedron_refinements/4-edges/edge_01-12-20-30_refined/01-12-20-30_small.png create mode 100644 doc/tetrahedron_refinements/4-edges/edge_01-12-20-31_refined/01-12-20-31.png create mode 100644 doc/tetrahedron_refinements/4-edges/edge_01-12-20-31_refined/01-12-20-31.pvsm create mode 100644 doc/tetrahedron_refinements/4-edges/edge_01-12-20-31_refined/01-12-20-31.txt create mode 100644 doc/tetrahedron_refinements/4-edges/edge_01-12-20-31_refined/01-12-20-31.vtk create mode 100644 doc/tetrahedron_refinements/4-edges/edge_01-12-20-31_refined/01-12-20-31_small.png create mode 100644 doc/tetrahedron_refinements/4-edges/edge_01-12-23-30_refined/01-12-23-30.png create mode 100644 doc/tetrahedron_refinements/4-edges/edge_01-12-23-30_refined/01-12-23-30.pvsm create mode 100644 doc/tetrahedron_refinements/4-edges/edge_01-12-23-30_refined/01-12-23-30.txt create mode 100644 doc/tetrahedron_refinements/4-edges/edge_01-12-23-30_refined/01-12-23-30.vtk create mode 100644 doc/tetrahedron_refinements/4-edges/edge_01-12-23-30_refined/01-12-23-30_small.png create mode 100644 doc/tetrahedron_refinements/4-edges/edge_01-12-23-31_refined/01-12-23-31.png create mode 100644 doc/tetrahedron_refinements/4-edges/edge_01-12-23-31_refined/01-12-23-31.pvsm create mode 100644 doc/tetrahedron_refinements/4-edges/edge_01-12-23-31_refined/01-12-23-31.txt create mode 100644 doc/tetrahedron_refinements/4-edges/edge_01-12-23-31_refined/01-12-23-31.vtk create mode 100644 doc/tetrahedron_refinements/4-edges/edge_01-12-23-31_refined/01-12-23-31_small.png create mode 100644 doc/tetrahedron_refinements/4-edges/edge_01-12-30-31_refined/01-12-30-31.png create mode 100644 doc/tetrahedron_refinements/4-edges/edge_01-12-30-31_refined/01-12-30-31.pvsm create mode 100644 doc/tetrahedron_refinements/4-edges/edge_01-12-30-31_refined/01-12-30-31.txt create mode 100644 doc/tetrahedron_refinements/4-edges/edge_01-12-30-31_refined/01-12-30-31.vtk create mode 100644 doc/tetrahedron_refinements/4-edges/edge_01-12-30-31_refined/01-12-30-31_small.png create mode 100644 doc/tetrahedron_refinements/4-edges/edge_01-20-23-30_refined/01-20-23-30.png create mode 100644 doc/tetrahedron_refinements/4-edges/edge_01-20-23-30_refined/01-20-23-30.pvsm create mode 100644 doc/tetrahedron_refinements/4-edges/edge_01-20-23-30_refined/01-20-23-30.txt create mode 100644 doc/tetrahedron_refinements/4-edges/edge_01-20-23-30_refined/01-20-23-30.vtk create mode 100644 doc/tetrahedron_refinements/4-edges/edge_01-20-23-30_refined/01-20-23-30_small.png create mode 100644 doc/tetrahedron_refinements/4-edges/edge_01-20-23-31_refined/01-20-23-31.png create mode 100644 doc/tetrahedron_refinements/4-edges/edge_01-20-23-31_refined/01-20-23-31.pvsm create mode 100644 doc/tetrahedron_refinements/4-edges/edge_01-20-23-31_refined/01-20-23-31.txt create mode 100644 doc/tetrahedron_refinements/4-edges/edge_01-20-23-31_refined/01-20-23-31.vtk create mode 100644 doc/tetrahedron_refinements/4-edges/edge_01-20-23-31_refined/01-20-23-31_small.png create mode 100644 doc/tetrahedron_refinements/4-edges/edge_01-20-30-31_refined/01-20-30-31.png create mode 100644 doc/tetrahedron_refinements/4-edges/edge_01-20-30-31_refined/01-20-30-31.pvsm create mode 100644 doc/tetrahedron_refinements/4-edges/edge_01-20-30-31_refined/01-20-30-31.txt create mode 100644 doc/tetrahedron_refinements/4-edges/edge_01-20-30-31_refined/01-20-30-31.vtk create mode 100644 doc/tetrahedron_refinements/4-edges/edge_01-20-30-31_refined/01-20-30-31_small.png create mode 100644 doc/tetrahedron_refinements/4-edges/edge_01-23-30-31_refined/01-23-30-31.png create mode 100644 doc/tetrahedron_refinements/4-edges/edge_01-23-30-31_refined/01-23-30-31.pvsm create mode 100644 doc/tetrahedron_refinements/4-edges/edge_01-23-30-31_refined/01-23-30-31.txt create mode 100644 doc/tetrahedron_refinements/4-edges/edge_01-23-30-31_refined/01-23-30-31.vtk create mode 100644 doc/tetrahedron_refinements/4-edges/edge_01-23-30-31_refined/01-23-30-31_small.png create mode 100644 doc/tetrahedron_refinements/4-edges/edge_12-20-23-30_refined/12-20-23-30.png create mode 100644 doc/tetrahedron_refinements/4-edges/edge_12-20-23-30_refined/12-20-23-30.pvsm create mode 100644 doc/tetrahedron_refinements/4-edges/edge_12-20-23-30_refined/12-20-23-30.txt create mode 100644 doc/tetrahedron_refinements/4-edges/edge_12-20-23-30_refined/12-20-23-30.vtk create mode 100644 doc/tetrahedron_refinements/4-edges/edge_12-20-23-30_refined/12-20-23-30_small.png create mode 100644 doc/tetrahedron_refinements/4-edges/edge_12-20-23-31_refined/12-20-23-31.png create mode 100644 doc/tetrahedron_refinements/4-edges/edge_12-20-23-31_refined/12-20-23-31.pvsm create mode 100644 doc/tetrahedron_refinements/4-edges/edge_12-20-23-31_refined/12-20-23-31.txt create mode 100644 doc/tetrahedron_refinements/4-edges/edge_12-20-23-31_refined/12-20-23-31.vtk create mode 100644 doc/tetrahedron_refinements/4-edges/edge_12-20-23-31_refined/12-20-23-31_small.png create mode 100644 doc/tetrahedron_refinements/4-edges/edge_12-20-30-31_refined/12-20-30-31.png create mode 100644 doc/tetrahedron_refinements/4-edges/edge_12-20-30-31_refined/12-20-30-31.pvsm create mode 100644 doc/tetrahedron_refinements/4-edges/edge_12-20-30-31_refined/12-20-30-31.txt create mode 100644 doc/tetrahedron_refinements/4-edges/edge_12-20-30-31_refined/12-20-30-31.vtk create mode 100644 doc/tetrahedron_refinements/4-edges/edge_12-20-30-31_refined/12-20-30-31_small.png create mode 100644 doc/tetrahedron_refinements/4-edges/edge_12-23-30-31_refined/12-23-30-31.png create mode 100644 doc/tetrahedron_refinements/4-edges/edge_12-23-30-31_refined/12-23-30-31.pvsm create mode 100644 doc/tetrahedron_refinements/4-edges/edge_12-23-30-31_refined/12-23-30-31.txt create mode 100644 doc/tetrahedron_refinements/4-edges/edge_12-23-30-31_refined/12-23-30-31.vtk create mode 100644 doc/tetrahedron_refinements/4-edges/edge_12-23-30-31_refined/12-23-30-31_small.png create mode 100644 doc/tetrahedron_refinements/4-edges/edge_20-23-30-31_refined/20-23-30-31.png create mode 100644 doc/tetrahedron_refinements/4-edges/edge_20-23-30-31_refined/20-23-30-31.pvsm create mode 100644 doc/tetrahedron_refinements/4-edges/edge_20-23-30-31_refined/20-23-30-31.txt create mode 100644 doc/tetrahedron_refinements/4-edges/edge_20-23-30-31_refined/20-23-30-31.vtk create mode 100644 doc/tetrahedron_refinements/4-edges/edge_20-23-30-31_refined/20-23-30-31_small.png create mode 100644 doc/tetrahedron_refinements/5-edges/edge_01-12-20-23-30_refined/01-12-20-23-30.png create mode 100644 doc/tetrahedron_refinements/5-edges/edge_01-12-20-23-30_refined/01-12-20-23-30.pvsm create mode 100644 doc/tetrahedron_refinements/5-edges/edge_01-12-20-23-30_refined/01-12-20-23-30.txt create mode 100644 doc/tetrahedron_refinements/5-edges/edge_01-12-20-23-30_refined/01-12-20-23-30.vtk create mode 100644 doc/tetrahedron_refinements/5-edges/edge_01-12-20-23-30_refined/01-12-20-23-30_small.png create mode 100644 doc/tetrahedron_refinements/5-edges/edge_01-12-20-23-31_refined/01-12-20-23-31.png create mode 100644 doc/tetrahedron_refinements/5-edges/edge_01-12-20-23-31_refined/01-12-20-23-31.pvsm create mode 100644 doc/tetrahedron_refinements/5-edges/edge_01-12-20-23-31_refined/01-12-20-23-31.txt create mode 100644 doc/tetrahedron_refinements/5-edges/edge_01-12-20-23-31_refined/01-12-20-23-31.vtk create mode 100644 doc/tetrahedron_refinements/5-edges/edge_01-12-20-23-31_refined/01-12-20-23-31_small.png create mode 100644 doc/tetrahedron_refinements/5-edges/edge_01-12-20-30-31_refined/01-12-20-30-31.png create mode 100644 doc/tetrahedron_refinements/5-edges/edge_01-12-20-30-31_refined/01-12-20-30-31.pvsm create mode 100644 doc/tetrahedron_refinements/5-edges/edge_01-12-20-30-31_refined/01-12-20-30-31.txt create mode 100644 doc/tetrahedron_refinements/5-edges/edge_01-12-20-30-31_refined/01-12-20-30-31.vtk create mode 100644 doc/tetrahedron_refinements/5-edges/edge_01-12-20-30-31_refined/01-12-20-30-31_small.png create mode 100644 doc/tetrahedron_refinements/5-edges/edge_01-12-23-30-31_refined/01-12-23-30-31.png create mode 100644 doc/tetrahedron_refinements/5-edges/edge_01-12-23-30-31_refined/01-12-23-30-31.pvsm create mode 100644 doc/tetrahedron_refinements/5-edges/edge_01-12-23-30-31_refined/01-12-23-30-31.txt create mode 100644 doc/tetrahedron_refinements/5-edges/edge_01-12-23-30-31_refined/01-12-23-30-31.vtk create mode 100644 doc/tetrahedron_refinements/5-edges/edge_01-12-23-30-31_refined/01-12-23-30-31_small.png create mode 100644 doc/tetrahedron_refinements/5-edges/edge_01-20-23-30-31_refined/01-20-23-30-31.png create mode 100644 doc/tetrahedron_refinements/5-edges/edge_01-20-23-30-31_refined/01-20-23-30-31.pvsm create mode 100644 doc/tetrahedron_refinements/5-edges/edge_01-20-23-30-31_refined/01-20-23-30-31.txt create mode 100644 doc/tetrahedron_refinements/5-edges/edge_01-20-23-30-31_refined/01-20-23-30-31.vtk create mode 100644 doc/tetrahedron_refinements/5-edges/edge_01-20-23-30-31_refined/01-20-23-30-31_small.png create mode 100644 doc/tetrahedron_refinements/5-edges/edge_12-20-23-30-31_refined/12-20-23-30-31.png create mode 100644 doc/tetrahedron_refinements/5-edges/edge_12-20-23-30-31_refined/12-20-23-30-31.pvsm create mode 100644 doc/tetrahedron_refinements/5-edges/edge_12-20-23-30-31_refined/12-20-23-30-31.txt create mode 100644 doc/tetrahedron_refinements/5-edges/edge_12-20-23-30-31_refined/12-20-23-30-31.vtk create mode 100644 doc/tetrahedron_refinements/5-edges/edge_12-20-23-30-31_refined/12-20-23-30-31_small.png create mode 100644 doc/tetrahedron_refinements/6-edges/edge_01-12-20-23-30-31_refined/01-12-20-23-30-31.aux create mode 100644 doc/tetrahedron_refinements/6-edges/edge_01-12-20-23-30-31_refined/01-12-20-23-30-31.log create mode 100644 doc/tetrahedron_refinements/6-edges/edge_01-12-20-23-30-31_refined/01-12-20-23-30-31.pdf create mode 100644 doc/tetrahedron_refinements/6-edges/edge_01-12-20-23-30-31_refined/01-12-20-23-30-31.png create mode 100644 doc/tetrahedron_refinements/6-edges/edge_01-12-20-23-30-31_refined/01-12-20-23-30-31.pvsm create mode 100644 doc/tetrahedron_refinements/6-edges/edge_01-12-20-23-30-31_refined/01-12-20-23-30-31.tex create mode 100644 doc/tetrahedron_refinements/6-edges/edge_01-12-20-23-30-31_refined/01-12-20-23-30-31.tex.orig create mode 100644 doc/tetrahedron_refinements/6-edges/edge_01-12-20-23-30-31_refined/01-12-20-23-30-31.txt create mode 100644 doc/tetrahedron_refinements/6-edges/edge_01-12-20-23-30-31_refined/01-12-20-23-30-31.vtk create mode 100644 doc/tetrahedron_refinements/6-edges/edge_01-12-20-23-30-31_refined/01-12-20-23-30-31_small.png create mode 100755 doc/tetrahedron_refinements/6-edges/edge_01-12-20-23-30-31_refined/buildlatex.bash create mode 100644 doc/tetrahedron_refinements/6-edges/edge_01-12-20-23-30-31_refined/output_file.jpg create mode 100644 doc/tetrahedron_refinements/README create mode 100755 doc/tetrahedron_refinements/text2vtk.py create mode 100644 examples/H5/Makefile.am create mode 100644 examples/H5/openclose.c create mode 100644 examples/H5Block/H5BlockExample.pbs create mode 100644 examples/H5Block/H5BlockExampleF.f90 create mode 100644 examples/H5Block/Makefile.am create mode 100644 examples/H5Block/README create mode 100644 examples/H5Block/fields.c create mode 100644 examples/H5Block/read_write.c create mode 100644 examples/H5Fed/Makefile.am create mode 100644 examples/H5Fed/map_tet2globalid.c create mode 100644 examples/H5Fed/map_triangle2globalid.c create mode 100644 examples/H5Fed/tetmesh_adjacencies.c create mode 100644 examples/H5Fed/tetmesh_read.c create mode 100644 examples/H5Fed/tetmesh_read_tags.c create mode 100644 examples/H5Fed/tetmesh_write.c create mode 100644 examples/H5Fed/tetmesh_write1.c create mode 100644 examples/H5Fed/tetmesh_write2.c create mode 100644 examples/H5Fed/tetmesh_write_tags.c create mode 100644 examples/H5Fed/trimesh_2gnuplot.c create mode 100644 examples/H5Fed/trimesh_adjacencies.c create mode 100644 examples/H5Fed/trimesh_read.c create mode 100644 examples/H5Fed/trimesh_write.c create mode 100644 examples/H5Fed/trimesh_write_dunetest.c create mode 100644 examples/H5Fed/write_boundary.c create mode 100644 examples/H5Part/Bench.c create mode 100644 examples/H5Part/H5test.c create mode 100644 examples/H5Part/H5testF.f90 create mode 100644 examples/H5Part/Makefile.am create mode 100644 examples/H5Part/core_vfd.c create mode 100644 examples/H5Part/particles.c create mode 100644 examples/H5Part/read_canonicalview.c create mode 100644 examples/H5Part/simplef.f90 create mode 100644 examples/H5Part/stridedf.f90 create mode 100644 examples/H5Part/write_setnumparticles.c create mode 100644 examples/H5Part/write_setview.c create mode 100644 license.txt create mode 100644 src/C/Makefile.am create mode 100644 src/Fortran/H5.c create mode 100755 src/Fortran/H5Block.c create mode 100644 src/Fortran/H5BlockF.f90 create mode 100755 src/Fortran/H5Block_F.c create mode 100644 src/Fortran/H5Block_attribs.c create mode 100644 src/Fortran/H5Block_attribsF.f90 create mode 100644 src/Fortran/H5Block_io.c create mode 100644 src/Fortran/H5Block_ioF.f90 create mode 100644 src/Fortran/H5Block_readwrite_F.c create mode 100644 src/Fortran/H5F.f90 create mode 100755 src/Fortran/H5Part.c create mode 100644 src/Fortran/H5PartF.f90 create mode 100755 src/Fortran/H5Part_F.c create mode 100644 src/Fortran/H5Part_io.c create mode 100644 src/Fortran/H5Part_ioF.f90 create mode 100644 src/Fortran/H5_F.c create mode 100644 src/Fortran/H5_attribs.c create mode 100644 src/Fortran/H5_attribsF.f90 create mode 100644 src/Fortran/H5_attribs_F.c create mode 100644 src/Fortran/H5_constF.f90 create mode 100644 src/Fortran/Makefile.am create mode 100755 src/Fortran/TestUnderscore.f create mode 100755 src/Fortran/TestUnderscoreC.c create mode 100644 src/Fortran/h5_private.h create mode 100644 src/Makefile.am create mode 100644 src/h5core/Makefile.am create mode 100644 src/h5core/h5_attach.c create mode 100644 src/h5core/h5_attribs.c create mode 100644 src/h5core/h5_attribs_private.h create mode 100644 src/h5core/h5_debug_private.h create mode 100644 src/h5core/h5_errorhandling.c create mode 100644 src/h5core/h5_errorhandling_private.h create mode 100644 src/h5core/h5_fcmp.c create mode 100644 src/h5core/h5_fcmp_private.h create mode 100644 src/h5core/h5_hdf5.c create mode 100644 src/h5core/h5_hdf5_private.h create mode 100644 src/h5core/h5_hsearch.c create mode 100644 src/h5core/h5_hsearch_private.h create mode 100644 src/h5core/h5_init.c create mode 100644 src/h5core/h5_init_private.h create mode 100644 src/h5core/h5_lustre.c create mode 100644 src/h5core/h5_lustre_private.h create mode 100644 src/h5core/h5_maps.c create mode 100644 src/h5core/h5_maps_private.h create mode 100644 src/h5core/h5_model.c create mode 100644 src/h5core/h5_model_private.h create mode 100644 src/h5core/h5_mpi.c create mode 100644 src/h5core/h5_mpi_private.h create mode 100644 src/h5core/h5_openclose.c create mode 100644 src/h5core/h5_private.h create mode 100644 src/h5core/h5_qsort.c create mode 100644 src/h5core/h5_qsort_private.h create mode 100644 src/h5core/h5_qsort_r.c create mode 100644 src/h5core/h5_readwrite.c create mode 100644 src/h5core/h5_readwrite_private.h create mode 100644 src/h5core/h5_syscall.c create mode 100644 src/h5core/h5_syscall_private.h create mode 100644 src/h5core/h5_types_private.h create mode 100644 src/h5core/h5_va_macros.h create mode 100644 src/h5core/h5b_attribs.c create mode 100644 src/h5core/h5b_model.c create mode 100644 src/h5core/h5b_model_private.h create mode 100644 src/h5core/h5b_readwrite.c create mode 100644 src/h5core/h5b_readwrite_private.h create mode 100644 src/h5core/h5b_types_private.h create mode 100644 src/h5core/h5t_access_private.h create mode 100644 src/h5core/h5t_access_tetm.c create mode 100644 src/h5core/h5t_access_trim.c create mode 100644 src/h5core/h5t_adjacencies.c create mode 100644 src/h5core/h5t_adjacencies_private.h create mode 100644 src/h5core/h5t_adjacencies_tetm.c create mode 100644 src/h5core/h5t_adjacencies_trim.c create mode 100644 src/h5core/h5t_core.c create mode 100644 src/h5core/h5t_core_private.h create mode 100644 src/h5core/h5t_core_tetm.c create mode 100644 src/h5core/h5t_core_trim.c create mode 100644 src/h5core/h5t_errorhandling_private.h create mode 100644 src/h5core/h5t_map.c create mode 100644 src/h5core/h5t_map_private.h create mode 100644 src/h5core/h5t_model.c create mode 100644 src/h5core/h5t_model_private.h create mode 100644 src/h5core/h5t_model_tetm.c create mode 100644 src/h5core/h5t_model_trim.c create mode 100644 src/h5core/h5t_octree.c create mode 100644 src/h5core/h5t_octree_private.h create mode 100644 src/h5core/h5t_readwrite.c create mode 100644 src/h5core/h5t_readwrite_private.h create mode 100644 src/h5core/h5t_readwrite_tetm.c create mode 100644 src/h5core/h5t_readwrite_trim.c create mode 100644 src/h5core/h5t_ref_elements.c create mode 100644 src/h5core/h5t_ref_elements_private.h create mode 100644 src/h5core/h5t_retrieve.c create mode 100644 src/h5core/h5t_retrieve_private.h create mode 100644 src/h5core/h5t_retrieve_tetm.c create mode 100644 src/h5core/h5t_retrieve_trim.c create mode 100644 src/h5core/h5t_store.c create mode 100644 src/h5core/h5t_store_private.h create mode 100644 src/h5core/h5t_store_tetm.c create mode 100644 src/h5core/h5t_store_trim.c create mode 100644 src/h5core/h5t_tags.c create mode 100644 src/h5core/h5t_tags_private.h create mode 100644 src/h5core/h5t_types_private.h create mode 100644 src/h5core/h5u_errorhandling_private.h create mode 100644 src/h5core/h5u_model.c create mode 100644 src/h5core/h5u_readwrite.c create mode 100644 src/h5core/h5u_readwrite_private.h create mode 100644 src/h5core/h5u_types_private.h create mode 100644 src/include/H5.h create mode 100644 src/include/H5Block.h create mode 100644 src/include/H5Block_attribs.h create mode 100644 src/include/H5Block_io.h create mode 100644 src/include/H5Block_model.h create mode 100644 src/include/H5Fed.h create mode 100644 src/include/H5Fed_adjacency.h create mode 100644 src/include/H5Fed_model.h create mode 100644 src/include/H5Fed_retrieve.h create mode 100644 src/include/H5Fed_store.h create mode 100644 src/include/H5Fed_tags.h create mode 100644 src/include/H5Part.h create mode 100644 src/include/H5Part_io.h create mode 100644 src/include/H5Part_model.h create mode 100644 src/include/H5_attribs.h create mode 100644 src/include/H5_model.h create mode 100644 src/include/H5hut.h create mode 100644 src/include/Makefile.am create mode 100644 src/include/h5core/h5.h create mode 100644 src/include/h5core/h5_attribs.h create mode 100644 src/include/h5core/h5_debug.h create mode 100644 src/include/h5core/h5_errorhandling.h create mode 100644 src/include/h5core/h5_model.h create mode 100644 src/include/h5core/h5_syscall.h create mode 100644 src/include/h5core/h5_types.h create mode 100644 src/include/h5core/h5b_attribs.h create mode 100644 src/include/h5core/h5b_io.h create mode 100644 src/include/h5core/h5b_model.h create mode 100644 src/include/h5core/h5t_adjacencies.h create mode 100644 src/include/h5core/h5t_map.h create mode 100644 src/include/h5core/h5t_model.h create mode 100644 src/include/h5core/h5t_octree.h create mode 100644 src/include/h5core/h5t_retrieve.h create mode 100644 src/include/h5core/h5t_store.h create mode 100644 src/include/h5core/h5t_tags.h create mode 100644 src/include/h5core/h5u_io.h create mode 100644 src/include/h5core/h5u_model.h create mode 100644 test/Makefile.am create mode 100644 test/h5_attach_test.c create mode 100644 test/h5b_read.c create mode 100644 test/h5b_test.c create mode 100644 test/h5b_write.c create mode 100644 test/h5u_read.c create mode 100644 test/h5u_test.c create mode 100644 test/h5u_write.c create mode 100644 test/params.h create mode 100644 test/testframe.c create mode 100644 test/testframe.h create mode 100644 tools/H5PartMerge/AUTHORS create mode 100644 tools/H5PartMerge/COPYING create mode 100644 tools/H5PartMerge/ChangeLog create mode 100644 tools/H5PartMerge/INSTALL create mode 100644 tools/H5PartMerge/NEWS create mode 100644 tools/H5PartMerge/README create mode 100755 tools/H5PartMerge/autogen.sh create mode 100644 tools/H5PartMerge/configure.ac create mode 100644 tools/H5PartMerge/makefile.am create mode 100644 tools/H5PartMerge/src/H5merge.cpp create mode 100644 tools/H5PartMerge/src/optparse.cpp create mode 100644 tools/H5PartMerge/src/optparse.hh create mode 100644 tools/Makefile.am create mode 100644 tools/README create mode 100755 tools/h5PartDcToVtk.cc create mode 100644 tools/h5PartSurfaceToVtk.cc create mode 100755 tools/h5hutcc.in create mode 100644 tools/h5pAttrib.cc create mode 100644 tools/h5pToGNUplot.cc create mode 100644 tools/vtk2h5grid/Makefile.am create mode 100644 tools/vtk2h5grid/vtk2h5grid.cc create mode 100644 visit_plugins/databases/H5Part/.depend create mode 100644 visit_plugins/databases/H5Part/Makefile create mode 100644 visit_plugins/databases/H5Part/README.txt create mode 100644 visit_plugins/databases/H5Part/avth5partFileFormat.C create mode 100644 visit_plugins/databases/H5Part/avth5partFileFormat.h create mode 100644 visit_plugins/databases/H5Part/h5part.xml create mode 100644 visit_plugins/databases/H5Part/h5partCommonPluginInfo.C create mode 100644 visit_plugins/databases/H5Part/h5partEnginePluginInfo.C create mode 100644 visit_plugins/databases/H5Part/h5partMDServerPluginInfo.C create mode 100644 visit_plugins/databases/H5Part/h5partPluginInfo.C create mode 100644 visit_plugins/databases/H5Part/h5partPluginInfo.h create mode 100644 visit_plugins/operators/BinnerFilter/.depend create mode 100644 visit_plugins/operators/BinnerFilter/Binner.xml create mode 100644 visit_plugins/operators/BinnerFilter/BinnerCommonPluginInfo.C create mode 100644 visit_plugins/operators/BinnerFilter/BinnerEnginePluginInfo.C create mode 100644 visit_plugins/operators/BinnerFilter/BinnerFilter.C create mode 100644 visit_plugins/operators/BinnerFilter/BinnerFilter.h create mode 100644 visit_plugins/operators/BinnerFilter/BinnerFilter.java create mode 100644 visit_plugins/operators/BinnerFilter/BinnerGUIPluginInfo.C create mode 100644 visit_plugins/operators/BinnerFilter/BinnerMakefile create mode 100644 visit_plugins/operators/BinnerFilter/BinnerPluginInfo.C create mode 100644 visit_plugins/operators/BinnerFilter/BinnerPluginInfo.h create mode 100644 visit_plugins/operators/BinnerFilter/BinnerScriptingPluginInfo.C create mode 100644 visit_plugins/operators/BinnerFilter/BinnerViewerPluginInfo.C create mode 100644 visit_plugins/operators/BinnerFilter/Binnerreplace.txt create mode 100644 visit_plugins/operators/BinnerFilter/Makefile create mode 100644 visit_plugins/operators/BinnerFilter/PyBinner.C create mode 100644 visit_plugins/operators/BinnerFilter/PyBinner.h create mode 100644 visit_plugins/operators/BinnerFilter/QvisBinnerWindow.C create mode 100644 visit_plugins/operators/BinnerFilter/QvisBinnerWindow.h create mode 100644 visit_plugins/operators/BinnerFilter/avtBinnerFilter.C create mode 100644 visit_plugins/operators/BinnerFilter/avtBinnerFilter.h create mode 100644 visit_plugins/operators/BinnerFilter/icon.xpm create mode 100644 visit_plugins/operators/RandomSample/.depend create mode 100644 visit_plugins/operators/RandomSample/H5PartRandomSampleAttributes.C create mode 100644 visit_plugins/operators/RandomSample/H5PartRandomSampleAttributes.h create mode 100644 visit_plugins/operators/RandomSample/H5PartRandomSampleAttributes.java create mode 100644 visit_plugins/operators/RandomSample/H5PartRandomSampleCommonPluginInfo.C create mode 100644 visit_plugins/operators/RandomSample/H5PartRandomSampleEnginePluginInfo.C create mode 100644 visit_plugins/operators/RandomSample/H5PartRandomSampleGUIPluginInfo.C create mode 100644 visit_plugins/operators/RandomSample/H5PartRandomSamplePluginInfo.C create mode 100644 visit_plugins/operators/RandomSample/H5PartRandomSamplePluginInfo.h create mode 100644 visit_plugins/operators/RandomSample/H5PartRandomSampleScriptingPluginInfo.C create mode 100644 visit_plugins/operators/RandomSample/H5PartRandomSampleViewerPluginInfo.C create mode 100644 visit_plugins/operators/RandomSample/Makefile create mode 100644 visit_plugins/operators/RandomSample/PyH5PartRandomSampleAttributes.C create mode 100644 visit_plugins/operators/RandomSample/PyH5PartRandomSampleAttributes.h create mode 100644 visit_plugins/operators/RandomSample/QvisH5PartRandomSampleWindow.C create mode 100644 visit_plugins/operators/RandomSample/QvisH5PartRandomSampleWindow.h create mode 100644 visit_plugins/operators/RandomSample/RandomSample.xml create mode 100644 visit_plugins/operators/RandomSample/avtH5PartRandomSampleFilter.C create mode 100644 visit_plugins/operators/RandomSample/avtH5PartRandomSampleFilter.h create mode 100644 visit_plugins/operators/RandomSample/icon.xpm diff --git a/.gitattributes b/.gitattributes new file mode 100644 index 0000000..ad28ee7 --- /dev/null +++ b/.gitattributes @@ -0,0 +1,631 @@ +* text=auto !eol +/AUTHORS -text +/COPYING -text +/ChangeLog -text +/Makefile.am -text +/NEWS -text +/README -text +/autogen.sh -text +/configure.ac -text +doc/Doxyfile -text +doc/DoxygenLayout.xml -text +doc/Examples/meshexample.dxf -text +doc/Examples/meshexample.txt -text +doc/Examples/simple_tet.vtk -text +doc/Examples/simple_tet_level0.vtk -text +doc/Examples/simple_tet_level1.vtk -text +doc/Examples/simple_tet_level2.vtk -text +doc/Examples/trimesh_dgraph_level0.metis -text +doc/Examples/trimesh_dgraph_level0.metis.part.2 -text +doc/Examples/trimesh_dgraph_level0.metis.part.3 -text +doc/Examples/trimesh_dnode_level1.metis -text +doc/Examples/trimesh_dnode_level1.metis.part.2 -text +doc/Examples/trimesh_level0.metis -text +doc/Examples/trimesh_level0.metis.epart.2 -text +doc/Examples/trimesh_level0.metis.ngraph -text +doc/Examples/trimesh_level0.metis.npart.2 -text +doc/Examples/trimesh_level1.metis -text +doc/Examples/trimesh_level1.metis.part.2 -text +doc/H5.dox -text +doc/H5X_File_Format.txt -text +doc/Makefile.am -text +doc/TracFooter.html -text +doc/TracHeader.html -text +doc/doxyfooter -text +doc/doxyheader -text +doc/html2twiki -text +doc/meshexample.dxf -text +doc/postprocess.py -text +doc/tetrahedron_refinements/1-edge/edge_01_refined/01.png -text +doc/tetrahedron_refinements/1-edge/edge_01_refined/01.pvsm -text +doc/tetrahedron_refinements/1-edge/edge_01_refined/01.txt -text +doc/tetrahedron_refinements/1-edge/edge_01_refined/01.vtk -text +doc/tetrahedron_refinements/1-edge/edge_01_refined/01_smal.png -text +doc/tetrahedron_refinements/1-edge/edge_01_refined/01_small.png -text +doc/tetrahedron_refinements/1-edge/edge_12_refined/12.png -text +doc/tetrahedron_refinements/1-edge/edge_12_refined/12.pvsm -text +doc/tetrahedron_refinements/1-edge/edge_12_refined/12.txt -text +doc/tetrahedron_refinements/1-edge/edge_12_refined/12.vtk -text +doc/tetrahedron_refinements/1-edge/edge_12_refined/12_small.png -text +doc/tetrahedron_refinements/1-edge/edge_20_refined/20.png -text +doc/tetrahedron_refinements/1-edge/edge_20_refined/20.pvsm -text +doc/tetrahedron_refinements/1-edge/edge_20_refined/20.txt -text +doc/tetrahedron_refinements/1-edge/edge_20_refined/20.vtk -text +doc/tetrahedron_refinements/1-edge/edge_20_refined/20_small.png -text +doc/tetrahedron_refinements/1-edge/edge_23_refined/23.png -text +doc/tetrahedron_refinements/1-edge/edge_23_refined/23.pvsm -text +doc/tetrahedron_refinements/1-edge/edge_23_refined/23.txt -text +doc/tetrahedron_refinements/1-edge/edge_23_refined/23.vtk -text +doc/tetrahedron_refinements/1-edge/edge_23_refined/23_small.png -text +doc/tetrahedron_refinements/1-edge/edge_30_refined/30.png -text +doc/tetrahedron_refinements/1-edge/edge_30_refined/30.pvsm -text +doc/tetrahedron_refinements/1-edge/edge_30_refined/30.txt -text +doc/tetrahedron_refinements/1-edge/edge_30_refined/30.vtk -text +doc/tetrahedron_refinements/1-edge/edge_30_refined/30_small.png -text +doc/tetrahedron_refinements/1-edge/edge_31_refined/31.png -text +doc/tetrahedron_refinements/1-edge/edge_31_refined/31.pvsm -text +doc/tetrahedron_refinements/1-edge/edge_31_refined/31.txt -text +doc/tetrahedron_refinements/1-edge/edge_31_refined/31.vtk -text +doc/tetrahedron_refinements/1-edge/edge_31_refined/31_small.png -text +doc/tetrahedron_refinements/2-edges/edge_01-12_refined/01-12.png -text +doc/tetrahedron_refinements/2-edges/edge_01-12_refined/01-12.pvsm -text +doc/tetrahedron_refinements/2-edges/edge_01-12_refined/01-12.txt -text +doc/tetrahedron_refinements/2-edges/edge_01-12_refined/01-12.vtk -text +doc/tetrahedron_refinements/2-edges/edge_01-12_refined/01-12_smal.png -text +doc/tetrahedron_refinements/2-edges/edge_01-12_refined/01-12_small.png -text +doc/tetrahedron_refinements/2-edges/edge_01-20_refined/01-20.png -text +doc/tetrahedron_refinements/2-edges/edge_01-20_refined/01-20.pvsm -text +doc/tetrahedron_refinements/2-edges/edge_01-20_refined/01-20.txt -text +doc/tetrahedron_refinements/2-edges/edge_01-20_refined/01-20.vtk -text +doc/tetrahedron_refinements/2-edges/edge_01-20_refined/01-20_small.png -text +doc/tetrahedron_refinements/2-edges/edge_01-23_refined/01-23.png -text +doc/tetrahedron_refinements/2-edges/edge_01-23_refined/01-23.pvsm -text +doc/tetrahedron_refinements/2-edges/edge_01-23_refined/01-23.txt -text +doc/tetrahedron_refinements/2-edges/edge_01-23_refined/01-23.vtk -text +doc/tetrahedron_refinements/2-edges/edge_01-23_refined/01-23_smal.png -text +doc/tetrahedron_refinements/2-edges/edge_01-23_refined/01-23_small.png -text +doc/tetrahedron_refinements/2-edges/edge_01-30_refined/01-30.png -text +doc/tetrahedron_refinements/2-edges/edge_01-30_refined/01-30.pvsm -text +doc/tetrahedron_refinements/2-edges/edge_01-30_refined/01-30.txt -text +doc/tetrahedron_refinements/2-edges/edge_01-30_refined/01-30.vtk -text +doc/tetrahedron_refinements/2-edges/edge_01-30_refined/01-30_small.png -text +doc/tetrahedron_refinements/2-edges/edge_01-31_refined/01-31.png -text +doc/tetrahedron_refinements/2-edges/edge_01-31_refined/01-31.pvsm -text +doc/tetrahedron_refinements/2-edges/edge_01-31_refined/01-31.txt -text +doc/tetrahedron_refinements/2-edges/edge_01-31_refined/01-31.vtk -text +doc/tetrahedron_refinements/2-edges/edge_01-31_refined/01-31_small.png -text +doc/tetrahedron_refinements/2-edges/edge_12-20_refined/12-20.png -text +doc/tetrahedron_refinements/2-edges/edge_12-20_refined/12-20.pvsm -text +doc/tetrahedron_refinements/2-edges/edge_12-20_refined/12-20.txt -text +doc/tetrahedron_refinements/2-edges/edge_12-20_refined/12-20.vtk -text +doc/tetrahedron_refinements/2-edges/edge_12-20_refined/12-20_small.png -text +doc/tetrahedron_refinements/2-edges/edge_12-23_refined/12-23.png -text +doc/tetrahedron_refinements/2-edges/edge_12-23_refined/12-23.pvsm -text +doc/tetrahedron_refinements/2-edges/edge_12-23_refined/12-23.txt -text +doc/tetrahedron_refinements/2-edges/edge_12-23_refined/12-23.vtk -text +doc/tetrahedron_refinements/2-edges/edge_12-23_refined/12-23_small.png -text +doc/tetrahedron_refinements/2-edges/edge_12-30_refined/12-30.png -text +doc/tetrahedron_refinements/2-edges/edge_12-30_refined/12-30.pvsm -text +doc/tetrahedron_refinements/2-edges/edge_12-30_refined/12-30.txt -text +doc/tetrahedron_refinements/2-edges/edge_12-30_refined/12-30.vtk -text +doc/tetrahedron_refinements/2-edges/edge_12-30_refined/12-30_small.png -text +doc/tetrahedron_refinements/2-edges/edge_12-31_refined/12-31.png -text +doc/tetrahedron_refinements/2-edges/edge_12-31_refined/12-31.pvsm -text +doc/tetrahedron_refinements/2-edges/edge_12-31_refined/12-31.txt -text +doc/tetrahedron_refinements/2-edges/edge_12-31_refined/12-31.vtk -text +doc/tetrahedron_refinements/2-edges/edge_12-31_refined/12-31_small.png -text +doc/tetrahedron_refinements/2-edges/edge_20-23_refined/20-23.png -text +doc/tetrahedron_refinements/2-edges/edge_20-23_refined/20-23.pvsm -text +doc/tetrahedron_refinements/2-edges/edge_20-23_refined/20-23.txt -text +doc/tetrahedron_refinements/2-edges/edge_20-23_refined/20-23.vtk -text +doc/tetrahedron_refinements/2-edges/edge_20-23_refined/20-23_small.png -text +doc/tetrahedron_refinements/2-edges/edge_20-30_refined/20-30.png -text +doc/tetrahedron_refinements/2-edges/edge_20-30_refined/20-30.pvsm -text +doc/tetrahedron_refinements/2-edges/edge_20-30_refined/20-30.txt -text +doc/tetrahedron_refinements/2-edges/edge_20-30_refined/20-30.vtk -text +doc/tetrahedron_refinements/2-edges/edge_20-30_refined/20-30_small.png -text +doc/tetrahedron_refinements/2-edges/edge_20-31_refined/20-31.png -text +doc/tetrahedron_refinements/2-edges/edge_20-31_refined/20-31.pvsm -text +doc/tetrahedron_refinements/2-edges/edge_20-31_refined/20-31.txt -text +doc/tetrahedron_refinements/2-edges/edge_20-31_refined/20-31.vtk -text +doc/tetrahedron_refinements/2-edges/edge_20-31_refined/20-31_small.png -text +doc/tetrahedron_refinements/2-edges/edge_23-30_refined/23-30.png -text +doc/tetrahedron_refinements/2-edges/edge_23-30_refined/23-30.pvsm -text +doc/tetrahedron_refinements/2-edges/edge_23-30_refined/23-30.txt -text +doc/tetrahedron_refinements/2-edges/edge_23-30_refined/23-30.vtk -text +doc/tetrahedron_refinements/2-edges/edge_23-30_refined/23-30_small.png -text +doc/tetrahedron_refinements/2-edges/edge_23-31_refined/23-31.png -text +doc/tetrahedron_refinements/2-edges/edge_23-31_refined/23-31.pvsm -text +doc/tetrahedron_refinements/2-edges/edge_23-31_refined/23-31.txt -text +doc/tetrahedron_refinements/2-edges/edge_23-31_refined/23-31.vtk -text +doc/tetrahedron_refinements/2-edges/edge_23-31_refined/23-31_small.png -text +doc/tetrahedron_refinements/2-edges/edge_30-31_refined/30-31.png -text +doc/tetrahedron_refinements/2-edges/edge_30-31_refined/30-31.pvsm -text +doc/tetrahedron_refinements/2-edges/edge_30-31_refined/30-31.txt -text +doc/tetrahedron_refinements/2-edges/edge_30-31_refined/30-31.vtk -text +doc/tetrahedron_refinements/2-edges/edge_30-31_refined/30-31_small.png -text +doc/tetrahedron_refinements/3-edges/edge_01-12-20_refined/01-12-20.png -text +doc/tetrahedron_refinements/3-edges/edge_01-12-20_refined/01-12-20.pvsm -text +doc/tetrahedron_refinements/3-edges/edge_01-12-20_refined/01-12-20.txt -text +doc/tetrahedron_refinements/3-edges/edge_01-12-20_refined/01-12-20.vtk -text +doc/tetrahedron_refinements/3-edges/edge_01-12-20_refined/01-12-20_small.png -text +doc/tetrahedron_refinements/3-edges/edge_01-12-23_refined/01-12-23.png -text +doc/tetrahedron_refinements/3-edges/edge_01-12-23_refined/01-12-23.pvsm -text +doc/tetrahedron_refinements/3-edges/edge_01-12-23_refined/01-12-23.txt -text +doc/tetrahedron_refinements/3-edges/edge_01-12-23_refined/01-12-23.vtk -text +doc/tetrahedron_refinements/3-edges/edge_01-12-23_refined/01-12-23_small.png -text +doc/tetrahedron_refinements/3-edges/edge_01-12-30_refined/01-12-30.png -text +doc/tetrahedron_refinements/3-edges/edge_01-12-30_refined/01-12-30.pvsm -text +doc/tetrahedron_refinements/3-edges/edge_01-12-30_refined/01-12-30.txt -text +doc/tetrahedron_refinements/3-edges/edge_01-12-30_refined/01-12-30.vtk -text +doc/tetrahedron_refinements/3-edges/edge_01-12-30_refined/01-12-30_small.png -text +doc/tetrahedron_refinements/3-edges/edge_01-12-31_refined/01-12-31.png -text +doc/tetrahedron_refinements/3-edges/edge_01-12-31_refined/01-12-31.pvsm -text +doc/tetrahedron_refinements/3-edges/edge_01-12-31_refined/01-12-31.txt -text +doc/tetrahedron_refinements/3-edges/edge_01-12-31_refined/01-12-31.vtk -text +doc/tetrahedron_refinements/3-edges/edge_01-12-31_refined/01-12-31_small.png -text +doc/tetrahedron_refinements/3-edges/edge_01-20-23_refined/01-20-23.png -text +doc/tetrahedron_refinements/3-edges/edge_01-20-23_refined/01-20-23.pvsm -text +doc/tetrahedron_refinements/3-edges/edge_01-20-23_refined/01-20-23.txt -text +doc/tetrahedron_refinements/3-edges/edge_01-20-23_refined/01-20-23.vtk -text +doc/tetrahedron_refinements/3-edges/edge_01-20-23_refined/01-20-23_small.png -text +doc/tetrahedron_refinements/3-edges/edge_01-20-30_refined/01-20-30.png -text +doc/tetrahedron_refinements/3-edges/edge_01-20-30_refined/01-20-30.pvsm -text +doc/tetrahedron_refinements/3-edges/edge_01-20-30_refined/01-20-30.txt -text +doc/tetrahedron_refinements/3-edges/edge_01-20-30_refined/01-20-30.vtk -text +doc/tetrahedron_refinements/3-edges/edge_01-20-30_refined/01-20-30_small.png -text +doc/tetrahedron_refinements/3-edges/edge_01-20-31_refined/01-20-31.png -text +doc/tetrahedron_refinements/3-edges/edge_01-20-31_refined/01-20-31.pvsm -text +doc/tetrahedron_refinements/3-edges/edge_01-20-31_refined/01-20-31.txt -text +doc/tetrahedron_refinements/3-edges/edge_01-20-31_refined/01-20-31.vtk -text +doc/tetrahedron_refinements/3-edges/edge_01-20-31_refined/01-20-31_small.png -text +doc/tetrahedron_refinements/3-edges/edge_01-23-30_refined/01-23-30.png -text +doc/tetrahedron_refinements/3-edges/edge_01-23-30_refined/01-23-30.pvsm -text +doc/tetrahedron_refinements/3-edges/edge_01-23-30_refined/01-23-30.txt -text +doc/tetrahedron_refinements/3-edges/edge_01-23-30_refined/01-23-30.vtk -text +doc/tetrahedron_refinements/3-edges/edge_01-23-30_refined/01-23-30_small.png -text +doc/tetrahedron_refinements/3-edges/edge_01-23-31_refined/01-23-31.png -text +doc/tetrahedron_refinements/3-edges/edge_01-23-31_refined/01-23-31.pvsm -text +doc/tetrahedron_refinements/3-edges/edge_01-23-31_refined/01-23-31.txt -text +doc/tetrahedron_refinements/3-edges/edge_01-23-31_refined/01-23-31.vtk -text +doc/tetrahedron_refinements/3-edges/edge_01-23-31_refined/01-23-31_small.png -text +doc/tetrahedron_refinements/3-edges/edge_01-30-31_refined/01-30-31.png -text +doc/tetrahedron_refinements/3-edges/edge_01-30-31_refined/01-30-31.pvsm -text +doc/tetrahedron_refinements/3-edges/edge_01-30-31_refined/01-30-31.txt -text +doc/tetrahedron_refinements/3-edges/edge_01-30-31_refined/01-30-31.vtk -text +doc/tetrahedron_refinements/3-edges/edge_01-30-31_refined/01-30-31_small.png -text +doc/tetrahedron_refinements/3-edges/edge_12-20-23_refined/12-20-23.png -text +doc/tetrahedron_refinements/3-edges/edge_12-20-23_refined/12-20-23.pvsm -text +doc/tetrahedron_refinements/3-edges/edge_12-20-23_refined/12-20-23.txt -text +doc/tetrahedron_refinements/3-edges/edge_12-20-23_refined/12-20-23.vtk -text +doc/tetrahedron_refinements/3-edges/edge_12-20-23_refined/12-20-23_small.png -text +doc/tetrahedron_refinements/3-edges/edge_12-20-30_refined/12-20-30.png -text +doc/tetrahedron_refinements/3-edges/edge_12-20-30_refined/12-20-30.pvsm -text +doc/tetrahedron_refinements/3-edges/edge_12-20-30_refined/12-20-30.txt -text +doc/tetrahedron_refinements/3-edges/edge_12-20-30_refined/12-20-30.vtk -text +doc/tetrahedron_refinements/3-edges/edge_12-20-30_refined/12-20-30_small.png -text +doc/tetrahedron_refinements/3-edges/edge_12-20-31_refined/12-20-31.png -text +doc/tetrahedron_refinements/3-edges/edge_12-20-31_refined/12-20-31.pvsm -text +doc/tetrahedron_refinements/3-edges/edge_12-20-31_refined/12-20-31.txt -text +doc/tetrahedron_refinements/3-edges/edge_12-20-31_refined/12-20-31.vtk -text +doc/tetrahedron_refinements/3-edges/edge_12-20-31_refined/12-20-31_small.png -text +doc/tetrahedron_refinements/3-edges/edge_12-23-30_refined/12-23-30.png -text +doc/tetrahedron_refinements/3-edges/edge_12-23-30_refined/12-23-30.pvsm -text +doc/tetrahedron_refinements/3-edges/edge_12-23-30_refined/12-23-30.txt -text +doc/tetrahedron_refinements/3-edges/edge_12-23-30_refined/12-23-30.vtk -text +doc/tetrahedron_refinements/3-edges/edge_12-23-30_refined/12-23-30_small.png -text +doc/tetrahedron_refinements/3-edges/edge_12-23-31_refined/12-23-31.png -text +doc/tetrahedron_refinements/3-edges/edge_12-23-31_refined/12-23-31.pvsm -text +doc/tetrahedron_refinements/3-edges/edge_12-23-31_refined/12-23-31.txt -text +doc/tetrahedron_refinements/3-edges/edge_12-23-31_refined/12-23-31.vtk -text +doc/tetrahedron_refinements/3-edges/edge_12-23-31_refined/12-23-31_small.png -text +doc/tetrahedron_refinements/3-edges/edge_12-30-31_refined/12-30-31.png -text +doc/tetrahedron_refinements/3-edges/edge_12-30-31_refined/12-30-31.pvsm -text +doc/tetrahedron_refinements/3-edges/edge_12-30-31_refined/12-30-31.txt -text +doc/tetrahedron_refinements/3-edges/edge_12-30-31_refined/12-30-31.vtk -text +doc/tetrahedron_refinements/3-edges/edge_12-30-31_refined/12-30-31_small.png -text +doc/tetrahedron_refinements/3-edges/edge_20-23-30_refined/20-23-30.png -text +doc/tetrahedron_refinements/3-edges/edge_20-23-30_refined/20-23-30.pvsm -text +doc/tetrahedron_refinements/3-edges/edge_20-23-30_refined/20-23-30.txt -text +doc/tetrahedron_refinements/3-edges/edge_20-23-30_refined/20-23-30.vtk -text +doc/tetrahedron_refinements/3-edges/edge_20-23-30_refined/20-23-30_small.png -text +doc/tetrahedron_refinements/3-edges/edge_20-23-31_refined/20-23-31.png -text +doc/tetrahedron_refinements/3-edges/edge_20-23-31_refined/20-23-31.pvsm -text +doc/tetrahedron_refinements/3-edges/edge_20-23-31_refined/20-23-31.txt -text +doc/tetrahedron_refinements/3-edges/edge_20-23-31_refined/20-23-31.vtk -text +doc/tetrahedron_refinements/3-edges/edge_20-23-31_refined/20-23-31_small.png -text +doc/tetrahedron_refinements/3-edges/edge_20-30-31_refined/20-30-31.png -text +doc/tetrahedron_refinements/3-edges/edge_20-30-31_refined/20-30-31.pvsm -text +doc/tetrahedron_refinements/3-edges/edge_20-30-31_refined/20-30-31.txt -text +doc/tetrahedron_refinements/3-edges/edge_20-30-31_refined/20-30-31.vtk -text +doc/tetrahedron_refinements/3-edges/edge_20-30-31_refined/20-30-31_small.png -text +doc/tetrahedron_refinements/3-edges/edge_23-30-31_refined/23-30-31.png -text +doc/tetrahedron_refinements/3-edges/edge_23-30-31_refined/23-30-31.pvsm -text +doc/tetrahedron_refinements/3-edges/edge_23-30-31_refined/23-30-31.txt -text +doc/tetrahedron_refinements/3-edges/edge_23-30-31_refined/23-30-31.vtk -text +doc/tetrahedron_refinements/3-edges/edge_23-30-31_refined/23-30-31_small.png -text +doc/tetrahedron_refinements/4-edges/edge_01-12-20-23_refined/01-12-20-23.png -text +doc/tetrahedron_refinements/4-edges/edge_01-12-20-23_refined/01-12-20-23.pvsm -text +doc/tetrahedron_refinements/4-edges/edge_01-12-20-23_refined/01-12-20-23.txt -text +doc/tetrahedron_refinements/4-edges/edge_01-12-20-23_refined/01-12-20-23.vtk -text +doc/tetrahedron_refinements/4-edges/edge_01-12-20-23_refined/01-12-20-23_small.png -text +doc/tetrahedron_refinements/4-edges/edge_01-12-20-30_refined/01-12-20-30.png -text +doc/tetrahedron_refinements/4-edges/edge_01-12-20-30_refined/01-12-20-30.pvsm -text +doc/tetrahedron_refinements/4-edges/edge_01-12-20-30_refined/01-12-20-30.txt -text +doc/tetrahedron_refinements/4-edges/edge_01-12-20-30_refined/01-12-20-30.vtk -text +doc/tetrahedron_refinements/4-edges/edge_01-12-20-30_refined/01-12-20-30_small.png -text +doc/tetrahedron_refinements/4-edges/edge_01-12-20-31_refined/01-12-20-31.png -text +doc/tetrahedron_refinements/4-edges/edge_01-12-20-31_refined/01-12-20-31.pvsm -text +doc/tetrahedron_refinements/4-edges/edge_01-12-20-31_refined/01-12-20-31.txt -text +doc/tetrahedron_refinements/4-edges/edge_01-12-20-31_refined/01-12-20-31.vtk -text +doc/tetrahedron_refinements/4-edges/edge_01-12-20-31_refined/01-12-20-31_small.png -text +doc/tetrahedron_refinements/4-edges/edge_01-12-23-30_refined/01-12-23-30.png -text +doc/tetrahedron_refinements/4-edges/edge_01-12-23-30_refined/01-12-23-30.pvsm -text +doc/tetrahedron_refinements/4-edges/edge_01-12-23-30_refined/01-12-23-30.txt -text +doc/tetrahedron_refinements/4-edges/edge_01-12-23-30_refined/01-12-23-30.vtk -text +doc/tetrahedron_refinements/4-edges/edge_01-12-23-30_refined/01-12-23-30_small.png -text +doc/tetrahedron_refinements/4-edges/edge_01-12-23-31_refined/01-12-23-31.png -text +doc/tetrahedron_refinements/4-edges/edge_01-12-23-31_refined/01-12-23-31.pvsm -text +doc/tetrahedron_refinements/4-edges/edge_01-12-23-31_refined/01-12-23-31.txt -text +doc/tetrahedron_refinements/4-edges/edge_01-12-23-31_refined/01-12-23-31.vtk -text +doc/tetrahedron_refinements/4-edges/edge_01-12-23-31_refined/01-12-23-31_small.png -text +doc/tetrahedron_refinements/4-edges/edge_01-12-30-31_refined/01-12-30-31.png -text +doc/tetrahedron_refinements/4-edges/edge_01-12-30-31_refined/01-12-30-31.pvsm -text +doc/tetrahedron_refinements/4-edges/edge_01-12-30-31_refined/01-12-30-31.txt -text +doc/tetrahedron_refinements/4-edges/edge_01-12-30-31_refined/01-12-30-31.vtk -text +doc/tetrahedron_refinements/4-edges/edge_01-12-30-31_refined/01-12-30-31_small.png -text +doc/tetrahedron_refinements/4-edges/edge_01-20-23-30_refined/01-20-23-30.png -text +doc/tetrahedron_refinements/4-edges/edge_01-20-23-30_refined/01-20-23-30.pvsm -text +doc/tetrahedron_refinements/4-edges/edge_01-20-23-30_refined/01-20-23-30.txt -text +doc/tetrahedron_refinements/4-edges/edge_01-20-23-30_refined/01-20-23-30.vtk -text +doc/tetrahedron_refinements/4-edges/edge_01-20-23-30_refined/01-20-23-30_small.png -text +doc/tetrahedron_refinements/4-edges/edge_01-20-23-31_refined/01-20-23-31.png -text +doc/tetrahedron_refinements/4-edges/edge_01-20-23-31_refined/01-20-23-31.pvsm -text +doc/tetrahedron_refinements/4-edges/edge_01-20-23-31_refined/01-20-23-31.txt -text +doc/tetrahedron_refinements/4-edges/edge_01-20-23-31_refined/01-20-23-31.vtk -text +doc/tetrahedron_refinements/4-edges/edge_01-20-23-31_refined/01-20-23-31_small.png -text +doc/tetrahedron_refinements/4-edges/edge_01-20-30-31_refined/01-20-30-31.png -text +doc/tetrahedron_refinements/4-edges/edge_01-20-30-31_refined/01-20-30-31.pvsm -text +doc/tetrahedron_refinements/4-edges/edge_01-20-30-31_refined/01-20-30-31.txt -text +doc/tetrahedron_refinements/4-edges/edge_01-20-30-31_refined/01-20-30-31.vtk -text +doc/tetrahedron_refinements/4-edges/edge_01-20-30-31_refined/01-20-30-31_small.png -text +doc/tetrahedron_refinements/4-edges/edge_01-23-30-31_refined/01-23-30-31.png -text +doc/tetrahedron_refinements/4-edges/edge_01-23-30-31_refined/01-23-30-31.pvsm -text +doc/tetrahedron_refinements/4-edges/edge_01-23-30-31_refined/01-23-30-31.txt -text +doc/tetrahedron_refinements/4-edges/edge_01-23-30-31_refined/01-23-30-31.vtk -text +doc/tetrahedron_refinements/4-edges/edge_01-23-30-31_refined/01-23-30-31_small.png -text +doc/tetrahedron_refinements/4-edges/edge_12-20-23-30_refined/12-20-23-30.png -text +doc/tetrahedron_refinements/4-edges/edge_12-20-23-30_refined/12-20-23-30.pvsm -text +doc/tetrahedron_refinements/4-edges/edge_12-20-23-30_refined/12-20-23-30.txt -text +doc/tetrahedron_refinements/4-edges/edge_12-20-23-30_refined/12-20-23-30.vtk -text +doc/tetrahedron_refinements/4-edges/edge_12-20-23-30_refined/12-20-23-30_small.png -text +doc/tetrahedron_refinements/4-edges/edge_12-20-23-31_refined/12-20-23-31.png -text +doc/tetrahedron_refinements/4-edges/edge_12-20-23-31_refined/12-20-23-31.pvsm -text +doc/tetrahedron_refinements/4-edges/edge_12-20-23-31_refined/12-20-23-31.txt -text +doc/tetrahedron_refinements/4-edges/edge_12-20-23-31_refined/12-20-23-31.vtk -text +doc/tetrahedron_refinements/4-edges/edge_12-20-23-31_refined/12-20-23-31_small.png -text +doc/tetrahedron_refinements/4-edges/edge_12-20-30-31_refined/12-20-30-31.png -text +doc/tetrahedron_refinements/4-edges/edge_12-20-30-31_refined/12-20-30-31.pvsm -text +doc/tetrahedron_refinements/4-edges/edge_12-20-30-31_refined/12-20-30-31.txt -text +doc/tetrahedron_refinements/4-edges/edge_12-20-30-31_refined/12-20-30-31.vtk -text +doc/tetrahedron_refinements/4-edges/edge_12-20-30-31_refined/12-20-30-31_small.png -text +doc/tetrahedron_refinements/4-edges/edge_12-23-30-31_refined/12-23-30-31.png -text +doc/tetrahedron_refinements/4-edges/edge_12-23-30-31_refined/12-23-30-31.pvsm -text +doc/tetrahedron_refinements/4-edges/edge_12-23-30-31_refined/12-23-30-31.txt -text +doc/tetrahedron_refinements/4-edges/edge_12-23-30-31_refined/12-23-30-31.vtk -text +doc/tetrahedron_refinements/4-edges/edge_12-23-30-31_refined/12-23-30-31_small.png -text +doc/tetrahedron_refinements/4-edges/edge_20-23-30-31_refined/20-23-30-31.png -text +doc/tetrahedron_refinements/4-edges/edge_20-23-30-31_refined/20-23-30-31.pvsm -text +doc/tetrahedron_refinements/4-edges/edge_20-23-30-31_refined/20-23-30-31.txt -text +doc/tetrahedron_refinements/4-edges/edge_20-23-30-31_refined/20-23-30-31.vtk -text +doc/tetrahedron_refinements/4-edges/edge_20-23-30-31_refined/20-23-30-31_small.png -text +doc/tetrahedron_refinements/5-edges/edge_01-12-20-23-30_refined/01-12-20-23-30.png -text +doc/tetrahedron_refinements/5-edges/edge_01-12-20-23-30_refined/01-12-20-23-30.pvsm -text +doc/tetrahedron_refinements/5-edges/edge_01-12-20-23-30_refined/01-12-20-23-30.txt -text +doc/tetrahedron_refinements/5-edges/edge_01-12-20-23-30_refined/01-12-20-23-30.vtk -text +doc/tetrahedron_refinements/5-edges/edge_01-12-20-23-30_refined/01-12-20-23-30_small.png -text +doc/tetrahedron_refinements/5-edges/edge_01-12-20-23-31_refined/01-12-20-23-31.png -text +doc/tetrahedron_refinements/5-edges/edge_01-12-20-23-31_refined/01-12-20-23-31.pvsm -text +doc/tetrahedron_refinements/5-edges/edge_01-12-20-23-31_refined/01-12-20-23-31.txt -text +doc/tetrahedron_refinements/5-edges/edge_01-12-20-23-31_refined/01-12-20-23-31.vtk -text +doc/tetrahedron_refinements/5-edges/edge_01-12-20-23-31_refined/01-12-20-23-31_small.png -text +doc/tetrahedron_refinements/5-edges/edge_01-12-20-30-31_refined/01-12-20-30-31.png -text +doc/tetrahedron_refinements/5-edges/edge_01-12-20-30-31_refined/01-12-20-30-31.pvsm -text +doc/tetrahedron_refinements/5-edges/edge_01-12-20-30-31_refined/01-12-20-30-31.txt -text +doc/tetrahedron_refinements/5-edges/edge_01-12-20-30-31_refined/01-12-20-30-31.vtk -text +doc/tetrahedron_refinements/5-edges/edge_01-12-20-30-31_refined/01-12-20-30-31_small.png -text +doc/tetrahedron_refinements/5-edges/edge_01-12-23-30-31_refined/01-12-23-30-31.png -text +doc/tetrahedron_refinements/5-edges/edge_01-12-23-30-31_refined/01-12-23-30-31.pvsm -text +doc/tetrahedron_refinements/5-edges/edge_01-12-23-30-31_refined/01-12-23-30-31.txt -text +doc/tetrahedron_refinements/5-edges/edge_01-12-23-30-31_refined/01-12-23-30-31.vtk -text +doc/tetrahedron_refinements/5-edges/edge_01-12-23-30-31_refined/01-12-23-30-31_small.png -text +doc/tetrahedron_refinements/5-edges/edge_01-20-23-30-31_refined/01-20-23-30-31.png -text +doc/tetrahedron_refinements/5-edges/edge_01-20-23-30-31_refined/01-20-23-30-31.pvsm -text +doc/tetrahedron_refinements/5-edges/edge_01-20-23-30-31_refined/01-20-23-30-31.txt -text +doc/tetrahedron_refinements/5-edges/edge_01-20-23-30-31_refined/01-20-23-30-31.vtk -text +doc/tetrahedron_refinements/5-edges/edge_01-20-23-30-31_refined/01-20-23-30-31_small.png -text +doc/tetrahedron_refinements/5-edges/edge_12-20-23-30-31_refined/12-20-23-30-31.png -text +doc/tetrahedron_refinements/5-edges/edge_12-20-23-30-31_refined/12-20-23-30-31.pvsm -text +doc/tetrahedron_refinements/5-edges/edge_12-20-23-30-31_refined/12-20-23-30-31.txt -text +doc/tetrahedron_refinements/5-edges/edge_12-20-23-30-31_refined/12-20-23-30-31.vtk -text +doc/tetrahedron_refinements/5-edges/edge_12-20-23-30-31_refined/12-20-23-30-31_small.png -text +doc/tetrahedron_refinements/6-edges/edge_01-12-20-23-30-31_refined/01-12-20-23-30-31.aux -text +doc/tetrahedron_refinements/6-edges/edge_01-12-20-23-30-31_refined/01-12-20-23-30-31.log -text +doc/tetrahedron_refinements/6-edges/edge_01-12-20-23-30-31_refined/01-12-20-23-30-31.pdf -text +doc/tetrahedron_refinements/6-edges/edge_01-12-20-23-30-31_refined/01-12-20-23-30-31.png -text +doc/tetrahedron_refinements/6-edges/edge_01-12-20-23-30-31_refined/01-12-20-23-30-31.pvsm -text +doc/tetrahedron_refinements/6-edges/edge_01-12-20-23-30-31_refined/01-12-20-23-30-31.tex -text +doc/tetrahedron_refinements/6-edges/edge_01-12-20-23-30-31_refined/01-12-20-23-30-31.tex.orig -text +doc/tetrahedron_refinements/6-edges/edge_01-12-20-23-30-31_refined/01-12-20-23-30-31.txt -text +doc/tetrahedron_refinements/6-edges/edge_01-12-20-23-30-31_refined/01-12-20-23-30-31.vtk -text +doc/tetrahedron_refinements/6-edges/edge_01-12-20-23-30-31_refined/01-12-20-23-30-31_small.png -text +doc/tetrahedron_refinements/6-edges/edge_01-12-20-23-30-31_refined/buildlatex.bash -text +doc/tetrahedron_refinements/6-edges/edge_01-12-20-23-30-31_refined/output_file.jpg -text +doc/tetrahedron_refinements/README -text +doc/tetrahedron_refinements/text2vtk.py -text +examples/H5/Makefile.am -text +examples/H5/openclose.c -text +examples/H5Block/H5BlockExample.pbs -text +examples/H5Block/H5BlockExampleF.f90 -text +examples/H5Block/Makefile.am -text +examples/H5Block/README -text +examples/H5Block/fields.c -text +examples/H5Block/read_write.c -text +examples/H5Fed/Makefile.am -text +examples/H5Fed/map_tet2globalid.c -text +examples/H5Fed/map_triangle2globalid.c -text +examples/H5Fed/tetmesh_adjacencies.c -text +examples/H5Fed/tetmesh_read.c -text +examples/H5Fed/tetmesh_read_tags.c -text +examples/H5Fed/tetmesh_write.c -text +examples/H5Fed/tetmesh_write1.c -text +examples/H5Fed/tetmesh_write2.c -text +examples/H5Fed/tetmesh_write_tags.c -text +examples/H5Fed/trimesh_2gnuplot.c -text +examples/H5Fed/trimesh_adjacencies.c -text +examples/H5Fed/trimesh_read.c -text +examples/H5Fed/trimesh_write.c -text +examples/H5Fed/trimesh_write_dunetest.c -text +examples/H5Fed/write_boundary.c -text +examples/H5Part/Bench.c -text +examples/H5Part/H5test.c -text +examples/H5Part/H5testF.f90 -text +examples/H5Part/Makefile.am -text +examples/H5Part/core_vfd.c -text +examples/H5Part/particles.c -text +examples/H5Part/read_canonicalview.c -text +examples/H5Part/simplef.f90 -text +examples/H5Part/stridedf.f90 -text +examples/H5Part/write_setnumparticles.c -text +examples/H5Part/write_setview.c -text +/license.txt -text +src/C/Makefile.am -text +src/Fortran/H5.c -text +src/Fortran/H5Block.c -text +src/Fortran/H5BlockF.f90 -text +src/Fortran/H5Block_F.c -text +src/Fortran/H5Block_attribs.c -text +src/Fortran/H5Block_attribsF.f90 -text +src/Fortran/H5Block_io.c -text +src/Fortran/H5Block_ioF.f90 -text +src/Fortran/H5Block_readwrite_F.c -text +src/Fortran/H5F.f90 -text +src/Fortran/H5Part.c -text +src/Fortran/H5PartF.f90 -text +src/Fortran/H5Part_F.c -text +src/Fortran/H5Part_io.c -text +src/Fortran/H5Part_ioF.f90 -text +src/Fortran/H5_F.c -text +src/Fortran/H5_attribs.c -text +src/Fortran/H5_attribsF.f90 -text +src/Fortran/H5_attribs_F.c -text +src/Fortran/H5_constF.f90 -text +src/Fortran/Makefile.am -text +src/Fortran/TestUnderscore.f -text +src/Fortran/TestUnderscoreC.c -text +src/Fortran/h5_private.h -text +src/Makefile.am -text +src/h5core/Makefile.am -text +src/h5core/h5_attach.c -text +src/h5core/h5_attribs.c -text +src/h5core/h5_attribs_private.h -text +src/h5core/h5_debug_private.h -text +src/h5core/h5_errorhandling.c -text +src/h5core/h5_errorhandling_private.h -text +src/h5core/h5_fcmp.c -text +src/h5core/h5_fcmp_private.h -text +src/h5core/h5_hdf5.c -text +src/h5core/h5_hdf5_private.h -text +src/h5core/h5_hsearch.c -text +src/h5core/h5_hsearch_private.h -text +src/h5core/h5_init.c -text +src/h5core/h5_init_private.h -text +src/h5core/h5_lustre.c -text +src/h5core/h5_lustre_private.h -text +src/h5core/h5_maps.c -text +src/h5core/h5_maps_private.h -text +src/h5core/h5_model.c -text +src/h5core/h5_model_private.h -text +src/h5core/h5_mpi.c -text +src/h5core/h5_mpi_private.h -text +src/h5core/h5_openclose.c -text +src/h5core/h5_private.h -text +src/h5core/h5_qsort.c -text +src/h5core/h5_qsort_private.h -text +src/h5core/h5_qsort_r.c -text +src/h5core/h5_readwrite.c -text +src/h5core/h5_readwrite_private.h -text +src/h5core/h5_syscall.c -text +src/h5core/h5_syscall_private.h -text +src/h5core/h5_types_private.h -text +src/h5core/h5_va_macros.h -text +src/h5core/h5b_attribs.c -text +src/h5core/h5b_model.c -text +src/h5core/h5b_model_private.h -text +src/h5core/h5b_readwrite.c -text +src/h5core/h5b_readwrite_private.h -text +src/h5core/h5b_types_private.h -text +src/h5core/h5t_access_private.h -text +src/h5core/h5t_access_tetm.c -text +src/h5core/h5t_access_trim.c -text +src/h5core/h5t_adjacencies.c -text +src/h5core/h5t_adjacencies_private.h -text +src/h5core/h5t_adjacencies_tetm.c -text +src/h5core/h5t_adjacencies_trim.c -text +src/h5core/h5t_core.c -text +src/h5core/h5t_core_private.h -text +src/h5core/h5t_core_tetm.c -text +src/h5core/h5t_core_trim.c -text +src/h5core/h5t_errorhandling_private.h -text +src/h5core/h5t_map.c -text +src/h5core/h5t_map_private.h -text +src/h5core/h5t_model.c -text +src/h5core/h5t_model_private.h -text +src/h5core/h5t_model_tetm.c -text +src/h5core/h5t_model_trim.c -text +src/h5core/h5t_octree.c -text +src/h5core/h5t_octree_private.h -text +src/h5core/h5t_readwrite.c -text +src/h5core/h5t_readwrite_private.h -text +src/h5core/h5t_readwrite_tetm.c -text +src/h5core/h5t_readwrite_trim.c -text +src/h5core/h5t_ref_elements.c -text +src/h5core/h5t_ref_elements_private.h -text +src/h5core/h5t_retrieve.c -text +src/h5core/h5t_retrieve_private.h -text +src/h5core/h5t_retrieve_tetm.c -text +src/h5core/h5t_retrieve_trim.c -text +src/h5core/h5t_store.c -text +src/h5core/h5t_store_private.h -text +src/h5core/h5t_store_tetm.c -text +src/h5core/h5t_store_trim.c -text +src/h5core/h5t_tags.c -text +src/h5core/h5t_tags_private.h -text +src/h5core/h5t_types_private.h -text +src/h5core/h5u_errorhandling_private.h -text +src/h5core/h5u_model.c -text +src/h5core/h5u_readwrite.c -text +src/h5core/h5u_readwrite_private.h -text +src/h5core/h5u_types_private.h -text +src/include/H5.h -text +src/include/H5Block.h -text +src/include/H5Block_attribs.h -text +src/include/H5Block_io.h -text +src/include/H5Block_model.h -text +src/include/H5Fed.h -text +src/include/H5Fed_adjacency.h -text +src/include/H5Fed_model.h -text +src/include/H5Fed_retrieve.h -text +src/include/H5Fed_store.h -text +src/include/H5Fed_tags.h -text +src/include/H5Part.h -text +src/include/H5Part_io.h -text +src/include/H5Part_model.h -text +src/include/H5_attribs.h -text +src/include/H5_model.h -text +src/include/H5hut.h -text +src/include/Makefile.am -text +src/include/h5core/h5.h -text +src/include/h5core/h5_attribs.h -text +src/include/h5core/h5_debug.h -text +src/include/h5core/h5_errorhandling.h -text +src/include/h5core/h5_model.h -text +src/include/h5core/h5_syscall.h -text +src/include/h5core/h5_types.h -text +src/include/h5core/h5b_attribs.h -text +src/include/h5core/h5b_io.h -text +src/include/h5core/h5b_model.h -text +src/include/h5core/h5t_adjacencies.h -text +src/include/h5core/h5t_map.h -text +src/include/h5core/h5t_model.h -text +src/include/h5core/h5t_octree.h -text +src/include/h5core/h5t_retrieve.h -text +src/include/h5core/h5t_store.h -text +src/include/h5core/h5t_tags.h -text +src/include/h5core/h5u_io.h -text +src/include/h5core/h5u_model.h -text +test/Makefile.am -text +test/h5_attach_test.c -text +test/h5b_read.c -text +test/h5b_test.c -text +test/h5b_write.c -text +test/h5u_read.c -text +test/h5u_test.c -text +test/h5u_write.c -text +test/params.h -text +test/testframe.c -text +test/testframe.h -text +tools/H5PartMerge/AUTHORS -text +tools/H5PartMerge/COPYING -text +tools/H5PartMerge/ChangeLog -text +tools/H5PartMerge/INSTALL -text +tools/H5PartMerge/NEWS -text +tools/H5PartMerge/README -text +tools/H5PartMerge/autogen.sh -text +tools/H5PartMerge/configure.ac -text +tools/H5PartMerge/makefile.am -text +tools/H5PartMerge/src/H5merge.cpp -text +tools/H5PartMerge/src/optparse.cpp -text +tools/H5PartMerge/src/optparse.hh -text +tools/Makefile.am -text +tools/README -text +tools/h5PartDcToVtk.cc -text +tools/h5PartSurfaceToVtk.cc -text +tools/h5hutcc.in -text +tools/h5pAttrib.cc -text +tools/h5pToGNUplot.cc -text +tools/vtk2h5grid/Makefile.am -text +tools/vtk2h5grid/vtk2h5grid.cc -text +visit_plugins/databases/H5Part/.depend -text +visit_plugins/databases/H5Part/Makefile -text +visit_plugins/databases/H5Part/README.txt -text +visit_plugins/databases/H5Part/avth5partFileFormat.C -text +visit_plugins/databases/H5Part/avth5partFileFormat.h -text +visit_plugins/databases/H5Part/h5part.xml -text +visit_plugins/databases/H5Part/h5partCommonPluginInfo.C -text +visit_plugins/databases/H5Part/h5partEnginePluginInfo.C -text +visit_plugins/databases/H5Part/h5partMDServerPluginInfo.C -text +visit_plugins/databases/H5Part/h5partPluginInfo.C -text +visit_plugins/databases/H5Part/h5partPluginInfo.h -text +visit_plugins/operators/BinnerFilter/.depend -text +visit_plugins/operators/BinnerFilter/Binner.xml -text +visit_plugins/operators/BinnerFilter/BinnerCommonPluginInfo.C -text +visit_plugins/operators/BinnerFilter/BinnerEnginePluginInfo.C -text +visit_plugins/operators/BinnerFilter/BinnerFilter.C -text +visit_plugins/operators/BinnerFilter/BinnerFilter.h -text +visit_plugins/operators/BinnerFilter/BinnerFilter.java -text +visit_plugins/operators/BinnerFilter/BinnerGUIPluginInfo.C -text +visit_plugins/operators/BinnerFilter/BinnerMakefile -text +visit_plugins/operators/BinnerFilter/BinnerPluginInfo.C -text +visit_plugins/operators/BinnerFilter/BinnerPluginInfo.h -text +visit_plugins/operators/BinnerFilter/BinnerScriptingPluginInfo.C -text +visit_plugins/operators/BinnerFilter/BinnerViewerPluginInfo.C -text +visit_plugins/operators/BinnerFilter/Binnerreplace.txt -text +visit_plugins/operators/BinnerFilter/Makefile -text +visit_plugins/operators/BinnerFilter/PyBinner.C -text +visit_plugins/operators/BinnerFilter/PyBinner.h -text +visit_plugins/operators/BinnerFilter/QvisBinnerWindow.C -text +visit_plugins/operators/BinnerFilter/QvisBinnerWindow.h -text +visit_plugins/operators/BinnerFilter/avtBinnerFilter.C -text +visit_plugins/operators/BinnerFilter/avtBinnerFilter.h -text +visit_plugins/operators/BinnerFilter/icon.xpm -text +visit_plugins/operators/RandomSample/.depend -text +visit_plugins/operators/RandomSample/H5PartRandomSampleAttributes.C -text +visit_plugins/operators/RandomSample/H5PartRandomSampleAttributes.h -text +visit_plugins/operators/RandomSample/H5PartRandomSampleAttributes.java -text +visit_plugins/operators/RandomSample/H5PartRandomSampleCommonPluginInfo.C -text +visit_plugins/operators/RandomSample/H5PartRandomSampleEnginePluginInfo.C -text +visit_plugins/operators/RandomSample/H5PartRandomSampleGUIPluginInfo.C -text +visit_plugins/operators/RandomSample/H5PartRandomSamplePluginInfo.C -text +visit_plugins/operators/RandomSample/H5PartRandomSamplePluginInfo.h -text +visit_plugins/operators/RandomSample/H5PartRandomSampleScriptingPluginInfo.C -text +visit_plugins/operators/RandomSample/H5PartRandomSampleViewerPluginInfo.C -text +visit_plugins/operators/RandomSample/Makefile -text +visit_plugins/operators/RandomSample/PyH5PartRandomSampleAttributes.C -text +visit_plugins/operators/RandomSample/PyH5PartRandomSampleAttributes.h -text +visit_plugins/operators/RandomSample/QvisH5PartRandomSampleWindow.C -text +visit_plugins/operators/RandomSample/QvisH5PartRandomSampleWindow.h -text +visit_plugins/operators/RandomSample/RandomSample.xml -text +visit_plugins/operators/RandomSample/avtH5PartRandomSampleFilter.C -text +visit_plugins/operators/RandomSample/avtH5PartRandomSampleFilter.h -text +visit_plugins/operators/RandomSample/icon.xpm -text diff --git a/.gitignore b/.gitignore new file mode 100644 index 0000000..3289e69 --- /dev/null +++ b/.gitignore @@ -0,0 +1,93 @@ +/.cproject +/.project +/Makefile +/Makefile.in +/aclocal.m4 +/autom4te.cache +/build +/config.guess +/config.h +/config.h.in +/config.log +/config.status +/config.sub +/configure +/depcomp +doc/Makefile +doc/Makefile.in +doc/man +doc/tagfile +examples/H5/.deps +examples/H5/Makefile +examples/H5/Makefile.in +examples/H5/openclose +examples/H5Block/.deps +examples/H5Block/H5BlockExample +examples/H5Block/H5BlockExampleF +examples/H5Block/Makefile +examples/H5Block/Makefile.in +examples/H5Block/blockfile0.h5 +examples/H5Block/blockfile1.h5 +examples/H5Block/blockfile8.h5 +examples/H5Fed/.deps +examples/H5Fed/Makefile +examples/H5Fed/Makefile.in +examples/H5Fed/tetmesh_adjacencies +examples/H5Fed/tetmesh_read +examples/H5Fed/tetmesh_read_tags +examples/H5Fed/tetmesh_write +examples/H5Fed/tetmesh_write1 +examples/H5Fed/tetmesh_write2 +examples/H5Fed/tetmesh_write_tags +examples/H5Fed/trimesh_2gnuplot +examples/H5Fed/trimesh_adjacencies +examples/H5Fed/trimesh_read +examples/H5Fed/trimesh_write +examples/H5Fed/trimesh_write_dunetest +examples/H5Part/.deps +examples/H5Part/Bench +examples/H5Part/H5test +examples/H5Part/H5testF +examples/H5Part/Makefile +examples/H5Part/Makefile.in +/ignore.txt +/install-sh +/libtool +/ltmain.sh +/m4 +/missing +src/.deps +src/C/.deps +src/C/Makefile +src/C/Makefile.in +src/C/libH5hutC.a +src/Fortran/.deps +src/Fortran/Makefile +src/Fortran/Makefile.in +src/Fortran/TestUnderscore +src/Fortran/Underscore.h +src/Makefile +src/Makefile.in +src/h5core/.deps +src/h5core/Makefile +src/h5core/Makefile.in +src/h5core/libH5hut.a +src/include/H5hutF.h +src/include/Makefile +src/include/Makefile.in +src/lib +src/lib/.dirstamp +/stamp-h1 +test/.deps +test/Makefile +test/Makefile.in +test/h5_attach.h5 +test/h5_attach_test +test/h5b_test +test/h5u_test +tools/.deps +tools/Makefile +tools/Makefile.in +tools/h5PartDcToVtk +tools/h5PartSurfaceToVtk +tools/h5hutcc diff --git a/AUTHORS b/AUTHORS new file mode 100644 index 0000000..48fc3f6 --- /dev/null +++ b/AUTHORS @@ -0,0 +1,10 @@ + +Andreas Adelmann (PSI) +Achim Gsell (PSI) +Benedikt Oswald (PSI) + +Wes Bethel (NERSC/LBNL) +John Shalf (NERSC/LBNL) +Cristina Siegerist (NERSC/LBNL) + +Please use h5part@lists.psi.ch for communication. diff --git a/COPYING b/COPYING new file mode 100644 index 0000000..59c0886 --- /dev/null +++ b/COPYING @@ -0,0 +1,71 @@ +*** Copyright Notice *** + +H5hut Copyright (c) 2006-2010, The Regents of the University of California, +through Lawrence Berkeley National Laboratory (subject to receipt of any +required approvals from the U.S. Dept. of Energy) and the Paul Scherrer +Institut (Switzerland). All rights reserved. + +If you have questions about your rights to use or distribute this +software, please contact Berkeley Lab's Technology Transfer Department +at TTD@lbl.gov referring to "H5Part (LBNL Ref CR-2255)" + +NOTICE. This software was developed under partial funding from the U.S. +Department of Energy. As such, the U.S. Government has been granted for +itself and others acting on its behalf a paid-up, nonexclusive, +irrevocable, worldwide license in the Software to reproduce, prepare +derivative works, and perform publicly and display publicly. Beginning +five (5) years after the date permission to assert copyright is obtained +from the U.S. Department of Energy, and subject to any subsequent five +(5) year renewals, the U.S. Government is granted for itself and others +acting on its behalf a paid-up, nonexclusive, irrevocable, worldwide +license in the Software to reproduce, prepare derivative works, +distribute copies to the public, perform publicly and display publicly, +and to permit others to do so. + + +*** License agreement *** + +H5Part Copyright (c) 2006-2009, The Regents of the University of California, +through Lawrence Berkeley National Laboratory (subject to receipt of any +required approvals from the U.S. Dept. of Energy) and the Paul Scherrer +Institut (Switzerland). All rights reserved. + +Redistribution and use in source and binary forms, with or without +modification, are permitted provided that the following conditions are met: + +(1) Redistributions of source code must retain the above copyright +notice, this list of conditions and the following disclaimer. + +(2) Redistributions in binary form must reproduce the above copyright +notice, this list of conditions and the following disclaimer in the +documentation and/or other materials provided with the distribution. + +(3) Neither the name of the University of California, Lawrence Berkeley +National Laboratory, U.S. Dept. of Energy, Paul Scherrer Institut +(Switzerland) nor the names of its contributors may be used to endorse +or promote products derived from this software without specific prior +written permission. + +THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS +IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED +TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A +PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER +OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, +EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, +PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR +PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF +LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING +NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS +SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + +You are under no obligation whatsoever to provide any bug fixes, +patches, or upgrades to the features, functionality or performance of +the source code ("Enhancements") to anyone; however, if you choose to +make your Enhancements available either publicly, or directly to +Lawrence Berkeley National Laboratory, without imposing a separate +written license agreement for such Enhancements, then you hereby grant +the following license: a non-exclusive, royalty-free perpetual license +to install, use, modify, prepare derivative works, incorporate into +other computer software, distribute, and sublicense such enhancements or +derivative works thereof, in binary and source code form. + diff --git a/ChangeLog b/ChangeLog new file mode 100644 index 0000000..e69de29 diff --git a/Makefile.am b/Makefile.am new file mode 100644 index 0000000..48b1381 --- /dev/null +++ b/Makefile.am @@ -0,0 +1,13 @@ +ACLOCAL_AMFLAGS = -I m4 + +SUBDIRS = \ + src \ + test \ + tools + +MAINTAINERCLEANFILES = \ + config.h \ + config.log \ + config.status \ + stamp-h.in \ + stamp-h1 diff --git a/NEWS b/NEWS new file mode 100644 index 0000000..4bcf7fd --- /dev/null +++ b/NEWS @@ -0,0 +1,376 @@ +#### H5PART 1.99 ############################################################ + +Renamed type: + H5PartFile -> h5_file_t + h5part_int64_t -> h5_int64_t + +Renamed functions: + + +#### H5PART 1.6.6 ############################################################ + +Fixed typo (Write instead of Read) in the h5bl_3d_read_scalar_field* Fortran +interface. + +Added missing type normalization for int32 type. + +Rewrite of h5pAttrib tool. + +#### H5PART 1.6.5 ############################################################ + +Fixed several build errors reported by Iuri Prilepov on Ubuntu 11.04. + +#### H5PART 1.6.4 ############################################################ + +Fixed bug where H5PartSetViewIndices was not setting an empty view when the +number of elements is 0. + +Set a threshold on the HDF5 alignment parameter so that small metadata writes +are not aligned, which causes large gaps in the file. + +#### H5PART 1.6.3 ############################################################ + +New build system uses libtool and can build shared libraries. + +Fixed a bug that incorrectly identifies the number of selected points in a view +when using H5PartSetViewIndices. + +Fixed bug in Fortran test reported by several people, as well as several +incorrect views set in the C test that were causing segfaults. + +Fixed name mismatches in the Fortran interface, and an off-by-one indexing +problem. + +#### H5PART 1.6.2 ############################################################ + +Removed H5PartSetViewEmpty +-------------------------- + +An empty view can now be selected with: +H5PartSetNumParticles(file, 0); + +Bug Fixes to Attribute Calls in Fortran API +------------------------------------------- + +Fixed a problem where attribute values were reverting to zero. + +#### H5PART 1.6.1 ############################################################ + +Chunking in the H5Part API +-------------------------- + +There is now an H5Part equivalent H5PartSetChunkSize to the existing +H5BlockDefine3DChunkDims call. Both of these calls enable the chunking +mechanism in the underlying HDF5 layer. Chunking is used in combination +with the aligned open calls to pad datasets to alignment multiples +on disk. + +All Steps Available on Write +---------------------------- + +Previously, existing steps in a file were only accessible in read-only mode. +Now, all steps are available in all modes, including write-truncate and +write-append. Thus, it is now possible to overwrite existing data in write +mode. To help alert the user to this possibility, a warning is issued every +time an existing dataset is written to. Warnings can be printed by setting +the verbosity to H5PART_VERB_WARN or higher. + +New Throttling Routine +---------------------- + +Previously, a throttle factor of N meant that for P processors, the total +number of P writes were divided into N batches of P/N writes. + +To better accommodate round-robin lustre striping, the new policy is to +execute P/N batches of N writes. Thus, matching N to the number of stripes +results in the desirable 1-1 matching of writers to stripes. + +Other Fixes +----------- + +* The configure script should correctly detect PGI compilers now. +* There was a small memory leak in the Fortran file open calls. +* There was a compile error with HDF5 1.6.x due to a missing assignment. + +#### H5PART 1.6 ############################################################## + +Updated Documentation +--------------------- + +The Fortran API has been added to the doxygen documentation. Most entries have +a reference to their respective C API call. + +Regression Test Suite +--------------------- + +The test subdirectory has been reorganized to include a systematic series +of regression tests of common use cases for the API. The goal is to have both +complete coverage of the API (every call is exercised) and testing of some +unlikely or unsuspected values and cases. + +Currently, the C test covers the entire H5Part API and the Fortran test is +still in development. + +Benchmark Utilities +------------------- + +Two benchmarking utilities, H5PartBench and H5BlockBench, have been added to +the tools collection. Both require the parallel library and have functionality +and syntax similar to the IOR benchmark: + + http://sourceforge.net/projects/ior-sio/ + +File Mode Flags +--------------- + +Previously, the only flags used were H5PART_READ, H5PART_WRITE, and +H5PART_APPEND, and these were mutually exclusive. Additional flags have been +added to select the underlying virtual file driver (VFD) that HDF5 uses in +parallel mode and to accommodate the lustre filesystem: + +H5PART_VFD_MPIPOSIX (use the MPI-POSIX driver, which bypasses MPI-IO) +H5PART_VFD_MPIIO_IND (use MPI-IO in independent mode) +H5PART_FS_LUSTRE (activate H5P tunings for the lustre stripe size) + +These flags can be specified using the typical bitwise OR method, e.g. + + char flag = H5PART_WRITE | H5PART_VFD_MPIPOSIX | H5PART_FS_LUSTRE; + +will select write mode with these two additional options. + +The parallel library now defaults to using the MPI-IO collective mode driver +(previously it used independent mode). The collective buffering algorithm in +the Cray XT4/5 environment has been substantially improved in the last year, +and defaulting to collective mode allows us to take advantage of these +improvements automatically. + +There are also new open calls H5PartOpenAlign and H5PartOpenParallelAlign that +take an additional 'alignment' value. This value is passed to HDF5 and used to +pad out objects so that they align to filesystem boundaries. For instance, it +would make sense to use the stripe size as the alignment value when writing to +a lustre filesystem. + +Unified 'View' Model +-------------------- + +Views are now supported in both read and write mode (previously only supported +in read mode). It is possible to specify non-sensical views: you could for +instance specify a read view that is larger than the dataset on disk. Or you +could create a write view that is larger than the data in memory. In those +cases, you will encounter an error when you try to perform a read or write +operation on a dataset. + +There are two new methods for selecting views. H5PartSetNumParticlesStrided +selects a view with $n$ particles per processor, but such that the data in +memory is expected to have a 'stride' factor. For instance, if you have +particle data with fields $x$ and $y$ and a single array with entries +$x1,y1,x2,y2...$, then the stride factor is 2. Striding works for both reads +and writes and only affects the view of memory: individual fields are still +stored as individual arrays on disk. + +The second new method is H5PartSetViewIndices, which allows for point +selections of datasets. You can pass a list of indices for the points you +want to select. This is useful, for instance, when interfacing with FastBit +to perform queries that select a small subset of non-contiguous particles. + +Because views are now supported on write, it is possible to write a dataset +using multiple 'passes' or to leave some values unwritten. + +Also, all views are now *inclusive*, so that a view of (0,9) corresponds +to the 10 items 0, 1, 2, ... 9. + +Internal Handling of Dataspaces +------------------------------- + +H5PartSetNumParticles and H5PartSetNumParticlesStrided now share the same +HDF5 dataspace state in the H5PartFile struct with the calls that modify +the view (H5PartSetView etc.). Previously, the memory and disk dataspaces +were regenerated from the view on every read access, which was unnecessary. + +Autogeneration of API Calls +--------------------------- + +Python scripts have been added to automatically generate read/write call +variants for different data types. + +Renamed Fortran Include +----------------------- + +The automake system no longer greps the *F90.inc files to generate an include +called 'H5Part.inc'. Instead, the *F90.inc files have been renamed to *.f90, +and awk is used to generate an 'H5PartF.h' file (the same naming convention +as in MPI's 'mpif.h'). + +The change to *.f90 was necessary to facilitate integration of the Fortran +API into doxygen. Note that the *.f90 files will not compile, nor can they +be included directly. Simply use + + include 'H5PartF.h' + +in your Fortran code to include all the definitions for Fortran H5Part/H5Block +calls. + +64 Char Limit on Dataset Names +------------------------------ + +Previously, a user could overrun internal buffers for dataset names. Now, a +fixed limit of 64 chars is imposed. Dataset names that are longer than this are +truncated and a warning is printed. We expect that most users are using +short canonical names like x, px, id, etc. + +Changes to Existing API +----------------------- + +The H5BlockGetFieldInfo and H5BlockGetFieldInfoByName calls now both include +a parameter for the 'type' of the field. + + +#### H5PART 1.4 ############################################################## + +Error Handling +-------------- + Now all functions, in which an error could occure, are returning a +value. This value is either a 64bit integer or a pointer. + + A negative 64bit integer as result indicates an error. Values >= 0 +indicates successfull execution. This is similiar to the convention +used in UNIX system calls, but we do not return -1 but the error +number (which is always negative). + + For functions returning a pointer the NULL-pointer is used to indicate +an error. You can call the function H5PartGetErrno() to get the error +number. For the time being there is no strerror(3) or perror(3) +equivalent. + + +API Changes +----------- + There are several changes in the API of H5Part. The biggest change is +a side-effect of the implementation of strict error handling. The +impact to the existing C/C++ code is very small. But now you *can* +and *should* implement some kind of error handling. The simplest +error handling is to set an error handler which aborts the program as +soon as an error occured. + + The next "biggest" change is the use of H5Part types instead of "long +long" and "double". The replacement of "long long" is "h5part_int64_t" +and for "double" "h5part_float64_t". This change has now effect in +Fortran. + + In some functions the argument type changed from "int" to +"h5part_int64_t". Since on most systems "int" is a 32bit integer, +calls to these functions must be adapted to the new API. In C/C++ the +compiler will complain about it. But in Fortran you will *not* get an +error message.So, you must check your Fortran code carefully. + + Changes in detail (not listed are functions where only the return +type changed from any to "h5part_int64_t"): + + New API Changes to old API + + h5part_int64_t void + H5PartSetNumParticles ( + H5PartFile *f, + h5part_int64_t nparticles long long + ); + + h5part_int64_t int + H5PartWriteDataFloat64 ( + H5PartFile *f, + char *name, + h5part_float64_t *dta double + ); + + h5part_int64_t int + H5PartWriteDataInt64 ( + H5PartFile *f, + char *name, + h5part_int64_t *dta long long + ); + + h5part_int64_t void + H5PartSetStep ( + H5PartFile *f, + h5part_int64_t step int + ); + + h5part_int64_t void + H5PartSetView ( + H5PartFile *f, + h5part_int64_t start, long long + h5part_int64_t end long long + ); + + h5part_int64_t int + H5PartGetView ( + H5PartFile *f, + h5part_int64_t *start, long long + h5part_int64_t *end long long + ); + + h5part_int64_t int + H5PartReadDataFloat64 ( + H5PartFile *f, + char *name, + h5part_float64_t *dta double + ); + + h5part_int64_t int + H5PartReadDataInt64 ( + H5PartFile *f, + char *name, + h5part_int64_t *dta long long + ); + + h5part_int64_t void + H5PartReadParticleStep ( + H5PartFile *f, + h5part_int64_t step, int + h5part_float64_t *x, double + h5part_float64_t *y, double + h5part_float64_t *z, double + h5part_float64_t *px, double + h5part_float64_t *py, double + h5part_float64_t *pz, double + h5part_int64_t *id long long + ); + +New functions: + + h5part_int64_t + H5PartSetVerbosityLevel ( + unsigned int + ); + + h5part_int64_t + H5PartSetErrorHandler ( + h5part_error_handler handler + ); + + h5part_int64_t + H5PartGetErrno ( + void + ); + + h5part_int64_t + H5PartDefaultErrorHandler ( + const char *funcname, + const h5part_int64_t eno, + const char *fmt, + ... + ); + + h5part_int64_t + H5PartAbortErrorHandler ( + const char *funcname, + const h5part_int64_t eno, + const char *fmt, + ... + ); + +Removed functions: + + int + H5PartFileIsValid ( + H5PartFile *f + ); diff --git a/README b/README new file mode 100644 index 0000000..e69de29 diff --git a/autogen.sh b/autogen.sh new file mode 100755 index 0000000..706351a --- /dev/null +++ b/autogen.sh @@ -0,0 +1,48 @@ +#!/bin/sh +# Run this to generate all the initial makefiles, etc. + +ACLOCAL_FLAGS="-I m4 $ACLOCAL_FLAGS" +LIBTOOLIZE_FLAGS="--force $LIBTOOLIZE_FLAGS" +AUTOMAKE_FLAGS="--add-missing --copy --foreign $AUTOMAKE_FLAGS" + +LIBTOOLIZE=`which libtoolize` +if [ "$LIBTOOLIZE" = "" ]; then + LIBTOOLIZE=`which glibtoolize` +fi +if [ "$LIBTOOLIZE" = "" ]; then + echo "libtoolize not found" 1>&2 + exit 1 +fi + +echo "+ making misc files ..." +touch NEWS README AUTHORS ChangeLog +echo +$LIBTOOLIZE $LIBTOOLIZE_FLAGS || { + echo "libtoolize failed" + exit 1 +} +echo +echo "+ running aclocal ..." +aclocal $ACLOCAL_FLAGS || { + echo "aclocal failed - check that all needed development files are present on system" + exit 1 +} +echo +echo "+ running autoheader ... " +autoheader || { + echo "autoheader failed" + exit 1 +} +echo +echo "+ running autoconf ... " +autoconf || { + echo "autoconf failed" + exit 1 +} +echo +echo "+ running automake ... " +automake $AUTOMAKE_FLAGS || { + echo "automake failed" + exit 1 +} + diff --git a/configure.ac b/configure.ac new file mode 100644 index 0000000..5d6085a --- /dev/null +++ b/configure.ac @@ -0,0 +1,412 @@ +AC_INIT([H5hut], [1.99.10], [h5part@lists.psi.ch], H5hut) +AC_PREREQ(2.60) +AC_CONFIG_HEADERS(config.h) +AC_CONFIG_MACRO_DIR([m4]) +AM_INIT_AUTOMAKE + +BUILD_LIBS='libH5hut' + +ENABLE_DEBUG='no' +ENABLE_C='yes' +ENABLE_FORTRAN='no' +ENABLE_PARALLEL='no' + +############################################################################### +# --enable-xxx and --with-xxx Arguments +AC_ARG_ENABLE( + [debug], + [AS_HELP_STRING([--enable-debug], [Compile with debug flags [default=no]])], + [ENABLE_DEBUG=$enableval]) +AM_CONDITIONAL([ENABLE_DEBUG], [test "$ENABLE_DEBUG" = "yes"]) + +AC_ARG_ENABLE( + [c], + [AS_HELP_STRING([--enable-c], + [Compile the C interface [default=yes]])], + [ENABLE_C=$enableval]) +AM_CONDITIONAL([ENABLE_C], [test "$ENABLE_C" = "yes"]) + +AC_ARG_ENABLE( + [fortran], + [AS_HELP_STRING([--enable-fortran], + [Compile the Fortran interface [default=no]])], + [ENABLE_FORTRAN=$enableval]) +AM_CONDITIONAL([ENABLE_FORTRAN], [test "$ENABLE_FORTRAN" = "yes"]) + +AC_ARG_ENABLE( + [parallel], + [AS_HELP_STRING([--enable-parallel], + [Compile the MPI/IO interface [default=no]])], + [ENABLE_PARALLEL=$enableval]) +AM_CONDITIONAL([ENABLE_PARALLEL], [test "$ENABLE_PARALLEL" = "yes"]) + +AC_ARG_ENABLE( + [large-indices], + [AC_HELP_STRING([--enable-large-indices], + [Compile with 64bit local IDs and indices [default=no]])], + [USE_LARGE_INDICES=$enableval]) + +AC_ARG_ENABLE( + [experimental], + [AS_HELP_STRING([--enable-experimental], + [Compile experimental code [default=no]])], + [ENABLE_EXPERIMENTAL=$enableval]) +AM_CONDITIONAL([ENABLE_EXPERIMENTAL], [test "$ENABLE_EXPERIMENTAL" = "yes"]) + +AC_ARG_ENABLE( + [vtkconverter], + [AS_HELP_STRING([--enable-vtkconverter], + [Compile the vtk to H5hut converter for grids [default=no]])], + [ENABLE_VTKCONVERTER=$enableval]) +AM_CONDITIONAL([ENABLE_VTKCONVERTER], [test "$ENABLE_VTKCONVERTER" = "yes"]) + +AC_ARG_WITH( + [hdf5], + [AS_HELP_STRING([--with-hdf5], + [path to HDF5 installation [default=""]])], + [HDF5_PREFIX=$withval], [HDF5_PREFIX=""]) + +AC_ARG_WITH( + [mpi], + [AS_HELP_STRING([--with-mpi], + [path to MPI installation [default=""]])], + [PATH=$MPI_PREFIX/bin:$PATH]) + +AC_ARG_WITH( + [lustre], + [AS_HELP_STRING([--with-lustre], + [path to lustre user API [default=""]])], + [LUSTREPATH=$withval], [LUSTREPATH=""]) + +AC_ARG_WITH( + [parmetis], + [AC_HELP_STRING([--with-parmetis], + [path to ParMETIS API [default=""]])], + [PARMETISPATH=$withval], [PARMETISPATH=""]) + + +############################################################################### +############### PATH SERACH FUNCTION - to be used later... #################### +############################################################################### +# /*@@ +# @routine CCTK_Search +# @date Wed Jul 21 11:16:35 1999 +# @author Tom Goodale +# @desc +# Used to search for something in various directories +# @enddesc +#@@*/ + +PATH_Search() { + eval $1="" + if test $# -lt 4 ; then + h5part_basedir="" + else + h5part_basedir="$4/" + fi + for h5part_place in $2; do + AC_MSG_CHECKING([looking in $h5part_place ... ]) + if test -r "$h5part_basedir$h5part_place/$3" ; then + AC_MSG_RESULT([found]) + eval $1="$h5part_place" + break + fi + AC_MSG_RESULT([no]) + done + return +} + +############################################################################### +# MISC SETTINGS INCLUDING C & C++ COMPILER SETTING + +# Compute the canonical host-system type variable, host, and its three +# individual parts host_cpu, host_vendor, and host_os. +AC_CANONICAL_HOST +AC_PROG_MAKE_SET + +# debug enabled? +AC_MSG_CHECKING([if debug is enabled]) +if test "X$ENABLE_DEBUG" = "Xyes"; then + AC_MSG_RESULT([yes]) + CFLAGS="$CFLAGS -g -Wall" + CXXFLAGS="$CFLAGS -g -Wall" + FFLAGS="$FFLAGS -g" +else + AC_MSG_RESULT([no]) +fi + +# Determine a C/C++ compiler to use. +# If CC is not already set in the environment, check for other C compilers. +# Set output variable CC to the name of the compiler found. +if test "x$ENABLE_PARALLEL" = "xyes"; then + CCOMPILERS="mpicc" + CXXCOMPILERS="mpic++" +else + CCOMPILERS="pgcc pathcc icc gcc cc_r cc" + CXXCOMPILERS="pgcc pathcc icc g++ cc_r c++" +fi + +AC_PROG_CC($CCOMPILERS) +CC=`which $CC` +AC_PROG_CXX($CXXCOMPILERS) +CXX=`which $CXX` + +# Use macro to set C99 mode instead of checking for gcc, which breaks with +# parallel builds. +AC_PROG_CC_C99 +if test "x$ac_cv_prog_cc_c99" = "xno"; then + AC_MSG_ERROR([Cannot set C compiler to use C99 standard!]) + exit 1 +fi + +# Set output variable INSTALL to the path of a BSD-compatible install program, +# if one is found in the current PATH. +# Otherwise, set INSTALL to `dir/install-sh -c` +AC_PROG_INSTALL +AC_PROG_AWK + +# Disable shared libraries by default: can be enabled with --enable-shared +LT_INIT([disable-shared]) +AC_PROG_LIBTOOL + +# Default prefix for bindir, etc... (eg >> ./build/bin) +AC_PREFIX_DEFAULT(`pwd`/build) + +# Checks for header files. +AC_CHECK_HEADERS([fcntl.h limits.h stdint.h stdlib.h string.h sys/ioctl.h unistd.h]) + +# Checks for typedefs, structures, and compiler characteristics. +AC_HEADER_STDBOOL +AC_C_INLINE +AC_TYPE_INT16_T +AC_TYPE_INT32_T +AC_TYPE_INT64_T +AC_TYPE_SIZE_T +AC_TYPE_SSIZE_T +AC_TYPE_UINT16_T +AC_TYPE_UINT32_T +AC_TYPE_UINT64_T +AC_CHECK_TYPES([ptrdiff_t]) + +# Checks for library functions. +AC_FUNC_MALLOC +AC_FUNC_REALLOC +AC_CHECK_FUNCS([memmove memset pow strchr strdup strerror strstr]) + +# AC_DEFINE_UNQUOTED (variable, value, [description]) +# Define the C preprocessor variable variable to value +# Use this macro instead of AC_DEFINE when variable or value is a shell variable. +AC_DEFINE_UNQUOTED(MY_BUILD_VENDOR, "$host_vendor", "") +AC_DEFINE_UNQUOTED(MY_BUILD_CPU, "$host_cpu", "") +AC_DEFINE_UNQUOTED(MY_BUILD_OS, "$host_os", "") +AC_DEFINE_UNQUOTED(MY_GNUNAME, "${host_cpu}-${host_vendor}-${host_os}", "") +AC_DEFINE_UNQUOTED(MY_UNAME, "$uname", "") + + +############################################################################### +# PROCESS ARGUMENTS + +# C enabled? +AC_MSG_CHECKING([if C interface enabled]) +if test "X$ENABLE_C" = "Xyes"; then + AC_MSG_RESULT([yes]) + BINDINGS="$BINDINGS C" + BUILD_LIBS="$BUILD_LIBS" + BUILD_TESTS="$BUILD_TESTS h5u_test h5b_test" + BUILD_TOOLS="$BUILD_TOOLS h5hutcc" +else + AC_MSG_RESULT([no]) +fi + +# fortran enabled? +AC_MSG_CHECKING([if fortran interface enabled]) +if test "X$ENABLE_FORTRAN" = "Xyes"; then + AC_MSG_RESULT([yes]) + BINDINGS="$BINDINGS Fortran" + LIB_FORTRAN="libH5hutF.la" + BUILD_LIBS="$BUILD_LIBS libH5hutF" + + if test "X$ENABLE_PARALLEL" = "Xyes"; then + AC_PROG_FC(mpif90 mpif77) + else + AC_PROG_FC(pgf90 ifort xlf_r pathf90 g95 g90 ftn gfortran) + fi + FC=`which $FC` + if test -z "$FC" ; then + AC_MSG_ERROR([Cannot find a Fortran compiler!]) + exit 1 + fi + + if test $FC = "g90"; then + FFLAGS="${FFLAGS} -fno-second-underscore" + fi + + if test $FC = "g95"; then + FFLAGS="${FFLAGS} -fno-second-underscore" + fi + + AC_MSG_CHECKING([symbol convention in object files]) + `cd src/Fortran && rm -f TestUnderscore.o TestUnderscoreC.o TestUnderscore` + `cd src/Fortran && ${FC} ${FFLAGS} -c TestUnderscore.f` + `cd src/Fortran && ${CC} ${CFLAGS} -c TestUnderscoreC.c` + `cd src/Fortran && ${FC} ${FFLAGS} -o TestUnderscore TestUnderscore.o TestUnderscoreC.o` + + if test -f src/Fortran/TestUnderscore ; then + UNDERSCORE_H=Underscore.h + `cd src/Fortran && ./TestUnderscore > Underscore.h` + AC_MSG_RESULT([ok]) + else + AC_MSG_RESULT([nok]) + AC_MSG_ERROR([Cannot determine the symbol convention for Fortran object files!]) + exit 1 + fi + +else + AC_MSG_RESULT([no]) +fi + +######################## large indices enabled ########################### +AC_MSG_CHECKING([if large indices are enabled]) +if test "X$USE_LARGE_INDICES" = "Xyes"; then + AC_MSG_RESULT([yes]) + CFLAGS="${CFLAGS} -DUSE_LARGE_INDICES" +else + AC_MSG_RESULT([no]) +fi + +######################## parallel interface enabled ########################### +AC_MSG_CHECKING([if parallel interface enabled]) +if test "X$ENABLE_PARALLEL" = "Xyes"; then + AC_MSG_RESULT([yes]) + AM_CPPFLAGS="${AM_CPPFLAGS} -DPARALLEL_IO -DMPICH_IGNORE_CXX_SEEK" + + if test "X$ENABLE_EXPERIMENTAL" = "Xyes"; then + AC_MSG_CHECKING([for ParMETIS]) + if test "X$PARMETISPATH" != "X"; then + AM_CPPFLAGS="$AM_CPPFLAGS -I$PARMETISPATH/include" + LDFLAGS="$LDFLAGS -L$PARMETISPATH/lib" + fi + + LIBS="$LIBS -lparmetis -lmetis" + AC_TRY_LINK([#include ], [ + ParMETIS_V3_PartGeom (NULL, NULL, NULL, NULL, NULL);], + [AC_MSG_RESULT([yes]); r='yes'], [AC_MSG_RESULT([no]); r='no'] ) + + if test "X$r" = "Xno"; then + AC_MSG_ERROR([ParMETIS]) + exit 1 + fi + fi +else # --enable-parallel=no + AC_MSG_RESULT([no]) +fi + +############################################################################### +# LIBRARY PATHS +if test -n "${HDF5_PREFIX}" ; then + AM_CPPFLAGS="$AM_CPPFLAGS -I$HDF5_PREFIX/include" + LDFLAGS="$LDFLAGS -L$HDF5_PREFIX/lib" +fi +AC_CHECK_LIB([z], [compress2]) +AC_CHECK_LIB([hdf5], [H5open]) +AS_IF([test "x$ac_cv_lib_hdf5_H5open" != xyes], + [AC_MSG_ERROR([Cannot compile and link a HDF5 program]); + exit 1]) + + +AC_MSG_CHECKING([for lustre API ]) +AC_MSG_RESULT([]) +if test -n "${LUSTREPATH}"; then + P=${LUSTREPATH} +elif test -n "${LUSTREROOT}" ; then + P=${LUSTREROOT} +elif test -n "${LUSTREHOME}" ; then + P=${LUSTREHOME} +elif test -n "${LUSTRE_DIR}" ; then + P=${LUSTRE_DIR} +else + P='' + P="$P /usr" + P="$P /usr/local" + P="$P /usr/local/lustre" + P="$P /opt/lustre" +fi +PATH_Search LUSTREROOT "$P" usr/include/lustre/liblustreapi.h +if test -z "$LUSTREROOT"; then + AC_MSG_WARN([Couldn't locate the lustre API... building without support for lustre striping!]) +else + CFLAGS="$CFLAGS -DH5_USE_LUSTRE" + AM_CPPFLAGS="$AM_CPPFLAGS -I$LUSTREROOT/usr/include" + LDFLAGS="$LDFLAGS -L$LUSTREROOT/usr/lib" + LIBS="$LIBS -llustreapi" +fi + +LIBS="$LIBS -lm" + +############################################################################### +# TOOLS +AC_MSG_CHECKING([if we have to compile the VTK to H5hut grid converter]) +if test "X$ENABLE_VTKCONVERTER" = "Xyes"; then + AC_MSG_RESULT([yes]) + # :TODO: add test whether we can compile/link a prog with vtk +else + AC_MSG_RESULT([no]) +fi + +############################################################################### +# EXPORTING VARIABLES & CREATING OUTPUT FILES +AC_SUBST(HDF5_PREFIX) +AC_SUBST(LUSTREROOT) +AC_SUBST(CFLAGS) +AC_SUBST(FFLAGS) +AC_SUBST(AM_CPPFLAGS) +AC_SUBST(LDFLAGS) +AC_SUBST(LIBS) +AC_SUBST(UNDERSCORE_H) +AC_SUBST(LIB_FORTRAN) +AC_SUBST(BINDINGS) +AC_SUBST(BUILD_TESTS) +AC_SUBST(BUILD_TOOLS) + +AC_CONFIG_FILES([ + Makefile + src/Makefile + src/h5core/Makefile + src/include/Makefile + src/C/Makefile + src/Fortran/Makefile + test/Makefile + doc/Makefile + examples/H5/Makefile + examples/H5Part/Makefile + examples/H5Block/Makefile + examples/H5Fed/Makefile + tools/Makefile + tools/h5hutcc + tools/vtk2h5grid/Makefile +]) + +AC_OUTPUT + +############################################################################### +# PRINTING SUMMARY +AC_MSG_RESULT([ ]) +AC_MSG_RESULT([Summary:]) +AC_MSG_RESULT([ ]) +AC_MSG_RESULT([Host OS: $host_os]) +AC_MSG_RESULT([Host CPU: $host_cpu]) +AC_MSG_RESULT([Host vendor: $host_vendor]) +AC_MSG_RESULT([Build libraries: $BUILD_LIBS]) +AC_MSG_RESULT([Build test programs: $BUILD_TESTS]) +AC_MSG_RESULT([Build tools: $BUILD_TOOLS]) +AC_MSG_RESULT([CC = $CC]) +AC_MSG_RESULT([CXX = $CXX]) +AC_MSG_RESULT([FC = $FC]) +AC_MSG_RESULT([CFLAGS = $CFLAGS]) +AC_MSG_RESULT([FFLAGS = $FFLAGS]) +AC_MSG_RESULT([AM_CPPFLAGS = $AM_CPPFLAGS]) +AC_MSG_RESULT([LDFLAGS = $LDFLAGS]) +AC_MSG_RESULT([LIBS = $LIBS]) +AC_MSG_RESULT([HDF5_PREFIX = $HDF5_PREFIX]) +AC_MSG_RESULT([LUSTREROOT = $LUSTREROOT]) +AC_MSG_RESULT([ ]) diff --git a/doc/Doxyfile b/doc/Doxyfile new file mode 100644 index 0000000..82802e3 --- /dev/null +++ b/doc/Doxyfile @@ -0,0 +1,1816 @@ +# Doxyfile 1.8.0 + +# This file describes the settings to be used by the documentation system +# doxygen (www.doxygen.org) for a project. +# +# All text after a hash (#) is considered a comment and will be ignored. +# The format is: +# TAG = value [value, ...] +# For lists items can also be appended using: +# TAG += value [value, ...] +# Values that contain spaces should be placed between quotes (" "). + +#--------------------------------------------------------------------------- +# Project related configuration options +#--------------------------------------------------------------------------- + +# This tag specifies the encoding used for all characters in the config file +# that follow. The default is UTF-8 which is also the encoding used for all +# text before the first occurrence of this tag. Doxygen uses libiconv (or the +# iconv built into libc) for the transcoding. See +# http://www.gnu.org/software/libiconv for the list of possible encodings. + +DOXYFILE_ENCODING = UTF-8 + +# The PROJECT_NAME tag is a single word (or sequence of words) that should +# identify the project. Note that if you do not use Doxywizard you need +# to put quotes around the project name if it contains spaces. + +PROJECT_NAME = H5hut + +# The PROJECT_NUMBER tag can be used to enter a project or revision number. +# This could be handy for archiving the generated documentation or +# if some version control system is used. + +PROJECT_NUMBER = 1.99 + +# Using the PROJECT_BRIEF tag one can provide an optional one line description +# for a project that appears at the top of each page and should give viewer +# a quick idea about the purpose of the project. Keep the description short. + +PROJECT_BRIEF = + +# With the PROJECT_LOGO tag one can specify an logo or icon that is +# included in the documentation. The maximum height of the logo should not +# exceed 55 pixels and the maximum width should not exceed 200 pixels. +# Doxygen will copy the logo to the output directory. + +PROJECT_LOGO = + +# The OUTPUT_DIRECTORY tag is used to specify the (relative or absolute) +# base path where the generated documentation will be put. +# If a relative path is entered, it will be relative to the location +# where doxygen was started. If left blank the current directory will be used. + +OUTPUT_DIRECTORY = /var/cache/doxygen/H5hut/2.0/html +#OUTPUT_DIRECTORY = ./ReferencePages + +# If the CREATE_SUBDIRS tag is set to YES, then doxygen will create +# 4096 sub-directories (in 2 levels) under the output directory of each output +# format and will distribute the generated files over these directories. +# Enabling this option can be useful when feeding doxygen a huge amount of +# source files, where putting all generated files in the same directory would +# otherwise cause performance problems for the file system. + +CREATE_SUBDIRS = NO + +# The OUTPUT_LANGUAGE tag is used to specify the language in which all +# documentation generated by doxygen is written. Doxygen will use this +# information to generate all constant output in the proper language. +# The default language is English, other supported languages are: +# Afrikaans, Arabic, Brazilian, Catalan, Chinese, Chinese-Traditional, +# Croatian, Czech, Danish, Dutch, Esperanto, Farsi, Finnish, French, German, +# Greek, Hungarian, Italian, Japanese, Japanese-en (Japanese with English +# messages), Korean, Korean-en, Lithuanian, Norwegian, Macedonian, Persian, +# Polish, Portuguese, Romanian, Russian, Serbian, Serbian-Cyrillic, Slovak, +# Slovene, Spanish, Swedish, Ukrainian, and Vietnamese. + +OUTPUT_LANGUAGE = English + +# If the BRIEF_MEMBER_DESC tag is set to YES (the default) Doxygen will +# include brief member descriptions after the members that are listed in +# the file and class documentation (similar to JavaDoc). +# Set to NO to disable this. + +BRIEF_MEMBER_DESC = YES + +# If the REPEAT_BRIEF tag is set to YES (the default) Doxygen will prepend +# the brief description of a member or function before the detailed description. +# Note: if both HIDE_UNDOC_MEMBERS and BRIEF_MEMBER_DESC are set to NO, the +# brief descriptions will be completely suppressed. + +REPEAT_BRIEF = YES + +# This tag implements a quasi-intelligent brief description abbreviator +# that is used to form the text in various listings. Each string +# in this list, if found as the leading text of the brief description, will be +# stripped from the text and the result after processing the whole list, is +# used as the annotated text. Otherwise, the brief description is used as-is. +# If left blank, the following values are used ("$name" is automatically +# replaced with the name of the entity): "The $name class" "The $name widget" +# "The $name file" "is" "provides" "specifies" "contains" +# "represents" "a" "an" "the" + +ABBREVIATE_BRIEF = "The $name class" \ + "The $name widget" \ + "The $name file" \ + is \ + provides \ + specifies \ + contains \ + represents \ + a \ + an \ + the + +# If the ALWAYS_DETAILED_SEC and REPEAT_BRIEF tags are both set to YES then +# Doxygen will generate a detailed section even if there is only a brief +# description. + +ALWAYS_DETAILED_SEC = NO + +# If the INLINE_INHERITED_MEMB tag is set to YES, doxygen will show all +# inherited members of a class in the documentation of that class as if those +# members were ordinary class members. Constructors, destructors and assignment +# operators of the base classes will not be shown. + +INLINE_INHERITED_MEMB = NO + +# If the FULL_PATH_NAMES tag is set to YES then Doxygen will prepend the full +# path before files name in the file list and in the header files. If set +# to NO the shortest path that makes the file name unique will be used. + +FULL_PATH_NAMES = YES + +# If the FULL_PATH_NAMES tag is set to YES then the STRIP_FROM_PATH tag +# can be used to strip a user-defined part of the path. Stripping is +# only done if one of the specified strings matches the left-hand part of +# the path. The tag can be used to show relative paths in the file list. +# If left blank the directory from which doxygen is run is used as the +# path to strip. + +STRIP_FROM_PATH = ../src + +# The STRIP_FROM_INC_PATH tag can be used to strip a user-defined part of +# the path mentioned in the documentation of a class, which tells +# the reader which header file to include in order to use a class. +# If left blank only the name of the header file containing the class +# definition is used. Otherwise one should specify the include paths that +# are normally passed to the compiler using the -I flag. + +STRIP_FROM_INC_PATH = + +# If the SHORT_NAMES tag is set to YES, doxygen will generate much shorter +# (but less readable) file names. This can be useful if your file system +# doesn't support long names like on DOS, Mac, or CD-ROM. + +SHORT_NAMES = NO + +# If the JAVADOC_AUTOBRIEF tag is set to YES then Doxygen +# will interpret the first line (until the first dot) of a JavaDoc-style +# comment as the brief description. If set to NO, the JavaDoc +# comments will behave just like regular Qt-style comments +# (thus requiring an explicit @brief command for a brief description.) + +JAVADOC_AUTOBRIEF = NO + +# If the QT_AUTOBRIEF tag is set to YES then Doxygen will +# interpret the first line (until the first dot) of a Qt-style +# comment as the brief description. If set to NO, the comments +# will behave just like regular Qt-style comments (thus requiring +# an explicit \brief command for a brief description.) + +QT_AUTOBRIEF = NO + +# The MULTILINE_CPP_IS_BRIEF tag can be set to YES to make Doxygen +# treat a multi-line C++ special comment block (i.e. a block of //! or /// +# comments) as a brief description. This used to be the default behaviour. +# The new default is to treat a multi-line C++ comment block as a detailed +# description. Set this tag to YES if you prefer the old behaviour instead. + +MULTILINE_CPP_IS_BRIEF = NO + +# If the INHERIT_DOCS tag is set to YES (the default) then an undocumented +# member inherits the documentation from any documented member that it +# re-implements. + +INHERIT_DOCS = YES + +# If the SEPARATE_MEMBER_PAGES tag is set to YES, then doxygen will produce +# a new page for each member. If set to NO, the documentation of a member will +# be part of the file/class/namespace that contains it. + +SEPARATE_MEMBER_PAGES = NO + +# The TAB_SIZE tag can be used to set the number of spaces in a tab. +# Doxygen uses this value to replace tabs by spaces in code fragments. + +TAB_SIZE = 8 + +# This tag can be used to specify a number of aliases that acts +# as commands in the documentation. An alias has the form "name=value". +# For example adding "sideeffect=\par Side Effects:\n" will allow you to +# put the command \sideeffect (or @sideeffect) in the documentation, which +# will result in a user-defined paragraph with heading "Side Effects:". +# You can put \n's in the value part of an alias to insert newlines. + +ALIASES = + +# This tag can be used to specify a number of word-keyword mappings (TCL only). +# A mapping has the form "name=value". For example adding +# "class=itcl::class" will allow you to use the command class in the +# itcl::class meaning. + +TCL_SUBST = + +# Set the OPTIMIZE_OUTPUT_FOR_C tag to YES if your project consists of C +# sources only. Doxygen will then generate output that is more tailored for C. +# For instance, some of the names that are used will be different. The list +# of all members will be omitted, etc. + +OPTIMIZE_OUTPUT_FOR_C = YES + +# Set the OPTIMIZE_OUTPUT_JAVA tag to YES if your project consists of Java +# sources only. Doxygen will then generate output that is more tailored for +# Java. For instance, namespaces will be presented as packages, qualified +# scopes will look different, etc. + +OPTIMIZE_OUTPUT_JAVA = NO + +# Set the OPTIMIZE_FOR_FORTRAN tag to YES if your project consists of Fortran +# sources only. Doxygen will then generate output that is more tailored for +# Fortran. + +OPTIMIZE_FOR_FORTRAN = NO + +# Set the OPTIMIZE_OUTPUT_VHDL tag to YES if your project consists of VHDL +# sources. Doxygen will then generate output that is tailored for +# VHDL. + +OPTIMIZE_OUTPUT_VHDL = NO + +# Doxygen selects the parser to use depending on the extension of the files it +# parses. With this tag you can assign which parser to use for a given extension. +# Doxygen has a built-in mapping, but you can override or extend it using this +# tag. The format is ext=language, where ext is a file extension, and language +# is one of the parsers supported by doxygen: IDL, Java, Javascript, CSharp, C, +# C++, D, PHP, Objective-C, Python, Fortran, VHDL, C, C++. For instance to make +# doxygen treat .inc files as Fortran files (default is PHP), and .f files as C +# (default is Fortran), use: inc=Fortran f=C. Note that for custom extensions +# you also need to set FILE_PATTERNS otherwise the files are not read by doxygen. + +EXTENSION_MAPPING = + +# If MARKDOWN_SUPPORT is enabled (the default) then doxygen pre-processes all +# comments according to the Markdown format, which allows for more readable +# documentation. See http://daringfireball.net/projects/markdown/ for details. +# The output of markdown processing is further processed by doxygen, so you +# can mix doxygen, HTML, and XML commands with Markdown formatting. +# Disable only in case of backward compatibilities issues. + +MARKDOWN_SUPPORT = YES + +# If you use STL classes (i.e. std::string, std::vector, etc.) but do not want +# to include (a tag file for) the STL sources as input, then you should +# set this tag to YES in order to let doxygen match functions declarations and +# definitions whose arguments contain STL classes (e.g. func(std::string); v.s. +# func(std::string) {}). This also makes the inheritance and collaboration +# diagrams that involve STL classes more complete and accurate. + +BUILTIN_STL_SUPPORT = NO + +# If you use Microsoft's C++/CLI language, you should set this option to YES to +# enable parsing support. + +CPP_CLI_SUPPORT = NO + +# Set the SIP_SUPPORT tag to YES if your project consists of sip sources only. +# Doxygen will parse them like normal C++ but will assume all classes use public +# instead of private inheritance when no explicit protection keyword is present. + +SIP_SUPPORT = NO + +# For Microsoft's IDL there are propget and propput attributes to indicate getter +# and setter methods for a property. Setting this option to YES (the default) +# will make doxygen replace the get and set methods by a property in the +# documentation. This will only work if the methods are indeed getting or +# setting a simple type. If this is not the case, or you want to show the +# methods anyway, you should set this option to NO. + +IDL_PROPERTY_SUPPORT = YES + +# If member grouping is used in the documentation and the DISTRIBUTE_GROUP_DOC +# tag is set to YES, then doxygen will reuse the documentation of the first +# member in the group (if any) for the other members of the group. By default +# all members of a group must be documented explicitly. + +DISTRIBUTE_GROUP_DOC = NO + +# Set the SUBGROUPING tag to YES (the default) to allow class member groups of +# the same type (for instance a group of public functions) to be put as a +# subgroup of that type (e.g. under the Public Functions section). Set it to +# NO to prevent subgrouping. Alternatively, this can be done per class using +# the \nosubgrouping command. + +SUBGROUPING = YES + +# When the INLINE_GROUPED_CLASSES tag is set to YES, classes, structs and +# unions are shown inside the group in which they are included (e.g. using +# @ingroup) instead of on a separate page (for HTML and Man pages) or +# section (for LaTeX and RTF). + +INLINE_GROUPED_CLASSES = NO + +# When the INLINE_SIMPLE_STRUCTS tag is set to YES, structs, classes, and +# unions with only public data fields will be shown inline in the documentation +# of the scope in which they are defined (i.e. file, namespace, or group +# documentation), provided this scope is documented. If set to NO (the default), +# structs, classes, and unions are shown on a separate page (for HTML and Man +# pages) or section (for LaTeX and RTF). + +INLINE_SIMPLE_STRUCTS = NO + +# When TYPEDEF_HIDES_STRUCT is enabled, a typedef of a struct, union, or enum +# is documented as struct, union, or enum with the name of the typedef. So +# typedef struct TypeS {} TypeT, will appear in the documentation as a struct +# with name TypeT. When disabled the typedef will appear as a member of a file, +# namespace, or class. And the struct will be named TypeS. This can typically +# be useful for C code in case the coding convention dictates that all compound +# types are typedef'ed and only the typedef is referenced, never the tag name. + +TYPEDEF_HIDES_STRUCT = NO + +# The SYMBOL_CACHE_SIZE determines the size of the internal cache use to +# determine which symbols to keep in memory and which to flush to disk. +# When the cache is full, less often used symbols will be written to disk. +# For small to medium size projects (<1000 input files) the default value is +# probably good enough. For larger projects a too small cache size can cause +# doxygen to be busy swapping symbols to and from disk most of the time +# causing a significant performance penalty. +# If the system has enough physical memory increasing the cache will improve the +# performance by keeping more symbols in memory. Note that the value works on +# a logarithmic scale so increasing the size by one will roughly double the +# memory usage. The cache size is given by this formula: +# 2^(16+SYMBOL_CACHE_SIZE). The valid range is 0..9, the default is 0, +# corresponding to a cache size of 2^16 = 65536 symbols. + +SYMBOL_CACHE_SIZE = 0 + +# Similar to the SYMBOL_CACHE_SIZE the size of the symbol lookup cache can be +# set using LOOKUP_CACHE_SIZE. This cache is used to resolve symbols given +# their name and scope. Since this can be an expensive process and often the +# same symbol appear multiple times in the code, doxygen keeps a cache of +# pre-resolved symbols. If the cache is too small doxygen will become slower. +# If the cache is too large, memory is wasted. The cache size is given by this +# formula: 2^(16+LOOKUP_CACHE_SIZE). The valid range is 0..9, the default is 0, +# corresponding to a cache size of 2^16 = 65536 symbols. + +LOOKUP_CACHE_SIZE = 0 + +#--------------------------------------------------------------------------- +# Build related configuration options +#--------------------------------------------------------------------------- + +# If the EXTRACT_ALL tag is set to YES doxygen will assume all entities in +# documentation are documented, even if no documentation was available. +# Private class members and static file members will be hidden unless +# the EXTRACT_PRIVATE and EXTRACT_STATIC tags are set to YES + +EXTRACT_ALL = NO + +# If the EXTRACT_PRIVATE tag is set to YES all private members of a class +# will be included in the documentation. + +EXTRACT_PRIVATE = NO + +# If the EXTRACT_PACKAGE tag is set to YES all members with package or internal scope will be included in the documentation. + +EXTRACT_PACKAGE = NO + +# If the EXTRACT_STATIC tag is set to YES all static members of a file +# will be included in the documentation. + +EXTRACT_STATIC = NO + +# If the EXTRACT_LOCAL_CLASSES tag is set to YES classes (and structs) +# defined locally in source files will be included in the documentation. +# If set to NO only classes defined in header files are included. + +EXTRACT_LOCAL_CLASSES = NO + +# This flag is only useful for Objective-C code. When set to YES local +# methods, which are defined in the implementation section but not in +# the interface are included in the documentation. +# If set to NO (the default) only methods in the interface are included. + +EXTRACT_LOCAL_METHODS = NO + +# If this flag is set to YES, the members of anonymous namespaces will be +# extracted and appear in the documentation as a namespace called +# 'anonymous_namespace{file}', where file will be replaced with the base +# name of the file that contains the anonymous namespace. By default +# anonymous namespaces are hidden. + +EXTRACT_ANON_NSPACES = NO + +# If the HIDE_UNDOC_MEMBERS tag is set to YES, Doxygen will hide all +# undocumented members of documented classes, files or namespaces. +# If set to NO (the default) these members will be included in the +# various overviews, but no documentation section is generated. +# This option has no effect if EXTRACT_ALL is enabled. + +HIDE_UNDOC_MEMBERS = YES + +# If the HIDE_UNDOC_CLASSES tag is set to YES, Doxygen will hide all +# undocumented classes that are normally visible in the class hierarchy. +# If set to NO (the default) these classes will be included in the various +# overviews. This option has no effect if EXTRACT_ALL is enabled. + +HIDE_UNDOC_CLASSES = YES + +# If the HIDE_FRIEND_COMPOUNDS tag is set to YES, Doxygen will hide all +# friend (class|struct|union) declarations. +# If set to NO (the default) these declarations will be included in the +# documentation. + +HIDE_FRIEND_COMPOUNDS = NO + +# If the HIDE_IN_BODY_DOCS tag is set to YES, Doxygen will hide any +# documentation blocks found inside the body of a function. +# If set to NO (the default) these blocks will be appended to the +# function's detailed documentation block. + +HIDE_IN_BODY_DOCS = NO + +# The INTERNAL_DOCS tag determines if documentation +# that is typed after a \internal command is included. If the tag is set +# to NO (the default) then the documentation will be excluded. +# Set it to YES to include the internal documentation. + +INTERNAL_DOCS = NO + +# If the CASE_SENSE_NAMES tag is set to NO then Doxygen will only generate +# file names in lower-case letters. If set to YES upper-case letters are also +# allowed. This is useful if you have classes or files whose names only differ +# in case and if your file system supports case sensitive file names. Windows +# and Mac users are advised to set this option to NO. + +CASE_SENSE_NAMES = YES + +# If the HIDE_SCOPE_NAMES tag is set to NO (the default) then Doxygen +# will show members with their full class and namespace scopes in the +# documentation. If set to YES the scope will be hidden. + +HIDE_SCOPE_NAMES = NO + +# If the SHOW_INCLUDE_FILES tag is set to YES (the default) then Doxygen +# will put a list of the files that are included by a file in the documentation +# of that file. + +SHOW_INCLUDE_FILES = NO + +# If the FORCE_LOCAL_INCLUDES tag is set to YES then Doxygen +# will list include files with double quotes in the documentation +# rather than with sharp brackets. + +FORCE_LOCAL_INCLUDES = NO + +# If the INLINE_INFO tag is set to YES (the default) then a tag [inline] +# is inserted in the documentation for inline members. + +INLINE_INFO = YES + +# If the SORT_MEMBER_DOCS tag is set to YES (the default) then doxygen +# will sort the (detailed) documentation of file and class members +# alphabetically by member name. If set to NO the members will appear in +# declaration order. + +SORT_MEMBER_DOCS = NO + +# If the SORT_BRIEF_DOCS tag is set to YES then doxygen will sort the +# brief documentation of file, namespace and class members alphabetically +# by member name. If set to NO (the default) the members will appear in +# declaration order. + +SORT_BRIEF_DOCS = NO + +# If the SORT_MEMBERS_CTORS_1ST tag is set to YES then doxygen +# will sort the (brief and detailed) documentation of class members so that +# constructors and destructors are listed first. If set to NO (the default) +# the constructors will appear in the respective orders defined by +# SORT_MEMBER_DOCS and SORT_BRIEF_DOCS. +# This tag will be ignored for brief docs if SORT_BRIEF_DOCS is set to NO +# and ignored for detailed docs if SORT_MEMBER_DOCS is set to NO. + +SORT_MEMBERS_CTORS_1ST = NO + +# If the SORT_GROUP_NAMES tag is set to YES then doxygen will sort the +# hierarchy of group names into alphabetical order. If set to NO (the default) +# the group names will appear in their defined order. + +SORT_GROUP_NAMES = NO + +# If the SORT_BY_SCOPE_NAME tag is set to YES, the class list will be +# sorted by fully-qualified names, including namespaces. If set to +# NO (the default), the class list will be sorted only by class name, +# not including the namespace part. +# Note: This option is not very useful if HIDE_SCOPE_NAMES is set to YES. +# Note: This option applies only to the class list, not to the +# alphabetical list. + +SORT_BY_SCOPE_NAME = NO + +# If the STRICT_PROTO_MATCHING option is enabled and doxygen fails to +# do proper type resolution of all parameters of a function it will reject a +# match between the prototype and the implementation of a member function even +# if there is only one candidate or it is obvious which candidate to choose +# by doing a simple string match. By disabling STRICT_PROTO_MATCHING doxygen +# will still accept a match between prototype and implementation in such cases. + +STRICT_PROTO_MATCHING = NO + +# The GENERATE_TODOLIST tag can be used to enable (YES) or +# disable (NO) the todo list. This list is created by putting \todo +# commands in the documentation. + +GENERATE_TODOLIST = NO + +# The GENERATE_TESTLIST tag can be used to enable (YES) or +# disable (NO) the test list. This list is created by putting \test +# commands in the documentation. + +GENERATE_TESTLIST = YES + +# The GENERATE_BUGLIST tag can be used to enable (YES) or +# disable (NO) the bug list. This list is created by putting \bug +# commands in the documentation. + +GENERATE_BUGLIST = YES + +# The GENERATE_DEPRECATEDLIST tag can be used to enable (YES) or +# disable (NO) the deprecated list. This list is created by putting +# \deprecated commands in the documentation. + +GENERATE_DEPRECATEDLIST= YES + +# The ENABLED_SECTIONS tag can be used to enable conditional +# documentation sections, marked by \if sectionname ... \endif. + +ENABLED_SECTIONS = + +# The MAX_INITIALIZER_LINES tag determines the maximum number of lines +# the initial value of a variable or macro consists of for it to appear in +# the documentation. If the initializer consists of more lines than specified +# here it will be hidden. Use a value of 0 to hide initializers completely. +# The appearance of the initializer of individual variables and macros in the +# documentation can be controlled using \showinitializer or \hideinitializer +# command in the documentation regardless of this setting. + +MAX_INITIALIZER_LINES = 0 + +# Set the SHOW_USED_FILES tag to NO to disable the list of files generated +# at the bottom of the documentation of classes and structs. If set to YES the +# list will mention the files that were used to generate the documentation. + +SHOW_USED_FILES = NO + +# If the sources in your project are distributed over multiple directories +# then setting the SHOW_DIRECTORIES tag to YES will show the directory hierarchy +# in the documentation. The default is NO. + +SHOW_DIRECTORIES = NO + +# Set the SHOW_FILES tag to NO to disable the generation of the Files page. +# This will remove the Files entry from the Quick Index and from the +# Folder Tree View (if specified). The default is YES. + +SHOW_FILES = YES + +# Set the SHOW_NAMESPACES tag to NO to disable the generation of the +# Namespaces page. +# This will remove the Namespaces entry from the Quick Index +# and from the Folder Tree View (if specified). The default is YES. + +SHOW_NAMESPACES = YES + +# The FILE_VERSION_FILTER tag can be used to specify a program or script that +# doxygen should invoke to get the current version for each file (typically from +# the version control system). Doxygen will invoke the program by executing (via +# popen()) the command , where is the value of +# the FILE_VERSION_FILTER tag, and is the name of an input file +# provided by doxygen. Whatever the program writes to standard output +# is used as the file version. See the manual for examples. + +FILE_VERSION_FILTER = + +# The LAYOUT_FILE tag can be used to specify a layout file which will be parsed +# by doxygen. The layout file controls the global structure of the generated +# output files in an output format independent way. The create the layout file +# that represents doxygen's defaults, run doxygen with the -l option. +# You can optionally specify a file name after the option, if omitted +# DoxygenLayout.xml will be used as the name of the layout file. + +LAYOUT_FILE = + +# The CITE_BIB_FILES tag can be used to specify one or more bib files +# containing the references data. This must be a list of .bib files. The +# .bib extension is automatically appended if omitted. Using this command +# requires the bibtex tool to be installed. See also +# http://en.wikipedia.org/wiki/BibTeX for more info. For LaTeX the style +# of the bibliography can be controlled using LATEX_BIB_STYLE. To use this +# feature you need bibtex and perl available in the search path. + +CITE_BIB_FILES = + +#--------------------------------------------------------------------------- +# configuration options related to warning and progress messages +#--------------------------------------------------------------------------- + +# The QUIET tag can be used to turn on/off the messages that are generated +# by doxygen. Possible values are YES and NO. If left blank NO is used. + +QUIET = NO + +# The WARNINGS tag can be used to turn on/off the warning messages that are +# generated by doxygen. Possible values are YES and NO. If left blank +# NO is used. + +WARNINGS = YES + +# If WARN_IF_UNDOCUMENTED is set to YES, then doxygen will generate warnings +# for undocumented members. If EXTRACT_ALL is set to YES then this flag will +# automatically be disabled. + +WARN_IF_UNDOCUMENTED = YES + +# If WARN_IF_DOC_ERROR is set to YES, doxygen will generate warnings for +# potential errors in the documentation, such as not documenting some +# parameters in a documented function, or documenting parameters that +# don't exist or using markup commands wrongly. + +WARN_IF_DOC_ERROR = YES + +# The WARN_NO_PARAMDOC option can be enabled to get warnings for +# functions that are documented, but have no documentation for their parameters +# or return value. If set to NO (the default) doxygen will only warn about +# wrong or incomplete parameter documentation, but not about the absence of +# documentation. + +WARN_NO_PARAMDOC = NO + +# The WARN_FORMAT tag determines the format of the warning messages that +# doxygen can produce. The string should contain the $file, $line, and $text +# tags, which will be replaced by the file and line number from which the +# warning originated and the warning text. Optionally the format may contain +# $version, which will be replaced by the version of the file (if it could +# be obtained via FILE_VERSION_FILTER) + +WARN_FORMAT = "$file:$line: $text" + +# The WARN_LOGFILE tag can be used to specify a file to which warning +# and error messages should be written. If left blank the output is written +# to stderr. + +WARN_LOGFILE = + +#--------------------------------------------------------------------------- +# configuration options related to the input files +#--------------------------------------------------------------------------- + +# The INPUT tag can be used to specify the files and/or directories that contain +# documented source files. You may enter file names like "myfile.cpp" or +# directories like "/usr/src/myproject". Separate the files or directories +# with spaces. + +INPUT = H5.dox \ + ../src/C/ \ + ../src/Fortran/ \ + ../src/include + +# This tag can be used to specify the character encoding of the source files +# that doxygen parses. Internally doxygen uses the UTF-8 encoding, which is +# also the default input encoding. Doxygen uses libiconv (or the iconv built +# into libc) for the transcoding. See http://www.gnu.org/software/libiconv for +# the list of possible encodings. + +INPUT_ENCODING = UTF-8 + +# If the value of the INPUT tag contains directories, you can use the +# FILE_PATTERNS tag to specify one or more wildcard pattern (like *.cpp +# and *.h) to filter out the source-files in the directories. If left +# blank the following patterns are tested: +# *.c *.cc *.cxx *.cpp *.c++ *.d *.java *.ii *.ixx *.ipp *.i++ *.inl *.h *.hh +# *.hxx *.hpp *.h++ *.idl *.odl *.cs *.php *.php3 *.inc *.m *.mm *.dox *.py +# *.f90 *.f *.for *.vhd *.vhdl + +FILE_PATTERNS = + +# The RECURSIVE tag can be used to turn specify whether or not subdirectories +# should be searched for input files as well. Possible values are YES and NO. +# If left blank NO is used. + +RECURSIVE = YES + +# The EXCLUDE tag can be used to specify files and/or directories that should be +# excluded from the INPUT source files. This way you can easily exclude a +# subdirectory from a directory tree whose root is specified with the INPUT tag. +# Note that relative paths are relative to the directory from which doxygen is +# run. + +EXCLUDE = ../src/C/.svn \ + ../src/Fortran/.svn \ + ../src/include/.svn + +# The EXCLUDE_SYMLINKS tag can be used to select whether or not files or +# directories that are symbolic links (a Unix file system feature) are excluded +# from the input. + +EXCLUDE_SYMLINKS = NO + +# If the value of the INPUT tag contains directories, you can use the +# EXCLUDE_PATTERNS tag to specify one or more wildcard patterns to exclude +# certain files from those directories. Note that the wildcards are matched +# against the file with absolute path, so to exclude all test directories +# for example use the pattern */test/* + +EXCLUDE_PATTERNS = + +# The EXCLUDE_SYMBOLS tag can be used to specify one or more symbol names +# (namespaces, classes, functions, etc.) that should be excluded from the +# output. The symbol name can be a fully qualified name, a word, or if the +# wildcard * is used, a substring. Examples: ANamespace, AClass, +# AClass::ANamespace, ANamespace::*Test + +EXCLUDE_SYMBOLS = + +# The EXAMPLE_PATH tag can be used to specify one or more files or +# directories that contain example code fragments that are included (see +# the \include command). + +EXAMPLE_PATH = + +# If the value of the EXAMPLE_PATH tag contains directories, you can use the +# EXAMPLE_PATTERNS tag to specify one or more wildcard pattern (like *.cpp +# and *.h) to filter out the source-files in the directories. If left +# blank all files are included. + +EXAMPLE_PATTERNS = * + +# If the EXAMPLE_RECURSIVE tag is set to YES then subdirectories will be +# searched for input files to be used with the \include or \dontinclude +# commands irrespective of the value of the RECURSIVE tag. +# Possible values are YES and NO. If left blank NO is used. + +EXAMPLE_RECURSIVE = NO + +# The IMAGE_PATH tag can be used to specify one or more files or +# directories that contain image that are included in the documentation (see +# the \image command). + +IMAGE_PATH = + +# The INPUT_FILTER tag can be used to specify a program that doxygen should +# invoke to filter for each input file. Doxygen will invoke the filter program +# by executing (via popen()) the command , where +# is the value of the INPUT_FILTER tag, and is the name of an +# input file. Doxygen will then use the output that the filter program writes +# to standard output. +# If FILTER_PATTERNS is specified, this tag will be +# ignored. + +INPUT_FILTER = + +# The FILTER_PATTERNS tag can be used to specify filters on a per file pattern +# basis. +# Doxygen will compare the file name with each pattern and apply the +# filter if there is a match. +# The filters are a list of the form: +# pattern=filter (like *.cpp=my_cpp_filter). See INPUT_FILTER for further +# info on how filters are used. If FILTER_PATTERNS is empty or if +# non of the patterns match the file name, INPUT_FILTER is applied. + +FILTER_PATTERNS = + +# If the FILTER_SOURCE_FILES tag is set to YES, the input filter (if set using +# INPUT_FILTER) will be used to filter the input files when producing source +# files to browse (i.e. when SOURCE_BROWSER is set to YES). + +FILTER_SOURCE_FILES = NO + +# The FILTER_SOURCE_PATTERNS tag can be used to specify source filters per file +# pattern. A pattern will override the setting for FILTER_PATTERN (if any) +# and it is also possible to disable source filtering for a specific pattern +# using *.ext= (so without naming a filter). This option only has effect when +# FILTER_SOURCE_FILES is enabled. + +FILTER_SOURCE_PATTERNS = + +#--------------------------------------------------------------------------- +# configuration options related to source browsing +#--------------------------------------------------------------------------- + +# If the SOURCE_BROWSER tag is set to YES then a list of source files will +# be generated. Documented entities will be cross-referenced with these sources. +# Note: To get rid of all source code in the generated output, make sure also +# VERBATIM_HEADERS is set to NO. + +SOURCE_BROWSER = NO + +# Setting the INLINE_SOURCES tag to YES will include the body +# of functions and classes directly in the documentation. + +INLINE_SOURCES = NO + +# Setting the STRIP_CODE_COMMENTS tag to YES (the default) will instruct +# doxygen to hide any special comment blocks from generated source code +# fragments. Normal C and C++ comments will always remain visible. + +STRIP_CODE_COMMENTS = YES + +# If the REFERENCED_BY_RELATION tag is set to YES +# then for each documented function all documented +# functions referencing it will be listed. + +REFERENCED_BY_RELATION = NO + +# If the REFERENCES_RELATION tag is set to YES +# then for each documented function all documented entities +# called/used by that function will be listed. + +REFERENCES_RELATION = NO + +# If the REFERENCES_LINK_SOURCE tag is set to YES (the default) +# and SOURCE_BROWSER tag is set to YES, then the hyperlinks from +# functions in REFERENCES_RELATION and REFERENCED_BY_RELATION lists will +# link to the source code. +# Otherwise they will link to the documentation. + +REFERENCES_LINK_SOURCE = YES + +# If the USE_HTAGS tag is set to YES then the references to source code +# will point to the HTML generated by the htags(1) tool instead of doxygen +# built-in source browser. The htags tool is part of GNU's global source +# tagging system (see http://www.gnu.org/software/global/global.html). You +# will need version 4.8.6 or higher. + +USE_HTAGS = NO + +# If the VERBATIM_HEADERS tag is set to YES (the default) then Doxygen +# will generate a verbatim copy of the header file for each class for +# which an include is specified. Set to NO to disable this. + +VERBATIM_HEADERS = NO + +#--------------------------------------------------------------------------- +# configuration options related to the alphabetical class index +#--------------------------------------------------------------------------- + +# If the ALPHABETICAL_INDEX tag is set to YES, an alphabetical index +# of all compounds will be generated. Enable this if the project +# contains a lot of classes, structs, unions or interfaces. + +ALPHABETICAL_INDEX = YES + +# If the alphabetical index is enabled (see ALPHABETICAL_INDEX) then +# the COLS_IN_ALPHA_INDEX tag can be used to specify the number of columns +# in which this list will be split (can be a number in the range [1..20]) + +COLS_IN_ALPHA_INDEX = 5 + +# In case all classes in a project start with a common prefix, all +# classes will be put under the same header in the alphabetical index. +# The IGNORE_PREFIX tag can be used to specify one or more prefixes that +# should be ignored while generating the index headers. + +IGNORE_PREFIX = + +#--------------------------------------------------------------------------- +# configuration options related to the HTML output +#--------------------------------------------------------------------------- + +# If the GENERATE_HTML tag is set to YES (the default) Doxygen will +# generate HTML output. + +GENERATE_HTML = YES + +# The HTML_OUTPUT tag is used to specify where the HTML docs will be put. +# If a relative path is entered the value of OUTPUT_DIRECTORY will be +# put in front of it. If left blank `html' will be used as the default path. + +HTML_OUTPUT = . + +# The HTML_FILE_EXTENSION tag can be used to specify the file extension for +# each generated HTML page (for example: .htm,.php,.asp). If it is left blank +# doxygen will generate files with .html extension. + +HTML_FILE_EXTENSION = .html + +# The HTML_HEADER tag can be used to specify a personal HTML header for +# each generated HTML page. If it is left blank doxygen will generate a +# standard header. Note that when using a custom header you are responsible +# for the proper inclusion of any scripts and style sheets that doxygen +# needs, which is dependent on the configuration options used. +# It is advised to generate a default header using "doxygen -w html +# header.html footer.html stylesheet.css YourConfigFile" and then modify +# that header. Note that the header is subject to change so you typically +# have to redo this when upgrading to a newer version of doxygen or when +# changing the value of configuration settings such as GENERATE_TREEVIEW! + +HTML_HEADER = + +# The HTML_FOOTER tag can be used to specify a personal HTML footer for +# each generated HTML page. If it is left blank doxygen will generate a +# standard footer. + +HTML_FOOTER = + +# The HTML_STYLESHEET tag can be used to specify a user-defined cascading +# style sheet that is used by each HTML page. It can be used to +# fine-tune the look of the HTML output. If the tag is left blank doxygen +# will generate a default style sheet. Note that doxygen will try to copy +# the style sheet file to the HTML output directory, so don't put your own +# style sheet in the HTML output directory as well, or it will be erased! + +HTML_STYLESHEET = + +# The HTML_EXTRA_FILES tag can be used to specify one or more extra images or +# other source files which should be copied to the HTML output directory. Note +# that these files will be copied to the base HTML output directory. Use the +# $relpath$ marker in the HTML_HEADER and/or HTML_FOOTER files to load these +# files. In the HTML_STYLESHEET file, use the file name only. Also note that +# the files will be copied as-is; there are no commands or markers available. + +HTML_EXTRA_FILES = + +# The HTML_COLORSTYLE_HUE tag controls the color of the HTML output. +# Doxygen will adjust the colors in the style sheet and background images +# according to this color. Hue is specified as an angle on a colorwheel, +# see http://en.wikipedia.org/wiki/Hue for more information. +# For instance the value 0 represents red, 60 is yellow, 120 is green, +# 180 is cyan, 240 is blue, 300 purple, and 360 is red again. +# The allowed range is 0 to 359. + +HTML_COLORSTYLE_HUE = 220 + +# The HTML_COLORSTYLE_SAT tag controls the purity (or saturation) of +# the colors in the HTML output. For a value of 0 the output will use +# grayscales only. A value of 255 will produce the most vivid colors. + +HTML_COLORSTYLE_SAT = 100 + +# The HTML_COLORSTYLE_GAMMA tag controls the gamma correction applied to +# the luminance component of the colors in the HTML output. Values below +# 100 gradually make the output lighter, whereas values above 100 make +# the output darker. The value divided by 100 is the actual gamma applied, +# so 80 represents a gamma of 0.8, The value 220 represents a gamma of 2.2, +# and 100 does not change the gamma. + +HTML_COLORSTYLE_GAMMA = 80 + +# If the HTML_TIMESTAMP tag is set to YES then the footer of each generated HTML +# page will contain the date and time when the page was generated. Setting +# this to NO can help when comparing the output of multiple runs. + +HTML_TIMESTAMP = YES + +# If the HTML_ALIGN_MEMBERS tag is set to YES, the members of classes, +# files or namespaces will be aligned in HTML using tables. If set to +# NO a bullet list will be used. + +HTML_ALIGN_MEMBERS = YES + +# If the HTML_DYNAMIC_SECTIONS tag is set to YES then the generated HTML +# documentation will contain sections that can be hidden and shown after the +# page has loaded. For this to work a browser that supports +# JavaScript and DHTML is required (for instance Mozilla 1.0+, Firefox +# Netscape 6.0+, Internet explorer 5.0+, Konqueror, or Safari). + +HTML_DYNAMIC_SECTIONS = NO + +# If the GENERATE_DOCSET tag is set to YES, additional index files +# will be generated that can be used as input for Apple's Xcode 3 +# integrated development environment, introduced with OSX 10.5 (Leopard). +# To create a documentation set, doxygen will generate a Makefile in the +# HTML output directory. Running make will produce the docset in that +# directory and running "make install" will install the docset in +# ~/Library/Developer/Shared/Documentation/DocSets so that Xcode will find +# it at startup. +# See http://developer.apple.com/tools/creatingdocsetswithdoxygen.html +# for more information. + +GENERATE_DOCSET = NO + +# When GENERATE_DOCSET tag is set to YES, this tag determines the name of the +# feed. A documentation feed provides an umbrella under which multiple +# documentation sets from a single provider (such as a company or product suite) +# can be grouped. + +DOCSET_FEEDNAME = "Doxygen generated docs" + +# When GENERATE_DOCSET tag is set to YES, this tag specifies a string that +# should uniquely identify the documentation set bundle. This should be a +# reverse domain-name style string, e.g. com.mycompany.MyDocSet. Doxygen +# will append .docset to the name. + +DOCSET_BUNDLE_ID = org.doxygen.Project + +# When GENERATE_PUBLISHER_ID tag specifies a string that should uniquely identify +# the documentation publisher. This should be a reverse domain-name style +# string, e.g. com.mycompany.MyDocSet.documentation. + +DOCSET_PUBLISHER_ID = org.doxygen.Publisher + +# The GENERATE_PUBLISHER_NAME tag identifies the documentation publisher. + +DOCSET_PUBLISHER_NAME = Publisher + +# If the GENERATE_HTMLHELP tag is set to YES, additional index files +# will be generated that can be used as input for tools like the +# Microsoft HTML help workshop to generate a compiled HTML help file (.chm) +# of the generated HTML documentation. + +GENERATE_HTMLHELP = NO + +# If the GENERATE_HTMLHELP tag is set to YES, the CHM_FILE tag can +# be used to specify the file name of the resulting .chm file. You +# can add a path in front of the file if the result should not be +# written to the html output directory. + +CHM_FILE = + +# If the GENERATE_HTMLHELP tag is set to YES, the HHC_LOCATION tag can +# be used to specify the location (absolute path including file name) of +# the HTML help compiler (hhc.exe). If non-empty doxygen will try to run +# the HTML help compiler on the generated index.hhp. + +HHC_LOCATION = + +# If the GENERATE_HTMLHELP tag is set to YES, the GENERATE_CHI flag +# controls if a separate .chi index file is generated (YES) or that +# it should be included in the master .chm file (NO). + +GENERATE_CHI = NO + +# If the GENERATE_HTMLHELP tag is set to YES, the CHM_INDEX_ENCODING +# is used to encode HtmlHelp index (hhk), content (hhc) and project file +# content. + +CHM_INDEX_ENCODING = + +# If the GENERATE_HTMLHELP tag is set to YES, the BINARY_TOC flag +# controls whether a binary table of contents is generated (YES) or a +# normal table of contents (NO) in the .chm file. + +BINARY_TOC = NO + +# The TOC_EXPAND flag can be set to YES to add extra items for group members +# to the contents of the HTML help documentation and to the tree view. + +TOC_EXPAND = NO + +# If the GENERATE_QHP tag is set to YES and both QHP_NAMESPACE and +# QHP_VIRTUAL_FOLDER are set, an additional index file will be generated +# that can be used as input for Qt's qhelpgenerator to generate a +# Qt Compressed Help (.qch) of the generated HTML documentation. + +GENERATE_QHP = NO + +# If the QHG_LOCATION tag is specified, the QCH_FILE tag can +# be used to specify the file name of the resulting .qch file. +# The path specified is relative to the HTML output folder. + +QCH_FILE = + +# The QHP_NAMESPACE tag specifies the namespace to use when generating +# Qt Help Project output. For more information please see +# http://doc.trolltech.com/qthelpproject.html#namespace + +QHP_NAMESPACE = org.doxygen.Project + +# The QHP_VIRTUAL_FOLDER tag specifies the namespace to use when generating +# Qt Help Project output. For more information please see +# http://doc.trolltech.com/qthelpproject.html#virtual-folders + +QHP_VIRTUAL_FOLDER = doc + +# If QHP_CUST_FILTER_NAME is set, it specifies the name of a custom filter to +# add. For more information please see +# http://doc.trolltech.com/qthelpproject.html#custom-filters + +QHP_CUST_FILTER_NAME = + +# The QHP_CUST_FILT_ATTRS tag specifies the list of the attributes of the +# custom filter to add. For more information please see +# +# Qt Help Project / Custom Filters. + +QHP_CUST_FILTER_ATTRS = + +# The QHP_SECT_FILTER_ATTRS tag specifies the list of the attributes this +# project's +# filter section matches. +# +# Qt Help Project / Filter Attributes. + +QHP_SECT_FILTER_ATTRS = + +# If the GENERATE_QHP tag is set to YES, the QHG_LOCATION tag can +# be used to specify the location of Qt's qhelpgenerator. +# If non-empty doxygen will try to run qhelpgenerator on the generated +# .qhp file. + +QHG_LOCATION = + +# If the GENERATE_ECLIPSEHELP tag is set to YES, additional index files +# will be generated, which together with the HTML files, form an Eclipse help +# plugin. To install this plugin and make it available under the help contents +# menu in Eclipse, the contents of the directory containing the HTML and XML +# files needs to be copied into the plugins directory of eclipse. The name of +# the directory within the plugins directory should be the same as +# the ECLIPSE_DOC_ID value. After copying Eclipse needs to be restarted before +# the help appears. + +GENERATE_ECLIPSEHELP = NO + +# A unique identifier for the eclipse help plugin. When installing the plugin +# the directory name containing the HTML and XML files should also have +# this name. + +ECLIPSE_DOC_ID = org.doxygen.Project + +# The DISABLE_INDEX tag can be used to turn on/off the condensed index (tabs) +# at top of each HTML page. The value NO (the default) enables the index and +# the value YES disables it. Since the tabs have the same information as the +# navigation tree you can set this option to NO if you already set +# GENERATE_TREEVIEW to YES. + +DISABLE_INDEX = NO + +# The GENERATE_TREEVIEW tag is used to specify whether a tree-like index +# structure should be generated to display hierarchical information. +# If the tag value is set to YES, a side panel will be generated +# containing a tree-like index structure (just like the one that +# is generated for HTML Help). For this to work a browser that supports +# JavaScript, DHTML, CSS and frames is required (i.e. any modern browser). +# Windows users are probably better off using the HTML help feature. +# Since the tree basically has the same information as the tab index you +# could consider to set DISABLE_INDEX to NO when enabling this option. + +GENERATE_TREEVIEW = YES + +# The ENUM_VALUES_PER_LINE tag can be used to set the number of enum values +# (range [0,1..20]) that doxygen will group on one line in the generated HTML +# documentation. Note that a value of 0 will completely suppress the enum +# values from appearing in the overview section. + +ENUM_VALUES_PER_LINE = 4 + +# By enabling USE_INLINE_TREES, doxygen will generate the Groups, Directories, +# and Class Hierarchy pages using a tree view instead of an ordered list. + +USE_INLINE_TREES = NO + +# If the treeview is enabled (see GENERATE_TREEVIEW) then this tag can be +# used to set the initial width (in pixels) of the frame in which the tree +# is shown. + +TREEVIEW_WIDTH = 250 + +# When the EXT_LINKS_IN_WINDOW option is set to YES doxygen will open +# links to external symbols imported via tag files in a separate window. + +EXT_LINKS_IN_WINDOW = NO + +# Use this tag to change the font size of Latex formulas included +# as images in the HTML documentation. The default is 10. Note that +# when you change the font size after a successful doxygen run you need +# to manually remove any form_*.png images from the HTML output directory +# to force them to be regenerated. + +FORMULA_FONTSIZE = 10 + +# Use the FORMULA_TRANPARENT tag to determine whether or not the images +# generated for formulas are transparent PNGs. Transparent PNGs are +# not supported properly for IE 6.0, but are supported on all modern browsers. +# Note that when changing this option you need to delete any form_*.png files +# in the HTML output before the changes have effect. + +FORMULA_TRANSPARENT = YES + +# Enable the USE_MATHJAX option to render LaTeX formulas using MathJax +# (see http://www.mathjax.org) which uses client side Javascript for the +# rendering instead of using prerendered bitmaps. Use this if you do not +# have LaTeX installed or if you want to formulas look prettier in the HTML +# output. When enabled you may also need to install MathJax separately and +# configure the path to it using the MATHJAX_RELPATH option. + +USE_MATHJAX = NO + +# When MathJax is enabled you need to specify the location relative to the +# HTML output directory using the MATHJAX_RELPATH option. The destination +# directory should contain the MathJax.js script. For instance, if the mathjax +# directory is located at the same level as the HTML output directory, then +# MATHJAX_RELPATH should be ../mathjax. The default value points to +# the MathJax Content Delivery Network so you can quickly see the result without +# installing MathJax. +# However, it is strongly recommended to install a local +# copy of MathJax from http://www.mathjax.org before deployment. + +MATHJAX_RELPATH = http://cdn.mathjax.org/mathjax/latest + +# The MATHJAX_EXTENSIONS tag can be used to specify one or MathJax extension +# names that should be enabled during MathJax rendering. + +MATHJAX_EXTENSIONS = + +# When the SEARCHENGINE tag is enabled doxygen will generate a search box +# for the HTML output. The underlying search engine uses javascript +# and DHTML and should work on any modern browser. Note that when using +# HTML help (GENERATE_HTMLHELP), Qt help (GENERATE_QHP), or docsets +# (GENERATE_DOCSET) there is already a search function so this one should +# typically be disabled. For large projects the javascript based search engine +# can be slow, then enabling SERVER_BASED_SEARCH may provide a better solution. + +SEARCHENGINE = NO + +# When the SERVER_BASED_SEARCH tag is enabled the search engine will be +# implemented using a PHP enabled web server instead of at the web client +# using Javascript. Doxygen will generate the search PHP script and index +# file to put on the web server. The advantage of the server +# based approach is that it scales better to large projects and allows +# full text search. The disadvantages are that it is more difficult to setup +# and does not have live searching capabilities. + +SERVER_BASED_SEARCH = NO + +#--------------------------------------------------------------------------- +# configuration options related to the LaTeX output +#--------------------------------------------------------------------------- + +# If the GENERATE_LATEX tag is set to YES (the default) Doxygen will +# generate Latex output. + +GENERATE_LATEX = no + +# The LATEX_OUTPUT tag is used to specify where the LaTeX docs will be put. +# If a relative path is entered the value of OUTPUT_DIRECTORY will be +# put in front of it. If left blank `latex' will be used as the default path. + +LATEX_OUTPUT = latex + +# The LATEX_CMD_NAME tag can be used to specify the LaTeX command name to be +# invoked. If left blank `latex' will be used as the default command name. +# Note that when enabling USE_PDFLATEX this option is only used for +# generating bitmaps for formulas in the HTML output, but not in the +# Makefile that is written to the output directory. + +LATEX_CMD_NAME = latex + +# The MAKEINDEX_CMD_NAME tag can be used to specify the command name to +# generate index for LaTeX. If left blank `makeindex' will be used as the +# default command name. + +MAKEINDEX_CMD_NAME = makeindex + +# If the COMPACT_LATEX tag is set to YES Doxygen generates more compact +# LaTeX documents. This may be useful for small projects and may help to +# save some trees in general. + +COMPACT_LATEX = NO + +# The PAPER_TYPE tag can be used to set the paper type that is used +# by the printer. Possible values are: a4, letter, legal and +# executive. If left blank a4wide will be used. + +PAPER_TYPE = a4wide + +# The EXTRA_PACKAGES tag can be to specify one or more names of LaTeX +# packages that should be included in the LaTeX output. + +EXTRA_PACKAGES = + +# The LATEX_HEADER tag can be used to specify a personal LaTeX header for +# the generated latex document. The header should contain everything until +# the first chapter. If it is left blank doxygen will generate a +# standard header. Notice: only use this tag if you know what you are doing! + +LATEX_HEADER = + +# The LATEX_FOOTER tag can be used to specify a personal LaTeX footer for +# the generated latex document. The footer should contain everything after +# the last chapter. If it is left blank doxygen will generate a +# standard footer. Notice: only use this tag if you know what you are doing! + +LATEX_FOOTER = + +# If the PDF_HYPERLINKS tag is set to YES, the LaTeX that is generated +# is prepared for conversion to pdf (using ps2pdf). The pdf file will +# contain links (just like the HTML output) instead of page references +# This makes the output suitable for online browsing using a pdf viewer. + +PDF_HYPERLINKS = NO + +# If the USE_PDFLATEX tag is set to YES, pdflatex will be used instead of +# plain latex in the generated Makefile. Set this option to YES to get a +# higher quality PDF documentation. + +USE_PDFLATEX = NO + +# If the LATEX_BATCHMODE tag is set to YES, doxygen will add the \\batchmode. +# command to the generated LaTeX files. This will instruct LaTeX to keep +# running if errors occur, instead of asking the user for help. +# This option is also used when generating formulas in HTML. + +LATEX_BATCHMODE = NO + +# If LATEX_HIDE_INDICES is set to YES then doxygen will not +# include the index chapters (such as File Index, Compound Index, etc.) +# in the output. + +LATEX_HIDE_INDICES = NO + +# If LATEX_SOURCE_CODE is set to YES then doxygen will include +# source code with syntax highlighting in the LaTeX output. +# Note that which sources are shown also depends on other settings +# such as SOURCE_BROWSER. + +LATEX_SOURCE_CODE = NO + +# The LATEX_BIB_STYLE tag can be used to specify the style to use for the +# bibliography, e.g. plainnat, or ieeetr. The default style is "plain". See +# http://en.wikipedia.org/wiki/BibTeX for more info. + +LATEX_BIB_STYLE = plain + +#--------------------------------------------------------------------------- +# configuration options related to the RTF output +#--------------------------------------------------------------------------- + +# If the GENERATE_RTF tag is set to YES Doxygen will generate RTF output +# The RTF output is optimized for Word 97 and may not look very pretty with +# other RTF readers or editors. + +GENERATE_RTF = NO + +# The RTF_OUTPUT tag is used to specify where the RTF docs will be put. +# If a relative path is entered the value of OUTPUT_DIRECTORY will be +# put in front of it. If left blank `rtf' will be used as the default path. + +RTF_OUTPUT = rtf + +# If the COMPACT_RTF tag is set to YES Doxygen generates more compact +# RTF documents. This may be useful for small projects and may help to +# save some trees in general. + +COMPACT_RTF = NO + +# If the RTF_HYPERLINKS tag is set to YES, the RTF that is generated +# will contain hyperlink fields. The RTF file will +# contain links (just like the HTML output) instead of page references. +# This makes the output suitable for online browsing using WORD or other +# programs which support those fields. +# Note: wordpad (write) and others do not support links. + +RTF_HYPERLINKS = NO + +# Load style sheet definitions from file. Syntax is similar to doxygen's +# config file, i.e. a series of assignments. You only have to provide +# replacements, missing definitions are set to their default value. + +RTF_STYLESHEET_FILE = + +# Set optional variables used in the generation of an rtf document. +# Syntax is similar to doxygen's config file. + +RTF_EXTENSIONS_FILE = + +#--------------------------------------------------------------------------- +# configuration options related to the man page output +#--------------------------------------------------------------------------- + +# If the GENERATE_MAN tag is set to YES (the default) Doxygen will +# generate man pages + +GENERATE_MAN = YES + +# The MAN_OUTPUT tag is used to specify where the man pages will be put. +# If a relative path is entered the value of OUTPUT_DIRECTORY will be +# put in front of it. If left blank `man' will be used as the default path. + +MAN_OUTPUT = man + +# The MAN_EXTENSION tag determines the extension that is added to +# the generated man pages (default is the subroutine's section .3) + +MAN_EXTENSION = .3 + +# If the MAN_LINKS tag is set to YES and Doxygen generates man output, +# then it will generate one additional man file for each entity +# documented in the real man page(s). These additional files +# only source the real man page, but without them the man command +# would be unable to find the correct page. The default is NO. + +MAN_LINKS = NO + +#--------------------------------------------------------------------------- +# configuration options related to the XML output +#--------------------------------------------------------------------------- + +# If the GENERATE_XML tag is set to YES Doxygen will +# generate an XML file that captures the structure of +# the code including all documentation. + +GENERATE_XML = NO + +# The XML_OUTPUT tag is used to specify where the XML pages will be put. +# If a relative path is entered the value of OUTPUT_DIRECTORY will be +# put in front of it. If left blank `xml' will be used as the default path. + +XML_OUTPUT = xml + +# The XML_SCHEMA tag can be used to specify an XML schema, +# which can be used by a validating XML parser to check the +# syntax of the XML files. + +XML_SCHEMA = + +# The XML_DTD tag can be used to specify an XML DTD, +# which can be used by a validating XML parser to check the +# syntax of the XML files. + +XML_DTD = + +# If the XML_PROGRAMLISTING tag is set to YES Doxygen will +# dump the program listings (including syntax highlighting +# and cross-referencing information) to the XML output. Note that +# enabling this will significantly increase the size of the XML output. + +XML_PROGRAMLISTING = YES + +#--------------------------------------------------------------------------- +# configuration options for the AutoGen Definitions output +#--------------------------------------------------------------------------- + +# If the GENERATE_AUTOGEN_DEF tag is set to YES Doxygen will +# generate an AutoGen Definitions (see autogen.sf.net) file +# that captures the structure of the code including all +# documentation. Note that this feature is still experimental +# and incomplete at the moment. + +GENERATE_AUTOGEN_DEF = NO + +#--------------------------------------------------------------------------- +# configuration options related to the Perl module output +#--------------------------------------------------------------------------- + +# If the GENERATE_PERLMOD tag is set to YES Doxygen will +# generate a Perl module file that captures the structure of +# the code including all documentation. Note that this +# feature is still experimental and incomplete at the +# moment. + +GENERATE_PERLMOD = NO + +# If the PERLMOD_LATEX tag is set to YES Doxygen will generate +# the necessary Makefile rules, Perl scripts and LaTeX code to be able +# to generate PDF and DVI output from the Perl module output. + +PERLMOD_LATEX = NO + +# If the PERLMOD_PRETTY tag is set to YES the Perl module output will be +# nicely formatted so it can be parsed by a human reader. +# This is useful +# if you want to understand what is going on. +# On the other hand, if this +# tag is set to NO the size of the Perl module output will be much smaller +# and Perl will parse it just the same. + +PERLMOD_PRETTY = YES + +# The names of the make variables in the generated doxyrules.make file +# are prefixed with the string contained in PERLMOD_MAKEVAR_PREFIX. +# This is useful so different doxyrules.make files included by the same +# Makefile don't overwrite each other's variables. + +PERLMOD_MAKEVAR_PREFIX = + +#--------------------------------------------------------------------------- +# Configuration options related to the preprocessor +#--------------------------------------------------------------------------- + +# If the ENABLE_PREPROCESSING tag is set to YES (the default) Doxygen will +# evaluate all C-preprocessor directives found in the sources and include +# files. + +ENABLE_PREPROCESSING = YES + +# If the MACRO_EXPANSION tag is set to YES Doxygen will expand all macro +# names in the source code. If set to NO (the default) only conditional +# compilation will be performed. Macro expansion can be done in a controlled +# way by setting EXPAND_ONLY_PREDEF to YES. + +MACRO_EXPANSION = NO + +# If the EXPAND_ONLY_PREDEF and MACRO_EXPANSION tags are both set to YES +# then the macro expansion is limited to the macros specified with the +# PREDEFINED and EXPAND_AS_DEFINED tags. + +EXPAND_ONLY_PREDEF = NO + +# If the SEARCH_INCLUDES tag is set to YES (the default) the includes files +# pointed to by INCLUDE_PATH will be searched when a #include is found. + +SEARCH_INCLUDES = YES + +# The INCLUDE_PATH tag can be used to specify one or more directories that +# contain include files that are not input files but should be processed by +# the preprocessor. + +INCLUDE_PATH = + +# You can use the INCLUDE_FILE_PATTERNS tag to specify one or more wildcard +# patterns (like *.h and *.hpp) to filter out the header-files in the +# directories. If left blank, the patterns specified with FILE_PATTERNS will +# be used. + +INCLUDE_FILE_PATTERNS = + +# The PREDEFINED tag can be used to specify one or more macro names that +# are defined before the preprocessor is started (similar to the -D option of +# gcc). The argument of the tag is a list of macros of the form: name +# or name=definition (no spaces). If the definition and the = are +# omitted =1 is assumed. To prevent a macro definition from being +# undefined via #undef or recursively expanded use the := operator +# instead of the = operator. + +PREDEFINED = PARALLEL_IO + +# If the MACRO_EXPANSION and EXPAND_ONLY_PREDEF tags are set to YES then +# this tag can be used to specify a list of macro names that should be expanded. +# The macro definition that is found in the sources will be used. +# Use the PREDEFINED tag if you want to use a different macro definition that +# overrules the definition found in the source code. + +EXPAND_AS_DEFINED = + +# If the SKIP_FUNCTION_MACROS tag is set to YES (the default) then +# doxygen's preprocessor will remove all references to function-like macros +# that are alone on a line, have an all uppercase name, and do not end with a +# semicolon, because these will confuse the parser if not removed. + +SKIP_FUNCTION_MACROS = YES + +#--------------------------------------------------------------------------- +# Configuration::additions related to external references +#--------------------------------------------------------------------------- + +# The TAGFILES option can be used to specify one or more tagfiles. For each +# tag file the location of the external documentation should be added. The +# format of a tag file without this location is as follows: +# +# TAGFILES = file1 file2 ... +# Adding location for the tag files is done as follows: +# +# TAGFILES = file1=loc1 "file2 = loc2" ... +# where "loc1" and "loc2" can be relative or absolute paths +# or URLs. Note that each tag file must have a unique name (where the name does +# NOT include the path). If a tag file is not located in the directory in which +# doxygen is run, you must also specify the path to the tagfile here. + +TAGFILES = + +# When a file name is specified after GENERATE_TAGFILE, doxygen will create +# a tag file that is based on the input files it reads. + +GENERATE_TAGFILE = + +# If the ALLEXTERNALS tag is set to YES all external classes will be listed +# in the class index. If set to NO only the inherited external classes +# will be listed. + +ALLEXTERNALS = NO + +# If the EXTERNAL_GROUPS tag is set to YES all external groups will be listed +# in the modules index. If set to NO, only the current project's groups will +# be listed. + +EXTERNAL_GROUPS = YES + +# The PERL_PATH should be the absolute path and name of the perl script +# interpreter (i.e. the result of `which perl'). + +PERL_PATH = /usr/bin/perl + +#--------------------------------------------------------------------------- +# Configuration options related to the dot tool +#--------------------------------------------------------------------------- + +# If the CLASS_DIAGRAMS tag is set to YES (the default) Doxygen will +# generate a inheritance diagram (in HTML, RTF and LaTeX) for classes with base +# or super classes. Setting the tag to NO turns the diagrams off. Note that +# this option also works with HAVE_DOT disabled, but it is recommended to +# install and use dot, since it yields more powerful graphs. + +CLASS_DIAGRAMS = NO + +# You can define message sequence charts within doxygen comments using the \msc +# command. Doxygen will then run the mscgen tool (see +# http://www.mcternan.me.uk/mscgen/) to produce the chart and insert it in the +# documentation. The MSCGEN_PATH tag allows you to specify the directory where +# the mscgen tool resides. If left empty the tool is assumed to be found in the +# default search path. + +MSCGEN_PATH = + +# If set to YES, the inheritance and collaboration graphs will hide +# inheritance and usage relations if the target is undocumented +# or is not a class. + +HIDE_UNDOC_RELATIONS = YES + +# If you set the HAVE_DOT tag to YES then doxygen will assume the dot tool is +# available from the path. This tool is part of Graphviz, a graph visualization +# toolkit from AT&T and Lucent Bell Labs. The other options in this section +# have no effect if this option is set to NO (the default) + +HAVE_DOT = NO + +# The DOT_NUM_THREADS specifies the number of dot invocations doxygen is +# allowed to run in parallel. When set to 0 (the default) doxygen will +# base this on the number of processors available in the system. You can set it +# explicitly to a value larger than 0 to get control over the balance +# between CPU load and processing speed. + +DOT_NUM_THREADS = 0 + +# By default doxygen will use the Helvetica font for all dot files that +# doxygen generates. When you want a differently looking font you can specify +# the font name using DOT_FONTNAME. You need to make sure dot is able to find +# the font, which can be done by putting it in a standard location or by setting +# the DOTFONTPATH environment variable or by setting DOT_FONTPATH to the +# directory containing the font. + +DOT_FONTNAME = Helvetica + +# The DOT_FONTSIZE tag can be used to set the size of the font of dot graphs. +# The default size is 10pt. + +DOT_FONTSIZE = 10 + +# By default doxygen will tell dot to use the Helvetica font. +# If you specify a different font using DOT_FONTNAME you can use DOT_FONTPATH to +# set the path where dot can find it. + +DOT_FONTPATH = + +# If the CLASS_GRAPH and HAVE_DOT tags are set to YES then doxygen +# will generate a graph for each documented class showing the direct and +# indirect inheritance relations. Setting this tag to YES will force the +# CLASS_DIAGRAMS tag to NO. + +CLASS_GRAPH = NO + +# If the COLLABORATION_GRAPH and HAVE_DOT tags are set to YES then doxygen +# will generate a graph for each documented class showing the direct and +# indirect implementation dependencies (inheritance, containment, and +# class references variables) of the class with other documented classes. + +COLLABORATION_GRAPH = NO + +# If the GROUP_GRAPHS and HAVE_DOT tags are set to YES then doxygen +# will generate a graph for groups, showing the direct groups dependencies + +GROUP_GRAPHS = NO + +# If the UML_LOOK tag is set to YES doxygen will generate inheritance and +# collaboration diagrams in a style similar to the OMG's Unified Modeling +# Language. + +UML_LOOK = NO + +# If the UML_LOOK tag is enabled, the fields and methods are shown inside +# the class node. If there are many fields or methods and many nodes the +# graph may become too big to be useful. The UML_LIMIT_NUM_FIELDS +# threshold limits the number of items for each type to make the size more +# managable. Set this to 0 for no limit. Note that the threshold may be +# exceeded by 50% before the limit is enforced. + +UML_LIMIT_NUM_FIELDS = 10 + +# If set to YES, the inheritance and collaboration graphs will show the +# relations between templates and their instances. + +TEMPLATE_RELATIONS = NO + +# If the ENABLE_PREPROCESSING, SEARCH_INCLUDES, INCLUDE_GRAPH, and HAVE_DOT +# tags are set to YES then doxygen will generate a graph for each documented +# file showing the direct and indirect include dependencies of the file with +# other documented files. + +INCLUDE_GRAPH = NO + +# If the ENABLE_PREPROCESSING, SEARCH_INCLUDES, INCLUDED_BY_GRAPH, and +# HAVE_DOT tags are set to YES then doxygen will generate a graph for each +# documented header file showing the documented files that directly or +# indirectly include this file. + +INCLUDED_BY_GRAPH = NO + +# If the CALL_GRAPH and HAVE_DOT options are set to YES then +# doxygen will generate a call dependency graph for every global function +# or class method. Note that enabling this option will significantly increase +# the time of a run. So in most cases it will be better to enable call graphs +# for selected functions only using the \callgraph command. + +CALL_GRAPH = NO + +# If the CALLER_GRAPH and HAVE_DOT tags are set to YES then +# doxygen will generate a caller dependency graph for every global function +# or class method. Note that enabling this option will significantly increase +# the time of a run. So in most cases it will be better to enable caller +# graphs for selected functions only using the \callergraph command. + +CALLER_GRAPH = NO + +# If the GRAPHICAL_HIERARCHY and HAVE_DOT tags are set to YES then doxygen +# will generate a graphical hierarchy of all classes instead of a textual one. + +GRAPHICAL_HIERARCHY = NO + +# If the DIRECTORY_GRAPH, SHOW_DIRECTORIES and HAVE_DOT tags are set to YES +# then doxygen will show the dependencies a directory has on other directories +# in a graphical way. The dependency relations are determined by the #include +# relations between the files in the directories. + +DIRECTORY_GRAPH = NO + +# The DOT_IMAGE_FORMAT tag can be used to set the image format of the images +# generated by dot. Possible values are svg, png, jpg, or gif. +# If left blank png will be used. If you choose svg you need to set +# HTML_FILE_EXTENSION to xhtml in order to make the SVG files +# visible in IE 9+ (other browsers do not have this requirement). + +DOT_IMAGE_FORMAT = png + +# If DOT_IMAGE_FORMAT is set to svg, then this option can be set to YES to +# enable generation of interactive SVG images that allow zooming and panning. +# Note that this requires a modern browser other than Internet Explorer. +# Tested and working are Firefox, Chrome, Safari, and Opera. For IE 9+ you +# need to set HTML_FILE_EXTENSION to xhtml in order to make the SVG files +# visible. Older versions of IE do not have SVG support. + +INTERACTIVE_SVG = NO + +# The tag DOT_PATH can be used to specify the path where the dot tool can be +# found. If left blank, it is assumed the dot tool can be found in the path. + +DOT_PATH = + +# The DOTFILE_DIRS tag can be used to specify one or more directories that +# contain dot files that are included in the documentation (see the +# \dotfile command). + +DOTFILE_DIRS = + +# The MSCFILE_DIRS tag can be used to specify one or more directories that +# contain msc files that are included in the documentation (see the +# \mscfile command). + +MSCFILE_DIRS = + +# The DOT_GRAPH_MAX_NODES tag can be used to set the maximum number of +# nodes that will be shown in the graph. If the number of nodes in a graph +# becomes larger than this value, doxygen will truncate the graph, which is +# visualized by representing a node as a red box. Note that doxygen if the +# number of direct children of the root node in a graph is already larger than +# DOT_GRAPH_MAX_NODES then the graph will not be shown at all. Also note +# that the size of a graph can be further restricted by MAX_DOT_GRAPH_DEPTH. + +DOT_GRAPH_MAX_NODES = 50 + +# The MAX_DOT_GRAPH_DEPTH tag can be used to set the maximum depth of the +# graphs generated by dot. A depth value of 3 means that only nodes reachable +# from the root by following a path via at most 3 edges will be shown. Nodes +# that lay further from the root node will be omitted. Note that setting this +# option to 1 or 2 may greatly reduce the computation time needed for large +# code bases. Also note that the size of a graph can be further restricted by +# DOT_GRAPH_MAX_NODES. Using a depth of 0 means no depth restriction. + +MAX_DOT_GRAPH_DEPTH = 1000 + +# Set the DOT_TRANSPARENT tag to YES to generate images with a transparent +# background. This is disabled by default, because dot on Windows does not +# seem to support this out of the box. Warning: Depending on the platform used, +# enabling this option may lead to badly anti-aliased labels on the edges of +# a graph (i.e. they become hard to read). + +DOT_TRANSPARENT = NO + +# Set the DOT_MULTI_TARGETS tag to YES allow dot to generate multiple output +# files in one run (i.e. multiple -o and -T options on the command line). This +# makes dot run faster, but since only newer versions of dot (>1.8.10) +# support this, this feature is disabled by default. + +DOT_MULTI_TARGETS = NO + +# If the GENERATE_LEGEND tag is set to YES (the default) Doxygen will +# generate a legend page explaining the meaning of the various boxes and +# arrows in the dot generated graphs. + +GENERATE_LEGEND = YES + +# If the DOT_CLEANUP tag is set to YES (the default) Doxygen will +# remove the intermediate dot files that are used to generate +# the various graphs. + +DOT_CLEANUP = YES diff --git a/doc/DoxygenLayout.xml b/doc/DoxygenLayout.xml new file mode 100644 index 0000000..7f62755 --- /dev/null +++ b/doc/DoxygenLayout.xml @@ -0,0 +1,188 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/doc/Examples/meshexample.dxf b/doc/Examples/meshexample.dxf new file mode 100644 index 0000000..7e174cb --- /dev/null +++ b/doc/Examples/meshexample.dxf @@ -0,0 +1,47962 @@ +999 +dxflib 2.2.0.0 + 0 +SECTION + 2 +HEADER + 9 +$ACADVER + 1 +AC1015 + 9 +$HANDSEED + 5 +FFFF + 9 +$DIMASZ + 40 +2.5 + 9 +$PLIMMIN + 10 +0.0 + 20 +0.0 + 9 +$DIMEXE + 40 +1.25 + 9 +$DIMGAP + 40 +0.625 + 9 +$PLIMMAX + 10 +210.0 + 20 +297.0 + 9 +$PSVPSCALE + 40 +0.7295160000000001 + 9 +$PINSBASE + 10 +16.6994766976620639 + 20 +117.2065161928293264 + 30 +0.0 + 9 +$INSUNITS + 70 +4 + 9 +$DIMSTYLE + 2 +Standard + 9 +$CLAYER + 8 +1-UGrid Mark Neighbors + 9 +$DIMEXO + 40 +0.625 + 9 +$DIMTXT + 40 +2.5 + 9 +$CLAYER + 8 +1-UGrid Mark DownAdjVertices + 0 +ENDSEC + 0 +SECTION + 2 +TABLES + 0 +TABLE + 2 +VPORT + 5 +8 +100 +AcDbSymbolTable + 70 +1 + 0 +VPORT + 5 +30 +100 +AcDbSymbolTableRecord +100 +AcDbViewportTableRecord + 2 +*Active + 70 +0 + 10 +0.0 + 20 +0.0 + 11 +1.0 + 21 +1.0 + 12 +286.3055555555554861 + 22 +148.5 + 13 +0.0 + 23 +0.0 + 14 +10.0 + 24 +10.0 + 15 +10.0 + 25 +10.0 + 16 +0.0 + 26 +0.0 + 36 +1.0 + 17 +0.0 + 27 +0.0 + 37 +0.0 + 40 +297.0 + 41 +1.92798353909465 + 42 +50.0 + 43 +0.0 + 44 +0.0 + 50 +0.0 + 51 +0.0 + 71 +0 + 72 +100 + 73 +1 + 74 +3 + 75 +1 + 76 +1 + 77 +0 + 78 +0 +281 +0 + 65 +1 +110 +0.0 +120 +0.0 +130 +0.0 +111 +1.0 +121 +0.0 +131 +0.0 +112 +0.0 +122 +1.0 +132 +0.0 + 79 +0 +146 +0.0 + 0 +ENDTAB + 0 +TABLE + 2 +LTYPE + 5 +5 +100 +AcDbSymbolTable + 70 +21 + 0 +LTYPE + 5 +14 +100 +AcDbSymbolTableRecord +100 +AcDbLinetypeTableRecord + 2 +ByBlock + 70 +0 + 3 + + 72 +65 + 73 +0 + 40 +0.0 + 0 +LTYPE + 5 +15 +100 +AcDbSymbolTableRecord +100 +AcDbLinetypeTableRecord + 2 +ByLayer + 70 +0 + 3 + + 72 +65 + 73 +0 + 40 +0.0 + 0 +LTYPE + 5 +16 +100 +AcDbSymbolTableRecord +100 +AcDbLinetypeTableRecord + 2 +CONTINUOUS + 70 +0 + 3 +Solid line + 72 +65 + 73 +0 + 40 +0.0 + 0 +LTYPE + 5 +31 +100 +AcDbSymbolTableRecord +100 +AcDbLinetypeTableRecord + 2 +DOT + 70 +0 + 3 +Dot . . . . . . . . . . . . . . . . . . . . . . + 72 +65 + 73 +2 + 40 +6.3499999999999996 + 49 +0.0 + 74 +0 + 49 +-6.3499999999999996 + 74 +0 + 0 +LTYPE + 5 +32 +100 +AcDbSymbolTableRecord +100 +AcDbLinetypeTableRecord + 2 +DOT2 + 70 +0 + 3 +Dot (.5x) ..................................... + 72 +65 + 73 +2 + 40 +3.1749999999999998 + 49 +0.0 + 74 +0 + 49 +-3.1749999999999998 + 74 +0 + 0 +LTYPE + 5 +33 +100 +AcDbSymbolTableRecord +100 +AcDbLinetypeTableRecord + 2 +DOTX2 + 70 +0 + 3 +Dot (2x) . . . . . . . . . . . . . + 72 +65 + 73 +2 + 40 +12.6999999999999993 + 49 +0.0 + 74 +0 + 49 +-12.6999999999999993 + 74 +0 + 0 +LTYPE + 5 +34 +100 +AcDbSymbolTableRecord +100 +AcDbLinetypeTableRecord + 2 +DASHED + 70 +0 + 3 +Dashed __ __ __ __ __ __ __ __ __ __ __ __ __ _ + 72 +65 + 73 +2 + 40 +19.0500000000000007 + 49 +12.6999999999999993 + 74 +0 + 49 +-6.3499999999999996 + 74 +0 + 0 +LTYPE + 5 +35 +100 +AcDbSymbolTableRecord +100 +AcDbLinetypeTableRecord + 2 +DASHED2 + 70 +0 + 3 +Dashed (.5x) _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ + 72 +65 + 73 +2 + 40 +9.5250000000000004 + 49 +6.3499999999999996 + 74 +0 + 49 +-3.1749999999999998 + 74 +0 + 0 +LTYPE + 5 +36 +100 +AcDbSymbolTableRecord +100 +AcDbLinetypeTableRecord + 2 +DASHEDX2 + 70 +0 + 3 +Dashed (2x) ____ ____ ____ ____ ____ ___ + 72 +65 + 73 +2 + 40 +38.1000000000000014 + 49 +25.3999999999999986 + 74 +0 + 49 +-12.6999999999999993 + 74 +0 + 0 +LTYPE + 5 +37 +100 +AcDbSymbolTableRecord +100 +AcDbLinetypeTableRecord + 2 +DASHDOT + 70 +0 + 3 +Dash dot __ . __ . __ . __ . __ . __ . __ . __ + 72 +65 + 73 +4 + 40 +25.3999999999999986 + 49 +12.6999999999999993 + 74 +0 + 49 +-6.3499999999999996 + 74 +0 + 49 +0.0 + 74 +0 + 49 +-6.3499999999999996 + 74 +0 + 0 +LTYPE + 5 +38 +100 +AcDbSymbolTableRecord +100 +AcDbLinetypeTableRecord + 2 +DASHDOT2 + 70 +0 + 3 +Dash dot (.5x) _._._._._._._._._._._._._._._. + 72 +65 + 73 +4 + 40 +12.6999999999999993 + 49 +6.3499999999999996 + 74 +0 + 49 +-3.1749999999999998 + 74 +0 + 49 +0.0 + 74 +0 + 49 +-3.1749999999999998 + 74 +0 + 0 +LTYPE + 5 +39 +100 +AcDbSymbolTableRecord +100 +AcDbLinetypeTableRecord + 2 +DASHDOTX2 + 70 +0 + 3 +Dash dot (2x) ____ . ____ . ____ . ___ + 72 +65 + 73 +4 + 40 +50.7999999999999972 + 49 +25.3999999999999986 + 74 +0 + 49 +-12.6999999999999993 + 74 +0 + 49 +0.0 + 74 +0 + 49 +-12.6999999999999993 + 74 +0 + 0 +LTYPE + 5 +3A +100 +AcDbSymbolTableRecord +100 +AcDbLinetypeTableRecord + 2 +DIVIDE + 70 +0 + 3 +Divide ____ . . ____ . . ____ . . ____ . . ____ + 72 +65 + 73 +6 + 40 +31.75 + 49 +12.6999999999999993 + 74 +0 + 49 +-6.3499999999999996 + 74 +0 + 49 +0.0 + 74 +0 + 49 +-6.3499999999999996 + 74 +0 + 49 +0.0 + 74 +0 + 49 +-6.3499999999999996 + 74 +0 + 0 +LTYPE + 5 +3B +100 +AcDbSymbolTableRecord +100 +AcDbLinetypeTableRecord + 2 +DIVIDE2 + 70 +0 + 3 +Divide (.5x) __..__..__..__..__..__..__..__.._ + 72 +65 + 73 +6 + 40 +15.875 + 49 +6.3499999999999996 + 74 +0 + 49 +-3.1749999999999998 + 74 +0 + 49 +0.0 + 74 +0 + 49 +-3.1749999999999998 + 74 +0 + 49 +0.0 + 74 +0 + 49 +-3.1749999999999998 + 74 +0 + 0 +LTYPE + 5 +3C +100 +AcDbSymbolTableRecord +100 +AcDbLinetypeTableRecord + 2 +DIVIDEX2 + 70 +0 + 3 +Divide (2x) ________ . . ________ . . _ + 72 +65 + 73 +6 + 40 +63.5 + 49 +25.3999999999999986 + 74 +0 + 49 +-12.6999999999999993 + 74 +0 + 49 +0.0 + 74 +0 + 49 +-12.6999999999999993 + 74 +0 + 49 +0.0 + 74 +0 + 49 +-12.6999999999999993 + 74 +0 + 0 +LTYPE + 5 +3D +100 +AcDbSymbolTableRecord +100 +AcDbLinetypeTableRecord + 2 +CENTER + 70 +0 + 3 +Center ____ _ ____ _ ____ _ ____ _ ____ _ ____ + 72 +65 + 73 +4 + 40 +50.7999999999999972 + 49 +31.75 + 74 +0 + 49 +-6.3499999999999996 + 74 +0 + 49 +6.3499999999999996 + 74 +0 + 49 +-6.3499999999999996 + 74 +0 + 0 +LTYPE + 5 +3E +100 +AcDbSymbolTableRecord +100 +AcDbLinetypeTableRecord + 2 +CENTER2 + 70 +0 + 3 +Center (.5x) ___ _ ___ _ ___ _ ___ _ ___ _ ___ + 72 +65 + 73 +4 + 40 +28.5749999999999993 + 49 +19.0500000000000007 + 74 +0 + 49 +-3.1749999999999998 + 74 +0 + 49 +3.1749999999999998 + 74 +0 + 49 +-3.1749999999999998 + 74 +0 + 0 +LTYPE + 5 +3F +100 +AcDbSymbolTableRecord +100 +AcDbLinetypeTableRecord + 2 +CENTERX2 + 70 +0 + 3 +Center (2x) ________ __ ________ __ _____ + 72 +65 + 73 +4 + 40 +101.5999999999999943 + 49 +63.5 + 74 +0 + 49 +-12.6999999999999993 + 74 +0 + 49 +12.6999999999999993 + 74 +0 + 49 +-12.6999999999999993 + 74 +0 + 0 +LTYPE + 5 +40 +100 +AcDbSymbolTableRecord +100 +AcDbLinetypeTableRecord + 2 +BORDER + 70 +0 + 3 +Border __ __ . __ __ . __ __ . __ __ . __ __ . + 72 +65 + 73 +6 + 40 +44.4500000000000028 + 49 +12.6999999999999993 + 74 +0 + 49 +-6.3499999999999996 + 74 +0 + 49 +12.6999999999999993 + 74 +0 + 49 +-6.3499999999999996 + 74 +0 + 49 +0.0 + 74 +0 + 49 +-6.3499999999999996 + 74 +0 + 0 +LTYPE + 5 +41 +100 +AcDbSymbolTableRecord +100 +AcDbLinetypeTableRecord + 2 +BORDER2 + 70 +0 + 3 +Border (.5x) __.__.__.__.__.__.__.__.__.__.__. + 72 +65 + 73 +6 + 40 +22.2250000000000014 + 49 +6.3499999999999996 + 74 +0 + 49 +-3.1749999999999998 + 74 +0 + 49 +6.3499999999999996 + 74 +0 + 49 +-3.1749999999999998 + 74 +0 + 49 +0.0 + 74 +0 + 49 +-3.1749999999999998 + 74 +0 + 0 +LTYPE + 5 +42 +100 +AcDbSymbolTableRecord +100 +AcDbLinetypeTableRecord + 2 +BORDERX2 + 70 +0 + 3 +Border (2x) ____ ____ . ____ ____ . ___ + 72 +65 + 73 +6 + 40 +88.9000000000000057 + 49 +25.3999999999999986 + 74 +0 + 49 +-12.6999999999999993 + 74 +0 + 49 +25.3999999999999986 + 74 +0 + 49 +-12.6999999999999993 + 74 +0 + 49 +0.0 + 74 +0 + 49 +-12.6999999999999993 + 74 +0 + 0 +ENDTAB + 0 +TABLE + 2 +LAYER + 5 +2 +100 +AcDbSymbolTable + 70 +125 + 0 +LAYER + 5 +10 +100 +AcDbSymbolTableRecord +100 +AcDbLayerTableRecord + 2 +0 + 70 +0 + 62 +7 +420 +0 + 6 +CONTINUOUS +370 +70 +390 +F + 0 +LAYER + 5 +43 +100 +AcDbSymbolTableRecord +100 +AcDbLayerTableRecord + 2 +1-UGrid New Triangles + 70 +1 + 62 +-1 +420 +16711680 + 6 +CONTINUOUS +370 +50 +390 +F + 0 +LAYER + 5 +44 +100 +AcDbSymbolTableRecord +100 +AcDbLayerTableRecord + 2 +2 + 70 +1 + 62 +-3 +420 +65280 + 6 +CONTINUOUS +370 +50 +390 +F + 0 +LAYER + 5 +45 +100 +AcDbSymbolTableRecord +100 +AcDbLayerTableRecord + 2 +0-UGrid Vertex Idx + 70 +1 + 62 +-7 +420 +0 + 6 +CONTINUOUS +370 +35 +390 +F + 0 +LAYER + 5 +46 +100 +AcDbSymbolTableRecord +100 +AcDbLayerTableRecord + 2 +1-UGrid New Vertex Idx + 70 +1 + 62 +-1 +420 +16711680 + 6 +CONTINUOUS +370 +35 +390 +F + 0 +LAYER + 5 +47 +100 +AcDbSymbolTableRecord +100 +AcDbLayerTableRecord + 2 +2-Vertices + 70 +1 + 62 +-3 +420 +65280 + 6 +CONTINUOUS +370 +35 +390 +F + 0 +LAYER + 5 +48 +100 +AcDbSymbolTableRecord +100 +AcDbLayerTableRecord + 2 +0-UGrid Triangle IDs + 70 +1 + 62 +-7 +420 +0 + 6 +CONTINUOUS +370 +35 +390 +F + 0 +LAYER + 5 +49 +100 +AcDbSymbolTableRecord +100 +AcDbLayerTableRecord + 2 +1-UGrid New Triangle IDs + 70 +1 + 62 +-1 +420 +16711680 + 6 +CONTINUOUS +370 +35 +390 +F + 0 +LAYER + 5 +4A +100 +AcDbSymbolTableRecord +100 +AcDbLayerTableRecord + 2 +2-Triangles + 70 +1 + 62 +-3 +420 +65280 + 6 +CONTINUOUS +370 +0 +390 +F + 0 +LAYER + 5 +4B +100 +AcDbSymbolTableRecord +100 +AcDbLayerTableRecord + 2 +1-UGrid Triangle Idx + 70 +1 + 62 +-7 +420 +0 + 6 +CONTINUOUS +370 +35 +390 +F + 0 +LAYER + 5 +4C +100 +AcDbSymbolTableRecord +100 +AcDbLayerTableRecord + 2 +0-UGrid Edge Idx + 70 +1 + 62 +-8 +420 +8421504 + 6 +CONTINUOUS +370 +35 +390 +F + 0 +LAYER + 5 +4D +100 +AcDbSymbolTableRecord +100 +AcDbLayerTableRecord + 2 +1-UGrid Edge Idx + 70 +1 + 62 +-6 +420 +16711935 + 6 +CONTINUOUS +370 +35 +390 +F + 0 +LAYER + 5 +4E +100 +AcDbSymbolTableRecord +100 +AcDbLayerTableRecord + 2 +1-DGraph + 70 +1 + 62 +-8 +420 +8421504 + 6 +CONTINUOUS +370 +50 +390 +F + 0 +LAYER + 5 +4F +100 +AcDbSymbolTableRecord +100 +AcDbLayerTableRecord + 2 +1-UGrid DG Part1 + 70 +1 + 62 +-91 +420 +7405424 + 6 +CONTINUOUS +370 +25 +390 +F + 0 +LAYER + 5 +50 +100 +AcDbSymbolTableRecord +100 +AcDbLayerTableRecord + 2 +1-UGrid DG Part2 + 70 +1 + 62 +-150 +420 +39423 + 6 +CONTINUOUS +370 +25 +390 +F + 0 +LAYER + 5 +51 +100 +AcDbSymbolTableRecord +100 +AcDbLayerTableRecord + 2 +1-UGrid + 70 +0 + 62 +7 +420 +0 + 6 +CONTINUOUS +370 +100 +390 +F + 0 +LAYER + 5 +52 +100 +AcDbSymbolTableRecord +100 +AcDbLayerTableRecord + 2 +1-NGraph + 70 +1 + 62 +-7 +420 +0 + 6 +CONTINUOUS +370 +140 +390 +F + 0 +LAYER + 5 +53 +100 +AcDbSymbolTableRecord +100 +AcDbLayerTableRecord + 2 +1-NGraph Vertex Idx + 70 +1 + 62 +-7 +420 +0 + 6 +CONTINUOUS +370 +35 +390 +F + 0 +LAYER + 5 +54 +100 +AcDbSymbolTableRecord +100 +AcDbLayerTableRecord + 2 +1-NGraph Part 1 + 70 +1 + 62 +-91 +420 +7405424 + 6 +CONTINUOUS +370 +0 +390 +F + 0 +LAYER + 5 +55 +100 +AcDbSymbolTableRecord +100 +AcDbLayerTableRecord + 2 +1-NGraph Part 2 + 70 +1 + 62 +-150 +420 +3769599 + 6 +CONTINUOUS +370 +0 +390 +F + 0 +LAYER + 5 +56 +100 +AcDbSymbolTableRecord +100 +AcDbLayerTableRecord + 2 +1-DGraph Vertex Idx + 70 +1 + 62 +-7 +420 +0 + 6 +CONTINUOUS +370 +35 +390 +F + 0 +LAYER + 5 +57 +100 +AcDbSymbolTableRecord +100 +AcDbLayerTableRecord + 2 +1-DGraph Part1 + 70 +1 + 62 +-91 +420 +7405424 + 6 +CONTINUOUS +370 +0 +390 +F + 0 +LAYER + 5 +58 +100 +AcDbSymbolTableRecord +100 +AcDbLayerTableRecord + 2 +1-DGraph Part2 + 70 +1 + 62 +-150 +420 +3769599 + 6 +CONTINUOUS +370 +0 +390 +F + 0 +LAYER + 5 +59 +100 +AcDbSymbolTableRecord +100 +AcDbLayerTableRecord + 2 +1-UGrid Triangle IDs + 70 +1 + 62 +-7 +420 +0 + 6 +CONTINUOUS +370 +35 +390 +F + 0 +LAYER + 5 +5A +100 +AcDbSymbolTableRecord +100 +AcDbLayerTableRecord + 2 +1-UGrid Vertex Idx + 70 +0 + 62 +7 +420 +0 + 6 +CONTINUOUS +370 +35 +390 +F + 0 +LAYER + 5 +5B +100 +AcDbSymbolTableRecord +100 +AcDbLayerTableRecord + 2 +0-UGrid + 70 +1 + 62 +-7 +420 +0 + 6 +CONTINUOUS +370 +100 +390 +F + 0 +LAYER + 5 +5C +100 +AcDbSymbolTableRecord +100 +AcDbLayerTableRecord + 2 +0-UGrid Triangle Idx + 70 +1 + 62 +-7 +420 +0 + 6 +CONTINUOUS +370 +35 +390 +F + 0 +LAYER + 5 +5D +100 +AcDbSymbolTableRecord +100 +AcDbLayerTableRecord + 2 +0-DGraph + 70 +1 + 62 +-8 +420 +8421504 + 6 +CONTINUOUS +370 +25 +390 +F + 0 +LAYER + 5 +5E +100 +AcDbSymbolTableRecord +100 +AcDbLayerTableRecord + 2 +0-DGraph Vertex Idx + 70 +1 + 62 +-7 +420 +0 + 6 +CONTINUOUS +370 +35 +390 +F + 0 +LAYER + 5 +5F +100 +AcDbSymbolTableRecord +100 +AcDbLayerTableRecord + 2 +0-NGraph + 70 +1 + 62 +-7 +420 +0 + 6 +CONTINUOUS +370 +140 +390 +F + 0 +LAYER + 5 +60 +100 +AcDbSymbolTableRecord +100 +AcDbLayerTableRecord + 2 +0-NGraph Vertex Idx + 70 +1 + 62 +-7 +420 +0 + 6 +CONTINUOUS +370 +35 +390 +F + 0 +LAYER + 5 +61 +100 +AcDbSymbolTableRecord +100 +AcDbLayerTableRecord + 2 +1-UGrid NGraph Part1 + 70 +1 + 62 +-91 +420 +7405424 + 6 +CONTINUOUS +370 +0 +390 +F + 0 +LAYER + 5 +62 +100 +AcDbSymbolTableRecord +100 +AcDbLayerTableRecord + 2 +1-UGrid NGraph Part2 + 70 +1 + 62 +-150 +420 +3769599 + 6 +CONTINUOUS +370 +0 +390 +F + 0 +LAYER + 5 +63 +100 +AcDbSymbolTableRecord +100 +AcDbLayerTableRecord + 2 +1-DGraph InitPart1 + 70 +1 + 62 +-91 +420 +7405424 + 6 +CONTINUOUS +370 +0 +390 +F + 0 +LAYER + 5 +64 +100 +AcDbSymbolTableRecord +100 +AcDbLayerTableRecord + 2 +1-DGraph InitPart2 + 70 +1 + 62 +-150 +420 +3769599 + 6 +CONTINUOUS +370 +0 +390 +F + 0 +LAYER + 5 +65 +100 +AcDbSymbolTableRecord +100 +AcDbLayerTableRecord + 2 +1-UGrid DG InitPart1 + 70 +1 + 62 +-91 +420 +7405424 + 6 +CONTINUOUS +370 +0 +390 +F + 0 +LAYER + 5 +66 +100 +AcDbSymbolTableRecord +100 +AcDbLayerTableRecord + 2 +1-UGrid DG InitPart2 + 70 +1 + 62 +-150 +420 +3769599 + 6 +CONTINUOUS +370 +0 +390 +F + 0 +LAYER + 5 +67 +100 +AcDbSymbolTableRecord +100 +AcDbLayerTableRecord + 2 +1-UGrid DG Part2 BorderEdges + 70 +1 + 62 +-150 +420 +3381759 + 6 +CONTINUOUS +370 +140 +390 +F + 0 +LAYER + 5 +68 +100 +AcDbSymbolTableRecord +100 +AcDbLayerTableRecord + 2 +1-UGrid DG Part2 InteriorEdges + 70 +1 + 62 +-4 +420 +65535 + 6 +CONTINUOUS +370 +140 +390 +F + 0 +LAYER + 5 +69 +100 +AcDbSymbolTableRecord +100 +AcDbLayerTableRecord + 2 +1-UGrid DG Part2 GhostElems + 70 +1 + 62 +-2 +420 +16776960 + 6 +CONTINUOUS +370 +140 +390 +F + 0 +LAYER + 5 +6A +100 +AcDbSymbolTableRecord +100 +AcDbLayerTableRecord + 2 +1-UGrid DG Part2 GhostEdges + 70 +1 + 62 +-40 +420 +16763955 + 6 +CONTINUOUS +370 +140 +390 +F + 0 +LAYER + 5 +6B +100 +AcDbSymbolTableRecord +100 +AcDbLayerTableRecord + 2 +1-UGrid DG Part2 BorderVertices + 70 +1 + 62 +-150 +420 +3381759 + 6 +CONTINUOUS +370 +0 +390 +F + 0 +LAYER + 5 +6C +100 +AcDbSymbolTableRecord +100 +AcDbLayerTableRecord + 2 +1-UGrid DG Part2 InteriorVertices + 70 +1 + 62 +-4 +420 +65535 + 6 +CONTINUOUS +370 +0 +390 +F + 0 +LAYER + 5 +6D +100 +AcDbSymbolTableRecord +100 +AcDbLayerTableRecord + 2 +1-UGrid DG Part2 GhostVertices + 70 +1 + 62 +-51 +420 +16777088 + 6 +CONTINUOUS +370 +0 +390 +F + 0 +LAYER + 5 +6E +100 +AcDbSymbolTableRecord +100 +AcDbLayerTableRecord + 2 +1-UGrid DG Part2 OverlapElems Example + 70 +1 + 62 +-3 +420 +65280 + 6 +CONTINUOUS +370 +0 +390 +F + 0 +LAYER + 5 +6F +100 +AcDbSymbolTableRecord +100 +AcDbLayerTableRecord + 2 +1-UGrid DG Part2 OverlapEdges Example + 70 +1 + 62 +-94 +420 +32768 + 6 +CONTINUOUS +370 +140 +390 +F + 0 +LAYER + 5 +70 +100 +AcDbSymbolTableRecord +100 +AcDbLayerTableRecord + 2 +1-UGrid DG Part2 FrontEdges Example + 70 +1 + 62 +-6 +420 +16711935 + 6 +CONTINUOUS +370 +140 +390 +F + 0 +LAYER + 5 +71 +100 +AcDbSymbolTableRecord +100 +AcDbLayerTableRecord + 2 +1-UGrid DG Part2 FrontVertices Example + 70 +1 + 62 +-6 +420 +16711935 + 6 +CONTINUOUS +370 +0 +390 +F + 0 +LAYER + 5 +72 +100 +AcDbSymbolTableRecord +100 +AcDbLayerTableRecord + 2 +1-UGrid DG Part2 Ghost2OverlapElems + 70 +1 + 62 +-2 +420 +16776960 + 6 +CONTINUOUS +370 +0 +390 +F + 0 +LAYER + 5 +73 +100 +AcDbSymbolTableRecord +100 +AcDbLayerTableRecord + 2 +1-UGrid DG Part2 Ghost2OverlapEdges + 70 +1 + 62 +-52 +420 +11776768 + 6 +CONTINUOUS +370 +140 +390 +F + 0 +LAYER + 5 +74 +100 +AcDbSymbolTableRecord +100 +AcDbLayerTableRecord + 2 +1-UGrid DG Part2 Ghost2OverlapVertices + 70 +1 + 62 +-52 +420 +11776768 + 6 +CONTINUOUS +370 +0 +390 +F + 0 +LAYER + 5 +75 +100 +AcDbSymbolTableRecord +100 +AcDbLayerTableRecord + 2 +0-UGrid Mark Element + 70 +0 + 62 +2 +420 +16776960 + 6 +CONTINUOUS +370 +0 +390 +F + 0 +LAYER + 5 +76 +100 +AcDbSymbolTableRecord +100 +AcDbLayerTableRecord + 2 +0-UGrid Mark Neighbors + 70 +1 + 62 +-30 +420 +16737843 + 6 +CONTINUOUS +370 +0 +390 +F + 0 +LAYER + 5 +77 +100 +AcDbSymbolTableRecord +100 +AcDbLayerTableRecord + 2 +0-UGrid Mark UpAdj Vertex + 70 +1 + 62 +-2 +420 +16776960 + 6 +CONTINUOUS +370 +50 +390 +F + 0 +LAYER + 5 +78 +100 +AcDbSymbolTableRecord +100 +AcDbLayerTableRecord + 2 +0-UGrid Mark UpAdj Edges + 70 +1 + 62 +-1 +420 +16711680 + 6 +CONTINUOUS +370 +100 +390 +F + 0 +LAYER + 5 +79 +100 +AcDbSymbolTableRecord +100 +AcDbLayerTableRecord + 2 +0-UGrid Mark DownAdj Vertices + 70 +1 + 62 +-1 +420 +16711680 + 6 +CONTINUOUS +370 +50 +390 +F + 0 +LAYER + 5 +7A +100 +AcDbSymbolTableRecord +100 +AcDbLayerTableRecord + 2 +1-NGraph Part2 Elements + 70 +1 + 62 +-141 +420 +8446207 + 6 +CONTINUOUS +370 +0 +390 +F + 0 +LAYER + 5 +7B +100 +AcDbSymbolTableRecord +100 +AcDbLayerTableRecord + 2 +1-NGraph Part1 Elements + 70 +1 + 62 +-61 +420 +14745472 + 6 +CONTINUOUS +370 +0 +390 +F + 0 +LAYER + 5 +7C +100 +AcDbSymbolTableRecord +100 +AcDbLayerTableRecord + 2 +1-UGrid Mark Element + 70 +1 + 62 +-2 +420 +16776960 + 6 +CONTINUOUS +370 +0 +390 +F + 0 +LAYER + 5 +7D +100 +AcDbSymbolTableRecord +100 +AcDbLayerTableRecord + 2 +1-UGrid Mark Neighbors + 70 +1 + 62 +-30 +420 +16737843 + 6 +CONTINUOUS +370 +0 +390 +F + 0 +LAYER + 5 +7E +100 +AcDbSymbolTableRecord +100 +AcDbLayerTableRecord + 2 +0-UGrid DG Part1 + 70 +1 + 62 +-91 +420 +7405424 + 6 +CONTINUOUS +370 +0 +390 +F + 0 +LAYER + 5 +7F +100 +AcDbSymbolTableRecord +100 +AcDbLayerTableRecord + 2 +0-UGrid DG Part2 + 70 +1 + 62 +-150 +420 +3769599 + 6 +CONTINUOUS +370 +0 +390 +F + 0 +LAYER + 5 +80 +100 +AcDbSymbolTableRecord +100 +AcDbLayerTableRecord + 2 +0-UGrid DG Part2 BorderEdges + 70 +1 + 62 +-4 +420 +65535 + 6 +CONTINUOUS +370 +140 +390 +F + 0 +LAYER + 5 +81 +100 +AcDbSymbolTableRecord +100 +AcDbLayerTableRecord + 2 +1-UGrid DG Part2 H5Fed OverlapElems + 70 +1 + 62 +-3 +420 +65280 + 6 +CONTINUOUS +370 +0 +390 +F + 0 +LAYER + 5 +82 +100 +AcDbSymbolTableRecord +100 +AcDbLayerTableRecord + 2 +1-UGrid DG Part2 H5Fed FrontVertices + 70 +1 + 62 +-6 +420 +16711935 + 6 +CONTINUOUS +370 +0 +390 +F + 0 +LAYER + 5 +83 +100 +AcDbSymbolTableRecord +100 +AcDbLayerTableRecord + 2 +1-UGrid DG Part2 H5Fed FrontEdges + 70 +1 + 62 +-6 +420 +16711935 + 6 +CONTINUOUS +370 +140 +390 +F + 0 +LAYER + 5 +84 +100 +AcDbSymbolTableRecord +100 +AcDbLayerTableRecord + 2 +1-UGrid DG Part2 H5Fed OverlapEdges + 70 +1 + 62 +-82 +420 +3381504 + 6 +CONTINUOUS +370 +140 +390 +F + 0 +LAYER + 5 +85 +100 +AcDbSymbolTableRecord +100 +AcDbLayerTableRecord + 2 +1-UGrid DG Part2 OverlapVertices H5Fed + 70 +1 + 62 +-82 +420 +3381504 + 6 +CONTINUOUS +370 +0 +390 +F + 0 +LAYER + 5 +86 +100 +AcDbSymbolTableRecord +100 +AcDbLayerTableRecord + 2 +1-UGrid 0Part1 FrontEdges H5Fed + 70 +1 + 62 +-6 +420 +16711935 + 6 +CONTINUOUS +370 +140 +390 +F + 0 +LAYER + 5 +87 +100 +AcDbSymbolTableRecord +100 +AcDbLayerTableRecord + 2 +1-UGrid 0Part1 FrontVertices H5Fed + 70 +1 + 62 +-6 +420 +16711935 + 6 +CONTINUOUS +370 +0 +390 +F + 0 +LAYER + 5 +88 +100 +AcDbSymbolTableRecord +100 +AcDbLayerTableRecord + 2 +1-UGrid 0Part1 OverlapVertices H5Fed + 70 +1 + 62 +-7 +420 +0 + 6 +CONTINUOUS +370 +0 +390 +F + 0 +LAYER + 5 +89 +100 +AcDbSymbolTableRecord +100 +AcDbLayerTableRecord + 2 +1-UGrid 0Part1 OverlapEdges H5Fed + 70 +1 + 62 +-82 +420 +3381504 + 6 +CONTINUOUS +370 +140 +390 +F + 0 +LAYER + 5 +8A +100 +AcDbSymbolTableRecord +100 +AcDbLayerTableRecord + 2 +1-UGrid 0Part1 OverlapElems H5Fed + 70 +1 + 62 +-3 +420 +65280 + 6 +CONTINUOUS +370 +0 +390 +F + 0 +LAYER + 5 +8B +100 +AcDbSymbolTableRecord +100 +AcDbLayerTableRecord + 2 +1-UGrid 0Part1 BorderVertices H5Fed + 70 +1 + 62 +-150 +420 +3381759 + 6 +CONTINUOUS +370 +0 +390 +F + 0 +LAYER + 5 +8C +100 +AcDbSymbolTableRecord +100 +AcDbLayerTableRecord + 2 +1-UGrid 0Part1 BorderEdges H5Fed + 70 +1 + 62 +-150 +420 +3381759 + 6 +CONTINUOUS +370 +140 +390 +F + 0 +LAYER + 5 +8D +100 +AcDbSymbolTableRecord +100 +AcDbLayerTableRecord + 2 +1-UGrid 0Part1 InteriorElems H5Fed + 70 +1 + 62 +-30 +420 +16737843 + 6 +CONTINUOUS +370 +0 +390 +F + 0 +LAYER + 5 +8E +100 +AcDbSymbolTableRecord +100 +AcDbLayerTableRecord + 2 +1-UGrid 0Part1 InteriorVertices H5Fed + 70 +1 + 62 +-1 +420 +16711680 + 6 +CONTINUOUS +370 +-3 +390 +F + 0 +LAYER + 5 +8F +100 +AcDbSymbolTableRecord +100 +AcDbLayerTableRecord + 2 +1-UGrid 0Part1 InteriorEdges H5Fed + 70 +1 + 62 +-1 +420 +16711680 + 6 +CONTINUOUS +370 +140 +390 +F + 0 +LAYER + 5 +90 +100 +AcDbSymbolTableRecord +100 +AcDbLayerTableRecord + 2 +0-UGrid Part1 BorderEdges H5Fed + 70 +1 + 62 +-4 +420 +65535 + 6 +CONTINUOUS +370 +140 +390 +F + 0 +LAYER + 5 +91 +100 +AcDbSymbolTableRecord +100 +AcDbLayerTableRecord + 2 +0-UGrid Part1 BorderVertices H5Fed + 70 +1 + 62 +-4 +420 +65535 + 6 +CONTINUOUS +370 +0 +390 +F + 0 +LAYER + 5 +92 +100 +AcDbSymbolTableRecord +100 +AcDbLayerTableRecord + 2 +0-UGrid Part1 FrontEdges H5Fed + 70 +1 + 62 +-6 +420 +16711935 + 6 +CONTINUOUS +370 +140 +390 +F + 0 +LAYER + 5 +93 +100 +AcDbSymbolTableRecord +100 +AcDbLayerTableRecord + 2 +0-UGrid Part1 FrontVertices H5Fed + 70 +1 + 62 +-6 +420 +16711935 + 6 +CONTINUOUS +370 +0 +390 +F + 0 +LAYER + 5 +94 +100 +AcDbSymbolTableRecord +100 +AcDbLayerTableRecord + 2 +0-UGrid Part1 InteriorEdges H5Fed + 70 +1 + 62 +-1 +420 +16711680 + 6 +CONTINUOUS +370 +140 +390 +F + 0 +LAYER + 5 +95 +100 +AcDbSymbolTableRecord +100 +AcDbLayerTableRecord + 2 +0-UGrid Part1 InteriorElems H5Fed + 70 +1 + 62 +-30 +420 +16737843 + 6 +CONTINUOUS +370 +0 +390 +F + 0 +LAYER + 5 +96 +100 +AcDbSymbolTableRecord +100 +AcDbLayerTableRecord + 2 +0-UGrid Part1 InteriorVertices H5Fed + 70 +1 + 62 +-1 +420 +16711680 + 6 +CONTINUOUS +370 +-3 +390 +F + 0 +LAYER + 5 +97 +100 +AcDbSymbolTableRecord +100 +AcDbLayerTableRecord + 2 +0-UGrid Part1 OverlapEdges H5Fed + 70 +1 + 62 +-82 +420 +3381504 + 6 +CONTINUOUS +370 +140 +390 +F + 0 +LAYER + 5 +98 +100 +AcDbSymbolTableRecord +100 +AcDbLayerTableRecord + 2 +0-UGrid Part1 OverlapElems H5Fed + 70 +1 + 62 +-3 +420 +65280 + 6 +CONTINUOUS +370 +0 +390 +F + 0 +LAYER + 5 +99 +100 +AcDbSymbolTableRecord +100 +AcDbLayerTableRecord + 2 +0-UGrid Part1 OverlapVertices H5Fed + 70 +1 + 62 +-7 +420 +0 + 6 +CONTINUOUS +370 +0 +390 +F + 0 +LAYER + 5 +9A +100 +AcDbSymbolTableRecord +100 +AcDbLayerTableRecord + 2 +0-UGrid Part2 BorderEdges H5Fed + 70 +1 + 62 +-150 +420 +3381759 + 6 +CONTINUOUS +370 +140 +390 +F + 0 +LAYER + 5 +9B +100 +AcDbSymbolTableRecord +100 +AcDbLayerTableRecord + 2 +0-UGrid Part2 BorderVertices H5Fed + 70 +1 + 62 +-150 +420 +3381759 + 6 +CONTINUOUS +370 +0 +390 +F + 0 +LAYER + 5 +9C +100 +AcDbSymbolTableRecord +100 +AcDbLayerTableRecord + 2 +0-UGrid Part2 FrontEdges H5Fed + 70 +1 + 62 +-6 +420 +16711935 + 6 +CONTINUOUS +370 +0 +390 +F + 0 +LAYER + 5 +9D +100 +AcDbSymbolTableRecord +100 +AcDbLayerTableRecord + 2 +0-UGrid Part2 FrontVertices H5Fed + 70 +1 + 62 +-6 +420 +16711935 + 6 +CONTINUOUS +370 +0 +390 +F + 0 +LAYER + 5 +9E +100 +AcDbSymbolTableRecord +100 +AcDbLayerTableRecord + 2 +0-UGrid Part2 InteriorEdges H5Fed + 70 +1 + 62 +-1 +420 +16711680 + 6 +CONTINUOUS +370 +140 +390 +F + 0 +LAYER + 5 +9F +100 +AcDbSymbolTableRecord +100 +AcDbLayerTableRecord + 2 +0-UGrid Part2 InteriorElems H5Fed + 70 +1 + 62 +-30 +420 +16737843 + 6 +CONTINUOUS +370 +0 +390 +F + 0 +LAYER + 5 +A0 +100 +AcDbSymbolTableRecord +100 +AcDbLayerTableRecord + 2 +0-UGrid Part2 InteriorVertices H5Fed + 70 +1 + 62 +-1 +420 +16711680 + 6 +CONTINUOUS +370 +0 +390 +F + 0 +LAYER + 5 +A1 +100 +AcDbSymbolTableRecord +100 +AcDbLayerTableRecord + 2 +0-UGrid Part2 OverlapEdges H5Fed + 70 +1 + 62 +-82 +420 +3381504 + 6 +CONTINUOUS +370 +140 +390 +F + 0 +LAYER + 5 +A2 +100 +AcDbSymbolTableRecord +100 +AcDbLayerTableRecord + 2 +0-UGrid Part2 OverlapElems H5Fed + 70 +1 + 62 +-3 +420 +65280 + 6 +CONTINUOUS +370 +0 +390 +F + 0 +LAYER + 5 +A3 +100 +AcDbSymbolTableRecord +100 +AcDbLayerTableRecord + 2 +0-UGrid Part2 OverlapVertices H5Fed + 70 +1 + 62 +-82 +420 +3381504 + 6 +CONTINUOUS +370 +0 +390 +F + 0 +LAYER + 5 +A4 +100 +AcDbSymbolTableRecord +100 +AcDbLayerTableRecord + 2 +1-UGrid 0Part2 BorderEdges H5Fed + 70 +1 + 62 +-150 +420 +3381759 + 6 +CONTINUOUS +370 +140 +390 +F + 0 +LAYER + 5 +A5 +100 +AcDbSymbolTableRecord +100 +AcDbLayerTableRecord + 2 +1-UGrid 0Part2 BorderVertices H5Fed + 70 +1 + 62 +-150 +420 +3381759 + 6 +CONTINUOUS +370 +0 +390 +F + 0 +LAYER + 5 +A6 +100 +AcDbSymbolTableRecord +100 +AcDbLayerTableRecord + 2 +1-UGrid 0Part2 FrontEdges H5Fed + 70 +1 + 62 +-6 +420 +16711935 + 6 +CONTINUOUS +370 +140 +390 +F + 0 +LAYER + 5 +A7 +100 +AcDbSymbolTableRecord +100 +AcDbLayerTableRecord + 2 +1-UGrid 0Part2 FrontVertices H5Fed + 70 +1 + 62 +-6 +420 +16711935 + 6 +CONTINUOUS +370 +0 +390 +F + 0 +LAYER + 5 +A8 +100 +AcDbSymbolTableRecord +100 +AcDbLayerTableRecord + 2 +1-UGrid 0Part2 InteriorEdges H5Fed + 70 +1 + 62 +-1 +420 +16711680 + 6 +CONTINUOUS +370 +140 +390 +F + 0 +LAYER + 5 +A9 +100 +AcDbSymbolTableRecord +100 +AcDbLayerTableRecord + 2 +1-UGrid 0Part2 InteriorVertices H5Fed + 70 +1 + 62 +-1 +420 +16711680 + 6 +CONTINUOUS +370 +0 +390 +F + 0 +LAYER + 5 +AA +100 +AcDbSymbolTableRecord +100 +AcDbLayerTableRecord + 2 +1-UGrid 0Part2 InteriorElems H5Fed + 70 +1 + 62 +-30 +420 +16737843 + 6 +CONTINUOUS +370 +0 +390 +F + 0 +LAYER + 5 +AB +100 +AcDbSymbolTableRecord +100 +AcDbLayerTableRecord + 2 +1-UGrid 0Part2 OverlapEdges H5Fed + 70 +1 + 62 +-82 +420 +3381504 + 6 +CONTINUOUS +370 +140 +390 +F + 0 +LAYER + 5 +AC +100 +AcDbSymbolTableRecord +100 +AcDbLayerTableRecord + 2 +1-UGrid 0Part2 OverlapVertices H5Fed + 70 +1 + 62 +-82 +420 +3381504 + 6 +CONTINUOUS +370 +0 +390 +F + 0 +LAYER + 5 +AD +100 +AcDbSymbolTableRecord +100 +AcDbLayerTableRecord + 2 +1-UGrid 0Part2 OverlapElems H5Fed + 70 +1 + 62 +-3 +420 +65280 + 6 +CONTINUOUS +370 +0 +390 +F + 0 +LAYER + 5 +AE +100 +AcDbSymbolTableRecord +100 +AcDbLayerTableRecord + 2 +1-UGrid 0Part2 GhostElems H5Fed + 70 +1 + 62 +-2 +420 +16776960 + 6 +CONTINUOUS +370 +0 +390 +F + 0 +LAYER + 5 +AF +100 +AcDbSymbolTableRecord +100 +AcDbLayerTableRecord + 2 +1-UGrid 0Part1 GhostElems H5Fed + 70 +1 + 62 +-2 +420 +16776960 + 6 +CONTINUOUS +370 +0 +390 +F + 0 +LAYER + 5 +B0 +100 +AcDbSymbolTableRecord +100 +AcDbLayerTableRecord + 2 +1-UGrid 0Part1 GhostEdges H5Fed + 70 +1 + 62 +-40 +420 +16763955 + 6 +CONTINUOUS +370 +140 +390 +F + 0 +LAYER + 5 +B1 +100 +AcDbSymbolTableRecord +100 +AcDbLayerTableRecord + 2 +1-UGrid 0Part1 GhostVertices H5Fed + 70 +1 + 62 +-40 +420 +16763955 + 6 +CONTINUOUS +370 +0 +390 +F + 0 +LAYER + 5 +B2 +100 +AcDbSymbolTableRecord +100 +AcDbLayerTableRecord + 2 +2-UGrid Triangle Idx + 70 +1 + 62 +-7 +420 +0 + 6 +CONTINUOUS +370 +35 +390 +F + 0 +LAYER + 5 +B3 +100 +AcDbSymbolTableRecord +100 +AcDbLayerTableRecord + 2 +0-UGrid Mark UpAdj Elems + 70 +1 + 62 +-30 +420 +16737843 + 6 +CONTINUOUS +370 +0 +390 +F + 0 +LAYER + 5 +B4 +100 +AcDbSymbolTableRecord +100 +AcDbLayerTableRecord + 2 +0-UGrid Mark DownAdj Edges + 70 +0 + 62 +1 +420 +16711680 + 6 +CONTINUOUS +370 +100 +390 +F + 0 +LAYER + 5 +B5 +100 +AcDbSymbolTableRecord +100 +AcDbLayerTableRecord + 2 +1-UGrid DG Part2 H5Fed BorderVertices + 70 +1 + 62 +-5 +420 +255 + 6 +CONTINUOUS +370 +0 +390 +F + 0 +LAYER + 5 +B6 +100 +AcDbSymbolTableRecord +100 +AcDbLayerTableRecord + 2 +1-UGrid DG Part2 H5Fed BorderEdges + 70 +1 + 62 +-150 +420 +3381759 + 6 +CONTINUOUS +370 +140 +390 +F + 0 +LAYER + 5 +B7 +100 +AcDbSymbolTableRecord +100 +AcDbLayerTableRecord + 2 +1-UGrid DG Part2 H5Fed GhostEdges + 70 +1 + 62 +-40 +420 +13421568 + 6 +CONTINUOUS +370 +140 +390 +F + 0 +LAYER + 5 +B8 +100 +AcDbSymbolTableRecord +100 +AcDbLayerTableRecord + 2 +1-UGrid DG Part2 H5Fed GhostElems + 70 +1 + 62 +-2 +420 +16776960 + 6 +CONTINUOUS +370 +0 +390 +F + 0 +LAYER + 5 +B9 +100 +AcDbSymbolTableRecord +100 +AcDbLayerTableRecord + 2 +1-UGrid DG Part2 H5Fed OverlapVertices + 70 +1 + 62 +-82 +420 +3381504 + 6 +CONTINUOUS +370 +0 +390 +F + 0 +LAYER + 5 +BA +100 +AcDbSymbolTableRecord +100 +AcDbLayerTableRecord + 2 +1-UGrid DG Part2 H5Fed InteriorElems + 70 +1 + 62 +-30 +420 +16737843 + 6 +CONTINUOUS +370 +-3 +390 +F + 0 +LAYER + 5 +BB +100 +AcDbSymbolTableRecord +100 +AcDbLayerTableRecord + 2 +1-UGrid DG Part2 H5Fed InteriorEdges + 70 +1 + 62 +-1 +420 +16711680 + 6 +CONTINUOUS +370 +140 +390 +F + 0 +LAYER + 5 +BC +100 +AcDbSymbolTableRecord +100 +AcDbLayerTableRecord + 2 +1-UGrid DG Part2 H5Fed InteriorVertices + 70 +1 + 62 +-1 +420 +16711680 + 6 +CONTINUOUS +370 +0 +390 +F + 0 +LAYER + 5 +BD +100 +AcDbSymbolTableRecord +100 +AcDbLayerTableRecord + 2 +1-UGrid GlobalIdx Triangles + 70 +0 + 62 +7 +420 +0 + 6 +CONTINUOUS +370 +35 +390 +F + 0 +LAYER + 5 +BE +100 +AcDbSymbolTableRecord +100 +AcDbLayerTableRecord + 2 +1-UGrid Mark DownAdjVertices + 70 +0 + 62 +1 +420 +16711680 + 6 +CONTINUOUS +370 +0 +390 +F + 0 +ENDTAB + 0 +TABLE + 2 +STYLE + 5 +3 +100 +AcDbSymbolTable + 70 +1 + 0 +STYLE + 5 +11 +100 +AcDbSymbolTableRecord +100 +AcDbTextStyleTableRecord + 2 +Standard + 70 +0 + 40 +0.0 + 41 +0.75 + 50 +0.0 + 71 +0 + 42 +2.5 + 3 +txt + 4 + + 0 +ENDTAB + 0 +TABLE + 2 +VIEW + 5 +6 +100 +AcDbSymbolTable + 70 +0 + 0 +ENDTAB + 0 +TABLE + 2 +UCS + 5 +7 +100 +AcDbSymbolTable + 70 +0 + 0 +ENDTAB + 0 +TABLE + 2 +APPID + 5 +9 +100 +AcDbSymbolTable + 70 +1 + 0 +APPID + 5 +12 +100 +AcDbSymbolTableRecord +100 +AcDbRegAppTableRecord + 2 +ACAD + 70 +0 + 0 +ENDTAB + 0 +TABLE + 2 +DIMSTYLE + 5 +A +100 +AcDbSymbolTable + 70 +1 +100 +AcDbDimStyleTable + 71 +0 + 0 +DIMSTYLE +105 +27 +100 +AcDbSymbolTableRecord +100 +AcDbDimStyleTableRecord + 2 +Standard + 41 +2.5 + 42 +0.625 + 43 +3.75 + 44 +1.25 + 70 +0 + 73 +0 + 74 +0 + 77 +1 + 78 +8 +140 +2.5 +141 +2.5 +143 +0.03937007874016 +147 +0.625 +171 +3 +172 +1 +271 +2 +272 +2 +274 +3 +278 +44 +283 +0 +284 +8 +340 +11 + 0 +ENDTAB + 0 +TABLE + 2 +BLOCK_RECORD + 5 +1 +100 +AcDbSymbolTable + 70 +1 + 0 +BLOCK_RECORD + 5 +1F +100 +AcDbSymbolTableRecord +100 +AcDbBlockTableRecord + 2 +*Model_Space +340 +22 + 0 +BLOCK_RECORD + 5 +1B +100 +AcDbSymbolTableRecord +100 +AcDbBlockTableRecord + 2 +*Paper_Space +340 +1E + 0 +BLOCK_RECORD + 5 +23 +100 +AcDbSymbolTableRecord +100 +AcDbBlockTableRecord + 2 +*Paper_Space0 +340 +26 + 0 +BLOCK_RECORD + 5 +BF +100 +AcDbSymbolTableRecord +100 +AcDbBlockTableRecord + 2 +dnode +340 +0 + 0 +ENDTAB + 0 +ENDSEC + 0 +SECTION + 2 +BLOCKS + 0 +BLOCK + 5 +20 +100 +AcDbEntity + 8 +0 +100 +AcDbBlockBegin + 2 +*Model_Space + 70 +0 + 10 +0.0 + 20 +0.0 + 30 +0.0 + 3 +*Model_Space + 1 + + 0 +ENDBLK + 5 +21 +100 +AcDbEntity + 8 +0 +100 +AcDbBlockEnd + 0 +BLOCK + 5 +1C +100 +AcDbEntity + 67 +1 + 8 +0 +100 +AcDbBlockBegin + 2 +*Paper_Space + 70 +0 + 10 +0.0 + 20 +0.0 + 30 +0.0 + 3 +*Paper_Space + 1 + + 0 +ENDBLK + 5 +1D +100 +AcDbEntity + 67 +1 + 8 +0 +100 +AcDbBlockEnd + 0 +BLOCK + 5 +24 +100 +AcDbEntity + 8 +0 +100 +AcDbBlockBegin + 2 +*Paper_Space0 + 70 +0 + 10 +0.0 + 20 +0.0 + 30 +0.0 + 3 +*Paper_Space0 + 1 + + 0 +ENDBLK + 5 +25 +100 +AcDbEntity + 8 +0 +100 +AcDbBlockEnd + 0 +BLOCK + 5 +C0 +100 +AcDbEntity + 8 +0 +100 +AcDbBlockBegin + 2 +dnode + 70 +0 + 10 +0.0 + 20 +0.0 + 30 +0.0 + 3 +dnode + 1 + + 0 +CIRCLE + 5 +C1 +100 +AcDbEntity +100 +AcDbCircle + 8 +1-DGraph + 62 +256 +370 +-1 + 6 +ByLayer + 10 +0.0 + 20 +-7.2874765306784965 + 30 +0.0 + 40 +7.2874765306784965 + 0 +MTEXT + 5 +C2 +100 +AcDbEntity +100 +AcDbMText + 8 +1-UGrid Triangle Idx + 62 +256 +370 +-1 + 6 +ByLayer + 10 +-5.8010481366463864 + 20 +-5.4746489879768205 + 30 +0.0 + 40 +3.0 + 41 +100.0 + 71 +1 + 72 +2 + 1 +D[3] + 7 +greeks + 50 +0.0 + 73 +0 + 44 +1.0 + 0 +ENDBLK + 5 +C3 +100 +AcDbEntity + 8 +0 +100 +AcDbBlockEnd + 0 +ENDSEC + 0 +SECTION + 2 +ENTITIES + 0 +HATCH + 5 +C4 + 8 +0-UGrid Mark Element + 62 +256 +370 +-1 + 6 +ByLayer +100 +AcDbEntity +100 +AcDbHatch + 10 +0.0 + 20 +0.0 + 30 +0.0 +210 +0.0 +220 +0.0 +230 +1.0 + 2 +SOLID + 70 +1 + 71 +0 + 91 +1 + 92 +1 + 93 +4 + 72 +1 + 10 +140.0 + 20 +90.0 + 11 +180.0000175342504178 + 21 +74.9999934246560969 + 72 +1 + 10 +180.0000175342504178 + 20 +74.9999934246560969 + 11 +220.0 + 21 +60.0 + 72 +1 + 10 +220.0 + 20 +60.0 + 11 +200.0 + 21 +120.0 + 72 +1 + 10 +200.0 + 20 +120.0 + 11 +140.0 + 21 +90.0 + 97 +0 + 75 +0 + 76 +1 + 98 +0 + 0 +HATCH + 5 +C5 + 8 +1-UGrid Mark Neighbors + 62 +256 +370 +-1 + 6 +ByLayer +100 +AcDbEntity +100 +AcDbHatch + 10 +0.0 + 20 +0.0 + 30 +0.0 +210 +0.0 +220 +0.0 +230 +1.0 + 2 +SOLID + 70 +1 + 71 +0 + 91 +1 + 92 +1 + 93 +3 + 72 +1 + 10 +159.9999450076830101 + 20 +40.0001374807924535 + 11 +180.0000175342504178 + 21 +74.9999934246560827 + 72 +1 + 10 +180.0000175342504178 + 20 +74.9999934246560969 + 11 +200.0 + 21 +24.9999999999999964 + 72 +1 + 10 +200.0 + 20 +25.0 + 11 +159.9999450076830385 + 21 +40.0001374807924535 + 97 +0 + 75 +0 + 76 +1 + 98 +0 + 0 +HATCH + 5 +C6 + 8 +1-UGrid Mark Neighbors + 62 +256 +370 +-1 + 6 +ByLayer +100 +AcDbEntity +100 +AcDbHatch + 10 +0.0 + 20 +0.0 + 30 +0.0 +210 +0.0 +220 +0.0 +230 +1.0 + 2 +SOLID + 70 +1 + 71 +0 + 91 +1 + 92 +1 + 93 +3 + 72 +1 + 10 +115.0000891911591054 + 20 +40.0001783823182038 + 11 +159.9999450076830101 + 21 +40.0001374807924535 + 72 +1 + 10 +159.9999450076830385 + 20 +40.0001374807924535 + 11 +140.0 + 21 +90.0 + 72 +1 + 10 +140.0 + 20 +90.0 + 11 +115.0000891911591054 + 21 +40.0001783823182038 + 97 +0 + 75 +0 + 76 +1 + 98 +0 + 0 +HATCH + 5 +C7 + 8 +1-UGrid Mark Neighbors + 62 +256 +370 +-1 + 6 +ByLayer +100 +AcDbEntity +100 +AcDbHatch + 10 +0.0 + 20 +0.0 + 30 +0.0 +210 +0.0 +220 +0.0 +230 +1.0 + 2 +SOLID + 70 +1 + 71 +0 + 91 +1 + 92 +1 + 93 +4 + 72 +1 + 10 +140.0 + 20 +90.0 + 11 +200.0 + 21 +120.0 + 72 +1 + 10 +200.0 + 20 +120.0 + 11 +220.0 + 21 +60.0 + 72 +1 + 10 +220.0 + 20 +60.0 + 11 +180.0000175342504178 + 21 +74.9999934246560969 + 72 +1 + 10 +180.0000175342504178 + 20 +74.9999934246560969 + 11 +140.0 + 21 +90.0 + 97 +0 + 75 +0 + 76 +1 + 98 +0 + 0 +HATCH + 5 +C8 + 8 +1-UGrid Mark Element + 62 +256 +370 +-1 + 6 +ByLayer +100 +AcDbEntity +100 +AcDbHatch + 10 +0.0 + 20 +0.0 + 30 +0.0 +210 +0.0 +220 +0.0 +230 +1.0 + 2 +SOLID + 70 +1 + 71 +0 + 91 +1 + 92 +1 + 93 +3 + 72 +1 + 10 +159.9999450076830101 + 20 +40.0001374807924535 + 11 +180.0000175342504178 + 21 +74.9999934246560827 + 72 +1 + 10 +180.0000175342504178 + 20 +74.9999934246560969 + 11 +140.0 + 21 +90.0 + 72 +1 + 10 +140.0 + 20 +90.0 + 11 +159.9999450076830385 + 21 +40.0001374807924535 + 97 +0 + 75 +0 + 76 +1 + 98 +0 + 0 +HATCH + 5 +C9 + 8 +0-UGrid Mark Neighbors + 62 +256 +370 +-1 + 6 +ByLayer +100 +AcDbEntity +100 +AcDbHatch + 10 +0.0 + 20 +0.0 + 30 +0.0 +210 +0.0 +220 +0.0 +230 +1.0 + 2 +SOLID + 70 +1 + 71 +0 + 91 +1 + 92 +1 + 93 +3 + 72 +1 + 10 +140.0 + 20 +90.0 + 11 +90.0 + 21 +-10.0 + 72 +1 + 10 +90.0 + 20 +-10.0 + 11 +180.0 + 21 +-10.0 + 72 +1 + 10 +180.0 + 20 +-10.0 + 11 +140.0 + 21 +90.0 + 97 +0 + 75 +0 + 76 +1 + 98 +0 + 0 +HATCH + 5 +CA + 8 +0-UGrid Mark Neighbors + 62 +256 +370 +-1 + 6 +ByLayer +100 +AcDbEntity +100 +AcDbHatch + 10 +0.0 + 20 +0.0 + 30 +0.0 +210 +0.0 +220 +0.0 +230 +1.0 + 2 +SOLID + 70 +1 + 71 +0 + 91 +1 + 92 +1 + 93 +3 + 72 +1 + 10 +220.0 + 20 +60.0 + 11 +180.0 + 21 +-10.0 + 72 +1 + 10 +180.0 + 20 +-10.0 + 11 +240.0 + 21 +-60.0 + 72 +1 + 10 +240.0 + 20 +-60.0 + 11 +220.0 + 21 +60.0 + 97 +0 + 75 +0 + 76 +1 + 98 +0 + 0 +HATCH + 5 +CB + 8 +0-UGrid Mark Neighbors + 62 +256 +370 +-1 + 6 +ByLayer +100 +AcDbEntity +100 +AcDbHatch + 10 +0.0 + 20 +0.0 + 30 +0.0 +210 +0.0 +220 +0.0 +230 +1.0 + 2 +SOLID + 70 +1 + 71 +0 + 91 +1 + 92 +1 + 93 +3 + 72 +1 + 10 +140.0 + 20 +90.0 + 11 +220.0 + 21 +60.0 + 72 +1 + 10 +220.0 + 20 +60.0 + 11 +200.0 + 21 +120.0 + 72 +1 + 10 +200.0 + 20 +120.0 + 11 +140.0 + 21 +90.0 + 97 +0 + 75 +0 + 76 +1 + 98 +0 + 0 +HATCH + 5 +CC + 8 +1-UGrid DG Part2 H5Fed InteriorElems + 62 +256 +370 +-1 + 6 +ByLayer +100 +AcDbEntity +100 +AcDbHatch + 10 +0.0 + 20 +0.0 + 30 +0.0 +210 +0.0 +220 +0.0 +230 +1.0 + 2 +SOLID + 70 +1 + 71 +0 + 91 +1 + 92 +1 + 93 +9 + 72 +1 + 10 +140.0 + 20 +90.0 + 11 +115.0000891911591054 + 21 +40.0001783823182038 + 72 +1 + 10 +115.0000891911591054 + 20 +40.0001783823182038 + 11 +135.0 + 21 +-10.0 + 72 +1 + 10 +135.0 + 20 +-10.0 + 11 +159.9997155749006481 + 21 +-40.0004266376490492 + 72 +1 + 10 +159.9997155749006197 + 20 +-40.0004266376490492 + 11 +140.0 + 21 +-70.0 + 72 +1 + 10 +140.0 + 20 +-70.0 + 11 +240.0 + 21 +-60.0 + 72 +1 + 10 +240.0 + 20 +-60.0 + 11 +220.0 + 21 +60.0 + 72 +1 + 10 +220.0 + 20 +60.0 + 11 +200.0 + 21 +120.0 + 72 +1 + 10 +200.0 + 20 +120.0 + 11 +130.0 + 21 +150.0 + 72 +1 + 10 +130.0 + 20 +150.0 + 11 +140.0 + 21 +90.0 + 97 +0 + 75 +0 + 76 +1 + 98 +0 + 0 +HATCH + 5 +CD + 8 +1-UGrid DG Part2 H5Fed GhostElems + 62 +256 +370 +-1 + 6 +ByLayer +100 +AcDbEntity +100 +AcDbHatch + 10 +0.0 + 20 +0.0 + 30 +0.0 +210 +0.0 +220 +0.0 +230 +1.0 + 2 +SOLID + 70 +1 + 71 +0 + 91 +1 + 92 +1 + 93 +3 + 72 +1 + 10 +70.0 + 20 +35.0 + 11 +95.0 + 21 +85.0 + 72 +1 + 10 +95.0 + 20 +85.0 + 11 +50.0 + 21 +80.0 + 72 +1 + 10 +50.0 + 20 +80.0 + 11 +70.0 + 21 +35.0 + 97 +0 + 75 +0 + 76 +1 + 98 +0 + 0 +HATCH + 5 +CE + 8 +1-UGrid DG Part2 H5Fed OverlapElems + 62 +256 +370 +-1 + 6 +ByLayer +100 +AcDbEntity +100 +AcDbHatch + 10 +0.0 + 20 +0.0 + 30 +0.0 +210 +0.0 +220 +0.0 +230 +1.0 + 2 +SOLID + 70 +1 + 71 +0 + 91 +1 + 92 +1 + 93 +3 + 72 +1 + 10 +95.0 + 20 +85.0 + 11 +115.0000891911591054 + 21 +40.0001783823182038 + 72 +1 + 10 +115.0000891911591054 + 20 +40.0001783823182038 + 11 +140.0 + 21 +90.0 + 72 +1 + 10 +140.0 + 20 +90.0 + 11 +95.0 + 21 +85.0 + 97 +0 + 75 +0 + 76 +1 + 98 +0 + 0 +HATCH + 5 +CF + 8 +1-UGrid DG Part2 H5Fed OverlapElems + 62 +256 +370 +-1 + 6 +ByLayer +100 +AcDbEntity +100 +AcDbHatch + 10 +0.0 + 20 +0.0 + 30 +0.0 +210 +0.0 +220 +0.0 +230 +1.0 + 2 +SOLID + 70 +1 + 71 +0 + 91 +1 + 92 +1 + 93 +4 + 72 +1 + 10 +95.0 + 20 +85.0 + 11 +140.0 + 21 +90.0 + 72 +1 + 10 +140.0 + 20 +90.0 + 11 +130.0 + 21 +150.0 + 72 +1 + 10 +130.0 + 20 +150.0 + 11 +50.0 + 21 +80.0 + 72 +1 + 10 +50.0 + 20 +80.0 + 11 +95.0 + 21 +85.0 + 97 +0 + 75 +0 + 76 +1 + 98 +0 + 0 +HATCH + 5 +D0 + 8 +1-UGrid DG Part2 H5Fed OverlapElems + 62 +256 +370 +-1 + 6 +ByLayer +100 +AcDbEntity +100 +AcDbHatch + 10 +0.0 + 20 +0.0 + 30 +0.0 +210 +0.0 +220 +0.0 +230 +1.0 + 2 +SOLID + 70 +1 + 71 +0 + 91 +1 + 92 +1 + 93 +3 + 72 +1 + 10 +115.0000891911591054 + 20 +40.0001783823182038 + 11 +90.0 + 21 +-10.0 + 72 +1 + 10 +90.0 + 20 +-10.0 + 11 +135.0 + 21 +-10.0 + 72 +1 + 10 +135.0 + 20 +-10.0 + 11 +115.0000891911591054 + 21 +40.0001783823182038 + 97 +0 + 75 +0 + 76 +1 + 98 +0 + 0 +HATCH + 5 +D1 + 8 +1-UGrid DG Part2 H5Fed OverlapElems + 62 +256 +370 +-1 + 6 +ByLayer +100 +AcDbEntity +100 +AcDbHatch + 10 +0.0 + 20 +0.0 + 30 +0.0 +210 +0.0 +220 +0.0 +230 +1.0 + 2 +SOLID + 70 +1 + 71 +0 + 91 +1 + 92 +1 + 93 +4 + 72 +1 + 10 +140.0 + 20 +-70.0 + 11 +114.9999989626024757 + 21 +-39.9999987551229736 + 72 +1 + 10 +114.9999989626024757 + 20 +-39.9999987551229665 + 11 +134.9999999999999716 + 21 +-10.0000000000000355 + 72 +1 + 10 +135.0 + 20 +-10.0 + 11 +159.9997155749006481 + 21 +-40.0004266376490492 + 72 +1 + 10 +159.9997155749006197 + 20 +-40.0004266376490492 + 11 +140.0 + 21 +-70.0 + 97 +0 + 75 +0 + 76 +1 + 98 +0 + 0 +HATCH + 5 +D2 + 8 +0-UGrid Mark UpAdj Elems + 62 +256 +370 +-1 + 6 +ByLayer +100 +AcDbEntity +100 +AcDbHatch + 10 +0.0 + 20 +0.0 + 30 +0.0 +210 +0.0 +220 +0.0 +230 +1.0 + 2 +SOLID + 70 +1 + 71 +0 + 91 +1 + 92 +1 + 93 +6 + 72 +1 + 10 +50.0 + 20 +80.0 + 11 +90.0 + 21 +-10.0 + 72 +1 + 10 +90.0 + 20 +-10.0 + 11 +180.0 + 21 +-10.0 + 72 +1 + 10 +180.0 + 20 +-10.0 + 11 +220.0 + 21 +60.0 + 72 +1 + 10 +220.0 + 20 +60.0 + 11 +200.0 + 21 +120.0 + 72 +1 + 10 +200.0 + 20 +120.0 + 11 +130.0 + 21 +150.0 + 72 +1 + 10 +130.0 + 20 +150.0 + 11 +50.0 + 21 +80.0 + 97 +0 + 75 +0 + 76 +1 + 98 +0 + 0 +HATCH + 5 +D3 + 8 +1-UGrid 0Part1 GhostElems H5Fed + 62 +256 +370 +-1 + 6 +ByLayer +100 +AcDbEntity +100 +AcDbHatch + 10 +0.0 + 20 +0.0 + 30 +0.0 +210 +0.0 +220 +0.0 +230 +1.0 + 2 +SOLID + 70 +1 + 71 +0 + 91 +1 + 92 +1 + 93 +7 + 72 +1 + 10 +159.9999450076830385 + 20 +40.0001374807924535 + 11 +200.0 + 21 +25.0 + 72 +1 + 10 +200.0 + 20 +24.9999999999999964 + 11 +180.0 + 21 +-10.0 + 72 +1 + 10 +180.0 + 20 +-10.0 + 11 +159.9997155749006197 + 21 +-40.0004266376490492 + 72 +1 + 10 +159.9997155749006197 + 20 +-40.0004266376490492 + 11 +140.0 + 21 +-70.0 + 72 +1 + 10 +140.0 + 20 +-70.0 + 11 +114.9999989626024757 + 21 +-39.9999987551229665 + 72 +1 + 10 +114.9999989626024757 + 20 +-39.9999987551229665 + 11 +135.0 + 21 +-10.0 + 72 +1 + 10 +135.0 + 20 +-10.0 + 11 +159.9999450076830101 + 21 +40.0001374807924535 + 97 +0 + 75 +0 + 76 +1 + 98 +0 + 0 +HATCH + 5 +D4 + 8 +1-UGrid 0Part2 GhostElems H5Fed + 62 +256 +370 +-1 + 6 +ByLayer +100 +AcDbEntity +100 +AcDbHatch + 10 +0.0 + 20 +0.0 + 30 +0.0 +210 +0.0 +220 +0.0 +230 +1.0 + 2 +SOLID + 70 +1 + 71 +0 + 91 +1 + 92 +1 + 93 +3 + 72 +1 + 10 +70.0 + 20 +35.0 + 11 +95.0 + 21 +85.0 + 72 +1 + 10 +95.0 + 20 +85.0 + 11 +50.0 + 21 +80.0 + 72 +1 + 10 +50.0 + 20 +80.0 + 11 +70.0 + 21 +35.0 + 97 +0 + 75 +0 + 76 +1 + 98 +0 + 0 +HATCH + 5 +D5 + 8 +1-UGrid 0Part2 OverlapElems H5Fed + 62 +256 +370 +-1 + 6 +ByLayer +100 +AcDbEntity +100 +AcDbHatch + 10 +0.0 + 20 +0.0 + 30 +0.0 +210 +0.0 +220 +0.0 +230 +1.0 + 2 +SOLID + 70 +1 + 71 +0 + 91 +1 + 92 +1 + 93 +5 + 72 +1 + 10 +140.0 + 20 +90.0 + 11 +180.0000175342504178 + 21 +74.9999934246560969 + 72 +1 + 10 +180.0000175342504178 + 20 +74.9999934246560969 + 11 +220.0 + 21 +60.0 + 72 +1 + 10 +220.0 + 20 +60.0 + 11 +200.0 + 21 +120.0 + 72 +1 + 10 +200.0 + 20 +120.0 + 11 +130.0 + 21 +150.0 + 72 +1 + 10 +130.0 + 20 +150.0 + 11 +140.0 + 21 +90.0 + 97 +0 + 75 +0 + 76 +1 + 98 +0 + 0 +HATCH + 5 +D6 + 8 +1-UGrid 0Part2 OverlapElems H5Fed + 62 +256 +370 +-1 + 6 +ByLayer +100 +AcDbEntity +100 +AcDbHatch + 10 +0.0 + 20 +0.0 + 30 +0.0 +210 +0.0 +220 +0.0 +230 +1.0 + 2 +SOLID + 70 +1 + 71 +0 + 91 +1 + 92 +1 + 93 +4 + 72 +1 + 10 +95.0 + 20 +85.0 + 11 +140.0 + 21 +90.0 + 72 +1 + 10 +140.0 + 20 +90.0 + 11 +130.0 + 21 +150.0 + 72 +1 + 10 +130.0 + 20 +150.0 + 11 +50.0 + 21 +80.0 + 72 +1 + 10 +50.0 + 20 +80.0 + 11 +95.0 + 21 +85.0 + 97 +0 + 75 +0 + 76 +1 + 98 +0 + 0 +HATCH + 5 +D7 + 8 +1-UGrid 0Part2 OverlapElems H5Fed + 62 +256 +370 +-1 + 6 +ByLayer +100 +AcDbEntity +100 +AcDbHatch + 10 +0.0 + 20 +0.0 + 30 +0.0 +210 +0.0 +220 +0.0 +230 +1.0 + 2 +SOLID + 70 +1 + 71 +0 + 91 +1 + 92 +1 + 93 +3 + 72 +1 + 10 +95.0 + 20 +85.0 + 11 +115.0000891911591054 + 21 +40.0001783823182038 + 72 +1 + 10 +115.0000891911591054 + 20 +40.0001783823182038 + 11 +140.0 + 21 +90.0 + 72 +1 + 10 +140.0 + 20 +90.0 + 11 +95.0 + 21 +85.0 + 97 +0 + 75 +0 + 76 +1 + 98 +0 + 0 +HATCH + 5 +D8 + 8 +1-UGrid 0Part2 OverlapElems H5Fed + 62 +256 +370 +-1 + 6 +ByLayer +100 +AcDbEntity +100 +AcDbHatch + 10 +0.0 + 20 +0.0 + 30 +0.0 +210 +0.0 +220 +0.0 +230 +1.0 + 2 +SOLID + 70 +1 + 71 +0 + 91 +1 + 92 +1 + 93 +3 + 72 +1 + 10 +70.0 + 20 +35.0 + 11 +115.0000891911591054 + 21 +40.0001783823182038 + 72 +1 + 10 +115.0000891911591054 + 20 +40.0001783823182038 + 11 +95.0 + 21 +85.0 + 72 +1 + 10 +95.0 + 20 +85.0 + 11 +70.0 + 21 +35.0 + 97 +0 + 75 +0 + 76 +1 + 98 +0 + 0 +HATCH + 5 +D9 + 8 +1-UGrid 0Part2 OverlapElems H5Fed + 62 +256 +370 +-1 + 6 +ByLayer +100 +AcDbEntity +100 +AcDbHatch + 10 +0.0 + 20 +0.0 + 30 +0.0 +210 +0.0 +220 +0.0 +230 +1.0 + 2 +SOLID + 70 +1 + 71 +0 + 91 +1 + 92 +1 + 93 +3 + 72 +1 + 10 +70.0 + 20 +35.0 + 11 +115.0000891911591054 + 21 +40.0001783823182038 + 72 +1 + 10 +115.0000891911591054 + 20 +40.0001783823182038 + 11 +90.0 + 21 +-10.0 + 72 +1 + 10 +90.0 + 20 +-10.0 + 11 +70.0 + 21 +35.0 + 97 +0 + 75 +0 + 76 +1 + 98 +0 + 0 +HATCH + 5 +DA + 8 +1-UGrid 0Part2 OverlapElems H5Fed + 62 +256 +370 +-1 + 6 +ByLayer +100 +AcDbEntity +100 +AcDbHatch + 10 +0.0 + 20 +0.0 + 30 +0.0 +210 +0.0 +220 +0.0 +230 +1.0 + 2 +SOLID + 70 +1 + 71 +0 + 91 +1 + 92 +1 + 93 +4 + 72 +1 + 10 +70.0 + 20 +35.0 + 11 +90.0 + 21 +-10.0 + 72 +1 + 10 +90.0 + 20 +-10.0 + 11 +0.0 + 21 +0.0 + 72 +1 + 10 +0.0 + 20 +0.0 + 11 +50.0 + 21 +80.0 + 72 +1 + 10 +50.0 + 20 +80.0 + 11 +70.0 + 21 +35.0 + 97 +0 + 75 +0 + 76 +1 + 98 +0 + 0 +HATCH + 5 +DB + 8 +1-UGrid 0Part2 OverlapElems H5Fed + 62 +256 +370 +-1 + 6 +ByLayer +100 +AcDbEntity +100 +AcDbHatch + 10 +0.0 + 20 +0.0 + 30 +0.0 +210 +0.0 +220 +0.0 +230 +1.0 + 2 +SOLID + 70 +1 + 71 +0 + 91 +1 + 92 +1 + 93 +3 + 72 +1 + 10 +0.0 + 20 +0.0 + 11 +60.0 + 21 +-70.0 + 72 +1 + 10 +60.0 + 20 +-70.0 + 11 +90.0 + 21 +-10.0 + 72 +1 + 10 +90.0 + 20 +-10.0 + 11 +0.0 + 21 +0.0 + 97 +0 + 75 +0 + 76 +1 + 98 +0 + 0 +HATCH + 5 +DC + 8 +1-UGrid 0Part2 InteriorElems H5Fed + 62 +256 +370 +-1 + 6 +ByLayer +100 +AcDbEntity +100 +AcDbHatch + 10 +0.0 + 20 +0.0 + 30 +0.0 +210 +0.0 +220 +0.0 +230 +1.0 + 2 +SOLID + 70 +1 + 71 +0 + 91 +1 + 92 +1 + 93 +8 + 72 +1 + 10 +115.0000891911591054 + 20 +40.0001783823182038 + 11 +90.0 + 21 +-10.0 + 72 +1 + 10 +90.0 + 20 +-10.0 + 11 +60.0 + 21 +-70.0 + 72 +1 + 10 +60.0 + 20 +-70.0 + 11 +140.0 + 21 +-70.0 + 72 +1 + 10 +140.0 + 20 +-70.0 + 11 +240.0 + 21 +-60.0 + 72 +1 + 10 +240.0 + 20 +-60.0 + 11 +220.0 + 21 +60.0 + 72 +1 + 10 +220.0 + 20 +60.0 + 11 +180.0000175342504178 + 21 +74.9999934246560969 + 72 +1 + 10 +180.0000175342504178 + 20 +74.9999934246560969 + 11 +140.0 + 21 +90.0 + 72 +1 + 10 +140.0 + 20 +90.0 + 11 +115.0000891911591054 + 21 +40.0001783823182038 + 97 +0 + 75 +0 + 76 +1 + 98 +0 + 0 +HATCH + 5 +DD + 8 +0-UGrid Part2 OverlapElems H5Fed + 62 +256 +370 +-1 + 6 +ByLayer +100 +AcDbEntity +100 +AcDbHatch + 10 +0.0 + 20 +0.0 + 30 +0.0 +210 +0.0 +220 +0.0 +230 +1.0 + 2 +SOLID + 70 +1 + 71 +0 + 91 +1 + 92 +1 + 93 +8 + 72 +1 + 10 +0.0 + 20 +0.0 + 11 +50.0 + 21 +80.0 + 72 +1 + 10 +50.0 + 20 +80.0 + 11 +130.0 + 21 +150.0 + 72 +1 + 10 +130.0 + 20 +150.0 + 11 +200.0 + 21 +120.0 + 72 +1 + 10 +200.0 + 20 +120.0 + 11 +220.0 + 21 +60.0 + 72 +1 + 10 +220.0 + 20 +60.0 + 11 +140.0 + 21 +90.0 + 72 +1 + 10 +140.0 + 20 +90.0 + 11 +90.0 + 21 +-10.0 + 72 +1 + 10 +90.0 + 20 +-10.0 + 11 +60.0 + 21 +-70.0 + 72 +1 + 10 +60.0 + 20 +-70.0 + 11 +0.0 + 21 +0.0 + 97 +0 + 75 +0 + 76 +1 + 98 +0 + 0 +HATCH + 5 +DE + 8 +0-UGrid Part2 InteriorElems H5Fed + 62 +256 +370 +-1 + 6 +ByLayer +100 +AcDbEntity +100 +AcDbHatch + 10 +0.0 + 20 +0.0 + 30 +0.0 +210 +0.0 +220 +0.0 +230 +1.0 + 2 +SOLID + 70 +1 + 71 +0 + 91 +1 + 92 +1 + 93 +6 + 72 +1 + 10 +90.0 + 20 +-10.0 + 11 +60.0 + 21 +-70.0 + 72 +1 + 10 +60.0 + 20 +-70.0 + 11 +140.0 + 21 +-70.0 + 72 +1 + 10 +140.0 + 20 +-70.0 + 11 +240.0 + 21 +-60.0 + 72 +1 + 10 +240.0 + 20 +-60.0 + 11 +220.0 + 21 +60.0 + 72 +1 + 10 +220.0 + 20 +60.0 + 11 +140.0 + 21 +90.0 + 72 +1 + 10 +140.0 + 20 +90.0 + 11 +90.0 + 21 +-10.0 + 97 +0 + 75 +0 + 76 +1 + 98 +0 + 0 +HATCH + 5 +DF + 8 +0-UGrid Part1 OverlapElems H5Fed + 62 +256 +370 +-1 + 6 +ByLayer +100 +AcDbEntity +100 +AcDbHatch + 10 +0.0 + 20 +0.0 + 30 +0.0 +210 +0.0 +220 +0.0 +230 +1.0 + 2 +SOLID + 70 +1 + 71 +0 + 91 +1 + 92 +1 + 93 +7 + 72 +1 + 10 +180.0 + 20 +-10.0 + 11 +140.0 + 21 +-70.0 + 72 +1 + 10 +140.0 + 20 +-70.0 + 11 +60.0 + 21 +-70.0 + 72 +1 + 10 +60.0 + 20 +-70.0 + 11 +90.0 + 21 +-10.0 + 72 +1 + 10 +90.0 + 20 +-10.0 + 11 +140.0 + 21 +90.0 + 72 +1 + 10 +140.0 + 20 +90.0 + 11 +220.0 + 21 +60.0 + 72 +1 + 10 +220.0 + 20 +60.0 + 11 +240.0 + 21 +-60.0 + 72 +1 + 10 +240.0 + 20 +-60.0 + 11 +180.0 + 21 +-10.0 + 97 +0 + 75 +0 + 76 +1 + 98 +0 + 0 +HATCH + 5 +E0 + 8 +0-UGrid Part1 InteriorElems H5Fed + 62 +256 +370 +-1 + 6 +ByLayer +100 +AcDbEntity +100 +AcDbHatch + 10 +0.0 + 20 +0.0 + 30 +0.0 +210 +0.0 +220 +0.0 +230 +1.0 + 2 +SOLID + 70 +1 + 71 +0 + 91 +1 + 92 +1 + 93 +8 + 72 +1 + 10 +0.0 + 20 +0.0 + 11 +50.0 + 21 +80.0 + 72 +1 + 10 +50.0 + 20 +80.0 + 11 +130.0 + 21 +150.0 + 72 +1 + 10 +130.0 + 20 +150.0 + 11 +200.0 + 21 +120.0 + 72 +1 + 10 +200.0 + 20 +120.0 + 11 +220.0 + 21 +60.0 + 72 +1 + 10 +220.0 + 20 +60.0 + 11 +140.0 + 21 +90.0 + 72 +1 + 10 +140.0 + 20 +90.0 + 11 +90.0 + 21 +-10.0 + 72 +1 + 10 +90.0 + 20 +-10.0 + 11 +60.0 + 21 +-70.0 + 72 +1 + 10 +60.0 + 20 +-70.0 + 11 +0.0 + 21 +0.0 + 97 +0 + 75 +0 + 76 +1 + 98 +0 + 0 +LINE + 5 +E1 +100 +AcDbEntity +100 +AcDbLine + 8 +1-UGrid + 62 +256 +370 +-1 + 6 +ByLayer + 10 +0.0 + 20 +0.0 + 30 +0.0 + 11 +60.0 + 21 +-70.0 + 31 +0.0 + 0 +HATCH + 5 +E2 + 8 +1-UGrid 0Part1 InteriorElems H5Fed + 62 +256 +370 +-1 + 6 +ByLayer +100 +AcDbEntity +100 +AcDbHatch + 10 +0.0 + 20 +0.0 + 30 +0.0 +210 +0.0 +220 +0.0 +230 +1.0 + 2 +SOLID + 70 +1 + 71 +0 + 91 +1 + 92 +1 + 93 +10 + 72 +1 + 10 +115.0000891911591054 + 20 +40.0001783823182038 + 11 +90.0 + 21 +-10.0 + 72 +1 + 10 +90.0 + 20 +-10.0 + 11 +60.0 + 21 +-70.0 + 72 +1 + 10 +60.0 + 20 +-70.0 + 11 +0.0 + 21 +0.0 + 72 +1 + 10 +0.0 + 20 +0.0 + 11 +50.0 + 21 +80.0 + 72 +1 + 10 +50.0 + 20 +80.0 + 11 +130.0 + 21 +150.0 + 72 +1 + 10 +130.0 + 20 +150.0 + 11 +200.0 + 21 +120.0 + 72 +1 + 10 +200.0 + 20 +120.0 + 11 +220.0 + 21 +60.0 + 72 +1 + 10 +220.0 + 20 +60.0 + 11 +180.0000175342504178 + 21 +74.9999934246560969 + 72 +1 + 10 +180.0000175342504178 + 20 +74.9999934246560969 + 11 +140.0 + 21 +90.0 + 72 +1 + 10 +140.0 + 20 +90.0 + 11 +115.0000891911591054 + 21 +40.0001783823182038 + 97 +0 + 75 +0 + 76 +1 + 98 +0 + 0 +HATCH + 5 +E3 + 8 +1-UGrid 0Part1 OverlapElems H5Fed + 62 +256 +370 +-1 + 6 +ByLayer +100 +AcDbEntity +100 +AcDbHatch + 10 +0.0 + 20 +0.0 + 30 +0.0 +210 +0.0 +220 +0.0 +230 +1.0 + 2 +SOLID + 70 +1 + 71 +0 + 91 +1 + 92 +1 + 93 +4 + 72 +1 + 10 +200.0 + 20 +25.0 + 11 +180.0 + 21 +-10.0 + 72 +1 + 10 +180.0 + 20 +-10.0 + 11 +240.0 + 21 +-60.0 + 72 +1 + 10 +240.0 + 20 +-60.0 + 11 +220.0 + 21 +60.0 + 72 +1 + 10 +220.0 + 20 +60.0 + 11 +200.0 + 21 +25.0 + 97 +0 + 75 +0 + 76 +1 + 98 +0 + 0 +HATCH + 5 +E4 + 8 +1-UGrid 0Part1 OverlapElems H5Fed + 62 +256 +370 +-1 + 6 +ByLayer +100 +AcDbEntity +100 +AcDbHatch + 10 +0.0 + 20 +0.0 + 30 +0.0 +210 +0.0 +220 +0.0 +230 +1.0 + 2 +SOLID + 70 +1 + 71 +0 + 91 +1 + 92 +1 + 93 +3 + 72 +1 + 10 +200.0 + 20 +24.9999999999999964 + 11 +180.0000175342504178 + 21 +74.9999934246560969 + 72 +1 + 10 +180.0000175342504178 + 20 +74.9999934246560969 + 11 +220.0 + 21 +60.0 + 72 +1 + 10 +220.0 + 20 +60.0 + 11 +200.0 + 21 +25.0 + 97 +0 + 75 +0 + 76 +1 + 98 +0 + 0 +HATCH + 5 +E5 + 8 +1-UGrid 0Part1 OverlapElems H5Fed + 62 +256 +370 +-1 + 6 +ByLayer +100 +AcDbEntity +100 +AcDbHatch + 10 +0.0 + 20 +0.0 + 30 +0.0 +210 +0.0 +220 +0.0 +230 +1.0 + 2 +SOLID + 70 +1 + 71 +0 + 91 +1 + 92 +1 + 93 +3 + 72 +1 + 10 +200.0 + 20 +24.9999999999999964 + 11 +180.0000175342504178 + 21 +74.9999934246560969 + 72 +1 + 10 +180.0000175342504178 + 20 +74.9999934246560827 + 11 +159.9999450076830101 + 21 +40.0001374807924535 + 72 +1 + 10 +159.9999450076830385 + 20 +40.0001374807924535 + 11 +200.0 + 21 +25.0 + 97 +0 + 75 +0 + 76 +1 + 98 +0 + 0 +HATCH + 5 +E6 + 8 +1-UGrid 0Part1 OverlapElems H5Fed + 62 +256 +370 +-1 + 6 +ByLayer +100 +AcDbEntity +100 +AcDbHatch + 10 +0.0 + 20 +0.0 + 30 +0.0 +210 +0.0 +220 +0.0 +230 +1.0 + 2 +SOLID + 70 +1 + 71 +0 + 91 +1 + 92 +1 + 93 +3 + 72 +1 + 10 +140.0 + 20 +90.0 + 11 +180.0000175342504178 + 21 +74.9999934246560969 + 72 +1 + 10 +180.0000175342504178 + 20 +74.9999934246560827 + 11 +159.9999450076830101 + 21 +40.0001374807924535 + 72 +1 + 10 +159.9999450076830385 + 20 +40.0001374807924535 + 11 +140.0 + 21 +90.0 + 97 +0 + 75 +0 + 76 +1 + 98 +0 + 0 +HATCH + 5 +E7 + 8 +1-UGrid 0Part1 OverlapElems H5Fed + 62 +256 +370 +-1 + 6 +ByLayer +100 +AcDbEntity +100 +AcDbHatch + 10 +0.0 + 20 +0.0 + 30 +0.0 +210 +0.0 +220 +0.0 +230 +1.0 + 2 +SOLID + 70 +1 + 71 +0 + 91 +1 + 92 +1 + 93 +3 + 72 +1 + 10 +140.0 + 20 +90.0 + 11 +115.0000891911591054 + 21 +40.0001783823182038 + 72 +1 + 10 +115.0000891911591054 + 20 +40.0001783823182038 + 11 +159.9999450076830101 + 21 +40.0001374807924535 + 72 +1 + 10 +159.9999450076830385 + 20 +40.0001374807924535 + 11 +140.0 + 21 +90.0 + 97 +0 + 75 +0 + 76 +1 + 98 +0 + 0 +HATCH + 5 +E8 + 8 +1-UGrid 0Part1 OverlapElems H5Fed + 62 +256 +370 +-1 + 6 +ByLayer +100 +AcDbEntity +100 +AcDbHatch + 10 +0.0 + 20 +0.0 + 30 +0.0 +210 +0.0 +220 +0.0 +230 +1.0 + 2 +SOLID + 70 +1 + 71 +0 + 91 +1 + 92 +1 + 93 +3 + 72 +1 + 10 +159.9999450076830101 + 20 +40.0001374807924535 + 11 +135.0 + 21 +-10.0 + 72 +1 + 10 +135.0 + 20 +-10.0 + 11 +115.0000891911591054 + 21 +40.0001783823182038 + 72 +1 + 10 +115.0000891911591054 + 20 +40.0001783823182038 + 11 +159.9999450076830101 + 21 +40.0001374807924535 + 97 +0 + 75 +0 + 76 +1 + 98 +0 + 0 +HATCH + 5 +E9 + 8 +1-UGrid 0Part1 OverlapElems H5Fed + 62 +256 +370 +-1 + 6 +ByLayer +100 +AcDbEntity +100 +AcDbHatch + 10 +0.0 + 20 +0.0 + 30 +0.0 +210 +0.0 +220 +0.0 +230 +1.0 + 2 +SOLID + 70 +1 + 71 +0 + 91 +1 + 92 +1 + 93 +3 + 72 +1 + 10 +115.0000891911591054 + 20 +40.0001783823182038 + 11 +90.0 + 21 +-10.0 + 72 +1 + 10 +90.0 + 20 +-10.0 + 11 +135.0 + 21 +-10.0 + 72 +1 + 10 +135.0 + 20 +-10.0 + 11 +115.0000891911591054 + 21 +40.0001783823182038 + 97 +0 + 75 +0 + 76 +1 + 98 +0 + 0 +HATCH + 5 +EA + 8 +1-UGrid 0Part1 OverlapElems H5Fed + 62 +256 +370 +-1 + 6 +ByLayer +100 +AcDbEntity +100 +AcDbHatch + 10 +0.0 + 20 +0.0 + 30 +0.0 +210 +0.0 +220 +0.0 +230 +1.0 + 2 +SOLID + 70 +1 + 71 +0 + 91 +1 + 92 +1 + 93 +3 + 72 +1 + 10 +114.9999989626024757 + 20 +-39.9999987551229736 + 11 +90.0 + 21 +-10.0 + 72 +1 + 10 +90.0 + 20 +-10.0 + 11 +135.0 + 21 +-10.0 + 72 +1 + 10 +135.0 + 20 +-10.0 + 11 +114.9999989626024757 + 21 +-39.9999987551229665 + 97 +0 + 75 +0 + 76 +1 + 98 +0 + 0 +HATCH + 5 +EB + 8 +1-UGrid 0Part1 OverlapElems H5Fed + 62 +256 +370 +-1 + 6 +ByLayer +100 +AcDbEntity +100 +AcDbHatch + 10 +0.0 + 20 +0.0 + 30 +0.0 +210 +0.0 +220 +0.0 +230 +1.0 + 2 +SOLID + 70 +1 + 71 +0 + 91 +1 + 92 +1 + 93 +4 + 72 +1 + 10 +114.9999989626024757 + 20 +-39.9999987551229736 + 11 +90.0 + 21 +-10.0 + 72 +1 + 10 +90.0 + 20 +-10.0 + 11 +60.0 + 21 +-70.0 + 72 +1 + 10 +60.0 + 20 +-70.0 + 11 +140.0 + 21 +-70.0 + 72 +1 + 10 +140.0 + 20 +-70.0 + 11 +114.9999989626024757 + 21 +-39.9999987551229736 + 97 +0 + 75 +0 + 76 +1 + 98 +0 + 0 +LINE + 5 +EC +100 +AcDbEntity +100 +AcDbLine + 8 +1-UGrid + 62 +256 +370 +-1 + 6 +ByLayer + 10 +140.0 + 20 +90.0 + 30 +0.0 + 11 +115.0000891911591054 + 21 +40.0001783823182038 + 31 +0.0 + 0 +HATCH + 5 +ED + 8 +1-UGrid DG Part2 H5Fed OverlapElems + 62 +256 +370 +-1 + 6 +ByLayer +100 +AcDbEntity +100 +AcDbHatch + 10 +0.0 + 20 +0.0 + 30 +0.0 +210 +0.0 +220 +0.0 +230 +1.0 + 2 +SOLID + 70 +1 + 71 +0 + 91 +1 + 92 +1 + 93 +4 + 72 +1 + 10 +114.9999989626024757 + 20 +-39.9999987551229736 + 11 +90.0 + 21 +-10.0 + 72 +1 + 10 +90.0 + 20 +-10.0 + 11 +60.0 + 21 +-70.0 + 72 +1 + 10 +60.0 + 20 +-70.0 + 11 +140.0 + 21 +-70.0 + 72 +1 + 10 +140.0 + 20 +-70.0 + 11 +114.9999989626024757 + 21 +-39.9999987551229736 + 97 +0 + 75 +0 + 76 +1 + 98 +0 + 0 +HATCH + 5 +EE + 8 +1-UGrid DG Part2 OverlapElems Example + 62 +256 +370 +-1 + 6 +ByLayer +100 +AcDbEntity +100 +AcDbHatch + 10 +0.0 + 20 +0.0 + 30 +0.0 +210 +0.0 +220 +0.0 +230 +1.0 + 2 +SOLID + 70 +1 + 71 +0 + 91 +1 + 92 +1 + 93 +3 + 72 +1 + 10 +159.9997155749006481 + 20 +-40.0004266376490492 + 11 +114.9999989626024757 + 21 +-39.9999987551229665 + 72 +1 + 10 +114.9999989626024757 + 20 +-39.9999987551229736 + 11 +140.0 + 21 +-70.0 + 72 +1 + 10 +140.0 + 20 +-70.0 + 11 +159.9997155749006197 + 21 +-40.0004266376490492 + 97 +0 + 75 +0 + 76 +1 + 98 +0 + 0 +HATCH + 5 +EF + 8 +1-UGrid DG Part2 OverlapElems Example + 62 +256 +370 +-1 + 6 +ByLayer +100 +AcDbEntity +100 +AcDbHatch + 10 +0.0 + 20 +0.0 + 30 +0.0 +210 +0.0 +220 +0.0 +230 +1.0 + 2 +SOLID + 70 +1 + 71 +0 + 91 +1 + 92 +1 + 93 +3 + 72 +1 + 10 +114.9999989626024757 + 20 +-39.9999987551229665 + 11 +135.0 + 21 +-10.0 + 72 +1 + 10 +134.9999999999999716 + 20 +-10.0000000000000249 + 11 +159.9997155749006197 + 21 +-40.0004266376490492 + 72 +1 + 10 +159.9997155749006481 + 20 +-40.0004266376490492 + 11 +114.9999989626024757 + 21 +-39.9999987551229665 + 97 +0 + 75 +0 + 76 +1 + 98 +0 + 0 +HATCH + 5 +F0 + 8 +1-UGrid DG Part2 H5Fed OverlapElems + 62 +256 +370 +-1 + 6 +ByLayer +100 +AcDbEntity +100 +AcDbHatch + 10 +0.0 + 20 +0.0 + 30 +0.0 +210 +0.0 +220 +0.0 +230 +1.0 + 2 +SOLID + 70 +1 + 71 +0 + 91 +1 + 92 +1 + 93 +3 + 72 +1 + 10 +114.9999989626024757 + 20 +-39.9999987551229736 + 11 +90.0 + 21 +-10.0 + 72 +1 + 10 +90.0 + 20 +-10.0 + 11 +135.0 + 21 +-10.0 + 72 +1 + 10 +135.0 + 20 +-10.0 + 11 +114.9999989626024757 + 21 +-39.9999987551229665 + 97 +0 + 75 +0 + 76 +1 + 98 +0 + 0 +HATCH + 5 +F1 + 8 +1-UGrid DG Part2 OverlapElems Example + 62 +256 +370 +-1 + 6 +ByLayer +100 +AcDbEntity +100 +AcDbHatch + 10 +0.0 + 20 +0.0 + 30 +0.0 +210 +0.0 +220 +0.0 +230 +1.0 + 2 +SOLID + 70 +1 + 71 +0 + 91 +1 + 92 +1 + 93 +3 + 72 +1 + 10 +135.0 + 20 +-10.0 + 11 +115.0000891911591054 + 21 +40.0001783823182038 + 72 +1 + 10 +115.0000891911591054 + 20 +40.0001783823182038 + 11 +90.0 + 21 +-10.0 + 72 +1 + 10 +90.0 + 20 +-10.0 + 11 +135.0 + 21 +-10.0 + 97 +0 + 75 +0 + 76 +1 + 98 +0 + 0 +HATCH + 5 +F2 + 8 +1-UGrid DG Part2 H5Fed OverlapElems + 62 +256 +370 +-1 + 6 +ByLayer +100 +AcDbEntity +100 +AcDbHatch + 10 +0.0 + 20 +0.0 + 30 +0.0 +210 +0.0 +220 +0.0 +230 +1.0 + 2 +SOLID + 70 +1 + 71 +0 + 91 +1 + 92 +1 + 93 +3 + 72 +1 + 10 +70.0 + 20 +35.0 + 11 +115.0000891911591054 + 21 +40.0001783823182038 + 72 +1 + 10 +115.0000891911591054 + 20 +40.0001783823182038 + 11 +90.0 + 21 +-10.0 + 72 +1 + 10 +90.0 + 20 +-10.0 + 11 +70.0 + 21 +35.0 + 97 +0 + 75 +0 + 76 +1 + 98 +0 + 0 +HATCH + 5 +F3 + 8 +1-UGrid DG Part2 H5Fed OverlapElems + 62 +256 +370 +-1 + 6 +ByLayer +100 +AcDbEntity +100 +AcDbHatch + 10 +0.0 + 20 +0.0 + 30 +0.0 +210 +0.0 +220 +0.0 +230 +1.0 + 2 +SOLID + 70 +1 + 71 +0 + 91 +1 + 92 +1 + 93 +3 + 72 +1 + 10 +70.0 + 20 +35.0 + 11 +115.0000891911591054 + 21 +40.0001783823182038 + 72 +1 + 10 +115.0000891911591054 + 20 +40.0001783823182038 + 11 +95.0 + 21 +85.0 + 72 +1 + 10 +95.0 + 20 +85.0 + 11 +70.0 + 21 +35.0 + 97 +0 + 75 +0 + 76 +1 + 98 +0 + 0 +LINE + 5 +F4 +100 +AcDbEntity +100 +AcDbLine + 8 +1-UGrid + 62 +256 +370 +-1 + 6 +ByLayer + 10 +70.0 + 20 +35.0 + 30 +0.0 + 11 +115.0000891911591054 + 21 +40.0001783823182038 + 31 +0.0 + 0 +LINE + 5 +F5 +100 +AcDbEntity +100 +AcDbLine + 8 +1-UGrid + 62 +256 +370 +-1 + 6 +ByLayer + 10 +70.0 + 20 +35.0 + 30 +0.0 + 11 +95.0 + 21 +85.0 + 31 +0.0 + 0 +LINE + 5 +F6 +100 +AcDbEntity +100 +AcDbLine + 8 +1-UGrid + 62 +256 +370 +-1 + 6 +ByLayer + 10 +70.0 + 20 +35.0 + 30 +0.0 + 11 +90.0 + 21 +-10.0 + 31 +0.0 + 0 +LINE + 5 +F7 +100 +AcDbEntity +100 +AcDbLine + 8 +1-UGrid + 62 +256 +370 +-1 + 6 +ByLayer + 10 +50.0 + 20 +80.0 + 30 +0.0 + 11 +70.0 + 21 +35.0 + 31 +0.0 + 0 +LINE + 5 +F8 +100 +AcDbEntity +100 +AcDbLine + 8 +1-UGrid + 62 +256 +370 +-1 + 6 +ByLayer + 10 +95.0 + 20 +85.0 + 30 +0.0 + 11 +115.0000891911591054 + 21 +40.0001783823182038 + 31 +0.0 + 0 +LINE + 5 +F9 +100 +AcDbEntity +100 +AcDbLine + 8 +1-UGrid + 62 +256 +370 +-1 + 6 +ByLayer + 10 +95.0 + 20 +85.0 + 30 +0.0 + 11 +140.0 + 21 +90.0 + 31 +0.0 + 0 +LINE + 5 +FA +100 +AcDbEntity +100 +AcDbLine + 8 +1-UGrid + 62 +256 +370 +-1 + 6 +ByLayer + 10 +50.0 + 20 +80.0 + 30 +0.0 + 11 +95.0 + 21 +85.0 + 31 +0.0 + 0 +LINE + 5 +FB +100 +AcDbEntity +100 +AcDbLine + 8 +1-UGrid + 62 +256 +370 +-1 + 6 +ByLayer + 10 +200.0 + 20 +24.9999999999999964 + 30 +0.0 + 11 +180.0000175342504178 + 21 +74.9999934246560969 + 31 +0.0 + 0 +LINE + 5 +FC +100 +AcDbEntity +100 +AcDbLine + 8 +1-UGrid + 62 +256 +370 +-1 + 6 +ByLayer + 10 +159.9999450076830385 + 20 +40.0001374807924535 + 30 +0.0 + 11 +200.0 + 21 +25.0 + 31 +0.0 + 0 +LINE + 5 +FD +100 +AcDbEntity +100 +AcDbLine + 8 +1-UGrid + 62 +256 +370 +-1 + 6 +ByLayer + 10 +200.0 + 20 +25.0 + 30 +0.0 + 11 +180.0 + 21 +-10.0 + 31 +0.0 + 0 +LINE + 5 +FE +100 +AcDbEntity +100 +AcDbLine + 8 +1-UGrid + 62 +256 +370 +-1 + 6 +ByLayer + 10 +220.0 + 20 +60.0 + 30 +0.0 + 11 +200.0 + 21 +25.0 + 31 +0.0 + 0 +LINE + 5 +FF +100 +AcDbEntity +100 +AcDbLine + 8 +1-UGrid + 62 +256 +370 +-1 + 6 +ByLayer + 10 +115.0000891911591054 + 20 +40.0001783823182038 + 30 +0.0 + 11 +90.0 + 21 +-10.0 + 31 +0.0 + 0 +LINE + 5 +100 +100 +AcDbEntity +100 +AcDbLine + 8 +1-UGrid + 62 +256 +370 +-1 + 6 +ByLayer + 10 +114.9999989626024757 + 20 +-39.9999987551229736 + 30 +0.0 + 11 +90.0 + 21 +-10.0 + 31 +0.0 + 0 +LINE + 5 +101 +100 +AcDbEntity +100 +AcDbLine + 8 +1-UGrid + 62 +256 +370 +-1 + 6 +ByLayer + 10 +140.0 + 20 +-70.0 + 30 +0.0 + 11 +114.9999989626024757 + 21 +-39.9999987551229736 + 31 +0.0 + 0 +LINE + 5 +102 +100 +AcDbEntity +100 +AcDbLine + 8 +1-UGrid + 62 +256 +370 +-1 + 6 +ByLayer + 10 +140.0 + 20 +90.0 + 30 +0.0 + 11 +180.0000175342504178 + 21 +74.9999934246560969 + 31 +0.0 + 0 +LINE + 5 +103 +100 +AcDbEntity +100 +AcDbLine + 8 +1-UGrid + 62 +256 +370 +-1 + 6 +ByLayer + 10 +135.0 + 20 +-10.0 + 30 +0.0 + 11 +180.0 + 21 +-10.0 + 31 +0.0 + 0 +LINE + 5 +104 +100 +AcDbEntity +100 +AcDbLine + 8 +1-UGrid + 62 +256 +370 +-1 + 6 +ByLayer + 10 +90.0 + 20 +-10.0 + 30 +0.0 + 11 +135.0 + 21 +-10.0 + 31 +0.0 + 0 +LINE + 5 +105 +100 +AcDbEntity +100 +AcDbLine + 8 +1-UGrid + 62 +256 +370 +-1 + 6 +ByLayer + 10 +159.9997155749006197 + 20 +-40.0004266376490492 + 30 +0.0 + 11 +140.0 + 21 +-70.0 + 31 +0.0 + 0 +LINE + 5 +106 +100 +AcDbEntity +100 +AcDbLine + 8 +1-UGrid + 62 +256 +370 +-1 + 6 +ByLayer + 10 +180.0 + 20 +-10.0 + 30 +0.0 + 11 +159.9997155749006197 + 21 +-40.0004266376490492 + 31 +0.0 + 0 +LINE + 5 +107 +100 +AcDbEntity +100 +AcDbLine + 8 +1-UGrid + 62 +256 +370 +-1 + 6 +ByLayer + 10 +159.9999450076830385 + 20 +40.0001374807924535 + 30 +0.0 + 11 +140.0 + 21 +90.0 + 31 +0.0 + 0 +LINE + 5 +108 +100 +AcDbEntity +100 +AcDbLine + 8 +1-UGrid + 62 +256 +370 +-1 + 6 +ByLayer + 10 +180.0 + 20 +-10.0 + 30 +0.0 + 11 +159.9999450076830385 + 21 +40.0001374807924535 + 31 +0.0 + 0 +LINE + 5 +109 +100 +AcDbEntity +100 +AcDbLine + 8 +1-UGrid + 62 +256 +370 +-1 + 6 +ByLayer + 10 +159.9997155749006481 + 20 +-40.0004266376490492 + 30 +0.0 + 11 +114.9999989626024757 + 21 +-39.9999987551229665 + 31 +0.0 + 0 +LINE + 5 +10A +100 +AcDbEntity +100 +AcDbLine + 8 +1-UGrid + 62 +256 +370 +-1 + 6 +ByLayer + 10 +135.0 + 20 +-10.0 + 30 +0.0 + 11 +159.9997155749006481 + 21 +-40.0004266376490492 + 31 +0.0 + 0 +LINE + 5 +10B +100 +AcDbEntity +100 +AcDbLine + 8 +1-UGrid + 62 +256 +370 +-1 + 6 +ByLayer + 10 +114.9999989626024757 + 20 +-39.9999987551229665 + 30 +0.0 + 11 +135.0 + 21 +-10.0 + 31 +0.0 + 0 +LINE + 5 +10C +100 +AcDbEntity +100 +AcDbLine + 8 +1-UGrid + 62 +256 +370 +-1 + 6 +ByLayer + 10 +159.9999450076830101 + 20 +40.0001374807924535 + 30 +0.0 + 11 +180.0000175342504178 + 21 +74.9999934246560827 + 31 +0.0 + 0 +LINE + 5 +10D +100 +AcDbEntity +100 +AcDbLine + 8 +1-UGrid + 62 +256 +370 +-1 + 6 +ByLayer + 10 +159.9999450076830101 + 20 +40.0001374807924535 + 30 +0.0 + 11 +135.0 + 21 +-10.0 + 31 +0.0 + 0 +LINE + 5 +10E +100 +AcDbEntity +100 +AcDbLine + 8 +1-UGrid + 62 +256 +370 +-1 + 6 +ByLayer + 10 +115.0000891911591054 + 20 +40.0001783823182038 + 30 +0.0 + 11 +159.9999450076830101 + 21 +40.0001374807924535 + 31 +0.0 + 0 +LINE + 5 +10F +100 +AcDbEntity +100 +AcDbLine + 8 +1-UGrid + 62 +256 +370 +-1 + 6 +ByLayer + 10 +200.0 + 20 +120.0 + 30 +0.0 + 11 +220.0 + 21 +60.0 + 31 +0.0 + 0 +LINE + 5 +110 +100 +AcDbEntity +100 +AcDbLine + 8 +1-UGrid + 62 +256 +370 +-1 + 6 +ByLayer + 10 +130.0 + 20 +150.0 + 30 +0.0 + 11 +200.0 + 21 +120.0 + 31 +0.0 + 0 +LINE + 5 +111 +100 +AcDbEntity +100 +AcDbLine + 8 +1-UGrid + 62 +256 +370 +-1 + 6 +ByLayer + 10 +140.0 + 20 +90.0 + 30 +0.0 + 11 +200.0 + 21 +120.0 + 31 +0.0 + 0 +LINE + 5 +112 +100 +AcDbEntity +100 +AcDbLine + 8 +1-UGrid + 62 +256 +370 +-1 + 6 +ByLayer + 10 +130.0 + 20 +150.0 + 30 +0.0 + 11 +140.0 + 21 +90.0 + 31 +0.0 + 0 +LINE + 5 +113 +100 +AcDbEntity +100 +AcDbLine + 8 +1-UGrid + 62 +256 +370 +-1 + 6 +ByLayer + 10 +50.0 + 20 +80.0 + 30 +0.0 + 11 +130.0 + 21 +150.0 + 31 +0.0 + 0 +LINE + 5 +114 +100 +AcDbEntity +100 +AcDbLine + 8 +1-UGrid + 62 +256 +370 +-1 + 6 +ByLayer + 10 +220.0 + 20 +60.0 + 30 +0.0 + 11 +240.0 + 21 +-60.0 + 31 +0.0 + 0 +LINE + 5 +115 +100 +AcDbEntity +100 +AcDbLine + 8 +1-UGrid + 62 +256 +370 +-1 + 6 +ByLayer + 10 +240.0 + 20 +-60.0 + 30 +0.0 + 11 +180.0 + 21 +-10.0 + 31 +0.0 + 0 +LINE + 5 +116 +100 +AcDbEntity +100 +AcDbLine + 8 +1-UGrid + 62 +256 +370 +-1 + 6 +ByLayer + 10 +140.0 + 20 +-70.0 + 30 +0.0 + 11 +240.0 + 21 +-60.0 + 31 +0.0 + 0 +LINE + 5 +117 +100 +AcDbEntity +100 +AcDbLine + 8 +1-UGrid + 62 +256 +370 +-1 + 6 +ByLayer + 10 +60.0 + 20 +-70.0 + 30 +0.0 + 11 +140.0 + 21 +-70.0 + 31 +0.0 + 0 +LINE + 5 +118 +100 +AcDbEntity +100 +AcDbLine + 8 +1-UGrid + 62 +256 +370 +-1 + 6 +ByLayer + 10 +90.0 + 20 +-10.0 + 30 +0.0 + 11 +60.0 + 21 +-70.0 + 31 +0.0 + 0 +LINE + 5 +119 +100 +AcDbEntity +100 +AcDbLine + 8 +1-UGrid + 62 +256 +370 +-1 + 6 +ByLayer + 10 +90.0 + 20 +-10.0 + 30 +0.0 + 11 +0.0 + 21 +0.0 + 31 +0.0 + 0 +LINE + 5 +11A +100 +AcDbEntity +100 +AcDbLine + 8 +1-UGrid + 62 +256 +370 +-1 + 6 +ByLayer + 10 +0.0 + 20 +0.0 + 30 +0.0 + 11 +50.0 + 21 +80.0 + 31 +0.0 + 0 +LINE + 5 +11B +100 +AcDbEntity +100 +AcDbLine + 8 +1-NGraph + 62 +256 +370 +-1 + 6 +ByLayer + 10 +73.2422985673746894 + 20 +41.4845971347493929 + 30 +0.0 + 11 +91.7577014326253106 + 21 +78.5154028652506071 + 31 +0.0 + 0 +LINE + 5 +11C +100 +AcDbEntity +100 +AcDbLine + 8 +1-NGraph + 62 +256 +370 +-1 + 6 +ByLayer + 10 +52.9445038788874953 + 20 +73.3748662725031409 + 30 +0.0 + 11 +67.0554961211124976 + 21 +41.6251337274968662 + 31 +0.0 + 0 +LINE + 5 +11D +100 +AcDbEntity +100 +AcDbLine + 8 +1-NGraph + 62 +256 +370 +-1 + 6 +ByLayer + 10 +87.0554961211124976 + 20 +-3.3748662725031346 + 30 +0.0 + 11 +72.9445038788875024 + 21 +28.3748662725031267 + 31 +0.0 + 0 +LINE + 5 +11E +100 +AcDbEntity +100 +AcDbLine + 8 +1-NGraph + 62 +256 +370 +-1 + 6 +ByLayer + 10 +77.2056541154809963 + 20 +35.8006552117183077 + 30 +0.0 + 11 +107.7944350756780523 + 21 +39.199523170599889 + 31 +0.0 + 0 +CIRCLE + 5 +11F +100 +AcDbEntity +100 +AcDbCircle + 8 +1-NGraph + 62 +256 +370 +-1 + 6 +ByLayer + 10 +70.0 + 20 +35.0 + 30 +0.0 + 40 +7.25 + 0 +LINE + 5 +120 +100 +AcDbEntity +100 +AcDbLine + 8 +1-NGraph + 62 +256 +370 +-1 + 6 +ByLayer + 10 +87.7943429236162558 + 20 +84.1993714359573744 + 30 +0.0 + 11 +57.2056570763837442 + 21 +80.8006285640426398 + 31 +0.0 + 0 +LINE + 5 +121 +100 +AcDbEntity +100 +AcDbLine + 8 +1-NGraph + 62 +256 +370 +-1 + 6 +ByLayer + 10 +57.2056570763837371 + 20 +80.8006285640426398 + 30 +0.0 + 11 +87.7943429236162558 + 21 +84.1993714359573602 + 31 +0.0 + 0 +LINE + 5 +122 +100 +AcDbEntity +100 +AcDbLine + 8 +1-NGraph + 62 +256 +370 +-1 + 6 +ByLayer + 10 +97.9059571128615147 + 20 +78.3578683197177099 + 30 +0.0 + 11 +111.8341033799194122 + 21 +46.5223738595351151 + 31 +0.0 + 0 +CIRCLE + 5 +123 +100 +AcDbEntity +100 +AcDbCircle + 8 +1-NGraph + 62 +256 +370 +-1 + 6 +ByLayer + 10 +95.0 + 20 +85.0 + 30 +0.0 + 40 +7.25 + 0 +LINE + 5 +124 +100 +AcDbEntity +100 +AcDbLine + 8 +1-NGraph + 62 +256 +370 +-1 + 6 +ByLayer + 10 +216.4029926969129747 + 20 +53.7052372195976702 + 30 +0.0 + 11 +203.5970073030870822 + 21 +31.2947627804023867 + 31 +0.0 + 0 +LINE + 5 +125 +100 +AcDbEntity +100 +AcDbLine + 8 +1-NGraph + 62 +256 +370 +-1 + 6 +ByLayer + 10 +196.4029926969129463 + 20 +18.7052372195976773 + 30 +0.0 + 11 +183.5970073030870537 + 21 +-3.7052372195976488 + 31 +0.0 + 0 +LINE + 5 +126 +100 +AcDbEntity +100 +AcDbLine + 8 +1-NGraph + 62 +256 +370 +-1 + 6 +ByLayer + 10 +193.2116199827562184 + 20 +27.545662338466272 + 30 +0.0 + 11 +166.7883250249267917 + 21 +37.4544751423261957 + 31 +0.0 + 0 +LINE + 5 +127 +100 +AcDbEntity +100 +AcDbLine + 8 +1-NGraph + 62 +256 +370 +-1 + 6 +ByLayer + 10 +182.6925982080520043 + 20 +68.2685367238319571 + 30 +0.0 + 11 +197.3074193261984135 + 21 +31.7314567008241397 + 31 +0.0 + 0 +CIRCLE + 5 +128 +100 +AcDbEntity +100 +AcDbCircle + 8 +1-NGraph + 62 +256 +370 +-1 + 6 +ByLayer + 10 +200.0 + 20 +25.0 + 30 +0.0 + 40 +7.25 + 0 +CIRCLE + 5 +129 +100 +AcDbEntity +100 +AcDbCircle + 8 +1-NGraph + 62 +256 +370 +-1 + 6 +ByLayer + 10 +130.0 + 20 +150.0 + 30 +0.0 + 40 +7.25 + 0 +CIRCLE + 5 +12A +100 +AcDbEntity +100 +AcDbCircle + 8 +1-NGraph + 62 +256 +370 +-1 + 6 +ByLayer + 10 +140.0 + 20 +-70.0 + 30 +0.0 + 40 +7.25 + 0 +CIRCLE + 5 +12B +100 +AcDbEntity +100 +AcDbCircle + 8 +1-NGraph + 62 +256 +370 +-1 + 6 +ByLayer + 10 +159.9997155749006197 + 20 +-40.0004266376490492 + 30 +0.0 + 40 +7.25 + 0 +CIRCLE + 5 +12C +100 +AcDbEntity +100 +AcDbCircle + 8 +1-NGraph + 62 +256 +370 +-1 + 6 +ByLayer + 10 +114.9999989626024757 + 20 +-39.9999987551229665 + 30 +0.0 + 40 +7.25 + 0 +CIRCLE + 5 +12D +100 +AcDbEntity +100 +AcDbCircle + 8 +1-NGraph + 62 +256 +370 +-1 + 6 +ByLayer + 10 +135.0 + 20 +-10.0 + 30 +0.0 + 40 +7.25 + 0 +CIRCLE + 5 +12E +100 +AcDbEntity +100 +AcDbCircle + 8 +1-NGraph + 62 +256 +370 +-1 + 6 +ByLayer + 10 +50.0 + 20 +80.0 + 30 +0.0 + 40 +7.25 + 0 +CIRCLE + 5 +12F +100 +AcDbEntity +100 +AcDbCircle + 8 +1-NGraph + 62 +256 +370 +-1 + 6 +ByLayer + 10 +130.0 + 20 +150.0 + 30 +0.0 + 40 +7.25 + 0 +LINE + 5 +130 +100 +AcDbEntity +100 +AcDbLine + 8 +1-NGraph + 62 +256 +370 +-1 + 6 +ByLayer + 10 +234.4303957229190303 + 20 +-55.3586631024325229 + 30 +0.0 + 11 +185.5696042770808845 + 21 +-14.6413368975674132 + 31 +0.0 + 0 +LINE + 5 +131 +100 +AcDbEntity +100 +AcDbLine + 8 +1-NGraph + 62 +256 +370 +-1 + 6 +ByLayer + 10 +177.3074175964327424 + 20 +-3.2685439910818692 + 30 +0.0 + 11 +162.6925274112502677 + 21 +33.2686814718743733 + 31 +0.0 + 0 +LINE + 5 +132 +100 +AcDbEntity +100 +AcDbLine + 8 +1-NGraph + 62 +256 +370 +-1 + 6 +ByLayer + 10 +177.3074175964327424 + 20 +-3.2685439910818701 + 30 +0.0 + 11 +162.6925274112502393 + 21 +33.2686814718743875 + 31 +0.0 + 0 +LINE + 5 +133 +100 +AcDbEntity +100 +AcDbLine + 8 +1-NGraph + 62 +256 +370 +-1 + 6 +ByLayer + 10 +142.25 + 20 +-10.0 + 30 +0.0 + 11 +172.75 + 21 +-10.0 + 31 +0.0 + 0 +LINE + 5 +134 +100 +AcDbEntity +100 +AcDbLine + 8 +1-NGraph + 62 +256 +370 +-1 + 6 +ByLayer + 10 +142.25 + 20 +-10.0 + 30 +0.0 + 11 +172.75 + 21 +-10.0 + 31 +0.0 + 0 +LINE + 5 +135 +100 +AcDbEntity +100 +AcDbLine + 8 +1-NGraph + 62 +256 +370 +-1 + 6 +ByLayer + 10 +175.9784235773670957 + 20 +-16.0323646339493635 + 30 +0.0 + 11 +164.021291997533524 + 21 +-33.9680620036996856 + 31 +0.0 + 0 +LINE + 5 +136 +100 +AcDbEntity +100 +AcDbLine + 8 +1-NGraph + 62 +256 +370 +-1 + 6 +ByLayer + 10 +175.9784235773670957 + 20 +-16.0323646339493671 + 30 +0.0 + 11 +164.0212919975335524 + 21 +-33.9680620036996856 + 31 +0.0 + 0 +CIRCLE + 5 +137 +100 +AcDbEntity +100 +AcDbCircle + 8 +1-NGraph + 62 +256 +370 +-1 + 6 +ByLayer + 10 +180.0 + 20 +-10.0 + 30 +0.0 + 40 +7.25 + 0 +CIRCLE + 5 +138 +100 +AcDbEntity +100 +AcDbCircle + 8 +1-NGraph + 62 +256 +370 +-1 + 6 +ByLayer + 10 +159.9997155749006197 + 20 +-40.0004266376490492 + 30 +0.0 + 40 +7.25 + 0 +CIRCLE + 5 +139 +100 +AcDbEntity +100 +AcDbCircle + 8 +1-NGraph + 62 +256 +370 +-1 + 6 +ByLayer + 10 +135.0 + 20 +-10.0 + 30 +0.0 + 40 +7.25 + 0 +CIRCLE + 5 +13A +100 +AcDbEntity +100 +AcDbCircle + 8 +1-NGraph + 62 +256 +370 +-1 + 6 +ByLayer + 10 +114.9999989626024757 + 20 +-39.9999987551229665 + 30 +0.0 + 40 +7.25 + 0 +CIRCLE + 5 +13B +100 +AcDbEntity +100 +AcDbCircle + 8 +1-NGraph + 62 +256 +370 +-1 + 6 +ByLayer + 10 +90.0 + 20 +-10.0 + 30 +0.0 + 40 +7.25 + 0 +LINE + 5 +13C +100 +AcDbEntity +100 +AcDbLine + 8 +1-NGraph + 62 +256 +370 +-1 + 6 +ByLayer + 10 +97.25 + 20 +-10.0 + 30 +0.0 + 11 +127.75 + 21 +-10.0 + 31 +0.0 + 0 +LINE + 5 +13D +100 +AcDbEntity +100 +AcDbLine + 8 +1-NGraph + 62 +256 +370 +-1 + 6 +ByLayer + 10 +55.4561810366248622 + 20 +84.7741584070467553 + 30 +0.0 + 11 +124.5438189633751307 + 21 +145.2258415929532589 + 31 +0.0 + 0 +LINE + 5 +13E +100 +AcDbEntity +100 +AcDbLine + 8 +1-NGraph + 62 +256 +370 +-1 + 6 +ByLayer + 10 +3.8424923150230548 + 20 +6.147987704036888 + 30 +0.0 + 11 +46.1575076849770198 + 21 +73.8520122959632204 + 31 +0.0 + 0 +LINE + 5 +13F +100 +AcDbEntity +100 +AcDbLine + 8 +1-NGraph + 62 +256 +370 +-1 + 6 +ByLayer + 10 +82.79434292361627 + 20 +-9.199371435957362 + 30 +0.0 + 11 +7.2056570763837584 + 21 +-0.8006285640426398 + 31 +0.0 + 0 +LINE + 5 +140 +100 +AcDbEntity +100 +AcDbLine + 8 +1-NGraph + 62 +256 +370 +-1 + 6 +ByLayer + 10 +4.7182374575557713 + 20 +-5.5046103671484001 + 30 +0.0 + 11 +55.2817625424442269 + 21 +-64.4953896328515981 + 31 +0.0 + 0 +LINE + 5 +141 +100 +AcDbEntity +100 +AcDbLine + 8 +1-NGraph + 62 +256 +370 +-1 + 6 +ByLayer + 10 +131.191892657963848 + 20 +142.8486440522169687 + 30 +0.0 + 11 +138.808107342036152 + 21 +97.1513559477830313 + 31 +0.0 + 0 +LINE + 5 +142 +100 +AcDbEntity +100 +AcDbLine + 8 +1-NGraph + 62 +256 +370 +-1 + 6 +ByLayer + 10 +136.6638014676309183 + 20 +147.1440850853010431 + 30 +0.0 + 11 +193.3361985323691954 + 21 +122.8559149146989142 + 31 +0.0 + 0 +LINE + 5 +143 +100 +AcDbEntity +100 +AcDbLine + 8 +1-NGraph + 62 +256 +370 +-1 + 6 +ByLayer + 10 +102.4808890160708756 + 20 +85.8312098906745433 + 30 +0.0 + 11 +132.7943429236165116 + 21 +89.1993714359573886 + 31 +0.0 + 0 +LINE + 5 +144 +100 +AcDbEntity +100 +AcDbLine + 8 +1-NGraph + 62 +256 +370 +-1 + 6 +ByLayer + 10 +132.7943429236162558 + 20 +89.1993714359573602 + 30 +0.0 + 11 +102.4808890160709183 + 21 +85.8312098906745575 + 31 +0.0 + 0 +LINE + 5 +145 +100 +AcDbEntity +100 +AcDbLine + 8 +1-NGraph + 62 +256 +370 +-1 + 6 +ByLayer + 10 +93.2422985673746894 + 20 +-3.5154028652506106 + 30 +0.0 + 11 +111.7577906237844161 + 21 +33.5155812475688037 + 31 +0.0 + 0 +LINE + 5 +146 +100 +AcDbEntity +100 +AcDbLine + 8 +1-NGraph + 62 +256 +370 +-1 + 6 +ByLayer + 10 +132.3074362290774673 + 20 +-3.2685365380538922 + 30 +0.0 + 11 +117.6926529620816382 + 21 +33.2687149203720764 + 31 +0.0 + 0 +LINE + 5 +147 +100 +AcDbEntity +100 +AcDbLine + 8 +1-NGraph + 62 +256 +370 +-1 + 6 +ByLayer + 10 +111.7577906237844161 + 20 +33.5155812475688109 + 30 +0.0 + 11 +93.2422985673746751 + 21 +-3.5154028652506497 + 31 +0.0 + 0 +LINE + 5 +148 +100 +AcDbEntity +100 +AcDbLine + 8 +1-NGraph + 62 +256 +370 +-1 + 6 +ByLayer + 10 +118.2423877585337948 + 20 +46.4847755170675967 + 30 +0.0 + 11 +136.7577014326253106 + 21 +83.5154028652506213 + 31 +0.0 + 0 +LINE + 5 +149 +100 +AcDbEntity +100 +AcDbLine + 8 +1-NGraph + 62 +256 +370 +-1 + 6 +ByLayer + 10 +122.2500891911561069 + 20 +40.0001717926068281 + 30 +0.0 + 11 +152.7499450076860228 + 21 +40.0001440705038291 + 31 +0.0 + 0 +LINE + 5 +14A +100 +AcDbEntity +100 +AcDbLine + 8 +1-NGraph + 62 +256 +370 +-1 + 6 +ByLayer + 10 +136.7577014326253106 + 20 +83.5154028652506071 + 30 +0.0 + 11 +118.2423877585337948 + 21 +46.4847755170675754 + 31 +0.0 + 0 +LINE + 5 +14B +100 +AcDbEntity +100 +AcDbLine + 8 +1-NGraph + 62 +256 +370 +-1 + 6 +ByLayer + 10 +97.25 + 20 +-10.0 + 30 +0.0 + 11 +127.75 + 21 +-10.0 + 31 +0.0 + 0 +LINE + 5 +14C +100 +AcDbEntity +100 +AcDbLine + 8 +1-NGraph + 62 +256 +370 +-1 + 6 +ByLayer + 10 +110.3586620650349914 + 20 +-34.4303944780419897 + 30 +0.0 + 11 +94.64133689756747 + 21 +-15.5696042770809697 + 31 +0.0 + 0 +LINE + 5 +14D +100 +AcDbEntity +100 +AcDbLine + 8 +1-NGraph + 62 +256 +370 +-1 + 6 +ByLayer + 10 +110.3586620650350056 + 20 +-34.4303944780420039 + 30 +0.0 + 11 +94.64133689756747 + 21 +-15.5696042770809697 + 31 +0.0 + 0 +LINE + 5 +14E +100 +AcDbEntity +100 +AcDbLine + 8 +1-NGraph + 62 +256 +370 +-1 + 6 +ByLayer + 10 +86.7577014326253106 + 20 +-16.4845971347493894 + 30 +0.0 + 11 +63.2422985673747391 + 21 +-63.5154028652505218 + 31 +0.0 + 0 +LINE + 5 +14F +100 +AcDbEntity +100 +AcDbLine + 8 +1-NGraph + 62 +256 +370 +-1 + 6 +ByLayer + 10 +67.25 + 20 +-70.0 + 30 +0.0 + 11 +132.75 + 21 +-70.0 + 31 +0.0 + 0 +LINE + 5 +150 +100 +AcDbEntity +100 +AcDbLine + 8 +1-NGraph + 62 +256 +370 +-1 + 6 +ByLayer + 10 +156.7576592780008582 + 20 +33.5155339272127222 + 30 +0.0 + 11 +138.2422857296822087 + 21 +-3.5153964464201763 + 31 +0.0 + 0 +LINE + 5 +151 +100 +AcDbEntity +100 +AcDbLine + 8 +1-NGraph + 62 +256 +370 +-1 + 6 +ByLayer + 10 +139.6412667799993415 + 20 +-15.5696627076398872 + 30 +0.0 + 11 +155.3584487949012782 + 21 +-34.4307639300091637 + 31 +0.0 + 0 +LINE + 5 +152 +100 +AcDbEntity +100 +AcDbLine + 8 +1-NGraph + 62 +256 +370 +-1 + 6 +ByLayer + 10 +119.0215756451814286 + 20 +-33.9676342944709688 + 30 +0.0 + 11 +130.9784233174210613 + 21 +-16.0323644606520013 + 31 +0.0 + 0 +LINE + 5 +153 +100 +AcDbEntity +100 +AcDbLine + 8 +1-NGraph + 62 +256 +370 +-1 + 6 +ByLayer + 10 +135.35866310243253 + 20 +-64.4303957229190303 + 30 +0.0 + 11 +119.6413358601699457 + 21 +-45.5696030322039363 + 31 +0.0 + 0 +LINE + 5 +154 +100 +AcDbEntity +100 +AcDbLine + 8 +1-NGraph + 62 +256 +370 +-1 + 6 +ByLayer + 10 +152.7497155752283788 + 20 +-40.0003577005857167 + 30 +0.0 + 11 +122.2499989622747592 + 21 +-40.000067692186299 + 31 +0.0 + 0 +LINE + 5 +155 +100 +AcDbEntity +100 +AcDbLine + 8 +1-NGraph + 62 +256 +370 +-1 + 6 +ByLayer + 10 +135.35866310243253 + 20 +-64.4303957229190303 + 30 +0.0 + 11 +119.6413358601699457 + 21 +-45.5696030322039363 + 31 +0.0 + 0 +LINE + 5 +156 +100 +AcDbEntity +100 +AcDbLine + 8 +1-NGraph + 62 +256 +370 +-1 + 6 +ByLayer + 10 +155.9781391522677154 + 20 +-46.0327912715984411 + 30 +0.0 + 11 +144.0215764226329043 + 21 +-63.9676353660506365 + 31 +0.0 + 0 +LINE + 5 +157 +100 +AcDbEntity +100 +AcDbLine + 8 +1-NGraph + 62 +256 +370 +-1 + 6 +ByLayer + 10 +155.9781391522677154 + 20 +-46.0327912715984127 + 30 +0.0 + 11 +144.0215764226329043 + 21 +-63.9676353660506152 + 31 +0.0 + 0 +LINE + 5 +158 +100 +AcDbEntity +100 +AcDbLine + 8 +1-NGraph + 62 +256 +370 +-1 + 6 +ByLayer + 10 +147.214019629022431 + 20 +-69.2785980370977512 + 30 +0.0 + 11 +232.7859803709775974 + 21 +-60.7214019629022417 + 31 +0.0 + 0 +LINE + 5 +159 +100 +AcDbEntity +100 +AcDbLine + 8 +1-NGraph + 62 +256 +370 +-1 + 6 +ByLayer + 10 +221.191892657963848 + 20 +52.8486440522169545 + 30 +0.0 + 11 +238.808107342036152 + 21 +-52.848644052216855 + 31 +0.0 + 0 +LINE + 5 +15A +100 +AcDbEntity +100 +AcDbLine + 8 +1-NGraph + 62 +256 +370 +-1 + 6 +ByLayer + 10 +163.5969733045182579 + 20 +46.2948882647208393 + 30 +0.0 + 11 +176.4029892374151984 + 21 +68.7052426407277324 + 31 +0.0 + 0 +LINE + 5 +15B +100 +AcDbEntity +100 +AcDbLine + 8 +1-NGraph + 62 +256 +370 +-1 + 6 +ByLayer + 10 +157.3073626041157809 + 20 +46.7315934897106047 + 30 +0.0 + 11 +142.6925824035672861 + 21 +83.268543991081799 + 31 +0.0 + 0 +LINE + 5 +15C +100 +AcDbEntity +100 +AcDbLine + 8 +1-NGraph + 62 +256 +370 +-1 + 6 +ByLayer + 10 +157.3073626041157809 + 20 +46.7315934897105478 + 30 +0.0 + 11 +142.6925824035672576 + 21 +83.2685439910818701 + 31 +0.0 + 0 +LINE + 5 +15D +100 +AcDbEntity +100 +AcDbLine + 8 +1-NGraph + 62 +256 +370 +-1 + 6 +ByLayer + 10 +146.4845971347493787 + 20 +93.2422985673746894 + 30 +0.0 + 11 +193.515402865250536 + 21 +116.757701432625268 + 31 +0.0 + 0 +LINE + 5 +15E +100 +AcDbEntity +100 +AcDbLine + 8 +1-NGraph + 62 +256 +370 +-1 + 6 +ByLayer + 10 +146.7883865373755725 + 20 +87.4543550484841603 + 30 +0.0 + 11 +173.2116309968748169 + 21 +77.5456383761719508 + 31 +0.0 + 0 +LINE + 5 +15F +100 +AcDbEntity +100 +AcDbLine + 8 +1-NGraph + 62 +256 +370 +-1 + 6 +ByLayer + 10 +146.7883865373755725 + 20 +87.4543550484841603 + 30 +0.0 + 11 +173.2116309968748169 + 21 +77.5456383761719508 + 31 +0.0 + 0 +LINE + 5 +160 +100 +AcDbEntity +100 +AcDbLine + 8 +1-NGraph + 62 +256 +370 +-1 + 6 +ByLayer + 10 +186.7884040716259904 + 20 +72.4543484731402572 + 30 +0.0 + 11 +213.2116134626243991 + 21 +62.5456449515158539 + 31 +0.0 + 0 +LINE + 5 +161 +100 +AcDbEntity +100 +AcDbLine + 8 +1-NGraph + 62 +256 +370 +-1 + 6 +ByLayer + 10 +186.7884040716259904 + 20 +72.4543484731402572 + 30 +0.0 + 11 +213.2116134626243138 + 21 +62.5456449515158823 + 31 +0.0 + 0 +LINE + 5 +162 +100 +AcDbEntity +100 +AcDbLine + 8 +1-NGraph + 62 +256 +370 +-1 + 6 +ByLayer + 10 +202.2926513036220797 + 20 +113.1220460891337751 + 30 +0.0 + 11 +217.7073486963779203 + 21 +66.8779539108662249 + 31 +0.0 + 0 +CIRCLE + 5 +163 +100 +AcDbEntity +100 +AcDbCircle + 8 +1-NGraph + 62 +256 +370 +-1 + 6 +ByLayer + 10 +240.0 + 20 +-60.0 + 30 +0.0 + 40 +7.25 + 0 +CIRCLE + 5 +164 +100 +AcDbEntity +100 +AcDbCircle + 8 +1-NGraph + 62 +256 +370 +-1 + 6 +ByLayer + 10 +159.9999450076830385 + 20 +40.0001374807924819 + 30 +0.0 + 40 +7.25 + 0 +CIRCLE + 5 +165 +100 +AcDbEntity +100 +AcDbCircle + 8 +1-NGraph + 62 +256 +370 +-1 + 6 +ByLayer + 10 +200.0 + 20 +120.0 + 30 +0.0 + 40 +7.25 + 0 +CIRCLE + 5 +166 +100 +AcDbEntity +100 +AcDbCircle + 8 +1-NGraph + 62 +256 +370 +-1 + 6 +ByLayer + 10 +0.0 + 20 +0.0 + 30 +0.0 + 40 +7.25 + 0 +HATCH + 5 +167 + 8 +1-NGraph Part 2 + 62 +256 +370 +-1 + 6 +ByLayer +100 +AcDbEntity +100 +AcDbHatch + 10 +0.0 + 20 +0.0 + 30 +0.0 +210 +0.0 +220 +0.0 +230 +1.0 + 2 +SOLID + 70 +1 + 71 +0 + 91 +1 + 92 +1 + 93 +1 + 72 +2 + 10 +200.0 + 20 +25.0 + 40 +7.25 + 50 +0.0 + 51 +360.0 + 73 +1 + 97 +0 + 75 +0 + 76 +1 + 98 +0 + 0 +HATCH + 5 +168 + 8 +1-NGraph Part 1 + 62 +256 +370 +-1 + 6 +ByLayer +100 +AcDbEntity +100 +AcDbHatch + 10 +0.0 + 20 +0.0 + 30 +0.0 +210 +0.0 +220 +0.0 +230 +1.0 + 2 +SOLID + 70 +1 + 71 +0 + 91 +1 + 92 +1 + 93 +1 + 72 +2 + 10 +70.0 + 20 +35.0 + 40 +7.25 + 50 +0.0 + 51 +360.0 + 73 +1 + 97 +0 + 75 +0 + 76 +1 + 98 +0 + 0 +HATCH + 5 +169 + 8 +0-UGrid DG Part2 + 62 +256 +370 +-1 + 6 +ByLayer +100 +AcDbEntity +100 +AcDbHatch + 10 +0.0 + 20 +0.0 + 30 +0.0 +210 +0.0 +220 +0.0 +230 +1.0 + 2 +SOLID + 70 +1 + 71 +0 + 91 +1 + 92 +1 + 93 +6 + 72 +1 + 10 +140.0 + 20 +90.0 + 11 +90.0 + 21 +-10.0 + 72 +1 + 10 +90.0 + 20 +-10.0 + 11 +60.0 + 21 +-70.0 + 72 +1 + 10 +60.0 + 20 +-70.0 + 11 +140.0 + 21 +-70.0 + 72 +1 + 10 +140.0 + 20 +-70.0 + 11 +240.0 + 21 +-60.0 + 72 +1 + 10 +240.0 + 20 +-60.0 + 11 +220.0 + 21 +60.0 + 72 +1 + 10 +220.0 + 20 +60.0 + 11 +140.0 + 21 +90.0 + 97 +0 + 75 +0 + 76 +1 + 98 +0 + 0 +HATCH + 5 +16A + 8 +0-UGrid DG Part1 + 62 +256 +370 +-1 + 6 +ByLayer +100 +AcDbEntity +100 +AcDbHatch + 10 +0.0 + 20 +0.0 + 30 +0.0 +210 +0.0 +220 +0.0 +230 +1.0 + 2 +SOLID + 70 +1 + 71 +0 + 91 +1 + 92 +1 + 93 +8 + 72 +1 + 10 +0.0 + 20 +0.0 + 11 +50.0 + 21 +80.0 + 72 +1 + 10 +50.0 + 20 +80.0 + 11 +130.0 + 21 +150.0 + 72 +1 + 10 +130.0 + 20 +150.0 + 11 +200.0 + 21 +120.0 + 72 +1 + 10 +200.0 + 20 +120.0 + 11 +220.0 + 21 +60.0 + 72 +1 + 10 +220.0 + 20 +60.0 + 11 +140.0 + 21 +90.0 + 72 +1 + 10 +140.0 + 20 +90.0 + 11 +90.0 + 21 +-10.0 + 72 +1 + 10 +90.0 + 20 +-10.0 + 11 +60.0 + 21 +-70.0 + 72 +1 + 10 +60.0 + 20 +-70.0 + 11 +0.0 + 21 +0.0 + 97 +0 + 75 +0 + 76 +1 + 98 +0 + 0 +HATCH + 5 +16B + 8 +1-NGraph Part1 Elements + 62 +256 +370 +-1 + 6 +ByLayer +100 +AcDbEntity +100 +AcDbHatch + 10 +0.0 + 20 +0.0 + 30 +0.0 +210 +0.0 +220 +0.0 +230 +1.0 + 2 +SOLID + 70 +1 + 71 +0 + 91 +1 + 92 +1 + 93 +8 + 72 +1 + 10 +0.0 + 20 +0.0 + 11 +50.0 + 21 +80.0 + 72 +1 + 10 +50.0 + 20 +80.0 + 11 +130.0 + 21 +150.0 + 72 +1 + 10 +130.0 + 20 +150.0 + 11 +200.0 + 21 +120.0 + 72 +1 + 10 +200.0 + 20 +120.0 + 11 +140.0 + 21 +90.0 + 72 +1 + 10 +140.0 + 20 +90.0 + 11 +115.0000891911591054 + 21 +40.0001783823182038 + 72 +1 + 10 +115.0000891911591054 + 20 +40.0001783823182038 + 11 +90.0 + 21 +-10.0 + 72 +1 + 10 +90.0 + 20 +-10.0 + 11 +60.0 + 21 +-70.0 + 72 +1 + 10 +60.0 + 20 +-70.0 + 11 +0.0 + 21 +0.0 + 97 +0 + 75 +0 + 76 +1 + 98 +0 + 0 +HATCH + 5 +16C + 8 +1-NGraph Part2 Elements + 62 +256 +370 +-1 + 6 +ByLayer +100 +AcDbEntity +100 +AcDbHatch + 10 +0.0 + 20 +0.0 + 30 +0.0 +210 +0.0 +220 +0.0 +230 +1.0 + 2 +SOLID + 70 +1 + 71 +0 + 91 +1 + 92 +1 + 93 +7 + 72 +1 + 10 +140.0 + 20 +-70.0 + 11 +240.0 + 21 +-60.0 + 72 +1 + 10 +240.0 + 20 +-60.0 + 11 +220.0 + 21 +60.0 + 72 +1 + 10 +220.0 + 20 +60.0 + 11 +180.0000175342504178 + 21 +74.9999934246560969 + 72 +1 + 10 +180.0000175342504178 + 20 +74.9999934246560827 + 11 +159.9999450076830101 + 21 +40.0001374807924535 + 72 +1 + 10 +159.9999450076830101 + 20 +40.0001374807924535 + 11 +135.0 + 21 +-10.0 + 72 +1 + 10 +135.0 + 20 +-10.0 + 11 +114.9999989626024757 + 21 +-39.9999987551229665 + 72 +1 + 10 +114.9999989626024757 + 20 +-39.9999987551229736 + 11 +140.0 + 21 +-70.0 + 97 +0 + 75 +0 + 76 +1 + 98 +0 + 0 +HATCH + 5 +16D + 8 +1-UGrid DG Part2 Ghost2OverlapElems + 62 +256 +370 +-1 + 6 +ByLayer +100 +AcDbEntity +100 +AcDbHatch + 10 +0.0 + 20 +0.0 + 30 +0.0 +210 +0.0 +220 +0.0 +230 +1.0 + 2 +SOLID + 70 +1 + 71 +0 + 91 +1 + 92 +1 + 93 +4 + 72 +1 + 10 +90.0 + 20 +-10.0 + 11 +60.0 + 21 +-70.0 + 72 +1 + 10 +60.0 + 20 +-70.0 + 11 +140.0 + 21 +-70.0 + 72 +1 + 10 +140.0 + 20 +-70.0 + 11 +114.9999989626024757 + 21 +-39.9999987551229736 + 72 +1 + 10 +114.9999989626024757 + 20 +-39.9999987551229736 + 11 +90.0 + 21 +-10.0 + 97 +0 + 75 +0 + 76 +1 + 98 +0 + 0 +HATCH + 5 +16E + 8 +1-UGrid DG Part2 Ghost2OverlapElems + 62 +256 +370 +-1 + 6 +ByLayer +100 +AcDbEntity +100 +AcDbHatch + 10 +0.0 + 20 +0.0 + 30 +0.0 +210 +0.0 +220 +0.0 +230 +1.0 + 2 +SOLID + 70 +1 + 71 +0 + 91 +1 + 92 +1 + 93 +3 + 72 +1 + 10 +114.9999989626024757 + 20 +-39.9999987551229665 + 11 +135.0 + 21 +-10.0 + 72 +1 + 10 +135.0 + 20 +-10.0 + 11 +90.0 + 21 +-10.0 + 72 +1 + 10 +90.0 + 20 +-10.0 + 11 +114.9999989626024757 + 21 +-39.9999987551229736 + 97 +0 + 75 +0 + 76 +1 + 98 +0 + 0 +HATCH + 5 +16F + 8 +1-UGrid DG Part2 Ghost2OverlapElems + 62 +256 +370 +-1 + 6 +ByLayer +100 +AcDbEntity +100 +AcDbHatch + 10 +0.0 + 20 +0.0 + 30 +0.0 +210 +0.0 +220 +0.0 +230 +1.0 + 2 +SOLID + 70 +1 + 71 +0 + 91 +1 + 92 +1 + 93 +3 + 72 +1 + 10 +115.0000891911591054 + 20 +40.0001783823182038 + 11 +68.2762309724051448 + 21 +38.8784803120884277 + 72 +1 + 10 +68.2762309724051448 + 20 +38.8784803120884348 + 11 +90.0 + 21 +-10.0 + 72 +1 + 10 +90.0 + 20 +-10.0 + 11 +115.0000891911591054 + 21 +40.0001783823182038 + 97 +0 + 75 +0 + 76 +1 + 98 +0 + 0 +HATCH + 5 +170 + 8 +1-UGrid DG Part2 Ghost2OverlapElems + 62 +256 +370 +-1 + 6 +ByLayer +100 +AcDbEntity +100 +AcDbHatch + 10 +0.0 + 20 +0.0 + 30 +0.0 +210 +0.0 +220 +0.0 +230 +1.0 + 2 +SOLID + 70 +1 + 71 +0 + 91 +1 + 92 +1 + 93 +3 + 72 +1 + 10 +115.0000891911591054 + 20 +40.0001783823182038 + 11 +68.2762309724051448 + 21 +38.8784803120884277 + 72 +1 + 10 +68.2762309724051448 + 20 +38.8784803120884277 + 11 +95.2752319396871599 + 21 +85.0305813266319035 + 72 +1 + 10 +95.2752319396871599 + 20 +85.0305813266319035 + 11 +115.0000891911591054 + 21 +40.0001783823182038 + 97 +0 + 75 +0 + 76 +1 + 98 +0 + 0 +HATCH + 5 +171 + 8 +1-UGrid DG Part2 Ghost2OverlapElems + 62 +256 +370 +-1 + 6 +ByLayer +100 +AcDbEntity +100 +AcDbHatch + 10 +0.0 + 20 +0.0 + 30 +0.0 +210 +0.0 +220 +0.0 +230 +1.0 + 2 +SOLID + 70 +1 + 71 +0 + 91 +1 + 92 +1 + 93 +3 + 72 +1 + 10 +68.2762309724051448 + 20 +38.8784803120884277 + 11 +95.2752319396871599 + 21 +85.0305813266319035 + 72 +1 + 10 +95.2752319396871599 + 20 +85.0305813266319177 + 11 +50.0 + 21 +80.0 + 72 +1 + 10 +50.0 + 20 +80.0 + 11 +68.2762309724051448 + 21 +38.8784803120884348 + 97 +0 + 75 +0 + 76 +1 + 98 +0 + 0 +HATCH + 5 +172 + 8 +1-UGrid DG Part2 OverlapElems Example + 62 +256 +370 +-1 + 6 +ByLayer +100 +AcDbEntity +100 +AcDbHatch + 10 +0.0 + 20 +0.0 + 30 +0.0 +210 +0.0 +220 +0.0 +230 +1.0 + 2 +SOLID + 70 +1 + 71 +0 + 91 +1 + 92 +1 + 93 +4 + 72 +1 + 10 +50.0 + 20 +80.0 + 11 +130.0 + 21 +150.0 + 72 +1 + 10 +130.0 + 20 +150.0 + 11 +140.0 + 21 +90.0 + 72 +1 + 10 +140.0 + 20 +90.0 + 11 +95.2752319396871599 + 21 +85.0305813266319177 + 72 +1 + 10 +95.2752319396871599 + 20 +85.0305813266319177 + 11 +50.0 + 21 +80.0 + 97 +0 + 75 +0 + 76 +1 + 98 +0 + 0 +HATCH + 5 +173 + 8 +1-UGrid DG Part2 OverlapElems Example + 62 +256 +370 +-1 + 6 +ByLayer +100 +AcDbEntity +100 +AcDbHatch + 10 +0.0 + 20 +0.0 + 30 +0.0 +210 +0.0 +220 +0.0 +230 +1.0 + 2 +SOLID + 70 +1 + 71 +0 + 91 +1 + 92 +1 + 93 +3 + 72 +1 + 10 +95.2752319396871599 + 20 +85.0305813266319035 + 11 +115.0000891911591054 + 21 +40.0001783823182038 + 72 +1 + 10 +115.0000891911591054 + 20 +40.0001783823182038 + 11 +140.0 + 21 +90.0 + 72 +1 + 10 +140.0 + 20 +90.0 + 11 +95.2752319396871599 + 21 +85.0305813266319177 + 97 +0 + 75 +0 + 76 +1 + 98 +0 + 0 +HATCH + 5 +174 + 8 +1-UGrid DG Part2 GhostElems + 62 +256 +370 +-1 + 6 +ByLayer +100 +AcDbEntity +100 +AcDbHatch + 10 +0.0 + 20 +0.0 + 30 +0.0 +210 +0.0 +220 +0.0 +230 +1.0 + 2 +SOLID + 70 +1 + 71 +0 + 91 +1 + 92 +1 + 93 +3 + 72 +1 + 10 +159.9997155749006481 + 20 +-40.0004266376490492 + 11 +114.9999989626024757 + 21 +-39.9999987551229665 + 72 +1 + 10 +114.9999989626024757 + 20 +-39.9999987551229736 + 11 +140.0 + 21 +-70.0 + 72 +1 + 10 +140.0 + 20 +-70.0 + 11 +159.9997155749006197 + 21 +-40.0004266376490492 + 97 +0 + 75 +0 + 76 +1 + 98 +0 + 0 +HATCH + 5 +175 + 8 +1-UGrid DG Part2 GhostElems + 62 +256 +370 +-1 + 6 +ByLayer +100 +AcDbEntity +100 +AcDbHatch + 10 +0.0 + 20 +0.0 + 30 +0.0 +210 +0.0 +220 +0.0 +230 +1.0 + 2 +SOLID + 70 +1 + 71 +0 + 91 +1 + 92 +1 + 93 +3 + 72 +1 + 10 +114.9999989626024757 + 20 +-39.9999987551229665 + 11 +135.0 + 21 +-10.0 + 72 +1 + 10 +134.9999999999999716 + 20 +-10.0000000000000249 + 11 +159.9997155749006197 + 21 +-40.0004266376490492 + 72 +1 + 10 +159.9997155749006481 + 20 +-40.0004266376490492 + 11 +114.9999989626024757 + 21 +-39.9999987551229665 + 97 +0 + 75 +0 + 76 +1 + 98 +0 + 0 +HATCH + 5 +176 + 8 +1-UGrid DG Part2 GhostElems + 62 +256 +370 +-1 + 6 +ByLayer +100 +AcDbEntity +100 +AcDbHatch + 10 +0.0 + 20 +0.0 + 30 +0.0 +210 +0.0 +220 +0.0 +230 +1.0 + 2 +SOLID + 70 +1 + 71 +0 + 91 +1 + 92 +1 + 93 +3 + 72 +1 + 10 +135.0 + 20 +-10.0 + 11 +115.0000891911591054 + 21 +40.0001783823182038 + 72 +1 + 10 +115.0000891911591054 + 20 +40.0001783823182038 + 11 +90.0 + 21 +-10.0 + 72 +1 + 10 +90.0 + 20 +-10.0 + 11 +135.0 + 21 +-10.0 + 97 +0 + 75 +0 + 76 +1 + 98 +0 + 0 +HATCH + 5 +177 + 8 +1-UGrid DG Part2 GhostElems + 62 +256 +370 +-1 + 6 +ByLayer +100 +AcDbEntity +100 +AcDbHatch + 10 +0.0 + 20 +0.0 + 30 +0.0 +210 +0.0 +220 +0.0 +230 +1.0 + 2 +SOLID + 70 +1 + 71 +0 + 91 +1 + 92 +1 + 93 +3 + 72 +1 + 10 +95.2752319396871599 + 20 +85.0305813266319035 + 11 +115.0000891911591054 + 21 +40.0001783823182038 + 72 +1 + 10 +115.0000891911591054 + 20 +40.0001783823182038 + 11 +140.0 + 21 +90.0 + 72 +1 + 10 +140.0 + 20 +90.0 + 11 +95.2752319396871599 + 21 +85.0305813266319177 + 97 +0 + 75 +0 + 76 +1 + 98 +0 + 0 +HATCH + 5 +178 + 8 +1-UGrid DG Part2 GhostElems + 62 +256 +370 +-1 + 6 +ByLayer +100 +AcDbEntity +100 +AcDbHatch + 10 +0.0 + 20 +0.0 + 30 +0.0 +210 +0.0 +220 +0.0 +230 +1.0 + 2 +SOLID + 70 +1 + 71 +0 + 91 +1 + 92 +1 + 93 +4 + 72 +1 + 10 +50.0 + 20 +80.0 + 11 +130.0 + 21 +150.0 + 72 +1 + 10 +130.0 + 20 +150.0 + 11 +140.0 + 21 +90.0 + 72 +1 + 10 +140.0 + 20 +90.0 + 11 +95.2752319396871599 + 21 +85.0305813266319177 + 72 +1 + 10 +95.2752319396871599 + 20 +85.0305813266319177 + 11 +50.0 + 21 +80.0 + 97 +0 + 75 +0 + 76 +1 + 98 +0 + 0 +HATCH + 5 +179 + 8 +1-UGrid DG InitPart2 + 62 +256 +370 +-1 + 6 +ByLayer +100 +AcDbEntity +100 +AcDbHatch + 10 +0.0 + 20 +0.0 + 30 +0.0 +210 +0.0 +220 +0.0 +230 +1.0 + 2 +SOLID + 70 +1 + 71 +0 + 91 +1 + 92 +1 + 93 +6 + 72 +1 + 10 +50.0 + 20 +80.0 + 11 +140.0 + 21 +90.0 + 72 +1 + 10 +140.0 + 20 +90.0 + 11 +220.0 + 21 +60.0 + 72 +1 + 10 +220.0 + 20 +60.0 + 11 +180.0 + 21 +-10.0 + 72 +1 + 10 +180.0 + 20 +-10.0 + 11 +90.0 + 21 +-10.0 + 72 +1 + 10 +90.0 + 20 +-10.0 + 11 +68.2762309724051448 + 21 +38.8784803120884348 + 72 +1 + 10 +68.2762309724051448 + 20 +38.8784803120884348 + 11 +50.0 + 21 +80.0 + 97 +0 + 75 +0 + 76 +1 + 98 +0 + 0 +HATCH + 5 +17A + 8 +1-UGrid DG InitPart1 + 62 +256 +370 +-1 + 6 +ByLayer +100 +AcDbEntity +100 +AcDbHatch + 10 +0.0 + 20 +0.0 + 30 +0.0 +210 +0.0 +220 +0.0 +230 +1.0 + 2 +SOLID + 70 +1 + 71 +0 + 91 +1 + 92 +1 + 93 +8 + 72 +1 + 10 +0.0 + 20 +0.0 + 11 +50.0 + 21 +80.0 + 72 +1 + 10 +50.0 + 20 +80.0 + 11 +90.0 + 21 +-10.0 + 72 +1 + 10 +90.0 + 20 +-10.0 + 11 +180.0 + 21 +-10.0 + 72 +1 + 10 +180.0 + 20 +-10.0 + 11 +220.0 + 21 +60.0 + 72 +1 + 10 +220.0 + 20 +60.0 + 11 +240.0 + 21 +-60.0 + 72 +1 + 10 +240.0 + 20 +-60.0 + 11 +140.0 + 21 +-70.0 + 72 +1 + 10 +140.0 + 20 +-70.0 + 11 +60.0 + 21 +-70.0 + 72 +1 + 10 +60.0 + 20 +-70.0 + 11 +0.0 + 21 +0.0 + 97 +0 + 75 +0 + 76 +1 + 98 +0 + 0 +HATCH + 5 +17B + 8 +1-UGrid DG InitPart1 + 62 +256 +370 +-1 + 6 +ByLayer +100 +AcDbEntity +100 +AcDbHatch + 10 +0.0 + 20 +0.0 + 30 +0.0 +210 +0.0 +220 +0.0 +230 +1.0 + 2 +SOLID + 70 +1 + 71 +0 + 91 +1 + 92 +1 + 93 +7 + 72 +1 + 10 +50.0 + 20 +80.0 + 11 +130.0 + 21 +150.0 + 72 +1 + 10 +130.0 + 20 +150.0 + 11 +200.0 + 21 +120.0 + 72 +1 + 10 +200.0 + 20 +120.0 + 11 +220.0 + 21 +60.0 + 72 +1 + 10 +220.0 + 20 +60.0 + 11 +180.0000175342504178 + 21 +74.9999934246560969 + 72 +1 + 10 +180.0000175342504178 + 20 +74.9999934246560969 + 11 +140.0 + 21 +90.0 + 72 +1 + 10 +140.0 + 20 +90.0 + 11 +95.2752319396871599 + 21 +85.0305813266319177 + 72 +1 + 10 +95.2752319396871599 + 20 +85.0305813266319177 + 11 +50.0 + 21 +80.0 + 97 +0 + 75 +0 + 76 +1 + 98 +0 + 0 +HATCH + 5 +17C + 8 +1-DGraph InitPart2 + 62 +256 +370 +-1 + 6 +ByLayer +100 +AcDbEntity +100 +AcDbHatch + 10 +0.0 + 20 +0.0 + 30 +0.0 +210 +0.0 +220 +0.0 +230 +1.0 + 2 +SOLID + 70 +1 + 71 +0 + 91 +1 + 92 +1 + 93 +10 + 72 +2 + 10 +181.2827542701893435 + 20 +18.9985228384989568 + 40 +7.2874765306784965 + 50 +0.0 + 51 +360.0 + 73 +1 + 72 +2 + 10 +113.7549283045438813 + 20 +7.6683506966121229 + 40 +7.2874765306784965 + 50 +0.0 + 51 +360.0 + 73 +1 + 72 +2 + 10 +91.0945840207701991 + 20 +22.6241779239027494 + 40 +7.2874765306784965 + 50 +0.0 + 51 +360.0 + 73 +1 + 72 +2 + 10 +179.4699267274874614 + 20 +48.4569704074047252 + 40 +7.2874765306784965 + 50 +0.0 + 51 +360.0 + 73 +1 + 72 +2 + 10 +202.1302710112611294 + 20 +53.8954530355103998 + 40 +7.2874765306784965 + 50 +0.0 + 51 +360.0 + 73 +1 + 72 +2 + 10 +158.1692031007402761 + 20 +6.7619369252611818 + 40 +7.2874765306784965 + 50 +0.0 + 51 +360.0 + 73 +1 + 72 +2 + 10 +136.4152725883175776 + 20 +23.5305916952536904 + 40 +7.2874765306784965 + 50 +0.0 + 51 +360.0 + 73 +1 + 72 +2 + 10 +138.2281001310194597 + 20 +55.255073692536854 + 40 +7.2874765306784965 + 50 +0.0 + 51 +360.0 + 73 +1 + 72 +2 + 10 +162.2480650718194397 + 20 +67.4916596057746005 + 40 +7.2874765306784965 + 50 +0.0 + 51 +360.0 + 73 +1 + 72 +2 + 10 +115.5677558472457633 + 20 +71.5705215768539063 + 40 +7.2874765306784965 + 50 +0.0 + 51 +360.0 + 73 +1 + 97 +0 + 75 +0 + 76 +1 + 98 +0 + 0 +HATCH + 5 +17D + 8 +1-DGraph InitPart2 + 62 +256 +370 +-1 + 6 +ByLayer +100 +AcDbEntity +100 +AcDbHatch + 10 +0.0 + 20 +0.0 + 30 +0.0 +210 +0.0 +220 +0.0 +230 +1.0 + 2 +SOLID + 70 +1 + 71 +0 + 91 +1 + 92 +1 + 93 +2 + 72 +2 + 10 +94.2670322204983933 + 20 +55.8350883152182789 + 40 +7.2874765306784965 + 50 +0.0 + 51 +360.0 + 73 +1 + 72 +2 + 10 +70.2470672796984132 + 20 +67.9448664914501137 + 40 +7.2874765306784965 + 50 +0.0 + 51 +360.0 + 73 +1 + 97 +0 + 75 +0 + 76 +1 + 98 +0 + 0 +HATCH + 5 +17E + 8 +1-DGraph InitPart1 + 62 +256 +370 +-1 + 6 +ByLayer +100 +AcDbEntity +100 +AcDbHatch + 10 +0.0 + 20 +0.0 + 30 +0.0 +210 +0.0 +220 +0.0 +230 +1.0 + 2 +SOLID + 70 +1 + 71 +0 + 91 +1 + 92 +1 + 93 +1 + 72 +2 + 10 +136.4152725883174639 + 20 +-29.0414070431012306 + 40 +7.2874765306784965 + 50 +0.0 + 51 +360.0 + 73 +1 + 97 +0 + 75 +0 + 76 +1 + 98 +0 + 0 +HATCH + 5 +17F + 8 +1-DGraph InitPart1 + 62 +256 +370 +-1 + 6 +ByLayer +100 +AcDbEntity +100 +AcDbHatch + 10 +0.0 + 20 +0.0 + 30 +0.0 +210 +0.0 +220 +0.0 +230 +1.0 + 2 +SOLID + 70 +1 + 71 +0 + 91 +1 + 92 +1 + 93 +1 + 72 +2 + 10 +158.1692031007402193 + 20 +-21.3368899866181749 + 40 +7.2874765306784965 + 50 +0.0 + 51 +360.0 + 73 +1 + 97 +0 + 75 +0 + 76 +1 + 98 +0 + 0 +HATCH + 5 +180 + 8 +1-DGraph InitPart1 + 62 +256 +370 +-1 + 6 +ByLayer +100 +AcDbEntity +100 +AcDbHatch + 10 +0.0 + 20 +0.0 + 30 +0.0 +210 +0.0 +220 +0.0 +230 +1.0 + 2 +SOLID + 70 +1 + 71 +0 + 91 +1 + 92 +1 + 93 +1 + 72 +2 + 10 +138.6813070166948307 + 20 +-51.2485444411994138 + 40 +7.2874765306784965 + 50 +0.0 + 51 +360.0 + 73 +1 + 97 +0 + 75 +0 + 76 +1 + 98 +0 + 0 +HATCH + 5 +181 + 8 +1-DGraph InitPart1 + 62 +256 +370 +-1 + 6 +ByLayer +100 +AcDbEntity +100 +AcDbHatch + 10 +0.0 + 20 +0.0 + 30 +0.0 +210 +0.0 +220 +0.0 +230 +1.0 + 2 +SOLID + 70 +1 + 71 +0 + 91 +1 + 92 +1 + 93 +1 + 72 +2 + 10 +114.2081351902192807 + 20 +-21.3368899866181749 + 40 +7.2874765306784965 + 50 +0.0 + 51 +360.0 + 73 +1 + 97 +0 + 75 +0 + 76 +1 + 98 +0 + 0 +HATCH + 5 +182 + 8 +1-DGraph InitPart1 + 62 +256 +370 +-1 + 6 +ByLayer +100 +AcDbEntity +100 +AcDbHatch + 10 +0.0 + 20 +0.0 + 30 +0.0 +210 +0.0 +220 +0.0 +230 +1.0 + 2 +SOLID + 70 +1 + 71 +0 + 91 +1 + 92 +1 + 93 +1 + 72 +2 + 10 +46.6803092245737332 + 20 +22.624177923902721 + 40 +7.2874765306784965 + 50 +0.0 + 51 +360.0 + 73 +1 + 97 +0 + 75 +0 + 76 +1 + 98 +0 + 0 +HATCH + 5 +183 + 8 +1-DGraph InitPart1 + 62 +256 +370 +-1 + 6 +ByLayer +100 +AcDbEntity +100 +AcDbHatch + 10 +0.0 + 20 +0.0 + 30 +0.0 +210 +0.0 +220 +0.0 +230 +1.0 + 2 +SOLID + 70 +1 + 71 +0 + 91 +1 + 92 +1 + 93 +1 + 72 +2 + 10 +110.1292732191399608 + 20 +106.9206586595407487 + 40 +7.2874765306784965 + 50 +0.0 + 51 +360.0 + 73 +1 + 97 +0 + 75 +0 + 76 +1 + 98 +0 + 0 +HATCH + 5 +184 + 8 +1-DGraph InitPart1 + 62 +256 +370 +-1 + 6 +ByLayer +100 +AcDbEntity +100 +AcDbHatch + 10 +0.0 + 20 +0.0 + 30 +0.0 +210 +0.0 +220 +0.0 +230 +1.0 + 2 +SOLID + 70 +1 + 71 +0 + 91 +1 + 92 +1 + 93 +1 + 72 +2 + 10 +155.9031686723627672 + 20 +118.7040376871030105 + 40 +7.2874765306784965 + 50 +0.0 + 51 +360.0 + 73 +1 + 97 +0 + 75 +0 + 76 +1 + 98 +0 + 0 +HATCH + 5 +185 + 8 +1-DGraph InitPart1 + 62 +256 +370 +-1 + 6 +ByLayer +100 +AcDbEntity +100 +AcDbHatch + 10 +0.0 + 20 +0.0 + 30 +0.0 +210 +0.0 +220 +0.0 +230 +1.0 + 2 +SOLID + 70 +1 + 71 +0 + 91 +1 + 92 +1 + 93 +1 + 72 +2 + 10 +188.5340644409968149 + 20 +91.0584176608991527 + 40 +7.2874765306784965 + 50 +0.0 + 51 +360.0 + 73 +1 + 97 +0 + 75 +0 + 76 +1 + 98 +0 + 0 +HATCH + 5 +186 + 8 +1-DGraph InitPart1 + 62 +256 +370 +-1 + 6 +ByLayer +100 +AcDbEntity +100 +AcDbHatch + 10 +0.0 + 20 +0.0 + 30 +0.0 +210 +0.0 +220 +0.0 +230 +1.0 + 2 +SOLID + 70 +1 + 71 +0 + 91 +1 + 92 +1 + 93 +1 + 72 +2 + 10 +209.8347880677440287 + 20 +-2.3022007882482916 + 40 +7.2874765306784965 + 50 +0.0 + 51 +360.0 + 73 +1 + 97 +0 + 75 +0 + 76 +1 + 98 +0 + 0 +HATCH + 5 +187 + 8 +1-DGraph InitPart1 + 62 +256 +370 +-1 + 6 +ByLayer +100 +AcDbEntity +100 +AcDbHatch + 10 +0.0 + 20 +0.0 + 30 +0.0 +210 +0.0 +220 +0.0 +230 +1.0 + 2 +SOLID + 70 +1 + 71 +0 + 91 +1 + 92 +1 + 93 +1 + 72 +2 + 10 +185.3616162412685071 + 20 +-43.544027384716351 + 40 +7.2874765306784965 + 50 +0.0 + 51 +360.0 + 73 +1 + 97 +0 + 75 +0 + 76 +1 + 98 +0 + 0 +HATCH + 5 +188 + 8 +1-DGraph InitPart1 + 62 +256 +370 +-1 + 6 +ByLayer +100 +AcDbEntity +100 +AcDbHatch + 10 +0.0 + 20 +0.0 + 30 +0.0 +210 +0.0 +220 +0.0 +230 +1.0 + 2 +SOLID + 70 +1 + 71 +0 + 91 +1 + 92 +1 + 93 +1 + 72 +2 + 10 +95.6266528775248332 + 20 +-47.6228893557956141 + 40 +7.2874765306784965 + 50 +0.0 + 51 +360.0 + 73 +1 + 97 +0 + 75 +0 + 76 +1 + 98 +0 + 0 +HATCH + 5 +189 + 8 +1-DGraph InitPart1 + 62 +256 +370 +-1 + 6 +ByLayer +100 +AcDbEntity +100 +AcDbHatch + 10 +0.0 + 20 +0.0 + 30 +0.0 +210 +0.0 +220 +0.0 +230 +1.0 + 2 +SOLID + 70 +1 + 71 +0 + 91 +1 + 92 +1 + 93 +1 + 72 +2 + 10 +52.5719987383548784 + 20 +-28.134993271750254 + 40 +7.2874765306784965 + 50 +0.0 + 51 +360.0 + 73 +1 + 97 +0 + 75 +0 + 76 +1 + 98 +0 + 0 +HATCH + 5 +18A + 8 +1-UGrid NGraph Part1 + 62 +256 +370 +-1 + 6 +ByLayer +100 +AcDbEntity +100 +AcDbHatch + 10 +0.0 + 20 +0.0 + 30 +0.0 +210 +0.0 +220 +0.0 +230 +1.0 + 2 +SOLID + 70 +1 + 71 +0 + 91 +1 + 92 +1 + 93 +8 + 72 +1 + 10 +0.0 + 20 +0.0 + 11 +50.0 + 21 +80.0 + 72 +1 + 10 +50.0 + 20 +80.0 + 11 +130.0 + 21 +150.0 + 72 +1 + 10 +130.0 + 20 +150.0 + 11 +200.0 + 21 +120.0 + 72 +1 + 10 +200.0 + 20 +120.0 + 11 +140.0 + 21 +90.0 + 72 +1 + 10 +140.0 + 20 +90.0 + 11 +115.0000891911591054 + 21 +40.0001783823182038 + 72 +1 + 10 +115.0000891911591054 + 20 +40.0001783823181967 + 11 +90.0 + 21 +-10.0 + 72 +1 + 10 +90.0 + 20 +-10.0 + 11 +60.0 + 21 +-70.0 + 72 +1 + 10 +60.0 + 20 +-70.0 + 11 +0.0 + 21 +0.0 + 97 +0 + 75 +0 + 76 +1 + 98 +0 + 0 +HATCH + 5 +18B + 8 +1-UGrid NGraph Part2 + 62 +256 +370 +-1 + 6 +ByLayer +100 +AcDbEntity +100 +AcDbHatch + 10 +0.0 + 20 +0.0 + 30 +0.0 +210 +0.0 +220 +0.0 +230 +1.0 + 2 +SOLID + 70 +1 + 71 +0 + 91 +1 + 92 +1 + 93 +7 + 72 +1 + 10 +140.0 + 20 +-70.0 + 11 +240.0 + 21 +-60.0 + 72 +1 + 10 +240.0 + 20 +-60.0 + 11 +220.0 + 21 +60.0 + 72 +1 + 10 +220.0 + 20 +60.0 + 11 +180.0000175342504178 + 21 +74.9999934246560969 + 72 +1 + 10 +180.0000175342504178 + 20 +74.9999934246560827 + 11 +159.9999450076830101 + 21 +40.0001374807924535 + 72 +1 + 10 +159.9999450076830101 + 20 +40.0001374807924535 + 11 +135.0 + 21 +-10.0 + 72 +1 + 10 +135.0 + 20 +-10.0 + 11 +114.9999989626024757 + 21 +-39.9999987551229665 + 72 +1 + 10 +114.9999989626024757 + 20 +-39.9999987551229736 + 11 +140.0 + 21 +-70.0 + 97 +0 + 75 +0 + 76 +1 + 98 +0 + 0 +HATCH + 5 +18C + 8 +1-DGraph Part2 + 62 +256 +370 +-1 + 6 +ByLayer +100 +AcDbEntity +100 +AcDbHatch + 10 +0.0 + 20 +0.0 + 30 +0.0 +210 +0.0 +220 +0.0 +230 +1.0 + 2 +SOLID + 70 +1 + 71 +0 + 91 +1 + 92 +1 + 93 +1 + 72 +2 + 10 +155.9031686723627672 + 20 +118.7040376871030105 + 40 +7.2874765306784965 + 50 +0.0 + 51 +360.0 + 73 +1 + 97 +0 + 75 +0 + 76 +1 + 98 +0 + 0 +HATCH + 5 +18D + 8 +1-DGraph Part2 + 62 +256 +370 +-1 + 6 +ByLayer +100 +AcDbEntity +100 +AcDbHatch + 10 +0.0 + 20 +0.0 + 30 +0.0 +210 +0.0 +220 +0.0 +230 +1.0 + 2 +SOLID + 70 +1 + 71 +0 + 91 +1 + 92 +1 + 93 +1 + 72 +2 + 10 +188.5340644409968149 + 20 +91.0584176608991527 + 40 +7.2874765306784965 + 50 +0.0 + 51 +360.0 + 73 +1 + 97 +0 + 75 +0 + 76 +1 + 98 +0 + 0 +HATCH + 5 +18E + 8 +1-DGraph Part2 + 62 +256 +370 +-1 + 6 +ByLayer +100 +AcDbEntity +100 +AcDbHatch + 10 +0.0 + 20 +0.0 + 30 +0.0 +210 +0.0 +220 +0.0 +230 +1.0 + 2 +SOLID + 70 +1 + 71 +0 + 91 +1 + 92 +1 + 93 +1 + 72 +2 + 10 +162.2480650718194397 + 20 +67.4916596057746005 + 40 +7.2874765306784965 + 50 +0.0 + 51 +360.0 + 73 +1 + 97 +0 + 75 +0 + 76 +1 + 98 +0 + 0 +HATCH + 5 +18F + 8 +1-DGraph Part2 + 62 +256 +370 +-1 + 6 +ByLayer +100 +AcDbEntity +100 +AcDbHatch + 10 +0.0 + 20 +0.0 + 30 +0.0 +210 +0.0 +220 +0.0 +230 +1.0 + 2 +SOLID + 70 +1 + 71 +0 + 91 +1 + 92 +1 + 93 +1 + 72 +2 + 10 +202.1302710112611294 + 20 +53.8954530355103998 + 40 +7.2874765306784965 + 50 +0.0 + 51 +360.0 + 73 +1 + 97 +0 + 75 +0 + 76 +1 + 98 +0 + 0 +HATCH + 5 +190 + 8 +1-DGraph Part2 + 62 +256 +370 +-1 + 6 +ByLayer +100 +AcDbEntity +100 +AcDbHatch + 10 +0.0 + 20 +0.0 + 30 +0.0 +210 +0.0 +220 +0.0 +230 +1.0 + 2 +SOLID + 70 +1 + 71 +0 + 91 +1 + 92 +1 + 93 +1 + 72 +2 + 10 +179.4699267274874614 + 20 +48.4569704074047252 + 40 +7.2874765306784965 + 50 +0.0 + 51 +360.0 + 73 +1 + 97 +0 + 75 +0 + 76 +1 + 98 +0 + 0 +HATCH + 5 +191 + 8 +1-DGraph Part2 + 62 +256 +370 +-1 + 6 +ByLayer +100 +AcDbEntity +100 +AcDbHatch + 10 +0.0 + 20 +0.0 + 30 +0.0 +210 +0.0 +220 +0.0 +230 +1.0 + 2 +SOLID + 70 +1 + 71 +0 + 91 +1 + 92 +1 + 93 +1 + 72 +2 + 10 +138.2281001310194597 + 20 +55.255073692536854 + 40 +7.2874765306784965 + 50 +0.0 + 51 +360.0 + 73 +1 + 97 +0 + 75 +0 + 76 +1 + 98 +0 + 0 +HATCH + 5 +192 + 8 +1-DGraph Part2 + 62 +256 +370 +-1 + 6 +ByLayer +100 +AcDbEntity +100 +AcDbHatch + 10 +0.0 + 20 +0.0 + 30 +0.0 +210 +0.0 +220 +0.0 +230 +1.0 + 2 +SOLID + 70 +1 + 71 +0 + 91 +1 + 92 +1 + 93 +1 + 72 +2 + 10 +136.4152725883175776 + 20 +23.5305916952536904 + 40 +7.2874765306784965 + 50 +0.0 + 51 +360.0 + 73 +1 + 97 +0 + 75 +0 + 76 +1 + 98 +0 + 0 +HATCH + 5 +193 + 8 +1-DGraph Part2 + 62 +256 +370 +-1 + 6 +ByLayer +100 +AcDbEntity +100 +AcDbHatch + 10 +0.0 + 20 +0.0 + 30 +0.0 +210 +0.0 +220 +0.0 +230 +1.0 + 2 +SOLID + 70 +1 + 71 +0 + 91 +1 + 92 +1 + 93 +1 + 72 +2 + 10 +181.2827542701893435 + 20 +18.9985228384989568 + 40 +7.2874765306784965 + 50 +0.0 + 51 +360.0 + 73 +1 + 97 +0 + 75 +0 + 76 +1 + 98 +0 + 0 +HATCH + 5 +194 + 8 +1-DGraph Part2 + 62 +256 +370 +-1 + 6 +ByLayer +100 +AcDbEntity +100 +AcDbHatch + 10 +0.0 + 20 +0.0 + 30 +0.0 +210 +0.0 +220 +0.0 +230 +1.0 + 2 +SOLID + 70 +1 + 71 +0 + 91 +1 + 92 +1 + 93 +1 + 72 +2 + 10 +158.1692031007402761 + 20 +6.7619369252611818 + 40 +7.2874765306784965 + 50 +0.0 + 51 +360.0 + 73 +1 + 97 +0 + 75 +0 + 76 +1 + 98 +0 + 0 +HATCH + 5 +195 + 8 +1-DGraph Part2 + 62 +256 +370 +-1 + 6 +ByLayer +100 +AcDbEntity +100 +AcDbHatch + 10 +0.0 + 20 +0.0 + 30 +0.0 +210 +0.0 +220 +0.0 +230 +1.0 + 2 +SOLID + 70 +1 + 71 +0 + 91 +1 + 92 +1 + 93 +1 + 72 +2 + 10 +209.8347880677440287 + 20 +-2.3022007882482916 + 40 +7.2874765306784965 + 50 +0.0 + 51 +360.0 + 73 +1 + 97 +0 + 75 +0 + 76 +1 + 98 +0 + 0 +HATCH + 5 +196 + 8 +1-DGraph Part2 + 62 +256 +370 +-1 + 6 +ByLayer +100 +AcDbEntity +100 +AcDbHatch + 10 +0.0 + 20 +0.0 + 30 +0.0 +210 +0.0 +220 +0.0 +230 +1.0 + 2 +SOLID + 70 +1 + 71 +0 + 91 +1 + 92 +1 + 93 +1 + 72 +2 + 10 +185.3616162412685071 + 20 +-43.544027384716351 + 40 +7.2874765306784965 + 50 +0.0 + 51 +360.0 + 73 +1 + 97 +0 + 75 +0 + 76 +1 + 98 +0 + 0 +HATCH + 5 +197 + 8 +1-DGraph Part2 + 62 +256 +370 +-1 + 6 +ByLayer +100 +AcDbEntity +100 +AcDbHatch + 10 +0.0 + 20 +0.0 + 30 +0.0 +210 +0.0 +220 +0.0 +230 +1.0 + 2 +SOLID + 70 +1 + 71 +0 + 91 +1 + 92 +1 + 93 +1 + 72 +2 + 10 +158.1692031007402193 + 20 +-21.3368899866181749 + 40 +7.2874765306784965 + 50 +0.0 + 51 +360.0 + 73 +1 + 97 +0 + 75 +0 + 76 +1 + 98 +0 + 0 +HATCH + 5 +198 + 8 +1-DGraph Part1 + 62 +256 +370 +-1 + 6 +ByLayer +100 +AcDbEntity +100 +AcDbHatch + 10 +0.0 + 20 +0.0 + 30 +0.0 +210 +0.0 +220 +0.0 +230 +1.0 + 2 +SOLID + 70 +1 + 71 +0 + 91 +1 + 92 +1 + 93 +1 + 72 +2 + 10 +110.1292732191399608 + 20 +106.9206586595407487 + 40 +7.2874765306784965 + 50 +0.0 + 51 +360.0 + 73 +1 + 97 +0 + 75 +0 + 76 +1 + 98 +0 + 0 +HATCH + 5 +199 + 8 +1-DGraph Part1 + 62 +256 +370 +-1 + 6 +ByLayer +100 +AcDbEntity +100 +AcDbHatch + 10 +0.0 + 20 +0.0 + 30 +0.0 +210 +0.0 +220 +0.0 +230 +1.0 + 2 +SOLID + 70 +1 + 71 +0 + 91 +1 + 92 +1 + 93 +1 + 72 +2 + 10 +115.5677558472457633 + 20 +71.5705215768539063 + 40 +7.2874765306784965 + 50 +0.0 + 51 +360.0 + 73 +1 + 97 +0 + 75 +0 + 76 +1 + 98 +0 + 0 +HATCH + 5 +19A + 8 +1-DGraph Part1 + 62 +256 +370 +-1 + 6 +ByLayer +100 +AcDbEntity +100 +AcDbHatch + 10 +0.0 + 20 +0.0 + 30 +0.0 +210 +0.0 +220 +0.0 +230 +1.0 + 2 +SOLID + 70 +1 + 71 +0 + 91 +1 + 92 +1 + 93 +1 + 72 +2 + 10 +70.2470672796984132 + 20 +67.9448664914501137 + 40 +7.2874765306784965 + 50 +0.0 + 51 +360.0 + 73 +1 + 97 +0 + 75 +0 + 76 +1 + 98 +0 + 0 +HATCH + 5 +19B + 8 +1-DGraph Part1 + 62 +256 +370 +-1 + 6 +ByLayer +100 +AcDbEntity +100 +AcDbHatch + 10 +0.0 + 20 +0.0 + 30 +0.0 +210 +0.0 +220 +0.0 +230 +1.0 + 2 +SOLID + 70 +1 + 71 +0 + 91 +1 + 92 +1 + 93 +1 + 72 +2 + 10 +94.2670322204983933 + 20 +55.8350883152182789 + 40 +7.2874765306784965 + 50 +0.0 + 51 +360.0 + 73 +1 + 97 +0 + 75 +0 + 76 +1 + 98 +0 + 0 +HATCH + 5 +19C + 8 +1-DGraph Part1 + 62 +256 +370 +-1 + 6 +ByLayer +100 +AcDbEntity +100 +AcDbHatch + 10 +0.0 + 20 +0.0 + 30 +0.0 +210 +0.0 +220 +0.0 +230 +1.0 + 2 +SOLID + 70 +1 + 71 +0 + 91 +1 + 92 +1 + 93 +1 + 72 +2 + 10 +46.6803092245737332 + 20 +22.624177923902721 + 40 +7.2874765306784965 + 50 +0.0 + 51 +360.0 + 73 +1 + 97 +0 + 75 +0 + 76 +1 + 98 +0 + 0 +HATCH + 5 +19D + 8 +1-DGraph Part1 + 62 +256 +370 +-1 + 6 +ByLayer +100 +AcDbEntity +100 +AcDbHatch + 10 +0.0 + 20 +0.0 + 30 +0.0 +210 +0.0 +220 +0.0 +230 +1.0 + 2 +SOLID + 70 +1 + 71 +0 + 91 +1 + 92 +1 + 93 +1 + 72 +2 + 10 +91.0945840207701991 + 20 +22.6241779239027494 + 40 +7.2874765306784965 + 50 +0.0 + 51 +360.0 + 73 +1 + 97 +0 + 75 +0 + 76 +1 + 98 +0 + 0 +HATCH + 5 +19E + 8 +1-DGraph Part1 + 62 +256 +370 +-1 + 6 +ByLayer +100 +AcDbEntity +100 +AcDbHatch + 10 +0.0 + 20 +0.0 + 30 +0.0 +210 +0.0 +220 +0.0 +230 +1.0 + 2 +SOLID + 70 +1 + 71 +0 + 91 +1 + 92 +1 + 93 +1 + 72 +2 + 10 +113.7549283045438813 + 20 +7.6683506966121229 + 40 +7.2874765306784965 + 50 +0.0 + 51 +360.0 + 73 +1 + 97 +0 + 75 +0 + 76 +1 + 98 +0 + 0 +HATCH + 5 +19F + 8 +1-DGraph Part1 + 62 +256 +370 +-1 + 6 +ByLayer +100 +AcDbEntity +100 +AcDbHatch + 10 +0.0 + 20 +0.0 + 30 +0.0 +210 +0.0 +220 +0.0 +230 +1.0 + 2 +SOLID + 70 +1 + 71 +0 + 91 +1 + 92 +1 + 93 +1 + 72 +2 + 10 +114.2081351902192807 + 20 +-21.3368899866181749 + 40 +7.2874765306784965 + 50 +0.0 + 51 +360.0 + 73 +1 + 97 +0 + 75 +0 + 76 +1 + 98 +0 + 0 +HATCH + 5 +1A0 + 8 +1-DGraph Part1 + 62 +256 +370 +-1 + 6 +ByLayer +100 +AcDbEntity +100 +AcDbHatch + 10 +0.0 + 20 +0.0 + 30 +0.0 +210 +0.0 +220 +0.0 +230 +1.0 + 2 +SOLID + 70 +1 + 71 +0 + 91 +1 + 92 +1 + 93 +1 + 72 +2 + 10 +136.4152725883174639 + 20 +-29.0414070431012306 + 40 +7.2874765306784965 + 50 +0.0 + 51 +360.0 + 73 +1 + 97 +0 + 75 +0 + 76 +1 + 98 +0 + 0 +HATCH + 5 +1A1 + 8 +1-DGraph Part1 + 62 +256 +370 +-1 + 6 +ByLayer +100 +AcDbEntity +100 +AcDbHatch + 10 +0.0 + 20 +0.0 + 30 +0.0 +210 +0.0 +220 +0.0 +230 +1.0 + 2 +SOLID + 70 +1 + 71 +0 + 91 +1 + 92 +1 + 93 +1 + 72 +2 + 10 +138.6813070166948307 + 20 +-51.2485444411994138 + 40 +7.2874765306784965 + 50 +0.0 + 51 +360.0 + 73 +1 + 97 +0 + 75 +0 + 76 +1 + 98 +0 + 0 +HATCH + 5 +1A2 + 8 +1-DGraph Part1 + 62 +256 +370 +-1 + 6 +ByLayer +100 +AcDbEntity +100 +AcDbHatch + 10 +0.0 + 20 +0.0 + 30 +0.0 +210 +0.0 +220 +0.0 +230 +1.0 + 2 +SOLID + 70 +1 + 71 +0 + 91 +1 + 92 +1 + 93 +1 + 72 +2 + 10 +95.6266528775248332 + 20 +-47.6228893557956141 + 40 +7.2874765306784965 + 50 +0.0 + 51 +360.0 + 73 +1 + 97 +0 + 75 +0 + 76 +1 + 98 +0 + 0 +HATCH + 5 +1A3 + 8 +1-DGraph Part1 + 62 +256 +370 +-1 + 6 +ByLayer +100 +AcDbEntity +100 +AcDbHatch + 10 +0.0 + 20 +0.0 + 30 +0.0 +210 +0.0 +220 +0.0 +230 +1.0 + 2 +SOLID + 70 +1 + 71 +0 + 91 +1 + 92 +1 + 93 +1 + 72 +2 + 10 +52.5719987383548784 + 20 +-28.134993271750254 + 40 +7.2874765306784965 + 50 +0.0 + 51 +360.0 + 73 +1 + 97 +0 + 75 +0 + 76 +1 + 98 +0 + 0 +HATCH + 5 +1A4 + 8 +1-NGraph Part 2 + 62 +256 +370 +-1 + 6 +ByLayer +100 +AcDbEntity +100 +AcDbHatch + 10 +0.0 + 20 +0.0 + 30 +0.0 +210 +0.0 +220 +0.0 +230 +1.0 + 2 +SOLID + 70 +1 + 71 +0 + 91 +1 + 92 +1 + 93 +1 + 72 +2 + 10 +140.0 + 20 +-70.0 + 40 +7.25 + 50 +0.0 + 51 +360.0 + 73 +1 + 97 +0 + 75 +0 + 76 +1 + 98 +0 + 0 +HATCH + 5 +1A5 + 8 +1-NGraph Part 2 + 62 +256 +370 +-1 + 6 +ByLayer +100 +AcDbEntity +100 +AcDbHatch + 10 +0.0 + 20 +0.0 + 30 +0.0 +210 +0.0 +220 +0.0 +230 +1.0 + 2 +SOLID + 70 +1 + 71 +0 + 91 +1 + 92 +1 + 93 +1 + 72 +2 + 10 +159.9997155749006197 + 20 +-40.0004266376490492 + 40 +7.25 + 50 +0.0 + 51 +360.0 + 73 +1 + 97 +0 + 75 +0 + 76 +1 + 98 +0 + 0 +HATCH + 5 +1A6 + 8 +1-NGraph Part 2 + 62 +256 +370 +-1 + 6 +ByLayer +100 +AcDbEntity +100 +AcDbHatch + 10 +0.0 + 20 +0.0 + 30 +0.0 +210 +0.0 +220 +0.0 +230 +1.0 + 2 +SOLID + 70 +1 + 71 +0 + 91 +1 + 92 +1 + 93 +1 + 72 +2 + 10 +114.9999989626024757 + 20 +-39.9999987551229665 + 40 +7.25 + 50 +0.0 + 51 +360.0 + 73 +1 + 97 +0 + 75 +0 + 76 +1 + 98 +0 + 0 +HATCH + 5 +1A7 + 8 +1-NGraph Part 2 + 62 +256 +370 +-1 + 6 +ByLayer +100 +AcDbEntity +100 +AcDbHatch + 10 +0.0 + 20 +0.0 + 30 +0.0 +210 +0.0 +220 +0.0 +230 +1.0 + 2 +SOLID + 70 +1 + 71 +0 + 91 +1 + 92 +1 + 93 +1 + 72 +2 + 10 +240.0 + 20 +-60.0 + 40 +7.25 + 50 +0.0 + 51 +360.0 + 73 +1 + 97 +0 + 75 +0 + 76 +1 + 98 +0 + 0 +HATCH + 5 +1A8 + 8 +1-NGraph Part 2 + 62 +256 +370 +-1 + 6 +ByLayer +100 +AcDbEntity +100 +AcDbHatch + 10 +0.0 + 20 +0.0 + 30 +0.0 +210 +0.0 +220 +0.0 +230 +1.0 + 2 +SOLID + 70 +1 + 71 +0 + 91 +1 + 92 +1 + 93 +1 + 72 +2 + 10 +180.0 + 20 +-10.0 + 40 +7.25 + 50 +0.0 + 51 +360.0 + 73 +1 + 97 +0 + 75 +0 + 76 +1 + 98 +0 + 0 +HATCH + 5 +1A9 + 8 +1-NGraph Part 2 + 62 +256 +370 +-1 + 6 +ByLayer +100 +AcDbEntity +100 +AcDbHatch + 10 +0.0 + 20 +0.0 + 30 +0.0 +210 +0.0 +220 +0.0 +230 +1.0 + 2 +SOLID + 70 +1 + 71 +0 + 91 +1 + 92 +1 + 93 +1 + 72 +2 + 10 +135.0 + 20 +-10.0 + 40 +7.25 + 50 +0.0 + 51 +360.0 + 73 +1 + 97 +0 + 75 +0 + 76 +1 + 98 +0 + 0 +HATCH + 5 +1AA + 8 +1-NGraph Part 2 + 62 +256 +370 +-1 + 6 +ByLayer +100 +AcDbEntity +100 +AcDbHatch + 10 +0.0 + 20 +0.0 + 30 +0.0 +210 +0.0 +220 +0.0 +230 +1.0 + 2 +SOLID + 70 +1 + 71 +0 + 91 +1 + 92 +1 + 93 +1 + 72 +2 + 10 +159.9999450076830385 + 20 +40.0001374807924819 + 40 +7.25 + 50 +0.0 + 51 +360.0 + 73 +1 + 97 +0 + 75 +0 + 76 +1 + 98 +0 + 0 +HATCH + 5 +1AB + 8 +1-NGraph Part 2 + 62 +256 +370 +-1 + 6 +ByLayer +100 +AcDbEntity +100 +AcDbHatch + 10 +0.0 + 20 +0.0 + 30 +0.0 +210 +0.0 +220 +0.0 +230 +1.0 + 2 +SOLID + 70 +1 + 71 +0 + 91 +1 + 92 +1 + 93 +1 + 72 +2 + 10 +220.0 + 20 +60.0 + 40 +7.25 + 50 +0.0 + 51 +360.0 + 73 +1 + 97 +0 + 75 +0 + 76 +1 + 98 +0 + 0 +HATCH + 5 +1AC + 8 +1-NGraph Part 2 + 62 +256 +370 +-1 + 6 +ByLayer +100 +AcDbEntity +100 +AcDbHatch + 10 +0.0 + 20 +0.0 + 30 +0.0 +210 +0.0 +220 +0.0 +230 +1.0 + 2 +SOLID + 70 +1 + 71 +0 + 91 +1 + 92 +1 + 93 +1 + 72 +2 + 10 +180.0000175342504178 + 20 +74.9999934246560969 + 40 +7.25 + 50 +0.0 + 51 +360.0 + 73 +1 + 97 +0 + 75 +0 + 76 +1 + 98 +0 + 0 +HATCH + 5 +1AD + 8 +1-UGrid DG Part2 + 62 +256 +370 +25 + 6 +ByLayer +100 +AcDbEntity +100 +AcDbHatch + 10 +0.0 + 20 +0.0 + 30 +0.0 +210 +0.0 +220 +0.0 +230 +1.0 + 2 +SOLID + 70 +1 + 71 +0 + 91 +1 + 92 +1 + 93 +9 + 72 +1 + 10 +140.0 + 20 +-70.0 + 11 +240.0 + 21 +-60.0 + 72 +1 + 10 +240.0 + 20 +-60.0 + 11 +220.0 + 21 +60.0 + 72 +1 + 10 +220.0 + 20 +60.0 + 11 +200.0 + 21 +120.0 + 72 +1 + 10 +200.0 + 20 +120.0 + 11 +130.0 + 21 +150.0 + 72 +1 + 10 +130.0 + 20 +150.0 + 11 +140.0 + 21 +90.0 + 72 +1 + 10 +140.0 + 20 +90.0 + 11 +115.0000891911591054 + 21 +40.0001783823182038 + 72 +1 + 10 +115.0000891911591054 + 20 +40.0001783823182038 + 11 +135.0 + 21 +-10.0 + 72 +1 + 10 +135.0 + 20 +-10.0 + 11 +159.9997155749006481 + 21 +-40.0004266376490492 + 72 +1 + 10 +159.9997155749006197 + 20 +-40.0004266376490492 + 11 +140.0 + 21 +-70.0 + 97 +0 + 75 +0 + 76 +1 + 98 +0 + 0 +HATCH + 5 +1AE + 8 +1-NGraph Part 1 + 62 +256 +370 +-1 + 6 +ByLayer +100 +AcDbEntity +100 +AcDbHatch + 10 +0.0 + 20 +0.0 + 30 +0.0 +210 +0.0 +220 +0.0 +230 +1.0 + 2 +SOLID + 70 +1 + 71 +0 + 91 +1 + 92 +1 + 93 +1 + 72 +2 + 10 +200.0 + 20 +120.0 + 40 +7.25 + 50 +0.0 + 51 +360.0 + 73 +1 + 97 +0 + 75 +0 + 76 +1 + 98 +0 + 0 +HATCH + 5 +1AF + 8 +1-NGraph Part 1 + 62 +256 +370 +-1 + 6 +ByLayer +100 +AcDbEntity +100 +AcDbHatch + 10 +0.0 + 20 +0.0 + 30 +0.0 +210 +0.0 +220 +0.0 +230 +1.0 + 2 +SOLID + 70 +1 + 71 +0 + 91 +1 + 92 +1 + 93 +1 + 72 +2 + 10 +130.0 + 20 +150.0 + 40 +7.25 + 50 +0.0 + 51 +360.0 + 73 +1 + 97 +0 + 75 +0 + 76 +1 + 98 +0 + 0 +HATCH + 5 +1B0 + 8 +1-NGraph Part 1 + 62 +256 +370 +-1 + 6 +ByLayer +100 +AcDbEntity +100 +AcDbHatch + 10 +0.0 + 20 +0.0 + 30 +0.0 +210 +0.0 +220 +0.0 +230 +1.0 + 2 +SOLID + 70 +1 + 71 +0 + 91 +1 + 92 +1 + 93 +1 + 72 +2 + 10 +140.0 + 20 +90.0 + 40 +7.25 + 50 +0.0 + 51 +360.0 + 73 +1 + 97 +0 + 75 +0 + 76 +1 + 98 +0 + 0 +HATCH + 5 +1B1 + 8 +1-NGraph Part 1 + 62 +256 +370 +-1 + 6 +ByLayer +100 +AcDbEntity +100 +AcDbHatch + 10 +0.0 + 20 +0.0 + 30 +0.0 +210 +0.0 +220 +0.0 +230 +1.0 + 2 +SOLID + 70 +1 + 71 +0 + 91 +1 + 92 +1 + 93 +1 + 72 +2 + 10 +95.2752319396871599 + 20 +85.0305813266319035 + 40 +7.25 + 50 +0.0 + 51 +360.0 + 73 +1 + 97 +0 + 75 +0 + 76 +1 + 98 +0 + 0 +HATCH + 5 +1B2 + 8 +1-NGraph Part 1 + 62 +256 +370 +-1 + 6 +ByLayer +100 +AcDbEntity +100 +AcDbHatch + 10 +0.0 + 20 +0.0 + 30 +0.0 +210 +0.0 +220 +0.0 +230 +1.0 + 2 +SOLID + 70 +1 + 71 +0 + 91 +1 + 92 +1 + 93 +1 + 72 +2 + 10 +115.0000891911591054 + 20 +40.0001783823182038 + 40 +7.25 + 50 +0.0 + 51 +360.0 + 73 +1 + 97 +0 + 75 +0 + 76 +1 + 98 +0 + 0 +HATCH + 5 +1B3 + 8 +1-NGraph Part 1 + 62 +256 +370 +-1 + 6 +ByLayer +100 +AcDbEntity +100 +AcDbHatch + 10 +0.0 + 20 +0.0 + 30 +0.0 +210 +0.0 +220 +0.0 +230 +1.0 + 2 +SOLID + 70 +1 + 71 +0 + 91 +1 + 92 +1 + 93 +1 + 72 +2 + 10 +50.0 + 20 +80.0 + 40 +7.25 + 50 +0.0 + 51 +360.0 + 73 +1 + 97 +0 + 75 +0 + 76 +1 + 98 +0 + 0 +HATCH + 5 +1B4 + 8 +1-NGraph Part 1 + 62 +256 +370 +-1 + 6 +ByLayer +100 +AcDbEntity +100 +AcDbHatch + 10 +0.0 + 20 +0.0 + 30 +0.0 +210 +0.0 +220 +0.0 +230 +1.0 + 2 +SOLID + 70 +1 + 71 +0 + 91 +1 + 92 +1 + 93 +1 + 72 +2 + 10 +90.0 + 20 +-10.0 + 40 +7.25 + 50 +0.0 + 51 +360.0 + 73 +1 + 97 +0 + 75 +0 + 76 +1 + 98 +0 + 0 +HATCH + 5 +1B5 + 8 +1-NGraph Part 1 + 62 +256 +370 +-1 + 6 +ByLayer +100 +AcDbEntity +100 +AcDbHatch + 10 +0.0 + 20 +0.0 + 30 +0.0 +210 +0.0 +220 +0.0 +230 +1.0 + 2 +SOLID + 70 +1 + 71 +0 + 91 +1 + 92 +1 + 93 +1 + 72 +2 + 10 +60.0 + 20 +-70.0 + 40 +7.25 + 50 +0.0 + 51 +360.0 + 73 +1 + 97 +0 + 75 +0 + 76 +1 + 98 +0 + 0 +HATCH + 5 +1B6 + 8 +1-NGraph Part 1 + 62 +256 +370 +-1 + 6 +ByLayer +100 +AcDbEntity +100 +AcDbHatch + 10 +0.0 + 20 +0.0 + 30 +0.0 +210 +0.0 +220 +0.0 +230 +1.0 + 2 +SOLID + 70 +1 + 71 +0 + 91 +1 + 92 +1 + 93 +1 + 72 +2 + 10 +0.0 + 20 +0.0 + 40 +7.25 + 50 +0.0 + 51 +360.0 + 73 +1 + 97 +0 + 75 +0 + 76 +1 + 98 +0 + 0 +HATCH + 5 +1B7 + 8 +1-UGrid DG Part1 + 62 +256 +370 +-1 + 6 +ByLayer +100 +AcDbEntity +100 +AcDbHatch + 10 +0.0 + 20 +0.0 + 30 +0.0 +210 +0.0 +220 +0.0 +230 +1.0 + 2 +SOLID + 70 +1 + 71 +0 + 91 +1 + 92 +1 + 93 +9 + 72 +1 + 10 +0.0 + 20 +0.0 + 11 +50.0 + 21 +80.0 + 72 +1 + 10 +50.0 + 20 +80.0 + 11 +130.0 + 21 +150.0 + 72 +1 + 10 +130.0 + 20 +150.0 + 11 +140.0 + 21 +90.0 + 72 +1 + 10 +140.0 + 20 +90.0 + 11 +115.0000891911591054 + 21 +40.0001783823182038 + 72 +1 + 10 +115.0000891911591054 + 20 +40.0001783823182038 + 11 +135.0 + 21 +-10.0 + 72 +1 + 10 +135.0 + 20 +-10.0 + 11 +159.9997155749006481 + 21 +-40.0004266376490492 + 72 +1 + 10 +159.9997155749006197 + 20 +-40.0004266376490492 + 11 +140.0 + 21 +-70.0 + 72 +1 + 10 +140.0 + 20 +-70.0 + 11 +60.0 + 21 +-70.0 + 72 +1 + 10 +60.0 + 20 +-70.0 + 11 +0.0 + 21 +0.0 + 97 +0 + 75 +0 + 76 +1 + 98 +0 + 0 +LINE + 5 +1B8 +100 +AcDbEntity +100 +AcDbLine + 8 +2 + 62 +256 +370 +-1 + 6 +ByLayer + 10 +137.5000391911498241 + 20 +40.0001579315352487 + 30 +0.0 + 11 +127.5000445955795527 + 21 +65.0000891911591054 + 31 +0.0 + 0 +LINE + 5 +1B9 +100 +AcDbEntity +100 +AcDbLine + 8 +2 + 62 +256 +370 +-1 + 6 +ByLayer + 10 +127.5000445955795527 + 20 +65.0000891911591054 + 30 +0.0 + 11 +149.9999725038415193 + 21 +65.0000687403962303 + 31 +0.0 + 0 +LINE + 5 +1BA +100 +AcDbEntity +100 +AcDbLine + 8 +2 + 62 +256 +370 +-1 + 6 +ByLayer + 10 +149.9999725038415193 + 20 +65.0000687403962303 + 30 +0.0 + 11 +137.5000391911498241 + 21 +40.0001579315352487 + 31 +0.0 + 0 +LINE + 5 +1BB +100 +AcDbEntity +100 +AcDbLine + 8 +2 + 62 +256 +370 +-1 + 6 +ByLayer + 10 +125.000040987657556 + 20 +15.000098211036514 + 30 +0.0 + 11 +137.5000391911498241 + 21 +40.0001579315352558 + 31 +0.0 + 0 +LINE + 5 +1BC +100 +AcDbEntity +100 +AcDbLine + 8 +2 + 62 +256 +370 +-1 + 6 +ByLayer + 10 +137.5000391911498241 + 20 +40.0001579315352558 + 30 +0.0 + 11 +147.4999729933480523 + 21 +15.0000697194141779 + 31 +0.0 + 0 +LINE + 5 +1BD +100 +AcDbEntity +100 +AcDbLine + 8 +2 + 62 +256 +370 +-1 + 6 +ByLayer + 10 +147.4999729933480523 + 20 +15.0000697194141779 + 30 +0.0 + 11 +125.000040987657556 + 21 +15.0000982110365175 + 31 +0.0 + 0 +LINE + 5 +1BE +100 +AcDbEntity +100 +AcDbLine + 8 +2 + 62 +256 +370 +-1 + 6 +ByLayer + 10 +102.5001337867386582 + 20 +15.0002675734773092 + 30 +0.0 + 11 +125.000040987657556 + 21 +15.000098211036514 + 31 +0.0 + 0 +LINE + 5 +1BF +100 +AcDbEntity +100 +AcDbLine + 8 +2 + 62 +256 +370 +-1 + 6 +ByLayer + 10 +125.000040987657556 + 20 +15.000098211036514 + 30 +0.0 + 11 +112.5 + 21 +-10.0 + 31 +0.0 + 0 +LINE + 5 +1C0 +100 +AcDbEntity +100 +AcDbLine + 8 +2 + 62 +256 +370 +-1 + 6 +ByLayer + 10 +112.5 + 20 +-10.0 + 30 +0.0 + 11 +102.5001337867386582 + 21 +15.0002675734773092 + 31 +0.0 + 0 +LINE + 5 +1C1 +100 +AcDbEntity +100 +AcDbLine + 8 +2 + 62 +256 +370 +-1 + 6 +ByLayer + 10 +102.5001337867386582 + 20 +15.0002675734773092 + 30 +0.0 + 11 +115.0000891911591054 + 21 +40.0001783823181967 + 31 +0.0 + 0 +LINE + 5 +1C2 +100 +AcDbEntity +100 +AcDbLine + 8 +2 + 62 +256 +370 +-1 + 6 +ByLayer + 10 +115.0000891911591054 + 20 +40.0001783823181967 + 30 +0.0 + 11 +125.000040987657556 + 21 +15.0000982110365051 + 31 +0.0 + 0 +LINE + 5 +1C3 +100 +AcDbEntity +100 +AcDbLine + 8 +2 + 62 +256 +370 +-1 + 6 +ByLayer + 10 +125.000040987657556 + 20 +15.0000982110365051 + 30 +0.0 + 11 +135.0 + 21 +-10.0 + 31 +0.0 + 0 +LINE + 5 +1C4 +100 +AcDbEntity +100 +AcDbLine + 8 +2 + 62 +256 +370 +-1 + 6 +ByLayer + 10 +135.0 + 20 +-10.0 + 30 +0.0 + 11 +112.5 + 21 +-10.0000000000000071 + 31 +0.0 + 0 +LINE + 5 +1C5 +100 +AcDbEntity +100 +AcDbLine + 8 +2 + 62 +256 +370 +-1 + 6 +ByLayer + 10 +112.5 + 20 +-10.0000000000000071 + 30 +0.0 + 11 +90.0 + 21 +-10.0 + 31 +0.0 + 0 +LINE + 5 +1C6 +100 +AcDbEntity +100 +AcDbLine + 8 +2 + 62 +256 +370 +-1 + 6 +ByLayer + 10 +90.0 + 20 +-10.0 + 30 +0.0 + 11 +102.5001337867386582 + 21 +15.0002675734773092 + 31 +0.0 + 0 +LINE + 5 +1C7 +100 +AcDbEntity +100 +AcDbLine + 8 +2 + 62 +256 +370 +-1 + 6 +ByLayer + 10 +135.0 + 20 +-10.0 + 30 +0.0 + 11 +147.4999729933480523 + 21 +15.0000697194141779 + 31 +0.0 + 0 +LINE + 5 +1C8 +100 +AcDbEntity +100 +AcDbLine + 8 +2 + 62 +256 +370 +-1 + 6 +ByLayer + 10 +147.4999729933480523 + 20 +15.0000697194141779 + 30 +0.0 + 11 +159.9999450076830101 + 21 +40.0001374807924535 + 31 +0.0 + 0 +LINE + 5 +1C9 +100 +AcDbEntity +100 +AcDbLine + 8 +2 + 62 +256 +370 +-1 + 6 +ByLayer + 10 +159.9999450076830101 + 20 +40.0001374807924535 + 30 +0.0 + 11 +137.5000391911498241 + 21 +40.0001579315352487 + 31 +0.0 + 0 +LINE + 5 +1CA +100 +AcDbEntity +100 +AcDbLine + 8 +2 + 62 +256 +370 +-1 + 6 +ByLayer + 10 +137.5000391911498241 + 20 +40.0001579315352487 + 30 +0.0 + 11 +115.0000891911591054 + 21 +40.0001783823182038 + 31 +0.0 + 0 +LINE + 5 +1CB +100 +AcDbEntity +100 +AcDbLine + 8 +2 + 62 +256 +370 +-1 + 6 +ByLayer + 10 +115.0000891911591054 + 20 +40.0001783823182038 + 30 +0.0 + 11 +127.5000445955795527 + 21 +65.0000891911591054 + 31 +0.0 + 0 +LINE + 5 +1CC +100 +AcDbEntity +100 +AcDbLine + 8 +2 + 62 +256 +370 +-1 + 6 +ByLayer + 10 +127.5000445955795527 + 20 +65.0000891911591054 + 30 +0.0 + 11 +140.0 + 21 +90.0 + 31 +0.0 + 0 +LINE + 5 +1CD +100 +AcDbEntity +100 +AcDbLine + 8 +2 + 62 +256 +370 +-1 + 6 +ByLayer + 10 +140.0 + 20 +90.0 + 30 +0.0 + 11 +149.9999725038414908 + 21 +65.0000687403962303 + 31 +0.0 + 0 +LINE + 5 +1CE +100 +AcDbEntity +100 +AcDbLine + 8 +2 + 62 +256 +370 +-1 + 6 +ByLayer + 10 +149.9999725038414908 + 20 +65.0000687403962303 + 30 +0.0 + 11 +159.9999450076830101 + 21 +40.0001374807924535 + 31 +0.0 + 0 +CIRCLE + 5 +1CF +100 +AcDbEntity +100 +AcDbCircle + 8 +1-DGraph + 62 +256 +370 +-1 + 6 +ByLayer + 10 +52.5719987383548784 + 20 +-28.134993271750254 + 30 +0.0 + 40 +7.2874765306784965 + 0 +CIRCLE + 5 +1D0 +100 +AcDbEntity +100 +AcDbCircle + 8 +1-DGraph + 62 +256 +370 +-1 + 6 +ByLayer + 10 +181.2827542701893435 + 20 +18.9985228384989568 + 30 +0.0 + 40 +7.2874765306784965 + 0 +LINE + 5 +1D1 +100 +AcDbEntity +100 +AcDbLine + 8 +1-DGraph + 62 +256 +370 +-1 + 6 +ByLayer + 10 +117.0663894873990358 + 20 +109.1530860527262945 + 30 +0.0 + 11 +148.7002692329466527 + 21 +117.5969903300089641 + 31 +0.0 + 0 +LINE + 5 +1D2 +100 +AcDbEntity +100 +AcDbLine + 8 +1-DGraph + 62 +256 +370 +-1 + 6 +ByLayer + 10 +161.0733551532779018 + 20 +113.5682333744610162 + 30 +0.0 + 11 +183.575801274210761 + 21 +96.3991049344701025 + 31 +0.0 + 0 +LINE + 5 +1D3 +100 +AcDbEntity +100 +AcDbLine + 8 +1-DGraph + 62 +256 +370 +-1 + 6 +ByLayer + 10 +111.4015211376070482 + 20 +99.7450960043097297 + 30 +0.0 + 11 +114.6096243571640798 + 21 +78.7947376750131951 + 31 +0.0 + 0 +LINE + 5 +1D4 +100 +AcDbEntity +100 +AcDbLine + 8 +1-DGraph + 62 +256 +370 +-1 + 6 +ByLayer + 10 +104.7580067637884156 + 20 +101.9955382700674988 + 30 +0.0 + 11 +73.4966925114486571 + 21 +74.4676918024915011 + 31 +0.0 + 0 +LINE + 5 +1D5 +100 +AcDbEntity +100 +AcDbLine + 8 +1-DGraph + 62 +256 +370 +-1 + 6 +ByLayer + 10 +76.1931188188140851 + 20 +63.7315797365080812 + 30 +0.0 + 11 +87.7164915187649541 + 21 +59.028476907313447 + 31 +0.0 + 0 +LINE + 5 +1D6 +100 +AcDbEntity +100 +AcDbLine + 8 +1-DGraph + 62 +256 +370 +-1 + 6 +ByLayer + 10 +99.9946576622824495 + 20 +60.3408203294217245 + 30 +0.0 + 11 +109.7743838396840061 + 21 +67.1496444051616521 + 31 +0.0 + 0 +LINE + 5 +1D7 +100 +AcDbEntity +100 +AcDbLine + 8 +1-DGraph + 62 +256 +370 +-1 + 6 +ByLayer + 10 +93.8672244689266648 + 20 +48.5585872366109896 + 30 +0.0 + 11 +91.9421374946896321 + 21 +29.8622002569739173 + 31 +0.0 + 0 +LINE + 5 +1D8 +100 +AcDbEntity +100 +AcDbLine + 8 +1-DGraph + 62 +256 +370 +-1 + 6 +ByLayer + 10 +83.8177055517509757 + 20 +23.0170569540308065 + 30 +0.0 + 11 +53.9557632499493138 + 21 +22.2057488261619973 + 31 +0.0 + 0 +LINE + 5 +1D9 +100 +AcDbEntity +100 +AcDbLine + 8 +1-DGraph + 62 +256 +370 +-1 + 6 +ByLayer + 10 +49.7188011688338634 + 20 +29.2479895825971461 + 30 +0.0 + 11 +66.5392470092963038 + 21 +61.6711608060050978 + 31 +0.0 + 0 +LINE + 5 +1DA +100 +AcDbEntity +100 +AcDbLine + 8 +1-DGraph + 62 +256 +370 +-1 + 6 +ByLayer + 10 +47.3738399774666519 + 20 +15.3697772401810333 + 30 +0.0 + 11 +51.2134059390515759 + 21 +-20.9752768115214607 + 31 +0.0 + 0 +LINE + 5 +1DB +100 +AcDbEntity +100 +AcDbLine + 8 +1-DGraph + 62 +256 +370 +-1 + 6 +ByLayer + 10 +59.1418092734212308 + 20 +-31.2885474124811616 + 30 +0.0 + 11 +89.0254225905666345 + 21 +-44.5356457820334768 + 31 +0.0 + 0 +LINE + 5 +1DC +100 +AcDbEntity +100 +AcDbLine + 8 +1-DGraph + 62 +256 +370 +-1 + 6 +ByLayer + 10 +102.82615361453243 + 20 +-48.7518283811716628 + 30 +0.0 + 11 +131.4457510050113456 + 21 +-52.1169011576361143 + 31 +0.0 + 0 +LINE + 5 +1DD +100 +AcDbEntity +100 +AcDbLine + 8 +1-DGraph + 62 +256 +370 +-1 + 6 +ByLayer + 10 +100.9400792490871197 + 20 +-42.6354236286776498 + 30 +0.0 + 11 +110.6217882398498631 + 21 +-27.6808185594164122 + 31 +0.0 + 0 +LINE + 5 +1DE +100 +AcDbEntity +100 +AcDbLine + 8 +1-DGraph + 62 +256 +370 +-1 + 6 +ByLayer + 10 +114.2081351902193518 + 20 +-14.0494134559396784 + 30 +0.0 + 11 +113.7549283045438671 + 21 +0.3808741659336263 + 31 +0.0 + 0 +LINE + 5 +1DF +100 +AcDbEntity +100 +AcDbLine + 8 +1-DGraph + 62 +256 +370 +-1 + 6 +ByLayer + 10 +107.3268652768313984 + 20 +11.101617347623332 + 30 +0.0 + 11 +96.4243139969763803 + 21 +17.6541384305064355 + 31 +0.0 + 0 +LINE + 5 +1E0 +100 +AcDbEntity +100 +AcDbLine + 8 +1-DGraph + 62 +256 +370 +-1 + 6 +ByLayer + 10 +118.5132464992991288 + 20 +13.1879269613856334 + 30 +0.0 + 11 +130.0970234639306398 + 21 +19.8991949684592058 + 31 +0.0 + 0 +LINE + 5 +1E1 +100 +AcDbEntity +100 +AcDbLine + 8 +1-DGraph + 62 +256 +370 +-1 + 6 +ByLayer + 10 +136.0855588401563239 + 20 +30.8106056395716124 + 30 +0.0 + 11 +137.8220691226858037 + 21 +47.9789172205070358 + 31 +0.0 + 0 +LINE + 5 +1E2 +100 +AcDbEntity +100 +AcDbLine + 8 +1-DGraph + 62 +256 +370 +-1 + 6 +ByLayer + 10 +132.0621934632773105 + 20 +59.1395182023584027 + 30 +0.0 + 11 +121.3611278548075205 + 21 +67.1496444051616521 + 31 +0.0 + 0 +LINE + 5 +1E3 +100 +AcDbEntity +100 +AcDbLine + 8 +1-DGraph + 62 +256 +370 +-1 + 6 +ByLayer + 10 +144.4965281535111501 + 20 +58.9718093990447585 + 30 +0.0 + 11 +155.7949987523801099 + 21 +64.1056222075600175 + 31 +0.0 + 0 +LINE + 5 +1E4 +100 +AcDbEntity +100 +AcDbLine + 8 +1-DGraph + 62 +256 +370 +-1 + 6 +ByLayer + 10 +167.1546350932089524 + 20 +72.8798768258197924 + 30 +0.0 + 11 +183.5919051473148897 + 21 +85.7028247244388837 + 31 +0.0 + 0 +LINE + 5 +1E5 +100 +AcDbEntity +100 +AcDbLine + 8 +1-DGraph + 62 +256 +370 +-1 + 6 +ByLayer + 10 +191.9777200706736835 + 20 +84.6359142479468005 + 30 +0.0 + 11 +199.5826106269433353 + 21 +60.7230983654442582 + 31 +0.0 + 0 +LINE + 5 +1E6 +100 +AcDbEntity +100 +AcDbLine + 8 +1-DGraph + 62 +256 +370 +-1 + 6 +ByLayer + 10 +195.6772046918217995 + 20 +50.5094156372958167 + 30 +0.0 + 11 +186.7427469334054138 + 21 +48.9189232595242203 + 31 +0.0 + 0 +LINE + 5 +1E7 +100 +AcDbEntity +100 +AcDbLine + 8 +1-DGraph + 62 +256 +370 +-1 + 6 +ByLayer + 10 +174.5263069457357687 + 20 +53.81121523171592 + 30 +0.0 + 11 +167.035383749864053 + 21 +61.997217499424309 + 31 +0.0 + 0 +LINE + 5 +1E8 +100 +AcDbEntity +100 +AcDbLine + 8 +1-DGraph + 62 +256 +370 +-1 + 6 +ByLayer + 10 +179.8998733536512589 + 20 +41.1821879306676877 + 30 +0.0 + 11 +181.2827542701894288 + 21 +26.2859993691774534 + 31 +0.0 + 0 +LINE + 5 +1E9 +100 +AcDbEntity +100 +AcDbLine + 8 +1-DGraph + 62 +256 +370 +-1 + 6 +ByLayer + 10 +175.0593242544883594 + 20 +15.2069225134565205 + 30 +0.0 + 11 +164.4644808926549047 + 21 +10.4330119323696628 + 31 +0.0 + 0 +LINE + 5 +1EA +100 +AcDbEntity +100 +AcDbLine + 8 +1-DGraph + 62 +256 +370 +-1 + 6 +ByLayer + 10 +152.1242734909995988 + 20 +10.832089280944011 + 30 +0.0 + 11 +141.7706840980021923 + 21 +18.58823580487838 + 31 +0.0 + 0 +LINE + 5 +1EB +100 +AcDbEntity +100 +AcDbLine + 8 +1-DGraph + 62 +256 +370 +-1 + 6 +ByLayer + 10 +157.3608962054955498 + 20 +-0.4805732851761988 + 30 +0.0 + 11 +158.1692031007402761 + 21 +-14.0494134559396784 + 31 +0.0 + 0 +LINE + 5 +1EC +100 +AcDbEntity +100 +AcDbLine + 8 +1-DGraph + 62 +256 +370 +-1 + 6 +ByLayer + 10 +151.7248965217239629 + 20 +-24.7395693574725435 + 30 +0.0 + 11 +143.4767985681490643 + 21 +-27.2408057487128161 + 31 +0.0 + 0 +LINE + 5 +1ED +100 +AcDbEntity +100 +AcDbLine + 8 +1-DGraph + 62 +256 +370 +-1 + 6 +ByLayer + 10 +129.5110029981215121 + 20 +-26.7093745366628212 + 30 +0.0 + 11 +120.8402730543294723 + 21 +-24.3571650629358594 + 31 +0.0 + 0 +LINE + 5 +1EE +100 +AcDbEntity +100 +AcDbLine + 8 +1-DGraph + 62 +256 +370 +-1 + 6 +ByLayer + 10 +137.3834732802219492 + 20 +-36.264280543681565 + 30 +0.0 + 11 +137.8337535427754688 + 21 +-44.0105221081282352 + 31 +0.0 + 0 +LINE + 5 +1EF +100 +AcDbEntity +100 +AcDbLine + 8 +1-DGraph + 62 +256 +370 +-1 + 6 +ByLayer + 10 +145.8374171398901069 + 20 +-49.8710822493799668 + 30 +0.0 + 11 +178.2862246910513022 + 21 +-45.2893493023879969 + 31 +0.0 + 0 +LINE + 5 +1F0 +100 +AcDbEntity +100 +AcDbLine + 8 +1-DGraph + 62 +256 +370 +-1 + 6 +ByLayer + 10 +180.4179964595168428 + 20 +-38.1897825604051349 + 30 +0.0 + 11 +163.3369343428615252 + 21 +-26.4751647938266643 + 31 +0.0 + 0 +LINE + 5 +1F1 +100 +AcDbEntity +100 +AcDbLine + 8 +1-DGraph + 62 +256 +370 +-1 + 6 +ByLayer + 10 +189.2810776738391496 + 20 +-37.4003203389840166 + 30 +0.0 + 11 +206.4546341387568589 + 21 +-8.758350848581653 + 31 +0.0 + 0 +LINE + 5 +1F2 +100 +AcDbEntity +100 +AcDbLine + 8 +1-DGraph + 62 +256 +370 +-1 + 6 +ByLayer + 10 +203.8435861455147631 + 20 +1.8466320249976524 + 30 +0.0 + 11 +186.9211438584256371 + 21 +14.3816107712771277 + 31 +0.0 + 0 +LINE + 5 +1F3 +100 +AcDbEntity +100 +AcDbLine + 8 +1-DGraph + 62 +256 +370 +-1 + 6 +ByLayer + 10 +208.969243761796406 + 20 +4.9336921932455304 + 30 +0.0 + 11 +203.7178530796088296 + 21 +46.7830063846418867 + 31 +0.0 + 0 +CIRCLE + 5 +1F4 +100 +AcDbEntity +100 +AcDbCircle + 8 +1-DGraph + 62 +256 +370 +-1 + 6 +ByLayer + 10 +95.6266528775248332 + 20 +-47.6228893557956141 + 30 +0.0 + 40 +7.2874765306784965 + 0 +CIRCLE + 5 +1F5 +100 +AcDbEntity +100 +AcDbCircle + 8 +1-DGraph + 62 +256 +370 +-1 + 6 +ByLayer + 10 +185.3616162412685071 + 20 +-43.544027384716351 + 30 +0.0 + 40 +7.2874765306784965 + 0 +CIRCLE + 5 +1F6 +100 +AcDbEntity +100 +AcDbCircle + 8 +1-DGraph + 62 +256 +370 +-1 + 6 +ByLayer + 10 +209.8347880677440287 + 20 +-2.3022007882482916 + 30 +0.0 + 40 +7.2874765306784965 + 0 +CIRCLE + 5 +1F7 +100 +AcDbEntity +100 +AcDbCircle + 8 +1-DGraph + 62 +256 +370 +-1 + 6 +ByLayer + 10 +136.4152725883174639 + 20 +-29.0414070431012306 + 30 +0.0 + 40 +7.2874765306784965 + 0 +CIRCLE + 5 +1F8 +100 +AcDbEntity +100 +AcDbCircle + 8 +1-DGraph + 62 +256 +370 +-1 + 6 +ByLayer + 10 +138.6813070166948307 + 20 +-51.2485444411994138 + 30 +0.0 + 40 +7.2874765306784965 + 0 +CIRCLE + 5 +1F9 +100 +AcDbEntity +100 +AcDbCircle + 8 +1-DGraph + 62 +256 +370 +-1 + 6 +ByLayer + 10 +158.1692031007402193 + 20 +-21.3368899866181749 + 30 +0.0 + 40 +7.2874765306784965 + 0 +CIRCLE + 5 +1FA +100 +AcDbEntity +100 +AcDbCircle + 8 +1-DGraph + 62 +256 +370 +-1 + 6 +ByLayer + 10 +114.2081351902192807 + 20 +-21.3368899866181749 + 30 +0.0 + 40 +7.2874765306784965 + 0 +CIRCLE + 5 +1FB +100 +AcDbEntity +100 +AcDbCircle + 8 +1-DGraph + 62 +256 +370 +-1 + 6 +ByLayer + 10 +113.7549283045438813 + 20 +7.6683506966121229 + 30 +0.0 + 40 +7.2874765306784965 + 0 +CIRCLE + 5 +1FC +100 +AcDbEntity +100 +AcDbCircle + 8 +1-DGraph + 62 +256 +370 +-1 + 6 +ByLayer + 10 +91.0945840207701991 + 20 +22.6241779239027494 + 30 +0.0 + 40 +7.2874765306784965 + 0 +CIRCLE + 5 +1FD +100 +AcDbEntity +100 +AcDbCircle + 8 +1-DGraph + 62 +256 +370 +-1 + 6 +ByLayer + 10 +181.2827542701893435 + 20 +18.9985228384989568 + 30 +0.0 + 40 +7.2874765306784965 + 0 +CIRCLE + 5 +1FE +100 +AcDbEntity +100 +AcDbCircle + 8 +1-DGraph + 62 +256 +370 +-1 + 6 +ByLayer + 10 +179.4699267274874614 + 20 +48.4569704074047252 + 30 +0.0 + 40 +7.2874765306784965 + 0 +CIRCLE + 5 +1FF +100 +AcDbEntity +100 +AcDbCircle + 8 +1-DGraph + 62 +256 +370 +-1 + 6 +ByLayer + 10 +202.1302710112611294 + 20 +53.8954530355103998 + 30 +0.0 + 40 +7.2874765306784965 + 0 +CIRCLE + 5 +200 +100 +AcDbEntity +100 +AcDbCircle + 8 +1-DGraph + 62 +256 +370 +-1 + 6 +ByLayer + 10 +158.1692031007402761 + 20 +6.7619369252611818 + 30 +0.0 + 40 +7.2874765306784965 + 0 +CIRCLE + 5 +201 +100 +AcDbEntity +100 +AcDbCircle + 8 +1-DGraph + 62 +256 +370 +-1 + 6 +ByLayer + 10 +136.4152725883175776 + 20 +23.5305916952536904 + 30 +0.0 + 40 +7.2874765306784965 + 0 +CIRCLE + 5 +202 +100 +AcDbEntity +100 +AcDbCircle + 8 +1-DGraph + 62 +256 +370 +-1 + 6 +ByLayer + 10 +138.2281001310194597 + 20 +55.255073692536854 + 30 +0.0 + 40 +7.2874765306784965 + 0 +CIRCLE + 5 +203 +100 +AcDbEntity +100 +AcDbCircle + 8 +1-DGraph + 62 +256 +370 +-1 + 6 +ByLayer + 10 +162.2480650718194397 + 20 +67.4916596057746005 + 30 +0.0 + 40 +7.2874765306784965 + 0 +CIRCLE + 5 +204 +100 +AcDbEntity +100 +AcDbCircle + 8 +1-DGraph + 62 +256 +370 +-1 + 6 +ByLayer + 10 +188.5340644409968149 + 20 +91.0584176608991527 + 30 +0.0 + 40 +7.2874765306784965 + 0 +CIRCLE + 5 +205 +100 +AcDbEntity +100 +AcDbCircle + 8 +1-DGraph + 62 +256 +370 +-1 + 6 +ByLayer + 10 +155.9031686723627672 + 20 +118.7040376871030105 + 30 +0.0 + 40 +7.2874765306784965 + 0 +CIRCLE + 5 +206 +100 +AcDbEntity +100 +AcDbCircle + 8 +1-DGraph + 62 +256 +370 +-1 + 6 +ByLayer + 10 +110.1292732191399608 + 20 +106.9206586595407487 + 30 +0.0 + 40 +7.2874765306784965 + 0 +CIRCLE + 5 +207 +100 +AcDbEntity +100 +AcDbCircle + 8 +1-DGraph + 62 +256 +370 +-1 + 6 +ByLayer + 10 +115.5677558472457633 + 20 +71.5705215768539063 + 30 +0.0 + 40 +7.2874765306784965 + 0 +CIRCLE + 5 +208 +100 +AcDbEntity +100 +AcDbCircle + 8 +1-DGraph + 62 +256 +370 +-1 + 6 +ByLayer + 10 +94.2670322204983933 + 20 +55.8350883152182789 + 30 +0.0 + 40 +7.2874765306784965 + 0 +CIRCLE + 5 +209 +100 +AcDbEntity +100 +AcDbCircle + 8 +1-DGraph + 62 +256 +370 +-1 + 6 +ByLayer + 10 +70.2470672796984132 + 20 +67.9448664914501137 + 30 +0.0 + 40 +7.2874765306784965 + 0 +CIRCLE + 5 +20A +100 +AcDbEntity +100 +AcDbCircle + 8 +1-DGraph + 62 +256 +370 +-1 + 6 +ByLayer + 10 +46.6803092245737332 + 20 +22.624177923902721 + 30 +0.0 + 40 +7.2874765306784965 + 0 +CIRCLE + 5 +20B +100 +AcDbEntity +100 +AcDbCircle + 8 +1-DGraph + 62 +256 +370 +-1 + 6 +ByLayer + 10 +138.2281001310194597 + 20 +55.255073692536854 + 30 +0.0 + 40 +7.2874765306784965 + 0 +CIRCLE + 5 +20C +100 +AcDbEntity +100 +AcDbCircle + 8 +1-DGraph + 62 +256 +370 +-1 + 6 +ByLayer + 10 +136.4152725883175776 + 20 +23.5305916952536904 + 30 +0.0 + 40 +7.2874765306784965 + 0 +CIRCLE + 5 +20D +100 +AcDbEntity +100 +AcDbCircle + 8 +1-DGraph + 62 +256 +370 +-1 + 6 +ByLayer + 10 +113.7549283045438813 + 20 +7.6683506966121229 + 30 +0.0 + 40 +7.2874765306784965 + 0 +CIRCLE + 5 +20E +100 +AcDbEntity +100 +AcDbCircle + 8 +1-DGraph + 62 +256 +370 +-1 + 6 +ByLayer + 10 +158.1692031007402761 + 20 +6.7619369252611818 + 30 +0.0 + 40 +7.2874765306784965 + 0 +LINE + 5 +20F +100 +AcDbEntity +100 +AcDbLine + 8 +0-UGrid + 62 +256 +370 +-1 + 6 +ByLayer + 10 +0.0 + 20 +0.0 + 30 +0.0 + 11 +50.0 + 21 +80.0 + 31 +0.0 + 0 +LINE + 5 +210 +100 +AcDbEntity +100 +AcDbLine + 8 +0-UGrid + 62 +256 +370 +-1 + 6 +ByLayer + 10 +50.0 + 20 +80.0 + 30 +0.0 + 11 +90.0 + 21 +-10.0 + 31 +0.0 + 0 +LINE + 5 +211 +100 +AcDbEntity +100 +AcDbLine + 8 +0-UGrid + 62 +256 +370 +-1 + 6 +ByLayer + 10 +90.0 + 20 +-10.0 + 30 +0.0 + 11 +0.0 + 21 +0.0 + 31 +0.0 + 0 +LINE + 5 +212 +100 +AcDbEntity +100 +AcDbLine + 8 +0-UGrid + 62 +256 +370 +-1 + 6 +ByLayer + 10 +90.0 + 20 +-10.0 + 30 +0.0 + 11 +180.0 + 21 +-10.0 + 31 +0.0 + 0 +LINE + 5 +213 +100 +AcDbEntity +100 +AcDbLine + 8 +0-UGrid + 62 +256 +370 +-1 + 6 +ByLayer + 10 +220.0 + 20 +60.0 + 30 +0.0 + 11 +180.0 + 21 +-10.0 + 31 +0.0 + 0 +LINE + 5 +214 +100 +AcDbEntity +100 +AcDbLine + 8 +0-UGrid + 62 +256 +370 +-1 + 6 +ByLayer + 10 +180.0 + 20 +-10.0 + 30 +0.0 + 11 +140.0 + 21 +-70.0 + 31 +0.0 + 0 +LINE + 5 +215 +100 +AcDbEntity +100 +AcDbLine + 8 +0-UGrid + 62 +256 +370 +-1 + 6 +ByLayer + 10 +140.0 + 20 +-70.0 + 30 +0.0 + 11 +90.0 + 21 +-10.0 + 31 +0.0 + 0 +LINE + 5 +216 +100 +AcDbEntity +100 +AcDbLine + 8 +0-UGrid + 62 +256 +370 +-1 + 6 +ByLayer + 10 +90.0 + 20 +-10.0 + 30 +0.0 + 11 +60.0 + 21 +-70.0 + 31 +0.0 + 0 +LINE + 5 +217 +100 +AcDbEntity +100 +AcDbLine + 8 +0-UGrid + 62 +256 +370 +-1 + 6 +ByLayer + 10 +60.0 + 20 +-70.0 + 30 +0.0 + 11 +140.0 + 21 +-70.0 + 31 +0.0 + 0 +LINE + 5 +218 +100 +AcDbEntity +100 +AcDbLine + 8 +0-UGrid + 62 +256 +370 +-1 + 6 +ByLayer + 10 +0.0 + 20 +0.0 + 30 +0.0 + 11 +60.0 + 21 +-70.0 + 31 +0.0 + 0 +LINE + 5 +219 +100 +AcDbEntity +100 +AcDbLine + 8 +0-UGrid + 62 +256 +370 +-1 + 6 +ByLayer + 10 +140.0 + 20 +-70.0 + 30 +0.0 + 11 +240.0 + 21 +-60.0 + 31 +0.0 + 0 +LINE + 5 +21A +100 +AcDbEntity +100 +AcDbLine + 8 +0-UGrid + 62 +256 +370 +-1 + 6 +ByLayer + 10 +240.0 + 20 +-60.0 + 30 +0.0 + 11 +180.0 + 21 +-10.0 + 31 +0.0 + 0 +LINE + 5 +21B +100 +AcDbEntity +100 +AcDbLine + 8 +0-UGrid + 62 +256 +370 +-1 + 6 +ByLayer + 10 +220.0 + 20 +60.0 + 30 +0.0 + 11 +240.0 + 21 +-60.0 + 31 +0.0 + 0 +LINE + 5 +21C +100 +AcDbEntity +100 +AcDbLine + 8 +0-UGrid + 62 +256 +370 +-1 + 6 +ByLayer + 10 +50.0 + 20 +80.0 + 30 +0.0 + 11 +130.0 + 21 +150.0 + 31 +0.0 + 0 +LINE + 5 +21D +100 +AcDbEntity +100 +AcDbLine + 8 +0-UGrid + 62 +256 +370 +-1 + 6 +ByLayer + 10 +130.0 + 20 +150.0 + 30 +0.0 + 11 +200.0 + 21 +120.0 + 31 +0.0 + 0 +LINE + 5 +21E +100 +AcDbEntity +100 +AcDbLine + 8 +0-UGrid + 62 +256 +370 +-1 + 6 +ByLayer + 10 +200.0 + 20 +120.0 + 30 +0.0 + 11 +220.0 + 21 +60.0 + 31 +0.0 + 0 +CIRCLE + 5 +21F +100 +AcDbEntity +100 +AcDbCircle + 8 +0-DGraph + 62 +256 +370 +-1 + 6 +ByLayer + 10 +52.5719987383548784 + 20 +-28.134993271750254 + 30 +0.0 + 40 +7.2874765306784965 + 0 +CIRCLE + 5 +220 +100 +AcDbEntity +100 +AcDbCircle + 8 +0-DGraph + 62 +256 +370 +-1 + 6 +ByLayer + 10 +95.6266528775248332 + 20 +-47.6228893557956141 + 30 +0.0 + 40 +7.2874765306784965 + 0 +CIRCLE + 5 +221 +100 +AcDbEntity +100 +AcDbCircle + 8 +0-DGraph + 62 +256 +370 +-1 + 6 +ByLayer + 10 +185.3616162412685071 + 20 +-43.544027384716351 + 30 +0.0 + 40 +7.2874765306784965 + 0 +CIRCLE + 5 +222 +100 +AcDbEntity +100 +AcDbCircle + 8 +0-DGraph + 62 +256 +370 +-1 + 6 +ByLayer + 10 +209.8347880677440287 + 20 +-2.3022007882482916 + 30 +0.0 + 40 +7.2874765306784965 + 0 +CIRCLE + 5 +223 +100 +AcDbEntity +100 +AcDbCircle + 8 +0-DGraph + 62 +256 +370 +-1 + 6 +ByLayer + 10 +136.4152725883174639 + 20 +-29.0414070431012306 + 30 +0.0 + 40 +7.2874765306784965 + 0 +CIRCLE + 5 +224 +100 +AcDbEntity +100 +AcDbCircle + 8 +0-DGraph + 62 +256 +370 +-1 + 6 +ByLayer + 10 +179.4699267274874614 + 20 +48.4569704074047252 + 30 +0.0 + 40 +7.2874765306784965 + 0 +CIRCLE + 5 +225 +100 +AcDbEntity +100 +AcDbCircle + 8 +0-DGraph + 62 +256 +370 +-1 + 6 +ByLayer + 10 +136.4152725883175776 + 20 +23.5305916952536904 + 30 +0.0 + 40 +7.2874765306784965 + 0 +CIRCLE + 5 +226 +100 +AcDbEntity +100 +AcDbCircle + 8 +0-DGraph + 62 +256 +370 +-1 + 6 +ByLayer + 10 +188.5340644409968149 + 20 +91.0584176608991527 + 30 +0.0 + 40 +7.2874765306784965 + 0 +CIRCLE + 5 +227 +100 +AcDbEntity +100 +AcDbCircle + 8 +0-DGraph + 62 +256 +370 +-1 + 6 +ByLayer + 10 +155.9031686723627672 + 20 +118.7040376871030105 + 30 +0.0 + 40 +7.2874765306784965 + 0 +CIRCLE + 5 +228 +100 +AcDbEntity +100 +AcDbCircle + 8 +0-DGraph + 62 +256 +370 +-1 + 6 +ByLayer + 10 +110.1292732191399608 + 20 +106.9206586595407487 + 30 +0.0 + 40 +7.2874765306784965 + 0 +CIRCLE + 5 +229 +100 +AcDbEntity +100 +AcDbCircle + 8 +0-DGraph + 62 +256 +370 +-1 + 6 +ByLayer + 10 +94.2670322204983933 + 20 +55.8350883152182789 + 30 +0.0 + 40 +7.2874765306784965 + 0 +CIRCLE + 5 +22A +100 +AcDbEntity +100 +AcDbCircle + 8 +0-DGraph + 62 +256 +370 +-1 + 6 +ByLayer + 10 +46.6803092245737332 + 20 +22.624177923902721 + 30 +0.0 + 40 +7.2874765306784965 + 0 +LINE + 5 +22B +100 +AcDbEntity +100 +AcDbLine + 8 +0-DGraph + 62 +256 +370 +-1 + 6 +ByLayer + 10 +116.9224286389353722 + 20 +109.5589068714597971 + 30 +0.0 + 11 +149.0725566084316824 + 21 +116.1643422295197325 + 31 +0.0 + 0 +LINE + 5 +22C +100 +AcDbEntity +100 +AcDbLine + 8 +0-DGraph + 62 +256 +370 +-1 + 6 +ByLayer + 10 +161.1561976051828822 + 20 +113.6529980697425799 + 30 +0.0 + 11 +183.0935634081621686 + 21 +95.9069496755315214 + 31 +0.0 + 0 +LINE + 5 +22D +100 +AcDbEntity +100 +AcDbLine + 8 +0-DGraph + 62 +256 +370 +-1 + 6 +ByLayer + 10 +186.6766076979713489 + 20 +84.0116333848637993 + 30 +0.0 + 11 +181.6498348866109041 + 21 +55.4107689810604924 + 31 +0.0 + 0 +LINE + 5 +22E +100 +AcDbEntity +100 +AcDbLine + 8 +0-DGraph + 62 +256 +370 +-1 + 6 +ByLayer + 10 +173.5676709696586784 + 20 +44.1825475043256759 + 30 +0.0 + 11 +142.893245413748275 + 21 +26.8687322342621044 + 31 +0.0 + 0 +LINE + 5 +22F +100 +AcDbEntity +100 +AcDbLine + 8 +0-DGraph + 62 +256 +370 +-1 + 6 +ByLayer + 10 +129.8819964583924218 + 20 +26.7591544088059727 + 30 +0.0 + 11 +99.4569941016231382 + 21 +50.719268746697324 + 31 +0.0 + 0 +LINE + 5 +230 +100 +AcDbEntity +100 +AcDbLine + 8 +0-DGraph + 62 +256 +370 +-1 + 6 +ByLayer + 10 +96.7980774373386197 + 20 +62.6689104006621278 + 30 +0.0 + 11 +108.0352555588045362 + 21 +99.9405150920062511 + 31 +0.0 + 0 +LINE + 5 +231 +100 +AcDbEntity +100 +AcDbLine + 8 +0-DGraph + 62 +256 +370 +-1 + 6 +ByLayer + 10 +88.3229909309385732 + 20 +51.618966005180539 + 30 +0.0 + 11 +52.9344629061442333 + 21 +26.3648831932988585 + 31 +0.0 + 0 +LINE + 5 +232 +100 +AcDbEntity +100 +AcDbLine + 8 +0-DGraph + 62 +256 +370 +-1 + 6 +ByLayer + 10 +47.7009386051260691 + 20 +15.4085261963909748 + 30 +0.0 + 11 +51.6158010891128001 + 21 +-20.9105209560185479 + 31 +0.0 + 0 +LINE + 5 +233 +100 +AcDbEntity +100 +AcDbLine + 8 +0-DGraph + 62 +256 +370 +-1 + 6 +ByLayer + 10 +58.891290414668795 + 20 +-31.7645754646285887 + 30 +0.0 + 11 +88.7931687907969405 + 21 +-45.0909317294466874 + 31 +0.0 + 0 +LINE + 5 +234 +100 +AcDbEntity +100 +AcDbLine + 8 +0-DGraph + 62 +256 +370 +-1 + 6 +ByLayer + 10 +102.4209663878701235 + 20 +-44.9876250221225433 + 30 +0.0 + 11 +130.0249121618746244 + 21 +-32.5443497781945723 + 31 +0.0 + 0 +LINE + 5 +235 +100 +AcDbEntity +100 +AcDbLine + 8 +0-DGraph + 62 +256 +370 +-1 + 6 +ByLayer + 10 +136.5341927063395246 + 20 +-21.7549008713671057 + 30 +0.0 + 11 +136.5664881169093974 + 21 +16.2446841986474766 + 31 +0.0 + 0 +LINE + 5 +236 +100 +AcDbEntity +100 +AcDbLine + 8 +0-DGraph + 62 +256 +370 +-1 + 6 +ByLayer + 10 +143.1815100811218144 + 20 +-31.7479443837190303 + 30 +0.0 + 11 +178.3367605437638304 + 21 +-41.605286397780219 + 31 +0.0 + 0 +LINE + 5 +237 +100 +AcDbEntity +100 +AcDbLine + 8 +0-DGraph + 62 +256 +370 +-1 + 6 +ByLayer + 10 +189.9953946806359966 + 20 +-37.91949082069236 + 30 +0.0 + 11 +206.3034992574559965 + 21 +-8.6769410593122434 + 31 +0.0 + 0 +LINE + 5 +238 +100 +AcDbEntity +100 +AcDbLine + 8 +0-DGraph + 62 +256 +370 +-1 + 6 +ByLayer + 10 +206.3624939160768292 + 20 +4.1048646483995688 + 30 +0.0 + 11 +183.3135422971571415 + 21 +42.2655300630435917 + 31 +0.0 + 0 +CIRCLE + 5 +239 +100 +AcDbEntity +100 +AcDbCircle + 8 +0-NGraph + 62 +256 +370 +-1 + 6 +ByLayer + 10 +0.0 + 20 +0.0 + 30 +0.0 + 40 +7.25 + 0 +CIRCLE + 5 +23A +100 +AcDbEntity +100 +AcDbCircle + 8 +0-NGraph + 62 +256 +370 +-1 + 6 +ByLayer + 10 +200.0 + 20 +120.0 + 30 +0.0 + 40 +7.25 + 0 +CIRCLE + 5 +23B +100 +AcDbEntity +100 +AcDbCircle + 8 +0-NGraph + 62 +256 +370 +-1 + 6 +ByLayer + 10 +130.0 + 20 +150.0 + 30 +0.0 + 40 +7.25 + 0 +CIRCLE + 5 +23C +100 +AcDbEntity +100 +AcDbCircle + 8 +0-NGraph + 62 +256 +370 +-1 + 6 +ByLayer + 10 +50.0 + 20 +80.0 + 30 +0.0 + 40 +7.25 + 0 +CIRCLE + 5 +23D +100 +AcDbEntity +100 +AcDbCircle + 8 +0-NGraph + 62 +256 +370 +-1 + 6 +ByLayer + 10 +140.0 + 20 +-70.0 + 30 +0.0 + 40 +7.25 + 0 +CIRCLE + 5 +23E +100 +AcDbEntity +100 +AcDbCircle + 8 +0-NGraph + 62 +256 +370 +-1 + 6 +ByLayer + 10 +240.0 + 20 +-60.0 + 30 +0.0 + 40 +7.25 + 0 +LINE + 5 +23F +100 +AcDbEntity +100 +AcDbLine + 8 +0-NGraph + 62 +256 +370 +-1 + 6 +ByLayer + 10 +202.2926513036220797 + 20 +113.1220460891337751 + 30 +0.0 + 11 +217.7073486963779203 + 21 +66.8779539108662249 + 31 +0.0 + 0 +LINE + 5 +240 +100 +AcDbEntity +100 +AcDbLine + 8 +0-NGraph + 62 +256 +370 +-1 + 6 +ByLayer + 10 +146.7883865373755725 + 20 +87.4543550484841603 + 30 +0.0 + 11 +173.2116309968748169 + 21 +77.5456383761719508 + 31 +0.0 + 0 +LINE + 5 +241 +100 +AcDbEntity +100 +AcDbLine + 8 +0-NGraph + 62 +256 +370 +-1 + 6 +ByLayer + 10 +146.4845971347493787 + 20 +93.2422985673746894 + 30 +0.0 + 11 +193.515402865250536 + 21 +116.757701432625268 + 31 +0.0 + 0 +LINE + 5 +242 +100 +AcDbEntity +100 +AcDbLine + 8 +0-NGraph + 62 +256 +370 +-1 + 6 +ByLayer + 10 +221.191892657963848 + 20 +52.8486440522169545 + 30 +0.0 + 11 +238.808107342036152 + 21 +-52.848644052216855 + 31 +0.0 + 0 +LINE + 5 +243 +100 +AcDbEntity +100 +AcDbLine + 8 +0-NGraph + 62 +256 +370 +-1 + 6 +ByLayer + 10 +147.214019629022431 + 20 +-69.2785980370977512 + 30 +0.0 + 11 +232.7859803709775974 + 21 +-60.7214019629022417 + 31 +0.0 + 0 +LINE + 5 +244 +100 +AcDbEntity +100 +AcDbLine + 8 +0-NGraph + 62 +256 +370 +-1 + 6 +ByLayer + 10 +155.9781391522677154 + 20 +-46.0327912715984127 + 30 +0.0 + 11 +144.0215764226329043 + 21 +-63.9676353660506152 + 31 +0.0 + 0 +LINE + 5 +245 +100 +AcDbEntity +100 +AcDbLine + 8 +0-NGraph + 62 +256 +370 +-1 + 6 +ByLayer + 10 +135.35866310243253 + 20 +-64.4303957229190303 + 30 +0.0 + 11 +119.6413358601699457 + 21 +-45.5696030322039363 + 31 +0.0 + 0 +LINE + 5 +246 +100 +AcDbEntity +100 +AcDbLine + 8 +0-NGraph + 62 +256 +370 +-1 + 6 +ByLayer + 10 +67.25 + 20 +-70.0 + 30 +0.0 + 11 +132.75 + 21 +-70.0 + 31 +0.0 + 0 +LINE + 5 +247 +100 +AcDbEntity +100 +AcDbLine + 8 +0-NGraph + 62 +256 +370 +-1 + 6 +ByLayer + 10 +86.7577014326253106 + 20 +-16.4845971347493894 + 30 +0.0 + 11 +63.2422985673747391 + 21 +-63.5154028652505218 + 31 +0.0 + 0 +LINE + 5 +248 +100 +AcDbEntity +100 +AcDbLine + 8 +0-NGraph + 62 +256 +370 +-1 + 6 +ByLayer + 10 +111.7577906237844161 + 20 +33.5155812475688109 + 30 +0.0 + 11 +93.2422985673746751 + 21 +-3.5154028652506497 + 31 +0.0 + 0 +LINE + 5 +249 +100 +AcDbEntity +100 +AcDbLine + 8 +0-NGraph + 62 +256 +370 +-1 + 6 +ByLayer + 10 +136.6638014676309183 + 20 +147.1440850853010431 + 30 +0.0 + 11 +193.3361985323691954 + 21 +122.8559149146989142 + 31 +0.0 + 0 +LINE + 5 +24A +100 +AcDbEntity +100 +AcDbLine + 8 +0-NGraph + 62 +256 +370 +-1 + 6 +ByLayer + 10 +131.191892657963848 + 20 +142.8486440522169687 + 30 +0.0 + 11 +138.808107342036152 + 21 +97.1513559477830313 + 31 +0.0 + 0 +LINE + 5 +24B +100 +AcDbEntity +100 +AcDbLine + 8 +0-NGraph + 62 +256 +370 +-1 + 6 +ByLayer + 10 +4.7182374575557713 + 20 +-5.5046103671484001 + 30 +0.0 + 11 +55.2817625424442269 + 21 +-64.4953896328515981 + 31 +0.0 + 0 +LINE + 5 +24C +100 +AcDbEntity +100 +AcDbLine + 8 +0-NGraph + 62 +256 +370 +-1 + 6 +ByLayer + 10 +82.79434292361627 + 20 +-9.199371435957362 + 30 +0.0 + 11 +7.2056570763837584 + 21 +-0.8006285640426398 + 31 +0.0 + 0 +LINE + 5 +24D +100 +AcDbEntity +100 +AcDbLine + 8 +0-NGraph + 62 +256 +370 +-1 + 6 +ByLayer + 10 +3.8424923150230548 + 20 +6.147987704036888 + 30 +0.0 + 11 +46.1575076849770198 + 21 +73.8520122959632204 + 31 +0.0 + 0 +LINE + 5 +24E +100 +AcDbEntity +100 +AcDbLine + 8 +0-NGraph + 62 +256 +370 +-1 + 6 +ByLayer + 10 +52.9445038788874953 + 20 +73.3748662725031409 + 30 +0.0 + 11 +65.3317270935176424 + 21 +45.5036140395853081 + 31 +0.0 + 0 +LINE + 5 +24F +100 +AcDbEntity +100 +AcDbLine + 8 +0-NGraph + 62 +256 +370 +-1 + 6 +ByLayer + 10 +55.4561810366248622 + 20 +84.7741584070467553 + 30 +0.0 + 11 +124.5438189633751307 + 21 +145.2258415929532589 + 31 +0.0 + 0 +LINE + 5 +250 +100 +AcDbEntity +100 +AcDbLine + 8 +0-NGraph + 62 +256 +370 +-1 + 6 +ByLayer + 10 +88.0695748633034157 + 20 +84.2299527625892779 + 30 +0.0 + 11 +57.2056570763837442 + 21 +80.8006285640426398 + 31 +0.0 + 0 +LINE + 5 +251 +100 +AcDbEntity +100 +AcDbLine + 8 +0-NGraph + 62 +256 +370 +-1 + 6 +ByLayer + 10 +97.25 + 20 +-10.0 + 30 +0.0 + 11 +127.75 + 21 +-10.0 + 31 +0.0 + 0 +CIRCLE + 5 +252 +100 +AcDbEntity +100 +AcDbCircle + 8 +0-NGraph + 62 +256 +370 +-1 + 6 +ByLayer + 10 +180.0 + 20 +-10.0 + 30 +0.0 + 40 +7.25 + 0 +LINE + 5 +253 +100 +AcDbEntity +100 +AcDbLine + 8 +0-NGraph + 62 +256 +370 +-1 + 6 +ByLayer + 10 +177.3074175964327424 + 20 +-3.2685439910818701 + 30 +0.0 + 11 +162.6925274112502393 + 21 +33.2686814718743875 + 31 +0.0 + 0 +LINE + 5 +254 +100 +AcDbEntity +100 +AcDbLine + 8 +0-NGraph + 62 +256 +370 +-1 + 6 +ByLayer + 10 +234.4303957229190303 + 20 +-55.3586631024325229 + 30 +0.0 + 11 +185.5696042770808845 + 21 +-14.6413368975674132 + 31 +0.0 + 0 +LINE + 5 +255 +100 +AcDbEntity +100 +AcDbLine + 8 +0-NGraph + 62 +256 +370 +-1 + 6 +ByLayer + 10 +197.598048143516877 + 20 +20.7965842511545489 + 30 +0.0 + 11 +183.5970073030870537 + 21 +-3.7052372195976488 + 31 +0.0 + 0 +CIRCLE + 5 +256 +100 +AcDbEntity +100 +AcDbCircle + 8 +0-NGraph + 62 +256 +370 +-1 + 6 +ByLayer + 10 +130.0 + 20 +150.0 + 30 +0.0 + 40 +7.25 + 0 +LINE + 5 +257 +100 +AcDbEntity +100 +AcDbLine + 8 +0-NGraph + 62 +256 +370 +-1 + 6 +ByLayer + 10 +146.7883865373755725 + 20 +87.4543550484841603 + 30 +0.0 + 11 +213.2116134626243138 + 21 +62.5456449515158965 + 31 +0.0 + 0 +LINE + 5 +258 +100 +AcDbEntity +100 +AcDbLine + 8 +0-NGraph + 62 +256 +370 +-1 + 6 +ByLayer + 10 +93.2422985673746894 + 20 +-3.5154028652506106 + 30 +0.0 + 11 +136.7577014326253106 + 21 +83.515402865250536 + 31 +0.0 + 0 +LINE + 5 +259 +100 +AcDbEntity +100 +AcDbLine + 8 +0-NGraph + 62 +256 +370 +-1 + 6 +ByLayer + 10 +57.2056570763837371 + 20 +80.8006285640426398 + 30 +0.0 + 11 +132.7943429236163126 + 21 +89.199371435957346 + 31 +0.0 + 0 +LINE + 5 +25A +100 +AcDbEntity +100 +AcDbLine + 8 +0-NGraph + 62 +256 +370 +-1 + 6 +ByLayer + 10 +177.3074175964327424 + 20 +-3.2685439910818692 + 30 +0.0 + 11 +142.6925824035672576 + 21 +83.2685439910819838 + 31 +0.0 + 0 +LINE + 5 +25B +100 +AcDbEntity +100 +AcDbLine + 8 +0-NGraph + 62 +256 +370 +-1 + 6 +ByLayer + 10 +216.4029926969129178 + 20 +53.7052372195976488 + 30 +0.0 + 11 +183.5970073030870537 + 21 +-3.7052372195976488 + 31 +0.0 + 0 +LINE + 5 +25C +100 +AcDbEntity +100 +AcDbLine + 8 +0-NGraph + 62 +256 +370 +-1 + 6 +ByLayer + 10 +175.9784235773671242 + 20 +-16.0323646339493777 + 30 +0.0 + 11 +144.0215764226329043 + 21 +-63.9676353660506365 + 31 +0.0 + 0 +LINE + 5 +25D +100 +AcDbEntity +100 +AcDbLine + 8 +0-NGraph + 62 +256 +370 +-1 + 6 +ByLayer + 10 +97.25 + 20 +-10.0 + 30 +0.0 + 11 +172.75 + 21 +-10.0 + 31 +0.0 + 0 +LINE + 5 +25E +100 +AcDbEntity +100 +AcDbLine + 8 +0-NGraph + 62 +256 +370 +-1 + 6 +ByLayer + 10 +135.35866310243253 + 20 +-64.4303957229190303 + 30 +0.0 + 11 +94.6413368975674985 + 21 +-15.5696042770809981 + 31 +0.0 + 0 +LINE + 5 +25F +100 +AcDbEntity +100 +AcDbLine + 8 +0-NGraph + 62 +256 +370 +-1 + 6 +ByLayer + 10 +52.9445038788874953 + 20 +73.3748662725031409 + 30 +0.0 + 11 +87.0554961211124407 + 21 +-3.374866272503013 + 31 +0.0 + 0 +LINE + 5 +260 +100 +AcDbEntity +100 +AcDbLine + 8 +1-UGrid DG Part2 InteriorEdges + 62 +256 +370 +-1 + 6 +ByLayer + 10 +130.0 + 20 +150.0 + 30 +0.0 + 11 +200.0 + 21 +120.0 + 31 +0.0 + 0 +LINE + 5 +261 +100 +AcDbEntity +100 +AcDbLine + 8 +1-UGrid DG Part2 InteriorEdges + 62 +256 +370 +-1 + 6 +ByLayer + 10 +200.0 + 20 +120.0 + 30 +0.0 + 11 +140.0 + 21 +90.0 + 31 +0.0 + 0 +LINE + 5 +262 +100 +AcDbEntity +100 +AcDbLine + 8 +1-UGrid DG Part2 InteriorEdges + 62 +256 +370 +-1 + 6 +ByLayer + 10 +200.0 + 20 +120.0 + 30 +0.0 + 11 +220.0 + 21 +60.0 + 31 +0.0 + 0 +LINE + 5 +263 +100 +AcDbEntity +100 +AcDbLine + 8 +1-UGrid DG Part2 InteriorEdges + 62 +256 +370 +-1 + 6 +ByLayer + 10 +220.0 + 20 +60.0 + 30 +0.0 + 11 +240.0 + 21 +-60.0 + 31 +0.0 + 0 +LINE + 5 +264 +100 +AcDbEntity +100 +AcDbLine + 8 +1-UGrid DG Part2 InteriorEdges + 62 +256 +370 +-1 + 6 +ByLayer + 10 +240.0 + 20 +-60.0 + 30 +0.0 + 11 +140.0 + 21 +-70.0 + 31 +0.0 + 0 +LINE + 5 +265 +100 +AcDbEntity +100 +AcDbLine + 8 +1-UGrid DG Part2 InteriorEdges + 62 +256 +370 +-1 + 6 +ByLayer + 10 +240.0 + 20 +-60.0 + 30 +0.0 + 11 +180.0 + 21 +-10.0 + 31 +0.0 + 0 +LINE + 5 +266 +100 +AcDbEntity +100 +AcDbLine + 8 +1-UGrid DG Part2 InteriorEdges + 62 +256 +370 +-1 + 6 +ByLayer + 10 +180.0 + 20 +-10.0 + 30 +0.0 + 11 +140.0 + 21 +90.0 + 31 +0.0 + 0 +LINE + 5 +267 +100 +AcDbEntity +100 +AcDbLine + 8 +1-UGrid DG Part2 InteriorEdges + 62 +256 +370 +-1 + 6 +ByLayer + 10 +140.0 + 20 +90.0 + 30 +0.0 + 11 +220.0 + 21 +60.0 + 31 +0.0 + 0 +LINE + 5 +268 +100 +AcDbEntity +100 +AcDbLine + 8 +1-UGrid DG Part2 InteriorEdges + 62 +256 +370 +-1 + 6 +ByLayer + 10 +220.0 + 20 +60.0 + 30 +0.0 + 11 +180.0 + 21 +-10.0 + 31 +0.0 + 0 +LINE + 5 +269 +100 +AcDbEntity +100 +AcDbLine + 8 +1-UGrid DG Part2 InteriorEdges + 62 +256 +370 +-1 + 6 +ByLayer + 10 +180.0 + 20 +-10.0 + 30 +0.0 + 11 +159.9997155749006481 + 21 +-40.000426637649042 + 31 +0.0 + 0 +LINE + 5 +26A +100 +AcDbEntity +100 +AcDbLine + 8 +1-UGrid DG Part2 InteriorEdges + 62 +256 +370 +-1 + 6 +ByLayer + 10 +135.0 + 20 +-10.0 + 30 +0.0 + 11 +159.9999450076830385 + 21 +40.0001374807924819 + 31 +0.0 + 0 +LINE + 5 +26B +100 +AcDbEntity +100 +AcDbLine + 8 +1-UGrid DG Part2 InteriorEdges + 62 +256 +370 +-1 + 6 +ByLayer + 10 +159.9999450076830385 + 20 +40.0001374807924819 + 30 +0.0 + 11 +180.0000175342504178 + 21 +74.9999934246560827 + 31 +0.0 + 0 +LINE + 5 +26C +100 +AcDbEntity +100 +AcDbLine + 8 +1-UGrid DG Part2 InteriorEdges + 62 +256 +370 +-1 + 6 +ByLayer + 10 +115.0000891911591054 + 20 +40.0001783823182038 + 30 +0.0 + 11 +159.9999450076830101 + 21 +40.0001374807924748 + 31 +0.0 + 0 +LINE + 5 +26D +100 +AcDbEntity +100 +AcDbLine + 8 +1-UGrid DG Part2 InteriorEdges + 62 +256 +370 +-1 + 6 +ByLayer + 10 +180.0 + 20 +-10.0 + 30 +0.0 + 11 +135.0 + 21 +-10.0 + 31 +0.0 + 0 +LINE + 5 +26E +100 +AcDbEntity +100 +AcDbLine + 8 +1-UGrid DG Part2 GhostEdges + 62 +256 +370 +-1 + 6 +ByLayer + 10 +130.0 + 20 +150.0 + 30 +0.0 + 11 +50.0 + 21 +80.0 + 31 +0.0 + 0 +LINE + 5 +26F +100 +AcDbEntity +100 +AcDbLine + 8 +1-UGrid DG Part2 GhostEdges + 62 +256 +370 +-1 + 6 +ByLayer + 10 +50.0 + 20 +80.0 + 30 +0.0 + 11 +140.0 + 21 +90.0 + 31 +0.0 + 0 +LINE + 5 +270 +100 +AcDbEntity +100 +AcDbLine + 8 +1-UGrid DG Part2 GhostEdges + 62 +256 +370 +-1 + 6 +ByLayer + 10 +95.2752319396871599 + 20 +85.0305813266319035 + 30 +0.0 + 11 +115.0000891911591054 + 21 +40.0001783823182109 + 31 +0.0 + 0 +LINE + 5 +271 +100 +AcDbEntity +100 +AcDbLine + 8 +1-UGrid DG Part2 GhostEdges + 62 +256 +370 +-1 + 6 +ByLayer + 10 +115.0000891911591054 + 20 +40.0001783823182109 + 30 +0.0 + 11 +90.0 + 21 +-10.0 + 31 +0.0 + 0 +LINE + 5 +272 +100 +AcDbEntity +100 +AcDbLine + 8 +1-UGrid DG Part2 GhostEdges + 62 +256 +370 +-1 + 6 +ByLayer + 10 +90.0 + 20 +-10.0 + 30 +0.0 + 11 +134.9999999999999432 + 21 +-10.0 + 31 +0.0 + 0 +LINE + 5 +273 +100 +AcDbEntity +100 +AcDbLine + 8 +1-UGrid DG Part2 GhostEdges + 62 +256 +370 +-1 + 6 +ByLayer + 10 +134.9999999999999432 + 20 +-10.0 + 30 +0.0 + 11 +114.9999989626024757 + 21 +-39.9999987551229665 + 31 +0.0 + 0 +LINE + 5 +274 +100 +AcDbEntity +100 +AcDbLine + 8 +1-UGrid DG Part2 GhostEdges + 62 +256 +370 +-1 + 6 +ByLayer + 10 +114.9999989626024757 + 20 +-39.9999987551229665 + 30 +0.0 + 11 +140.0 + 21 +-70.0 + 31 +0.0 + 0 +HATCH + 5 +275 + 8 +1-UGrid DG Part2 GhostVertices + 62 +256 +370 +-1 + 6 +ByLayer +100 +AcDbEntity +100 +AcDbHatch + 10 +0.0 + 20 +0.0 + 30 +0.0 +210 +0.0 +220 +0.0 +230 +1.0 + 2 +SOLID + 70 +1 + 71 +0 + 91 +1 + 92 +1 + 93 +4 + 72 +2 + 10 +95.2752319396871599 + 20 +85.0305813266319035 + 40 +7.25 + 50 +0.0 + 51 +360.0 + 73 +1 + 72 +2 + 10 +50.0 + 20 +80.0 + 40 +7.25 + 50 +0.0 + 51 +360.0 + 73 +1 + 72 +2 + 10 +90.0 + 20 +-10.0 + 40 +7.25 + 50 +0.0 + 51 +360.0 + 73 +1 + 72 +2 + 10 +114.9999989626024757 + 20 +-39.9999987551229665 + 40 +7.25 + 50 +0.0 + 51 +360.0 + 73 +1 + 97 +0 + 75 +0 + 76 +1 + 98 +0 + 0 +LINE + 5 +276 +100 +AcDbEntity +100 +AcDbLine + 8 +1-UGrid DG Part2 OverlapEdges Example + 62 +256 +370 +-1 + 6 +ByLayer + 10 +95.2752319396871599 + 20 +85.0305813266319035 + 30 +0.0 + 11 +140.0 + 21 +90.0 + 31 +0.0 + 0 +LINE + 5 +277 +100 +AcDbEntity +100 +AcDbLine + 8 +1-UGrid DG Part2 OverlapEdges Example + 62 +256 +370 +-1 + 6 +ByLayer + 10 +50.0 + 20 +80.0 + 30 +0.0 + 11 +130.0 + 21 +150.0 + 31 +0.0 + 0 +LINE + 5 +278 +100 +AcDbEntity +100 +AcDbLine + 8 +1-UGrid DG Part2 FrontEdges Example + 62 +256 +370 +-1 + 6 +ByLayer + 10 +50.0 + 20 +80.0 + 30 +0.0 + 11 +95.2752319396871599 + 21 +85.0305813266319035 + 31 +0.0 + 0 +LINE + 5 +279 +100 +AcDbEntity +100 +AcDbLine + 8 +1-UGrid DG Part2 FrontEdges Example + 62 +256 +370 +-1 + 6 +ByLayer + 10 +95.2752319396871599 + 20 +85.0305813266319035 + 30 +0.0 + 11 +115.0000891911591054 + 21 +40.0001783823182038 + 31 +0.0 + 0 +LINE + 5 +27A +100 +AcDbEntity +100 +AcDbLine + 8 +1-UGrid DG Part2 FrontEdges Example + 62 +256 +370 +-1 + 6 +ByLayer + 10 +115.0000891911591054 + 20 +40.0001783823182038 + 30 +0.0 + 11 +90.0 + 21 +-10.0 + 31 +0.0 + 0 +LINE + 5 +27B +100 +AcDbEntity +100 +AcDbLine + 8 +1-UGrid DG Part2 FrontEdges Example + 62 +256 +370 +-1 + 6 +ByLayer + 10 +90.0 + 20 +-10.0 + 30 +0.0 + 11 +135.0 + 21 +-10.0 + 31 +0.0 + 0 +LINE + 5 +27C +100 +AcDbEntity +100 +AcDbLine + 8 +1-UGrid DG Part2 FrontEdges Example + 62 +256 +370 +-1 + 6 +ByLayer + 10 +135.0 + 20 +-10.0 + 30 +0.0 + 11 +114.9999989626024757 + 21 +-39.9999987551229665 + 31 +0.0 + 0 +LINE + 5 +27D +100 +AcDbEntity +100 +AcDbLine + 8 +1-UGrid DG Part2 FrontEdges Example + 62 +256 +370 +-1 + 6 +ByLayer + 10 +114.9999989626024757 + 20 +-39.9999987551229665 + 30 +0.0 + 11 +140.0 + 21 +-70.0 + 31 +0.0 + 0 +LINE + 5 +27E +100 +AcDbEntity +100 +AcDbLine + 8 +1-UGrid DG Part2 OverlapEdges Example + 62 +256 +370 +-1 + 6 +ByLayer + 10 +114.9999989626024757 + 20 +-39.9999987551229665 + 30 +0.0 + 11 +159.9997155749006197 + 21 +-40.0004266376490278 + 31 +0.0 + 0 +LINE + 5 +27F +100 +AcDbEntity +100 +AcDbLine + 8 +1-UGrid DG Part2 Ghost2OverlapEdges + 62 +256 +370 +-1 + 6 +ByLayer + 10 +90.0 + 20 +-10.0 + 30 +0.0 + 11 +60.0 + 21 +-70.0 + 31 +0.0 + 0 +LINE + 5 +280 +100 +AcDbEntity +100 +AcDbLine + 8 +1-UGrid DG Part2 Ghost2OverlapEdges + 62 +256 +370 +-1 + 6 +ByLayer + 10 +60.0 + 20 +-70.0 + 30 +0.0 + 11 +140.0 + 21 +-70.0 + 31 +0.0 + 0 +LINE + 5 +281 +100 +AcDbEntity +100 +AcDbLine + 8 +1-UGrid DG Part2 Ghost2OverlapEdges + 62 +256 +370 +-1 + 6 +ByLayer + 10 +90.0 + 20 +-10.0 + 30 +0.0 + 11 +114.9999989626024757 + 21 +-39.9999987551229665 + 31 +0.0 + 0 +CIRCLE + 5 +282 +100 +AcDbEntity +100 +AcDbCircle + 8 +0-UGrid Mark UpAdj Vertex + 62 +256 +370 +-1 + 6 +ByLayer + 10 +140.0 + 20 +90.0 + 30 +0.0 + 40 +7.25 + 0 +LINE + 5 +283 +100 +AcDbEntity +100 +AcDbLine + 8 +2 + 62 +256 +370 +-1 + 6 +ByLayer + 10 +140.0 + 20 +90.0 + 30 +0.0 + 11 +127.5000445955795527 + 21 +65.0000891911591054 + 31 +0.0 + 0 +LINE + 5 +284 +100 +AcDbEntity +100 +AcDbLine + 8 +2 + 62 +256 +370 +-1 + 6 +ByLayer + 10 +127.5000445955795527 + 20 +65.0000891911591054 + 30 +0.0 + 11 +115.0000891911591054 + 21 +40.0001783823182109 + 31 +0.0 + 0 +LINE + 5 +285 +100 +AcDbEntity +100 +AcDbLine + 8 +2 + 62 +256 +370 +-1 + 6 +ByLayer + 10 +140.0 + 20 +90.0 + 30 +0.0 + 11 +149.9999725038415193 + 21 +65.0000687403962303 + 31 +0.0 + 0 +LINE + 5 +286 +100 +AcDbEntity +100 +AcDbLine + 8 +2 + 62 +256 +370 +-1 + 6 +ByLayer + 10 +149.9999725038415193 + 20 +65.0000687403962303 + 30 +0.0 + 11 +159.9999450076830101 + 21 +40.0001374807924535 + 31 +0.0 + 0 +LINE + 5 +287 +100 +AcDbEntity +100 +AcDbLine + 8 +2 + 62 +256 +370 +-1 + 6 +ByLayer + 10 +159.9999450076830101 + 20 +40.0001374807924535 + 30 +0.0 + 11 +147.4999729933480523 + 21 +15.0000697194141779 + 31 +0.0 + 0 +LINE + 5 +288 +100 +AcDbEntity +100 +AcDbLine + 8 +2 + 62 +256 +370 +-1 + 6 +ByLayer + 10 +147.4999729933480523 + 20 +15.0000697194141779 + 30 +0.0 + 11 +135.0 + 21 +-10.0 + 31 +0.0 + 0 +LINE + 5 +289 +100 +AcDbEntity +100 +AcDbLine + 8 +2 + 62 +256 +370 +-1 + 6 +ByLayer + 10 +135.0 + 20 +-10.0 + 30 +0.0 + 11 +125.000040987657556 + 21 +15.0000982110365175 + 31 +0.0 + 0 +LINE + 5 +28A +100 +AcDbEntity +100 +AcDbLine + 8 +2 + 62 +256 +370 +-1 + 6 +ByLayer + 10 +125.000040987657556 + 20 +15.0000982110365175 + 30 +0.0 + 11 +115.0000891911591054 + 21 +40.0001783823182038 + 31 +0.0 + 0 +LINE + 5 +28B +100 +AcDbEntity +100 +AcDbLine + 8 +2 + 62 +256 +370 +-1 + 6 +ByLayer + 10 +115.0000891911591054 + 20 +40.0001783823182038 + 30 +0.0 + 11 +102.5001337867386439 + 21 +15.0002675734773021 + 31 +0.0 + 0 +LINE + 5 +28C +100 +AcDbEntity +100 +AcDbLine + 8 +2 + 62 +256 +370 +-1 + 6 +ByLayer + 10 +102.5001337867386439 + 20 +15.0002675734773021 + 30 +0.0 + 11 +90.0 + 21 +-10.0 + 31 +0.0 + 0 +LINE + 5 +28D +100 +AcDbEntity +100 +AcDbLine + 8 +2 + 62 +256 +370 +-1 + 6 +ByLayer + 10 +90.0 + 20 +-10.0 + 30 +0.0 + 11 +112.5 + 21 +-10.0 + 31 +0.0 + 0 +LINE + 5 +28E +100 +AcDbEntity +100 +AcDbLine + 8 +2 + 62 +256 +370 +-1 + 6 +ByLayer + 10 +112.5 + 20 +-10.0 + 30 +0.0 + 11 +135.0 + 21 +-10.0 + 31 +0.0 + 0 +LINE + 5 +28F +100 +AcDbEntity +100 +AcDbLine + 8 +2 + 62 +256 +370 +-1 + 6 +ByLayer + 10 +115.0000891911591765 + 20 +40.0001783823180403 + 30 +0.0 + 11 +137.5000391911498241 + 21 +40.0001579315352487 + 31 +0.0 + 0 +LINE + 5 +290 +100 +AcDbEntity +100 +AcDbLine + 8 +2 + 62 +256 +370 +-1 + 6 +ByLayer + 10 +137.5000391911498241 + 20 +40.0001579315352487 + 30 +0.0 + 11 +159.9999450076830101 + 21 +40.0001374807924464 + 31 +0.0 + 0 +LINE + 5 +291 +100 +AcDbEntity +100 +AcDbLine + 8 +0-UGrid + 62 +256 +370 +-1 + 6 +ByLayer + 10 +140.0 + 20 +90.0 + 30 +0.0 + 11 +220.0 + 21 +60.0 + 31 +0.0 + 0 +LINE + 5 +292 +100 +AcDbEntity +100 +AcDbLine + 8 +0-UGrid + 62 +256 +370 +-1 + 6 +ByLayer + 10 +140.0 + 20 +90.0 + 30 +0.0 + 11 +180.0 + 21 +-10.0 + 31 +0.0 + 0 +LINE + 5 +293 +100 +AcDbEntity +100 +AcDbLine + 8 +0-UGrid + 62 +256 +370 +-1 + 6 +ByLayer + 10 +94.5242361313597144 + 20 +84.9471373479288729 + 30 +0.0 + 11 +92.9157837984631954 + 21 +85.1676936334508383 + 31 +0.0 + 0 +LINE + 5 +294 +100 +AcDbEntity +100 +AcDbLine + 8 +1-UGrid DG Part2 Ghost2OverlapEdges + 62 +256 +370 +-1 + 6 +ByLayer + 10 +95.0 + 20 +85.0 + 30 +0.0 + 11 +70.0 + 21 +35.0 + 31 +0.0 + 0 +LINE + 5 +295 +100 +AcDbEntity +100 +AcDbLine + 8 +1-UGrid DG Part2 Ghost2OverlapEdges + 62 +256 +370 +-1 + 6 +ByLayer + 10 +70.0 + 20 +35.0 + 30 +0.0 + 11 +115.0000891911591054 + 21 +40.0001783823182038 + 31 +0.0 + 0 +LINE + 5 +296 +100 +AcDbEntity +100 +AcDbLine + 8 +1-UGrid DG Part2 Ghost2OverlapEdges + 62 +256 +370 +-1 + 6 +ByLayer + 10 +70.0 + 20 +35.0000000000000071 + 30 +0.0 + 11 +90.0 + 21 +-10.0 + 31 +0.0 + 0 +LINE + 5 +297 +100 +AcDbEntity +100 +AcDbLine + 8 +1-UGrid DG Part2 Ghost2OverlapEdges + 62 +256 +370 +-1 + 6 +ByLayer + 10 +50.0 + 20 +80.0 + 30 +0.0 + 11 +70.0 + 21 +35.0000000000000071 + 31 +0.0 + 0 +HATCH + 5 +298 + 8 +1-UGrid DG Part2 Ghost2OverlapVertices + 62 +256 +370 +-1 + 6 +ByLayer +100 +AcDbEntity +100 +AcDbHatch + 10 +0.0 + 20 +0.0 + 30 +0.0 +210 +0.0 +220 +0.0 +230 +1.0 + 2 +SOLID + 70 +1 + 71 +0 + 91 +1 + 92 +1 + 93 +2 + 72 +2 + 10 +70.0 + 20 +35.0 + 40 +7.25 + 50 +0.0 + 51 +360.0 + 73 +1 + 72 +2 + 10 +60.0 + 20 +-70.0 + 40 +7.25 + 50 +0.0 + 51 +360.0 + 73 +1 + 97 +0 + 75 +0 + 76 +1 + 98 +0 + 0 +LINE + 5 +299 +100 +AcDbEntity +100 +AcDbLine + 8 +1-UGrid DG Part2 InteriorEdges + 62 +256 +370 +-1 + 6 +ByLayer + 10 +200.0 + 20 +25.0 + 30 +0.0 + 11 +159.9999450076830101 + 21 +40.0001374807924535 + 31 +0.0 + 0 +LINE + 5 +29A +100 +AcDbEntity +100 +AcDbLine + 8 +1-UGrid DG Part2 InteriorEdges + 62 +256 +370 +-1 + 6 +ByLayer + 10 +200.0 + 20 +25.0 + 30 +0.0 + 11 +180.0000175342504178 + 21 +74.9999934246560827 + 31 +0.0 + 0 +HATCH + 5 +29B + 8 +1-UGrid DG Part2 InteriorVertices + 62 +256 +370 +-1 + 6 +ByLayer +100 +AcDbEntity +100 +AcDbHatch + 10 +0.0 + 20 +0.0 + 30 +0.0 +210 +0.0 +220 +0.0 +230 +1.0 + 2 +SOLID + 70 +1 + 71 +0 + 91 +1 + 92 +1 + 93 +7 + 72 +2 + 10 +200.0 + 20 +25.0 + 40 +7.25 + 50 +0.0 + 51 +360.0 + 73 +1 + 72 +2 + 10 +180.0 + 20 +-10.0 + 40 +7.25 + 50 +0.0 + 51 +360.0 + 73 +1 + 72 +2 + 10 +240.0 + 20 +-60.0 + 40 +7.25 + 50 +0.0 + 51 +360.0 + 73 +1 + 72 +2 + 10 +159.9999450076830385 + 20 +40.0001374807924819 + 40 +7.25 + 50 +0.0 + 51 +360.0 + 73 +1 + 72 +2 + 10 +180.0000175342504178 + 20 +74.9999934246560969 + 40 +7.25 + 50 +0.0 + 51 +360.0 + 73 +1 + 72 +2 + 10 +200.0 + 20 +120.0 + 40 +7.25 + 50 +0.0 + 51 +360.0 + 73 +1 + 72 +2 + 10 +220.0 + 20 +60.0 + 40 +7.25 + 50 +0.0 + 51 +360.0 + 73 +1 + 97 +0 + 75 +0 + 76 +1 + 98 +0 + 0 +LINE + 5 +29C +100 +AcDbEntity +100 +AcDbLine + 8 +1-UGrid New Triangles + 62 +256 +370 +-1 + 6 +ByLayer + 10 +115.0000891911591054 + 20 +40.0001783823182038 + 30 +0.0 + 11 +159.9999450076830101 + 21 +40.0001374807924535 + 31 +0.0 + 0 +LINE + 5 +29D +100 +AcDbEntity +100 +AcDbLine + 8 +1-UGrid New Triangles + 62 +256 +370 +-1 + 6 +ByLayer + 10 +159.9999450076830101 + 20 +40.0001374807924535 + 30 +0.0 + 11 +135.0 + 21 +-10.0 + 31 +0.0 + 0 +LINE + 5 +29E +100 +AcDbEntity +100 +AcDbLine + 8 +1-UGrid New Triangles + 62 +256 +370 +-1 + 6 +ByLayer + 10 +135.0 + 20 +-10.0 + 30 +0.0 + 11 +115.0000891911591054 + 21 +40.0001783823182038 + 31 +0.0 + 0 +LINE + 5 +29F +100 +AcDbEntity +100 +AcDbLine + 8 +1-UGrid New Triangles + 62 +256 +370 +-1 + 6 +ByLayer + 10 +95.2752319396871599 + 20 +85.0305813266319035 + 30 +0.0 + 11 +115.0000891911591054 + 21 +40.0001783823182038 + 31 +0.0 + 0 +LINE + 5 +2A0 +100 +AcDbEntity +100 +AcDbLine + 8 +1-UGrid New Triangles + 62 +256 +370 +-1 + 6 +ByLayer + 10 +159.9999450076830101 + 20 +40.0001374807924535 + 30 +0.0 + 11 +180.0000175342504178 + 21 +74.9999934246560827 + 31 +0.0 + 0 +LINE + 5 +2A1 +100 +AcDbEntity +100 +AcDbLine + 8 +1-UGrid New Triangles + 62 +256 +370 +-1 + 6 +ByLayer + 10 +114.9999989626024757 + 20 +-39.9999987551229665 + 30 +0.0 + 11 +135.0 + 21 +-10.0 + 31 +0.0 + 0 +LINE + 5 +2A2 +100 +AcDbEntity +100 +AcDbLine + 8 +1-UGrid New Triangles + 62 +256 +370 +-1 + 6 +ByLayer + 10 +135.0 + 20 +-10.0 + 30 +0.0 + 11 +159.9997155749006481 + 21 +-40.0004266376490492 + 31 +0.0 + 0 +LINE + 5 +2A3 +100 +AcDbEntity +100 +AcDbLine + 8 +1-UGrid New Triangles + 62 +256 +370 +-1 + 6 +ByLayer + 10 +159.9997155749006481 + 20 +-40.0004266376490492 + 30 +0.0 + 11 +114.9999989626024757 + 21 +-39.9999987551229665 + 31 +0.0 + 0 +LINE + 5 +2A4 +100 +AcDbEntity +100 +AcDbLine + 8 +1-UGrid New Triangles + 62 +256 +370 +-1 + 6 +ByLayer + 10 +115.0000891911591054 + 20 +40.0001783823182038 + 30 +0.0 + 11 +140.0 + 21 +90.0 + 31 +0.0 + 0 +LINE + 5 +2A5 +100 +AcDbEntity +100 +AcDbLine + 8 +1-UGrid New Triangles + 62 +256 +370 +-1 + 6 +ByLayer + 10 +140.0 + 20 +90.0 + 30 +0.0 + 11 +95.2752319396871599 + 21 +85.0305813266319177 + 31 +0.0 + 0 +LINE + 5 +2A6 +100 +AcDbEntity +100 +AcDbLine + 8 +1-UGrid New Triangles + 62 +256 +370 +-1 + 6 +ByLayer + 10 +95.2752319396871599 + 20 +85.0305813266319177 + 30 +0.0 + 11 +50.0 + 21 +80.0 + 31 +0.0 + 0 +LINE + 5 +2A7 +100 +AcDbEntity +100 +AcDbLine + 8 +1-UGrid New Triangles + 62 +256 +370 +-1 + 6 +ByLayer + 10 +50.0 + 20 +80.0 + 30 +0.0 + 11 +68.2762309724051448 + 21 +38.8784803120884348 + 31 +0.0 + 0 +LINE + 5 +2A8 +100 +AcDbEntity +100 +AcDbLine + 8 +1-UGrid New Triangles + 62 +256 +370 +-1 + 6 +ByLayer + 10 +68.2762309724051448 + 20 +38.8784803120884348 + 30 +0.0 + 11 +90.0 + 21 +-10.0 + 31 +0.0 + 0 +LINE + 5 +2A9 +100 +AcDbEntity +100 +AcDbLine + 8 +1-UGrid New Triangles + 62 +256 +370 +-1 + 6 +ByLayer + 10 +90.0 + 20 +-10.0 + 30 +0.0 + 11 +115.0000891911591054 + 21 +40.0001783823181967 + 31 +0.0 + 0 +LINE + 5 +2AA +100 +AcDbEntity +100 +AcDbLine + 8 +1-UGrid New Triangles + 62 +256 +370 +-1 + 6 +ByLayer + 10 +220.0 + 20 +60.0 + 30 +0.0 + 11 +180.0 + 21 +-10.0 + 31 +0.0 + 0 +LINE + 5 +2AB +100 +AcDbEntity +100 +AcDbLine + 8 +1-UGrid New Triangles + 62 +256 +370 +-1 + 6 +ByLayer + 10 +180.0 + 20 +-10.0 + 30 +0.0 + 11 +159.9999450076830385 + 21 +40.0001374807924535 + 31 +0.0 + 0 +LINE + 5 +2AC +100 +AcDbEntity +100 +AcDbLine + 8 +1-UGrid New Triangles + 62 +256 +370 +-1 + 6 +ByLayer + 10 +159.9999450076830385 + 20 +40.0001374807924535 + 30 +0.0 + 11 +140.0 + 21 +90.0 + 31 +0.0 + 0 +LINE + 5 +2AD +100 +AcDbEntity +100 +AcDbLine + 8 +1-UGrid New Triangles + 62 +256 +370 +-1 + 6 +ByLayer + 10 +140.0 + 20 +-70.0 + 30 +0.0 + 11 +90.0 + 21 +-10.0 + 31 +0.0 + 0 +LINE + 5 +2AE +100 +AcDbEntity +100 +AcDbLine + 8 +1-UGrid New Triangles + 62 +256 +370 +-1 + 6 +ByLayer + 10 +180.0 + 20 +-10.0 + 30 +0.0 + 11 +159.9997155749006197 + 21 +-40.0004266376490492 + 31 +0.0 + 0 +LINE + 5 +2AF +100 +AcDbEntity +100 +AcDbLine + 8 +1-UGrid New Triangles + 62 +256 +370 +-1 + 6 +ByLayer + 10 +159.9997155749006197 + 20 +-40.0004266376490492 + 30 +0.0 + 11 +140.0 + 21 +-70.0 + 31 +0.0 + 0 +LINE + 5 +2B0 +100 +AcDbEntity +100 +AcDbLine + 8 +1-UGrid New Triangles + 62 +256 +370 +-1 + 6 +ByLayer + 10 +90.0 + 20 +-10.0 + 30 +0.0 + 11 +135.0 + 21 +-10.0 + 31 +0.0 + 0 +LINE + 5 +2B1 +100 +AcDbEntity +100 +AcDbLine + 8 +1-UGrid New Triangles + 62 +256 +370 +-1 + 6 +ByLayer + 10 +135.0 + 20 +-10.0 + 30 +0.0 + 11 +180.0 + 21 +-10.0 + 31 +0.0 + 0 +LINE + 5 +2B2 +100 +AcDbEntity +100 +AcDbLine + 8 +1-UGrid New Triangles + 62 +256 +370 +-1 + 6 +ByLayer + 10 +140.0 + 20 +90.0 + 30 +0.0 + 11 +180.0000175342504178 + 21 +74.9999934246560969 + 31 +0.0 + 0 +LINE + 5 +2B3 +100 +AcDbEntity +100 +AcDbLine + 8 +1-UGrid New Triangles + 62 +256 +370 +-1 + 6 +ByLayer + 10 +180.0000175342504178 + 20 +74.9999934246560969 + 30 +0.0 + 11 +220.0 + 21 +60.0 + 31 +0.0 + 0 +LINE + 5 +2B4 +100 +AcDbEntity +100 +AcDbLine + 8 +1-UGrid New Triangles + 62 +256 +370 +-1 + 6 +ByLayer + 10 +180.0000175342504178 + 20 +74.9999934246560969 + 30 +0.0 + 11 +200.0 + 21 +25.0 + 31 +0.0 + 0 +LINE + 5 +2B5 +100 +AcDbEntity +100 +AcDbLine + 8 +1-UGrid New Triangles + 62 +256 +370 +-1 + 6 +ByLayer + 10 +200.0 + 20 +24.9999999999999929 + 30 +0.0 + 11 +159.9999450076830385 + 21 +40.0001374807924819 + 31 +0.0 + 0 +LINE + 5 +2B6 +100 +AcDbEntity +100 +AcDbLine + 8 +1-UGrid New Triangles + 62 +256 +370 +-1 + 6 +ByLayer + 10 +70.0 + 20 +35.0000000000000071 + 30 +0.0 + 11 +115.0000891911591054 + 21 +40.0001783823182038 + 31 +0.0 + 0 +LINE + 5 +2B7 +100 +AcDbEntity +100 +AcDbLine + 8 +1-UGrid New Triangles + 62 +256 +370 +-1 + 6 +ByLayer + 10 +70.0 + 20 +35.0000000000000071 + 30 +0.0 + 11 +95.0 + 21 +85.0000000000000142 + 31 +0.0 + 0 +POINT + 5 +2B8 +100 +AcDbEntity +100 +AcDbPoint + 8 +1-UGrid Vertex Idx + 62 +256 +370 +-1 + 6 +ByLayer + 10 +102.5001337867386582 + 20 +15.0002675734773092 + 30 +0.0 + 0 +POINT + 5 +2B9 +100 +AcDbEntity +100 +AcDbPoint + 8 +1-UGrid Vertex Idx + 62 +256 +370 +-1 + 6 +ByLayer + 10 +147.4999729933480523 + 20 +15.000069719414185 + 30 +0.0 + 0 +POINT + 5 +2BA +100 +AcDbEntity +100 +AcDbPoint + 8 +1-UGrid Vertex Idx + 62 +256 +370 +-1 + 6 +ByLayer + 10 +115.0000891911591054 + 20 +40.0001783823182038 + 30 +0.0 + 0 +POINT + 5 +2BB +100 +AcDbEntity +100 +AcDbPoint + 8 +1-UGrid Vertex Idx + 62 +256 +370 +-1 + 6 +ByLayer + 10 +149.9999725038415193 + 20 +65.0000687403962303 + 30 +0.0 + 0 +POINT + 5 +2BC +100 +AcDbEntity +100 +AcDbPoint + 8 +1-UGrid Vertex Idx + 62 +256 +370 +-1 + 6 +ByLayer + 10 +149.9999725038414908 + 20 +65.0000687403962303 + 30 +0.0 + 0 +POINT + 5 +2BD +100 +AcDbEntity +100 +AcDbPoint + 8 +1-UGrid Vertex Idx + 62 +256 +370 +-1 + 6 +ByLayer + 10 +127.5000445955795527 + 20 +65.0000891911591054 + 30 +0.0 + 0 +MTEXT + 5 +2BE +100 +AcDbEntity +100 +AcDbMText + 8 +2-Triangles + 62 +256 +370 +-1 + 6 +ByLayer + 10 +101.7609509658366989 + 20 +-1.2455832025757063 + 30 +0.0 + 40 +3.0 + 41 +100.0 + 71 +5 + 72 +2 + 1 +D29 + 7 +greeks + 50 +0.0 + 73 +0 + 44 +1.0 + 0 +MTEXT + 5 +2BF +100 +AcDbEntity +100 +AcDbMText + 8 +2-Triangles + 62 +256 +370 +-1 + 6 +ByLayer + 10 +124.7910609212629112 + 20 +-1.5133751788015928 + 30 +0.0 + 40 +3.0 + 41 +100.0 + 71 +5 + 72 +2 + 1 +D31 + 7 +greeks + 50 +0.0 + 73 +0 + 44 +1.0 + 0 +MTEXT + 5 +2C0 +100 +AcDbEntity +100 +AcDbMText + 8 +2-Triangles + 62 +256 +370 +-1 + 6 +ByLayer + 10 +114.6149658246792313 + 20 +23.6590705864316959 + 30 +0.0 + 40 +3.0 + 41 +100.0 + 71 +5 + 72 +2 + 1 +D30 + 7 +greeks + 50 +0.0 + 73 +0 + 44 +1.0 + 0 +MTEXT + 5 +2C1 +100 +AcDbEntity +100 +AcDbMText + 8 +2-Triangles + 62 +256 +370 +-1 + 6 +ByLayer + 10 +113.5437979197756846 + 20 +6.5203841079749889 + 30 +0.0 + 40 +3.0 + 41 +100.0 + 71 +5 + 72 +2 + 1 +D32 + 7 +greeks + 50 +0.0 + 73 +0 + 44 +1.0 + 0 +MTEXT + 5 +2C2 +100 +AcDbEntity +100 +AcDbMText + 8 +2-Triangles + 62 +256 +370 +-1 + 6 +ByLayer + 10 +125.9961248142793977 + 20 +31.2911419088694487 + 30 +0.0 + 40 +3.0 + 41 +100.0 + 71 +5 + 72 +2 + 1 +D33 + 7 +greeks + 50 +0.0 + 73 +0 + 44 +1.0 + 0 +MTEXT + 5 +2C3 +100 +AcDbEntity +100 +AcDbMText + 8 +2-Triangles + 62 +256 +370 +-1 + 6 +ByLayer + 10 +135.6366359584112899 + 20 +6.3864881198620456 + 30 +0.0 + 40 +3.0 + 41 +100.0 + 71 +5 + 72 +2 + 1 +D34 + 7 +greeks + 50 +0.0 + 73 +0 + 44 +1.0 + 0 +MTEXT + 5 +2C4 +100 +AcDbEntity +100 +AcDbMText + 8 +2-Triangles + 62 +256 +370 +-1 + 6 +ByLayer + 10 +148.3567548291408684 + 20 +31.5589338850953318 + 30 +0.0 + 40 +3.0 + 41 +100.0 + 71 +5 + 72 +2 + 1 +D35 + 7 +greeks + 50 +0.0 + 73 +0 + 44 +1.0 + 0 +MTEXT + 5 +2C5 +100 +AcDbEntity +100 +AcDbMText + 8 +2-Triangles + 62 +256 +370 +-1 + 6 +ByLayer + 10 +136.9755958395407163 + 20 +23.7929665745446393 + 30 +0.0 + 40 +3.0 + 41 +100.0 + 71 +5 + 72 +2 + 1 +D36 + 7 +greeks + 50 +0.0 + 73 +0 + 44 +1.0 + 0 +MTEXT + 5 +2C6 +100 +AcDbEntity +100 +AcDbMText + 8 +2-Triangles + 62 +256 +370 +-1 + 6 +ByLayer + 10 +126.7995007429570506 + 20 +48.5637243754391079 + 30 +0.0 + 40 +3.0 + 41 +100.0 + 71 +5 + 72 +2 + 1 +D37 + 7 +greeks + 50 +0.0 + 73 +0 + 44 +1.0 + 0 +MTEXT + 5 +2C7 +100 +AcDbEntity +100 +AcDbMText + 8 +2-Triangles + 62 +256 +370 +-1 + 6 +ByLayer + 10 +148.892338781592656 + 20 +48.429828387326161 + 30 +0.0 + 40 +3.0 + 41 +100.0 + 71 +5 + 72 +2 + 1 +D38 + 7 +greeks + 50 +0.0 + 73 +0 + 44 +1.0 + 0 +MTEXT + 5 +2C8 +100 +AcDbEntity +100 +AcDbMText + 8 +2-Triangles + 62 +256 +370 +-1 + 6 +ByLayer + 10 +139.5196196136866433 + 20 +73.3344821763335659 + 30 +0.0 + 40 +3.0 + 41 +100.0 + 71 +5 + 72 +2 + 1 +D39 + 7 +greeks + 50 +0.0 + 73 +0 + 44 +1.0 + 0 +MTEXT + 5 +2C9 +100 +AcDbEntity +100 +AcDbMText + 8 +2-Triangles + 62 +256 +370 +-1 + 6 +ByLayer + 10 +137.912867756331309 + 20 +56.4635876741027403 + 30 +0.0 + 40 +3.0 + 41 +100.0 + 71 +5 + 72 +2 + 1 +D40 + 7 +greeks + 50 +0.0 + 73 +0 + 44 +1.0 + 0 +MTEXT + 5 +2CA +100 +AcDbEntity +100 +AcDbMText + 8 +2-Triangles + 62 +256 +370 +-1 + 6 +ByLayer + 10 +105.6439346211120665 + 20 +78.2886337365124518 + 30 +0.0 + 40 +3.0 + 41 +100.0 + 71 +5 + 72 +2 + 1 +D41 + 7 +greeks + 50 +0.0 + 73 +0 + 44 +1.0 + 0 +MTEXT + 5 +2CB +100 +AcDbEntity +100 +AcDbMText + 8 +2-Triangles + 62 +256 +370 +-1 + 6 +ByLayer + 10 +115.2844457652439445 + 20 +56.1957956978768536 + 30 +0.0 + 40 +3.0 + 41 +100.0 + 71 +5 + 72 +2 + 1 +D42 + 7 +greeks + 50 +0.0 + 73 +0 + 44 +1.0 + 0 +MTEXT + 5 +2CC +100 +AcDbEntity +100 +AcDbMText + 8 +2-Triangles + 62 +256 +370 +-1 + 6 +ByLayer + 10 +127.2011887072958984 + 20 +81.9038254155619114 + 30 +0.0 + 40 +3.0 + 41 +100.0 + 71 +5 + 72 +2 + 1 +D43 + 7 +greeks + 50 +0.0 + 73 +0 + 44 +1.0 + 0 +MTEXT + 5 +2CD +100 +AcDbEntity +100 +AcDbMText + 8 +2-Triangles + 62 +256 +370 +-1 + 6 +ByLayer + 10 +117.2928855869380982 + 20 +71.9955222952041254 + 30 +0.0 + 40 +3.0 + 41 +100.0 + 71 +5 + 72 +2 + 1 +D44 + 7 +greeks + 50 +0.0 + 73 +0 + 44 +1.0 + 0 +LINE + 5 +2CE +100 +AcDbEntity +100 +AcDbLine + 8 +2 + 62 +256 +370 +-1 + 6 +ByLayer + 10 +180.0 + 20 +-10.0 + 30 +0.0 + 11 +169.9999725038415193 + 21 +15.0000687403962267 + 31 +0.0 + 0 +LINE + 5 +2CF +100 +AcDbEntity +100 +AcDbLine + 8 +2 + 62 +256 +370 +-1 + 6 +ByLayer + 10 +169.9999725038415193 + 20 +15.0000687403962267 + 30 +0.0 + 11 +159.9999450076830101 + 21 +40.0001374807924464 + 31 +0.0 + 0 +LINE + 5 +2D0 +100 +AcDbEntity +100 +AcDbLine + 8 +2 + 62 +256 +370 +-1 + 6 +ByLayer + 10 +135.0 + 20 +-10.0 + 30 +0.0 + 11 +157.5 + 21 +-10.0 + 31 +0.0 + 0 +LINE + 5 +2D1 +100 +AcDbEntity +100 +AcDbLine + 8 +2 + 62 +256 +370 +-1 + 6 +ByLayer + 10 +157.5 + 20 +-10.0 + 30 +0.0 + 11 +180.0 + 21 +-10.0 + 31 +0.0 + 0 +LINE + 5 +2D2 +100 +AcDbEntity +100 +AcDbLine + 8 +2 + 62 +256 +370 +-1 + 6 +ByLayer + 10 +157.5 + 20 +-10.0 + 30 +0.0 + 11 +147.4999729933480523 + 21 +15.000069719414185 + 31 +0.0 + 0 +LINE + 5 +2D3 +100 +AcDbEntity +100 +AcDbLine + 8 +2 + 62 +256 +370 +-1 + 6 +ByLayer + 10 +147.4999729933480523 + 20 +15.000069719414185 + 30 +0.0 + 11 +169.9999725038415193 + 21 +15.0000687403962267 + 31 +0.0 + 0 +LINE + 5 +2D4 +100 +AcDbEntity +100 +AcDbLine + 8 +2 + 62 +256 +370 +-1 + 6 +ByLayer + 10 +169.9999725038415193 + 20 +15.0000687403962267 + 30 +0.0 + 11 +157.5 + 21 +-10.0 + 31 +0.0 + 0 +LINE + 5 +2D5 +100 +AcDbEntity +100 +AcDbLine + 8 +1-UGrid + 62 +256 +370 +-1 + 6 +ByLayer + 10 +135.0 + 20 +-10.0 + 30 +0.0 + 11 +115.0000891911591054 + 21 +40.0001783823182038 + 31 +0.0 + 0 +LINE + 5 +2D6 +100 +AcDbEntity +100 +AcDbLine + 8 +1-UGrid DG Part2 BorderEdges + 62 +256 +370 +-1 + 6 +ByLayer + 10 +130.0 + 20 +150.0 + 30 +0.0 + 11 +140.0 + 21 +90.0 + 31 +0.0 + 0 +LINE + 5 +2D7 +100 +AcDbEntity +100 +AcDbLine + 8 +1-UGrid DG Part2 BorderEdges + 62 +256 +370 +-1 + 6 +ByLayer + 10 +140.0 + 20 +90.0 + 30 +0.0 + 11 +115.0000891911591054 + 21 +40.0001783823182038 + 31 +0.0 + 0 +LINE + 5 +2D8 +100 +AcDbEntity +100 +AcDbLine + 8 +1-UGrid DG Part2 BorderEdges + 62 +256 +370 +-1 + 6 +ByLayer + 10 +134.9999999999999716 + 20 +-10.0000000000000249 + 30 +0.0 + 11 +159.9997155749006197 + 21 +-40.0004266376490492 + 31 +0.0 + 0 +LINE + 5 +2D9 +100 +AcDbEntity +100 +AcDbLine + 8 +1-UGrid DG Part2 BorderEdges + 62 +256 +370 +-1 + 6 +ByLayer + 10 +159.9997155749006197 + 20 +-40.0004266376490492 + 30 +0.0 + 11 +140.0 + 21 +-70.0 + 31 +0.0 + 0 +LINE + 5 +2DA +100 +AcDbEntity +100 +AcDbLine + 8 +1-UGrid DG Part2 BorderEdges + 62 +256 +370 +-1 + 6 +ByLayer + 10 +115.0000891911591054 + 20 +40.0001783823182038 + 30 +0.0 + 11 +134.9999999999999716 + 21 +-10.0000000000000249 + 31 +0.0 + 0 +HATCH + 5 +2DB + 8 +1-UGrid DG Part2 FrontVertices Example + 62 +256 +370 +-1 + 6 +ByLayer +100 +AcDbEntity +100 +AcDbHatch + 10 +0.0 + 20 +0.0 + 30 +0.0 +210 +0.0 +220 +0.0 +230 +1.0 + 2 +SOLID + 70 +1 + 71 +0 + 91 +1 + 92 +1 + 93 +4 + 72 +2 + 10 +95.2752319396871599 + 20 +85.0305813266319035 + 40 +7.25 + 50 +0.0 + 51 +360.0 + 73 +1 + 72 +2 + 10 +50.0 + 20 +80.0 + 40 +7.25 + 50 +0.0 + 51 +360.0 + 73 +1 + 72 +2 + 10 +90.0 + 20 +-10.0 + 40 +7.25 + 50 +0.0 + 51 +360.0 + 73 +1 + 72 +2 + 10 +114.9999989626024757 + 20 +-39.9999987551229665 + 40 +7.25 + 50 +0.0 + 51 +360.0 + 73 +1 + 97 +0 + 75 +0 + 76 +1 + 98 +0 + 0 +LINE + 5 +2DC +100 +AcDbEntity +100 +AcDbLine + 8 +1-UGrid DG Part2 H5Fed FrontEdges + 62 +256 +370 +-1 + 6 +ByLayer + 10 +50.0 + 20 +80.0 + 30 +0.0 + 11 +95.0 + 21 +85.0 + 31 +0.0 + 0 +LINE + 5 +2DD +100 +AcDbEntity +100 +AcDbLine + 8 +1-UGrid DG Part2 H5Fed FrontEdges + 62 +256 +370 +-1 + 6 +ByLayer + 10 +95.0 + 20 +85.0 + 30 +0.0 + 11 +70.0 + 21 +35.0 + 31 +0.0 + 0 +LINE + 5 +2DE +100 +AcDbEntity +100 +AcDbLine + 8 +1-UGrid DG Part2 H5Fed FrontEdges + 62 +256 +370 +-1 + 6 +ByLayer + 10 +70.0 + 20 +35.0 + 30 +0.0 + 11 +90.0 + 21 +-10.0 + 31 +0.0 + 0 +LINE + 5 +2DF +100 +AcDbEntity +100 +AcDbLine + 8 +1-UGrid DG Part2 H5Fed FrontEdges + 62 +256 +370 +-1 + 6 +ByLayer + 10 +90.0 + 20 +-10.0 + 30 +0.0 + 11 +60.0 + 21 +-70.0 + 31 +0.0 + 0 +LINE + 5 +2E0 +100 +AcDbEntity +100 +AcDbLine + 8 +1-UGrid DG Part2 H5Fed OverlapEdges + 62 +256 +370 +-1 + 6 +ByLayer + 10 +140.0 + 20 +-70.0 + 30 +0.0 + 11 +90.0 + 21 +-10.0 + 31 +0.0 + 0 +LINE + 5 +2E1 +100 +AcDbEntity +100 +AcDbLine + 8 +1-UGrid DG Part2 H5Fed OverlapEdges + 62 +256 +370 +-1 + 6 +ByLayer + 10 +90.0 + 20 +-10.0 + 30 +0.0 + 11 +135.0 + 21 +-10.0 + 31 +0.0 + 0 +LINE + 5 +2E2 +100 +AcDbEntity +100 +AcDbLine + 8 +1-UGrid DG Part2 H5Fed OverlapEdges + 62 +256 +370 +-1 + 6 +ByLayer + 10 +114.9999989626024757 + 20 +-39.9999987551229665 + 30 +0.0 + 11 +134.9999999999999716 + 21 +-10.0000000000000355 + 31 +0.0 + 0 +LINE + 5 +2E3 +100 +AcDbEntity +100 +AcDbLine + 8 +1-UGrid DG Part2 H5Fed OverlapEdges + 62 +256 +370 +-1 + 6 +ByLayer + 10 +90.0 + 20 +-10.0 + 30 +0.0 + 11 +115.0000891911591054 + 21 +40.0001783823182038 + 31 +0.0 + 0 +LINE + 5 +2E4 +100 +AcDbEntity +100 +AcDbLine + 8 +1-UGrid DG Part2 H5Fed OverlapEdges + 62 +256 +370 +-1 + 6 +ByLayer + 10 +115.0000891911591054 + 20 +40.0001783823182038 + 30 +0.0 + 11 +70.0 + 21 +35.0 + 31 +0.0 + 0 +LINE + 5 +2E5 +100 +AcDbEntity +100 +AcDbLine + 8 +1-UGrid DG Part2 H5Fed OverlapEdges + 62 +256 +370 +-1 + 6 +ByLayer + 10 +115.0000891911591054 + 20 +40.0001783823182038 + 30 +0.0 + 11 +95.2752319396871599 + 21 +85.0305813266319177 + 31 +0.0 + 0 +HATCH + 5 +2E6 + 8 +1-UGrid DG Part2 BorderVertices + 62 +256 +370 +-1 + 6 +ByLayer +100 +AcDbEntity +100 +AcDbHatch + 10 +0.0 + 20 +0.0 + 30 +0.0 +210 +0.0 +220 +0.0 +230 +1.0 + 2 +SOLID + 70 +1 + 71 +0 + 91 +1 + 92 +1 + 93 +1 + 72 +2 + 10 +130.0 + 20 +150.0 + 40 +7.25 + 50 +0.0 + 51 +360.0 + 73 +1 + 97 +0 + 75 +0 + 76 +1 + 98 +0 + 0 +HATCH + 5 +2E7 + 8 +1-UGrid DG Part2 BorderVertices + 62 +256 +370 +-1 + 6 +ByLayer +100 +AcDbEntity +100 +AcDbHatch + 10 +0.0 + 20 +0.0 + 30 +0.0 +210 +0.0 +220 +0.0 +230 +1.0 + 2 +SOLID + 70 +1 + 71 +0 + 91 +1 + 92 +1 + 93 +5 + 72 +2 + 10 +140.0 + 20 +90.0 + 40 +7.25 + 50 +0.0 + 51 +360.0 + 73 +1 + 72 +2 + 10 +115.0000891911591054 + 20 +40.0001783823182038 + 40 +7.25 + 50 +0.0 + 51 +360.0 + 73 +1 + 72 +2 + 10 +135.0 + 20 +-10.0 + 40 +7.25 + 50 +0.0 + 51 +360.0 + 73 +1 + 72 +2 + 10 +159.9997155749006197 + 20 +-40.0004266376490492 + 40 +7.25 + 50 +0.0 + 51 +360.0 + 73 +1 + 72 +2 + 10 +140.0 + 20 +-70.0 + 40 +7.25 + 50 +0.0 + 51 +360.0 + 73 +1 + 97 +0 + 75 +0 + 76 +1 + 98 +0 + 0 +HATCH + 5 +2E8 + 8 +1-UGrid DG Part2 OverlapVertices H5Fed + 62 +256 +370 +-1 + 6 +ByLayer +100 +AcDbEntity +100 +AcDbHatch + 10 +0.0 + 20 +0.0 + 30 +0.0 +210 +0.0 +220 +0.0 +230 +1.0 + 2 +SOLID + 70 +1 + 71 +0 + 91 +1 + 92 +1 + 93 +1 + 72 +2 + 10 +114.9999989626024757 + 20 +-39.9999987551229665 + 40 +7.25 + 50 +0.0 + 51 +360.0 + 73 +1 + 97 +0 + 75 +0 + 76 +1 + 98 +0 + 0 +LINE + 5 +2E9 +100 +AcDbEntity +100 +AcDbLine + 8 +0-UGrid + 62 +256 +370 +-1 + 6 +ByLayer + 10 +140.0 + 20 +90.0 + 30 +0.0 + 11 +90.0 + 21 +-10.0 + 31 +0.0 + 0 +LINE + 5 +2EA +100 +AcDbEntity +100 +AcDbLine + 8 +0-UGrid DG Part2 BorderEdges + 62 +256 +370 +-1 + 6 +ByLayer + 10 +220.0 + 20 +60.0 + 30 +0.0 + 11 +140.0 + 21 +90.0 + 31 +0.0 + 0 +LINE + 5 +2EB +100 +AcDbEntity +100 +AcDbLine + 8 +0-UGrid DG Part2 BorderEdges + 62 +256 +370 +-1 + 6 +ByLayer + 10 +140.0 + 20 +90.0 + 30 +0.0 + 11 +90.0 + 21 +-10.0 + 31 +0.0 + 0 +LINE + 5 +2EC +100 +AcDbEntity +100 +AcDbLine + 8 +0-UGrid DG Part2 BorderEdges + 62 +256 +370 +-1 + 6 +ByLayer + 10 +90.0 + 20 +-10.0 + 30 +0.0 + 11 +60.0 + 21 +-70.0 + 31 +0.0 + 0 +LINE + 5 +2ED +100 +AcDbEntity +100 +AcDbLine + 8 +1-UGrid 0Part1 FrontEdges H5Fed + 62 +256 +370 +-1 + 6 +ByLayer + 10 +140.0 + 20 +-70.0 + 30 +0.0 + 11 +114.9999989626024757 + 21 +-39.9999987551229665 + 31 +0.0 + 0 +LINE + 5 +2EE +100 +AcDbEntity +100 +AcDbLine + 8 +1-UGrid 0Part1 FrontEdges H5Fed + 62 +256 +370 +-1 + 6 +ByLayer + 10 +114.9999989626024757 + 20 +-39.9999987551229665 + 30 +0.0 + 11 +135.0 + 21 +-10.0 + 31 +0.0 + 0 +LINE + 5 +2EF +100 +AcDbEntity +100 +AcDbLine + 8 +1-UGrid 0Part1 FrontEdges H5Fed + 62 +256 +370 +-1 + 6 +ByLayer + 10 +135.0 + 20 +-10.0 + 30 +0.0 + 11 +159.9999450076830385 + 21 +40.0001374807924819 + 31 +0.0 + 0 +LINE + 5 +2F0 +100 +AcDbEntity +100 +AcDbLine + 8 +1-UGrid 0Part1 FrontEdges H5Fed + 62 +256 +370 +-1 + 6 +ByLayer + 10 +159.9999450076830385 + 20 +40.0001374807924819 + 30 +0.0 + 11 +200.0 + 21 +24.9999999999999964 + 31 +0.0 + 0 +LINE + 5 +2F1 +100 +AcDbEntity +100 +AcDbLine + 8 +1-UGrid 0Part1 FrontEdges H5Fed + 62 +256 +370 +-1 + 6 +ByLayer + 10 +200.0 + 20 +24.9999999999999964 + 30 +0.0 + 11 +180.0 + 21 +-10.0 + 31 +0.0 + 0 +LINE + 5 +2F2 +100 +AcDbEntity +100 +AcDbLine + 8 +1-UGrid 0Part1 FrontEdges H5Fed + 62 +256 +370 +-1 + 6 +ByLayer + 10 +180.0 + 20 +-10.0 + 30 +0.0 + 11 +240.0 + 21 +-60.0 + 31 +0.0 + 0 +LINE + 5 +2F3 +100 +AcDbEntity +100 +AcDbLine + 8 +1-UGrid 0Part1 OverlapEdges H5Fed + 62 +256 +370 +-1 + 6 +ByLayer + 10 +60.0 + 20 +-70.0 + 30 +0.0 + 11 +140.0 + 21 +-70.0 + 31 +0.0 + 0 +LINE + 5 +2F4 +100 +AcDbEntity +100 +AcDbLine + 8 +1-UGrid 0Part1 OverlapEdges H5Fed + 62 +256 +370 +-1 + 6 +ByLayer + 10 +90.0 + 20 +-10.0 + 30 +0.0 + 11 +114.9999989626024757 + 21 +-39.9999987551229665 + 31 +0.0 + 0 +LINE + 5 +2F5 +100 +AcDbEntity +100 +AcDbLine + 8 +1-UGrid 0Part1 OverlapEdges H5Fed + 62 +256 +370 +-1 + 6 +ByLayer + 10 +90.0 + 20 +-10.0 + 30 +0.0 + 11 +135.0 + 21 +-10.0 + 31 +0.0 + 0 +LINE + 5 +2F6 +100 +AcDbEntity +100 +AcDbLine + 8 +1-UGrid 0Part1 OverlapEdges H5Fed + 62 +256 +370 +-1 + 6 +ByLayer + 10 +135.0 + 20 +-10.0 + 30 +0.0 + 11 +115.0000891911591054 + 21 +40.0001783823182038 + 31 +0.0 + 0 +LINE + 5 +2F7 +100 +AcDbEntity +100 +AcDbLine + 8 +1-UGrid 0Part1 OverlapEdges H5Fed + 62 +256 +370 +-1 + 6 +ByLayer + 10 +115.0000891911591054 + 20 +40.0001783823182038 + 30 +0.0 + 11 +159.9999450076831238 + 21 +40.0001374807924535 + 31 +0.0 + 0 +LINE + 5 +2F8 +100 +AcDbEntity +100 +AcDbLine + 8 +1-UGrid 0Part1 OverlapEdges H5Fed + 62 +256 +370 +-1 + 6 +ByLayer + 10 +159.9999450076831238 + 20 +40.0001374807924535 + 30 +0.0 + 11 +140.0 + 21 +90.0 + 31 +0.0 + 0 +LINE + 5 +2F9 +100 +AcDbEntity +100 +AcDbLine + 8 +1-UGrid 0Part1 OverlapEdges H5Fed + 62 +256 +370 +-1 + 6 +ByLayer + 10 +159.9999450076830385 + 20 +40.0001374807924535 + 30 +0.0 + 11 +180.0000175342504178 + 21 +74.9999934246560969 + 31 +0.0 + 0 +LINE + 5 +2FA +100 +AcDbEntity +100 +AcDbLine + 8 +1-UGrid 0Part1 OverlapEdges H5Fed + 62 +256 +370 +-1 + 6 +ByLayer + 10 +180.0000175342504178 + 20 +74.9999934246560969 + 30 +0.0 + 11 +200.0 + 21 +24.9999999999999964 + 31 +0.0 + 0 +LINE + 5 +2FB +100 +AcDbEntity +100 +AcDbLine + 8 +1-UGrid 0Part1 OverlapEdges H5Fed + 62 +256 +370 +-1 + 6 +ByLayer + 10 +200.0 + 20 +24.9999999999999964 + 30 +0.0 + 11 +220.0 + 21 +60.0 + 31 +0.0 + 0 +LINE + 5 +2FC +100 +AcDbEntity +100 +AcDbLine + 8 +1-UGrid 0Part1 OverlapEdges H5Fed + 62 +256 +370 +-1 + 6 +ByLayer + 10 +220.0 + 20 +60.0 + 30 +0.0 + 11 +240.0 + 21 +-60.0 + 31 +0.0 + 0 +LINE + 5 +2FD +100 +AcDbEntity +100 +AcDbLine + 8 +1-UGrid 0Part1 BorderEdges H5Fed + 62 +256 +370 +-1 + 6 +ByLayer + 10 +173.2116309968748453 + 20 +77.5456383761719508 + 30 +0.0 + 11 +140.0 + 21 +90.0 + 31 +0.0 + 0 +LINE + 5 +2FE +100 +AcDbEntity +100 +AcDbLine + 8 +1-UGrid 0Part1 BorderEdges H5Fed + 62 +256 +370 +-1 + 6 +ByLayer + 10 +140.0 + 20 +90.0 + 30 +0.0 + 11 +115.0000891911591054 + 21 +40.0001783823182038 + 31 +0.0 + 0 +LINE + 5 +2FF +100 +AcDbEntity +100 +AcDbLine + 8 +1-UGrid 0Part1 BorderEdges H5Fed + 62 +256 +370 +-1 + 6 +ByLayer + 10 +115.0000891911591054 + 20 +40.0001783823182038 + 30 +0.0 + 11 +90.0 + 21 +-10.0000000000000036 + 31 +0.0 + 0 +LINE + 5 +300 +100 +AcDbEntity +100 +AcDbLine + 8 +1-UGrid 0Part1 BorderEdges H5Fed + 62 +256 +370 +-1 + 6 +ByLayer + 10 +90.0 + 20 +-10.0000000000000036 + 30 +0.0 + 11 +60.0 + 21 +-70.0 + 31 +0.0 + 0 +HATCH + 5 +301 + 8 +1-UGrid 0Part1 InteriorVertices H5Fed + 62 +256 +370 +-1 + 6 +ByLayer +100 +AcDbEntity +100 +AcDbHatch + 10 +0.0 + 20 +0.0 + 30 +0.0 +210 +0.0 +220 +0.0 +230 +1.0 + 2 +SOLID + 70 +1 + 71 +0 + 91 +1 + 92 +1 + 93 +6 + 72 +2 + 10 +70.0 + 20 +35.0 + 40 +7.25 + 50 +0.0 + 51 +360.0 + 73 +1 + 72 +2 + 10 +95.0 + 20 +85.0 + 40 +7.25 + 50 +0.0 + 51 +360.0 + 73 +1 + 72 +2 + 10 +130.0 + 20 +150.0 + 40 +7.25 + 50 +0.0 + 51 +360.0 + 73 +1 + 72 +2 + 10 +50.0 + 20 +80.0 + 40 +7.25 + 50 +0.0 + 51 +360.0 + 73 +1 + 72 +2 + 10 +200.0 + 20 +120.0 + 40 +7.25 + 50 +0.0 + 51 +360.0 + 73 +1 + 72 +2 + 10 +0.0 + 20 +0.0 + 40 +7.25 + 50 +0.0 + 51 +360.0 + 73 +1 + 97 +0 + 75 +0 + 76 +1 + 98 +0 + 0 +LINE + 5 +302 +100 +AcDbEntity +100 +AcDbLine + 8 +1-UGrid + 62 +256 +370 +-1 + 6 +ByLayer + 10 +180.0000175342504178 + 20 +74.9999934246560969 + 30 +0.0 + 11 +220.0 + 21 +60.0 + 31 +0.0 + 0 +CIRCLE + 5 +303 +100 +AcDbEntity +100 +AcDbCircle + 8 +1-NGraph + 62 +256 +370 +-1 + 6 +ByLayer + 10 +90.0 + 20 +-10.0 + 30 +0.0 + 40 +7.25 + 0 +CIRCLE + 5 +304 +100 +AcDbEntity +100 +AcDbCircle + 8 +1-NGraph + 62 +256 +370 +-1 + 6 +ByLayer + 10 +115.0000891911591054 + 20 +40.0001783823182038 + 30 +0.0 + 40 +7.25 + 0 +CIRCLE + 5 +305 +100 +AcDbEntity +100 +AcDbCircle + 8 +1-NGraph + 62 +256 +370 +-1 + 6 +ByLayer + 10 +140.0 + 20 +90.0 + 30 +0.0 + 40 +7.25 + 0 +CIRCLE + 5 +306 +100 +AcDbEntity +100 +AcDbCircle + 8 +1-NGraph + 62 +256 +370 +-1 + 6 +ByLayer + 10 +60.0 + 20 +-70.0 + 30 +0.0 + 40 +7.25 + 0 +CIRCLE + 5 +307 +100 +AcDbEntity +100 +AcDbCircle + 8 +1-NGraph + 62 +256 +370 +-1 + 6 +ByLayer + 10 +180.0000175342504178 + 20 +74.9999934246560969 + 30 +0.0 + 40 +7.25 + 0 +CIRCLE + 5 +308 +100 +AcDbEntity +100 +AcDbCircle + 8 +1-NGraph + 62 +256 +370 +-1 + 6 +ByLayer + 10 +220.0 + 20 +60.0 + 30 +0.0 + 40 +7.25 + 0 +LINE + 5 +309 +100 +AcDbEntity +100 +AcDbLine + 8 +1-UGrid 0Part1 BorderEdges H5Fed + 62 +256 +370 +-1 + 6 +ByLayer + 10 +220.0 + 20 +60.0 + 30 +0.0 + 11 +173.2116309968748453 + 21 +77.5456383761719508 + 31 +0.0 + 0 +LINE + 5 +30A +100 +AcDbEntity +100 +AcDbLine + 8 +0-UGrid Part1 BorderEdges H5Fed + 62 +256 +370 +-1 + 6 +ByLayer + 10 +220.0 + 20 +60.0 + 30 +0.0 + 11 +140.0 + 21 +90.0 + 31 +0.0 + 0 +LINE + 5 +30B +100 +AcDbEntity +100 +AcDbLine + 8 +0-UGrid Part1 BorderEdges H5Fed + 62 +256 +370 +-1 + 6 +ByLayer + 10 +140.0 + 20 +90.0 + 30 +0.0 + 11 +90.0 + 21 +-10.0 + 31 +0.0 + 0 +LINE + 5 +30C +100 +AcDbEntity +100 +AcDbLine + 8 +0-UGrid Part1 BorderEdges H5Fed + 62 +256 +370 +-1 + 6 +ByLayer + 10 +90.0 + 20 +-10.0 + 30 +0.0 + 11 +60.0 + 21 +-70.0 + 31 +0.0 + 0 +LINE + 5 +30D +100 +AcDbEntity +100 +AcDbLine + 8 +0-UGrid Part1 FrontEdges H5Fed + 62 +256 +370 +-1 + 6 +ByLayer + 10 +240.0 + 20 +-60.0 + 30 +0.0 + 11 +180.0 + 21 +-10.0 + 31 +0.0 + 0 +LINE + 5 +30E +100 +AcDbEntity +100 +AcDbLine + 8 +0-UGrid Part1 FrontEdges H5Fed + 62 +256 +370 +-1 + 6 +ByLayer + 10 +180.0 + 20 +-10.0 + 30 +0.0 + 11 +140.0 + 21 +-70.0 + 31 +0.0 + 0 +LINE + 5 +30F +100 +AcDbEntity +100 +AcDbLine + 8 +0-UGrid Part1 InteriorEdges H5Fed + 62 +256 +370 +-1 + 6 +ByLayer + 10 +217.7073486963779203 + 20 +66.8779539108662107 + 30 +0.0 + 11 +200.0 + 21 +120.0 + 31 +0.0 + 0 +LINE + 5 +310 +100 +AcDbEntity +100 +AcDbLine + 8 +0-UGrid Part1 InteriorEdges H5Fed + 62 +256 +370 +-1 + 6 +ByLayer + 10 +200.0 + 20 +120.0 + 30 +0.0 + 11 +130.0 + 21 +150.0 + 31 +0.0 + 0 +LINE + 5 +311 +100 +AcDbEntity +100 +AcDbLine + 8 +0-UGrid Part1 InteriorEdges H5Fed + 62 +256 +370 +-1 + 6 +ByLayer + 10 +130.0 + 20 +150.0 + 30 +0.0 + 11 +50.0 + 21 +80.0 + 31 +0.0 + 0 +LINE + 5 +312 +100 +AcDbEntity +100 +AcDbLine + 8 +0-UGrid Part1 InteriorEdges H5Fed + 62 +256 +370 +-1 + 6 +ByLayer + 10 +50.0 + 20 +80.0 + 30 +0.0 + 11 +0.0 + 21 +0.0 + 31 +0.0 + 0 +LINE + 5 +313 +100 +AcDbEntity +100 +AcDbLine + 8 +0-UGrid Part1 InteriorEdges H5Fed + 62 +256 +370 +-1 + 6 +ByLayer + 10 +0.0 + 20 +0.0 + 30 +0.0 + 11 +60.0 + 21 +-70.0 + 31 +0.0 + 0 +LINE + 5 +314 +100 +AcDbEntity +100 +AcDbLine + 8 +0-UGrid Part1 InteriorEdges H5Fed + 62 +256 +370 +-1 + 6 +ByLayer + 10 +0.0 + 20 +0.0 + 30 +0.0 + 11 +90.0 + 21 +-10.0 + 31 +0.0 + 0 +LINE + 5 +315 +100 +AcDbEntity +100 +AcDbLine + 8 +0-UGrid Part1 InteriorEdges H5Fed + 62 +256 +370 +-1 + 6 +ByLayer + 10 +90.0 + 20 +-10.0 + 30 +0.0 + 11 +50.0 + 21 +80.0 + 31 +0.0 + 0 +LINE + 5 +316 +100 +AcDbEntity +100 +AcDbLine + 8 +0-UGrid Part1 InteriorEdges H5Fed + 62 +256 +370 +-1 + 6 +ByLayer + 10 +50.0 + 20 +80.0 + 30 +0.0 + 11 +140.0 + 21 +90.0 + 31 +0.0 + 0 +LINE + 5 +317 +100 +AcDbEntity +100 +AcDbLine + 8 +0-UGrid Part1 InteriorEdges H5Fed + 62 +256 +370 +-1 + 6 +ByLayer + 10 +140.0 + 20 +90.0 + 30 +0.0 + 11 +130.0 + 21 +150.0 + 31 +0.0 + 0 +LINE + 5 +318 +100 +AcDbEntity +100 +AcDbLine + 8 +0-UGrid Part1 InteriorEdges H5Fed + 62 +256 +370 +-1 + 6 +ByLayer + 10 +140.0 + 20 +90.0 + 30 +0.0 + 11 +200.0 + 21 +120.0 + 31 +0.0 + 0 +LINE + 5 +319 +100 +AcDbEntity +100 +AcDbLine + 8 +0-UGrid Part1 OverlapEdges H5Fed + 62 +256 +370 +-1 + 6 +ByLayer + 10 +60.0 + 20 +-70.0 + 30 +0.0 + 11 +140.0 + 21 +-70.0 + 31 +0.0 + 0 +LINE + 5 +31A +100 +AcDbEntity +100 +AcDbLine + 8 +0-UGrid Part1 OverlapEdges H5Fed + 62 +256 +370 +-1 + 6 +ByLayer + 10 +140.0 + 20 +-70.0 + 30 +0.0 + 11 +90.0 + 21 +-10.0 + 31 +0.0 + 0 +LINE + 5 +31B +100 +AcDbEntity +100 +AcDbLine + 8 +0-UGrid Part1 OverlapEdges H5Fed + 62 +256 +370 +-1 + 6 +ByLayer + 10 +90.0 + 20 +-10.0 + 30 +0.0 + 11 +180.0 + 21 +-10.0 + 31 +0.0 + 0 +LINE + 5 +31C +100 +AcDbEntity +100 +AcDbLine + 8 +0-UGrid Part1 OverlapEdges H5Fed + 62 +256 +370 +-1 + 6 +ByLayer + 10 +180.0 + 20 +-10.0 + 30 +0.0 + 11 +140.0 + 21 +90.0 + 31 +0.0 + 0 +LINE + 5 +31D +100 +AcDbEntity +100 +AcDbLine + 8 +0-UGrid Part1 OverlapEdges H5Fed + 62 +256 +370 +-1 + 6 +ByLayer + 10 +180.0 + 20 +-10.0 + 30 +0.0 + 11 +220.0 + 21 +60.0 + 31 +0.0 + 0 +HATCH + 5 +31E + 8 +0-UGrid Part1 InteriorVertices H5Fed + 62 +256 +370 +-1 + 6 +ByLayer +100 +AcDbEntity +100 +AcDbHatch + 10 +0.0 + 20 +0.0 + 30 +0.0 +210 +0.0 +220 +0.0 +230 +1.0 + 2 +SOLID + 70 +1 + 71 +0 + 91 +1 + 92 +1 + 93 +4 + 72 +2 + 10 +0.0 + 20 +0.0 + 40 +7.25 + 50 +0.0 + 51 +360.0 + 73 +1 + 72 +2 + 10 +200.0 + 20 +120.0 + 40 +7.25 + 50 +0.0 + 51 +360.0 + 73 +1 + 72 +2 + 10 +130.0 + 20 +150.0 + 40 +7.25 + 50 +0.0 + 51 +360.0 + 73 +1 + 72 +2 + 10 +50.0 + 20 +80.0 + 40 +7.25 + 50 +0.0 + 51 +360.0 + 73 +1 + 97 +0 + 75 +0 + 76 +1 + 98 +0 + 0 +HATCH + 5 +31F + 8 +0-UGrid Part1 FrontVertices H5Fed + 62 +256 +370 +-1 + 6 +ByLayer +100 +AcDbEntity +100 +AcDbHatch + 10 +0.0 + 20 +0.0 + 30 +0.0 +210 +0.0 +220 +0.0 +230 +1.0 + 2 +SOLID + 70 +1 + 71 +0 + 91 +1 + 92 +1 + 93 +3 + 72 +2 + 10 +140.0 + 20 +-70.0 + 40 +7.25 + 50 +0.0 + 51 +360.0 + 73 +1 + 72 +2 + 10 +240.0 + 20 +-60.0 + 40 +7.25 + 50 +0.0 + 51 +360.0 + 73 +1 + 72 +2 + 10 +180.0 + 20 +-10.0 + 40 +7.25 + 50 +0.0 + 51 +360.0 + 73 +1 + 97 +0 + 75 +0 + 76 +1 + 98 +0 + 0 +CIRCLE + 5 +320 +100 +AcDbEntity +100 +AcDbCircle + 8 +0-NGraph + 62 +256 +370 +-1 + 6 +ByLayer + 10 +60.0 + 20 +-70.0 + 30 +0.0 + 40 +7.25 + 0 +CIRCLE + 5 +321 +100 +AcDbEntity +100 +AcDbCircle + 8 +0-NGraph + 62 +256 +370 +-1 + 6 +ByLayer + 10 +90.0 + 20 +-10.0 + 30 +0.0 + 40 +7.25 + 0 +CIRCLE + 5 +322 +100 +AcDbEntity +100 +AcDbCircle + 8 +0-NGraph + 62 +256 +370 +-1 + 6 +ByLayer + 10 +90.0 + 20 +-10.0 + 30 +0.0 + 40 +7.25 + 0 +CIRCLE + 5 +323 +100 +AcDbEntity +100 +AcDbCircle + 8 +0-NGraph + 62 +256 +370 +-1 + 6 +ByLayer + 10 +140.0 + 20 +90.0 + 30 +0.0 + 40 +7.25 + 0 +CIRCLE + 5 +324 +100 +AcDbEntity +100 +AcDbCircle + 8 +0-NGraph + 62 +256 +370 +-1 + 6 +ByLayer + 10 +220.0 + 20 +60.0 + 30 +0.0 + 40 +7.25 + 0 +HATCH + 5 +325 + 8 +0-UGrid Part1 BorderVertices H5Fed + 62 +256 +370 +-1 + 6 +ByLayer +100 +AcDbEntity +100 +AcDbHatch + 10 +0.0 + 20 +0.0 + 30 +0.0 +210 +0.0 +220 +0.0 +230 +1.0 + 2 +SOLID + 70 +1 + 71 +0 + 91 +1 + 92 +1 + 93 +4 + 72 +2 + 10 +60.0 + 20 +-70.0 + 40 +7.25 + 50 +0.0 + 51 +360.0 + 73 +1 + 72 +2 + 10 +220.0 + 20 +60.0 + 40 +7.25 + 50 +0.0 + 51 +360.0 + 73 +1 + 72 +2 + 10 +140.0 + 20 +90.0 + 40 +7.25 + 50 +0.0 + 51 +360.0 + 73 +1 + 72 +2 + 10 +90.0 + 20 +-10.0 + 40 +7.25 + 50 +0.0 + 51 +360.0 + 73 +1 + 97 +0 + 75 +0 + 76 +1 + 98 +0 + 0 +LINE + 5 +326 +100 +AcDbEntity +100 +AcDbLine + 8 +0-UGrid Part2 BorderEdges H5Fed + 62 +256 +370 +-1 + 6 +ByLayer + 10 +220.0 + 20 +60.0 + 30 +0.0 + 11 +140.0 + 21 +90.0 + 31 +0.0 + 0 +LINE + 5 +327 +100 +AcDbEntity +100 +AcDbLine + 8 +0-UGrid Part2 BorderEdges H5Fed + 62 +256 +370 +-1 + 6 +ByLayer + 10 +140.0 + 20 +90.0 + 30 +0.0 + 11 +90.0 + 21 +-10.0 + 31 +0.0 + 0 +LINE + 5 +328 +100 +AcDbEntity +100 +AcDbLine + 8 +0-UGrid Part2 BorderEdges H5Fed + 62 +256 +370 +-1 + 6 +ByLayer + 10 +90.0 + 20 +-10.0 + 30 +0.0 + 11 +60.0 + 21 +-70.0 + 31 +0.0 + 0 +LINE + 5 +329 +100 +AcDbEntity +100 +AcDbLine + 8 +0-UGrid Part2 InteriorEdges H5Fed + 62 +256 +370 +-1 + 6 +ByLayer + 10 +180.0 + 20 +-10.0 + 30 +0.0 + 11 +220.0 + 21 +60.0 + 31 +0.0 + 0 +LINE + 5 +32A +100 +AcDbEntity +100 +AcDbLine + 8 +0-UGrid Part2 InteriorEdges H5Fed + 62 +256 +370 +-1 + 6 +ByLayer + 10 +220.0 + 20 +60.0 + 30 +0.0 + 11 +240.0 + 21 +-60.0 + 31 +0.0 + 0 +LINE + 5 +32B +100 +AcDbEntity +100 +AcDbLine + 8 +0-UGrid Part2 InteriorEdges H5Fed + 62 +256 +370 +-1 + 6 +ByLayer + 10 +240.0 + 20 +-60.0 + 30 +0.0 + 11 +180.0 + 21 +-10.0 + 31 +0.0 + 0 +LINE + 5 +32C +100 +AcDbEntity +100 +AcDbLine + 8 +0-UGrid Part2 InteriorEdges H5Fed + 62 +256 +370 +-1 + 6 +ByLayer + 10 +180.0 + 20 +-10.0 + 30 +0.0 + 11 +90.0 + 21 +-10.0 + 31 +0.0 + 0 +LINE + 5 +32D +100 +AcDbEntity +100 +AcDbLine + 8 +0-UGrid Part2 InteriorEdges H5Fed + 62 +256 +370 +-1 + 6 +ByLayer + 10 +90.0 + 20 +-10.0 + 30 +0.0 + 11 +140.0 + 21 +-70.0 + 31 +0.0 + 0 +LINE + 5 +32E +100 +AcDbEntity +100 +AcDbLine + 8 +0-UGrid Part2 InteriorEdges H5Fed + 62 +256 +370 +-1 + 6 +ByLayer + 10 +140.0 + 20 +-70.0 + 30 +0.0 + 11 +180.0 + 21 +-10.0 + 31 +0.0 + 0 +LINE + 5 +32F +100 +AcDbEntity +100 +AcDbLine + 8 +0-UGrid Part2 InteriorEdges H5Fed + 62 +256 +370 +-1 + 6 +ByLayer + 10 +180.0 + 20 +-10.0 + 30 +0.0 + 11 +140.0 + 21 +90.0 + 31 +0.0 + 0 +LINE + 5 +330 +100 +AcDbEntity +100 +AcDbLine + 8 +0-UGrid Part2 InteriorEdges H5Fed + 62 +256 +370 +-1 + 6 +ByLayer + 10 +60.0 + 20 +-70.0 + 30 +0.0 + 11 +140.0 + 21 +-70.0 + 31 +0.0 + 0 +LINE + 5 +331 +100 +AcDbEntity +100 +AcDbLine + 8 +0-UGrid Part2 InteriorEdges H5Fed + 62 +256 +370 +-1 + 6 +ByLayer + 10 +140.0 + 20 +-70.0 + 30 +0.0 + 11 +240.0 + 21 +-60.0 + 31 +0.0 + 0 +LINE + 5 +332 +100 +AcDbEntity +100 +AcDbLine + 8 +0-UGrid Part2 OverlapEdges H5Fed + 62 +256 +370 +-1 + 6 +ByLayer + 10 +220.0 + 20 +60.0 + 30 +0.0 + 11 +200.0 + 21 +120.0 + 31 +0.0 + 0 +LINE + 5 +333 +100 +AcDbEntity +100 +AcDbLine + 8 +0-UGrid Part2 OverlapEdges H5Fed + 62 +256 +370 +-1 + 6 +ByLayer + 10 +200.0 + 20 +120.0 + 30 +0.0 + 11 +140.0 + 21 +90.0 + 31 +0.0 + 0 +LINE + 5 +334 +100 +AcDbEntity +100 +AcDbLine + 8 +0-UGrid Part2 OverlapEdges H5Fed + 62 +256 +370 +-1 + 6 +ByLayer + 10 +140.0 + 20 +90.0 + 30 +0.0 + 11 +50.0 + 21 +80.0 + 31 +0.0 + 0 +LINE + 5 +335 +100 +AcDbEntity +100 +AcDbLine + 8 +0-UGrid Part2 OverlapEdges H5Fed + 62 +256 +370 +-1 + 6 +ByLayer + 10 +50.0 + 20 +80.0 + 30 +0.0 + 11 +90.0 + 21 +-10.0 + 31 +0.0 + 0 +LINE + 5 +336 +100 +AcDbEntity +100 +AcDbLine + 8 +0-UGrid Part2 OverlapEdges H5Fed + 62 +256 +370 +-1 + 6 +ByLayer + 10 +90.0 + 20 +-10.0 + 30 +0.0 + 11 +0.0 + 21 +0.0 + 31 +0.0 + 0 +LINE + 5 +337 +100 +AcDbEntity +100 +AcDbLine + 8 +0-UGrid Part2 OverlapEdges H5Fed + 62 +256 +370 +-1 + 6 +ByLayer + 10 +0.0 + 20 +0.0 + 30 +0.0 + 11 +60.0 + 21 +-70.0 + 31 +0.0 + 0 +LINE + 5 +338 +100 +AcDbEntity +100 +AcDbLine + 8 +0-UGrid Part2 OverlapEdges H5Fed + 62 +256 +370 +-1 + 6 +ByLayer + 10 +0.0 + 20 +0.0 + 30 +0.0 + 11 +50.0 + 21 +80.0 + 31 +0.0 + 0 +LINE + 5 +339 +100 +AcDbEntity +100 +AcDbLine + 8 +0-UGrid Part2 OverlapEdges H5Fed + 62 +256 +370 +-1 + 6 +ByLayer + 10 +50.0 + 20 +80.0 + 30 +0.0 + 11 +130.0 + 21 +150.0 + 31 +0.0 + 0 +LINE + 5 +33A +100 +AcDbEntity +100 +AcDbLine + 8 +0-UGrid Part2 OverlapEdges H5Fed + 62 +256 +370 +-1 + 6 +ByLayer + 10 +130.0 + 20 +150.0 + 30 +0.0 + 11 +200.0 + 21 +120.0 + 31 +0.0 + 0 +LINE + 5 +33B +100 +AcDbEntity +100 +AcDbLine + 8 +0-UGrid Part2 OverlapEdges H5Fed + 62 +256 +370 +-1 + 6 +ByLayer + 10 +140.0 + 20 +90.0 + 30 +0.0 + 11 +130.0 + 21 +150.0 + 31 +0.0 + 0 +LINE + 5 +33C +100 +AcDbEntity +100 +AcDbLine + 8 +0-UGrid Part2 BorderVertices H5Fed + 62 +256 +370 +-1 + 6 +ByLayer + 10 +227.25 + 20 +60.0 + 30 +0.0 + 11 +227.25 + 21 +60.0 + 31 +0.0 + 0 +HATCH + 5 +33D + 8 +0-UGrid Part2 BorderVertices H5Fed + 62 +256 +370 +-1 + 6 +ByLayer +100 +AcDbEntity +100 +AcDbHatch + 10 +0.0 + 20 +0.0 + 30 +0.0 +210 +0.0 +220 +0.0 +230 +1.0 + 2 +SOLID + 70 +1 + 71 +0 + 91 +1 + 92 +1 + 93 +4 + 72 +2 + 10 +60.0 + 20 +-70.0 + 40 +7.25 + 50 +0.0 + 51 +360.0 + 73 +1 + 72 +2 + 10 +90.0 + 20 +-10.0 + 40 +7.25 + 50 +0.0 + 51 +360.0 + 73 +1 + 72 +2 + 10 +140.0 + 20 +90.0 + 40 +7.25 + 50 +0.0 + 51 +360.0 + 73 +1 + 72 +2 + 10 +220.0 + 20 +60.0 + 40 +7.25 + 50 +0.0 + 51 +360.0 + 73 +1 + 97 +0 + 75 +0 + 76 +1 + 98 +0 + 0 +HATCH + 5 +33E + 8 +0-UGrid Part2 InteriorVertices H5Fed + 62 +256 +370 +-1 + 6 +ByLayer +100 +AcDbEntity +100 +AcDbHatch + 10 +0.0 + 20 +0.0 + 30 +0.0 +210 +0.0 +220 +0.0 +230 +1.0 + 2 +SOLID + 70 +1 + 71 +0 + 91 +1 + 92 +1 + 93 +3 + 72 +2 + 10 +140.0 + 20 +-70.0 + 40 +7.25 + 50 +0.0 + 51 +360.0 + 73 +1 + 72 +2 + 10 +240.0 + 20 +-60.0 + 40 +7.25 + 50 +0.0 + 51 +360.0 + 73 +1 + 72 +2 + 10 +180.0 + 20 +-10.0 + 40 +7.25 + 50 +0.0 + 51 +360.0 + 73 +1 + 97 +0 + 75 +0 + 76 +1 + 98 +0 + 0 +HATCH + 5 +33F + 8 +0-UGrid Part2 OverlapVertices H5Fed + 62 +256 +370 +-1 + 6 +ByLayer +100 +AcDbEntity +100 +AcDbHatch + 10 +0.0 + 20 +0.0 + 30 +0.0 +210 +0.0 +220 +0.0 +230 +1.0 + 2 +SOLID + 70 +1 + 71 +0 + 91 +1 + 92 +1 + 93 +4 + 72 +2 + 10 +0.0 + 20 +0.0 + 40 +7.25 + 50 +0.0 + 51 +360.0 + 73 +1 + 72 +2 + 10 +200.0 + 20 +120.0 + 40 +7.25 + 50 +0.0 + 51 +360.0 + 73 +1 + 72 +2 + 10 +130.0 + 20 +150.0 + 40 +7.25 + 50 +0.0 + 51 +360.0 + 73 +1 + 72 +2 + 10 +50.0 + 20 +80.0 + 40 +7.25 + 50 +0.0 + 51 +360.0 + 73 +1 + 97 +0 + 75 +0 + 76 +1 + 98 +0 + 0 +LINE + 5 +340 +100 +AcDbEntity +100 +AcDbLine + 8 +1-UGrid 0Part2 BorderEdges H5Fed + 62 +256 +370 +-1 + 6 +ByLayer + 10 +219.7987421383647586 + 20 +60.0754716981132191 + 30 +0.0 + 11 +180.0000175342504178 + 21 +74.9999934246560827 + 31 +0.0 + 0 +LINE + 5 +341 +100 +AcDbEntity +100 +AcDbLine + 8 +1-UGrid 0Part2 BorderEdges H5Fed + 62 +256 +370 +-1 + 6 +ByLayer + 10 +180.0000175342504178 + 20 +74.9999934246560827 + 30 +0.0 + 11 +140.0 + 21 +90.0 + 31 +0.0 + 0 +LINE + 5 +342 +100 +AcDbEntity +100 +AcDbLine + 8 +1-UGrid 0Part2 BorderEdges H5Fed + 62 +256 +370 +-1 + 6 +ByLayer + 10 +140.0 + 20 +90.0 + 30 +0.0 + 11 +115.0000891911591054 + 21 +40.0001783823182038 + 31 +0.0 + 0 +LINE + 5 +343 +100 +AcDbEntity +100 +AcDbLine + 8 +1-UGrid 0Part2 BorderEdges H5Fed + 62 +256 +370 +-1 + 6 +ByLayer + 10 +115.0000891911591054 + 20 +40.0001783823182038 + 30 +0.0 + 11 +90.2000000000002018 + 21 +-9.5999999999995893 + 31 +0.0 + 0 +LINE + 5 +344 +100 +AcDbEntity +100 +AcDbLine + 8 +1-UGrid 0Part2 BorderEdges H5Fed + 62 +256 +370 +-1 + 6 +ByLayer + 10 +90.2000000000002018 + 20 +-9.5999999999995893 + 30 +0.0 + 11 +60.0 + 21 +-70.0 + 31 +0.0 + 0 +LINE + 5 +345 +100 +AcDbEntity +100 +AcDbLine + 8 +1-UGrid 0Part2 FrontEdges H5Fed + 62 +256 +370 +-1 + 6 +ByLayer + 10 +70.0 + 20 +35.0 + 30 +0.0 + 11 +95.0 + 21 +85.0 + 31 +0.0 + 0 +LINE + 5 +346 +100 +AcDbEntity +100 +AcDbLine + 8 +1-UGrid 0Part2 FrontEdges H5Fed + 62 +256 +370 +-1 + 6 +ByLayer + 10 +95.0 + 20 +85.0 + 30 +0.0 + 11 +50.0 + 21 +80.0 + 31 +0.0 + 0 +LINE + 5 +347 +100 +AcDbEntity +100 +AcDbLine + 8 +1-UGrid 0Part2 FrontEdges H5Fed + 62 +256 +370 +-1 + 6 +ByLayer + 10 +50.0 + 20 +80.0 + 30 +0.0 + 11 +70.0 + 21 +35.0 + 31 +0.0 + 0 +LINE + 5 +348 +100 +AcDbEntity +100 +AcDbLine + 8 +1-UGrid 0Part2 InteriorEdges H5Fed + 62 +256 +370 +-1 + 6 +ByLayer + 10 +140.0 + 20 +90.0 + 30 +0.0 + 11 +159.9999450076830101 + 21 +40.0001374807924535 + 31 +0.0 + 0 +LINE + 5 +349 +100 +AcDbEntity +100 +AcDbLine + 8 +1-UGrid 0Part2 InteriorEdges H5Fed + 62 +256 +370 +-1 + 6 +ByLayer + 10 +159.9999450076830101 + 20 +40.0001374807924535 + 30 +0.0 + 11 +180.0000175342504178 + 21 +74.9999934246560827 + 31 +0.0 + 0 +LINE + 5 +34A +100 +AcDbEntity +100 +AcDbLine + 8 +1-UGrid 0Part2 InteriorEdges H5Fed + 62 +256 +370 +-1 + 6 +ByLayer + 10 +180.0000175342504178 + 20 +74.9999934246560827 + 30 +0.0 + 11 +200.0 + 21 +25.0 + 31 +0.0 + 0 +LINE + 5 +34B +100 +AcDbEntity +100 +AcDbLine + 8 +1-UGrid 0Part2 InteriorEdges H5Fed + 62 +256 +370 +-1 + 6 +ByLayer + 10 +200.0 + 20 +25.0 + 30 +0.0 + 11 +219.7987421383647586 + 21 +60.0754716981132191 + 31 +0.0 + 0 +LINE + 5 +34C +100 +AcDbEntity +100 +AcDbLine + 8 +1-UGrid 0Part2 InteriorEdges H5Fed + 62 +256 +370 +-1 + 6 +ByLayer + 10 +219.7987421383647586 + 20 +60.0754716981132191 + 30 +0.0 + 11 +240.0 + 21 +-60.0 + 31 +0.0 + 0 +LINE + 5 +34D +100 +AcDbEntity +100 +AcDbLine + 8 +1-UGrid 0Part2 InteriorEdges H5Fed + 62 +256 +370 +-1 + 6 +ByLayer + 10 +240.0 + 20 +-60.0 + 30 +0.0 + 11 +180.0 + 21 +-10.0 + 31 +0.0 + 0 +LINE + 5 +34E +100 +AcDbEntity +100 +AcDbLine + 8 +1-UGrid 0Part2 InteriorEdges H5Fed + 62 +256 +370 +-1 + 6 +ByLayer + 10 +180.0 + 20 +-10.0 + 30 +0.0 + 11 +200.0 + 21 +25.0 + 31 +0.0 + 0 +LINE + 5 +34F +100 +AcDbEntity +100 +AcDbLine + 8 +1-UGrid 0Part2 InteriorEdges H5Fed + 62 +256 +370 +-1 + 6 +ByLayer + 10 +200.0 + 20 +25.0 + 30 +0.0 + 11 +159.9999450076830101 + 21 +40.0001374807924535 + 31 +0.0 + 0 +LINE + 5 +350 +100 +AcDbEntity +100 +AcDbLine + 8 +1-UGrid 0Part2 InteriorEdges H5Fed + 62 +256 +370 +-1 + 6 +ByLayer + 10 +159.9999450076830101 + 20 +40.0001374807924535 + 30 +0.0 + 11 +180.0 + 21 +-10.0 + 31 +0.0 + 0 +LINE + 5 +351 +100 +AcDbEntity +100 +AcDbLine + 8 +1-UGrid 0Part2 InteriorEdges H5Fed + 62 +256 +370 +-1 + 6 +ByLayer + 10 +180.0 + 20 +-10.0 + 30 +0.0 + 11 +135.0 + 21 +-10.0 + 31 +0.0 + 0 +LINE + 5 +352 +100 +AcDbEntity +100 +AcDbLine + 8 +1-UGrid 0Part2 InteriorEdges H5Fed + 62 +256 +370 +-1 + 6 +ByLayer + 10 +135.0 + 20 +-10.0 + 30 +0.0 + 11 +159.9999450076830101 + 21 +40.0001374807924535 + 31 +0.0 + 0 +LINE + 5 +353 +100 +AcDbEntity +100 +AcDbLine + 8 +1-UGrid 0Part2 InteriorEdges H5Fed + 62 +256 +370 +-1 + 6 +ByLayer + 10 +159.9999450076830101 + 20 +40.0001374807924535 + 30 +0.0 + 11 +115.0000891911591054 + 21 +40.0001783823182038 + 31 +0.0 + 0 +LINE + 5 +354 +100 +AcDbEntity +100 +AcDbLine + 8 +1-UGrid 0Part2 InteriorEdges H5Fed + 62 +256 +370 +-1 + 6 +ByLayer + 10 +115.0000891911591054 + 20 +40.0001783823182038 + 30 +0.0 + 11 +134.9999999999999716 + 21 +-10.0000000000000249 + 31 +0.0 + 0 +LINE + 5 +355 +100 +AcDbEntity +100 +AcDbLine + 8 +1-UGrid 0Part2 InteriorEdges H5Fed + 62 +256 +370 +-1 + 6 +ByLayer + 10 +134.9999999999999716 + 20 +-10.0000000000000249 + 30 +0.0 + 11 +90.0 + 21 +-10.0 + 31 +0.0 + 0 +LINE + 5 +356 +100 +AcDbEntity +100 +AcDbLine + 8 +1-UGrid 0Part2 InteriorEdges H5Fed + 62 +256 +370 +-1 + 6 +ByLayer + 10 +90.0 + 20 +-10.0 + 30 +0.0 + 11 +114.9999989626024757 + 21 +-39.9999987551229736 + 31 +0.0 + 0 +LINE + 5 +357 +100 +AcDbEntity +100 +AcDbLine + 8 +1-UGrid 0Part2 InteriorEdges H5Fed + 62 +256 +370 +-1 + 6 +ByLayer + 10 +114.9999989626024757 + 20 +-39.9999987551229736 + 30 +0.0 + 11 +135.0 + 21 +-10.0 + 31 +0.0 + 0 +LINE + 5 +358 +100 +AcDbEntity +100 +AcDbLine + 8 +1-UGrid 0Part2 InteriorEdges H5Fed + 62 +256 +370 +-1 + 6 +ByLayer + 10 +135.0 + 20 +-10.0 + 30 +0.0 + 11 +159.9997155749006197 + 21 +-40.0004266376490492 + 31 +0.0 + 0 +LINE + 5 +359 +100 +AcDbEntity +100 +AcDbLine + 8 +1-UGrid 0Part2 InteriorEdges H5Fed + 62 +256 +370 +-1 + 6 +ByLayer + 10 +159.9997155749006197 + 20 +-40.0004266376490492 + 30 +0.0 + 11 +114.9999989626024757 + 21 +-39.9999987551229736 + 31 +0.0 + 0 +LINE + 5 +35A +100 +AcDbEntity +100 +AcDbLine + 8 +1-UGrid 0Part2 InteriorEdges H5Fed + 62 +256 +370 +-1 + 6 +ByLayer + 10 +114.9999989626024757 + 20 +-39.9999987551229736 + 30 +0.0 + 11 +140.0 + 21 +-70.0 + 31 +0.0 + 0 +LINE + 5 +35B +100 +AcDbEntity +100 +AcDbLine + 8 +1-UGrid 0Part2 InteriorEdges H5Fed + 62 +256 +370 +-1 + 6 +ByLayer + 10 +140.0 + 20 +-70.0 + 30 +0.0 + 11 +159.9997155749006197 + 21 +-40.0004266376490492 + 31 +0.0 + 0 +LINE + 5 +35C +100 +AcDbEntity +100 +AcDbLine + 8 +1-UGrid 0Part2 InteriorEdges H5Fed + 62 +256 +370 +-1 + 6 +ByLayer + 10 +159.9997155749006197 + 20 +-40.0004266376490492 + 30 +0.0 + 11 +180.0 + 21 +-10.0 + 31 +0.0 + 0 +LINE + 5 +35D +100 +AcDbEntity +100 +AcDbLine + 8 +1-UGrid 0Part2 InteriorEdges H5Fed + 62 +256 +370 +-1 + 6 +ByLayer + 10 +60.0 + 20 +-70.0 + 30 +0.0 + 11 +140.0 + 21 +-70.0 + 31 +0.0 + 0 +LINE + 5 +35E +100 +AcDbEntity +100 +AcDbLine + 8 +1-UGrid 0Part2 InteriorEdges H5Fed + 62 +256 +370 +-1 + 6 +ByLayer + 10 +140.0 + 20 +-70.0 + 30 +0.0 + 11 +240.0 + 21 +-60.0 + 31 +0.0 + 0 +LINE + 5 +35F +100 +AcDbEntity +100 +AcDbLine + 8 +1-UGrid 0Part2 OverlapEdges H5Fed + 62 +256 +370 +-1 + 6 +ByLayer + 10 +60.0 + 20 +-70.0 + 30 +0.0 + 11 +0.0 + 21 +0.0 + 31 +0.0 + 0 +LINE + 5 +360 +100 +AcDbEntity +100 +AcDbLine + 8 +1-UGrid 0Part2 OverlapEdges H5Fed + 62 +256 +370 +-1 + 6 +ByLayer + 10 +0.0 + 20 +0.0 + 30 +0.0 + 11 +50.0 + 21 +80.0 + 31 +0.0 + 0 +LINE + 5 +361 +100 +AcDbEntity +100 +AcDbLine + 8 +1-UGrid 0Part2 OverlapEdges H5Fed + 62 +256 +370 +-1 + 6 +ByLayer + 10 +50.0 + 20 +80.0 + 30 +0.0 + 11 +130.0 + 21 +150.0 + 31 +0.0 + 0 +LINE + 5 +362 +100 +AcDbEntity +100 +AcDbLine + 8 +1-UGrid 0Part2 OverlapEdges H5Fed + 62 +256 +370 +-1 + 6 +ByLayer + 10 +130.0 + 20 +150.0 + 30 +0.0 + 11 +200.0 + 21 +120.0 + 31 +0.0 + 0 +LINE + 5 +363 +100 +AcDbEntity +100 +AcDbLine + 8 +1-UGrid 0Part2 OverlapEdges H5Fed + 62 +256 +370 +-1 + 6 +ByLayer + 10 +200.0 + 20 +120.0 + 30 +0.0 + 11 +140.0 + 21 +90.0 + 31 +0.0 + 0 +LINE + 5 +364 +100 +AcDbEntity +100 +AcDbLine + 8 +1-UGrid 0Part2 OverlapEdges H5Fed + 62 +256 +370 +-1 + 6 +ByLayer + 10 +140.0 + 20 +90.0 + 30 +0.0 + 11 +95.0 + 21 +85.0 + 31 +0.0 + 0 +LINE + 5 +365 +100 +AcDbEntity +100 +AcDbLine + 8 +1-UGrid 0Part2 OverlapEdges H5Fed + 62 +256 +370 +-1 + 6 +ByLayer + 10 +95.0 + 20 +85.0 + 30 +0.0 + 11 +115.0000891911591054 + 21 +40.0001783823182038 + 31 +0.0 + 0 +LINE + 5 +366 +100 +AcDbEntity +100 +AcDbLine + 8 +1-UGrid 0Part2 OverlapEdges H5Fed + 62 +256 +370 +-1 + 6 +ByLayer + 10 +115.0000891911591054 + 20 +40.0001783823182038 + 30 +0.0 + 11 +70.0 + 21 +35.0 + 31 +0.0 + 0 +LINE + 5 +367 +100 +AcDbEntity +100 +AcDbLine + 8 +1-UGrid 0Part2 OverlapEdges H5Fed + 62 +256 +370 +-1 + 6 +ByLayer + 10 +70.0 + 20 +35.0 + 30 +0.0 + 11 +90.0 + 21 +-10.0 + 31 +0.0 + 0 +LINE + 5 +368 +100 +AcDbEntity +100 +AcDbLine + 8 +1-UGrid 0Part2 OverlapEdges H5Fed + 62 +256 +370 +-1 + 6 +ByLayer + 10 +90.0 + 20 +-10.0 + 30 +0.0 + 11 +0.0 + 21 +0.0 + 31 +0.0 + 0 +LINE + 5 +369 +100 +AcDbEntity +100 +AcDbLine + 8 +1-UGrid 0Part2 OverlapEdges H5Fed + 62 +256 +370 +-1 + 6 +ByLayer + 10 +140.0 + 20 +90.0 + 30 +0.0 + 11 +130.0 + 21 +150.0 + 31 +0.0 + 0 +LINE + 5 +36A +100 +AcDbEntity +100 +AcDbLine + 8 +1-UGrid 0Part2 OverlapEdges H5Fed + 62 +256 +370 +-1 + 6 +ByLayer + 10 +220.0 + 20 +60.0 + 30 +0.0 + 11 +200.0 + 21 +120.0 + 31 +0.0 + 0 +LINE + 5 +36B +100 +AcDbEntity +100 +AcDbLine + 8 +1-UGrid 0Part2 BorderVertices H5Fed + 62 +256 +370 +-1 + 6 +ByLayer + 10 +227.25 + 20 +60.0 + 30 +0.0 + 11 +227.25 + 21 +60.0 + 31 +0.0 + 0 +HATCH + 5 +36C + 8 +1-UGrid 0Part2 BorderVertices H5Fed + 62 +256 +370 +-1 + 6 +ByLayer +100 +AcDbEntity +100 +AcDbHatch + 10 +0.0 + 20 +0.0 + 30 +0.0 +210 +0.0 +220 +0.0 +230 +1.0 + 2 +SOLID + 70 +1 + 71 +0 + 91 +1 + 92 +1 + 93 +6 + 72 +2 + 10 +90.0 + 20 +-10.0 + 40 +7.25 + 50 +0.0 + 51 +360.0 + 73 +1 + 72 +2 + 10 +115.0000891911591054 + 20 +40.0001783823182038 + 40 +7.25 + 50 +0.0 + 51 +360.0 + 73 +1 + 72 +2 + 10 +140.0 + 20 +90.0 + 40 +7.25 + 50 +0.0 + 51 +360.0 + 73 +1 + 72 +2 + 10 +60.0 + 20 +-70.0 + 40 +7.25 + 50 +0.0 + 51 +360.0 + 73 +1 + 72 +2 + 10 +180.0000175342504178 + 20 +74.9999934246560969 + 40 +7.25 + 50 +0.0 + 51 +360.0 + 73 +1 + 72 +2 + 10 +220.0 + 20 +60.0 + 40 +7.25 + 50 +0.0 + 51 +360.0 + 73 +1 + 97 +0 + 75 +0 + 76 +1 + 98 +0 + 0 +HATCH + 5 +36D + 8 +1-UGrid 0Part2 FrontVertices H5Fed + 62 +256 +370 +-1 + 6 +ByLayer +100 +AcDbEntity +100 +AcDbHatch + 10 +0.0 + 20 +0.0 + 30 +0.0 +210 +0.0 +220 +0.0 +230 +1.0 + 2 +SOLID + 70 +1 + 71 +0 + 91 +1 + 92 +1 + 93 +3 + 72 +2 + 10 +70.0 + 20 +35.0 + 40 +7.25 + 50 +0.0 + 51 +360.0 + 73 +1 + 72 +2 + 10 +95.0 + 20 +85.0 + 40 +7.25 + 50 +0.0 + 51 +360.0 + 73 +1 + 72 +2 + 10 +50.0 + 20 +80.0 + 40 +7.25 + 50 +0.0 + 51 +360.0 + 73 +1 + 97 +0 + 75 +0 + 76 +1 + 98 +0 + 0 +HATCH + 5 +36E + 8 +1-UGrid 0Part2 InteriorVertices H5Fed + 62 +256 +370 +-1 + 6 +ByLayer +100 +AcDbEntity +100 +AcDbHatch + 10 +0.0 + 20 +0.0 + 30 +0.0 +210 +0.0 +220 +0.0 +230 +1.0 + 2 +SOLID + 70 +1 + 71 +0 + 91 +1 + 92 +1 + 93 +8 + 72 +2 + 10 +200.0 + 20 +25.0 + 40 +7.25 + 50 +0.0 + 51 +360.0 + 73 +1 + 72 +2 + 10 +140.0 + 20 +-70.0 + 40 +7.25 + 50 +0.0 + 51 +360.0 + 73 +1 + 72 +2 + 10 +159.9997155749006197 + 20 +-40.0004266376490492 + 40 +7.25 + 50 +0.0 + 51 +360.0 + 73 +1 + 72 +2 + 10 +114.9999989626024757 + 20 +-39.9999987551229665 + 40 +7.25 + 50 +0.0 + 51 +360.0 + 73 +1 + 72 +2 + 10 +135.0 + 20 +-10.0 + 40 +7.25 + 50 +0.0 + 51 +360.0 + 73 +1 + 72 +2 + 10 +180.0 + 20 +-10.0 + 40 +7.25 + 50 +0.0 + 51 +360.0 + 73 +1 + 72 +2 + 10 +240.0 + 20 +-60.0 + 40 +7.25 + 50 +0.0 + 51 +360.0 + 73 +1 + 72 +2 + 10 +159.9999450076830385 + 20 +40.0001374807924819 + 40 +7.25 + 50 +0.0 + 51 +360.0 + 73 +1 + 97 +0 + 75 +0 + 76 +1 + 98 +0 + 0 +HATCH + 5 +36F + 8 +1-UGrid 0Part2 OverlapVertices H5Fed + 62 +256 +370 +-1 + 6 +ByLayer +100 +AcDbEntity +100 +AcDbHatch + 10 +0.0 + 20 +0.0 + 30 +0.0 +210 +0.0 +220 +0.0 +230 +1.0 + 2 +SOLID + 70 +1 + 71 +0 + 91 +1 + 92 +1 + 93 +3 + 72 +2 + 10 +130.0 + 20 +150.0 + 40 +7.25 + 50 +0.0 + 51 +360.0 + 73 +1 + 72 +2 + 10 +200.0 + 20 +120.0 + 40 +7.25 + 50 +0.0 + 51 +360.0 + 73 +1 + 72 +2 + 10 +0.0 + 20 +0.0 + 40 +7.25 + 50 +0.0 + 51 +360.0 + 73 +1 + 97 +0 + 75 +0 + 76 +1 + 98 +0 + 0 +LINE + 5 +370 +100 +AcDbEntity +100 +AcDbLine + 8 +1-UGrid 0Part1 GhostEdges H5Fed + 62 +256 +370 +-1 + 6 +ByLayer + 10 +159.9999450076830385 + 20 +40.000137480792489 + 30 +0.0 + 11 +179.7347266203639151 + 21 +-9.336816550909802 + 31 +0.0 + 0 +LINE + 5 +371 +100 +AcDbEntity +100 +AcDbLine + 8 +1-UGrid 0Part1 GhostEdges H5Fed + 62 +256 +370 +-1 + 6 +ByLayer + 10 +135.0 + 20 +-10.0 + 30 +0.0 + 11 +159.9997155749006197 + 21 +-40.0004266376490492 + 31 +0.0 + 0 +LINE + 5 +372 +100 +AcDbEntity +100 +AcDbLine + 8 +1-UGrid 0Part1 GhostEdges H5Fed + 62 +256 +370 +-1 + 6 +ByLayer + 10 +159.9997155749006197 + 20 +-40.0004266376490492 + 30 +0.0 + 11 +114.9999989626024757 + 21 +-39.9999987551229736 + 31 +0.0 + 0 +LINE + 5 +373 +100 +AcDbEntity +100 +AcDbLine + 8 +1-UGrid 0Part1 GhostEdges H5Fed + 62 +256 +370 +-1 + 6 +ByLayer + 10 +140.0 + 20 +-70.0 + 30 +0.0 + 11 +159.9997155749006197 + 21 +-40.0004266376490492 + 31 +0.0 + 0 +LINE + 5 +374 +100 +AcDbEntity +100 +AcDbLine + 8 +1-UGrid 0Part1 GhostEdges H5Fed + 62 +256 +370 +-1 + 6 +ByLayer + 10 +159.9997155749006197 + 20 +-40.0004266376490492 + 30 +0.0 + 11 +180.0 + 21 +-10.0 + 31 +0.0 + 0 +HATCH + 5 +375 + 8 +1-UGrid 0Part1 GhostVertices H5Fed + 62 +256 +370 +-1 + 6 +ByLayer +100 +AcDbEntity +100 +AcDbHatch + 10 +0.0 + 20 +0.0 + 30 +0.0 +210 +0.0 +220 +0.0 +230 +1.0 + 2 +SOLID + 70 +1 + 71 +0 + 91 +1 + 92 +1 + 93 +1 + 72 +2 + 10 +159.9997155749006197 + 20 +-40.0004266376490492 + 40 +7.25 + 50 +0.0 + 51 +360.0 + 73 +1 + 97 +0 + 75 +0 + 76 +1 + 98 +0 + 0 +LINE + 5 +376 +100 +AcDbEntity +100 +AcDbLine + 8 +1-UGrid 0Part1 GhostEdges H5Fed + 62 +256 +370 +-1 + 6 +ByLayer + 10 +180.0 + 20 +-10.0 + 30 +0.0 + 11 +135.0 + 21 +-10.0 + 31 +0.0 + 0 +HATCH + 5 +377 + 8 +1-UGrid 0Part1 FrontVertices H5Fed + 62 +256 +370 +-1 + 6 +ByLayer +100 +AcDbEntity +100 +AcDbHatch + 10 +0.0 + 20 +0.0 + 30 +0.0 +210 +0.0 +220 +0.0 +230 +1.0 + 2 +SOLID + 70 +1 + 71 +0 + 91 +1 + 92 +1 + 93 +7 + 72 +2 + 10 +200.0 + 20 +25.0 + 40 +7.25 + 50 +0.0 + 51 +360.0 + 73 +1 + 72 +2 + 10 +140.0 + 20 +-70.0 + 40 +7.25 + 50 +0.0 + 51 +360.0 + 73 +1 + 72 +2 + 10 +114.9999989626024757 + 20 +-39.9999987551229665 + 40 +7.25 + 50 +0.0 + 51 +360.0 + 73 +1 + 72 +2 + 10 +135.0 + 20 +-10.0 + 40 +7.25 + 50 +0.0 + 51 +360.0 + 73 +1 + 72 +2 + 10 +180.0 + 20 +-10.0 + 40 +7.25 + 50 +0.0 + 51 +360.0 + 73 +1 + 72 +2 + 10 +240.0 + 20 +-60.0 + 40 +7.25 + 50 +0.0 + 51 +360.0 + 73 +1 + 72 +2 + 10 +159.9999450076830385 + 20 +40.0001374807924819 + 40 +7.25 + 50 +0.0 + 51 +360.0 + 73 +1 + 97 +0 + 75 +0 + 76 +1 + 98 +0 + 0 +LINE + 5 +378 +100 +AcDbEntity +100 +AcDbLine + 8 +1-UGrid 0Part1 InteriorEdges H5Fed + 62 +256 +370 +-1 + 6 +ByLayer + 10 +220.0 + 20 +60.0 + 30 +0.0 + 11 +200.0 + 21 +120.0 + 31 +0.0 + 0 +LINE + 5 +379 +100 +AcDbEntity +100 +AcDbLine + 8 +1-UGrid 0Part1 InteriorEdges H5Fed + 62 +256 +370 +-1 + 6 +ByLayer + 10 +200.0 + 20 +120.0 + 30 +0.0 + 11 +140.0 + 21 +90.0 + 31 +0.0 + 0 +LINE + 5 +37A +100 +AcDbEntity +100 +AcDbLine + 8 +1-UGrid 0Part1 InteriorEdges H5Fed + 62 +256 +370 +-1 + 6 +ByLayer + 10 +140.0 + 20 +90.0 + 30 +0.0 + 11 +130.0 + 21 +150.0 + 31 +0.0 + 0 +LINE + 5 +37B +100 +AcDbEntity +100 +AcDbLine + 8 +1-UGrid 0Part1 InteriorEdges H5Fed + 62 +256 +370 +-1 + 6 +ByLayer + 10 +130.0 + 20 +150.0 + 30 +0.0 + 11 +200.0 + 21 +120.0 + 31 +0.0 + 0 +LINE + 5 +37C +100 +AcDbEntity +100 +AcDbLine + 8 +1-UGrid 0Part1 InteriorEdges H5Fed + 62 +256 +370 +-1 + 6 +ByLayer + 10 +130.0 + 20 +150.0 + 30 +0.0 + 11 +50.0 + 21 +80.0 + 31 +0.0 + 0 +LINE + 5 +37D +100 +AcDbEntity +100 +AcDbLine + 8 +1-UGrid 0Part1 InteriorEdges H5Fed + 62 +256 +370 +-1 + 6 +ByLayer + 10 +50.0 + 20 +80.0 + 30 +0.0 + 11 +0.0 + 21 +0.0 + 31 +0.0 + 0 +LINE + 5 +37E +100 +AcDbEntity +100 +AcDbLine + 8 +1-UGrid 0Part1 InteriorEdges H5Fed + 62 +256 +370 +-1 + 6 +ByLayer + 10 +0.0 + 20 +0.0 + 30 +0.0 + 11 +90.0 + 21 +-10.0 + 31 +0.0 + 0 +LINE + 5 +37F +100 +AcDbEntity +100 +AcDbLine + 8 +1-UGrid 0Part1 InteriorEdges H5Fed + 62 +256 +370 +-1 + 6 +ByLayer + 10 +90.0 + 20 +-10.0 + 30 +0.0 + 11 +70.0 + 21 +35.0 + 31 +0.0 + 0 +LINE + 5 +380 +100 +AcDbEntity +100 +AcDbLine + 8 +1-UGrid 0Part1 InteriorEdges H5Fed + 62 +256 +370 +-1 + 6 +ByLayer + 10 +70.0 + 20 +35.0 + 30 +0.0 + 11 +50.0 + 21 +80.0 + 31 +0.0 + 0 +LINE + 5 +381 +100 +AcDbEntity +100 +AcDbLine + 8 +1-UGrid 0Part1 InteriorEdges H5Fed + 62 +256 +370 +-1 + 6 +ByLayer + 10 +50.0 + 20 +80.0 + 30 +0.0 + 11 +102.20565707638373 + 21 +85.8006285640426398 + 31 +0.0 + 0 +LINE + 5 +382 +100 +AcDbEntity +100 +AcDbLine + 8 +1-UGrid 0Part1 InteriorEdges H5Fed + 62 +256 +370 +-1 + 6 +ByLayer + 10 +102.20565707638373 + 20 +85.8006285640426398 + 30 +0.0 + 11 +140.0 + 21 +89.9999999999999858 + 31 +0.0 + 0 +LINE + 5 +383 +100 +AcDbEntity +100 +AcDbLine + 8 +1-UGrid 0Part1 InteriorEdges H5Fed + 62 +256 +370 +-1 + 6 +ByLayer + 10 +115.0000891911591054 + 20 +40.0001783823182038 + 30 +0.0 + 11 +95.0 + 21 +85.0 + 31 +0.0 + 0 +LINE + 5 +384 +100 +AcDbEntity +100 +AcDbLine + 8 +1-UGrid 0Part1 InteriorEdges H5Fed + 62 +256 +370 +-1 + 6 +ByLayer + 10 +95.0 + 20 +85.0 + 30 +0.0 + 11 +70.0 + 21 +35.0 + 31 +0.0 + 0 +LINE + 5 +385 +100 +AcDbEntity +100 +AcDbLine + 8 +1-UGrid 0Part1 InteriorEdges H5Fed + 62 +256 +370 +-1 + 6 +ByLayer + 10 +70.0 + 20 +35.0 + 30 +0.0 + 11 +115.0000891911591054 + 21 +40.0001783823182038 + 31 +0.0 + 0 +LINE + 5 +386 +100 +AcDbEntity +100 +AcDbLine + 8 +1-UGrid 0Part1 InteriorEdges H5Fed + 62 +256 +370 +-1 + 6 +ByLayer + 10 +0.0 + 20 +0.0 + 30 +0.0 + 11 +60.0 + 21 +-70.0 + 31 +0.0 + 0 +HATCH + 5 +387 + 8 +1-UGrid 0Part1 BorderVertices H5Fed + 62 +256 +370 +-1 + 6 +ByLayer +100 +AcDbEntity +100 +AcDbHatch + 10 +0.0 + 20 +0.0 + 30 +0.0 +210 +0.0 +220 +0.0 +230 +1.0 + 2 +SOLID + 70 +1 + 71 +0 + 91 +1 + 92 +1 + 93 +6 + 72 +2 + 10 +90.0 + 20 +-10.0 + 40 +7.25 + 50 +0.0 + 51 +360.0 + 73 +1 + 72 +2 + 10 +115.0000891911591054 + 20 +40.0001783823182038 + 40 +7.25 + 50 +0.0 + 51 +360.0 + 73 +1 + 72 +2 + 10 +140.0 + 20 +90.0 + 40 +7.25 + 50 +0.0 + 51 +360.0 + 73 +1 + 72 +2 + 10 +60.0 + 20 +-70.0 + 40 +7.25 + 50 +0.0 + 51 +360.0 + 73 +1 + 72 +2 + 10 +180.0000175342504178 + 20 +74.9999934246560969 + 40 +7.25 + 50 +0.0 + 51 +360.0 + 73 +1 + 72 +2 + 10 +220.0 + 20 +60.0 + 40 +7.25 + 50 +0.0 + 51 +360.0 + 73 +1 + 97 +0 + 75 +0 + 76 +1 + 98 +0 + 0 +MTEXT + 5 +388 +100 +AcDbEntity +100 +AcDbMText + 8 +0-DGraph Vertex Idx + 62 +256 +370 +-1 + 6 +ByLayer + 10 +52.4994856366487497 + 20 +-27.617758389235437 + 30 +0.0 + 40 +3.0 + 41 +100.0 + 71 +5 + 72 +2 + 1 +0 + 7 +greeks + 50 +0.0 + 73 +0 + 44 +1.0 + 0 +MTEXT + 5 +389 +100 +AcDbEntity +100 +AcDbMText + 8 +0-DGraph Vertex Idx + 62 +256 +370 +-1 + 6 +ByLayer + 10 +95.5541397758186974 + 20 +-47.1056544732807936 + 30 +0.0 + 40 +3.0 + 41 +100.0 + 71 +5 + 72 +2 + 1 +1 + 7 +greeks + 50 +0.0 + 73 +0 + 44 +1.0 + 0 +MTEXT + 5 +38A +100 +AcDbEntity +100 +AcDbMText + 8 +0-DGraph Vertex Idx + 62 +256 +370 +-1 + 6 +ByLayer + 10 +136.3427594866113282 + 20 +-28.52417216058641 + 30 +0.0 + 40 +3.0 + 41 +100.0 + 71 +5 + 72 +2 + 1 +2 + 7 +greeks + 50 +0.0 + 73 +0 + 44 +1.0 + 0 +MTEXT + 5 +38B +100 +AcDbEntity +100 +AcDbMText + 8 +0-DGraph Vertex Idx + 62 +256 +370 +-1 + 6 +ByLayer + 10 +185.2891031395623713 + 20 +-43.0267925022015305 + 30 +0.0 + 40 +3.0 + 41 +100.0 + 71 +5 + 72 +2 + 1 +3 + 7 +greeks + 50 +0.0 + 73 +0 + 44 +1.0 + 0 +MTEXT + 5 +38C +100 +AcDbEntity +100 +AcDbMText + 8 +0-DGraph Vertex Idx + 62 +256 +370 +-1 + 6 +ByLayer + 10 +209.7622749660378929 + 20 +-1.784965905733471 + 30 +0.0 + 40 +3.0 + 41 +100.0 + 71 +5 + 72 +2 + 1 +4 + 7 +greeks + 50 +0.0 + 73 +0 + 44 +1.0 + 0 +MTEXT + 5 +38D +100 +AcDbEntity +100 +AcDbMText + 8 +0-DGraph Vertex Idx + 62 +256 +370 +-1 + 6 +ByLayer + 10 +179.3974136257813257 + 20 +48.9742052899195457 + 30 +0.0 + 40 +3.0 + 41 +100.0 + 71 +5 + 72 +2 + 1 +5 + 7 +greeks + 50 +0.0 + 73 +0 + 44 +1.0 + 0 +MTEXT + 5 +38E +100 +AcDbEntity +100 +AcDbMText + 8 +0-DGraph Vertex Idx + 62 +256 +370 +-1 + 6 +ByLayer + 10 +188.4615513392906792 + 20 +91.5756525434139803 + 30 +0.0 + 40 +3.0 + 41 +100.0 + 71 +5 + 72 +2 + 1 +6 + 7 +greeks + 50 +0.0 + 73 +0 + 44 +1.0 + 0 +MTEXT + 5 +38F +100 +AcDbEntity +100 +AcDbMText + 8 +0-DGraph Vertex Idx + 62 +256 +370 +-1 + 6 +ByLayer + 10 +155.8306555706566314 + 20 +119.2212725696178381 + 30 +0.0 + 40 +3.0 + 41 +100.0 + 71 +5 + 72 +2 + 1 +7 + 7 +greeks + 50 +0.0 + 73 +0 + 44 +1.0 + 0 +MTEXT + 5 +390 +100 +AcDbEntity +100 +AcDbMText + 8 +0-DGraph Vertex Idx + 62 +256 +370 +-1 + 6 +ByLayer + 10 +110.056760117433825 + 20 +107.4378935420555763 + 30 +0.0 + 40 +3.0 + 41 +100.0 + 71 +5 + 72 +2 + 1 +8 + 7 +greeks + 50 +0.0 + 73 +0 + 44 +1.0 + 0 +MTEXT + 5 +391 +100 +AcDbEntity +100 +AcDbMText + 8 +0-DGraph Vertex Idx + 62 +256 +370 +-1 + 6 +ByLayer + 10 +94.1945191187922575 + 20 +56.3523231977330994 + 30 +0.0 + 40 +3.0 + 41 +100.0 + 71 +5 + 72 +2 + 1 +9 + 7 +greeks + 50 +0.0 + 73 +0 + 44 +1.0 + 0 +MTEXT + 5 +392 +100 +AcDbEntity +100 +AcDbMText + 8 +0-DGraph Vertex Idx + 62 +256 +370 +-1 + 6 +ByLayer + 10 +46.6077961228675974 + 20 +23.1414128064175415 + 30 +0.0 + 40 +3.0 + 41 +100.0 + 71 +5 + 72 +2 + 1 +10 + 7 +greeks + 50 +0.0 + 73 +0 + 44 +1.0 + 0 +MTEXT + 5 +393 +100 +AcDbEntity +100 +AcDbMText + 8 +0-DGraph Vertex Idx + 62 +256 +370 +-1 + 6 +ByLayer + 10 +136.3427594866114418 + 20 +24.047826577768511 + 30 +0.0 + 40 +3.0 + 41 +100.0 + 71 +5 + 72 +2 + 1 +11 + 7 +greeks + 50 +0.0 + 73 +0 + 44 +1.0 + 0 +MTEXT + 5 +394 +100 +AcDbEntity +100 +AcDbMText + 8 +0-NGraph Vertex Idx + 62 +256 +370 +-1 + 6 +ByLayer + 10 +-0.3333333333333712 + 20 +0.5 + 30 +0.0 + 40 +3.0 + 41 +100.0 + 71 +5 + 72 +2 + 1 +0 + 7 +normal + 50 +0.0 + 73 +0 + 44 +1.0 + 0 +MTEXT + 5 +395 +100 +AcDbEntity +100 +AcDbMText + 8 +0-NGraph Vertex Idx + 62 +256 +370 +-1 + 6 +ByLayer + 10 +59.6666666666666643 + 20 +-69.5 + 30 +0.0 + 40 +3.0 + 41 +100.0 + 71 +5 + 72 +2 + 1 +1 + 7 +normal + 50 +0.0 + 73 +0 + 44 +1.0 + 0 +MTEXT + 5 +396 +100 +AcDbEntity +100 +AcDbMText + 8 +0-NGraph Vertex Idx + 62 +256 +370 +-1 + 6 +ByLayer + 10 +89.6666666666666572 + 20 +-9.5 + 30 +0.0 + 40 +3.0 + 41 +100.0 + 71 +5 + 72 +2 + 1 +2 + 7 +normal + 50 +0.0 + 73 +0 + 44 +1.0 + 0 +MTEXT + 5 +397 +100 +AcDbEntity +100 +AcDbMText + 8 +0-NGraph Vertex Idx + 62 +256 +370 +-1 + 6 +ByLayer + 10 +139.6666666666666572 + 20 +-69.5 + 30 +0.0 + 40 +3.0 + 41 +100.0 + 71 +5 + 72 +2 + 1 +3 + 7 +normal + 50 +0.0 + 73 +0 + 44 +1.0 + 0 +MTEXT + 5 +398 +100 +AcDbEntity +100 +AcDbMText + 8 +0-NGraph Vertex Idx + 62 +256 +370 +-1 + 6 +ByLayer + 10 +179.6666666666666572 + 20 +-9.5 + 30 +0.0 + 40 +3.0 + 41 +100.0 + 71 +5 + 72 +2 + 1 +4 + 7 +greeks + 50 +0.0 + 73 +0 + 44 +1.0 + 0 +MTEXT + 5 +399 +100 +AcDbEntity +100 +AcDbMText + 8 +0-NGraph Vertex Idx + 62 +256 +370 +-1 + 6 +ByLayer + 10 +239.6666666666666288 + 20 +-59.5 + 30 +0.0 + 40 +3.0 + 41 +100.0 + 71 +5 + 72 +2 + 1 +5 + 7 +normal + 50 +0.0 + 73 +0 + 44 +1.0 + 0 +MTEXT + 5 +39A +100 +AcDbEntity +100 +AcDbMText + 8 +0-NGraph Vertex Idx + 62 +256 +370 +-1 + 6 +ByLayer + 10 +219.6666666666666288 + 20 +60.5 + 30 +0.0 + 40 +3.0 + 41 +100.0 + 71 +5 + 72 +2 + 1 +6 + 7 +normal + 50 +0.0 + 73 +0 + 44 +1.0 + 0 +MTEXT + 5 +39B +100 +AcDbEntity +100 +AcDbMText + 8 +0-NGraph Vertex Idx + 62 +256 +370 +-1 + 6 +ByLayer + 10 +139.6666666666666288 + 20 +90.5 + 30 +0.0 + 40 +3.0 + 41 +100.0 + 71 +5 + 72 +2 + 1 +7 + 7 +normal + 50 +0.0 + 73 +0 + 44 +1.0 + 0 +MTEXT + 5 +39C +100 +AcDbEntity +100 +AcDbMText + 8 +0-NGraph Vertex Idx + 62 +256 +370 +-1 + 6 +ByLayer + 10 +199.6666666666666288 + 20 +120.5 + 30 +0.0 + 40 +3.0 + 41 +100.0 + 71 +5 + 72 +2 + 1 +8 + 7 +normal + 50 +0.0 + 73 +0 + 44 +1.0 + 0 +MTEXT + 5 +39D +100 +AcDbEntity +100 +AcDbMText + 8 +0-NGraph Vertex Idx + 62 +256 +370 +-1 + 6 +ByLayer + 10 +129.6666666666666288 + 20 +150.5 + 30 +0.0 + 40 +3.0 + 41 +100.0 + 71 +5 + 72 +2 + 1 +9 + 7 +normal + 50 +0.0 + 73 +0 + 44 +1.0 + 0 +MTEXT + 5 +39E +100 +AcDbEntity +100 +AcDbMText + 8 +0-NGraph Vertex Idx + 62 +256 +370 +-1 + 6 +ByLayer + 10 +49.6666666666666288 + 20 +80.5 + 30 +0.0 + 40 +3.0 + 41 +100.0 + 71 +5 + 72 +2 + 1 +10 + 7 +normal + 50 +0.0 + 73 +0 + 44 +1.0 + 0 +MTEXT + 5 +39F +100 +AcDbEntity +100 +AcDbMText + 8 +0-UGrid Edge Idx + 62 +256 +370 +-1 + 6 +ByLayer + 10 +25.3795855978264058 + 20 +-41.2418265964679094 + 30 +0.0 + 40 +3.0 + 41 +100.0 + 71 +1 + 72 +2 + 1 +e[0] + 7 +normal + 50 +0.0 + 73 +0 + 44 +1.0 + 0 +MTEXT + 5 +3A0 +100 +AcDbEntity +100 +AcDbMText + 8 +0-UGrid Edge Idx + 62 +256 +370 +-1 + 6 +ByLayer + 10 +45.3206885675471511 + 20 +-8.6109308278339594 + 30 +0.0 + 40 +3.0 + 41 +100.0 + 71 +1 + 72 +2 + 1 +e[1] + 7 +normal + 50 +0.0 + 73 +0 + 44 +1.0 + 0 +MTEXT + 5 +3A1 +100 +AcDbEntity +100 +AcDbMText + 8 +0-UGrid Edge Idx + 62 +256 +370 +-1 + 6 +ByLayer + 10 +67.9810328513207196 + 20 +-36.70975773971319 + 30 +0.0 + 40 +3.0 + 41 +100.0 + 71 +1 + 72 +2 + 1 +e[2] + 7 +normal + 50 +0.0 + 73 +0 + 44 +1.0 + 0 +MTEXT + 5 +3A2 +100 +AcDbEntity +100 +AcDbMText + 8 +0-UGrid Edge Idx + 62 +256 +370 +-1 + 6 +ByLayer + 10 +119.6466178183244722 + 20 +-37.1629646253886605 + 30 +0.0 + 40 +3.0 + 41 +100.0 + 71 +1 + 72 +2 + 1 +e[3] + 7 +normal + 50 +0.0 + 73 +0 + 44 +1.0 + 0 +MTEXT + 5 +3A3 +100 +AcDbEntity +100 +AcDbMText + 8 +0-UGrid Edge Idx + 62 +256 +370 +-1 + 6 +ByLayer + 10 +97.4394804202263742 + 20 +-74.325929250777321 + 30 +0.0 + 40 +3.0 + 41 +100.0 + 71 +1 + 72 +2 + 1 +e[4] + 7 +normal + 50 +0.0 + 73 +0 + 44 +1.0 + 0 +MTEXT + 5 +3A4 +100 +AcDbEntity +100 +AcDbMText + 8 +0-UGrid Edge Idx + 62 +256 +370 +-1 + 6 +ByLayer + 10 +164.5140995001961528 + 20 +-40.3354128251169612 + 30 +0.0 + 40 +3.0 + 41 +100.0 + 71 +1 + 72 +2 + 1 +e[5] + 7 +normal + 50 +0.0 + 73 +0 + 44 +1.0 + 0 +MTEXT + 5 +3A5 +100 +AcDbEntity +100 +AcDbMText + 8 +0-UGrid Edge Idx + 62 +256 +370 +-1 + 6 +ByLayer + 10 +132.7896175029131598 + 20 +-12.6897927989132029 + 30 +0.0 + 40 +3.0 + 41 +100.0 + 71 +1 + 72 +2 + 1 +e[6] + 7 +normal + 50 +0.0 + 73 +0 + 44 +1.0 + 0 +MTEXT + 5 +3A6 +100 +AcDbEntity +100 +AcDbMText + 8 +0-UGrid Edge Idx + 62 +256 +370 +-1 + 6 +ByLayer + 10 +208.0219605250414077 + 20 +-24.4731718264754612 + 30 +0.0 + 40 +3.0 + 41 +100.0 + 71 +1 + 72 +2 + 1 +e[7] + 7 +normal + 50 +0.0 + 73 +0 + 44 +1.0 + 0 +MTEXT + 5 +3A7 +100 +AcDbEntity +100 +AcDbMText + 8 +0-UGrid Edge Idx + 62 +256 +370 +-1 + 6 +ByLayer + 10 +188.0808575553206765 + 20 +-68.8874466226716748 + 30 +0.0 + 40 +3.0 + 41 +100.0 + 71 +1 + 72 +2 + 1 +e[8] + 7 +normal + 50 +0.0 + 73 +0 + 44 +1.0 + 0 +MTEXT + 5 +3A8 +100 +AcDbEntity +100 +AcDbMText + 8 +0-UGrid Edge Idx + 62 +256 +370 +-1 + 6 +ByLayer + 10 +236.5739943225961213 + 20 +2.7192413140528289 + 30 +0.0 + 40 +3.0 + 41 +100.0 + 71 +1 + 72 +2 + 1 +e[9] + 7 +normal + 50 +0.0 + 73 +0 + 44 +1.0 + 0 +MTEXT + 5 +3A9 +100 +AcDbEntity +100 +AcDbMText + 8 +0-UGrid Edge Idx + 62 +256 +370 +-1 + 6 +ByLayer + 10 +199.8642365828829384 + 20 +19.0346891983698043 + 30 +0.0 + 40 +3.0 + 41 +100.0 + 71 +1 + 72 +2 + 1 +e[10] + 7 +normal + 50 +0.0 + 73 +0 + 44 +1.0 + 0 +MTEXT + 5 +3AA +100 +AcDbEntity +100 +AcDbMText + 8 +0-UGrid Edge Idx + 62 +256 +370 +-1 + 6 +ByLayer + 10 +178.1103060704602967 + 20 +71.6066879367244979 + 30 +0.0 + 40 +3.0 + 41 +100.0 + 71 +1 + 72 +2 + 1 +e[11] + 7 +normal + 50 +0.0 + 73 +0 + 44 +1.0 + 0 +MTEXT + 5 +3AB +100 +AcDbEntity +100 +AcDbMText + 8 +0-UGrid Edge Idx + 62 +256 +370 +-1 + 6 +ByLayer + 10 +165.8737201572225786 + 20 +37.1629646253886605 + 30 +0.0 + 40 +3.0 + 41 +100.0 + 71 +1 + 72 +2 + 1 +e[12] + 7 +normal + 50 +0.0 + 73 +0 + 44 +1.0 + 0 +MTEXT + 5 +3AC +100 +AcDbEntity +100 +AcDbMText + 8 +0-UGrid Edge Idx + 62 +256 +370 +-1 + 6 +ByLayer + 10 +214.8200638101734796 + 20 +92.9074115634716549 + 30 +0.0 + 40 +3.0 + 41 +100.0 + 71 +1 + 72 +2 + 1 +e[13] + 7 +normal + 50 +0.0 + 73 +0 + 44 +1.0 + 0 +MTEXT + 5 +3AD +100 +AcDbEntity +100 +AcDbMText + 8 +0-UGrid Edge Idx + 62 +256 +370 +-1 + 6 +ByLayer + 10 +175.8442716420829299 + 20 +104.2375837053584462 + 30 +0.0 + 40 +3.0 + 41 +100.0 + 71 +1 + 72 +2 + 1 +e[14] + 7 +normal + 50 +0.0 + 73 +0 + 44 +1.0 + 0 +MTEXT + 5 +3AE +100 +AcDbEntity +100 +AcDbMText + 8 +0-UGrid Edge Idx + 62 +256 +370 +-1 + 6 +ByLayer + 10 +165.8737201572225786 + 20 +141.8537552164225701 + 30 +0.0 + 40 +3.0 + 41 +100.0 + 71 +1 + 72 +2 + 1 +e[15] + 7 +normal + 50 +0.0 + 73 +0 + 44 +1.0 + 0 +MTEXT + 5 +3AF +100 +AcDbEntity +100 +AcDbMText + 8 +0-UGrid Edge Idx + 62 +256 +370 +-1 + 6 +ByLayer + 10 +138.6813070166942907 + 20 +125.9915142177810736 + 30 +0.0 + 40 +3.0 + 41 +100.0 + 71 +1 + 72 +2 + 1 +e[16] + 7 +normal + 50 +0.0 + 73 +0 + 44 +1.0 + 0 +MTEXT + 5 +3B0 +100 +AcDbEntity +100 +AcDbMText + 8 +0-UGrid Edge Idx + 62 +256 +370 +-1 + 6 +ByLayer + 10 +91.5477909064452433 + 20 +80.6708256502339225 + 30 +0.0 + 40 +3.0 + 41 +100.0 + 71 +1 + 72 +2 + 1 +e[17] + 7 +normal + 50 +0.0 + 73 +0 + 44 +1.0 + 0 +MTEXT + 5 +3B1 +100 +AcDbEntity +100 +AcDbMText + 8 +0-UGrid Edge Idx + 62 +256 +370 +-1 + 6 +ByLayer + 10 +80.6708256502339225 + 20 +121.4594453610263685 + 30 +0.0 + 40 +3.0 + 41 +100.0 + 71 +1 + 72 +2 + 1 +e[18] + 7 +normal + 50 +0.0 + 73 +0 + 44 +1.0 + 0 +MTEXT + 5 +3B2 +100 +AcDbEntity +100 +AcDbMText + 8 +0-UGrid Edge Idx + 62 +256 +370 +-1 + 6 +ByLayer + 10 +115.114548961569767 + 20 +31.2712751116075331 + 30 +0.0 + 40 +3.0 + 41 +100.0 + 71 +1 + 72 +2 + 1 +e[19] + 7 +normal + 50 +0.0 + 73 +0 + 44 +1.0 + 0 +MTEXT + 5 +3B3 +100 +AcDbEntity +100 +AcDbMText + 8 +0-UGrid Edge Idx + 62 +256 +370 +-1 + 6 +ByLayer + 10 +73.8727223651018505 + 20 +39.8822059394414907 + 30 +0.0 + 40 +3.0 + 41 +100.0 + 71 +1 + 72 +2 + 1 +e[20] + 7 +normal + 50 +0.0 + 73 +0 + 44 +1.0 + 0 +MTEXT + 5 +3B4 +100 +AcDbEntity +100 +AcDbMText + 8 +0-UGrid Edge Idx + 62 +256 +370 +-1 + 6 +ByLayer + 10 +14.955827227290559 + 20 +39.8822059394414907 + 30 +0.0 + 40 +3.0 + 41 +100.0 + 71 +1 + 72 +2 + 1 +e[21] + 7 +normal + 50 +0.0 + 73 +0 + 44 +1.0 + 0 +MTEXT + 5 +3B5 +100 +AcDbEntity +100 +AcDbMText + 8 +0-UGrid Triangle IDs + 62 +256 +370 +-1 + 6 +ByLayer + 10 +52.4994856366487497 + 20 +-27.617758389235437 + 30 +0.0 + 40 +3.0 + 41 +100.0 + 71 +5 + 72 +2 + 1 +D0 + 7 +greeks + 50 +0.0 + 73 +0 + 44 +1.0 + 0 +MTEXT + 5 +3B6 +100 +AcDbEntity +100 +AcDbMText + 8 +0-UGrid Triangle IDs + 62 +256 +370 +-1 + 6 +ByLayer + 10 +95.5541397758186974 + 20 +-47.1056544732807936 + 30 +0.0 + 40 +3.0 + 41 +100.0 + 71 +5 + 72 +2 + 1 +D1 + 7 +greeks + 50 +0.0 + 73 +0 + 44 +1.0 + 0 +MTEXT + 5 +3B7 +100 +AcDbEntity +100 +AcDbMText + 8 +0-UGrid Triangle IDs + 62 +256 +370 +-1 + 6 +ByLayer + 10 +136.3427594866113282 + 20 +-28.52417216058641 + 30 +0.0 + 40 +3.0 + 41 +100.0 + 71 +5 + 72 +2 + 1 +D2 + 7 +greeks + 50 +0.0 + 73 +0 + 44 +1.0 + 0 +MTEXT + 5 +3B8 +100 +AcDbEntity +100 +AcDbMText + 8 +0-UGrid Triangle IDs + 62 +256 +370 +-1 + 6 +ByLayer + 10 +185.2891031395623713 + 20 +-43.0267925022015305 + 30 +0.0 + 40 +3.0 + 41 +100.0 + 71 +5 + 72 +2 + 1 +D3 + 7 +greeks + 50 +0.0 + 73 +0 + 44 +1.0 + 0 +MTEXT + 5 +3B9 +100 +AcDbEntity +100 +AcDbMText + 8 +0-UGrid Triangle IDs + 62 +256 +370 +-1 + 6 +ByLayer + 10 +209.7622749660378929 + 20 +-1.784965905733471 + 30 +0.0 + 40 +3.0 + 41 +100.0 + 71 +5 + 72 +2 + 1 +D4 + 7 +greeks + 50 +0.0 + 73 +0 + 44 +1.0 + 0 +MTEXT + 5 +3BA +100 +AcDbEntity +100 +AcDbMText + 8 +0-UGrid Triangle IDs + 62 +256 +370 +-1 + 6 +ByLayer + 10 +179.3974136257813257 + 20 +48.9742052899195457 + 30 +0.0 + 40 +3.0 + 41 +100.0 + 71 +5 + 72 +2 + 1 +D5 + 7 +greeks + 50 +0.0 + 73 +0 + 44 +1.0 + 0 +MTEXT + 5 +3BB +100 +AcDbEntity +100 +AcDbMText + 8 +0-UGrid Triangle IDs + 62 +256 +370 +-1 + 6 +ByLayer + 10 +188.4615513392906792 + 20 +91.5756525434139803 + 30 +0.0 + 40 +3.0 + 41 +100.0 + 71 +5 + 72 +2 + 1 +D6 + 7 +greeks + 50 +0.0 + 73 +0 + 44 +1.0 + 0 +MTEXT + 5 +3BC +100 +AcDbEntity +100 +AcDbMText + 8 +0-UGrid Triangle IDs + 62 +256 +370 +-1 + 6 +ByLayer + 10 +155.8306555706566314 + 20 +119.2212725696178381 + 30 +0.0 + 40 +3.0 + 41 +100.0 + 71 +5 + 72 +2 + 1 +D7 + 7 +greeks + 50 +0.0 + 73 +0 + 44 +1.0 + 0 +MTEXT + 5 +3BD +100 +AcDbEntity +100 +AcDbMText + 8 +0-UGrid Triangle IDs + 62 +256 +370 +-1 + 6 +ByLayer + 10 +110.056760117433825 + 20 +107.4378935420555763 + 30 +0.0 + 40 +3.0 + 41 +100.0 + 71 +5 + 72 +2 + 1 +D8 + 7 +greeks + 50 +0.0 + 73 +0 + 44 +1.0 + 0 +MTEXT + 5 +3BE +100 +AcDbEntity +100 +AcDbMText + 8 +0-UGrid Triangle IDs + 62 +256 +370 +-1 + 6 +ByLayer + 10 +94.1945191187922575 + 20 +56.3523231977330994 + 30 +0.0 + 40 +3.0 + 41 +100.0 + 71 +5 + 72 +2 + 1 +D9 + 7 +greeks + 50 +0.0 + 73 +0 + 44 +1.0 + 0 +MTEXT + 5 +3BF +100 +AcDbEntity +100 +AcDbMText + 8 +0-UGrid Triangle IDs + 62 +256 +370 +-1 + 6 +ByLayer + 10 +46.6077961228675974 + 20 +23.1414128064175415 + 30 +0.0 + 40 +3.0 + 41 +100.0 + 71 +5 + 72 +2 + 1 +D10 + 7 +greeks + 50 +0.0 + 73 +0 + 44 +1.0 + 0 +MTEXT + 5 +3C0 +100 +AcDbEntity +100 +AcDbMText + 8 +0-UGrid Triangle IDs + 62 +256 +370 +-1 + 6 +ByLayer + 10 +136.3427594866114418 + 20 +24.047826577768511 + 30 +0.0 + 40 +3.0 + 41 +100.0 + 71 +5 + 72 +2 + 1 +D11 + 7 +greeks + 50 +0.0 + 73 +0 + 44 +1.0 + 0 +MTEXT + 5 +3C1 +100 +AcDbEntity +100 +AcDbMText + 8 +1-DGraph Vertex Idx + 62 +256 +370 +-1 + 6 +ByLayer + 10 +52.4994856366487497 + 20 +-27.617758389235437 + 30 +0.0 + 40 +3.0 + 41 +100.0 + 71 +5 + 72 +2 + 1 +0 + 7 +greeks + 50 +0.0 + 73 +0 + 44 +1.0 + 0 +MTEXT + 5 +3C2 +100 +AcDbEntity +100 +AcDbMText + 8 +1-DGraph Vertex Idx + 62 +256 +370 +-1 + 6 +ByLayer + 10 +95.5541397758186974 + 20 +-47.1056544732807936 + 30 +0.0 + 40 +3.0 + 41 +100.0 + 71 +5 + 72 +2 + 1 +1 + 7 +greeks + 50 +0.0 + 73 +0 + 44 +1.0 + 0 +MTEXT + 5 +3C3 +100 +AcDbEntity +100 +AcDbMText + 8 +1-DGraph Vertex Idx + 62 +256 +370 +-1 + 6 +ByLayer + 10 +185.2891031395623713 + 20 +-43.0267925022015305 + 30 +0.0 + 40 +3.0 + 41 +100.0 + 71 +5 + 72 +2 + 1 +2 + 7 +greeks + 50 +0.0 + 73 +0 + 44 +1.0 + 0 +MTEXT + 5 +3C4 +100 +AcDbEntity +100 +AcDbMText + 8 +1-DGraph Vertex Idx + 62 +256 +370 +-1 + 6 +ByLayer + 10 +209.7622749660378929 + 20 +-1.784965905733471 + 30 +0.0 + 40 +3.0 + 41 +100.0 + 71 +5 + 72 +2 + 1 +3 + 7 +greeks + 50 +0.0 + 73 +0 + 44 +1.0 + 0 +MTEXT + 5 +3C5 +100 +AcDbEntity +100 +AcDbMText + 8 +1-DGraph Vertex Idx + 62 +256 +370 +-1 + 6 +ByLayer + 10 +188.4615513392906792 + 20 +91.5756525434139803 + 30 +0.0 + 40 +3.0 + 41 +100.0 + 71 +5 + 72 +2 + 1 +4 + 7 +greeks + 50 +0.0 + 73 +0 + 44 +1.0 + 0 +MTEXT + 5 +3C6 +100 +AcDbEntity +100 +AcDbMText + 8 +1-DGraph Vertex Idx + 62 +256 +370 +-1 + 6 +ByLayer + 10 +155.8306555706566314 + 20 +119.2212725696178381 + 30 +0.0 + 40 +3.0 + 41 +100.0 + 71 +5 + 72 +2 + 1 +5 + 7 +greeks + 50 +0.0 + 73 +0 + 44 +1.0 + 0 +MTEXT + 5 +3C7 +100 +AcDbEntity +100 +AcDbMText + 8 +1-DGraph Vertex Idx + 62 +256 +370 +-1 + 6 +ByLayer + 10 +110.056760117433825 + 20 +107.4378935420555763 + 30 +0.0 + 40 +3.0 + 41 +100.0 + 71 +5 + 72 +2 + 1 +6 + 7 +greeks + 50 +0.0 + 73 +0 + 44 +1.0 + 0 +MTEXT + 5 +3C8 +100 +AcDbEntity +100 +AcDbMText + 8 +1-DGraph Vertex Idx + 62 +256 +370 +-1 + 6 +ByLayer + 10 +46.6077961228675974 + 20 +23.1414128064175415 + 30 +0.0 + 40 +3.0 + 41 +100.0 + 71 +5 + 72 +2 + 1 +7 + 7 +greeks + 50 +0.0 + 73 +0 + 44 +1.0 + 0 +MTEXT + 5 +3C9 +100 +AcDbEntity +100 +AcDbMText + 8 +1-DGraph Vertex Idx + 62 +256 +370 +-1 + 6 +ByLayer + 10 +114.1356220885131449 + 20 +-20.8196551041033544 + 30 +0.0 + 40 +3.0 + 41 +100.0 + 71 +5 + 72 +2 + 1 +8 + 7 +greeks + 50 +0.0 + 73 +0 + 44 +1.0 + 0 +MTEXT + 5 +3CA +100 +AcDbEntity +100 +AcDbMText + 8 +1-DGraph Vertex Idx + 62 +256 +370 +-1 + 6 +ByLayer + 10 +138.608793914988695 + 20 +-50.7313095586845932 + 30 +0.0 + 40 +3.0 + 41 +100.0 + 71 +5 + 72 +2 + 1 +9 + 7 +greeks + 50 +0.0 + 73 +0 + 44 +1.0 + 0 +MTEXT + 5 +3CB +100 +AcDbEntity +100 +AcDbMText + 8 +1-DGraph Vertex Idx + 62 +256 +370 +-1 + 6 +ByLayer + 10 +158.0966899990340835 + 20 +-20.8196551041033544 + 30 +0.0 + 40 +3.0 + 41 +100.0 + 71 +5 + 72 +2 + 1 +10 + 7 +greeks + 50 +0.0 + 73 +0 + 44 +1.0 + 0 +MTEXT + 5 +3CC +100 +AcDbEntity +100 +AcDbMText + 8 +1-DGraph Vertex Idx + 62 +256 +370 +-1 + 6 +ByLayer + 10 +136.3427594866113282 + 20 +-28.52417216058641 + 30 +0.0 + 40 +3.0 + 41 +100.0 + 71 +5 + 72 +2 + 1 +11 + 7 +greeks + 50 +0.0 + 73 +0 + 44 +1.0 + 0 +MTEXT + 5 +3CD +100 +AcDbEntity +100 +AcDbMText + 8 +1-DGraph Vertex Idx + 62 +256 +370 +-1 + 6 +ByLayer + 10 +162.1755519701133039 + 20 +68.0088944882894282 + 30 +0.0 + 40 +3.0 + 41 +100.0 + 71 +5 + 72 +2 + 1 +12 + 7 +greeks + 50 +0.0 + 73 +0 + 44 +1.0 + 0 +MTEXT + 5 +3CE +100 +AcDbEntity +100 +AcDbMText + 8 +1-DGraph Vertex Idx + 62 +256 +370 +-1 + 6 +ByLayer + 10 +181.2102411684832077 + 20 +19.5157577210137774 + 30 +0.0 + 40 +3.0 + 41 +100.0 + 71 +5 + 72 +2 + 1 +13 + 7 +greeks + 50 +0.0 + 73 +0 + 44 +1.0 + 0 +MTEXT + 5 +3CF +100 +AcDbEntity +100 +AcDbMText + 8 +1-DGraph Vertex Idx + 62 +256 +370 +-1 + 6 +ByLayer + 10 +202.0577579095549936 + 20 +54.4126879180252203 + 30 +0.0 + 40 +3.0 + 41 +100.0 + 71 +5 + 72 +2 + 1 +14 + 7 +greeks + 50 +0.0 + 73 +0 + 44 +1.0 + 0 +MTEXT + 5 +3D0 +100 +AcDbEntity +100 +AcDbMText + 8 +1-DGraph Vertex Idx + 62 +256 +370 +-1 + 6 +ByLayer + 10 +179.3974136257813257 + 20 +48.9742052899195457 + 30 +0.0 + 40 +3.0 + 41 +100.0 + 71 +5 + 72 +2 + 1 +15 + 7 +greeks + 50 +0.0 + 73 +0 + 44 +1.0 + 0 +MTEXT + 5 +3D1 +100 +AcDbEntity +100 +AcDbMText + 8 +1-DGraph Vertex Idx + 62 +256 +370 +-1 + 6 +ByLayer + 10 +113.6824152028377455 + 20 +8.1855855791269434 + 30 +0.0 + 40 +3.0 + 41 +100.0 + 71 +5 + 72 +2 + 1 +16 + 7 +greeks + 50 +0.0 + 73 +0 + 44 +1.0 + 0 +MTEXT + 5 +3D2 +100 +AcDbEntity +100 +AcDbMText + 8 +1-DGraph Vertex Idx + 62 +256 +370 +-1 + 6 +ByLayer + 10 +138.1555870293133239 + 20 +55.7723085750516745 + 30 +0.0 + 40 +3.0 + 41 +100.0 + 71 +5 + 72 +2 + 1 +17 + 7 +greeks + 50 +0.0 + 73 +0 + 44 +1.0 + 0 +MTEXT + 5 +3D3 +100 +AcDbEntity +100 +AcDbMText + 8 +1-DGraph Vertex Idx + 62 +256 +370 +-1 + 6 +ByLayer + 10 +158.0966899990341403 + 20 +7.2791718077760024 + 30 +0.0 + 40 +3.0 + 41 +100.0 + 71 +5 + 72 +2 + 1 +18 + 7 +greeks + 50 +0.0 + 73 +0 + 44 +1.0 + 0 +MTEXT + 5 +3D4 +100 +AcDbEntity +100 +AcDbMText + 8 +1-DGraph Vertex Idx + 62 +256 +370 +-1 + 6 +ByLayer + 10 +136.3427594866114418 + 20 +24.047826577768511 + 30 +0.0 + 40 +3.0 + 41 +100.0 + 71 +5 + 72 +2 + 1 +19 + 7 +greeks + 50 +0.0 + 73 +0 + 44 +1.0 + 0 +MTEXT + 5 +3D5 +100 +AcDbEntity +100 +AcDbMText + 8 +1-DGraph Vertex Idx + 62 +256 +370 +-1 + 6 +ByLayer + 10 +70.1745541779922775 + 20 +68.4621013739649413 + 30 +0.0 + 40 +3.0 + 41 +100.0 + 71 +5 + 72 +2 + 1 +20 + 7 +greeks + 50 +0.0 + 73 +0 + 44 +1.0 + 0 +MTEXT + 5 +3D6 +100 +AcDbEntity +100 +AcDbMText + 8 +1-DGraph Vertex Idx + 62 +256 +370 +-1 + 6 +ByLayer + 10 +91.0220709190640633 + 20 +23.1414128064175699 + 30 +0.0 + 40 +3.0 + 41 +100.0 + 71 +5 + 72 +2 + 1 +21 + 7 +greeks + 50 +0.0 + 73 +0 + 44 +1.0 + 0 +MTEXT + 5 +3D7 +100 +AcDbEntity +100 +AcDbMText + 8 +1-DGraph Vertex Idx + 62 +256 +370 +-1 + 6 +ByLayer + 10 +115.4952427455396275 + 20 +72.0877564593687339 + 30 +0.0 + 40 +3.0 + 41 +100.0 + 71 +5 + 72 +2 + 1 +22 + 7 +greeks + 50 +0.0 + 73 +0 + 44 +1.0 + 0 +MTEXT + 5 +3D8 +100 +AcDbEntity +100 +AcDbMText + 8 +1-DGraph Vertex Idx + 62 +256 +370 +-1 + 6 +ByLayer + 10 +94.1945191187922575 + 20 +56.3523231977330994 + 30 +0.0 + 40 +3.0 + 41 +100.0 + 71 +5 + 72 +2 + 1 +23 + 7 +greeks + 50 +0.0 + 73 +0 + 44 +1.0 + 0 +MTEXT + 5 +3D9 +100 +AcDbEntity +100 +AcDbMText + 8 +1-NGraph Vertex Idx + 62 +256 +370 +-1 + 6 +ByLayer + 10 +-0.3333333333333712 + 20 +0.5 + 30 +0.0 + 40 +3.0 + 41 +100.0 + 71 +5 + 72 +2 + 1 +0 + 7 +normal + 50 +0.0 + 73 +0 + 44 +1.0 + 0 +MTEXT + 5 +3DA +100 +AcDbEntity +100 +AcDbMText + 8 +1-NGraph Vertex Idx + 62 +256 +370 +-1 + 6 +ByLayer + 10 +59.6666666666666643 + 20 +-69.5 + 30 +0.0 + 40 +3.0 + 41 +100.0 + 71 +5 + 72 +2 + 1 +1 + 7 +normal + 50 +0.0 + 73 +0 + 44 +1.0 + 0 +MTEXT + 5 +3DB +100 +AcDbEntity +100 +AcDbMText + 8 +1-NGraph Vertex Idx + 62 +256 +370 +-1 + 6 +ByLayer + 10 +89.6666666666666572 + 20 +-9.5 + 30 +0.0 + 40 +3.0 + 41 +100.0 + 71 +5 + 72 +2 + 1 +2 + 7 +normal + 50 +0.0 + 73 +0 + 44 +1.0 + 0 +MTEXT + 5 +3DC +100 +AcDbEntity +100 +AcDbMText + 8 +1-NGraph Vertex Idx + 62 +256 +370 +-1 + 6 +ByLayer + 10 +139.6666666666666572 + 20 +-69.5 + 30 +0.0 + 40 +3.0 + 41 +100.0 + 71 +5 + 72 +2 + 1 +3 + 7 +normal + 50 +0.0 + 73 +0 + 44 +1.0 + 0 +MTEXT + 5 +3DD +100 +AcDbEntity +100 +AcDbMText + 8 +1-NGraph Vertex Idx + 62 +256 +370 +-1 + 6 +ByLayer + 10 +179.6666666666666572 + 20 +-9.5 + 30 +0.0 + 40 +3.0 + 41 +100.0 + 71 +5 + 72 +2 + 1 +4 + 7 +normal + 50 +0.0 + 73 +0 + 44 +1.0 + 0 +MTEXT + 5 +3DE +100 +AcDbEntity +100 +AcDbMText + 8 +1-NGraph Vertex Idx + 62 +256 +370 +-1 + 6 +ByLayer + 10 +239.6666666666666288 + 20 +-59.5 + 30 +0.0 + 40 +3.0 + 41 +100.0 + 71 +5 + 72 +2 + 1 +5 + 7 +normal + 50 +0.0 + 73 +0 + 44 +1.0 + 0 +MTEXT + 5 +3DF +100 +AcDbEntity +100 +AcDbMText + 8 +1-NGraph Vertex Idx + 62 +256 +370 +-1 + 6 +ByLayer + 10 +219.6666666666666288 + 20 +60.5 + 30 +0.0 + 40 +3.0 + 41 +100.0 + 71 +5 + 72 +2 + 1 +6 + 7 +normal + 50 +0.0 + 73 +0 + 44 +1.0 + 0 +MTEXT + 5 +3E0 +100 +AcDbEntity +100 +AcDbMText + 8 +1-NGraph Vertex Idx + 62 +256 +370 +-1 + 6 +ByLayer + 10 +139.6666666666666288 + 20 +90.5 + 30 +0.0 + 40 +3.0 + 41 +100.0 + 71 +5 + 72 +2 + 1 +7 + 7 +normal + 50 +0.0 + 73 +0 + 44 +1.0 + 0 +MTEXT + 5 +3E1 +100 +AcDbEntity +100 +AcDbMText + 8 +1-NGraph Vertex Idx + 62 +256 +370 +-1 + 6 +ByLayer + 10 +199.6666666666666288 + 20 +120.5 + 30 +0.0 + 40 +3.0 + 41 +100.0 + 71 +5 + 72 +2 + 1 +8 + 7 +normal + 50 +0.0 + 73 +0 + 44 +1.0 + 0 +MTEXT + 5 +3E2 +100 +AcDbEntity +100 +AcDbMText + 8 +1-NGraph Vertex Idx + 62 +256 +370 +-1 + 6 +ByLayer + 10 +129.6666666666666288 + 20 +150.5 + 30 +0.0 + 40 +3.0 + 41 +100.0 + 71 +5 + 72 +2 + 1 +9 + 7 +normal + 50 +0.0 + 73 +0 + 44 +1.0 + 0 +MTEXT + 5 +3E3 +100 +AcDbEntity +100 +AcDbMText + 8 +1-NGraph Vertex Idx + 62 +256 +370 +-1 + 6 +ByLayer + 10 +49.6666666666666288 + 20 +80.5 + 30 +0.0 + 40 +3.0 + 41 +100.0 + 71 +5 + 72 +2 + 1 +10 + 7 +normal + 50 +0.0 + 73 +0 + 44 +1.0 + 0 +MTEXT + 5 +3E4 +100 +AcDbEntity +100 +AcDbMText + 8 +1-NGraph Vertex Idx + 62 +256 +370 +-1 + 6 +ByLayer + 10 +114.6667558578257342 + 20 +40.5001783823182038 + 30 +0.0 + 40 +3.0 + 41 +100.0 + 71 +5 + 72 +2 + 1 +11 + 7 +normal + 50 +0.0 + 73 +0 + 44 +1.0 + 0 +MTEXT + 5 +3E5 +100 +AcDbEntity +100 +AcDbMText + 8 +1-NGraph Vertex Idx + 62 +256 +370 +-1 + 6 +ByLayer + 10 +95.0 + 20 +85.0 + 30 +0.0 + 40 +3.0 + 41 +100.0 + 71 +5 + 72 +2 + 1 +12 + 7 +normal + 50 +0.0 + 73 +0 + 44 +1.0 + 0 +MTEXT + 5 +3E6 +100 +AcDbEntity +100 +AcDbMText + 8 +1-NGraph Vertex Idx + 62 +256 +370 +-1 + 6 +ByLayer + 10 +70.1835145864434651 + 20 +35.1647746245767863 + 30 +0.0 + 40 +3.0 + 41 +100.0 + 71 +5 + 72 +2 + 1 +13 + 7 +normal + 50 +0.0 + 73 +0 + 44 +1.0 + 0 +MTEXT + 5 +3E7 +100 +AcDbEntity +100 +AcDbMText + 8 +1-NGraph Vertex Idx + 62 +256 +370 +-1 + 6 +ByLayer + 10 +159.6663822415672769 + 20 +-39.5004266376490492 + 30 +0.0 + 40 +3.0 + 41 +100.0 + 71 +5 + 72 +2 + 1 +14 + 7 +normal + 50 +0.0 + 73 +0 + 44 +1.0 + 0 +MTEXT + 5 +3E8 +100 +AcDbEntity +100 +AcDbMText + 8 +1-NGraph Vertex Idx + 62 +256 +370 +-1 + 6 +ByLayer + 10 +134.6666666666666572 + 20 +-9.5 + 30 +0.0 + 40 +3.0 + 41 +100.0 + 71 +5 + 72 +2 + 1 +15 + 7 +normal + 50 +0.0 + 73 +0 + 44 +1.0 + 0 +MTEXT + 5 +3E9 +100 +AcDbEntity +100 +AcDbMText + 8 +1-NGraph Vertex Idx + 62 +256 +370 +-1 + 6 +ByLayer + 10 +114.6666656292691329 + 20 +-39.4999987551229665 + 30 +0.0 + 40 +3.0 + 41 +100.0 + 71 +5 + 72 +2 + 1 +16 + 7 +normal + 50 +0.0 + 73 +0 + 44 +1.0 + 0 +MTEXT + 5 +3EA +100 +AcDbEntity +100 +AcDbMText + 8 +1-NGraph Vertex Idx + 62 +256 +370 +-1 + 6 +ByLayer + 10 +199.6666666666666288 + 20 +25.5 + 30 +0.0 + 40 +3.0 + 41 +100.0 + 71 +5 + 72 +2 + 1 +17 + 7 +normal + 50 +0.0 + 73 +0 + 44 +1.0 + 0 +MTEXT + 5 +3EB +100 +AcDbEntity +100 +AcDbMText + 8 +1-NGraph Vertex Idx + 62 +256 +370 +-1 + 6 +ByLayer + 10 +179.6666842009170466 + 20 +75.4999934246560969 + 30 +0.0 + 40 +3.0 + 41 +100.0 + 71 +5 + 72 +2 + 1 +18 + 7 +normal + 50 +0.0 + 73 +0 + 44 +1.0 + 0 +MTEXT + 5 +3EC +100 +AcDbEntity +100 +AcDbMText + 8 +1-NGraph Vertex Idx + 62 +256 +370 +-1 + 6 +ByLayer + 10 +159.6666116743496673 + 20 +40.5001374807924819 + 30 +0.0 + 40 +3.0 + 41 +100.0 + 71 +5 + 72 +2 + 1 +19 + 7 +normal + 50 +0.0 + 73 +0 + 44 +1.0 + 0 +MTEXT + 5 +3ED +100 +AcDbEntity +100 +AcDbMText + 8 +1-UGrid Edge Idx + 62 +256 +370 +-1 + 6 +ByLayer + 10 +66.349488062889165 + 20 +-39.5196404309011982 + 30 +0.0 + 40 +3.0 + 41 +100.0 + 71 +1 + 72 +2 + 1 +e[0] + 7 +normal + 50 +0.0 + 73 +0 + 44 +1.0 + 0 +MTEXT + 5 +3EE +100 +AcDbEntity +100 +AcDbMText + 8 +1-UGrid Edge Idx + 62 +256 +370 +-1 + 6 +ByLayer + 10 +43.8704265333857322 + 20 +-7.976441187888315 + 30 +0.0 + 40 +3.0 + 41 +100.0 + 71 +1 + 72 +2 + 1 +e[1] + 7 +normal + 50 +0.0 + 73 +0 + 44 +1.0 + 0 +MTEXT + 5 +3EF +100 +AcDbEntity +100 +AcDbMText + 8 +1-UGrid Edge Idx + 62 +256 +370 +-1 + 6 +ByLayer + 10 +25.0170200892860777 + 20 +-40.6073369565223317 + 30 +0.0 + 40 +3.0 + 41 +100.0 + 71 +1 + 72 +2 + 1 +e[2] + 7 +normal + 50 +0.0 + 73 +0 + 44 +1.0 + 0 +MTEXT + 5 +3F0 +100 +AcDbEntity +100 +AcDbMText + 8 +1-UGrid Edge Idx + 62 +256 +370 +-1 + 6 +ByLayer + 10 +114.5707006987594383 + 20 +-52.9345642468951851 + 30 +0.0 + 40 +3.0 + 41 +100.0 + 71 +1 + 72 +2 + 1 +e[3] + 7 +normal + 50 +0.0 + 73 +0 + 44 +1.0 + 0 +MTEXT + 5 +3F1 +100 +AcDbEntity +100 +AcDbMText + 8 +1-UGrid Edge Idx + 62 +256 +370 +-1 + 6 +ByLayer + 10 +92.0916391692559984 + 20 +-73.6007982336967217 + 30 +0.0 + 40 +3.0 + 41 +100.0 + 71 +1 + 72 +2 + 1 +e[4] + 7 +normal + 50 +0.0 + 73 +0 + 44 +1.0 + 0 +MTEXT + 5 +3F2 +100 +AcDbEntity +100 +AcDbMText + 8 +1-UGrid Edge Idx + 62 +256 +370 +-1 + 6 +ByLayer + 10 +202.6741192740712734 + 20 +-36.6191163625781755 + 30 +0.0 + 40 +3.0 + 41 +100.0 + 71 +1 + 72 +2 + 1 +e[5] + 7 +normal + 50 +0.0 + 73 +0 + 44 +1.0 + 0 +MTEXT + 5 +3F3 +100 +AcDbEntity +100 +AcDbMText + 8 +1-UGrid Edge Idx + 62 +256 +370 +-1 + 6 +ByLayer + 10 +182.0078852872697439 + 20 +-70.700274165373699 + 30 +0.0 + 40 +3.0 + 41 +100.0 + 71 +1 + 72 +2 + 1 +e[6] + 7 +normal + 50 +0.0 + 73 +0 + 44 +1.0 + 0 +MTEXT + 5 +3F4 +100 +AcDbEntity +100 +AcDbMText + 8 +1-UGrid Edge Idx + 62 +256 +370 +-1 + 6 +ByLayer + 10 +157.7159962150644219 + 20 +-49.6714746700317775 + 30 +0.0 + 40 +3.0 + 41 +100.0 + 71 +1 + 72 +2 + 1 +e[7] + 7 +normal + 50 +0.0 + 73 +0 + 44 +1.0 + 0 +MTEXT + 5 +3F5 +100 +AcDbEntity +100 +AcDbMText + 8 +1-UGrid Edge Idx + 62 +256 +370 +-1 + 6 +ByLayer + 10 +235.6675805512456634 + 20 +-7.2513101708075594 + 30 +0.0 + 40 +3.0 + 41 +100.0 + 71 +1 + 72 +2 + 1 +e[8] + 7 +normal + 50 +0.0 + 73 +0 + 44 +1.0 + 0 +MTEXT + 5 +3F6 +100 +AcDbEntity +100 +AcDbMText + 8 +1-UGrid Edge Idx + 62 +256 +370 +-1 + 6 +ByLayer + 10 +199.7735952057482507 + 20 +13.777489324534363 + 30 +0.0 + 40 +3.0 + 41 +100.0 + 71 +1 + 72 +2 + 1 +e[9] + 7 +normal + 50 +0.0 + 73 +0 + 44 +1.0 + 0 +MTEXT + 5 +3F7 +100 +AcDbEntity +100 +AcDbMText + 8 +1-UGrid Edge Idx + 62 +256 +370 +-1 + 6 +ByLayer + 10 +215.7264775815248754 + 20 +88.46598408385222 + 30 +0.0 + 40 +3.0 + 41 +100.0 + 71 +1 + 72 +2 + 1 +e[10] + 7 +normal + 50 +0.0 + 73 +0 + 44 +1.0 + 0 +MTEXT + 5 +3F8 +100 +AcDbEntity +100 +AcDbMText + 8 +1-UGrid Edge Idx + 62 +256 +370 +-1 + 6 +ByLayer + 10 +190.7094574922388119 + 20 +77.9515843361812557 + 30 +0.0 + 40 +3.0 + 41 +100.0 + 71 +1 + 72 +2 + 1 +e[11] + 7 +normal + 50 +0.0 + 73 +0 + 44 +1.0 + 0 +MTEXT + 5 +3F9 +100 +AcDbEntity +100 +AcDbMText + 8 +1-UGrid Edge Idx + 62 +256 +370 +-1 + 6 +ByLayer + 10 +173.6688785908410466 + 20 +102.9686044254673476 + 30 +0.0 + 40 +3.0 + 41 +100.0 + 71 +1 + 72 +2 + 1 +e[12] + 7 +normal + 50 +0.0 + 73 +0 + 44 +1.0 + 0 +MTEXT + 5 +3FA +100 +AcDbEntity +100 +AcDbMText + 8 +1-UGrid Edge Idx + 62 +256 +370 +-1 + 6 +ByLayer + 10 +173.6688785908410466 + 20 +140.3128518051262574 + 30 +0.0 + 40 +3.0 + 41 +100.0 + 71 +1 + 72 +2 + 1 +e[13] + 7 +normal + 50 +0.0 + 73 +0 + 44 +1.0 + 0 +MTEXT + 5 +3FB +100 +AcDbEntity +100 +AcDbMText + 8 +1-UGrid Edge Idx + 62 +256 +370 +-1 + 6 +ByLayer + 10 +138.5000242624243754 + 20 +125.0851004464304026 + 30 +0.0 + 40 +3.0 + 41 +100.0 + 71 +1 + 72 +2 + 1 +e[14] + 7 +normal + 50 +0.0 + 73 +0 + 44 +1.0 + 0 +MTEXT + 5 +3FC +100 +AcDbEntity +100 +AcDbMText + 8 +1-UGrid Edge Idx + 62 +256 +370 +-1 + 6 +ByLayer + 10 +93.5419012034175097 + 20 +93.9044667119578946 + 30 +0.0 + 40 +3.0 + 41 +100.0 + 71 +1 + 72 +2 + 1 +e[15] + 7 +normal + 50 +0.0 + 73 +0 + 44 +1.0 + 0 +MTEXT + 5 +3FD +100 +AcDbEntity +100 +AcDbMText + 8 +1-UGrid Edge Idx + 62 +256 +370 +-1 + 6 +ByLayer + 10 +94.6295977290386503 + 20 +129.7984520574553073 + 30 +0.0 + 40 +3.0 + 41 +100.0 + 71 +1 + 72 +2 + 1 +e[16] + 7 +normal + 50 +0.0 + 73 +0 + 44 +1.0 + 0 +MTEXT + 5 +3FE +100 +AcDbEntity +100 +AcDbMText + 8 +1-UGrid Edge Idx + 62 +256 +370 +-1 + 6 +ByLayer + 10 +51.8468677212740516 + 20 +49.3089091614913997 + 30 +0.0 + 40 +3.0 + 41 +100.0 + 71 +1 + 72 +2 + 1 +e[17] + 7 +normal + 50 +0.0 + 73 +0 + 44 +1.0 + 0 +MTEXT + 5 +3FF +100 +AcDbEntity +100 +AcDbMText + 8 +1-UGrid Edge Idx + 62 +256 +370 +-1 + 6 +ByLayer + 10 +23.5667580551245663 + 20 +54.7473917895970743 + 30 +0.0 + 40 +3.0 + 41 +100.0 + 71 +1 + 72 +2 + 1 +e[18] + 7 +normal + 50 +0.0 + 73 +0 + 44 +1.0 + 0 +MTEXT + 5 +400 +100 +AcDbEntity +100 +AcDbMText + 8 +1-UGrid Edge Idx + 62 +256 +370 +-1 + 6 +ByLayer + 10 +116.3835282414613204 + 20 +-24.291889072205322 + 30 +0.0 + 40 +3.0 + 41 +100.0 + 71 +1 + 72 +2 + 1 +e[19] + 7 +normal + 50 +0.0 + 73 +0 + 44 +1.0 + 0 +MTEXT + 5 +401 +100 +AcDbEntity +100 +AcDbMText + 8 +1-UGrid Edge Idx + 62 +256 +370 +-1 + 6 +ByLayer + 10 +106.9568250194114967 + 20 +-13.0523583074536074 + 30 +0.0 + 40 +3.0 + 41 +100.0 + 71 +1 + 72 +2 + 1 +e[20] + 7 +normal + 50 +0.0 + 73 +0 + 44 +1.0 + 0 +MTEXT + 5 +402 +100 +AcDbEntity +100 +AcDbMText + 8 +1-UGrid Edge Idx + 62 +256 +370 +-1 + 6 +ByLayer + 10 +105.1439974767096146 + 20 +-23.9293235636649442 + 30 +0.0 + 40 +3.0 + 41 +100.0 + 71 +1 + 72 +2 + 1 +e[21] + 7 +normal + 50 +0.0 + 73 +0 + 44 +1.0 + 0 +MTEXT + 5 +403 +100 +AcDbEntity +100 +AcDbMText + 8 +1-UGrid Edge Idx + 62 +256 +370 +-1 + 6 +ByLayer + 10 +140.3128518051262574 + 20 +-54.7473917895970743 + 30 +0.0 + 40 +3.0 + 41 +100.0 + 71 +1 + 72 +2 + 1 +e[22] + 7 +normal + 50 +0.0 + 73 +0 + 44 +1.0 + 0 +MTEXT + 5 +404 +100 +AcDbEntity +100 +AcDbMText + 8 +1-UGrid Edge Idx + 62 +256 +370 +-1 + 6 +ByLayer + 10 +131.9738451086975886 + 20 +-42.7827300077645987 + 30 +0.0 + 40 +3.0 + 41 +100.0 + 71 +1 + 72 +2 + 1 +e[23] + 7 +normal + 50 +0.0 + 73 +0 + 44 +1.0 + 0 +MTEXT + 5 +405 +100 +AcDbEntity +100 +AcDbMText + 8 +1-UGrid Edge Idx + 62 +256 +370 +-1 + 6 +ByLayer + 10 +128.7107555318341667 + 20 +-52.2094332298144295 + 30 +0.0 + 40 +3.0 + 41 +100.0 + 71 +1 + 72 +2 + 1 +e[24] + 7 +normal + 50 +0.0 + 73 +0 + 44 +1.0 + 0 +MTEXT + 5 +406 +100 +AcDbEntity +100 +AcDbMText + 8 +1-UGrid Edge Idx + 62 +256 +370 +-1 + 6 +ByLayer + 10 +160.9790857919278153 + 20 +-25.0170200892860777 + 30 +0.0 + 40 +3.0 + 41 +100.0 + 71 +1 + 72 +2 + 1 +e[25] + 7 +normal + 50 +0.0 + 73 +0 + 44 +1.0 + 0 +MTEXT + 5 +407 +100 +AcDbEntity +100 +AcDbMText + 8 +1-UGrid Edge Idx + 62 +256 +370 +-1 + 6 +ByLayer + 10 +151.5523825698779774 + 20 +-12.6897927989132278 + 30 +0.0 + 40 +3.0 + 41 +100.0 + 71 +1 + 72 +2 + 1 +e[26] + 7 +normal + 50 +0.0 + 73 +0 + 44 +1.0 + 0 +MTEXT + 5 +408 +100 +AcDbEntity +100 +AcDbMText + 8 +1-UGrid Edge Idx + 62 +256 +370 +-1 + 6 +ByLayer + 10 +149.7395550271760953 + 20 +-21.3913650038822993 + 30 +0.0 + 40 +3.0 + 41 +100.0 + 71 +1 + 72 +2 + 1 +e[27] + 7 +normal + 50 +0.0 + 73 +0 + 44 +1.0 + 0 +MTEXT + 5 +409 +100 +AcDbEntity +100 +AcDbMText + 8 +1-UGrid Edge Idx + 62 +256 +370 +-1 + 6 +ByLayer + 10 +162.0667823175489559 + 20 +61.6361364518642532 + 30 +0.0 + 40 +3.0 + 41 +100.0 + 71 +1 + 72 +2 + 1 +e[28] + 7 +normal + 50 +0.0 + 73 +0 + 44 +1.0 + 0 +MTEXT + 5 +40A +100 +AcDbEntity +100 +AcDbMText + 8 +1-UGrid Edge Idx + 62 +256 +370 +-1 + 6 +ByLayer + 10 +157.3534307065240228 + 20 +79.0392808618023963 + 30 +0.0 + 40 +3.0 + 41 +100.0 + 71 +1 + 72 +2 + 1 +e[29] + 7 +normal + 50 +0.0 + 73 +0 + 44 +1.0 + 0 +MTEXT + 5 +40B +100 +AcDbEntity +100 +AcDbMText + 8 +1-UGrid Edge Idx + 62 +256 +370 +-1 + 6 +ByLayer + 10 +149.3769895186357246 + 20 +72.875667216615966 + 30 +0.0 + 40 +3.0 + 41 +100.0 + 71 +1 + 72 +2 + 1 +e[30] + 7 +normal + 50 +0.0 + 73 +0 + 44 +1.0 + 0 +MTEXT + 5 +40C +100 +AcDbEntity +100 +AcDbMText + 8 +1-UGrid Edge Idx + 62 +256 +370 +-1 + 6 +ByLayer + 10 +182.7330163043504854 + 20 +11.2395307647517164 + 30 +0.0 + 40 +3.0 + 41 +100.0 + 71 +1 + 72 +2 + 1 +e[31] + 7 +normal + 50 +0.0 + 73 +0 + 44 +1.0 + 0 +MTEXT + 5 +40D +100 +AcDbEntity +100 +AcDbMText + 8 +1-UGrid Edge Idx + 62 +256 +370 +-1 + 6 +ByLayer + 10 +181.6453197787293448 + 20 +30.0929372088513709 + 30 +0.0 + 40 +3.0 + 41 +100.0 + 71 +1 + 72 +2 + 1 +e[32] + 7 +normal + 50 +0.0 + 73 +0 + 44 +1.0 + 0 +MTEXT + 5 +40E +100 +AcDbEntity +100 +AcDbMText + 8 +1-UGrid Edge Idx + 62 +256 +370 +-1 + 6 +ByLayer + 10 +170.4057890139776532 + 20 +24.6544545807456998 + 30 +0.0 + 40 +3.0 + 41 +100.0 + 71 +1 + 72 +2 + 1 +e[33] + 7 +normal + 50 +0.0 + 73 +0 + 44 +1.0 + 0 +MTEXT + 5 +40F +100 +AcDbEntity +100 +AcDbMText + 8 +1-UGrid Edge Idx + 62 +256 +370 +-1 + 6 +ByLayer + 10 +203.0366847826116441 + 20 +47.1335161102491327 + 30 +0.0 + 40 +3.0 + 41 +100.0 + 71 +1 + 72 +2 + 1 +e[34] + 7 +normal + 50 +0.0 + 73 +0 + 44 +1.0 + 0 +MTEXT + 5 +410 +100 +AcDbEntity +100 +AcDbMText + 8 +1-UGrid Edge Idx + 62 +256 +370 +-1 + 6 +ByLayer + 10 +201.223857239909762 + 20 +62.7238329774853867 + 30 +0.0 + 40 +3.0 + 41 +100.0 + 71 +1 + 72 +2 + 1 +e[35] + 7 +normal + 50 +0.0 + 73 +0 + 44 +1.0 + 0 +MTEXT + 5 +411 +100 +AcDbEntity +100 +AcDbMText + 8 +1-UGrid Edge Idx + 62 +256 +370 +-1 + 6 +ByLayer + 10 +190.7094574922388119 + 20 +59.0981778920816083 + 30 +0.0 + 40 +3.0 + 41 +100.0 + 71 +1 + 72 +2 + 1 +e[36] + 7 +normal + 50 +0.0 + 73 +0 + 44 +1.0 + 0 +MTEXT + 5 +412 +100 +AcDbEntity +100 +AcDbMText + 8 +1-UGrid Edge Idx + 62 +256 +370 +-1 + 6 +ByLayer + 10 +121.822010869566995 + 20 +2.5379585597826457 + 30 +0.0 + 40 +3.0 + 41 +100.0 + 71 +1 + 72 +2 + 1 +e[37] + 7 +normal + 50 +0.0 + 73 +0 + 44 +1.0 + 0 +MTEXT + 5 +413 +100 +AcDbEntity +100 +AcDbMText + 8 +1-UGrid Edge Idx + 62 +256 +370 +-1 + 6 +ByLayer + 10 +106.231694002330741 + 20 +15.5903168672362522 + 30 +0.0 + 40 +3.0 + 41 +100.0 + 71 +1 + 72 +2 + 1 +e[38] + 7 +normal + 50 +0.0 + 73 +0 + 44 +1.0 + 0 +MTEXT + 5 +414 +100 +AcDbEntity +100 +AcDbMText + 8 +1-UGrid Edge Idx + 62 +256 +370 +-1 + 6 +ByLayer + 10 +135.236934685560982 + 20 +45.3206885675472435 + 30 +0.0 + 40 +3.0 + 41 +100.0 + 71 +1 + 72 +2 + 1 +e[39] + 7 +normal + 50 +0.0 + 73 +0 + 44 +1.0 + 0 +MTEXT + 5 +415 +100 +AcDbEntity +100 +AcDbMText + 8 +1-UGrid Edge Idx + 62 +256 +370 +-1 + 6 +ByLayer + 10 +126.5353624805919139 + 20 +58.7356123835412305 + 30 +0.0 + 40 +3.0 + 41 +100.0 + 71 +1 + 72 +2 + 1 +e[40] + 7 +normal + 50 +0.0 + 73 +0 + 44 +1.0 + 0 +MTEXT + 5 +416 +100 +AcDbEntity +100 +AcDbMText + 8 +1-UGrid Edge Idx + 62 +256 +370 +-1 + 6 +ByLayer + 10 +150.8272515527972359 + 20 +13.0523583074536074 + 30 +0.0 + 40 +3.0 + 41 +100.0 + 71 +1 + 72 +2 + 1 +e[41] + 7 +normal + 50 +0.0 + 73 +0 + 44 +1.0 + 0 +MTEXT + 5 +417 +100 +AcDbEntity +100 +AcDbMText + 8 +1-UGrid Edge Idx + 62 +256 +370 +-1 + 6 +ByLayer + 10 +73.9633637422371066 + 20 +64.5366605201872829 + 30 +0.0 + 40 +3.0 + 41 +100.0 + 71 +1 + 72 +2 + 1 +e[42] + 7 +normal + 50 +0.0 + 73 +0 + 44 +1.0 + 0 +MTEXT + 5 +418 +100 +AcDbEntity +100 +AcDbMText + 8 +1-UGrid Edge Idx + 62 +256 +370 +-1 + 6 +ByLayer + 10 +76.1387567934793736 + 20 +80.1269773874235227 + 30 +0.0 + 40 +3.0 + 41 +100.0 + 71 +1 + 72 +2 + 1 +e[43] + 7 +normal + 50 +0.0 + 73 +0 + 44 +1.0 + 0 +MTEXT + 5 +419 +100 +AcDbEntity +100 +AcDbMText + 8 +1-UGrid Edge Idx + 62 +256 +370 +-1 + 6 +ByLayer + 10 +61.2735709433238753 + 20 +64.174095011646898 + 30 +0.0 + 40 +3.0 + 41 +100.0 + 71 +1 + 72 +2 + 1 +e[44] + 7 +normal + 50 +0.0 + 73 +0 + 44 +1.0 + 0 +MTEXT + 5 +41A +100 +AcDbEntity +100 +AcDbMText + 8 +1-UGrid Edge Idx + 62 +256 +370 +-1 + 6 +ByLayer + 10 +89.5536806094733606 + 20 +36.2565508540377976 + 30 +0.0 + 40 +3.0 + 41 +100.0 + 71 +1 + 72 +2 + 1 +e[45] + 7 +normal + 50 +0.0 + 73 +0 + 44 +1.0 + 0 +MTEXT + 5 +41B +100 +AcDbEntity +100 +AcDbMText + 8 +1-UGrid Edge Idx + 62 +256 +370 +-1 + 6 +ByLayer + 10 +79.401846370342767 + 20 +20.6662339868015437 + 30 +0.0 + 40 +3.0 + 41 +100.0 + 71 +1 + 72 +2 + 1 +e[46] + 7 +normal + 50 +0.0 + 73 +0 + 44 +1.0 + 0 +MTEXT + 5 +41C +100 +AcDbEntity +100 +AcDbMText + 8 +1-UGrid Edge Idx + 62 +256 +370 +-1 + 6 +ByLayer + 10 +116.3835282414613204 + 20 +83.7526324728273153 + 30 +0.0 + 40 +3.0 + 41 +100.0 + 71 +1 + 72 +2 + 1 +e[47] + 7 +normal + 50 +0.0 + 73 +0 + 44 +1.0 + 0 +MTEXT + 5 +41D +100 +AcDbEntity +100 +AcDbMText + 8 +1-UGrid Edge Idx + 62 +256 +370 +-1 + 6 +ByLayer + 10 +108.7696525621133929 + 20 +62.7238329774853867 + 30 +0.0 + 40 +3.0 + 41 +100.0 + 71 +1 + 72 +2 + 1 +e[48] + 7 +normal + 50 +0.0 + 73 +0 + 44 +1.0 + 0 +MTEXT + 5 +41E +100 +AcDbEntity +100 +AcDbMText + 8 +1-UGrid New Triangle IDs + 62 +256 +370 +-1 + 6 +ByLayer + 10 +114.1356220885131449 + 20 +-20.8196551041033544 + 30 +0.0 + 40 +3.0 + 41 +100.0 + 71 +5 + 72 +2 + 1 +D12 + 7 +greeks + 50 +0.0 + 73 +0 + 44 +1.0 + 0 +MTEXT + 5 +41F +100 +AcDbEntity +100 +AcDbMText + 8 +1-UGrid New Triangle IDs + 62 +256 +370 +-1 + 6 +ByLayer + 10 +138.6087939149886097 + 20 +-50.7313095586845932 + 30 +0.0 + 40 +3.0 + 41 +100.0 + 71 +5 + 72 +2 + 1 +D13 + 7 +greeks + 50 +0.0 + 73 +0 + 44 +1.0 + 0 +MTEXT + 5 +420 +100 +AcDbEntity +100 +AcDbMText + 8 +1-UGrid New Triangle IDs + 62 +256 +370 +-1 + 6 +ByLayer + 10 +158.0966899990340835 + 20 +-20.8196551041033544 + 30 +0.0 + 40 +3.0 + 41 +100.0 + 71 +5 + 72 +2 + 1 +D14 + 7 +greeks + 50 +0.0 + 73 +0 + 44 +1.0 + 0 +MTEXT + 5 +421 +100 +AcDbEntity +100 +AcDbMText + 8 +1-UGrid New Triangle IDs + 62 +256 +370 +-1 + 6 +ByLayer + 10 +136.3427594866113282 + 20 +-28.52417216058641 + 30 +0.0 + 40 +3.0 + 41 +100.0 + 71 +5 + 72 +2 + 1 +D15 + 7 +greeks + 50 +0.0 + 73 +0 + 44 +1.0 + 0 +MTEXT + 5 +422 +100 +AcDbEntity +100 +AcDbMText + 8 +1-UGrid New Triangle IDs + 62 +256 +370 +-1 + 6 +ByLayer + 10 +162.1755519701133039 + 20 +68.0088944882894282 + 30 +0.0 + 40 +3.0 + 41 +100.0 + 71 +5 + 72 +2 + 1 +D16 + 7 +greeks + 50 +0.0 + 73 +0 + 44 +1.0 + 0 +MTEXT + 5 +423 +100 +AcDbEntity +100 +AcDbMText + 8 +1-UGrid New Triangle IDs + 62 +256 +370 +-1 + 6 +ByLayer + 10 +181.2102411684832077 + 20 +19.5157577210137774 + 30 +0.0 + 40 +3.0 + 41 +100.0 + 71 +5 + 72 +2 + 1 +D17 + 7 +greeks + 50 +0.0 + 73 +0 + 44 +1.0 + 0 +MTEXT + 5 +424 +100 +AcDbEntity +100 +AcDbMText + 8 +1-UGrid New Triangle IDs + 62 +256 +370 +-1 + 6 +ByLayer + 10 +202.0577579095549936 + 20 +54.4126879180252203 + 30 +0.0 + 40 +3.0 + 41 +100.0 + 71 +5 + 72 +2 + 1 +D18 + 7 +greeks + 50 +0.0 + 73 +0 + 44 +1.0 + 0 +MTEXT + 5 +425 +100 +AcDbEntity +100 +AcDbMText + 8 +1-UGrid New Triangle IDs + 62 +256 +370 +-1 + 6 +ByLayer + 10 +179.3974136257813257 + 20 +48.9742052899195457 + 30 +0.0 + 40 +3.0 + 41 +100.0 + 71 +5 + 72 +2 + 1 +D29 + 7 +greeks + 50 +0.0 + 73 +0 + 44 +1.0 + 0 +MTEXT + 5 +426 +100 +AcDbEntity +100 +AcDbMText + 8 +1-UGrid New Triangle IDs + 62 +256 +370 +-1 + 6 +ByLayer + 10 +113.6824152028377455 + 20 +8.1855855791269434 + 30 +0.0 + 40 +3.0 + 41 +100.0 + 71 +5 + 72 +2 + 1 +D20 + 7 +greeks + 50 +0.0 + 73 +0 + 44 +1.0 + 0 +MTEXT + 5 +427 +100 +AcDbEntity +100 +AcDbMText + 8 +1-UGrid New Triangle IDs + 62 +256 +370 +-1 + 6 +ByLayer + 10 +138.1555870293133239 + 20 +55.7723085750516745 + 30 +0.0 + 40 +3.0 + 41 +100.0 + 71 +5 + 72 +2 + 1 +D21 + 7 +greeks + 50 +0.0 + 73 +0 + 44 +1.0 + 0 +MTEXT + 5 +428 +100 +AcDbEntity +100 +AcDbMText + 8 +1-UGrid New Triangle IDs + 62 +256 +370 +-1 + 6 +ByLayer + 10 +158.0966899990341403 + 20 +7.2791718077760024 + 30 +0.0 + 40 +3.0 + 41 +100.0 + 71 +5 + 72 +2 + 1 +D22 + 7 +greeks + 50 +0.0 + 73 +0 + 44 +1.0 + 0 +MTEXT + 5 +429 +100 +AcDbEntity +100 +AcDbMText + 8 +1-UGrid New Triangle IDs + 62 +256 +370 +-1 + 6 +ByLayer + 10 +136.3427594866114418 + 20 +24.047826577768511 + 30 +0.0 + 40 +3.0 + 41 +100.0 + 71 +5 + 72 +2 + 1 +D23 + 7 +greeks + 50 +0.0 + 73 +0 + 44 +1.0 + 0 +MTEXT + 5 +42A +100 +AcDbEntity +100 +AcDbMText + 8 +1-UGrid New Triangle IDs + 62 +256 +370 +-1 + 6 +ByLayer + 10 +70.2470672796984132 + 20 +68.1721391581167779 + 30 +0.0 + 40 +3.0 + 41 +100.0 + 71 +5 + 72 +2 + 1 +D24 + 7 +greeks + 50 +0.0 + 73 +0 + 44 +1.0 + 0 +MTEXT + 5 +42B +100 +AcDbEntity +100 +AcDbMText + 8 +1-UGrid New Triangle IDs + 62 +256 +370 +-1 + 6 +ByLayer + 10 +91.0945840207701991 + 20 +22.8514505905694207 + 30 +0.0 + 40 +3.0 + 41 +100.0 + 71 +5 + 72 +2 + 1 +D25 + 7 +greeks + 50 +0.0 + 73 +0 + 44 +1.0 + 0 +MTEXT + 5 +42C +100 +AcDbEntity +100 +AcDbMText + 8 +1-UGrid New Triangle IDs + 62 +256 +370 +-1 + 6 +ByLayer + 10 +115.5677558472457633 + 20 +71.7977942435205705 + 30 +0.0 + 40 +3.0 + 41 +100.0 + 71 +5 + 72 +2 + 1 +D26 + 7 +greeks + 50 +0.0 + 73 +0 + 44 +1.0 + 0 +MTEXT + 5 +42D +100 +AcDbEntity +100 +AcDbMText + 8 +1-UGrid New Triangle IDs + 62 +256 +370 +-1 + 6 +ByLayer + 10 +94.2670322204983933 + 20 +56.0623609818849502 + 30 +0.0 + 40 +3.0 + 41 +100.0 + 71 +5 + 72 +2 + 1 +D27 + 7 +greeks + 50 +0.0 + 73 +0 + 44 +1.0 + 0 +MTEXT + 5 +42E +100 +AcDbEntity +100 +AcDbMText + 8 +1-UGrid New Vertex Idx + 62 +256 +370 +-1 + 6 +ByLayer + 10 +164.8437500000022169 + 20 +-41.4062500000005613 + 30 +0.0 + 40 +3.0 + 41 +100.0 + 71 +1 + 72 +2 + 1 +11 + 7 +normal + 50 +0.0 + 73 +0 + 44 +1.0 + 0 +MTEXT + 5 +42F +100 +AcDbEntity +100 +AcDbMText + 8 +1-UGrid New Vertex Idx + 62 +256 +370 +-1 + 6 +ByLayer + 10 +134.375000000001819 + 20 +-16.0156250000002167 + 30 +0.0 + 40 +3.0 + 41 +100.0 + 71 +1 + 72 +2 + 1 +12 + 7 +normal + 50 +0.0 + 73 +0 + 44 +1.0 + 0 +MTEXT + 5 +430 +100 +AcDbEntity +100 +AcDbMText + 8 +1-UGrid New Vertex Idx + 62 +256 +370 +-1 + 6 +ByLayer + 10 +109.7656250000014779 + 20 +-41.4062500000005613 + 30 +0.0 + 40 +3.0 + 41 +100.0 + 71 +1 + 72 +2 + 1 +13 + 7 +normal + 50 +0.0 + 73 +0 + 44 +1.0 + 0 +MTEXT + 5 +431 +100 +AcDbEntity +100 +AcDbMText + 8 +1-UGrid New Vertex Idx + 62 +256 +370 +-1 + 6 +ByLayer + 10 +204.2968750000027569 + 20 +24.609375000000334 + 30 +0.0 + 40 +3.0 + 41 +100.0 + 71 +1 + 72 +2 + 1 +14 + 7 +normal + 50 +0.0 + 73 +0 + 44 +1.0 + 0 +MTEXT + 5 +432 +100 +AcDbEntity +100 +AcDbMText + 8 +1-UGrid New Vertex Idx + 62 +256 +370 +-1 + 6 +ByLayer + 10 +181.2500000000024443 + 20 +82.0312500000011084 + 30 +0.0 + 40 +3.0 + 41 +100.0 + 71 +1 + 72 +2 + 1 +15 + 7 +normal + 50 +0.0 + 73 +0 + 44 +1.0 + 0 +MTEXT + 5 +433 +100 +AcDbEntity +100 +AcDbMText + 8 +1-UGrid New Vertex Idx + 62 +256 +370 +-1 + 6 +ByLayer + 10 +166.7968750000022453 + 20 +43.7500000000005898 + 30 +0.0 + 40 +3.0 + 41 +100.0 + 71 +1 + 72 +2 + 1 +16 + 7 +normal + 50 +0.0 + 73 +0 + 44 +1.0 + 0 +MTEXT + 5 +434 +100 +AcDbEntity +100 +AcDbMText + 8 +1-UGrid New Vertex Idx + 62 +256 +370 +-1 + 6 +ByLayer + 10 +105.8593750000014353 + 20 +37.1093750000005045 + 30 +0.0 + 40 +3.0 + 41 +100.0 + 71 +1 + 72 +2 + 1 +17 + 7 +normal + 50 +0.0 + 73 +0 + 44 +1.0 + 0 +MTEXT + 5 +435 +100 +AcDbEntity +100 +AcDbMText + 8 +1-UGrid New Vertex Idx + 62 +256 +370 +-1 + 6 +ByLayer + 10 +94.531250000001279 + 20 +76.1718750000010232 + 30 +0.0 + 40 +3.0 + 41 +100.0 + 71 +1 + 72 +2 + 1 +18 + 7 +normal + 50 +0.0 + 73 +0 + 44 +1.0 + 0 +MTEXT + 5 +436 +100 +AcDbEntity +100 +AcDbMText + 8 +1-UGrid New Vertex Idx + 62 +256 +370 +-1 + 6 +ByLayer + 10 +62.5000000000008455 + 20 +36.7187500000004974 + 30 +0.0 + 40 +3.0 + 41 +100.0 + 71 +1 + 72 +2 + 1 +19 + 7 +normal + 50 +0.0 + 73 +0 + 44 +1.0 + 0 +MTEXT + 5 +437 +100 +AcDbEntity +100 +AcDbMText + 8 +1-UGrid Triangle IDs + 62 +256 +370 +-1 + 6 +ByLayer + 10 +52.4994856366487497 + 20 +-27.617758389235437 + 30 +0.0 + 40 +3.0 + 41 +100.0 + 71 +5 + 72 +2 + 1 +D0 + 7 +greeks + 50 +0.0 + 73 +0 + 44 +1.0 + 0 +MTEXT + 5 +438 +100 +AcDbEntity +100 +AcDbMText + 8 +1-UGrid Triangle IDs + 62 +256 +370 +-1 + 6 +ByLayer + 10 +95.5541397758186974 + 20 +-47.1056544732807936 + 30 +0.0 + 40 +3.0 + 41 +100.0 + 71 +5 + 72 +2 + 1 +D1 + 7 +greeks + 50 +0.0 + 73 +0 + 44 +1.0 + 0 +MTEXT + 5 +439 +100 +AcDbEntity +100 +AcDbMText + 8 +1-UGrid Triangle IDs + 62 +256 +370 +-1 + 6 +ByLayer + 10 +185.2891031395623713 + 20 +-43.0267925022015305 + 30 +0.0 + 40 +3.0 + 41 +100.0 + 71 +5 + 72 +2 + 1 +D3 + 7 +greeks + 50 +0.0 + 73 +0 + 44 +1.0 + 0 +MTEXT + 5 +43A +100 +AcDbEntity +100 +AcDbMText + 8 +1-UGrid Triangle IDs + 62 +256 +370 +-1 + 6 +ByLayer + 10 +209.7622749660378929 + 20 +-1.784965905733471 + 30 +0.0 + 40 +3.0 + 41 +100.0 + 71 +5 + 72 +2 + 1 +D4 + 7 +greeks + 50 +0.0 + 73 +0 + 44 +1.0 + 0 +MTEXT + 5 +43B +100 +AcDbEntity +100 +AcDbMText + 8 +1-UGrid Triangle IDs + 62 +256 +370 +-1 + 6 +ByLayer + 10 +188.4615513392906792 + 20 +91.5756525434139803 + 30 +0.0 + 40 +3.0 + 41 +100.0 + 71 +5 + 72 +2 + 1 +D6 + 7 +greeks + 50 +0.0 + 73 +0 + 44 +1.0 + 0 +MTEXT + 5 +43C +100 +AcDbEntity +100 +AcDbMText + 8 +1-UGrid Triangle IDs + 62 +256 +370 +-1 + 6 +ByLayer + 10 +155.8306555706566314 + 20 +119.2212725696178381 + 30 +0.0 + 40 +3.0 + 41 +100.0 + 71 +5 + 72 +2 + 1 +D7 + 7 +greeks + 50 +0.0 + 73 +0 + 44 +1.0 + 0 +MTEXT + 5 +43D +100 +AcDbEntity +100 +AcDbMText + 8 +1-UGrid Triangle IDs + 62 +256 +370 +-1 + 6 +ByLayer + 10 +110.056760117433825 + 20 +107.4378935420555763 + 30 +0.0 + 40 +3.0 + 41 +100.0 + 71 +5 + 72 +2 + 1 +D8 + 7 +greeks + 50 +0.0 + 73 +0 + 44 +1.0 + 0 +MTEXT + 5 +43E +100 +AcDbEntity +100 +AcDbMText + 8 +1-UGrid Triangle IDs + 62 +256 +370 +-1 + 6 +ByLayer + 10 +46.6077961228675974 + 20 +23.1414128064175415 + 30 +0.0 + 40 +3.0 + 41 +100.0 + 71 +5 + 72 +2 + 1 +D10 + 7 +greeks + 50 +0.0 + 73 +0 + 44 +1.0 + 0 +MTEXT + 5 +43F +100 +AcDbEntity +100 +AcDbMText + 8 +1-UGrid Triangle IDs + 62 +256 +370 +-1 + 6 +ByLayer + 10 +114.1356220885131449 + 20 +-20.8196551041033544 + 30 +0.0 + 40 +3.0 + 41 +100.0 + 71 +5 + 72 +2 + 1 +D12 + 7 +greeks + 50 +0.0 + 73 +0 + 44 +1.0 + 0 +MTEXT + 5 +440 +100 +AcDbEntity +100 +AcDbMText + 8 +1-UGrid Triangle IDs + 62 +256 +370 +-1 + 6 +ByLayer + 10 +138.6087939149886097 + 20 +-50.7313095586845932 + 30 +0.0 + 40 +3.0 + 41 +100.0 + 71 +5 + 72 +2 + 1 +D13 + 7 +greeks + 50 +0.0 + 73 +0 + 44 +1.0 + 0 +MTEXT + 5 +441 +100 +AcDbEntity +100 +AcDbMText + 8 +1-UGrid Triangle IDs + 62 +256 +370 +-1 + 6 +ByLayer + 10 +158.0966899990340835 + 20 +-20.8196551041033544 + 30 +0.0 + 40 +3.0 + 41 +100.0 + 71 +5 + 72 +2 + 1 +D14 + 7 +greeks + 50 +0.0 + 73 +0 + 44 +1.0 + 0 +MTEXT + 5 +442 +100 +AcDbEntity +100 +AcDbMText + 8 +1-UGrid Triangle IDs + 62 +256 +370 +-1 + 6 +ByLayer + 10 +136.3427594866113282 + 20 +-28.52417216058641 + 30 +0.0 + 40 +3.0 + 41 +100.0 + 71 +5 + 72 +2 + 1 +D15 + 7 +greeks + 50 +0.0 + 73 +0 + 44 +1.0 + 0 +MTEXT + 5 +443 +100 +AcDbEntity +100 +AcDbMText + 8 +1-UGrid Triangle IDs + 62 +256 +370 +-1 + 6 +ByLayer + 10 +162.1755519701133039 + 20 +68.0088944882894282 + 30 +0.0 + 40 +3.0 + 41 +100.0 + 71 +5 + 72 +2 + 1 +D16 + 7 +greeks + 50 +0.0 + 73 +0 + 44 +1.0 + 0 +MTEXT + 5 +444 +100 +AcDbEntity +100 +AcDbMText + 8 +1-UGrid Triangle IDs + 62 +256 +370 +-1 + 6 +ByLayer + 10 +181.2102411684832077 + 20 +19.5157577210137774 + 30 +0.0 + 40 +3.0 + 41 +100.0 + 71 +5 + 72 +2 + 1 +D17 + 7 +greeks + 50 +0.0 + 73 +0 + 44 +1.0 + 0 +MTEXT + 5 +445 +100 +AcDbEntity +100 +AcDbMText + 8 +1-UGrid Triangle IDs + 62 +256 +370 +-1 + 6 +ByLayer + 10 +202.0577579095549936 + 20 +54.4126879180252203 + 30 +0.0 + 40 +3.0 + 41 +100.0 + 71 +5 + 72 +2 + 1 +D18 + 7 +greeks + 50 +0.0 + 73 +0 + 44 +1.0 + 0 +MTEXT + 5 +446 +100 +AcDbEntity +100 +AcDbMText + 8 +1-UGrid Triangle IDs + 62 +256 +370 +-1 + 6 +ByLayer + 10 +179.3974136257813257 + 20 +48.9742052899195457 + 30 +0.0 + 40 +3.0 + 41 +100.0 + 71 +5 + 72 +2 + 1 +D19 + 7 +greeks + 50 +0.0 + 73 +0 + 44 +1.0 + 0 +MTEXT + 5 +447 +100 +AcDbEntity +100 +AcDbMText + 8 +1-UGrid Triangle IDs + 62 +256 +370 +-1 + 6 +ByLayer + 10 +113.6824152028377455 + 20 +8.1855855791269434 + 30 +0.0 + 40 +3.0 + 41 +100.0 + 71 +5 + 72 +2 + 1 +D20 + 7 +greeks + 50 +0.0 + 73 +0 + 44 +1.0 + 0 +MTEXT + 5 +448 +100 +AcDbEntity +100 +AcDbMText + 8 +1-UGrid Triangle IDs + 62 +256 +370 +-1 + 6 +ByLayer + 10 +138.1555870293133239 + 20 +55.7723085750516745 + 30 +0.0 + 40 +3.0 + 41 +100.0 + 71 +5 + 72 +2 + 1 +D21 + 7 +greeks + 50 +0.0 + 73 +0 + 44 +1.0 + 0 +MTEXT + 5 +449 +100 +AcDbEntity +100 +AcDbMText + 8 +1-UGrid Triangle IDs + 62 +256 +370 +-1 + 6 +ByLayer + 10 +158.0966899990341403 + 20 +7.2791718077760024 + 30 +0.0 + 40 +3.0 + 41 +100.0 + 71 +5 + 72 +2 + 1 +D22 + 7 +greeks + 50 +0.0 + 73 +0 + 44 +1.0 + 0 +MTEXT + 5 +44A +100 +AcDbEntity +100 +AcDbMText + 8 +1-UGrid Triangle IDs + 62 +256 +370 +-1 + 6 +ByLayer + 10 +136.3427594866114418 + 20 +24.047826577768511 + 30 +0.0 + 40 +3.0 + 41 +100.0 + 71 +5 + 72 +2 + 1 +D23 + 7 +greeks + 50 +0.0 + 73 +0 + 44 +1.0 + 0 +MTEXT + 5 +44B +100 +AcDbEntity +100 +AcDbMText + 8 +1-UGrid Triangle IDs + 62 +256 +370 +-1 + 6 +ByLayer + 10 +70.2470672796984132 + 20 +68.1721391581167779 + 30 +0.0 + 40 +3.0 + 41 +100.0 + 71 +5 + 72 +2 + 1 +D24 + 7 +greeks + 50 +0.0 + 73 +0 + 44 +1.0 + 0 +MTEXT + 5 +44C +100 +AcDbEntity +100 +AcDbMText + 8 +1-UGrid Triangle IDs + 62 +256 +370 +-1 + 6 +ByLayer + 10 +91.0945840207701991 + 20 +22.8514505905694207 + 30 +0.0 + 40 +3.0 + 41 +100.0 + 71 +5 + 72 +2 + 1 +D25 + 7 +greeks + 50 +0.0 + 73 +0 + 44 +1.0 + 0 +MTEXT + 5 +44D +100 +AcDbEntity +100 +AcDbMText + 8 +1-UGrid Triangle IDs + 62 +256 +370 +-1 + 6 +ByLayer + 10 +115.5677558472457633 + 20 +71.7977942435205705 + 30 +0.0 + 40 +3.0 + 41 +100.0 + 71 +5 + 72 +2 + 1 +D26 + 7 +greeks + 50 +0.0 + 73 +0 + 44 +1.0 + 0 +MTEXT + 5 +44E +100 +AcDbEntity +100 +AcDbMText + 8 +1-UGrid Triangle IDs + 62 +256 +370 +-1 + 6 +ByLayer + 10 +94.2670322204983933 + 20 +56.0623609818849502 + 30 +0.0 + 40 +3.0 + 41 +100.0 + 71 +5 + 72 +2 + 1 +D27 + 7 +greeks + 50 +0.0 + 73 +0 + 44 +1.0 + 0 +MTEXT + 5 +44F +100 +AcDbEntity +100 +AcDbMText + 8 +1-UGrid Triangle Idx + 62 +256 +370 +-1 + 6 +ByLayer + 10 +52.755019316493339 + 20 +-26.5040026106983753 + 30 +0.0 + 40 +3.0 + 41 +100.0 + 71 +5 + 72 +2 + 1 +D[0,0] + 7 +greeks + 50 +0.0 + 73 +0 + 44 +1.0 + 0 +MTEXT + 5 +450 +100 +AcDbEntity +100 +AcDbMText + 8 +1-UGrid Triangle Idx + 62 +256 +370 +-1 + 6 +ByLayer + 10 +188.0 + 20 +90.4090909999999894 + 30 +0.0 + 40 +3.0 + 41 +100.0 + 71 +5 + 72 +2 + 1 +D[6,1] + 7 +greeks + 50 +0.0 + 73 +0 + 44 +1.0 + 0 +MTEXT + 5 +451 +100 +AcDbEntity +100 +AcDbMText + 8 +1-UGrid Triangle Idx + 62 +256 +370 +-1 + 6 +ByLayer + 10 +154.9479940564648643 + 20 +117.7642173001495252 + 30 +0.0 + 40 +3.0 + 41 +100.0 + 71 +5 + 72 +2 + 1 +D[7,2] + 7 +greeks + 50 +0.0 + 73 +0 + 44 +1.0 + 0 +MTEXT + 5 +452 +100 +AcDbEntity +100 +AcDbMText + 8 +1-UGrid Triangle Idx + 62 +256 +370 +-1 + 6 +ByLayer + 10 +109.292600297177728 + 20 +106.186921609213357 + 30 +0.0 + 40 +3.0 + 41 +100.0 + 71 +5 + 72 +2 + 1 +D[8,3] + 7 +greeks + 50 +0.0 + 73 +0 + 44 +1.0 + 0 +MTEXT + 5 +453 +100 +AcDbEntity +100 +AcDbMText + 8 +1-UGrid Triangle Idx + 62 +256 +370 +-1 + 6 +ByLayer + 10 +47.0728083209512889 + 20 +22.1671890683508188 + 30 +0.0 + 40 +3.0 + 41 +100.0 + 71 +5 + 72 +2 + 1 +D[10,4] + 7 +greeks + 50 +0.0 + 73 +0 + 44 +1.0 + 0 +MTEXT + 5 +454 +100 +AcDbEntity +100 +AcDbMText + 8 +1-UGrid Triangle Idx + 62 +256 +370 +-1 + 6 +ByLayer + 10 +70.0 + 20 +68.4090909999999894 + 30 +0.0 + 40 +3.0 + 41 +100.0 + 71 +5 + 72 +2 + 1 +D[12,5] + 7 +greeks + 50 +0.0 + 73 +0 + 44 +1.0 + 0 +MTEXT + 5 +455 +100 +AcDbEntity +100 +AcDbMText + 8 +1-UGrid Triangle Idx + 62 +256 +370 +-1 + 6 +ByLayer + 10 +90.5471619613676211 + 20 +23.0040389940566072 + 30 +0.0 + 40 +3.0 + 41 +100.0 + 71 +5 + 72 +2 + 1 +D[13,6] + 7 +greeks + 50 +0.0 + 73 +0 + 44 +1.0 + 0 +MTEXT + 5 +456 +100 +AcDbEntity +100 +AcDbMText + 8 +1-UGrid Triangle Idx + 62 +256 +370 +-1 + 6 +ByLayer + 10 +115.2844457652311689 + 20 +73.7840924858846421 + 30 +0.0 + 40 +3.0 + 41 +100.0 + 71 +5 + 72 +2 + 1 +D[14,7] + 7 +greeks + 50 +0.0 + 73 +0 + 44 +1.0 + 0 +MTEXT + 5 +457 +100 +AcDbEntity +100 +AcDbMText + 8 +1-UGrid Triangle Idx + 62 +256 +370 +-1 + 6 +ByLayer + 10 +93.4593997028238874 + 20 +54.1013822332842054 + 30 +0.0 + 40 +3.0 + 41 +100.0 + 71 +5 + 72 +2 + 1 +D[15,8] + 7 +greeks + 50 +0.0 + 73 +0 + 44 +1.0 + 0 +MTEXT + 5 +458 +100 +AcDbEntity +100 +AcDbMText + 8 +1-UGrid Triangle Idx + 62 +256 +370 +-1 + 6 +ByLayer + 10 +95.4531946508173093 + 20 +-47.971295329866301 + 30 +0.0 + 40 +3.0 + 41 +100.0 + 71 +5 + 72 +2 + 1 +D[1,9] + 7 +greeks + 50 +0.0 + 73 +0 + 44 +1.0 + 0 +MTEXT + 5 +459 +100 +AcDbEntity +100 +AcDbMText + 8 +1-UGrid Triangle Idx + 62 +256 +370 +-1 + 6 +ByLayer + 10 +186.3298662704316371 + 20 +-45.356139312035836 + 30 +0.0 + 40 +3.0 + 41 +100.0 + 71 +5 + 72 +2 + 1 +D[3,10] + 7 +greeks + 50 +0.0 + 73 +0 + 44 +1.0 + 0 +MTEXT + 5 +45A +100 +AcDbEntity +100 +AcDbMText + 8 +1-UGrid Triangle Idx + 62 +256 +370 +-1 + 6 +ByLayer + 10 +209.6811173848448959 + 20 +-3.8755806196136904 + 30 +0.0 + 40 +3.0 + 41 +100.0 + 71 +5 + 72 +2 + 1 +D[4,11] + 7 +greeks + 50 +0.0 + 73 +0 + 44 +1.0 + 0 +MTEXT + 5 +45B +100 +AcDbEntity +100 +AcDbMText + 8 +1-UGrid Triangle Idx + 62 +256 +370 +-1 + 6 +ByLayer + 10 +113.2224475482913562 + 20 +-19.0861648692422179 + 30 +0.0 + 40 +3.0 + 41 +100.0 + 71 +5 + 72 +2 + 1 +D[16,12] + 7 +greeks + 50 +0.0 + 73 +0 + 44 +1.0 + 0 +MTEXT + 5 +45C +100 +AcDbEntity +100 +AcDbMText + 8 +1-UGrid Triangle Idx + 62 +256 +370 +-1 + 6 +ByLayer + 10 +138.0 + 20 +-48.5909089999999964 + 30 +0.0 + 40 +3.0 + 41 +100.0 + 71 +5 + 72 +2 + 1 +D[17,13] + 7 +greeks + 50 +0.0 + 73 +0 + 44 +1.0 + 0 +MTEXT + 5 +45D +100 +AcDbEntity +100 +AcDbMText + 8 +1-UGrid Triangle Idx + 62 +256 +370 +-1 + 6 +ByLayer + 10 +158.3186163447253989 + 20 +-19.7288656121842862 + 30 +0.0 + 40 +3.0 + 41 +100.0 + 71 +5 + 72 +2 + 1 +D[18,14] + 7 +greeks + 50 +0.0 + 73 +0 + 44 +1.0 + 0 +MTEXT + 5 +45E +100 +AcDbEntity +100 +AcDbMText + 8 +1-UGrid Triangle Idx + 62 +256 +370 +-1 + 6 +ByLayer + 10 +136.6810246656762331 + 20 +-30.2263110802377781 + 30 +0.0 + 40 +3.0 + 41 +100.0 + 71 +5 + 72 +2 + 1 +D[19,15] + 7 +greeks + 50 +0.0 + 73 +0 + 44 +1.0 + 0 +MTEXT + 5 +45F +100 +AcDbEntity +100 +AcDbMText + 8 +1-UGrid Triangle Idx + 62 +256 +370 +-1 + 6 +ByLayer + 10 +160.8090817236268322 + 20 +67.624877032689966 + 30 +0.0 + 40 +3.0 + 41 +100.0 + 71 +5 + 72 +2 + 1 +D[20,16] + 7 +greeks + 50 +0.0 + 73 +0 + 44 +1.0 + 0 +MTEXT + 5 +460 +100 +AcDbEntity +100 +AcDbMText + 8 +1-UGrid Triangle Idx + 62 +256 +370 +-1 + 6 +ByLayer + 10 +182.2056606240723227 + 20 +18.1904782213968303 + 30 +0.0 + 40 +3.0 + 41 +100.0 + 71 +5 + 72 +2 + 1 +D[21,17] + 7 +greeks + 50 +0.0 + 73 +0 + 44 +1.0 + 0 +MTEXT + 5 +461 +100 +AcDbEntity +100 +AcDbMText + 8 +1-UGrid Triangle Idx + 62 +256 +370 +-1 + 6 +ByLayer + 10 +202.0490460624087348 + 20 +55.0386541500747342 + 30 +0.0 + 40 +3.0 + 41 +100.0 + 71 +5 + 72 +2 + 1 +D[22,18] + 7 +greeks + 50 +0.0 + 73 +0 + 44 +1.0 + 0 +MTEXT + 5 +462 +100 +AcDbEntity +100 +AcDbMText + 8 +1-UGrid Triangle Idx + 62 +256 +370 +-1 + 6 +ByLayer + 10 +177.8138722139687218 + 20 +45.6659349821697518 + 30 +0.0 + 40 +3.0 + 41 +100.0 + 71 +5 + 72 +2 + 1 +D[23,19] + 7 +greeks + 50 +0.0 + 73 +0 + 44 +1.0 + 0 +MTEXT + 5 +463 +100 +AcDbEntity +100 +AcDbMText + 8 +1-UGrid Triangle Idx + 62 +256 +370 +-1 + 6 +ByLayer + 10 +113.2362555720659714 + 20 +4.5933406285289973 + 30 +0.0 + 40 +3.0 + 41 +100.0 + 71 +5 + 72 +2 + 1 +D[24,20] + 7 +greeks + 50 +0.0 + 73 +0 + 44 +1.0 + 0 +MTEXT + 5 +464 +100 +AcDbEntity +100 +AcDbMText + 8 +1-UGrid Triangle Idx + 62 +256 +370 +-1 + 6 +ByLayer + 10 +137.645075780090167 + 20 +55.306446126300564 + 30 +0.0 + 40 +3.0 + 41 +100.0 + 71 +5 + 72 +2 + 1 +D[25,21] + 7 +greeks + 50 +0.0 + 73 +0 + 44 +1.0 + 0 +MTEXT + 5 +465 +100 +AcDbEntity +100 +AcDbMText + 8 +1-UGrid Triangle Idx + 62 +256 +370 +-1 + 6 +ByLayer + 10 +158.2169390787526879 + 20 +4.3318250267459346 + 30 +0.0 + 40 +3.0 + 41 +100.0 + 71 +5 + 72 +2 + 1 +D[26,22] + 7 +greeks + 50 +0.0 + 73 +0 + 44 +1.0 + 0 +MTEXT + 5 +466 +100 +AcDbEntity +100 +AcDbMText + 8 +1-UGrid Triangle Idx + 62 +256 +370 +-1 + 6 +ByLayer + 10 +136.0717979197631564 + 20 +23.8408889197624134 + 30 +0.0 + 40 +3.0 + 41 +100.0 + 71 +5 + 72 +2 + 1 +D[27,23] + 7 +greeks + 50 +0.0 + 73 +0 + 44 +1.0 + 0 +MTEXT + 5 +467 +100 +AcDbEntity +100 +AcDbMText + 8 +2-Vertices + 62 +256 +370 +-1 + 6 +ByLayer + 10 +130.0781250000017621 + 20 +63.2812500000008527 + 30 +0.0 + 40 +3.0 + 41 +100.0 + 71 +1 + 72 +2 + 1 +20 + 7 +normal + 50 +0.0 + 73 +0 + 44 +1.0 + 0 +MTEXT + 5 +468 +100 +AcDbEntity +100 +AcDbMText + 8 +2-Vertices + 62 +256 +370 +-1 + 6 +ByLayer + 10 +115.2343750000015632 + 20 +94.531250000001279 + 30 +0.0 + 40 +3.0 + 41 +100.0 + 71 +1 + 72 +2 + 1 +21 + 7 +normal + 50 +0.0 + 73 +0 + 44 +1.0 + 0 +MTEXT + 5 +469 +100 +AcDbEntity +100 +AcDbMText + 8 +2-Vertices + 62 +256 +370 +-1 + 6 +ByLayer + 10 +98.0468750000013216 + 20 +60.9375000000008242 + 30 +0.0 + 40 +3.0 + 41 +100.0 + 71 +1 + 72 +2 + 1 +22 + 7 +normal + 50 +0.0 + 73 +0 + 44 +1.0 + 0 +MTEXT + 5 +46A +100 +AcDbEntity +100 +AcDbMText + 8 +2-Vertices + 62 +256 +370 +-1 + 6 +ByLayer + 10 +122.2656250000016485 + 20 +9.3750000000001261 + 30 +0.0 + 40 +3.0 + 41 +100.0 + 71 +1 + 72 +2 + 1 +23 + 7 +normal + 50 +0.0 + 73 +0 + 44 +1.0 + 0 +MTEXT + 5 +46B +100 +AcDbEntity +100 +AcDbMText + 8 +2-Vertices + 62 +256 +370 +-1 + 6 +ByLayer + 10 +109.7656250000014779 + 20 +-14.0625000000001901 + 30 +0.0 + 40 +3.0 + 41 +100.0 + 71 +1 + 72 +2 + 1 +24 + 7 +normal + 50 +0.0 + 73 +0 + 44 +1.0 + 0 +MTEXT + 5 +46C +100 +AcDbEntity +100 +AcDbMText + 8 +2-Vertices + 62 +256 +370 +-1 + 6 +ByLayer + 10 +95.3125000000012932 + 20 +18.7500000000002522 + 30 +0.0 + 40 +3.0 + 41 +100.0 + 71 +1 + 72 +2 + 1 +25 + 7 +normal + 50 +0.0 + 73 +0 + 44 +1.0 + 0 +MTEXT + 5 +46D +100 +AcDbEntity +100 +AcDbMText + 8 +2-Vertices + 62 +256 +370 +-1 + 6 +ByLayer + 10 +153.1250000000020748 + 20 +66.4062500000008953 + 30 +0.0 + 40 +3.0 + 41 +100.0 + 71 +1 + 72 +2 + 1 +26 + 7 +normal + 50 +0.0 + 73 +0 + 44 +1.0 + 0 +MTEXT + 5 +46E +100 +AcDbEntity +100 +AcDbMText + 8 +2-Vertices + 62 +256 +370 +-1 + 6 +ByLayer + 10 +139.4531250000018758 + 20 +38.6718750000005258 + 30 +0.0 + 40 +3.0 + 41 +100.0 + 71 +1 + 72 +2 + 1 +27 + 7 +normal + 50 +0.0 + 73 +0 + 44 +1.0 + 0 +MTEXT + 5 +46F +100 +AcDbEntity +100 +AcDbMText + 8 +2-Vertices + 62 +256 +370 +-1 + 6 +ByLayer + 10 +150.0000000000020179 + 20 +13.6718750000001847 + 30 +0.0 + 40 +3.0 + 41 +100.0 + 71 +1 + 72 +2 + 1 +30 + 7 +normal + 50 +0.0 + 73 +0 + 44 +1.0 + 0 +MTEXT + 5 +470 +100 +AcDbEntity +100 +AcDbMText + 8 +2-Vertices + 62 +256 +370 +-1 + 6 +ByLayer + 10 +156.7213114754110563 + 20 +-12.4590163934427203 + 30 +0.0 + 40 +3.0 + 41 +100.0 + 71 +1 + 72 +2 + 1 +29 + 7 +normal + 50 +0.0 + 73 +0 + 44 +1.0 + 0 +MTEXT + 5 +471 +100 +AcDbEntity +100 +AcDbMText + 8 +2-Vertices + 62 +256 +370 +-1 + 6 +ByLayer + 10 +173.114754098361999 + 20 +16.0655737704919268 + 30 +0.0 + 40 +3.0 + 41 +100.0 + 71 +1 + 72 +2 + 1 +28 + 7 +normal + 50 +0.0 + 73 +0 + 44 +1.0 + 0 +LINE + 5 +472 +100 +AcDbEntity +100 +AcDbLine + 8 +2 + 62 +256 +370 +-1 + 6 +ByLayer + 10 +140.0 + 20 +90.0 + 30 +0.0 + 11 +117.5 + 21 +87.5 + 31 +0.0 + 0 +LINE + 5 +473 +100 +AcDbEntity +100 +AcDbLine + 8 +2 + 62 +256 +370 +-1 + 6 +ByLayer + 10 +117.5 + 20 +87.5 + 30 +0.0 + 11 +95.0 + 21 +85.0 + 31 +0.0 + 0 +LINE + 5 +474 +100 +AcDbEntity +100 +AcDbLine + 8 +2 + 62 +256 +370 +-1 + 6 +ByLayer + 10 +127.5000445955795527 + 20 +65.0000891911591054 + 30 +0.0 + 11 +117.5 + 21 +87.5 + 31 +0.0 + 0 +LINE + 5 +475 +100 +AcDbEntity +100 +AcDbLine + 8 +2 + 62 +256 +370 +-1 + 6 +ByLayer + 10 +115.0000891911591054 + 20 +40.0001783823182038 + 30 +0.0 + 11 +105.0000445955795527 + 21 +62.5000891911591054 + 31 +0.0 + 0 +LINE + 5 +476 +100 +AcDbEntity +100 +AcDbLine + 8 +2 + 62 +256 +370 +-1 + 6 +ByLayer + 10 +105.0000445955795527 + 20 +62.5000891911591054 + 30 +0.0 + 11 +95.0 + 21 +85.0 + 31 +0.0 + 0 +LINE + 5 +477 +100 +AcDbEntity +100 +AcDbLine + 8 +2 + 62 +256 +370 +-1 + 6 +ByLayer + 10 +127.5000445955795527 + 20 +65.0000891911591054 + 30 +0.0 + 11 +105.0000445955795527 + 21 +62.5000891911591054 + 31 +0.0 + 0 +LINE + 5 +478 +100 +AcDbEntity +100 +AcDbLine + 8 +2 + 62 +256 +370 +-1 + 6 +ByLayer + 10 +105.0000445955795527 + 20 +62.5000891911591054 + 30 +0.0 + 11 +117.5 + 21 +87.5 + 31 +0.0 + 0 +MTEXT + 5 +479 +100 +AcDbEntity +100 +AcDbMText + 8 +2-UGrid Triangle Idx + 62 +256 +370 +-1 + 6 +ByLayer + 10 +52.755019316493339 + 20 +-26.5040026106983753 + 30 +0.0 + 40 +3.0 + 41 +100.0 + 71 +5 + 72 +2 + 1 +D[0,0] + 7 +greeks + 50 +0.0 + 73 +0 + 44 +1.0 + 0 +MTEXT + 5 +47A +100 +AcDbEntity +100 +AcDbMText + 8 +2-UGrid Triangle Idx + 62 +256 +370 +-1 + 6 +ByLayer + 10 +160.8090817236268322 + 20 +67.624877032689966 + 30 +0.0 + 40 +3.0 + 41 +100.0 + 71 +5 + 72 +2 + 1 +D[20,16] + 7 +greeks + 50 +0.0 + 73 +0 + 44 +1.0 + 0 +MTEXT + 5 +47B +100 +AcDbEntity +100 +AcDbMText + 8 +2-UGrid Triangle Idx + 62 +256 +370 +-1 + 6 +ByLayer + 10 +182.2056606240723227 + 20 +18.1904782213968303 + 30 +0.0 + 40 +3.0 + 41 +100.0 + 71 +5 + 72 +2 + 1 +D[21,17] + 7 +greeks + 50 +0.0 + 73 +0 + 44 +1.0 + 0 +MTEXT + 5 +47C +100 +AcDbEntity +100 +AcDbMText + 8 +2-UGrid Triangle Idx + 62 +256 +370 +-1 + 6 +ByLayer + 10 +202.0490460624087348 + 20 +55.0386541500747342 + 30 +0.0 + 40 +3.0 + 41 +100.0 + 71 +5 + 72 +2 + 1 +D[22,18] + 7 +greeks + 50 +0.0 + 73 +0 + 44 +1.0 + 0 +MTEXT + 5 +47D +100 +AcDbEntity +100 +AcDbMText + 8 +2-UGrid Triangle Idx + 62 +256 +370 +-1 + 6 +ByLayer + 10 +177.8138722139687218 + 20 +45.6659349821697518 + 30 +0.0 + 40 +3.0 + 41 +100.0 + 71 +5 + 72 +2 + 1 +D[23,19] + 7 +greeks + 50 +0.0 + 73 +0 + 44 +1.0 + 0 +MTEXT + 5 +47E +100 +AcDbEntity +100 +AcDbMText + 8 +2-UGrid Triangle Idx + 62 +256 +370 +-1 + 6 +ByLayer + 10 +137.645075780090167 + 20 +55.306446126300564 + 30 +0.0 + 40 +3.0 + 41 +100.0 + 71 +5 + 72 +2 + 1 +D[25,21] + 7 +greeks + 50 +0.0 + 73 +0 + 44 +1.0 + 0 +MTEXT + 5 +47F +100 +AcDbEntity +100 +AcDbMText + 8 +2-UGrid Triangle Idx + 62 +256 +370 +-1 + 6 +ByLayer + 10 +158.2169390787526879 + 20 +4.3318250267459346 + 30 +0.0 + 40 +3.0 + 41 +100.0 + 71 +5 + 72 +2 + 1 +D[26,22] + 7 +greeks + 50 +0.0 + 73 +0 + 44 +1.0 + 0 +MTEXT + 5 +480 +100 +AcDbEntity +100 +AcDbMText + 8 +2-UGrid Triangle Idx + 62 +256 +370 +-1 + 6 +ByLayer + 10 +136.0717979197631564 + 20 +23.8408889197624134 + 30 +0.0 + 40 +3.0 + 41 +100.0 + 71 +5 + 72 +2 + 1 +D[27,23] + 7 +greeks + 50 +0.0 + 73 +0 + 44 +1.0 + 0 +MTEXT + 5 +481 +100 +AcDbEntity +100 +AcDbMText + 8 +2-UGrid Triangle Idx + 62 +256 +370 +-1 + 6 +ByLayer + 10 +95.4531946508173093 + 20 +-47.971295329866301 + 30 +0.0 + 40 +3.0 + 41 +100.0 + 71 +5 + 72 +2 + 1 +D[1,1] + 7 +greeks + 50 +0.0 + 73 +0 + 44 +1.0 + 0 +MTEXT + 5 +482 +100 +AcDbEntity +100 +AcDbMText + 8 +2-UGrid Triangle Idx + 62 +256 +370 +-1 + 6 +ByLayer + 10 +109.292600297177728 + 20 +106.186921609213357 + 30 +0.0 + 40 +3.0 + 41 +100.0 + 71 +5 + 72 +2 + 1 +D[8,2] + 7 +greeks + 50 +0.0 + 73 +0 + 44 +1.0 + 0 +MTEXT + 5 +483 +100 +AcDbEntity +100 +AcDbMText + 8 +2-UGrid Triangle Idx + 62 +256 +370 +-1 + 6 +ByLayer + 10 +47.0728083209512889 + 20 +22.1671890683508188 + 30 +0.0 + 40 +3.0 + 41 +100.0 + 71 +5 + 72 +2 + 1 +D[10,3] + 7 +greeks + 50 +0.0 + 73 +0 + 44 +1.0 + 0 +MTEXT + 5 +484 +100 +AcDbEntity +100 +AcDbMText + 8 +2-UGrid Triangle Idx + 62 +256 +370 +-1 + 6 +ByLayer + 10 +70.0 + 20 +68.4090909999999894 + 30 +0.0 + 40 +3.0 + 41 +100.0 + 71 +5 + 72 +2 + 1 +D[12,4] + 7 +greeks + 50 +0.0 + 73 +0 + 44 +1.0 + 0 +MTEXT + 5 +485 +100 +AcDbEntity +100 +AcDbMText + 8 +2-UGrid Triangle Idx + 62 +256 +370 +-1 + 6 +ByLayer + 10 +90.5471619613676211 + 20 +23.0040389940566072 + 30 +0.0 + 40 +3.0 + 41 +100.0 + 71 +5 + 72 +2 + 1 +D[13,5] + 7 +greeks + 50 +0.0 + 73 +0 + 44 +1.0 + 0 +MTEXT + 5 +486 +100 +AcDbEntity +100 +AcDbMText + 8 +2-UGrid Triangle Idx + 62 +256 +370 +-1 + 6 +ByLayer + 10 +93.4593997028238874 + 20 +54.1013822332842054 + 30 +0.0 + 40 +3.0 + 41 +100.0 + 71 +5 + 72 +2 + 1 +D[15,6] + 7 +greeks + 50 +0.0 + 73 +0 + 44 +1.0 + 0 +MTEXT + 5 +487 +100 +AcDbEntity +100 +AcDbMText + 8 +2-UGrid Triangle Idx + 62 +256 +370 +-1 + 6 +ByLayer + 10 +113.2224475482913562 + 20 +-19.0861648692422179 + 30 +0.0 + 40 +3.0 + 41 +100.0 + 71 +5 + 72 +2 + 1 +D[16,7] + 7 +greeks + 50 +0.0 + 73 +0 + 44 +1.0 + 0 +MTEXT + 5 +488 +100 +AcDbEntity +100 +AcDbMText + 8 +2-UGrid Triangle Idx + 62 +256 +370 +-1 + 6 +ByLayer + 10 +138.0 + 20 +-48.5909089999999964 + 30 +0.0 + 40 +3.0 + 41 +100.0 + 71 +5 + 72 +2 + 1 +D[17,8] + 7 +greeks + 50 +0.0 + 73 +0 + 44 +1.0 + 0 +MTEXT + 5 +489 +100 +AcDbEntity +100 +AcDbMText + 8 +2-UGrid Triangle Idx + 62 +256 +370 +-1 + 6 +ByLayer + 10 +136.6810246656762331 + 20 +-30.2263110802377781 + 30 +0.0 + 40 +3.0 + 41 +100.0 + 71 +5 + 72 +2 + 1 +D[19,9] + 7 +greeks + 50 +0.0 + 73 +0 + 44 +1.0 + 0 +MTEXT + 5 +48A +100 +AcDbEntity +100 +AcDbMText + 8 +2-UGrid Triangle Idx + 62 +256 +370 +-1 + 6 +ByLayer + 10 +106.5573770491830032 + 20 +82.3763041147561523 + 30 +0.0 + 40 +3.0 + 41 +100.0 + 71 +5 + 72 +2 + 1 +D[28,10] + 7 +greeks + 50 +0.0 + 73 +0 + 44 +1.0 + 0 +MTEXT + 5 +48B +100 +AcDbEntity +100 +AcDbMText + 8 +2-UGrid Triangle Idx + 62 +256 +370 +-1 + 6 +ByLayer + 10 +115.7786885245930648 + 20 +58.8107303442637601 + 30 +0.0 + 40 +3.0 + 41 +100.0 + 71 +5 + 72 +2 + 1 +D[29,11] + 7 +greeks + 50 +0.0 + 73 +0 + 44 +1.0 + 0 +MTEXT + 5 +48C +100 +AcDbEntity +100 +AcDbMText + 8 +2-UGrid Triangle Idx + 62 +256 +370 +-1 + 6 +ByLayer + 10 +128.0737704918064992 + 20 +84.9377795245922869 + 30 +0.0 + 40 +3.0 + 41 +100.0 + 71 +5 + 72 +2 + 1 +D[30,12] + 7 +greeks + 50 +0.0 + 73 +0 + 44 +1.0 + 0 +MTEXT + 5 +48D +100 +AcDbEntity +100 +AcDbMText + 8 +2-UGrid Triangle Idx + 62 +256 +370 +-1 + 6 +ByLayer + 10 +117.315573770494737 + 20 +69.056631983608284 + 30 +0.0 + 40 +3.0 + 41 +100.0 + 71 +5 + 72 +2 + 1 +D[31,13] + 7 +greeks + 50 +0.0 + 73 +0 + 44 +1.0 + 0 +MTEXT + 5 +48E +100 +AcDbEntity +100 +AcDbMText + 8 +2-UGrid Triangle Idx + 62 +256 +370 +-1 + 6 +ByLayer + 10 +100.409836065576286 + 20 +-5.226154901639485 + 30 +0.0 + 40 +3.0 + 41 +100.0 + 71 +5 + 72 +2 + 1 +D[32,14] + 7 +greeks + 50 +0.0 + 73 +0 + 44 +1.0 + 0 +MTEXT + 5 +48F +100 +AcDbEntity +100 +AcDbMText + 8 +2-UGrid Triangle Idx + 62 +256 +370 +-1 + 6 +ByLayer + 10 +114.4194098360685246 + 20 +19.6132877213119698 + 30 +0.0 + 40 +3.0 + 41 +100.0 + 71 +5 + 72 +2 + 1 +D[33,15] + 7 +greeks + 50 +0.0 + 73 +0 + 44 +1.0 + 0 +MTEXT + 5 +490 +100 +AcDbEntity +100 +AcDbMText + 8 +2-UGrid Triangle Idx + 62 +256 +370 +-1 + 6 +ByLayer + 10 +123.6857704918064655 + 20 +-5.6341876885247455 + 30 +0.0 + 40 +3.0 + 41 +100.0 + 71 +5 + 72 +2 + 1 +D[34,16] + 7 +greeks + 50 +0.0 + 73 +0 + 44 +1.0 + 0 +MTEXT + 5 +491 +100 +AcDbEntity +100 +AcDbMText + 8 +2-UGrid Triangle Idx + 62 +256 +370 +-1 + 6 +ByLayer + 10 +113.4793442622979995 + 20 +12.3613532950822744 + 30 +0.0 + 40 +3.0 + 41 +100.0 + 71 +5 + 72 +2 + 1 +D[35,17] + 7 +greeks + 50 +0.0 + 73 +0 + 44 +1.0 + 0 +MTEXT + 5 +492 +100 +AcDbEntity +100 +AcDbMText + 8 +2-UGrid Triangle Idx + 62 +256 +370 +-1 + 6 +ByLayer + 10 +186.3298662704316371 + 20 +-45.356139312035836 + 30 +0.0 + 40 +3.0 + 41 +100.0 + 71 +5 + 72 +2 + 1 +D[3,18] + 7 +greeks + 50 +0.0 + 73 +0 + 44 +1.0 + 0 +MTEXT + 5 +493 +100 +AcDbEntity +100 +AcDbMText + 8 +2-UGrid Triangle Idx + 62 +256 +370 +-1 + 6 +ByLayer + 10 +209.6811173848448959 + 20 +-3.8755806196136904 + 30 +0.0 + 40 +3.0 + 41 +100.0 + 71 +5 + 72 +2 + 1 +D[4,19] + 7 +greeks + 50 +0.0 + 73 +0 + 44 +1.0 + 0 +MTEXT + 5 +494 +100 +AcDbEntity +100 +AcDbMText + 8 +2-UGrid Triangle Idx + 62 +256 +370 +-1 + 6 +ByLayer + 10 +188.0 + 20 +90.4090909999999894 + 30 +0.0 + 40 +3.0 + 41 +100.0 + 71 +5 + 72 +2 + 1 +D[6,20] + 7 +greeks + 50 +0.0 + 73 +0 + 44 +1.0 + 0 +MTEXT + 5 +495 +100 +AcDbEntity +100 +AcDbMText + 8 +2-UGrid Triangle Idx + 62 +256 +370 +-1 + 6 +ByLayer + 10 +154.9479940564648643 + 20 +117.7642173001495252 + 30 +0.0 + 40 +3.0 + 41 +100.0 + 71 +5 + 72 +2 + 1 +D[7,21] + 7 +greeks + 50 +0.0 + 73 +0 + 44 +1.0 + 0 +MTEXT + 5 +496 +100 +AcDbEntity +100 +AcDbMText + 8 +2-UGrid Triangle Idx + 62 +256 +370 +-1 + 6 +ByLayer + 10 +158.3186163447253989 + 20 +-19.7288656121842862 + 30 +0.0 + 40 +3.0 + 41 +100.0 + 71 +5 + 72 +2 + 1 +D[18,22] + 7 +greeks + 50 +0.0 + 73 +0 + 44 +1.0 + 0 +LINE + 5 +497 +100 +AcDbEntity +100 +AcDbLine + 8 +0-UGrid Mark DownAdj Edges + 62 +256 +370 +-1 + 6 +ByLayer + 10 +140.0 + 20 +90.0 + 30 +0.0 + 11 +220.0 + 21 +60.0 + 31 +0.0 + 0 +LINE + 5 +498 +100 +AcDbEntity +100 +AcDbLine + 8 +0-UGrid + 62 +256 +370 +-1 + 6 +ByLayer + 10 +50.0 + 20 +80.0 + 30 +0.0 + 11 +140.0 + 21 +90.0 + 31 +0.0 + 0 +LINE + 5 +499 +100 +AcDbEntity +100 +AcDbLine + 8 +0-UGrid + 62 +256 +370 +-1 + 6 +ByLayer + 10 +130.0 + 20 +150.0 + 30 +0.0 + 11 +140.0 + 21 +90.0 + 31 +0.0 + 0 +LINE + 5 +49A +100 +AcDbEntity +100 +AcDbLine + 8 +0-UGrid + 62 +256 +370 +-1 + 6 +ByLayer + 10 +140.0 + 20 +90.0 + 30 +0.0 + 11 +200.0 + 21 +120.0 + 31 +0.0 + 0 +LINE + 5 +49B +100 +AcDbEntity +100 +AcDbLine + 8 +1-UGrid DG Part2 H5Fed OverlapEdges + 62 +256 +370 +-1 + 6 +ByLayer + 10 +95.2752319396871599 + 20 +85.0305813266319035 + 30 +0.0 + 11 +140.0 + 21 +90.0 + 31 +0.0 + 0 +LINE + 5 +49C +100 +AcDbEntity +100 +AcDbLine + 8 +1-UGrid DG Part2 H5Fed OverlapEdges + 62 +256 +370 +-1 + 6 +ByLayer + 10 +67.25 + 20 +-70.0 + 30 +0.0 + 11 +140.0 + 21 +-70.0 + 31 +0.0 + 0 +LINE + 5 +49D +100 +AcDbEntity +100 +AcDbLine + 8 +1-UGrid DG Part2 H5Fed OverlapEdges + 62 +256 +370 +-1 + 6 +ByLayer + 10 +130.0 + 20 +150.0 + 30 +0.0 + 11 +50.0 + 21 +80.0 + 31 +0.0 + 0 +LINE + 5 +49E +100 +AcDbEntity +100 +AcDbLine + 8 +1-UGrid DG Part2 H5Fed OverlapEdges + 62 +256 +370 +-1 + 6 +ByLayer + 10 +114.9999989626024757 + 20 +-39.9999987551229736 + 30 +0.0 + 11 +159.9997155749006197 + 21 +-40.0004266376490492 + 31 +0.0 + 0 +LINE + 5 +49F +100 +AcDbEntity +100 +AcDbLine + 8 +1-UGrid DG Part2 H5Fed BorderEdges + 62 +256 +370 +-1 + 6 +ByLayer + 10 +130.0 + 20 +150.0 + 30 +0.0 + 11 +140.0 + 21 +90.0 + 31 +0.0 + 0 +LINE + 5 +4A0 +100 +AcDbEntity +100 +AcDbLine + 8 +1-UGrid DG Part2 H5Fed BorderEdges + 62 +256 +370 +-1 + 6 +ByLayer + 10 +140.0 + 20 +90.0 + 30 +0.0 + 11 +115.0000891911591054 + 21 +40.0001783823182038 + 31 +0.0 + 0 +LINE + 5 +4A1 +100 +AcDbEntity +100 +AcDbLine + 8 +1-UGrid DG Part2 H5Fed BorderEdges + 62 +256 +370 +-1 + 6 +ByLayer + 10 +134.9999999999999716 + 20 +-10.0000000000000249 + 30 +0.0 + 11 +159.9997155749006197 + 21 +-40.0004266376490492 + 31 +0.0 + 0 +LINE + 5 +4A2 +100 +AcDbEntity +100 +AcDbLine + 8 +1-UGrid DG Part2 H5Fed BorderEdges + 62 +256 +370 +-1 + 6 +ByLayer + 10 +159.9997155749006197 + 20 +-40.0004266376490492 + 30 +0.0 + 11 +140.0 + 21 +-70.0 + 31 +0.0 + 0 +LINE + 5 +4A3 +100 +AcDbEntity +100 +AcDbLine + 8 +1-UGrid DG Part2 H5Fed BorderEdges + 62 +256 +370 +-1 + 6 +ByLayer + 10 +115.0000891911591054 + 20 +40.0001783823182038 + 30 +0.0 + 11 +134.9999999999999716 + 21 +-10.0000000000000249 + 31 +0.0 + 0 +LINE + 5 +4A4 +100 +AcDbEntity +100 +AcDbLine + 8 +1-UGrid DG Part2 H5Fed GhostEdges + 62 +256 +370 +-1 + 6 +ByLayer + 10 +50.0 + 20 +80.0 + 30 +0.0 + 11 +70.0 + 21 +35.0 + 31 +0.0 + 0 +HATCH + 5 +4A5 + 8 +1-UGrid DG Part2 H5Fed OverlapVertices + 62 +256 +370 +-1 + 6 +ByLayer +100 +AcDbEntity +100 +AcDbHatch + 10 +0.0 + 20 +0.0 + 30 +0.0 +210 +0.0 +220 +0.0 +230 +1.0 + 2 +SOLID + 70 +1 + 71 +0 + 91 +1 + 92 +1 + 93 +1 + 72 +2 + 10 +114.9999989626024757 + 20 +-39.9999987551229665 + 40 +7.25 + 50 +0.0 + 51 +360.0 + 73 +1 + 97 +0 + 75 +0 + 76 +1 + 98 +0 + 0 +LINE + 5 +4A6 +100 +AcDbEntity +100 +AcDbLine + 8 +1-UGrid DG Part2 H5Fed InteriorEdges + 62 +256 +370 +-1 + 6 +ByLayer + 10 +130.0 + 20 +150.0 + 30 +0.0 + 11 +200.0 + 21 +120.0 + 31 +0.0 + 0 +LINE + 5 +4A7 +100 +AcDbEntity +100 +AcDbLine + 8 +1-UGrid DG Part2 H5Fed InteriorEdges + 62 +256 +370 +-1 + 6 +ByLayer + 10 +200.0 + 20 +120.0 + 30 +0.0 + 11 +220.0 + 21 +60.0 + 31 +0.0 + 0 +LINE + 5 +4A8 +100 +AcDbEntity +100 +AcDbLine + 8 +1-UGrid DG Part2 H5Fed InteriorEdges + 62 +256 +370 +-1 + 6 +ByLayer + 10 +220.0 + 20 +60.0 + 30 +0.0 + 11 +240.0 + 21 +-60.0 + 31 +0.0 + 0 +LINE + 5 +4A9 +100 +AcDbEntity +100 +AcDbLine + 8 +1-UGrid DG Part2 H5Fed InteriorEdges + 62 +256 +370 +-1 + 6 +ByLayer + 10 +240.0 + 20 +-60.0 + 30 +0.0 + 11 +140.0 + 21 +-70.0 + 31 +0.0 + 0 +LINE + 5 +4AA +100 +AcDbEntity +100 +AcDbLine + 8 +1-UGrid DG Part2 H5Fed InteriorEdges + 62 +256 +370 +-1 + 6 +ByLayer + 10 +240.0 + 20 +-60.0 + 30 +0.0 + 11 +180.0 + 21 +-10.0 + 31 +0.0 + 0 +LINE + 5 +4AB +100 +AcDbEntity +100 +AcDbLine + 8 +1-UGrid DG Part2 H5Fed InteriorEdges + 62 +256 +370 +-1 + 6 +ByLayer + 10 +180.0 + 20 +-10.0 + 30 +0.0 + 11 +159.9997155749006197 + 21 +-40.0004266376490278 + 31 +0.0 + 0 +LINE + 5 +4AC +100 +AcDbEntity +100 +AcDbLine + 8 +1-UGrid DG Part2 H5Fed InteriorEdges + 62 +256 +370 +-1 + 6 +ByLayer + 10 +135.0 + 20 +-10.0 + 30 +0.0 + 11 +180.0 + 21 +-10.0 + 31 +0.0 + 0 +LINE + 5 +4AD +100 +AcDbEntity +100 +AcDbLine + 8 +1-UGrid DG Part2 H5Fed InteriorEdges + 62 +256 +370 +-1 + 6 +ByLayer + 10 +180.0 + 20 +-10.0 + 30 +0.0 + 11 +200.0 + 21 +25.0 + 31 +0.0 + 0 +LINE + 5 +4AE +100 +AcDbEntity +100 +AcDbLine + 8 +1-UGrid DG Part2 H5Fed InteriorEdges + 62 +256 +370 +-1 + 6 +ByLayer + 10 +200.0 + 20 +25.0 + 30 +0.0 + 11 +220.0 + 21 +60.0 + 31 +0.0 + 0 +LINE + 5 +4AF +100 +AcDbEntity +100 +AcDbLine + 8 +1-UGrid DG Part2 H5Fed InteriorEdges + 62 +256 +370 +-1 + 6 +ByLayer + 10 +220.0 + 20 +60.0 + 30 +0.0 + 11 +140.0 + 21 +90.0 + 31 +0.0 + 0 +LINE + 5 +4B0 +100 +AcDbEntity +100 +AcDbLine + 8 +1-UGrid DG Part2 H5Fed InteriorEdges + 62 +256 +370 +-1 + 6 +ByLayer + 10 +140.0 + 20 +90.0 + 30 +0.0 + 11 +159.9999450076830101 + 21 +40.0001374807924535 + 31 +0.0 + 0 +LINE + 5 +4B1 +100 +AcDbEntity +100 +AcDbLine + 8 +1-UGrid DG Part2 H5Fed InteriorEdges + 62 +256 +370 +-1 + 6 +ByLayer + 10 +159.9999450076830101 + 20 +40.0001374807924535 + 30 +0.0 + 11 +180.0000175342504178 + 21 +74.9999934246560969 + 31 +0.0 + 0 +LINE + 5 +4B2 +100 +AcDbEntity +100 +AcDbLine + 8 +1-UGrid DG Part2 H5Fed InteriorEdges + 62 +256 +370 +-1 + 6 +ByLayer + 10 +180.0000175342504178 + 20 +74.9999934246560969 + 30 +0.0 + 11 +200.0 + 21 +25.0 + 31 +0.0 + 0 +LINE + 5 +4B3 +100 +AcDbEntity +100 +AcDbLine + 8 +1-UGrid DG Part2 H5Fed InteriorEdges + 62 +256 +370 +-1 + 6 +ByLayer + 10 +200.0 + 20 +25.0 + 30 +0.0 + 11 +159.9999450076830101 + 21 +40.0001374807924535 + 31 +0.0 + 0 +LINE + 5 +4B4 +100 +AcDbEntity +100 +AcDbLine + 8 +1-UGrid DG Part2 H5Fed InteriorEdges + 62 +256 +370 +-1 + 6 +ByLayer + 10 +159.9999450076830101 + 20 +40.0001374807924535 + 30 +0.0 + 11 +115.0000891911591054 + 21 +40.0001783823182038 + 31 +0.0 + 0 +LINE + 5 +4B5 +100 +AcDbEntity +100 +AcDbLine + 8 +1-UGrid DG Part2 H5Fed InteriorEdges + 62 +256 +370 +-1 + 6 +ByLayer + 10 +140.0 + 20 +90.0 + 30 +0.0 + 11 +200.0 + 21 +120.0 + 31 +0.0 + 0 +LINE + 5 +4B6 +100 +AcDbEntity +100 +AcDbLine + 8 +1-UGrid DG Part2 H5Fed InteriorEdges + 62 +256 +370 +-1 + 6 +ByLayer + 10 +135.0 + 20 +-10.0 + 30 +0.0 + 11 +159.9999450076830101 + 21 +40.0001374807924535 + 31 +0.0 + 0 +LINE + 5 +4B7 +100 +AcDbEntity +100 +AcDbLine + 8 +1-UGrid DG Part2 H5Fed InteriorEdges + 62 +256 +370 +-1 + 6 +ByLayer + 10 +159.9999450076830101 + 20 +40.0001374807924535 + 30 +0.0 + 11 +180.0 + 21 +-10.0 + 31 +0.0 + 0 +HATCH + 5 +4B8 + 8 +1-UGrid DG Part2 H5Fed InteriorVertices + 62 +256 +370 +-1 + 6 +ByLayer +100 +AcDbEntity +100 +AcDbHatch + 10 +0.0 + 20 +0.0 + 30 +0.0 +210 +0.0 +220 +0.0 +230 +1.0 + 2 +SOLID + 70 +1 + 71 +0 + 91 +1 + 92 +1 + 93 +7 + 72 +2 + 10 +200.0 + 20 +25.0 + 40 +7.25 + 50 +0.0 + 51 +360.0 + 73 +1 + 72 +2 + 10 +180.0 + 20 +-10.0 + 40 +7.25 + 50 +0.0 + 51 +360.0 + 73 +1 + 72 +2 + 10 +240.0 + 20 +-60.0 + 40 +7.25 + 50 +0.0 + 51 +360.0 + 73 +1 + 72 +2 + 10 +159.9999450076830385 + 20 +40.0001374807924819 + 40 +7.25 + 50 +0.0 + 51 +360.0 + 73 +1 + 72 +2 + 10 +200.0 + 20 +120.0 + 40 +7.25 + 50 +0.0 + 51 +360.0 + 73 +1 + 72 +2 + 10 +180.0000175342504178 + 20 +74.9999934246560969 + 40 +7.25 + 50 +0.0 + 51 +360.0 + 73 +1 + 72 +2 + 10 +220.0 + 20 +60.0 + 40 +7.25 + 50 +0.0 + 51 +360.0 + 73 +1 + 97 +0 + 75 +0 + 76 +1 + 98 +0 + 0 +HATCH + 5 +4B9 + 8 +1-UGrid DG Part2 H5Fed FrontVertices + 62 +256 +370 +-1 + 6 +ByLayer +100 +AcDbEntity +100 +AcDbHatch + 10 +0.0 + 20 +0.0 + 30 +0.0 +210 +0.0 +220 +0.0 +230 +1.0 + 2 +SOLID + 70 +1 + 71 +0 + 91 +1 + 92 +1 + 93 +5 + 72 +2 + 10 +70.0 + 20 +35.0 + 40 +7.25 + 50 +0.0 + 51 +360.0 + 73 +1 + 72 +2 + 10 +95.0 + 20 +85.0 + 40 +7.25 + 50 +0.0 + 51 +360.0 + 73 +1 + 72 +2 + 10 +90.0 + 20 +-10.0 + 40 +7.25 + 50 +0.0 + 51 +360.0 + 73 +1 + 72 +2 + 10 +50.0 + 20 +80.0 + 40 +7.25 + 50 +0.0 + 51 +360.0 + 73 +1 + 72 +2 + 10 +60.0 + 20 +-70.0 + 40 +7.25 + 50 +0.0 + 51 +360.0 + 73 +1 + 97 +0 + 75 +0 + 76 +1 + 98 +0 + 0 +HATCH + 5 +4BA + 8 +1-UGrid DG Part2 H5Fed BorderVertices + 62 +256 +370 +-1 + 6 +ByLayer +100 +AcDbEntity +100 +AcDbHatch + 10 +0.0 + 20 +0.0 + 30 +0.0 +210 +0.0 +220 +0.0 +230 +1.0 + 2 +SOLID + 70 +1 + 71 +0 + 91 +1 + 92 +1 + 93 +1 + 72 +2 + 10 +130.0 + 20 +150.0 + 40 +7.25 + 50 +0.0 + 51 +360.0 + 73 +1 + 97 +0 + 75 +0 + 76 +1 + 98 +0 + 0 +HATCH + 5 +4BB + 8 +1-UGrid DG Part2 H5Fed BorderVertices + 62 +256 +370 +-1 + 6 +ByLayer +100 +AcDbEntity +100 +AcDbHatch + 10 +0.0 + 20 +0.0 + 30 +0.0 +210 +0.0 +220 +0.0 +230 +1.0 + 2 +SOLID + 70 +1 + 71 +0 + 91 +1 + 92 +1 + 93 +5 + 72 +2 + 10 +140.0 + 20 +90.0 + 40 +7.25 + 50 +0.0 + 51 +360.0 + 73 +1 + 72 +2 + 10 +115.0000891911591054 + 20 +40.0001783823182038 + 40 +7.25 + 50 +0.0 + 51 +360.0 + 73 +1 + 72 +2 + 10 +135.0 + 20 +-10.0 + 40 +7.25 + 50 +0.0 + 51 +360.0 + 73 +1 + 72 +2 + 10 +159.9997155749006197 + 20 +-40.0004266376490492 + 40 +7.25 + 50 +0.0 + 51 +360.0 + 73 +1 + 72 +2 + 10 +140.0 + 20 +-70.0 + 40 +7.25 + 50 +0.0 + 51 +360.0 + 73 +1 + 97 +0 + 75 +0 + 76 +1 + 98 +0 + 0 +MTEXT + 5 +4BC +100 +AcDbEntity +100 +AcDbMText + 8 +0-UGrid Triangle Idx + 62 +256 +370 +15 + 6 +ByLayer + 10 +155.8306555706566314 + 20 +119.2212725696178381 + 30 +0.0 + 40 +5.0 + 41 +100.0 + 71 +5 + 72 +2 + 1 +7 + 7 +greeks + 50 +0.0 + 73 +0 + 44 +1.0 + 0 +MTEXT + 5 +4BD +100 +AcDbEntity +100 +AcDbMText + 8 +0-UGrid Triangle Idx + 62 +256 +370 +15 + 6 +ByLayer + 10 +188.4615513392906792 + 20 +91.5756525434139803 + 30 +0.0 + 40 +5.0 + 41 +100.0 + 71 +5 + 72 +2 + 1 +6 + 7 +greeks + 50 +0.0 + 73 +0 + 44 +1.0 + 0 +MTEXT + 5 +4BE +100 +AcDbEntity +100 +AcDbMText + 8 +0-UGrid Triangle Idx + 62 +256 +370 +15 + 6 +ByLayer + 10 +110.056760117433825 + 20 +107.4378935420555763 + 30 +0.0 + 40 +5.0 + 41 +100.0 + 71 +5 + 72 +2 + 1 +8 + 7 +greeks + 50 +0.0 + 73 +0 + 44 +1.0 + 0 +MTEXT + 5 +4BF +100 +AcDbEntity +100 +AcDbMText + 8 +0-UGrid Triangle Idx + 62 +256 +370 +15 + 6 +ByLayer + 10 +94.1945191187922575 + 20 +56.3523231977330994 + 30 +0.0 + 40 +5.0 + 41 +100.0 + 71 +5 + 72 +2 + 1 +9 + 7 +greeks + 50 +0.0 + 73 +0 + 44 +1.0 + 0 +MTEXT + 5 +4C0 +100 +AcDbEntity +100 +AcDbMText + 8 +0-UGrid Triangle Idx + 62 +256 +370 +15 + 6 +ByLayer + 10 +179.3974136257813257 + 20 +48.9742052899195457 + 30 +0.0 + 40 +5.0 + 41 +100.0 + 71 +5 + 72 +2 + 1 +5 + 7 +greeks + 50 +0.0 + 73 +0 + 44 +1.0 + 0 +MTEXT + 5 +4C1 +100 +AcDbEntity +100 +AcDbMText + 8 +0-UGrid Triangle Idx + 62 +256 +370 +15 + 6 +ByLayer + 10 +136.3427594866114418 + 20 +24.047826577768511 + 30 +0.0 + 40 +5.0 + 41 +100.0 + 71 +5 + 72 +2 + 1 +11 + 7 +greeks + 50 +0.0 + 73 +0 + 44 +1.0 + 0 +MTEXT + 5 +4C2 +100 +AcDbEntity +100 +AcDbMText + 8 +0-UGrid Triangle Idx + 62 +256 +370 +15 + 6 +ByLayer + 10 +209.7622749660378929 + 20 +-1.784965905733471 + 30 +0.0 + 40 +5.0 + 41 +100.0 + 71 +5 + 72 +2 + 1 +4 + 7 +greeks + 50 +0.0 + 73 +0 + 44 +1.0 + 0 +MTEXT + 5 +4C3 +100 +AcDbEntity +100 +AcDbMText + 8 +0-UGrid Triangle Idx + 62 +256 +370 +15 + 6 +ByLayer + 10 +46.6077961228675974 + 20 +23.1414128064175415 + 30 +0.0 + 40 +5.0 + 41 +100.0 + 71 +5 + 72 +2 + 1 +10 + 7 +greeks + 50 +0.0 + 73 +0 + 44 +1.0 + 0 +MTEXT + 5 +4C4 +100 +AcDbEntity +100 +AcDbMText + 8 +0-UGrid Triangle Idx + 62 +256 +370 +15 + 6 +ByLayer + 10 +185.2891031395623713 + 20 +-43.0267925022015305 + 30 +0.0 + 40 +5.0 + 41 +100.0 + 71 +5 + 72 +2 + 1 +3 + 7 +greeks + 50 +0.0 + 73 +0 + 44 +1.0 + 0 +MTEXT + 5 +4C5 +100 +AcDbEntity +100 +AcDbMText + 8 +0-UGrid Triangle Idx + 62 +256 +370 +15 + 6 +ByLayer + 10 +136.3427594866113282 + 20 +-28.52417216058641 + 30 +0.0 + 40 +5.0 + 41 +100.0 + 71 +5 + 72 +2 + 1 +2 + 7 +greeks + 50 +0.0 + 73 +0 + 44 +1.0 + 0 +MTEXT + 5 +4C6 +100 +AcDbEntity +100 +AcDbMText + 8 +0-UGrid Triangle Idx + 62 +256 +370 +15 + 6 +ByLayer + 10 +52.4994856366487497 + 20 +-27.617758389235437 + 30 +0.0 + 40 +5.0 + 41 +100.0 + 71 +5 + 72 +2 + 1 +0 + 7 +greeks + 50 +0.0 + 73 +0 + 44 +1.0 + 0 +MTEXT + 5 +4C7 +100 +AcDbEntity +100 +AcDbMText + 8 +0-UGrid Triangle Idx + 62 +256 +370 +15 + 6 +ByLayer + 10 +95.5541397758186974 + 20 +-47.1056544732807936 + 30 +0.0 + 40 +5.0 + 41 +100.0 + 71 +5 + 72 +2 + 1 +1 + 7 +greeks + 50 +0.0 + 73 +0 + 44 +1.0 + 0 +MTEXT + 5 +4C8 +100 +AcDbEntity +100 +AcDbMText + 8 +1-UGrid Vertex Idx + 62 +256 +370 +-1 + 6 +ByLayer + 10 +-4.3945312500000435 + 20 +4.3945312500000435 + 30 +0.0 + 40 +5.0 + 41 +100.0 + 71 +1 + 72 +2 + 1 +0 + 7 +normal + 50 +0.0 + 73 +0 + 44 +1.0 + 0 +MTEXT + 5 +4C9 +100 +AcDbEntity +100 +AcDbMText + 8 +1-UGrid Vertex Idx + 62 +256 +370 +-1 + 6 +ByLayer + 10 +54.6875000000005471 + 20 +-72.7539062500007248 + 30 +0.0 + 40 +5.0 + 41 +100.0 + 71 +1 + 72 +2 + 1 +1 + 7 +normal + 50 +0.0 + 73 +0 + 44 +1.0 + 0 +MTEXT + 5 +4CA +100 +AcDbEntity +100 +AcDbMText + 8 +1-UGrid Vertex Idx + 62 +256 +370 +-1 + 6 +ByLayer + 10 +141.1132812500013927 + 20 +-74.218750000000739 + 30 +0.0 + 40 +5.0 + 41 +100.0 + 71 +1 + 72 +2 + 1 +3 + 7 +normal + 50 +0.0 + 73 +0 + 44 +1.0 + 0 +MTEXT + 5 +4CB +100 +AcDbEntity +100 +AcDbMText + 8 +1-UGrid Vertex Idx + 62 +256 +370 +-1 + 6 +ByLayer + 10 +243.1640625000024158 + 20 +-61.5234375000006111 + 30 +0.0 + 40 +5.0 + 41 +100.0 + 71 +1 + 72 +2 + 1 +5 + 7 +normal + 50 +0.0 + 73 +0 + 44 +1.0 + 0 +MTEXT + 5 +4CC +100 +AcDbEntity +100 +AcDbMText + 8 +1-UGrid Vertex Idx + 62 +256 +370 +-1 + 6 +ByLayer + 10 +134.7656250000013358 + 20 +155.2734375000015348 + 30 +0.0 + 40 +5.0 + 41 +100.0 + 71 +1 + 72 +2 + 1 +9 + 7 +normal + 50 +0.0 + 73 +0 + 44 +1.0 + 0 +MTEXT + 5 +4CD +100 +AcDbEntity +100 +AcDbMText + 8 +1-UGrid Vertex Idx + 62 +256 +370 +-1 + 6 +ByLayer + 10 +62.5000000000008455 + 20 +36.7187500000004974 + 30 +0.0 + 40 +5.0 + 41 +100.0 + 71 +1 + 72 +2 + 1 +13 + 7 +normal + 50 +0.0 + 73 +0 + 44 +1.0 + 0 +MTEXT + 5 +4CE +100 +AcDbEntity +100 +AcDbMText + 8 +1-UGrid Vertex Idx + 62 +256 +370 +-1 + 6 +ByLayer + 10 +204.2968750000027569 + 20 +24.609375000000334 + 30 +0.0 + 40 +5.0 + 41 +100.0 + 71 +1 + 72 +2 + 1 +17 + 7 +normal + 50 +0.0 + 73 +0 + 44 +1.0 + 0 +MTEXT + 5 +4CF +100 +AcDbEntity +100 +AcDbMText + 8 +1-UGrid Vertex Idx + 62 +256 +370 +-1 + 6 +ByLayer + 10 +92.0 + 20 +77.0 + 30 +0.0 + 40 +5.0 + 41 +100.0 + 71 +1 + 72 +2 + 1 +12 + 7 +normal + 50 +0.0 + 73 +0 + 44 +1.0 + 0 +MTEXT + 5 +4D0 +100 +AcDbEntity +100 +AcDbMText + 8 +1-UGrid Vertex Idx + 62 +256 +370 +-1 + 6 +ByLayer + 10 +133.0 + 20 +-16.0 + 30 +0.0 + 40 +5.0 + 41 +100.0 + 71 +1 + 72 +2 + 1 +15 + 7 +normal + 50 +0.0 + 73 +0 + 44 +1.0 + 0 +MTEXT + 5 +4D1 +100 +AcDbEntity +100 +AcDbMText + 8 +1-UGrid Vertex Idx + 62 +256 +370 +-1 + 6 +ByLayer + 10 +105.73567994187664 + 20 +37.7278502906245166 + 30 +0.0 + 40 +5.0 + 41 +100.0 + 71 +1 + 72 +2 + 1 +11 + 7 +normal + 50 +0.0 + 73 +0 + 44 +1.0 + 0 +MTEXT + 5 +4D2 +100 +AcDbEntity +100 +AcDbMText + 8 +1-UGrid Vertex Idx + 62 +256 +370 +-1 + 6 +ByLayer + 10 +45.3924356096011437 + 20 +86.2214684672021718 + 30 +0.0 + 40 +5.0 + 41 +100.0 + 71 +1 + 72 +2 + 1 +10 + 7 +normal + 50 +0.0 + 73 +0 + 44 +1.0 + 0 +MTEXT + 5 +4D3 +100 +AcDbEntity +100 +AcDbMText + 8 +1-UGrid Vertex Idx + 62 +256 +370 +-1 + 6 +ByLayer + 10 +165.1414925312053299 + 20 +44.6676598784014445 + 30 +0.0 + 40 +5.0 + 41 +100.0 + 71 +1 + 72 +2 + 1 +19 + 7 +normal + 50 +0.0 + 73 +0 + 44 +1.0 + 0 +MTEXT + 5 +4D4 +100 +AcDbEntity +100 +AcDbMText + 8 +1-UGrid Vertex Idx + 62 +256 +370 +-1 + 6 +ByLayer + 10 +162.4571379712058956 + 20 +-39.2184201216014188 + 30 +0.0 + 40 +5.0 + 41 +100.0 + 71 +1 + 72 +2 + 1 +14 + 7 +normal + 50 +0.0 + 73 +0 + 44 +1.0 + 0 +MTEXT + 5 +4D5 +100 +AcDbEntity +100 +AcDbMText + 8 +1-UGrid Vertex Idx + 62 +256 +370 +-1 + 6 +ByLayer + 10 +108.517764522053838 + 20 +-39.1882183094548893 + 30 +0.0 + 40 +5.0 + 41 +100.0 + 71 +1 + 72 +2 + 1 +16 + 7 +normal + 50 +0.0 + 73 +0 + 44 +1.0 + 0 +MTEXT + 5 +4D6 +100 +AcDbEntity +100 +AcDbMText + 8 +1-UGrid Vertex Idx + 62 +256 +370 +-1 + 6 +ByLayer + 10 +82.4432394240034654 + 20 +-11.274289152000474 + 30 +0.0 + 40 +5.0 + 41 +100.0 + 71 +1 + 72 +2 + 1 +2 + 7 +normal + 50 +0.0 + 73 +0 + 44 +1.0 + 0 +MTEXT + 5 +4D7 +100 +AcDbEntity +100 +AcDbMText + 8 +1-UGrid Vertex Idx + 62 +256 +370 +-1 + 6 +ByLayer + 10 +184.6835937280083613 + 20 +-6.7108864000003035 + 30 +0.0 + 40 +5.0 + 41 +100.0 + 71 +1 + 72 +2 + 1 +4 + 7 +normal + 50 +0.0 + 73 +0 + 44 +1.0 + 0 +MTEXT + 5 +4D8 +100 +AcDbEntity +100 +AcDbMText + 8 +1-UGrid GlobalIdx Triangles + 62 +256 +370 +-1 + 6 +ByLayer + 10 +184.6835937280083613 + 20 +-6.7108864000003035 + 30 +0.0 + 40 +5.0 + 41 +100.0 + 71 +1 + 72 +2 + 1 +4 + 7 +normal + 50 +0.0 + 73 +0 + 44 +1.0 + 0 +MTEXT + 5 +4D9 +100 +AcDbEntity +100 +AcDbMText + 8 +1-UGrid GlobalIdx Triangles + 62 +256 +370 +-1 + 6 +ByLayer + 10 +52.755019316493339 + 20 +-26.5040026106983753 + 30 +0.0 + 40 +5.0 + 41 +100.0 + 71 +5 + 72 +2 + 1 +0 + 7 +greeks + 50 +0.0 + 73 +0 + 44 +1.0 + 0 +MTEXT + 5 +4DA +100 +AcDbEntity +100 +AcDbMText + 8 +1-UGrid GlobalIdx Triangles + 62 +256 +370 +-1 + 6 +ByLayer + 10 +95.4531946508173093 + 20 +-47.971295329866301 + 30 +0.0 + 40 +5.0 + 41 +100.0 + 71 +5 + 72 +2 + 1 +1 + 7 +greeks + 50 +0.0 + 73 +0 + 44 +1.0 + 0 +MTEXT + 5 +4DB +100 +AcDbEntity +100 +AcDbMText + 8 +1-UGrid GlobalIdx Triangles + 62 +256 +370 +-1 + 6 +ByLayer + 10 +186.3298662704316371 + 20 +-45.356139312035836 + 30 +0.0 + 40 +5.0 + 41 +100.0 + 71 +5 + 72 +2 + 1 +3 + 7 +greeks + 50 +0.0 + 73 +0 + 44 +1.0 + 0 +MTEXT + 5 +4DC +100 +AcDbEntity +100 +AcDbMText + 8 +1-UGrid GlobalIdx Triangles + 62 +256 +370 +-1 + 6 +ByLayer + 10 +209.6811173848448959 + 20 +-3.8755806196136904 + 30 +0.0 + 40 +5.0 + 41 +100.0 + 71 +5 + 72 +2 + 1 +4 + 7 +greeks + 50 +0.0 + 73 +0 + 44 +1.0 + 0 +MTEXT + 5 +4DD +100 +AcDbEntity +100 +AcDbMText + 8 +1-UGrid GlobalIdx Triangles + 62 +256 +370 +-1 + 6 +ByLayer + 10 +188.0 + 20 +90.4090909999999894 + 30 +0.0 + 40 +5.0 + 41 +100.0 + 71 +5 + 72 +2 + 1 +6 + 7 +greeks + 50 +0.0 + 73 +0 + 44 +1.0 + 0 +MTEXT + 5 +4DE +100 +AcDbEntity +100 +AcDbMText + 8 +1-UGrid GlobalIdx Triangles + 62 +256 +370 +-1 + 6 +ByLayer + 10 +154.9479940564648643 + 20 +117.7642173001495252 + 30 +0.0 + 40 +5.0 + 41 +100.0 + 71 +5 + 72 +2 + 1 +7 + 7 +greeks + 50 +0.0 + 73 +0 + 44 +1.0 + 0 +MTEXT + 5 +4DF +100 +AcDbEntity +100 +AcDbMText + 8 +1-UGrid GlobalIdx Triangles + 62 +256 +370 +-1 + 6 +ByLayer + 10 +109.292600297177728 + 20 +106.186921609213357 + 30 +0.0 + 40 +5.0 + 41 +100.0 + 71 +5 + 72 +2 + 1 +8 + 7 +greeks + 50 +0.0 + 73 +0 + 44 +1.0 + 0 +MTEXT + 5 +4E0 +100 +AcDbEntity +100 +AcDbMText + 8 +1-UGrid GlobalIdx Triangles + 62 +256 +370 +-1 + 6 +ByLayer + 10 +47.0728083209512889 + 20 +22.1671890683508188 + 30 +0.0 + 40 +5.0 + 41 +100.0 + 71 +5 + 72 +2 + 1 +10 + 7 +greeks + 50 +0.0 + 73 +0 + 44 +1.0 + 0 +MTEXT + 5 +4E1 +100 +AcDbEntity +100 +AcDbMText + 8 +1-UGrid GlobalIdx Triangles + 62 +256 +370 +-1 + 6 +ByLayer + 10 +70.0 + 20 +68.4090909999999894 + 30 +0.0 + 40 +5.0 + 41 +100.0 + 71 +5 + 72 +2 + 1 +12 + 7 +greeks + 50 +0.0 + 73 +0 + 44 +1.0 + 0 +MTEXT + 5 +4E2 +100 +AcDbEntity +100 +AcDbMText + 8 +1-UGrid GlobalIdx Triangles + 62 +256 +370 +-1 + 6 +ByLayer + 10 +90.5471619613676211 + 20 +23.0040389940566072 + 30 +0.0 + 40 +5.0 + 41 +100.0 + 71 +5 + 72 +2 + 1 +13 + 7 +greeks + 50 +0.0 + 73 +0 + 44 +1.0 + 0 +MTEXT + 5 +4E3 +100 +AcDbEntity +100 +AcDbMText + 8 +1-UGrid GlobalIdx Triangles + 62 +256 +370 +-1 + 6 +ByLayer + 10 +115.2844457652311689 + 20 +73.7840924858846421 + 30 +0.0 + 40 +5.0 + 41 +100.0 + 71 +5 + 72 +2 + 1 +14 + 7 +greeks + 50 +0.0 + 73 +0 + 44 +1.0 + 0 +MTEXT + 5 +4E4 +100 +AcDbEntity +100 +AcDbMText + 8 +1-UGrid GlobalIdx Triangles + 62 +256 +370 +-1 + 6 +ByLayer + 10 +93.4593997028238874 + 20 +54.1013822332842054 + 30 +0.0 + 40 +5.0 + 41 +100.0 + 71 +5 + 72 +2 + 1 +15 + 7 +greeks + 50 +0.0 + 73 +0 + 44 +1.0 + 0 +MTEXT + 5 +4E5 +100 +AcDbEntity +100 +AcDbMText + 8 +1-UGrid GlobalIdx Triangles + 62 +256 +370 +-1 + 6 +ByLayer + 10 +113.2224475482913562 + 20 +-19.0861648692422179 + 30 +0.0 + 40 +5.0 + 41 +100.0 + 71 +5 + 72 +2 + 1 +16 + 7 +greeks + 50 +0.0 + 73 +0 + 44 +1.0 + 0 +MTEXT + 5 +4E6 +100 +AcDbEntity +100 +AcDbMText + 8 +1-UGrid GlobalIdx Triangles + 62 +256 +370 +-1 + 6 +ByLayer + 10 +138.0 + 20 +-48.5909089999999964 + 30 +0.0 + 40 +5.0 + 41 +100.0 + 71 +5 + 72 +2 + 1 +17 + 7 +greeks + 50 +0.0 + 73 +0 + 44 +1.0 + 0 +MTEXT + 5 +4E7 +100 +AcDbEntity +100 +AcDbMText + 8 +1-UGrid GlobalIdx Triangles + 62 +256 +370 +-1 + 6 +ByLayer + 10 +158.3186163447253989 + 20 +-19.7288656121842862 + 30 +0.0 + 40 +5.0 + 41 +100.0 + 71 +5 + 72 +2 + 1 +18 + 7 +greeks + 50 +0.0 + 73 +0 + 44 +1.0 + 0 +MTEXT + 5 +4E8 +100 +AcDbEntity +100 +AcDbMText + 8 +1-UGrid GlobalIdx Triangles + 62 +256 +370 +-1 + 6 +ByLayer + 10 +136.6810246656762331 + 20 +-30.2263110802377781 + 30 +0.0 + 40 +5.0 + 41 +100.0 + 71 +5 + 72 +2 + 1 +19 + 7 +greeks + 50 +0.0 + 73 +0 + 44 +1.0 + 0 +MTEXT + 5 +4E9 +100 +AcDbEntity +100 +AcDbMText + 8 +1-UGrid GlobalIdx Triangles + 62 +256 +370 +-1 + 6 +ByLayer + 10 +160.8090817236268322 + 20 +67.624877032689966 + 30 +0.0 + 40 +5.0 + 41 +100.0 + 71 +5 + 72 +2 + 1 +20 + 7 +greeks + 50 +0.0 + 73 +0 + 44 +1.0 + 0 +MTEXT + 5 +4EA +100 +AcDbEntity +100 +AcDbMText + 8 +1-UGrid GlobalIdx Triangles + 62 +256 +370 +-1 + 6 +ByLayer + 10 +182.2056606240723227 + 20 +18.1904782213968303 + 30 +0.0 + 40 +5.0 + 41 +100.0 + 71 +5 + 72 +2 + 1 +21 + 7 +greeks + 50 +0.0 + 73 +0 + 44 +1.0 + 0 +MTEXT + 5 +4EB +100 +AcDbEntity +100 +AcDbMText + 8 +1-UGrid GlobalIdx Triangles + 62 +256 +370 +-1 + 6 +ByLayer + 10 +202.0490460624087348 + 20 +55.0386541500747342 + 30 +0.0 + 40 +5.0 + 41 +100.0 + 71 +5 + 72 +2 + 1 +22 + 7 +greeks + 50 +0.0 + 73 +0 + 44 +1.0 + 0 +MTEXT + 5 +4EC +100 +AcDbEntity +100 +AcDbMText + 8 +1-UGrid GlobalIdx Triangles + 62 +256 +370 +-1 + 6 +ByLayer + 10 +177.8138722139687218 + 20 +45.6659349821697518 + 30 +0.0 + 40 +5.0 + 41 +100.0 + 71 +5 + 72 +2 + 1 +23 + 7 +greeks + 50 +0.0 + 73 +0 + 44 +1.0 + 0 +MTEXT + 5 +4ED +100 +AcDbEntity +100 +AcDbMText + 8 +1-UGrid GlobalIdx Triangles + 62 +256 +370 +-1 + 6 +ByLayer + 10 +113.2362555720659714 + 20 +4.5933406285289973 + 30 +0.0 + 40 +5.0 + 41 +100.0 + 71 +5 + 72 +2 + 1 +24 + 7 +greeks + 50 +0.0 + 73 +0 + 44 +1.0 + 0 +MTEXT + 5 +4EE +100 +AcDbEntity +100 +AcDbMText + 8 +1-UGrid GlobalIdx Triangles + 62 +256 +370 +-1 + 6 +ByLayer + 10 +137.645075780090167 + 20 +55.306446126300564 + 30 +0.0 + 40 +5.0 + 41 +100.0 + 71 +5 + 72 +2 + 1 +25 + 7 +greeks + 50 +0.0 + 73 +0 + 44 +1.0 + 0 +MTEXT + 5 +4EF +100 +AcDbEntity +100 +AcDbMText + 8 +1-UGrid GlobalIdx Triangles + 62 +256 +370 +-1 + 6 +ByLayer + 10 +158.2169390787526879 + 20 +4.3318250267459346 + 30 +0.0 + 40 +5.0 + 41 +100.0 + 71 +5 + 72 +2 + 1 +26 + 7 +greeks + 50 +0.0 + 73 +0 + 44 +1.0 + 0 +MTEXT + 5 +4F0 +100 +AcDbEntity +100 +AcDbMText + 8 +1-UGrid GlobalIdx Triangles + 62 +256 +370 +-1 + 6 +ByLayer + 10 +136.0717979197631564 + 20 +23.8408889197624134 + 30 +0.0 + 40 +5.0 + 41 +100.0 + 71 +5 + 72 +2 + 1 +27 + 7 +greeks + 50 +0.0 + 73 +0 + 44 +1.0 + 0 +MTEXT + 5 +4F1 +100 +AcDbEntity +100 +AcDbMText + 8 +0-UGrid Vertex Idx + 62 +256 +370 +-1 + 6 +ByLayer + 10 +-4.3945312500000435 + 20 +4.3945312500000435 + 30 +0.0 + 40 +5.0 + 41 +100.0 + 71 +1 + 72 +2 + 1 +0 + 7 +normal + 50 +0.0 + 73 +0 + 44 +1.0 + 0 +MTEXT + 5 +4F2 +100 +AcDbEntity +100 +AcDbMText + 8 +0-UGrid Vertex Idx + 62 +256 +370 +-1 + 6 +ByLayer + 10 +54.6875000000005471 + 20 +-72.7539062500007248 + 30 +0.0 + 40 +5.0 + 41 +100.0 + 71 +1 + 72 +2 + 1 +1 + 7 +normal + 50 +0.0 + 73 +0 + 44 +1.0 + 0 +MTEXT + 5 +4F3 +100 +AcDbEntity +100 +AcDbMText + 8 +0-UGrid Vertex Idx + 62 +256 +370 +-1 + 6 +ByLayer + 10 +141.1132812500013927 + 20 +-74.218750000000739 + 30 +0.0 + 40 +5.0 + 41 +100.0 + 71 +1 + 72 +2 + 1 +3 + 7 +normal + 50 +0.0 + 73 +0 + 44 +1.0 + 0 +MTEXT + 5 +4F4 +100 +AcDbEntity +100 +AcDbMText + 8 +0-UGrid Vertex Idx + 62 +256 +370 +-1 + 6 +ByLayer + 10 +243.1640625000024158 + 20 +-61.5234375000006111 + 30 +0.0 + 40 +5.0 + 41 +100.0 + 71 +1 + 72 +2 + 1 +5 + 7 +normal + 50 +0.0 + 73 +0 + 44 +1.0 + 0 +MTEXT + 5 +4F5 +100 +AcDbEntity +100 +AcDbMText + 8 +0-UGrid Vertex Idx + 62 +256 +370 +-1 + 6 +ByLayer + 10 +223.6328125000022169 + 20 +62.9882812500006253 + 30 +0.0 + 40 +5.0 + 41 +100.0 + 71 +1 + 72 +2 + 1 +6 + 7 +normal + 50 +0.0 + 73 +0 + 44 +1.0 + 0 +MTEXT + 5 +4F6 +100 +AcDbEntity +100 +AcDbMText + 8 +0-UGrid Vertex Idx + 62 +256 +370 +-1 + 6 +ByLayer + 10 +202.1484375000020179 + 20 +124.5117187500012363 + 30 +0.0 + 40 +5.0 + 41 +100.0 + 71 +1 + 72 +2 + 1 +8 + 7 +normal + 50 +0.0 + 73 +0 + 44 +1.0 + 0 +MTEXT + 5 +4F7 +100 +AcDbEntity +100 +AcDbMText + 8 +0-UGrid Vertex Idx + 62 +256 +370 +-1 + 6 +ByLayer + 10 +134.7656250000013358 + 20 +155.2734375000015348 + 30 +0.0 + 40 +5.0 + 41 +100.0 + 71 +1 + 72 +2 + 1 +9 + 7 +normal + 50 +0.0 + 73 +0 + 44 +1.0 + 0 +MTEXT + 5 +4F8 +100 +AcDbEntity +100 +AcDbMText + 8 +0-UGrid Vertex Idx + 62 +256 +370 +-1 + 6 +ByLayer + 10 +45.3924356096011437 + 20 +86.2214684672021718 + 30 +0.0 + 40 +5.0 + 41 +100.0 + 71 +1 + 72 +2 + 1 +10 + 7 +normal + 50 +0.0 + 73 +0 + 44 +1.0 + 0 +MTEXT + 5 +4F9 +100 +AcDbEntity +100 +AcDbMText + 8 +0-UGrid Vertex Idx + 62 +256 +370 +-1 + 6 +ByLayer + 10 +82.4432394240034654 + 20 +-11.274289152000474 + 30 +0.0 + 40 +5.0 + 41 +100.0 + 71 +1 + 72 +2 + 1 +2 + 7 +normal + 50 +0.0 + 73 +0 + 44 +1.0 + 0 +MTEXT + 5 +4FA +100 +AcDbEntity +100 +AcDbMText + 8 +0-UGrid Vertex Idx + 62 +256 +370 +-1 + 6 +ByLayer + 10 +184.6835937280083613 + 20 +-6.7108864000003035 + 30 +0.0 + 40 +5.0 + 41 +100.0 + 71 +1 + 72 +2 + 1 +4 + 7 +normal + 50 +0.0 + 73 +0 + 44 +1.0 + 0 +LINE + 5 +4FB +100 +AcDbEntity +100 +AcDbLine + 8 +0-UGrid Mark UpAdj Edges + 62 +256 +370 +-1 + 6 +ByLayer + 10 +140.0 + 20 +90.0 + 30 +0.0 + 11 +200.0 + 21 +120.0 + 31 +0.0 + 0 +LINE + 5 +4FC +100 +AcDbEntity +100 +AcDbLine + 8 +0-UGrid Mark UpAdj Edges + 62 +256 +370 +-1 + 6 +ByLayer + 10 +140.0 + 20 +90.0 + 30 +0.0 + 11 +220.0 + 21 +60.0 + 31 +0.0 + 0 +LINE + 5 +4FD +100 +AcDbEntity +100 +AcDbLine + 8 +0-UGrid Mark UpAdj Edges + 62 +256 +370 +-1 + 6 +ByLayer + 10 +140.0 + 20 +90.0 + 30 +0.0 + 11 +180.0 + 21 +-10.0 + 31 +0.0 + 0 +LINE + 5 +4FE +100 +AcDbEntity +100 +AcDbLine + 8 +0-UGrid Mark UpAdj Edges + 62 +256 +370 +-1 + 6 +ByLayer + 10 +140.0 + 20 +90.0 + 30 +0.0 + 11 +90.0 + 21 +-10.0 + 31 +0.0 + 0 +LINE + 5 +4FF +100 +AcDbEntity +100 +AcDbLine + 8 +0-UGrid Mark UpAdj Edges + 62 +256 +370 +-1 + 6 +ByLayer + 10 +140.0 + 20 +90.0 + 30 +0.0 + 11 +50.0 + 21 +80.0 + 31 +0.0 + 0 +LINE + 5 +500 +100 +AcDbEntity +100 +AcDbLine + 8 +0-UGrid Mark UpAdj Edges + 62 +256 +370 +-1 + 6 +ByLayer + 10 +140.0 + 20 +90.0 + 30 +0.0 + 11 +130.0 + 21 +150.0 + 31 +0.0 + 0 +HATCH + 5 +501 + 8 +0-UGrid Mark UpAdj Vertex + 62 +256 +370 +-1 + 6 +ByLayer +100 +AcDbEntity +100 +AcDbHatch + 10 +0.0 + 20 +0.0 + 30 +0.0 +210 +0.0 +220 +0.0 +230 +1.0 + 2 +SOLID + 70 +1 + 71 +0 + 91 +1 + 92 +1 + 93 +1 + 72 +2 + 10 +140.0 + 20 +90.0 + 40 +7.25 + 50 +0.0 + 51 +360.0 + 73 +1 + 97 +0 + 75 +0 + 76 +1 + 98 +0 + 0 +MTEXT + 5 +502 +100 +AcDbEntity +100 +AcDbMText + 8 +0-UGrid Vertex Idx + 62 +256 +370 +-1 + 6 +ByLayer + 10 +142.0 + 20 +99.0 + 30 +0.0 + 40 +5.0 + 41 +100.0 + 71 +1 + 72 +2 + 1 +7 + 7 +normal + 50 +0.0 + 73 +0 + 44 +1.0 + 0 +LINE + 5 +503 +100 +AcDbEntity +100 +AcDbLine + 8 +0-UGrid Mark DownAdj Edges + 62 +256 +370 +-1 + 6 +ByLayer + 10 +140.0 + 20 +90.0 + 30 +0.0 + 11 +200.0 + 21 +120.0 + 31 +0.0 + 0 +LINE + 5 +504 +100 +AcDbEntity +100 +AcDbLine + 8 +0-UGrid Mark DownAdj Edges + 62 +256 +370 +-1 + 6 +ByLayer + 10 +200.0 + 20 +120.0 + 30 +0.0 + 11 +220.0 + 21 +60.0 + 31 +0.0 + 0 +HATCH + 5 +505 + 8 +0-UGrid Mark DownAdj Vertices + 62 +256 +370 +-1 + 6 +ByLayer +100 +AcDbEntity +100 +AcDbHatch + 10 +0.0 + 20 +0.0 + 30 +0.0 +210 +0.0 +220 +0.0 +230 +1.0 + 2 +SOLID + 70 +1 + 71 +0 + 91 +1 + 92 +1 + 93 +3 + 72 +2 + 10 +200.0 + 20 +120.0 + 40 +7.25 + 50 +0.0 + 51 +360.0 + 73 +1 + 72 +2 + 10 +140.0 + 20 +90.0 + 40 +7.25 + 50 +0.0 + 51 +360.0 + 73 +1 + 72 +2 + 10 +220.0 + 20 +60.0 + 40 +7.25 + 50 +0.0 + 51 +360.0 + 73 +1 + 97 +0 + 75 +0 + 76 +1 + 98 +0 + 0 +HATCH + 5 +506 + 8 +1-UGrid Mark DownAdjVertices + 62 +256 +370 +-1 + 6 +ByLayer +100 +AcDbEntity +100 +AcDbHatch + 10 +0.0 + 20 +0.0 + 30 +0.0 +210 +0.0 +220 +0.0 +230 +1.0 + 2 +SOLID + 70 +1 + 71 +0 + 91 +1 + 92 +1 + 93 +3 + 72 +2 + 10 +200.0 + 20 +120.0 + 40 +7.25 + 50 +0.0 + 51 +360.0 + 73 +1 + 72 +2 + 10 +140.0 + 20 +90.0 + 40 +7.25 + 50 +0.0 + 51 +360.0 + 73 +1 + 72 +2 + 10 +220.0 + 20 +60.0 + 40 +7.25 + 50 +0.0 + 51 +360.0 + 73 +1 + 97 +0 + 75 +0 + 76 +1 + 98 +0 + 0 +HATCH + 5 +507 + 8 +1-UGrid Mark DownAdjVertices + 62 +256 +370 +-1 + 6 +ByLayer +100 +AcDbEntity +100 +AcDbHatch + 10 +0.0 + 20 +0.0 + 30 +0.0 +210 +0.0 +220 +0.0 +230 +1.0 + 2 +SOLID + 70 +1 + 71 +0 + 91 +1 + 92 +1 + 93 +1 + 72 +2 + 10 +180.0000175342504178 + 20 +74.9999934246560969 + 40 +7.25 + 50 +0.0 + 51 +360.0 + 73 +1 + 97 +0 + 75 +0 + 76 +1 + 98 +0 + 0 +MTEXT + 5 +508 +100 +AcDbEntity +100 +AcDbMText + 8 +1-UGrid Vertex Idx + 62 +256 +370 +-1 + 6 +ByLayer + 10 +223.6328125000022169 + 20 +62.9882812500006253 + 30 +0.0 + 40 +5.0 + 41 +100.0 + 71 +1 + 72 +2 + 1 +6 + 7 +normal + 50 +0.0 + 73 +0 + 44 +1.0 + 0 +MTEXT + 5 +509 +100 +AcDbEntity +100 +AcDbMText + 8 +1-UGrid Vertex Idx + 62 +256 +370 +-1 + 6 +ByLayer + 10 +202.1484375000020179 + 20 +124.5117187500012363 + 30 +0.0 + 40 +5.0 + 41 +100.0 + 71 +1 + 72 +2 + 1 +8 + 7 +normal + 50 +0.0 + 73 +0 + 44 +1.0 + 0 +MTEXT + 5 +50A +100 +AcDbEntity +100 +AcDbMText + 8 +1-UGrid Vertex Idx + 62 +256 +370 +-1 + 6 +ByLayer + 10 +181.2500000000024443 + 20 +82.0312500000011084 + 30 +0.0 + 40 +5.0 + 41 +100.0 + 71 +1 + 72 +2 + 1 +18 + 7 +normal + 50 +0.0 + 73 +0 + 44 +1.0 + 0 +MTEXT + 5 +50B +100 +AcDbEntity +100 +AcDbMText + 8 +1-UGrid Vertex Idx + 62 +256 +370 +-1 + 6 +ByLayer + 10 +142.0 + 20 +99.0 + 30 +0.0 + 40 +5.0 + 41 +100.0 + 71 +1 + 72 +2 + 1 +7 + 7 +normal + 50 +0.0 + 73 +0 + 44 +1.0 + 0 +ENDSEC + 0 +SECTION + 2 +OBJECTS + 0 +DICTIONARY + 5 +C +100 +AcDbDictionary +280 +0 +281 +1 + 3 +ACAD_GROUP +350 +D + 3 +ACAD_LAYOUT +350 +1A + 3 +ACAD_MLINESTYLE +350 +17 + 3 +ACAD_PLOTSETTINGS +350 +19 + 3 +ACAD_PLOTSTYLENAME +350 +E + 3 +AcDbVariableDictionary +350 +50C + 0 +DICTIONARY + 5 +D +100 +AcDbDictionary +280 +0 +281 +1 + 0 +ACDBDICTIONARYWDFLT + 5 +E +100 +AcDbDictionary +281 +1 + 3 +Normal +350 +F +100 +AcDbDictionaryWithDefault +340 +F + 0 +ACDBPLACEHOLDER + 5 +F + 0 +DICTIONARY + 5 +17 +100 +AcDbDictionary +280 +0 +281 +1 + 3 +Standard +350 +18 + 0 +MLINESTYLE + 5 +18 +100 +AcDbMlineStyle + 2 +STANDARD + 70 +0 + 3 + + 62 +256 + 51 +90.0 + 52 +90.0 + 71 +2 + 49 +0.5 + 62 +256 + 6 +BYLAYER + 49 +-0.5 + 62 +256 + 6 +BYLAYER + 0 +DICTIONARY + 5 +19 +100 +AcDbDictionary +280 +0 +281 +1 + 0 +DICTIONARY + 5 +1A +100 +AcDbDictionary +281 +1 + 3 +Layout1 +350 +1E + 3 +Layout2 +350 +26 + 3 +Model +350 +22 + 0 +LAYOUT + 5 +1E +100 +AcDbPlotSettings + 1 + + 2 +C:\Program Files\AutoCAD 2002\plotters\DWF ePlot (optimized for plotting).pc3 + 4 + + 6 + + 40 +0.0 + 41 +0.0 + 42 +0.0 + 43 +0.0 + 44 +0.0 + 45 +0.0 + 46 +0.0 + 47 +0.0 + 48 +0.0 + 49 +0.0 +140 +0.0 +141 +0.0 +142 +1.0 +143 +1.0 + 70 +688 + 72 +0 + 73 +0 + 74 +5 + 7 + + 75 +16 +147 +1.0 +148 +0.0 +149 +0.0 +100 +AcDbLayout + 1 +Layout1 + 70 +1 + 71 +1 + 10 +0.0 + 20 +0.0 + 11 +420.0 + 21 +297.0 + 12 +0.0 + 22 +0.0 + 32 +0.0 + 14 +100000000000000000000.0 + 24 +100000000000000000000.0 + 34 +100000000000000000000.0 + 15 +-100000000000000000000.0 + 25 +-100000000000000000000.0 + 35 +-100000000000000000000.0 +146 +0.0 + 13 +0.0 + 23 +0.0 + 33 +0.0 + 16 +1.0 + 26 +0.0 + 36 +0.0 + 17 +0.0 + 27 +1.0 + 37 +0.0 + 76 +0 +330 +1B + 0 +LAYOUT + 5 +22 +100 +AcDbPlotSettings + 1 + + 2 +C:\Program Files\AutoCAD 2002\plotters\DWF ePlot (optimized for plotting).pc3 + 4 + + 6 + + 40 +0.0 + 41 +0.0 + 42 +0.0 + 43 +0.0 + 44 +0.0 + 45 +0.0 + 46 +0.0 + 47 +0.0 + 48 +0.0 + 49 +0.0 +140 +0.0 +141 +0.0 +142 +1.0 +143 +1.0 + 70 +1712 + 72 +0 + 73 +0 + 74 +0 + 7 + + 75 +0 +147 +1.0 +148 +0.0 +149 +0.0 +100 +AcDbLayout + 1 +Model + 70 +1 + 71 +0 + 10 +0.0 + 20 +0.0 + 11 +12.0 + 21 +9.0 + 12 +0.0 + 22 +0.0 + 32 +0.0 + 14 +0.0 + 24 +0.0 + 34 +0.0 + 15 +0.0 + 25 +0.0 + 35 +0.0 +146 +0.0 + 13 +0.0 + 23 +0.0 + 33 +0.0 + 16 +1.0 + 26 +0.0 + 36 +0.0 + 17 +0.0 + 27 +1.0 + 37 +0.0 + 76 +0 +330 +1F + 0 +LAYOUT + 5 +26 +100 +AcDbPlotSettings + 1 + + 2 +C:\Program Files\AutoCAD 2002\plotters\DWF ePlot (optimized for plotting).pc3 + 4 + + 6 + + 40 +0.0 + 41 +0.0 + 42 +0.0 + 43 +0.0 + 44 +0.0 + 45 +0.0 + 46 +0.0 + 47 +0.0 + 48 +0.0 + 49 +0.0 +140 +0.0 +141 +0.0 +142 +1.0 +143 +1.0 + 70 +688 + 72 +0 + 73 +0 + 74 +5 + 7 + + 75 +16 +147 +1.0 +148 +0.0 +149 +0.0 +100 +AcDbLayout + 1 +Layout2 + 70 +1 + 71 +2 + 10 +0.0 + 20 +0.0 + 11 +12.0 + 21 +9.0 + 12 +0.0 + 22 +0.0 + 32 +0.0 + 14 +0.0 + 24 +0.0 + 34 +0.0 + 15 +0.0 + 25 +0.0 + 35 +0.0 +146 +0.0 + 13 +0.0 + 23 +0.0 + 33 +0.0 + 16 +1.0 + 26 +0.0 + 36 +0.0 + 17 +0.0 + 27 +1.0 + 37 +0.0 + 76 +0 +330 +23 + 0 +DICTIONARY + 5 +50C +100 +AcDbDictionary +281 +1 + 3 +DIMASSOC +350 +50E + 3 +HIDETEXT +350 +50D + 0 +DICTIONARYVAR + 5 +50D +100 +DictionaryVariables +280 +0 + 1 +2 + 0 +DICTIONARYVAR + 5 +50E +100 +DictionaryVariables +280 +0 + 1 +1 + 0 +ENDSEC + 0 +EOF diff --git a/doc/Examples/meshexample.txt b/doc/Examples/meshexample.txt new file mode 100644 index 0000000..0cb1312 --- /dev/null +++ b/doc/Examples/meshexample.txt @@ -0,0 +1,77 @@ +NumLevels: 2 + +NumVerticesOnLevel: 11 20 29 + +Vertices: +1 0.0 0.0 +2 60.0 -70.0 +3 90.0 -10.0 +4 140.0 -70.0 +5 180.0 -10.0 +6 240.0 -60.0 +7 220.0 60.0 +8 140.0 90.0 +9 200.0 120.0 +10 130.0 150.0 +11 50.0 80.0 +12 115.0 40.0 +13 95.0 85.0 +14 70.0 35.0 +15 160.0 -40.0 +16 135.0 -10.0 +17 115.0 -40.0 +18 200.0 25.0 +19 180.0 75.0 +20 160.0 40.0 + +21 125.0 15.0 +22 112.5 -10.0 +23 102.5 15.0 +24 147.5 15.0 +25 137.5 40.0 +26 150.0 65.0 +27 127.5 65.0 +28 117.5 87.5 +29 105.0 62.5 + +NumElemsOnLevel: 12 24 36 +NumElems: 12 28 44 + +Elements: +ID PID CID VertexIDs Adj Translation Tbl (dim num lvls - 1) +1 -1 -1 1 2 3 2 11 -1 1 +2 -1 -1 2 3 4 3 -1 1 2 +3 -1 12 3 4 5 4 12 2 -1 +4 -1 -1 4 5 6 5 -1 3 3 +5 -1 -1 5 7 6 -1 4 6 4 +6 -1 17 8 5 7 5 7 12 -1 +7 -1 -1 8 9 7 -1 6 8 5 +8 -1 -1 10 8 9 7 -1 9 6 +9 -1 -1 11 10 8 8 10 -1 7 +10 -1 25 11 3 8 12 9 11 -1 +11 -1 -1 1 11 3 10 1 -1 8 +12 -1 21 3 8 5 6 3 10 -1 +13 3 -1 3 14 13 16 21 2 9 +14 3 -1 14 4 12 4 16 2 10 +15 3 -1 13 12 5 4 23 16 11 +16 3 -1 14 13 12 15 14 13 12 +17 6 -1 8 17 16 20 5 22 13 +18 6 -1 17 5 15 5 20 23 14 +19 6 -1 16 15 7 5 7 20 15 +20 6 -1 17 16 15 19 18 17 16 +21 12 -1 3 18 13 24 13 26 17 +22 12 -1 18 8 17 17 24 27 18 +23 12 -1 13 17 5 18 15 24 19 +24 12 -1 18 13 17 23 22 21 20 +25 10 -1 11 20 19 28 9 11 21 +26 10 -1 20 3 18 21 28 11 22 +27 10 -1 19 18 8 22 9 28 23 +28 10 -1 20 3 18 27 26 25 24 + +3,0 3,1 4,2 2,3 16,4 + +1 2 -1 3 4 + +1 2 3 +1 3 6 +2 11 1 13 14 diff --git a/doc/Examples/simple_tet.vtk b/doc/Examples/simple_tet.vtk new file mode 100644 index 0000000..79db55f --- /dev/null +++ b/doc/Examples/simple_tet.vtk @@ -0,0 +1,107 @@ +# vtk DataFile Version 2.0 +VTK LEGACY FILE FORMAT ASCII - tetrahedral sample file for H5FED test +ASCII +DATASET UNSTRUCTURED_GRID + +POINTS 17 DOUBLE +-1 0 0 +1 0 0 +0 1 0 +0 0 1 +0 -1 0 +-0.5 0 0.5 +-0.5 0.5 0 +0 0 0 +0 0.5 0.5 +0.5 0 0.5 +0.5 0.5 0 +-0.75 0 0.25 +-0.75 0.25 0 +-0.5 0 0 +-0.5 0.25 0.25 +-0.25 0 0.25 +-0.25 0.25 0 + +CELLS 18 90 +4 0 3 2 1 +4 0 4 3 1 +4 0 5 6 7 +4 5 3 8 9 +4 6 8 2 10 +4 7 9 10 1 +4 5 6 7 9 +4 5 6 8 9 +4 6 7 9 10 +4 6 8 9 10 +4 0 11 12 13 +4 11 5 14 15 +4 12 14 6 16 +4 13 15 16 7 +4 11 12 13 15 +4 11 12 14 15 +4 12 13 15 16 +4 12 14 15 16 + +CELL_TYPES 18 +10 +10 +10 +10 +10 +10 +10 +10 +10 +10 +10 +10 +10 +10 +10 +10 +10 +10 + +POINT_DATA 17 +SCALARS vertex_id int 1 +LOOKUP_TABLE default +0 +1 +2 +3 +4 +5 +6 +7 +8 +9 +10 +11 +12 +13 +14 +15 +16 + +CELL_DATA 18 +SCALARS cell_attribute_data int 1 +LOOKUP_TABLE default +0 +1 +2 +3 +4 +5 +6 +7 +8 +9 +10 +11 +12 +13 +14 +15 +16 +17 + diff --git a/doc/Examples/simple_tet_level0.vtk b/doc/Examples/simple_tet_level0.vtk new file mode 100644 index 0000000..9a07498 --- /dev/null +++ b/doc/Examples/simple_tet_level0.vtk @@ -0,0 +1,59 @@ +# vtk DataFile Version 2.0 +VTK LEGACY FILE FORMAT ASCII - tetrahedral sample file for H5FED test +ASCII +DATASET UNSTRUCTURED_GRID + +POINTS 17 DOUBLE +-1 0 0 +1 0 0 +0 1 0 +0 0 1 +0 -1 0 +-0.5 0 0.5 +-0.5 0.5 0 +0 0 0 +0 0.5 0.5 +0.5 0 0.5 +0.5 0.5 0 +-0.75 0 0.25 +-0.75 0.25 0 +-0.5 0 0 +-0.5 0.25 0.25 +-0.25 0 0.25 +-0.25 0.25 0 + +CELLS 2 10 +4 0 3 2 1 +4 0 4 3 1 + +CELL_TYPES 2 +10 +10 + +POINT_DATA 17 +SCALARS vertex_id int 1 +LOOKUP_TABLE default +0 +1 +2 +3 +4 +5 +6 +7 +8 +9 +10 +11 +12 +13 +14 +15 +16 + +CELL_DATA 2 +SCALARS cell_attribute_data int 1 +LOOKUP_TABLE default +0 +1 + diff --git a/doc/Examples/simple_tet_level1.vtk b/doc/Examples/simple_tet_level1.vtk new file mode 100644 index 0000000..40561bb --- /dev/null +++ b/doc/Examples/simple_tet_level1.vtk @@ -0,0 +1,80 @@ +# vtk DataFile Version 2.0 +VTK LEGACY FILE FORMAT ASCII - tetrahedral sample file for H5FED test +ASCII +DATASET UNSTRUCTURED_GRID + +POINTS 17 DOUBLE +-1 0 0 +1 0 0 +0 1 0 +0 0 1 +0 -1 0 +-0.5 0 0.5 +-0.5 0.5 0 +0 0 0 +0 0.5 0.5 +0.5 0 0.5 +0.5 0.5 0 +-0.75 0 0.25 +-0.75 0.25 0 +-0.5 0 0 +-0.5 0.25 0.25 +-0.25 0 0.25 +-0.25 0.25 0 + +CELLS 9 45 +4 0 4 3 1 +4 0 5 6 7 +4 5 3 8 9 +4 6 8 2 10 +4 7 9 10 1 +4 5 6 7 9 +4 5 6 8 9 +4 6 7 9 10 +4 6 8 9 10 + +CELL_TYPES 9 +10 +10 +10 +10 +10 +10 +10 +10 +10 + +POINT_DATA 17 +SCALARS vertex_id int 1 +LOOKUP_TABLE default +0 +1 +2 +3 +4 +5 +6 +7 +8 +9 +10 +11 +12 +13 +14 +15 +16 + +CELL_DATA 9 +SCALARS cell_attribute_data int 1 +LOOKUP_TABLE default +0 +1 +2 +3 +4 +5 +6 +7 +8 + diff --git a/doc/Examples/simple_tet_level2.vtk b/doc/Examples/simple_tet_level2.vtk new file mode 100644 index 0000000..031e6de --- /dev/null +++ b/doc/Examples/simple_tet_level2.vtk @@ -0,0 +1,101 @@ +# vtk DataFile Version 2.0 +VTK LEGACY FILE FORMAT ASCII - tetrahedral sample file for H5FED test +ASCII +DATASET UNSTRUCTURED_GRID + +POINTS 17 DOUBLE +-1 0 0 +1 0 0 +0 1 0 +0 0 1 +0 -1 0 +-0.5 0 0.5 +-0.5 0.5 0 +0 0 0 +0 0.5 0.5 +0.5 0 0.5 +0.5 0.5 0 +-0.75 0 0.25 +-0.75 0.25 0 +-0.5 0 0 +-0.5 0.25 0.25 +-0.25 0 0.25 +-0.25 0.25 0 + +CELLS 16 80 +4 0 4 3 1 +4 5 3 8 9 +4 6 8 2 10 +4 7 9 10 1 +4 5 6 7 9 +4 5 6 8 9 +4 6 7 9 10 +4 6 8 9 10 +4 0 11 12 13 +4 11 5 14 15 +4 12 14 6 16 +4 13 15 16 7 +4 11 12 13 15 +4 11 12 14 15 +4 12 13 15 16 +4 12 14 15 16 + +CELL_TYPES 16 +10 +10 +10 +10 +10 +10 +10 +10 +10 +10 +10 +10 +10 +10 +10 +10 + +POINT_DATA 17 +SCALARS vertex_id int 1 +LOOKUP_TABLE default +0 +1 +2 +3 +4 +5 +6 +7 +8 +9 +10 +11 +12 +13 +14 +15 +16 + +CELL_DATA 16 +SCALARS cell_attribute_data int 1 +LOOKUP_TABLE default +1 +3 +4 +5 +6 +7 +8 +9 +10 +11 +12 +13 +14 +15 +16 +17 + diff --git a/doc/Examples/trimesh_dgraph_level0.metis b/doc/Examples/trimesh_dgraph_level0.metis new file mode 100644 index 0000000..17fef31 --- /dev/null +++ b/doc/Examples/trimesh_dgraph_level0.metis @@ -0,0 +1,13 @@ +12 14 +2 11 +1 3 +2 4 12 +3 5 +4 6 +5 7 12 +6 8 +7 9 +8 10 +9 11 12 +1 10 +3 6 10 diff --git a/doc/Examples/trimesh_dgraph_level0.metis.part.2 b/doc/Examples/trimesh_dgraph_level0.metis.part.2 new file mode 100644 index 0000000..932bdd1 --- /dev/null +++ b/doc/Examples/trimesh_dgraph_level0.metis.part.2 @@ -0,0 +1,12 @@ +0 +1 +1 +1 +1 +1 +0 +0 +0 +0 +0 +1 diff --git a/doc/Examples/trimesh_dgraph_level0.metis.part.3 b/doc/Examples/trimesh_dgraph_level0.metis.part.3 new file mode 100644 index 0000000..82e1d15 --- /dev/null +++ b/doc/Examples/trimesh_dgraph_level0.metis.part.3 @@ -0,0 +1,12 @@ +1 +1 +2 +2 +2 +0 +0 +0 +0 +1 +1 +2 diff --git a/doc/Examples/trimesh_dnode_level1.metis b/doc/Examples/trimesh_dnode_level1.metis new file mode 100644 index 0000000..ac60ffd --- /dev/null +++ b/doc/Examples/trimesh_dnode_level1.metis @@ -0,0 +1,49 @@ +24 35 +%1 +2 8 +%2 +1 9 10 +%3 +4 10 11 +%4 +3 14 15 +%5 +6 13 15 +%6 +5 7 +%7 +6 21 23 +%8 +1 21 22 +%9 +2 12 17 +%10 +2 3 12 +%11 +3 12 19 +%12 +9 10 11 +%13 +5 16 18 +%14 +4 16 19 +%15 +4 5 16 +%16 +13 14 15 +%17 +9 20 22 +%18 +13 20 23 +%19 +11 14 20 +%20 +17 18 19 +%21 +7 8 24 +%22 +8 17 24 +%23 +7 18 24 +%24 +21 22 23 diff --git a/doc/Examples/trimesh_dnode_level1.metis.part.2 b/doc/Examples/trimesh_dnode_level1.metis.part.2 new file mode 100644 index 0000000..4324494 --- /dev/null +++ b/doc/Examples/trimesh_dnode_level1.metis.part.2 @@ -0,0 +1,24 @@ +1 +1 +0 +0 +0 +0 +1 +1 +1 +1 +0 +1 +0 +0 +0 +0 +1 +0 +0 +0 +1 +1 +1 +1 diff --git a/doc/Examples/trimesh_level0.metis b/doc/Examples/trimesh_level0.metis new file mode 100644 index 0000000..60e7a0b --- /dev/null +++ b/doc/Examples/trimesh_level0.metis @@ -0,0 +1,13 @@ +12 1 +1 2 3 +2 3 4 +3 4 6 +4 5 6 +5 6 7 +6 7 8 +7 8 11 +8 10 11 +8 9 10 +3 8 9 +1 3 9 +3 6 8 diff --git a/doc/Examples/trimesh_level0.metis.epart.2 b/doc/Examples/trimesh_level0.metis.epart.2 new file mode 100644 index 0000000..0302f5a --- /dev/null +++ b/doc/Examples/trimesh_level0.metis.epart.2 @@ -0,0 +1,12 @@ +1 +1 +1 +1 +0 +0 +0 +0 +0 +0 +1 +1 diff --git a/doc/Examples/trimesh_level0.metis.ngraph b/doc/Examples/trimesh_level0.metis.ngraph new file mode 100644 index 0000000..66b8473 --- /dev/null +++ b/doc/Examples/trimesh_level0.metis.ngraph @@ -0,0 +1,12 @@ +11 22 + 2 3 9 + 1 3 4 + 1 2 4 6 8 9 + 2 3 6 5 + 4 6 7 + 3 4 5 7 8 + 5 6 8 11 + 6 7 11 10 9 3 + 8 10 3 1 + 8 11 9 + 7 8 10 \ No newline at end of file diff --git a/doc/Examples/trimesh_level0.metis.npart.2 b/doc/Examples/trimesh_level0.metis.npart.2 new file mode 100644 index 0000000..aa2eb92 --- /dev/null +++ b/doc/Examples/trimesh_level0.metis.npart.2 @@ -0,0 +1,11 @@ +1 +1 +1 +1 +1 +0 +0 +0 +0 +0 +0 diff --git a/doc/Examples/trimesh_level1.metis b/doc/Examples/trimesh_level1.metis new file mode 100644 index 0000000..56def42 --- /dev/null +++ b/doc/Examples/trimesh_level1.metis @@ -0,0 +1,41 @@ +20 43 +%1 +2 3 11 +%2 +1 3 4 +%3 +1 2 14 13 18 20 +%4 +2 14 12 6 +%5 +12 6 15 17 13 +%6 +4 5 7 +%7 +6 15 16 9 +%8 +9 10 19 18 17 16 +%9 +7 8 10 +%10 +8 9 11 +%11 +1 20 19 10 +%12 +4 14 13 5 +%13 +3 14 12 5 17 18 +%14 +3 13 12 4 +%15 +5 17 17 7 +%16 +7 8 17 15 +%17 +5 15 16 8 18 13 +%18 +3 13 17 8 19 20 +%19 +8 11 20 18 +%20 +3 18 19 11 diff --git a/doc/Examples/trimesh_level1.metis.part.2 b/doc/Examples/trimesh_level1.metis.part.2 new file mode 100644 index 0000000..73e4d78 --- /dev/null +++ b/doc/Examples/trimesh_level1.metis.part.2 @@ -0,0 +1,20 @@ +1 +1 +1 +0 +0 +0 +0 +1 +1 +1 +1 +0 +0 +0 +0 +0 +0 +1 +1 +1 diff --git a/doc/H5.dox b/doc/H5.dox new file mode 100644 index 0000000..374ec09 --- /dev/null +++ b/doc/H5.dox @@ -0,0 +1,84 @@ +/*! +\mainpage H5hut: A High-Performance I/O Library for Particle-based Simulations + +Particle-based simulations running on large high-performance computing systems +over many time steps can generate an enormous amount of particle- and +field-based data for post-processing and analysis. Achieving high-performance +I/O for this data, effectively managing it on disk, and interfacing it with +analysis and visualization tools can be challenging, especially for domain +scientists who do not have I/O and data management expertise. We present the +H5hut library, an implementation of several data models for particle-based +simulations that encapsulates the complexity of HDF5 and is simple to use, yet +does not compromise performance. + +Developers: + +
    +
  • Andreas Adelmann (PSI)
  • +
  • Achim Gsell (PSI)
  • +
  • Benedikt Oswald (PSI)
  • +
  • Mark Howison (NERSC/LBNL)
  • +
  • Prabhat (NERSC/LBNL)
  • +
  • Wes Bethel (NERSC/LBNL)
  • +
+ +Previous developers: + +
    +
  • John Shalf (NERSC/LBNL)
  • +
  • Cristina Siegerist (NERSC/LBNL)
  • +
+ +For more information, please contact the + h5part mailing list. + +*/ + +/*! + \defgroup c_api C API + @{ + \defgroup h5hut_c_api H5hut basic functions + @{ + \defgroup h5hut_file file handling + \defgroup h5hut_error error handling + \defgroup h5hut_model setting up the data model + \defgroup h5hut_attrib reading and writing attributes + @} + \defgroup h5part_c_api H5Part + @{ + \defgroup h5part_model setting up the data model + \defgroup h5part_data reading and writing datasets + @} + \defgroup h5block_c_api H5Block + @{ + \defgroup h5block_model setting up the data model + \defgroup h5block_data reading and writing datasets + \defgroup h5block_attrib reading and writing attributes + @} + @} +*/ + +/*! + \defgroup f90_api Fortran90 API + @{ + \defgroup h5hut_f90_api H5hut basic functions + @{ + \defgroup h5hut_file_f file handling + \defgroup h5hut_error_f error handling + \defgroup h5hut_model_f setting up the data model + \defgroup h5hut_attrib_f reading and writing attributes + @} + \defgroup h5part_f90_api H5Part + @{ + \defgroup h5part_model_f setting up the data model + \defgroup h5part_data_f reading and writing datasets + @} + \defgroup h5block_f90_api H5Block + @{ + \defgroup h5block_model_f setting up the data model + \defgroup h5block_data_f reading and writing datasets + \defgroup h5block_attrib_f reading and writing attributes + @} + @} +*/ + diff --git a/doc/H5X_File_Format.txt b/doc/H5X_File_Format.txt new file mode 100644 index 0000000..dc0d0f3 --- /dev/null +++ b/doc/H5X_File_Format.txt @@ -0,0 +1,170 @@ +Proposal for a more general file format used by H5Part/H5Block + + Authors: Achim Gsell + Status: Draft + +1. Introduction + +H5X is the file format used by H5Part and H5Block. H5X is designed on +top of HDF5: A H5X file is a very special HDF5 file. + + +--------------------+ + | Application | + +--------------------+ + | H5Part/H5Block API | + +--------------------+ + | H5X API | + +--------------------+ + | HDF5 API | + +--------------------+ + | Filesystem of OS | + +--------------------+ + + +2. H5X file format specification + +2.1 The root group + +2.1.1 File attributes + +Attributes of the HDF5 root group are called "file attributes". There +are no restrictions on file attribute names. Names with "__" as prefix and +postfix are intended for internal use. Supported values for file attributes +are scalars and arrays of 64bit integer and 64bit floating point number as +well as string values. Arrays of strings are not supported. + +2.1.1.1 Predefined file attributes + +__stepname__ (optional) + See below. + +__stepnumwidth__ (optional) + See below. + +2.1.2 Members of the root group + +Members of the root group are special formated HDF5 groups called +"step groups". The name of a step group is "#". +Whereby is either defined by the optional file attribute +__stepname__ or set to "Step" by default. is an +unsigned integer less than 2^63. + +/ ++- Step#0 ++- Step#1 +... ++- Step#n ++- StepProperties [NEW] ++- Mesh [NEW] + +The optional file attribute __stepnumwidth__ defines the minimum width +of in the name of the step group. The number is padded with +'0'. The minimum width defaults to zero, so that no paddings occurs. +Example: With __stepnumwidth__ := 5 the name of the step group with +number 42 is "Step#00042", with __stepnumwidth__ := 0 the name is +"Step#42". + +Step groups may be unsorted in the HDF5 file und needn't be number +consecutively. + +2.1.3 Other members of the root group + +Other sub-groups of the root group are allowed, but the group names are restricted +to names not matching "Step#.*". + +2.2 Format of a step group + +2.2.1 Step attributes + +Step attributes are HDF5 attributes asigned to a step group. There +are no restrictions on step attribute names. As with file attributes names +enclosed in "__" are intended for internal use. Supported values are the same +as for file attributes: + * 64bit integer value + * arrays of 64bit integer values + * 64bit floating point number + * array of 64bit floating point number + * strings +Note that array of strings are not supported! + +2.2.2 Predefined step attributes + +No predefined step attributes exists. + + +2.2.3 Members of a step group + +Members of a step group are HDF5 datasets and optional one HDF5 group +with the name "Block". HDF5 datasets in a step group are called "step +datasets". The optional block group is called "block data". + +Mesh?! + +2.2.4 Step datasets + +Step datasets are arrays of rank 1. The dataset size must be the same +for all datasets inside a step. The size of the dataset may vary +from step to step. Array values are 64bit integer or 64bit floating +point numbers. No limitations (other than given by HDF5) are given on +step dataset names. + + +2.2.5 Block Data + +The block data group is a container for an arbitrary number of field +data. A field is a data structure to store arrays of rank m with +n-dimensional vector values. Fields are represented within HDF5 +groups. The HDF5 group name is the unique identifier for a field in +the current step. + +2.2.5.1 m-rank fields with n-dimensional-vector values + +Values are stored per dimension in separate datasets. Thus we have n +datasets for a field with n-dimensional vector values. Each dataset +corresponse to one dimension. The datasets are numbered from '0' to +'n-1'. Arrays are stored in column major order (Fortran indexing +scheme). + +/ # HDF5 root group +... ++- Step# # HDF5 group + | + +- Block # HDF5 group + | + +- # HDF5 group + | + +- 0 # HDF5 dataset, first dim of vector + +- 1 # HDF5 dataset, second dim of vector + ... + +- n-1 # HDF5 dataset, last dim of vector +... + +2.2.5.2 m-rank fields with scalar values + +Fields with scalar values are stored as special case of fields with +n-dimensional vector values with n := 1. + +/ # HDF5 root group +... ++- Step# # HDF5 group + | + +- Block # HDF5 group + | + +- # HDF5 group + | + +- 0 # HDF5 dataset, scalar value +... + + +2.3 Step properties [NEW] + +Why? Much faster than step attributes if you need to access consecutive values + +Group of root group with name "StepProperties" + +Members are datasets + +Supported values are the same as for step attributes + +Mapping of value to step via object index of step group + diff --git a/doc/Makefile.am b/doc/Makefile.am new file mode 100644 index 0000000..9fb9c13 --- /dev/null +++ b/doc/Makefile.am @@ -0,0 +1,14 @@ +EXTRA_DIST = \ + Doxyfile \ + H5.dox + +all: + +doc: + +doxydoc: + doxygen + +clean-local: + $(RM) -r ReferencePages TWiki + $(RM) *~ diff --git a/doc/TracFooter.html b/doc/TracFooter.html new file mode 100644 index 0000000..139597f --- /dev/null +++ b/doc/TracFooter.html @@ -0,0 +1,2 @@ + + diff --git a/doc/TracHeader.html b/doc/TracHeader.html new file mode 100644 index 0000000..0172b3c --- /dev/null +++ b/doc/TracHeader.html @@ -0,0 +1,4 @@ + + diff --git a/doc/doxyfooter b/doc/doxyfooter new file mode 100644 index 0000000..e04310f --- /dev/null +++ b/doc/doxyfooter @@ -0,0 +1,2 @@ + + diff --git a/doc/doxyheader b/doc/doxyheader new file mode 100644 index 0000000..7065a9f --- /dev/null +++ b/doc/doxyheader @@ -0,0 +1,6 @@ + + + H5/H5Part/H5Block/H5Fed API + + + diff --git a/doc/html2twiki b/doc/html2twiki new file mode 100755 index 0000000..2a6646e --- /dev/null +++ b/doc/html2twiki @@ -0,0 +1,36 @@ +#!/bin/bash + +shopt -s nullglob + +function html2twiki() { + declare -rx infile=$1 + declare -rx outdir=$2 + declare -rx fname=$( sed -n 's/.* member="\([a-zA-Z0-9_.]*\)::\([_a-zA-Z0-9]*\)" .*/\2/p' "${infile}" ) + declare -rx outfile="${outdir}/${fname}.txt" + + grep -q " member=" "${infile}" || return 0 + + sed '/Generated by/,/anchor/d' "${infile}" > "${outfile}" +} + +mkdir -p TWiki/h5_core +mkdir -p TWiki/H5 +mkdir -p TWiki/H5Part +mkdir -p TWiki/H5Block +mkdir -p TWiki/H5Fed + +for f in ReferencePages/group__h5__core_*.html; do + html2twiki $f TWiki/h5_core +done +for f in ReferencePages/group__h5__c__api_*.html; do + html2twiki $f TWiki/H5 +done +for f in ReferencePages/group__h5part__c__api_*.html; do + html2twiki $f TWiki/H5Part +done +for f in ReferencePages/group__h5block__c__api_*.html; do + html2twiki $f TWiki/H5Block +done +for f in ReferencePages/group__h5fed__c__api_*.html; do + html2twiki $f TWiki/H5Fed +done diff --git a/doc/meshexample.dxf b/doc/meshexample.dxf new file mode 100644 index 0000000..3b139b4 --- /dev/null +++ b/doc/meshexample.dxf @@ -0,0 +1,6982 @@ +999 +dxflib 2.1.2.0 + 0 +SECTION + 2 +HEADER + 9 +$ACADVER + 1 +AC1015 + 9 +$HANDSEED + 5 +FFFF + 9 +$DIMASZ + 40 +2.5 + 9 +$PLIMMIN + 10 +0.0 + 20 +0.0 + 9 +$DIMEXE + 40 +1.25 + 9 +$DIMGAP + 40 +0.625 + 9 +$PLIMMAX + 10 +210.0 + 20 +297.0 + 9 +$PSVPSCALE + 40 +0.7295160000000001 + 9 +$PINSBASE + 10 +19.7952181877565074 + 20 +121.5358650546580606 + 30 +0.0 + 9 +$INSUNITS + 70 +4 + 9 +$DIMEXO + 40 +0.625 + 9 +$DIMTXT + 40 +2.5 + 9 +$CLAYER + 8 +2-Triangles + 0 +ENDSEC + 0 +SECTION + 2 +TABLES + 0 +TABLE + 2 +VPORT + 5 +8 +100 +AcDbSymbolTable + 70 +1 + 0 +VPORT + 5 +30 +100 +AcDbSymbolTableRecord +100 +AcDbViewportTableRecord + 2 +*Active + 70 +0 + 10 +0.0 + 20 +0.0 + 11 +1.0 + 21 +1.0 + 12 +286.3055555555554861 + 22 +148.5 + 13 +0.0 + 23 +0.0 + 14 +10.0 + 24 +10.0 + 15 +10.0 + 25 +10.0 + 16 +0.0 + 26 +0.0 + 36 +1.0 + 17 +0.0 + 27 +0.0 + 37 +0.0 + 40 +297.0 + 41 +1.92798353909465 + 42 +50.0 + 43 +0.0 + 44 +0.0 + 50 +0.0 + 51 +0.0 + 71 +0 + 72 +100 + 73 +1 + 74 +3 + 75 +1 + 76 +1 + 77 +0 + 78 +0 +281 +0 + 65 +1 +110 +0.0 +120 +0.0 +130 +0.0 +111 +1.0 +121 +0.0 +131 +0.0 +112 +0.0 +122 +1.0 +132 +0.0 + 79 +0 +146 +0.0 + 0 +ENDTAB + 0 +TABLE + 2 +LTYPE + 5 +5 +100 +AcDbSymbolTable + 70 +21 + 0 +LTYPE + 5 +14 +100 +AcDbSymbolTableRecord +100 +AcDbLinetypeTableRecord + 2 +ByBlock + 70 +0 + 3 + + 72 +65 + 73 +0 + 40 +0.0 + 0 +LTYPE + 5 +15 +100 +AcDbSymbolTableRecord +100 +AcDbLinetypeTableRecord + 2 +ByLayer + 70 +0 + 3 + + 72 +65 + 73 +0 + 40 +0.0 + 0 +LTYPE + 5 +16 +100 +AcDbSymbolTableRecord +100 +AcDbLinetypeTableRecord + 2 +CONTINUOUS + 70 +0 + 3 +Solid line + 72 +65 + 73 +0 + 40 +0.0 + 0 +LTYPE + 5 +31 +100 +AcDbSymbolTableRecord +100 +AcDbLinetypeTableRecord + 2 +DOT + 70 +0 + 3 +Dot . . . . . . . . . . . . . . . . . . . . . . + 72 +65 + 73 +2 + 40 +6.3499999999999996 + 49 +0.0 + 74 +0 + 49 +-6.3499999999999996 + 74 +0 + 0 +LTYPE + 5 +32 +100 +AcDbSymbolTableRecord +100 +AcDbLinetypeTableRecord + 2 +DOT2 + 70 +0 + 3 +Dot (.5x) ..................................... + 72 +65 + 73 +2 + 40 +3.1749999999999998 + 49 +0.0 + 74 +0 + 49 +-3.1749999999999998 + 74 +0 + 0 +LTYPE + 5 +33 +100 +AcDbSymbolTableRecord +100 +AcDbLinetypeTableRecord + 2 +DOTX2 + 70 +0 + 3 +Dot (2x) . . . . . . . . . . . . . + 72 +65 + 73 +2 + 40 +12.6999999999999993 + 49 +0.0 + 74 +0 + 49 +-12.6999999999999993 + 74 +0 + 0 +LTYPE + 5 +34 +100 +AcDbSymbolTableRecord +100 +AcDbLinetypeTableRecord + 2 +DASHED + 70 +0 + 3 +Dashed __ __ __ __ __ __ __ __ __ __ __ __ __ _ + 72 +65 + 73 +2 + 40 +19.0500000000000007 + 49 +12.6999999999999993 + 74 +0 + 49 +-6.3499999999999996 + 74 +0 + 0 +LTYPE + 5 +35 +100 +AcDbSymbolTableRecord +100 +AcDbLinetypeTableRecord + 2 +DASHED2 + 70 +0 + 3 +Dashed (.5x) _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ + 72 +65 + 73 +2 + 40 +9.5250000000000004 + 49 +6.3499999999999996 + 74 +0 + 49 +-3.1749999999999998 + 74 +0 + 0 +LTYPE + 5 +36 +100 +AcDbSymbolTableRecord +100 +AcDbLinetypeTableRecord + 2 +DASHEDX2 + 70 +0 + 3 +Dashed (2x) ____ ____ ____ ____ ____ ___ + 72 +65 + 73 +2 + 40 +38.1000000000000014 + 49 +25.3999999999999986 + 74 +0 + 49 +-12.6999999999999993 + 74 +0 + 0 +LTYPE + 5 +37 +100 +AcDbSymbolTableRecord +100 +AcDbLinetypeTableRecord + 2 +DASHDOT + 70 +0 + 3 +Dash dot __ . __ . __ . __ . __ . __ . __ . __ + 72 +65 + 73 +4 + 40 +25.3999999999999986 + 49 +12.6999999999999993 + 74 +0 + 49 +-6.3499999999999996 + 74 +0 + 49 +0.0 + 74 +0 + 49 +-6.3499999999999996 + 74 +0 + 0 +LTYPE + 5 +38 +100 +AcDbSymbolTableRecord +100 +AcDbLinetypeTableRecord + 2 +DASHDOT2 + 70 +0 + 3 +Dash dot (.5x) _._._._._._._._._._._._._._._. + 72 +65 + 73 +4 + 40 +12.6999999999999993 + 49 +6.3499999999999996 + 74 +0 + 49 +-3.1749999999999998 + 74 +0 + 49 +0.0 + 74 +0 + 49 +-3.1749999999999998 + 74 +0 + 0 +LTYPE + 5 +39 +100 +AcDbSymbolTableRecord +100 +AcDbLinetypeTableRecord + 2 +DASHDOTX2 + 70 +0 + 3 +Dash dot (2x) ____ . ____ . ____ . ___ + 72 +65 + 73 +4 + 40 +50.7999999999999972 + 49 +25.3999999999999986 + 74 +0 + 49 +-12.6999999999999993 + 74 +0 + 49 +0.0 + 74 +0 + 49 +-12.6999999999999993 + 74 +0 + 0 +LTYPE + 5 +3A +100 +AcDbSymbolTableRecord +100 +AcDbLinetypeTableRecord + 2 +DIVIDE + 70 +0 + 3 +Divide ____ . . ____ . . ____ . . ____ . . ____ + 72 +65 + 73 +6 + 40 +31.75 + 49 +12.6999999999999993 + 74 +0 + 49 +-6.3499999999999996 + 74 +0 + 49 +0.0 + 74 +0 + 49 +-6.3499999999999996 + 74 +0 + 49 +0.0 + 74 +0 + 49 +-6.3499999999999996 + 74 +0 + 0 +LTYPE + 5 +3B +100 +AcDbSymbolTableRecord +100 +AcDbLinetypeTableRecord + 2 +DIVIDE2 + 70 +0 + 3 +Divide (.5x) __..__..__..__..__..__..__..__.._ + 72 +65 + 73 +6 + 40 +15.875 + 49 +6.3499999999999996 + 74 +0 + 49 +-3.1749999999999998 + 74 +0 + 49 +0.0 + 74 +0 + 49 +-3.1749999999999998 + 74 +0 + 49 +0.0 + 74 +0 + 49 +-3.1749999999999998 + 74 +0 + 0 +LTYPE + 5 +3C +100 +AcDbSymbolTableRecord +100 +AcDbLinetypeTableRecord + 2 +DIVIDEX2 + 70 +0 + 3 +Divide (2x) ________ . . ________ . . _ + 72 +65 + 73 +6 + 40 +63.5 + 49 +25.3999999999999986 + 74 +0 + 49 +-12.6999999999999993 + 74 +0 + 49 +0.0 + 74 +0 + 49 +-12.6999999999999993 + 74 +0 + 49 +0.0 + 74 +0 + 49 +-12.6999999999999993 + 74 +0 + 0 +LTYPE + 5 +3D +100 +AcDbSymbolTableRecord +100 +AcDbLinetypeTableRecord + 2 +CENTER + 70 +0 + 3 +Center ____ _ ____ _ ____ _ ____ _ ____ _ ____ + 72 +65 + 73 +4 + 40 +50.7999999999999972 + 49 +31.75 + 74 +0 + 49 +-6.3499999999999996 + 74 +0 + 49 +6.3499999999999996 + 74 +0 + 49 +-6.3499999999999996 + 74 +0 + 0 +LTYPE + 5 +3E +100 +AcDbSymbolTableRecord +100 +AcDbLinetypeTableRecord + 2 +CENTER2 + 70 +0 + 3 +Center (.5x) ___ _ ___ _ ___ _ ___ _ ___ _ ___ + 72 +65 + 73 +4 + 40 +28.5749999999999993 + 49 +19.0500000000000007 + 74 +0 + 49 +-3.1749999999999998 + 74 +0 + 49 +3.1749999999999998 + 74 +0 + 49 +-3.1749999999999998 + 74 +0 + 0 +LTYPE + 5 +3F +100 +AcDbSymbolTableRecord +100 +AcDbLinetypeTableRecord + 2 +CENTERX2 + 70 +0 + 3 +Center (2x) ________ __ ________ __ _____ + 72 +65 + 73 +4 + 40 +101.5999999999999943 + 49 +63.5 + 74 +0 + 49 +-12.6999999999999993 + 74 +0 + 49 +12.6999999999999993 + 74 +0 + 49 +-12.6999999999999993 + 74 +0 + 0 +LTYPE + 5 +40 +100 +AcDbSymbolTableRecord +100 +AcDbLinetypeTableRecord + 2 +BORDER + 70 +0 + 3 +Border __ __ . __ __ . __ __ . __ __ . __ __ . + 72 +65 + 73 +6 + 40 +44.4500000000000028 + 49 +12.6999999999999993 + 74 +0 + 49 +-6.3499999999999996 + 74 +0 + 49 +12.6999999999999993 + 74 +0 + 49 +-6.3499999999999996 + 74 +0 + 49 +0.0 + 74 +0 + 49 +-6.3499999999999996 + 74 +0 + 0 +LTYPE + 5 +41 +100 +AcDbSymbolTableRecord +100 +AcDbLinetypeTableRecord + 2 +BORDER2 + 70 +0 + 3 +Border (.5x) __.__.__.__.__.__.__.__.__.__.__. + 72 +65 + 73 +6 + 40 +22.2250000000000014 + 49 +6.3499999999999996 + 74 +0 + 49 +-3.1749999999999998 + 74 +0 + 49 +6.3499999999999996 + 74 +0 + 49 +-3.1749999999999998 + 74 +0 + 49 +0.0 + 74 +0 + 49 +-3.1749999999999998 + 74 +0 + 0 +LTYPE + 5 +42 +100 +AcDbSymbolTableRecord +100 +AcDbLinetypeTableRecord + 2 +BORDERX2 + 70 +0 + 3 +Border (2x) ____ ____ . ____ ____ . ___ + 72 +65 + 73 +6 + 40 +88.9000000000000057 + 49 +25.3999999999999986 + 74 +0 + 49 +-12.6999999999999993 + 74 +0 + 49 +25.3999999999999986 + 74 +0 + 49 +-12.6999999999999993 + 74 +0 + 49 +0.0 + 74 +0 + 49 +-12.6999999999999993 + 74 +0 + 0 +ENDTAB + 0 +TABLE + 2 +LAYER + 5 +2 +100 +AcDbSymbolTable + 70 +9 + 0 +LAYER + 5 +10 +100 +AcDbSymbolTableRecord +100 +AcDbLayerTableRecord + 2 +0 + 70 +0 + 62 +7 + 6 +CONTINUOUS +370 +120 +390 +F + 0 +LAYER + 5 +43 +100 +AcDbSymbolTableRecord +100 +AcDbLayerTableRecord + 2 +1 + 70 +0 + 62 +1 + 6 +CONTINUOUS +370 +60 +390 +F + 0 +LAYER + 5 +44 +100 +AcDbSymbolTableRecord +100 +AcDbLayerTableRecord + 2 +2 + 70 +0 + 62 +3 + 6 +CONTINUOUS +370 +20 +390 +F + 0 +LAYER + 5 +45 +100 +AcDbSymbolTableRecord +100 +AcDbLayerTableRecord + 2 +0-Vertices + 70 +0 + 62 +7 + 6 +CONTINUOUS +370 +0 +390 +F + 0 +LAYER + 5 +46 +100 +AcDbSymbolTableRecord +100 +AcDbLayerTableRecord + 2 +1-Vertices + 70 +0 + 62 +1 + 6 +CONTINUOUS +370 +0 +390 +F + 0 +LAYER + 5 +47 +100 +AcDbSymbolTableRecord +100 +AcDbLayerTableRecord + 2 +2-Vertices + 70 +0 + 62 +3 + 6 +CONTINUOUS +370 +0 +390 +F + 0 +LAYER + 5 +48 +100 +AcDbSymbolTableRecord +100 +AcDbLayerTableRecord + 2 +0-Triangles + 70 +0 + 62 +7 + 6 +CONTINUOUS +370 +0 +390 +F + 0 +LAYER + 5 +49 +100 +AcDbSymbolTableRecord +100 +AcDbLayerTableRecord + 2 +1-Triangles + 70 +0 + 62 +1 + 6 +CONTINUOUS +370 +0 +390 +F + 0 +LAYER + 5 +4A +100 +AcDbSymbolTableRecord +100 +AcDbLayerTableRecord + 2 +2-Triangles + 70 +0 + 62 +3 + 6 +CONTINUOUS +370 +0 +390 +F + 0 +ENDTAB + 0 +TABLE + 2 +STYLE + 5 +3 +100 +AcDbSymbolTable + 70 +1 + 0 +STYLE + 5 +11 +100 +AcDbSymbolTableRecord +100 +AcDbTextStyleTableRecord + 2 +Standard + 70 +0 + 40 +0.0 + 41 +0.75 + 50 +0.0 + 71 +0 + 42 +2.5 + 3 +txt + 4 + + 0 +ENDTAB + 0 +TABLE + 2 +VIEW + 5 +6 +100 +AcDbSymbolTable + 70 +0 + 0 +ENDTAB + 0 +TABLE + 2 +UCS + 5 +7 +100 +AcDbSymbolTable + 70 +0 + 0 +ENDTAB + 0 +TABLE + 2 +APPID + 5 +9 +100 +AcDbSymbolTable + 70 +1 + 0 +APPID + 5 +12 +100 +AcDbSymbolTableRecord +100 +AcDbRegAppTableRecord + 2 +ACAD + 70 +0 + 0 +ENDTAB + 0 +TABLE + 2 +DIMSTYLE + 5 +A +100 +AcDbSymbolTable + 70 +1 +100 +AcDbDimStyleTable + 71 +0 + 0 +DIMSTYLE +105 +27 +100 +AcDbSymbolTableRecord +100 +AcDbDimStyleTableRecord + 2 +Standard + 41 +2.5 + 42 +0.625 + 43 +3.75 + 44 +1.25 + 70 +0 + 73 +0 + 74 +0 + 77 +1 + 78 +8 +140 +2.5 +141 +2.5 +143 +0.03937007874016 +147 +0.625 +171 +3 +172 +1 +271 +2 +272 +2 +274 +3 +278 +44 +283 +0 +284 +8 +340 +11 + 0 +ENDTAB + 0 +TABLE + 2 +BLOCK_RECORD + 5 +1 +100 +AcDbSymbolTable + 70 +1 + 0 +BLOCK_RECORD + 5 +1F +100 +AcDbSymbolTableRecord +100 +AcDbBlockTableRecord + 2 +*Model_Space +340 +22 + 0 +BLOCK_RECORD + 5 +1B +100 +AcDbSymbolTableRecord +100 +AcDbBlockTableRecord + 2 +*Paper_Space +340 +1E + 0 +BLOCK_RECORD + 5 +23 +100 +AcDbSymbolTableRecord +100 +AcDbBlockTableRecord + 2 +*Paper_Space0 +340 +26 + 0 +ENDTAB + 0 +ENDSEC + 0 +SECTION + 2 +BLOCKS + 0 +BLOCK + 5 +20 +100 +AcDbEntity + 8 +0 +100 +AcDbBlockBegin + 2 +*Model_Space + 70 +0 + 10 +0.0 + 20 +0.0 + 30 +0.0 + 3 +*Model_Space + 1 + + 0 +ENDBLK + 5 +21 +100 +AcDbEntity + 8 +0 +100 +AcDbBlockEnd + 0 +BLOCK + 5 +1C +100 +AcDbEntity + 67 +1 + 8 +0 +100 +AcDbBlockBegin + 2 +*Paper_Space + 70 +0 + 10 +0.0 + 20 +0.0 + 30 +0.0 + 3 +*Paper_Space + 1 + + 0 +ENDBLK + 5 +1D +100 +AcDbEntity + 67 +1 + 8 +0 +100 +AcDbBlockEnd + 0 +BLOCK + 5 +24 +100 +AcDbEntity + 8 +0 +100 +AcDbBlockBegin + 2 +*Paper_Space0 + 70 +0 + 10 +0.0 + 20 +0.0 + 30 +0.0 + 3 +*Paper_Space0 + 1 + + 0 +ENDBLK + 5 +25 +100 +AcDbEntity + 8 +0 +100 +AcDbBlockEnd + 0 +ENDSEC + 0 +SECTION + 2 +ENTITIES + 0 +LINE + 5 +4B +100 +AcDbEntity +100 +AcDbLine + 8 +0 + 62 +256 +370 +-1 + 6 +ByLayer + 10 +0.0 + 20 +0.0 + 30 +0.0 + 11 +50.0 + 21 +80.0 + 31 +0.0 + 0 +LINE + 5 +4C +100 +AcDbEntity +100 +AcDbLine + 8 +0 + 62 +256 +370 +-1 + 6 +ByLayer + 10 +50.0 + 20 +80.0 + 30 +0.0 + 11 +90.0 + 21 +-10.0 + 31 +0.0 + 0 +LINE + 5 +4D +100 +AcDbEntity +100 +AcDbLine + 8 +0 + 62 +256 +370 +-1 + 6 +ByLayer + 10 +90.0 + 20 +-10.0 + 30 +0.0 + 11 +0.0 + 21 +0.0 + 31 +0.0 + 0 +LINE + 5 +4E +100 +AcDbEntity +100 +AcDbLine + 8 +0 + 62 +256 +370 +-1 + 6 +ByLayer + 10 +50.0 + 20 +80.0 + 30 +0.0 + 11 +140.0 + 21 +90.0 + 31 +0.0 + 0 +LINE + 5 +4F +100 +AcDbEntity +100 +AcDbLine + 8 +0 + 62 +256 +370 +-1 + 6 +ByLayer + 10 +140.0 + 20 +90.0 + 30 +0.0 + 11 +90.0 + 21 +-10.0 + 31 +0.0 + 0 +LINE + 5 +50 +100 +AcDbEntity +100 +AcDbLine + 8 +0 + 62 +256 +370 +-1 + 6 +ByLayer + 10 +90.0 + 20 +-10.0 + 30 +0.0 + 11 +180.0 + 21 +-10.0 + 31 +0.0 + 0 +LINE + 5 +51 +100 +AcDbEntity +100 +AcDbLine + 8 +0 + 62 +256 +370 +-1 + 6 +ByLayer + 10 +180.0 + 20 +-10.0 + 30 +0.0 + 11 +140.0 + 21 +90.0 + 31 +0.0 + 0 +LINE + 5 +52 +100 +AcDbEntity +100 +AcDbLine + 8 +0 + 62 +256 +370 +-1 + 6 +ByLayer + 10 +140.0 + 20 +90.0 + 30 +0.0 + 11 +220.0 + 21 +60.0 + 31 +0.0 + 0 +LINE + 5 +53 +100 +AcDbEntity +100 +AcDbLine + 8 +0 + 62 +256 +370 +-1 + 6 +ByLayer + 10 +220.0 + 20 +60.0 + 30 +0.0 + 11 +180.0 + 21 +-10.0 + 31 +0.0 + 0 +LINE + 5 +54 +100 +AcDbEntity +100 +AcDbLine + 8 +0 + 62 +256 +370 +-1 + 6 +ByLayer + 10 +180.0 + 20 +-10.0 + 30 +0.0 + 11 +140.0 + 21 +-70.0 + 31 +0.0 + 0 +LINE + 5 +55 +100 +AcDbEntity +100 +AcDbLine + 8 +0 + 62 +256 +370 +-1 + 6 +ByLayer + 10 +140.0 + 20 +-70.0 + 30 +0.0 + 11 +90.0 + 21 +-10.0 + 31 +0.0 + 0 +LINE + 5 +56 +100 +AcDbEntity +100 +AcDbLine + 8 +0 + 62 +256 +370 +-1 + 6 +ByLayer + 10 +90.0 + 20 +-10.0 + 30 +0.0 + 11 +60.0 + 21 +-70.0 + 31 +0.0 + 0 +LINE + 5 +57 +100 +AcDbEntity +100 +AcDbLine + 8 +0 + 62 +256 +370 +-1 + 6 +ByLayer + 10 +60.0 + 20 +-70.0 + 30 +0.0 + 11 +140.0 + 21 +-70.0 + 31 +0.0 + 0 +LINE + 5 +58 +100 +AcDbEntity +100 +AcDbLine + 8 +0 + 62 +256 +370 +-1 + 6 +ByLayer + 10 +0.0 + 20 +0.0 + 30 +0.0 + 11 +60.0 + 21 +-70.0 + 31 +0.0 + 0 +LINE + 5 +59 +100 +AcDbEntity +100 +AcDbLine + 8 +0 + 62 +256 +370 +-1 + 6 +ByLayer + 10 +140.0 + 20 +-70.0 + 30 +0.0 + 11 +240.0 + 21 +-60.0 + 31 +0.0 + 0 +LINE + 5 +5A +100 +AcDbEntity +100 +AcDbLine + 8 +0 + 62 +256 +370 +-1 + 6 +ByLayer + 10 +240.0 + 20 +-60.0 + 30 +0.0 + 11 +180.0 + 21 +-10.0 + 31 +0.0 + 0 +LINE + 5 +5B +100 +AcDbEntity +100 +AcDbLine + 8 +0 + 62 +256 +370 +-1 + 6 +ByLayer + 10 +220.0 + 20 +60.0 + 30 +0.0 + 11 +240.0 + 21 +-60.0 + 31 +0.0 + 0 +LINE + 5 +5C +100 +AcDbEntity +100 +AcDbLine + 8 +0 + 62 +256 +370 +-1 + 6 +ByLayer + 10 +50.0 + 20 +80.0 + 30 +0.0 + 11 +130.0 + 21 +150.0 + 31 +0.0 + 0 +LINE + 5 +5D +100 +AcDbEntity +100 +AcDbLine + 8 +0 + 62 +256 +370 +-1 + 6 +ByLayer + 10 +130.0 + 20 +150.0 + 30 +0.0 + 11 +140.0 + 21 +90.0 + 31 +0.0 + 0 +LINE + 5 +5E +100 +AcDbEntity +100 +AcDbLine + 8 +0 + 62 +256 +370 +-1 + 6 +ByLayer + 10 +140.0 + 20 +90.0 + 30 +0.0 + 11 +200.0 + 21 +120.0 + 31 +0.0 + 0 +LINE + 5 +5F +100 +AcDbEntity +100 +AcDbLine + 8 +0 + 62 +256 +370 +-1 + 6 +ByLayer + 10 +130.0 + 20 +150.0 + 30 +0.0 + 11 +200.0 + 21 +120.0 + 31 +0.0 + 0 +LINE + 5 +60 +100 +AcDbEntity +100 +AcDbLine + 8 +0 + 62 +256 +370 +-1 + 6 +ByLayer + 10 +200.0 + 20 +120.0 + 30 +0.0 + 11 +220.0 + 21 +60.0 + 31 +0.0 + 0 +LINE + 5 +61 +100 +AcDbEntity +100 +AcDbLine + 8 +1 + 62 +256 +370 +-1 + 6 +ByLayer + 10 +115.0000891911591054 + 20 +40.0001783823182038 + 30 +0.0 + 11 +159.9999450076830101 + 21 +40.0001374807924535 + 31 +0.0 + 0 +LINE + 5 +62 +100 +AcDbEntity +100 +AcDbLine + 8 +1 + 62 +256 +370 +-1 + 6 +ByLayer + 10 +159.9999450076830101 + 20 +40.0001374807924535 + 30 +0.0 + 11 +135.0 + 21 +-10.0 + 31 +0.0 + 0 +LINE + 5 +63 +100 +AcDbEntity +100 +AcDbLine + 8 +1 + 62 +256 +370 +-1 + 6 +ByLayer + 10 +135.0 + 20 +-10.0 + 30 +0.0 + 11 +115.0000891911591054 + 21 +40.0001783823182038 + 31 +0.0 + 0 +LINE + 5 +64 +100 +AcDbEntity +100 +AcDbLine + 8 +1 + 62 +256 +370 +-1 + 6 +ByLayer + 10 +115.0000891911591054 + 20 +40.0001783823182038 + 30 +0.0 + 11 +68.2762309724051448 + 21 +38.8784803120884277 + 31 +0.0 + 0 +LINE + 5 +65 +100 +AcDbEntity +100 +AcDbLine + 8 +1 + 62 +256 +370 +-1 + 6 +ByLayer + 10 +68.2762309724051448 + 20 +38.8784803120884277 + 30 +0.0 + 11 +95.2752319396871599 + 21 +85.0305813266319035 + 31 +0.0 + 0 +LINE + 5 +66 +100 +AcDbEntity +100 +AcDbLine + 8 +1 + 62 +256 +370 +-1 + 6 +ByLayer + 10 +95.2752319396871599 + 20 +85.0305813266319035 + 30 +0.0 + 11 +115.0000891911591054 + 21 +40.0001783823182038 + 31 +0.0 + 0 +LINE + 5 +67 +100 +AcDbEntity +100 +AcDbLine + 8 +1 + 62 +256 +370 +-1 + 6 +ByLayer + 10 +159.9999450076830101 + 20 +40.0001374807924535 + 30 +0.0 + 11 +180.0000175342504178 + 21 +74.9999934246560827 + 31 +0.0 + 0 +LINE + 5 +68 +100 +AcDbEntity +100 +AcDbLine + 8 +1 + 62 +256 +370 +-1 + 6 +ByLayer + 10 +180.0000175342504178 + 20 +74.9999934246560827 + 30 +0.0 + 11 +201.1950554466039307 + 21 +27.0913470315568894 + 31 +0.0 + 0 +LINE + 5 +69 +100 +AcDbEntity +100 +AcDbLine + 8 +1 + 62 +256 +370 +-1 + 6 +ByLayer + 10 +201.1950554466039307 + 20 +27.0913470315568894 + 30 +0.0 + 11 +159.9999450076830101 + 21 +40.0001374807924606 + 31 +0.0 + 0 +LINE + 5 +6A +100 +AcDbEntity +100 +AcDbLine + 8 +1 + 62 +256 +370 +-1 + 6 +ByLayer + 10 +114.9999989626024757 + 20 +-39.9999987551229665 + 30 +0.0 + 11 +135.0 + 21 +-10.0 + 31 +0.0 + 0 +LINE + 5 +6B +100 +AcDbEntity +100 +AcDbLine + 8 +1 + 62 +256 +370 +-1 + 6 +ByLayer + 10 +135.0 + 20 +-10.0 + 30 +0.0 + 11 +159.9997155749006481 + 21 +-40.0004266376490492 + 31 +0.0 + 0 +LINE + 5 +6C +100 +AcDbEntity +100 +AcDbLine + 8 +1 + 62 +256 +370 +-1 + 6 +ByLayer + 10 +159.9997155749006481 + 20 +-40.0004266376490492 + 30 +0.0 + 11 +114.9999989626024757 + 21 +-39.9999987551229665 + 31 +0.0 + 0 +LINE + 5 +6D +100 +AcDbEntity +100 +AcDbLine + 8 +1 + 62 +256 +370 +-1 + 6 +ByLayer + 10 +115.0000891911591054 + 20 +40.0001783823182038 + 30 +0.0 + 11 +140.0 + 21 +90.0 + 31 +0.0 + 0 +LINE + 5 +6E +100 +AcDbEntity +100 +AcDbLine + 8 +1 + 62 +256 +370 +-1 + 6 +ByLayer + 10 +140.0 + 20 +90.0 + 30 +0.0 + 11 +95.2752319396871599 + 21 +85.0305813266319177 + 31 +0.0 + 0 +LINE + 5 +6F +100 +AcDbEntity +100 +AcDbLine + 8 +1 + 62 +256 +370 +-1 + 6 +ByLayer + 10 +95.2752319396871599 + 20 +85.0305813266319177 + 30 +0.0 + 11 +50.0 + 21 +80.0 + 31 +0.0 + 0 +LINE + 5 +70 +100 +AcDbEntity +100 +AcDbLine + 8 +1 + 62 +256 +370 +-1 + 6 +ByLayer + 10 +50.0 + 20 +80.0 + 30 +0.0 + 11 +68.2762309724051448 + 21 +38.8784803120884348 + 31 +0.0 + 0 +LINE + 5 +71 +100 +AcDbEntity +100 +AcDbLine + 8 +1 + 62 +256 +370 +-1 + 6 +ByLayer + 10 +68.2762309724051448 + 20 +38.8784803120884348 + 30 +0.0 + 11 +90.0 + 21 +-10.0 + 31 +0.0 + 0 +LINE + 5 +72 +100 +AcDbEntity +100 +AcDbLine + 8 +1 + 62 +256 +370 +-1 + 6 +ByLayer + 10 +90.0 + 20 +-10.0 + 30 +0.0 + 11 +115.0000891911591054 + 21 +40.0001783823181967 + 31 +0.0 + 0 +LINE + 5 +73 +100 +AcDbEntity +100 +AcDbLine + 8 +1 + 62 +256 +370 +-1 + 6 +ByLayer + 10 +140.0 + 20 +90.0 + 30 +0.0 + 11 +220.0 + 21 +60.0 + 31 +0.0 + 0 +LINE + 5 +74 +100 +AcDbEntity +100 +AcDbLine + 8 +1 + 62 +256 +370 +-1 + 6 +ByLayer + 10 +220.0 + 20 +60.0 + 30 +0.0 + 11 +180.0 + 21 +-10.0 + 31 +0.0 + 0 +LINE + 5 +75 +100 +AcDbEntity +100 +AcDbLine + 8 +1 + 62 +256 +370 +-1 + 6 +ByLayer + 10 +180.0 + 20 +-10.0 + 30 +0.0 + 11 +159.9999450076830385 + 21 +40.0001374807924535 + 31 +0.0 + 0 +LINE + 5 +76 +100 +AcDbEntity +100 +AcDbLine + 8 +1 + 62 +256 +370 +-1 + 6 +ByLayer + 10 +159.9999450076830385 + 20 +40.0001374807924535 + 30 +0.0 + 11 +140.0 + 21 +90.0 + 31 +0.0 + 0 +LINE + 5 +77 +100 +AcDbEntity +100 +AcDbLine + 8 +1 + 62 +256 +370 +-1 + 6 +ByLayer + 10 +90.0 + 20 +-10.0 + 30 +0.0 + 11 +180.0 + 21 +-10.0 + 31 +0.0 + 0 +LINE + 5 +78 +100 +AcDbEntity +100 +AcDbLine + 8 +1 + 62 +256 +370 +-1 + 6 +ByLayer + 10 +180.0 + 20 +-10.0 + 30 +0.0 + 11 +140.0 + 21 +-70.0 + 31 +0.0 + 0 +LINE + 5 +79 +100 +AcDbEntity +100 +AcDbLine + 8 +1 + 62 +256 +370 +-1 + 6 +ByLayer + 10 +140.0 + 20 +-70.0 + 30 +0.0 + 11 +90.0 + 21 +-10.0 + 31 +0.0 + 0 +LINE + 5 +7A +100 +AcDbEntity +100 +AcDbLine + 8 +2 + 62 +256 +370 +-1 + 6 +ByLayer + 10 +105.1376539098557146 + 20 +62.5153950486475196 + 30 +0.0 + 11 +117.6376159698435799 + 21 +87.5152906633159517 + 31 +0.0 + 0 +LINE + 5 +7B +100 +AcDbEntity +100 +AcDbLine + 8 +2 + 62 +256 +370 +-1 + 6 +ByLayer + 10 +117.6376159698435799 + 20 +87.5152906633159517 + 30 +0.0 + 11 +127.5000445955795527 + 21 +65.0000891911591054 + 31 +0.0 + 0 +LINE + 5 +7C +100 +AcDbEntity +100 +AcDbLine + 8 +2 + 62 +256 +370 +-1 + 6 +ByLayer + 10 +127.5000445955795527 + 20 +65.0000891911591054 + 30 +0.0 + 11 +105.1376539098557146 + 21 +62.5153950486475196 + 31 +0.0 + 0 +LINE + 5 +7D +100 +AcDbEntity +100 +AcDbLine + 8 +2 + 62 +256 +370 +-1 + 6 +ByLayer + 10 +137.5000391911498241 + 20 +40.0001579315352487 + 30 +0.0 + 11 +127.5000445955795527 + 21 +65.0000891911591054 + 31 +0.0 + 0 +LINE + 5 +7E +100 +AcDbEntity +100 +AcDbLine + 8 +2 + 62 +256 +370 +-1 + 6 +ByLayer + 10 +127.5000445955795527 + 20 +65.0000891911591054 + 30 +0.0 + 11 +149.9999725038415193 + 21 +65.0000687403962303 + 31 +0.0 + 0 +LINE + 5 +7F +100 +AcDbEntity +100 +AcDbLine + 8 +2 + 62 +256 +370 +-1 + 6 +ByLayer + 10 +149.9999725038415193 + 20 +65.0000687403962303 + 30 +0.0 + 11 +137.5000391911498241 + 21 +40.0001579315352487 + 31 +0.0 + 0 +LINE + 5 +80 +100 +AcDbEntity +100 +AcDbLine + 8 +2 + 62 +256 +370 +-1 + 6 +ByLayer + 10 +125.000040987657556 + 20 +15.000098211036514 + 30 +0.0 + 11 +137.5000391911498241 + 21 +40.0001579315352558 + 31 +0.0 + 0 +LINE + 5 +81 +100 +AcDbEntity +100 +AcDbLine + 8 +2 + 62 +256 +370 +-1 + 6 +ByLayer + 10 +137.5000391911498241 + 20 +40.0001579315352558 + 30 +0.0 + 11 +147.4999729933480523 + 21 +15.0000697194141779 + 31 +0.0 + 0 +LINE + 5 +82 +100 +AcDbEntity +100 +AcDbLine + 8 +2 + 62 +256 +370 +-1 + 6 +ByLayer + 10 +147.4999729933480523 + 20 +15.0000697194141779 + 30 +0.0 + 11 +125.000040987657556 + 21 +15.0000982110365175 + 31 +0.0 + 0 +LINE + 5 +83 +100 +AcDbEntity +100 +AcDbLine + 8 +2 + 62 +256 +370 +-1 + 6 +ByLayer + 10 +102.5001337867386582 + 20 +15.0002675734773092 + 30 +0.0 + 11 +125.000040987657556 + 21 +15.000098211036514 + 31 +0.0 + 0 +LINE + 5 +84 +100 +AcDbEntity +100 +AcDbLine + 8 +2 + 62 +256 +370 +-1 + 6 +ByLayer + 10 +125.000040987657556 + 20 +15.000098211036514 + 30 +0.0 + 11 +112.5 + 21 +-10.0 + 31 +0.0 + 0 +LINE + 5 +85 +100 +AcDbEntity +100 +AcDbLine + 8 +2 + 62 +256 +370 +-1 + 6 +ByLayer + 10 +112.5 + 20 +-10.0 + 30 +0.0 + 11 +102.5001337867386582 + 21 +15.0002675734773092 + 31 +0.0 + 0 +LINE + 5 +86 +100 +AcDbEntity +100 +AcDbLine + 8 +2 + 62 +256 +370 +-1 + 6 +ByLayer + 10 +102.5001337867386582 + 20 +15.0002675734773092 + 30 +0.0 + 11 +115.0000891911591054 + 21 +40.0001783823181967 + 31 +0.0 + 0 +LINE + 5 +87 +100 +AcDbEntity +100 +AcDbLine + 8 +2 + 62 +256 +370 +-1 + 6 +ByLayer + 10 +115.0000891911591054 + 20 +40.0001783823181967 + 30 +0.0 + 11 +125.000040987657556 + 21 +15.0000982110365051 + 31 +0.0 + 0 +LINE + 5 +88 +100 +AcDbEntity +100 +AcDbLine + 8 +2 + 62 +256 +370 +-1 + 6 +ByLayer + 10 +125.000040987657556 + 20 +15.0000982110365051 + 30 +0.0 + 11 +135.0 + 21 +-10.0 + 31 +0.0 + 0 +LINE + 5 +89 +100 +AcDbEntity +100 +AcDbLine + 8 +2 + 62 +256 +370 +-1 + 6 +ByLayer + 10 +135.0 + 20 +-10.0 + 30 +0.0 + 11 +112.5 + 21 +-10.0000000000000071 + 31 +0.0 + 0 +LINE + 5 +8A +100 +AcDbEntity +100 +AcDbLine + 8 +2 + 62 +256 +370 +-1 + 6 +ByLayer + 10 +112.5 + 20 +-10.0000000000000071 + 30 +0.0 + 11 +90.0 + 21 +-10.0 + 31 +0.0 + 0 +LINE + 5 +8B +100 +AcDbEntity +100 +AcDbLine + 8 +2 + 62 +256 +370 +-1 + 6 +ByLayer + 10 +90.0 + 20 +-10.0 + 30 +0.0 + 11 +102.5001337867386582 + 21 +15.0002675734773092 + 31 +0.0 + 0 +LINE + 5 +8C +100 +AcDbEntity +100 +AcDbLine + 8 +2 + 62 +256 +370 +-1 + 6 +ByLayer + 10 +135.0 + 20 +-10.0 + 30 +0.0 + 11 +147.4999729933480523 + 21 +15.0000697194141779 + 31 +0.0 + 0 +LINE + 5 +8D +100 +AcDbEntity +100 +AcDbLine + 8 +2 + 62 +256 +370 +-1 + 6 +ByLayer + 10 +147.4999729933480523 + 20 +15.0000697194141779 + 30 +0.0 + 11 +159.9999450076830101 + 21 +40.0001374807924535 + 31 +0.0 + 0 +LINE + 5 +8E +100 +AcDbEntity +100 +AcDbLine + 8 +2 + 62 +256 +370 +-1 + 6 +ByLayer + 10 +159.9999450076830101 + 20 +40.0001374807924535 + 30 +0.0 + 11 +137.5000391911498241 + 21 +40.0001579315352487 + 31 +0.0 + 0 +LINE + 5 +8F +100 +AcDbEntity +100 +AcDbLine + 8 +2 + 62 +256 +370 +-1 + 6 +ByLayer + 10 +137.5000391911498241 + 20 +40.0001579315352487 + 30 +0.0 + 11 +115.0000891911591054 + 21 +40.0001783823182038 + 31 +0.0 + 0 +LINE + 5 +90 +100 +AcDbEntity +100 +AcDbLine + 8 +2 + 62 +256 +370 +-1 + 6 +ByLayer + 10 +115.0000891911591054 + 20 +40.0001783823182038 + 30 +0.0 + 11 +127.5000445955795527 + 21 +65.0000891911591054 + 31 +0.0 + 0 +LINE + 5 +91 +100 +AcDbEntity +100 +AcDbLine + 8 +2 + 62 +256 +370 +-1 + 6 +ByLayer + 10 +127.5000445955795527 + 20 +65.0000891911591054 + 30 +0.0 + 11 +140.0 + 21 +90.0 + 31 +0.0 + 0 +LINE + 5 +92 +100 +AcDbEntity +100 +AcDbLine + 8 +2 + 62 +256 +370 +-1 + 6 +ByLayer + 10 +140.0 + 20 +90.0 + 30 +0.0 + 11 +149.9999725038414908 + 21 +65.0000687403962303 + 31 +0.0 + 0 +LINE + 5 +93 +100 +AcDbEntity +100 +AcDbLine + 8 +2 + 62 +256 +370 +-1 + 6 +ByLayer + 10 +149.9999725038414908 + 20 +65.0000687403962303 + 30 +0.0 + 11 +159.9999450076830101 + 21 +40.0001374807924535 + 31 +0.0 + 0 +LINE + 5 +94 +100 +AcDbEntity +100 +AcDbLine + 8 +2 + 62 +256 +370 +-1 + 6 +ByLayer + 10 +140.0 + 20 +90.0 + 30 +0.0 + 11 +95.2752319396872025 + 21 +85.0305813266319177 + 31 +0.0 + 0 +LINE + 5 +95 +100 +AcDbEntity +100 +AcDbLine + 8 +2 + 62 +256 +370 +-1 + 6 +ByLayer + 10 +95.2752319396872025 + 20 +85.0305813266319177 + 30 +0.0 + 11 +115.0000891911591054 + 21 +40.0001783823181896 + 31 +0.0 + 0 +MTEXT + 5 +96 +100 +AcDbEntity +100 +AcDbMText + 8 +0-Vertices + 62 +256 +370 +-1 + 6 +ByLayer + 10 +-4.3945312500000435 + 20 +4.3945312500000435 + 30 +0.0 + 40 +4.0 + 41 +100.0 + 71 +1 + 72 +0 + 1 +0 + 7 +normal + 50 +0.0 + 73 +1 + 44 +1.0 + 0 +MTEXT + 5 +97 +100 +AcDbEntity +100 +AcDbMText + 8 +0-Vertices + 62 +256 +370 +-1 + 6 +ByLayer + 10 +54.6875000000005471 + 20 +-72.7539062500007248 + 30 +0.0 + 40 +4.0 + 41 +100.0 + 71 +1 + 72 +0 + 1 +1 + 7 +normal + 50 +0.0 + 73 +1 + 44 +1.0 + 0 +MTEXT + 5 +98 +100 +AcDbEntity +100 +AcDbMText + 8 +0-Vertices + 62 +256 +370 +-1 + 6 +ByLayer + 10 +81.54296875000081 + 20 +-13.1835937500001315 + 30 +0.0 + 40 +4.0 + 41 +100.0 + 71 +1 + 72 +0 + 1 +2 + 7 +normal + 50 +0.0 + 73 +1 + 44 +1.0 + 0 +MTEXT + 5 +99 +100 +AcDbEntity +100 +AcDbMText + 8 +0-Vertices + 62 +256 +370 +-1 + 6 +ByLayer + 10 +141.1132812500013927 + 20 +-74.218750000000739 + 30 +0.0 + 40 +4.0 + 41 +100.0 + 71 +1 + 72 +0 + 1 +3 + 7 +normal + 50 +0.0 + 73 +1 + 44 +1.0 + 0 +MTEXT + 5 +9A +100 +AcDbEntity +100 +AcDbMText + 8 +0-Vertices + 62 +256 +370 +-1 + 6 +ByLayer + 10 +243.1640625000024158 + 20 +-61.5234375000006111 + 30 +0.0 + 40 +4.0 + 41 +100.0 + 71 +1 + 72 +0 + 1 +4 + 7 +normal + 50 +0.0 + 73 +1 + 44 +1.0 + 0 +MTEXT + 5 +9B +100 +AcDbEntity +100 +AcDbMText + 8 +0-Vertices + 62 +256 +370 +-1 + 6 +ByLayer + 10 +187.5000000000018758 + 20 +-8.3007812500000835 + 30 +0.0 + 40 +4.0 + 41 +100.0 + 71 +1 + 72 +0 + 1 +5 + 7 +normal + 50 +0.0 + 73 +1 + 44 +1.0 + 0 +MTEXT + 5 +9C +100 +AcDbEntity +100 +AcDbMText + 8 +0-Vertices + 62 +256 +370 +-1 + 6 +ByLayer + 10 +223.6328125000022169 + 20 +62.9882812500006253 + 30 +0.0 + 40 +4.0 + 41 +100.0 + 71 +1 + 72 +0 + 1 +6 + 7 +normal + 50 +0.0 + 73 +1 + 44 +1.0 + 0 +MTEXT + 5 +9D +100 +AcDbEntity +100 +AcDbMText + 8 +0-Vertices + 62 +256 +370 +-1 + 6 +ByLayer + 10 +143.0664062500014211 + 20 +99.1210937500009805 + 30 +0.0 + 40 +4.0 + 41 +100.0 + 71 +1 + 72 +0 + 1 +7 + 7 +normal + 50 +0.0 + 73 +1 + 44 +1.0 + 0 +MTEXT + 5 +9E +100 +AcDbEntity +100 +AcDbMText + 8 +0-Vertices + 62 +256 +370 +-1 + 6 +ByLayer + 10 +45.8984375000004547 + 20 +85.9375000000008527 + 30 +0.0 + 40 +4.0 + 41 +100.0 + 71 +1 + 72 +0 + 1 +8 + 7 +normal + 50 +0.0 + 73 +1 + 44 +1.0 + 0 +MTEXT + 5 +9F +100 +AcDbEntity +100 +AcDbMText + 8 +0-Vertices + 62 +256 +370 +-1 + 6 +ByLayer + 10 +134.7656250000013358 + 20 +155.2734375000015348 + 30 +0.0 + 40 +4.0 + 41 +100.0 + 71 +1 + 72 +0 + 1 +9 + 7 +normal + 50 +0.0 + 73 +1 + 44 +1.0 + 0 +MTEXT + 5 +A0 +100 +AcDbEntity +100 +AcDbMText + 8 +0-Vertices + 62 +256 +370 +-1 + 6 +ByLayer + 10 +202.1484375000020179 + 20 +124.5117187500012363 + 30 +0.0 + 40 +4.0 + 41 +100.0 + 71 +1 + 72 +0 + 1 +10 + 7 +normal + 50 +0.0 + 73 +1 + 44 +1.0 + 0 +MTEXT + 5 +A1 +100 +AcDbEntity +100 +AcDbMText + 8 +1-Vertices + 62 +256 +370 +-1 + 6 +ByLayer + 10 +204.2968750000027569 + 20 +24.609375000000334 + 30 +0.0 + 40 +4.0 + 41 +100.0 + 71 +1 + 72 +0 + 1 +15 + 7 +normal + 50 +0.0 + 73 +1 + 44 +1.0 + 0 +MTEXT + 5 +A2 +100 +AcDbEntity +100 +AcDbMText + 8 +1-Vertices + 62 +256 +370 +-1 + 6 +ByLayer + 10 +109.7656250000014779 + 20 +-41.4062500000005613 + 30 +0.0 + 40 +4.0 + 41 +100.0 + 71 +1 + 72 +0 + 1 +11 + 7 +normal + 50 +0.0 + 73 +1 + 44 +1.0 + 0 +MTEXT + 5 +A3 +100 +AcDbEntity +100 +AcDbMText + 8 +1-Vertices + 62 +256 +370 +-1 + 6 +ByLayer + 10 +164.8437500000022169 + 20 +-41.4062500000005613 + 30 +0.0 + 40 +4.0 + 41 +100.0 + 71 +1 + 72 +0 + 1 +12 + 7 +normal + 50 +0.0 + 73 +1 + 44 +1.0 + 0 +MTEXT + 5 +A4 +100 +AcDbEntity +100 +AcDbMText + 8 +1-Vertices + 62 +256 +370 +-1 + 6 +ByLayer + 10 +134.375000000001819 + 20 +-16.0156250000002167 + 30 +0.0 + 40 +4.0 + 41 +100.0 + 71 +1 + 72 +0 + 1 +13 + 7 +normal + 50 +0.0 + 73 +1 + 44 +1.0 + 0 +MTEXT + 5 +A5 +100 +AcDbEntity +100 +AcDbMText + 8 +1-Vertices + 62 +256 +370 +-1 + 6 +ByLayer + 10 +166.7968750000022453 + 20 +43.7500000000005898 + 30 +0.0 + 40 +4.0 + 41 +100.0 + 71 +1 + 72 +0 + 1 +14 + 7 +normal + 50 +0.0 + 73 +1 + 44 +1.0 + 0 +MTEXT + 5 +A6 +100 +AcDbEntity +100 +AcDbMText + 8 +1-Vertices + 62 +256 +370 +-1 + 6 +ByLayer + 10 +181.2500000000024443 + 20 +82.0312500000011084 + 30 +0.0 + 40 +4.0 + 41 +100.0 + 71 +1 + 72 +0 + 1 +16 + 7 +normal + 50 +0.0 + 73 +1 + 44 +1.0 + 0 +MTEXT + 5 +A7 +100 +AcDbEntity +100 +AcDbMText + 8 +1-Vertices + 62 +256 +370 +-1 + 6 +ByLayer + 10 +62.5000000000008455 + 20 +36.7187500000004974 + 30 +0.0 + 40 +4.0 + 41 +100.0 + 71 +1 + 72 +0 + 1 +17 + 7 +normal + 50 +0.0 + 73 +1 + 44 +1.0 + 0 +MTEXT + 5 +A8 +100 +AcDbEntity +100 +AcDbMText + 8 +1-Vertices + 62 +256 +370 +-1 + 6 +ByLayer + 10 +105.8593750000014353 + 20 +37.1093750000005045 + 30 +0.0 + 40 +4.0 + 41 +100.0 + 71 +1 + 72 +0 + 1 +18 + 7 +normal + 50 +0.0 + 73 +1 + 44 +1.0 + 0 +MTEXT + 5 +A9 +100 +AcDbEntity +100 +AcDbMText + 8 +1-Vertices + 62 +256 +370 +-1 + 6 +ByLayer + 10 +94.531250000001279 + 20 +76.1718750000010232 + 30 +0.0 + 40 +4.0 + 41 +100.0 + 71 +1 + 72 +0 + 1 +19 + 7 +normal + 50 +0.0 + 73 +1 + 44 +1.0 + 0 +MTEXT + 5 +AA +100 +AcDbEntity +100 +AcDbMText + 8 +2-Vertices + 62 +256 +370 +-1 + 6 +ByLayer + 10 +95.3125000000012932 + 20 +18.7500000000002522 + 30 +0.0 + 40 +4.0 + 41 +100.0 + 71 +1 + 72 +0 + 1 +20 + 7 +normal + 50 +0.0 + 73 +1 + 44 +1.0 + 0 +MTEXT + 5 +AB +100 +AcDbEntity +100 +AcDbMText + 8 +2-Vertices + 62 +256 +370 +-1 + 6 +ByLayer + 10 +109.7656250000014779 + 20 +-14.0625000000001901 + 30 +0.0 + 40 +4.0 + 41 +100.0 + 71 +1 + 72 +0 + 1 +21 + 7 +normal + 50 +0.0 + 73 +1 + 44 +1.0 + 0 +MTEXT + 5 +AC +100 +AcDbEntity +100 +AcDbMText + 8 +2-Vertices + 62 +256 +370 +-1 + 6 +ByLayer + 10 +122.2656250000016485 + 20 +9.3750000000001261 + 30 +0.0 + 40 +4.0 + 41 +100.0 + 71 +1 + 72 +0 + 1 +22 + 7 +normal + 50 +0.0 + 73 +1 + 44 +1.0 + 0 +MTEXT + 5 +AD +100 +AcDbEntity +100 +AcDbMText + 8 +2-Vertices + 62 +256 +370 +-1 + 6 +ByLayer + 10 +150.0000000000020179 + 20 +13.6718750000001847 + 30 +0.0 + 40 +4.0 + 41 +100.0 + 71 +1 + 72 +0 + 1 +23 + 7 +normal + 50 +0.0 + 73 +1 + 44 +1.0 + 0 +MTEXT + 5 +AE +100 +AcDbEntity +100 +AcDbMText + 8 +2-Vertices + 62 +256 +370 +-1 + 6 +ByLayer + 10 +139.4531250000018758 + 20 +38.6718750000005258 + 30 +0.0 + 40 +4.0 + 41 +100.0 + 71 +1 + 72 +0 + 1 +24 + 7 +normal + 50 +0.0 + 73 +1 + 44 +1.0 + 0 +MTEXT + 5 +AF +100 +AcDbEntity +100 +AcDbMText + 8 +2-Vertices + 62 +256 +370 +-1 + 6 +ByLayer + 10 +153.1250000000020748 + 20 +66.4062500000008953 + 30 +0.0 + 40 +4.0 + 41 +100.0 + 71 +1 + 72 +0 + 1 +25 + 7 +normal + 50 +0.0 + 73 +1 + 44 +1.0 + 0 +MTEXT + 5 +B0 +100 +AcDbEntity +100 +AcDbMText + 8 +2-Vertices + 62 +256 +370 +-1 + 6 +ByLayer + 10 +130.0781250000017621 + 20 +63.2812500000008527 + 30 +0.0 + 40 +4.0 + 41 +100.0 + 71 +1 + 72 +0 + 1 +26 + 7 +normal + 50 +0.0 + 73 +1 + 44 +1.0 + 0 +MTEXT + 5 +B1 +100 +AcDbEntity +100 +AcDbMText + 8 +2-Vertices + 62 +256 +370 +-1 + 6 +ByLayer + 10 +115.2343750000015632 + 20 +94.531250000001279 + 30 +0.0 + 40 +4.0 + 41 +100.0 + 71 +1 + 72 +0 + 1 +27 + 7 +normal + 50 +0.0 + 73 +1 + 44 +1.0 + 0 +MTEXT + 5 +B2 +100 +AcDbEntity +100 +AcDbMText + 8 +2-Vertices + 62 +256 +370 +-1 + 6 +ByLayer + 10 +98.0468750000013216 + 20 +60.9375000000008242 + 30 +0.0 + 40 +4.0 + 41 +100.0 + 71 +1 + 72 +0 + 1 +28 + 7 +normal + 50 +0.0 + 73 +1 + 44 +1.0 + 0 +MTEXT + 5 +B3 +100 +AcDbEntity +100 +AcDbMText + 8 +0-Triangles + 62 +256 +370 +-1 + 6 +ByLayer + 10 +50.6591796875007105 + 20 +-23.1933593750003268 + 30 +0.0 + 40 +4.0 + 41 +100.0 + 71 +1 + 72 +0 + 1 +0 + 7 +italicc + 50 +0.0 + 73 +1 + 44 +1.0 + 0 +MTEXT + 5 +B4 +100 +AcDbEntity +100 +AcDbMText + 8 +0-Triangles + 62 +256 +370 +-1 + 6 +ByLayer + 10 +96.43554687500135 + 20 +-45.1660156250006324 + 30 +0.0 + 40 +4.0 + 41 +100.0 + 71 +1 + 72 +0 + 1 +1 + 7 +italicc + 50 +0.0 + 73 +1 + 44 +1.0 + 0 +MTEXT + 5 +B5 +100 +AcDbEntity +100 +AcDbMText + 8 +0-Triangles + 62 +256 +370 +-1 + 6 +ByLayer + 10 +137.3291015625019327 + 20 +-34.7900390625004903 + 30 +0.0 + 40 +4.0 + 41 +100.0 + 71 +1 + 72 +0 + 1 +2 + 7 +italicc + 50 +0.0 + 73 +1 + 44 +1.0 + 0 +MTEXT + 5 +B6 +100 +AcDbEntity +100 +AcDbMText + 8 +0-Triangles + 62 +256 +370 +-1 + 6 +ByLayer + 10 +184.9365234375025864 + 20 +-43.9453125000006182 + 30 +0.0 + 40 +4.0 + 41 +100.0 + 71 +1 + 72 +0 + 1 +3 + 7 +italicc + 50 +0.0 + 73 +1 + 44 +1.0 + 0 +MTEXT + 5 +B7 +100 +AcDbEntity +100 +AcDbMText + 8 +0-Triangles + 62 +256 +370 +-1 + 6 +ByLayer + 10 +209.3505859375029274 + 20 +-0.6103515625000085 + 30 +0.0 + 40 +4.0 + 41 +100.0 + 71 +1 + 72 +0 + 1 +4 + 7 +italicc + 50 +0.0 + 73 +1 + 44 +1.0 + 0 +MTEXT + 5 +B8 +100 +AcDbEntity +100 +AcDbMText + 8 +0-Triangles + 62 +256 +370 +-1 + 6 +ByLayer + 10 +183.7158203125025864 + 20 +43.9453125000006182 + 30 +0.0 + 40 +4.0 + 41 +100.0 + 71 +1 + 72 +0 + 1 +5 + 7 +italicc + 50 +0.0 + 73 +1 + 44 +1.0 + 0 +MTEXT + 5 +B9 +100 +AcDbEntity +100 +AcDbMText + 8 +0-Triangles + 62 +256 +370 +-1 + 6 +ByLayer + 10 +192.2607421875027001 + 20 +94.6044921875013358 + 30 +0.0 + 40 +4.0 + 41 +100.0 + 71 +1 + 72 +0 + 1 +6 + 7 +italicc + 50 +0.0 + 73 +1 + 44 +1.0 + 0 +MTEXT + 5 +BA +100 +AcDbEntity +100 +AcDbMText + 8 +0-Triangles + 62 +256 +370 +-1 + 6 +ByLayer + 10 +153.80859375000216 + 20 +117.7978515625016485 + 30 +0.0 + 40 +4.0 + 41 +100.0 + 71 +1 + 72 +0 + 1 +7 + 7 +italicc + 50 +0.0 + 73 +1 + 44 +1.0 + 0 +MTEXT + 5 +BB +100 +AcDbEntity +100 +AcDbMText + 8 +0-Triangles + 62 +256 +370 +-1 + 6 +ByLayer + 10 +107.4218750000015064 + 20 +106.2011718750014921 + 30 +0.0 + 40 +4.0 + 41 +100.0 + 71 +1 + 72 +0 + 1 +8 + 7 +italicc + 50 +0.0 + 73 +1 + 44 +1.0 + 0 +MTEXT + 5 +BC +100 +AcDbEntity +100 +AcDbMText + 8 +0-Triangles + 62 +256 +370 +-1 + 6 +ByLayer + 10 +93.9941406250013216 + 20 +51.8798828125007319 + 30 +0.0 + 40 +4.0 + 41 +100.0 + 71 +1 + 72 +0 + 1 +9 + 7 +italicc + 50 +0.0 + 73 +1 + 44 +1.0 + 0 +MTEXT + 5 +BD +100 +AcDbEntity +100 +AcDbMText + 8 +0-Triangles + 62 +256 +370 +-1 + 6 +ByLayer + 10 +48.217773437500675 + 20 +19.5312500000002736 + 30 +0.0 + 40 +4.0 + 41 +100.0 + 71 +1 + 72 +0 + 1 +10 + 7 +italicc + 50 +0.0 + 73 +1 + 44 +1.0 + 0 +MTEXT + 5 +BE +100 +AcDbEntity +100 +AcDbMText + 8 +0-Triangles + 62 +256 +370 +-1 + 6 +ByLayer + 10 +140.3808593750019611 + 20 +20.1416015625002842 + 30 +0.0 + 40 +4.0 + 41 +100.0 + 71 +1 + 72 +0 + 1 +11 + 7 +italicc + 50 +0.0 + 73 +1 + 44 +1.0 + 0 +MTEXT + 5 +BF +100 +AcDbEntity +100 +AcDbMText + 8 +1-Triangles + 62 +256 +370 +-1 + 6 +ByLayer + 10 +112.1093750000016058 + 20 +-20.7031250000002984 + 30 +0.0 + 40 +4.0 + 41 +100.0 + 71 +1 + 72 +0 + 1 +12 + 7 +italicc + 50 +0.0 + 73 +1 + 44 +1.0 + 0 +MTEXT + 5 +C0 +100 +AcDbEntity +100 +AcDbMText + 8 +1-Triangles + 62 +256 +370 +-1 + 6 +ByLayer + 10 +137.5000000000019895 + 20 +-48.8281250000007034 + 30 +0.0 + 40 +4.0 + 41 +100.0 + 71 +1 + 72 +0 + 1 +13 + 7 +italicc + 50 +0.0 + 73 +1 + 44 +1.0 + 0 +MTEXT + 5 +C1 +100 +AcDbEntity +100 +AcDbMText + 8 +1-Triangles + 62 +256 +370 +-1 + 6 +ByLayer + 10 +158.2031250000022737 + 20 +-18.75000000000027 + 30 +0.0 + 40 +4.0 + 41 +100.0 + 71 +1 + 72 +0 + 1 +14 + 7 +italicc + 50 +0.0 + 73 +1 + 44 +1.0 + 0 +MTEXT + 5 +C2 +100 +AcDbEntity +100 +AcDbMText + 8 +1-Triangles + 62 +256 +370 +-1 + 6 +ByLayer + 10 +135.5468750000019611 + 20 +-27.3437500000003944 + 30 +0.0 + 40 +4.0 + 41 +100.0 + 71 +1 + 72 +0 + 1 +15 + 7 +italicc + 50 +0.0 + 73 +1 + 44 +1.0 + 0 +MTEXT + 5 +C3 +100 +AcDbEntity +100 +AcDbMText + 8 +1-Triangles + 62 +256 +370 +-1 + 6 +ByLayer + 10 +178.515625000002558 + 20 +20.3125000000002913 + 30 +0.0 + 40 +4.0 + 41 +100.0 + 71 +1 + 72 +0 + 1 +16 + 7 +italicc + 50 +0.0 + 73 +1 + 44 +1.0 + 0 +MTEXT + 5 +C4 +100 +AcDbEntity +100 +AcDbMText + 8 +1-Triangles + 62 +256 +370 +-1 + 6 +ByLayer + 10 +200.781250000002899 + 20 +55.4687500000007958 + 30 +0.0 + 40 +4.0 + 41 +100.0 + 71 +1 + 72 +0 + 1 +17 + 7 +italicc + 50 +0.0 + 73 +1 + 44 +1.0 + 0 +MTEXT + 5 +C5 +100 +AcDbEntity +100 +AcDbMText + 8 +1-Triangles + 62 +256 +370 +-1 + 6 +ByLayer + 10 +160.5468750000023022 + 20 +70.312500000001009 + 30 +0.0 + 40 +4.0 + 41 +100.0 + 71 +1 + 72 +0 + 1 +18 + 7 +italicc + 50 +0.0 + 73 +1 + 44 +1.0 + 0 +MTEXT + 5 +C6 +100 +AcDbEntity +100 +AcDbMText + 8 +1-Triangles + 62 +256 +370 +-1 + 6 +ByLayer + 10 +178.515625000002558 + 20 +49.6093750000007105 + 30 +0.0 + 40 +4.0 + 41 +100.0 + 71 +1 + 72 +0 + 1 +19 + 7 +italicc + 50 +0.0 + 73 +1 + 44 +1.0 + 0 +MTEXT + 5 +C7 +100 +AcDbEntity +100 +AcDbMText + 8 +1-Triangles + 62 +256 +370 +-1 + 6 +ByLayer + 10 +136.3281250000019611 + 20 +53.9062500000007745 + 30 +0.0 + 40 +4.0 + 41 +100.0 + 71 +1 + 72 +0 + 1 +20 + 7 +italicc + 50 +0.0 + 73 +1 + 44 +1.0 + 0 +MTEXT + 5 +C8 +100 +AcDbEntity +100 +AcDbMText + 8 +1-Triangles + 62 +256 +370 +-1 + 6 +ByLayer + 10 +111.3281250000016058 + 20 +13.2812500000001901 + 30 +0.0 + 40 +4.0 + 41 +100.0 + 71 +1 + 72 +0 + 1 +21 + 7 +italicc + 50 +0.0 + 73 +1 + 44 +1.0 + 0 +MTEXT + 5 +C9 +100 +AcDbEntity +100 +AcDbMText + 8 +1-Triangles + 62 +256 +370 +-1 + 6 +ByLayer + 10 +156.6406250000022453 + 20 +7.8125000000001119 + 30 +0.0 + 40 +4.0 + 41 +100.0 + 71 +1 + 72 +0 + 1 +22 + 7 +italicc + 50 +0.0 + 73 +1 + 44 +1.0 + 0 +MTEXT + 5 +CA +100 +AcDbEntity +100 +AcDbMText + 8 +1-Triangles + 62 +256 +370 +-1 + 6 +ByLayer + 10 +134.3750000000019327 + 20 +21.093750000000302 + 30 +0.0 + 40 +4.0 + 41 +100.0 + 71 +1 + 72 +0 + 1 +23 + 7 +italicc + 50 +0.0 + 73 +1 + 44 +1.0 + 0 +MTEXT + 5 +CB +100 +AcDbEntity +100 +AcDbMText + 8 +1-Triangles + 62 +256 +370 +-1 + 6 +ByLayer + 10 +88.2812500000012648 + 20 +26.9531250000003872 + 30 +0.0 + 40 +4.0 + 41 +100.0 + 71 +1 + 72 +0 + 1 +24 + 7 +italicc + 50 +0.0 + 73 +1 + 44 +1.0 + 0 +MTEXT + 5 +CC +100 +AcDbEntity +100 +AcDbMText + 8 +1-Triangles + 62 +256 +370 +-1 + 6 +ByLayer + 10 +118.3593750000017053 + 20 +71.0937500000010232 + 30 +0.0 + 40 +4.0 + 41 +100.0 + 71 +1 + 72 +0 + 1 +25 + 7 +italicc + 50 +0.0 + 73 +1 + 44 +1.0 + 0 +MTEXT + 5 +CD +100 +AcDbEntity +100 +AcDbMText + 8 +1-Triangles + 62 +256 +370 +-1 + 6 +ByLayer + 10 +66.7968750000009663 + 20 +70.7031250000010232 + 30 +0.0 + 40 +4.0 + 41 +100.0 + 71 +1 + 72 +0 + 1 +26 + 7 +italicc + 50 +0.0 + 73 +1 + 44 +1.0 + 0 +MTEXT + 5 +CE +100 +AcDbEntity +100 +AcDbMText + 8 +1-Triangles + 62 +256 +370 +-1 + 6 +ByLayer + 10 +89.4531250000012932 + 20 +55.8593750000008029 + 30 +0.0 + 40 +4.0 + 41 +100.0 + 71 +1 + 72 +0 + 1 +27 + 7 +italicc + 50 +0.0 + 73 +1 + 44 +1.0 + 0 +MTEXT + 5 +CF +100 +AcDbEntity +100 +AcDbMText + 8 +2-Triangles + 62 +256 +370 +-1 + 6 +ByLayer + 10 +99.5000000000015774 + 20 +1.7500000000000278 + 30 +0.0 + 40 +4.0 + 41 +100.0 + 71 +1 + 72 +0 + 1 +28 + 7 +italicc + 50 +0.0 + 73 +1 + 44 +1.0 + 0 +MTEXT + 5 +D0 +100 +AcDbEntity +100 +AcDbMText + 8 +2-Triangles + 62 +256 +370 +-1 + 6 +ByLayer + 10 +122.7500000000019469 + 20 +1.2500000000000198 + 30 +0.0 + 40 +4.0 + 41 +100.0 + 71 +1 + 72 +0 + 1 +29 + 7 +italicc + 50 +0.0 + 73 +1 + 44 +1.0 + 0 +MTEXT + 5 +D1 +100 +AcDbEntity +100 +AcDbMText + 8 +2-Triangles + 62 +256 +370 +-1 + 6 +ByLayer + 10 +111.0000000000017621 + 20 +25.500000000000405 + 30 +0.0 + 40 +4.0 + 41 +100.0 + 71 +1 + 72 +0 + 1 +30 + 7 +italicc + 50 +0.0 + 73 +1 + 44 +1.0 + 0 +MTEXT + 5 +D2 +100 +AcDbEntity +100 +AcDbMText + 8 +2-Triangles + 62 +256 +370 +-1 + 6 +ByLayer + 10 +110.7500000000017621 + 20 +8.2500000000001315 + 30 +0.0 + 40 +4.0 + 41 +100.0 + 71 +1 + 72 +0 + 1 +31 + 7 +italicc + 50 +0.0 + 73 +1 + 44 +1.0 + 0 +MTEXT + 5 +D3 +100 +AcDbEntity +100 +AcDbMText + 8 +2-Triangles + 62 +256 +370 +-1 + 6 +ByLayer + 10 +133.2500000000021032 + 20 +9.7500000000001545 + 30 +0.0 + 40 +4.0 + 41 +100.0 + 71 +1 + 72 +0 + 1 +32 + 7 +italicc + 50 +0.0 + 73 +1 + 44 +1.0 + 0 +MTEXT + 5 +D4 +100 +AcDbEntity +100 +AcDbMText + 8 +2-Triangles + 62 +256 +370 +-1 + 6 +ByLayer + 10 +145.5000000000023022 + 20 +33.0000000000005258 + 30 +0.0 + 40 +4.0 + 41 +100.0 + 71 +1 + 72 +0 + 1 +33 + 7 +italicc + 50 +0.0 + 73 +1 + 44 +1.0 + 0 +MTEXT + 5 +D5 +100 +AcDbEntity +100 +AcDbMText + 8 +2-Triangles + 62 +256 +370 +-1 + 6 +ByLayer + 10 +123.7500000000019611 + 20 +35.7500000000005684 + 30 +0.0 + 40 +4.0 + 41 +100.0 + 71 +1 + 72 +0 + 1 +34 + 7 +italicc + 50 +0.0 + 73 +1 + 44 +1.0 + 0 +MTEXT + 5 +D6 +100 +AcDbEntity +100 +AcDbMText + 8 +2-Triangles + 62 +256 +370 +-1 + 6 +ByLayer + 10 +134.5000000000021316 + 20 +27.7500000000004405 + 30 +0.0 + 40 +4.0 + 41 +100.0 + 71 +1 + 72 +0 + 1 +35 + 7 +italicc + 50 +0.0 + 73 +1 + 44 +1.0 + 0 +MTEXT + 5 +D7 +100 +AcDbEntity +100 +AcDbMText + 8 +2-Triangles + 62 +256 +370 +-1 + 6 +ByLayer + 10 +123.2500000000019611 + 20 +51.2500000000008171 + 30 +0.0 + 40 +4.0 + 41 +100.0 + 71 +1 + 72 +0 + 1 +36 + 7 +italicc + 50 +0.0 + 73 +1 + 44 +1.0 + 0 +MTEXT + 5 +D8 +100 +AcDbEntity +100 +AcDbMText + 8 +2-Triangles + 62 +256 +370 +-1 + 6 +ByLayer + 10 +147.2500000000023306 + 20 +51.2500000000008171 + 30 +0.0 + 40 +4.0 + 41 +100.0 + 71 +1 + 72 +0 + 1 +37 + 7 +italicc + 50 +0.0 + 73 +1 + 44 +1.0 + 0 +MTEXT + 5 +D9 +100 +AcDbEntity +100 +AcDbMText + 8 +2-Triangles + 62 +256 +370 +-1 + 6 +ByLayer + 10 +137.5000000000021885 + 20 +74.7500000000011937 + 30 +0.0 + 40 +4.0 + 41 +100.0 + 71 +1 + 72 +0 + 1 +38 + 7 +italicc + 50 +0.0 + 73 +1 + 44 +1.0 + 0 +MTEXT + 5 +DA +100 +AcDbEntity +100 +AcDbMText + 8 +2-Triangles + 62 +256 +370 +-1 + 6 +ByLayer + 10 +136.00000000000216 + 20 +58.0000000000009237 + 30 +0.0 + 40 +4.0 + 41 +100.0 + 71 +1 + 72 +0 + 1 +39 + 7 +italicc + 50 +0.0 + 73 +1 + 44 +1.0 + 0 +MTEXT + 5 +DB +100 +AcDbEntity +100 +AcDbMText + 8 +2-Triangles + 62 +256 +370 +-1 + 6 +ByLayer + 10 +113.0000000000017906 + 20 +60.0000000000009521 + 30 +0.0 + 40 +4.0 + 41 +100.0 + 71 +1 + 72 +0 + 1 +40 + 7 +italicc + 50 +0.0 + 73 +1 + 44 +1.0 + 0 +MTEXT + 5 +DC +100 +AcDbEntity +100 +AcDbMText + 8 +2-Triangles + 62 +256 +370 +-1 + 6 +ByLayer + 10 +126.0000000000020037 + 20 +84.2500000000013358 + 30 +0.0 + 40 +4.0 + 41 +100.0 + 71 +1 + 72 +0 + 1 +41 + 7 +italicc + 50 +0.0 + 73 +1 + 44 +1.0 + 0 +MTEXT + 5 +DD +100 +AcDbEntity +100 +AcDbMText + 8 +2-Triangles + 62 +256 +370 +-1 + 6 +ByLayer + 10 +104.5000000000016627 + 20 +81.7500000000012932 + 30 +0.0 + 40 +4.0 + 41 +100.0 + 71 +1 + 72 +0 + 1 +42 + 7 +italicc + 50 +0.0 + 73 +1 + 44 +1.0 + 0 +MTEXT + 5 +DE +100 +AcDbEntity +100 +AcDbMText + 8 +2-Triangles + 62 +256 +370 +-1 + 6 +ByLayer + 10 +114.500000000001819 + 20 +75.5000000000011937 + 30 +0.0 + 40 +4.0 + 41 +100.0 + 71 +1 + 72 +0 + 1 +43 + 7 +italicc + 50 +0.0 + 73 +1 + 44 +1.0 + 0 +ENDSEC + 0 +SECTION + 2 +OBJECTS + 0 +DICTIONARY + 5 +C +100 +AcDbDictionary +280 +0 +281 +1 + 3 +ACAD_GROUP +350 +D + 3 +ACAD_LAYOUT +350 +1A + 3 +ACAD_MLINESTYLE +350 +17 + 3 +ACAD_PLOTSETTINGS +350 +19 + 3 +ACAD_PLOTSTYLENAME +350 +E + 3 +AcDbVariableDictionary +350 +DF + 0 +DICTIONARY + 5 +D +100 +AcDbDictionary +280 +0 +281 +1 + 0 +ACDBDICTIONARYWDFLT + 5 +E +100 +AcDbDictionary +281 +1 + 3 +Normal +350 +F +100 +AcDbDictionaryWithDefault +340 +F + 0 +ACDBPLACEHOLDER + 5 +F + 0 +DICTIONARY + 5 +17 +100 +AcDbDictionary +280 +0 +281 +1 + 3 +Standard +350 +18 + 0 +MLINESTYLE + 5 +18 +100 +AcDbMlineStyle + 2 +STANDARD + 70 +0 + 3 + + 62 +256 + 51 +90.0 + 52 +90.0 + 71 +2 + 49 +0.5 + 62 +256 + 6 +BYLAYER + 49 +-0.5 + 62 +256 + 6 +BYLAYER + 0 +DICTIONARY + 5 +19 +100 +AcDbDictionary +280 +0 +281 +1 + 0 +DICTIONARY + 5 +1A +100 +AcDbDictionary +281 +1 + 3 +Layout1 +350 +1E + 3 +Layout2 +350 +26 + 3 +Model +350 +22 + 0 +LAYOUT + 5 +1E +100 +AcDbPlotSettings + 1 + + 2 +C:\Program Files\AutoCAD 2002\plotters\DWF ePlot (optimized for plotting).pc3 + 4 + + 6 + + 40 +0.0 + 41 +0.0 + 42 +0.0 + 43 +0.0 + 44 +0.0 + 45 +0.0 + 46 +0.0 + 47 +0.0 + 48 +0.0 + 49 +0.0 +140 +0.0 +141 +0.0 +142 +1.0 +143 +1.0 + 70 +688 + 72 +0 + 73 +0 + 74 +5 + 7 + + 75 +16 +147 +1.0 +148 +0.0 +149 +0.0 +100 +AcDbLayout + 1 +Layout1 + 70 +1 + 71 +1 + 10 +0.0 + 20 +0.0 + 11 +420.0 + 21 +297.0 + 12 +0.0 + 22 +0.0 + 32 +0.0 + 14 +100000000000000000000.0 + 24 +100000000000000000000.0 + 34 +100000000000000000000.0 + 15 +-100000000000000000000.0 + 25 +-100000000000000000000.0 + 35 +-100000000000000000000.0 +146 +0.0 + 13 +0.0 + 23 +0.0 + 33 +0.0 + 16 +1.0 + 26 +0.0 + 36 +0.0 + 17 +0.0 + 27 +1.0 + 37 +0.0 + 76 +0 +330 +1B + 0 +LAYOUT + 5 +22 +100 +AcDbPlotSettings + 1 + + 2 +C:\Program Files\AutoCAD 2002\plotters\DWF ePlot (optimized for plotting).pc3 + 4 + + 6 + + 40 +0.0 + 41 +0.0 + 42 +0.0 + 43 +0.0 + 44 +0.0 + 45 +0.0 + 46 +0.0 + 47 +0.0 + 48 +0.0 + 49 +0.0 +140 +0.0 +141 +0.0 +142 +1.0 +143 +1.0 + 70 +1712 + 72 +0 + 73 +0 + 74 +0 + 7 + + 75 +0 +147 +1.0 +148 +0.0 +149 +0.0 +100 +AcDbLayout + 1 +Model + 70 +1 + 71 +0 + 10 +0.0 + 20 +0.0 + 11 +12.0 + 21 +9.0 + 12 +0.0 + 22 +0.0 + 32 +0.0 + 14 +0.0 + 24 +0.0 + 34 +0.0 + 15 +0.0 + 25 +0.0 + 35 +0.0 +146 +0.0 + 13 +0.0 + 23 +0.0 + 33 +0.0 + 16 +1.0 + 26 +0.0 + 36 +0.0 + 17 +0.0 + 27 +1.0 + 37 +0.0 + 76 +0 +330 +1F + 0 +LAYOUT + 5 +26 +100 +AcDbPlotSettings + 1 + + 2 +C:\Program Files\AutoCAD 2002\plotters\DWF ePlot (optimized for plotting).pc3 + 4 + + 6 + + 40 +0.0 + 41 +0.0 + 42 +0.0 + 43 +0.0 + 44 +0.0 + 45 +0.0 + 46 +0.0 + 47 +0.0 + 48 +0.0 + 49 +0.0 +140 +0.0 +141 +0.0 +142 +1.0 +143 +1.0 + 70 +688 + 72 +0 + 73 +0 + 74 +5 + 7 + + 75 +16 +147 +1.0 +148 +0.0 +149 +0.0 +100 +AcDbLayout + 1 +Layout2 + 70 +1 + 71 +2 + 10 +0.0 + 20 +0.0 + 11 +12.0 + 21 +9.0 + 12 +0.0 + 22 +0.0 + 32 +0.0 + 14 +0.0 + 24 +0.0 + 34 +0.0 + 15 +0.0 + 25 +0.0 + 35 +0.0 +146 +0.0 + 13 +0.0 + 23 +0.0 + 33 +0.0 + 16 +1.0 + 26 +0.0 + 36 +0.0 + 17 +0.0 + 27 +1.0 + 37 +0.0 + 76 +0 +330 +23 + 0 +DICTIONARY + 5 +DF +100 +AcDbDictionary +281 +1 + 3 +DIMASSOC +350 +E1 + 3 +HIDETEXT +350 +E0 + 0 +DICTIONARYVAR + 5 +E0 +100 +DictionaryVariables +280 +0 + 1 +2 + 0 +DICTIONARYVAR + 5 +E1 +100 +DictionaryVariables +280 +0 + 1 +1 + 0 +ENDSEC + 0 +EOF diff --git a/doc/postprocess.py b/doc/postprocess.py new file mode 100755 index 0000000..1607f66 --- /dev/null +++ b/doc/postprocess.py @@ -0,0 +1,39 @@ +#!/usr/bin/env python + +from lxml import etree +from lxml.html import builder as E +import os +import re + +tree = etree.parse('tagfile') +tags = tree.xpath ('//member[@kind="function"]') +tags_per_files = {} +for tag in tags: + name = tag.find("name").text + anchor = tag.find("anchor").text + anchorfile = tag.find("anchorfile").text + if anchorfile in tags_per_files: + tags_per_files[anchorfile].append([name, anchor]) + else: + tags_per_files[anchorfile] = [[name, anchor]] + + +prefix = None +for line in open("Doxyfile", "r"): + if re.search ("^OUTPUT_DIRECTORY", line): + prefix = line.split("=")[-1].strip() + +if not prefix: + prefix = "." + +parser = etree.HTMLParser() +for filename,anchors in tags_per_files.items(): + print "Processing file: %s/%s" % (prefix, filename) + tree = etree.parse ("%s/%s" % (prefix, filename), parser) + for name,id in anchors: + anchor = tree.xpath ('//a[@id="%s"]' % id) + el = E.A(id="%s" % name) + anchor[0].addnext (el) + + f = open ("%s/%s" % (prefix, filename), "w") + f.write (etree.tostring (tree)) diff --git a/doc/tetrahedron_refinements/1-edge/edge_01_refined/01.png b/doc/tetrahedron_refinements/1-edge/edge_01_refined/01.png new file mode 100644 index 0000000000000000000000000000000000000000..1467231eb67453f80aa05beb5b1e4a77b3b38d45 GIT binary patch literal 8591 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 literal 0 HcmV?d00001 diff --git a/doc/tetrahedron_refinements/1-edge/edge_01_refined/01.pvsm b/doc/tetrahedron_refinements/1-edge/edge_01_refined/01.pvsm new file mode 100644 index 0000000..b0a3d17 --- /dev/null +++ b/doc/tetrahedron_refinements/1-edge/edge_01_refined/01.pvsm @@ -0,0 +1,1697 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/doc/tetrahedron_refinements/1-edge/edge_01_refined/01.txt b/doc/tetrahedron_refinements/1-edge/edge_01_refined/01.txt new file mode 100644 index 0000000..b5f4bc1 --- /dev/null +++ b/doc/tetrahedron_refinements/1-edge/edge_01_refined/01.txt @@ -0,0 +1,10 @@ +TET no. 0: +0.5, 0.5, 0.0 +0.0, 0.0, 1.0 +0.0, 0.0, 0.0 +0.0, 1.0, 0.0 +TET no. 1: +0.5, 0.5, 0.0 +0.0, 0.0, 0.0 +0.0, 0.0, 1.0 +1.0, 0.0, 0.0 diff --git a/doc/tetrahedron_refinements/1-edge/edge_01_refined/01.vtk b/doc/tetrahedron_refinements/1-edge/edge_01_refined/01.vtk new file mode 100644 index 0000000..caa7c29 --- /dev/null +++ b/doc/tetrahedron_refinements/1-edge/edge_01_refined/01.vtk @@ -0,0 +1,25 @@ +# vtk DataFile Version 2.0 +VTK LEGACY FILE FORMAT ASCII - tetrahedral sample file for H5FED test +ASCII +DATASET UNSTRUCTURED_GRID + +POINTS 5 DOUBLE +0.5 0.5 0.0 +0.0 0.0 1.0 +0.0 0.0 0.0 +0.0 1.0 0.0 +1.0 0.0 0.0 + +CELLS 2 10 +4 0 1 2 3 +4 0 2 1 4 + +CELL_TYPES 2 +10 +10 + +CELL_DATA 2 +SCALARS cell_attribute_data float 1 +LOOKUP_TABLE default +0 +1 diff --git a/doc/tetrahedron_refinements/1-edge/edge_01_refined/01_smal.png b/doc/tetrahedron_refinements/1-edge/edge_01_refined/01_smal.png new file mode 100644 index 0000000000000000000000000000000000000000..4ffa9ff6855354befd69f4f96759b6f97f9bff33 GIT binary patch literal 8142 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 KAIhanzx^M8YSMlH literal 0 HcmV?d00001 diff --git a/doc/tetrahedron_refinements/1-edge/edge_01_refined/01_small.png b/doc/tetrahedron_refinements/1-edge/edge_01_refined/01_small.png new file mode 100644 index 0000000000000000000000000000000000000000..4ffa9ff6855354befd69f4f96759b6f97f9bff33 GIT binary patch literal 8142 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 KAIhanzx^M8YSMlH literal 0 HcmV?d00001 diff --git a/doc/tetrahedron_refinements/1-edge/edge_12_refined/12.png b/doc/tetrahedron_refinements/1-edge/edge_12_refined/12.png new file mode 100644 index 0000000000000000000000000000000000000000..8f34e645504aa68c050eb9111b22248b541dd105 GIT binary patch literal 8715 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 literal 0 HcmV?d00001 diff --git a/doc/tetrahedron_refinements/1-edge/edge_12_refined/12.pvsm b/doc/tetrahedron_refinements/1-edge/edge_12_refined/12.pvsm new file mode 100644 index 0000000..bd4c75a --- /dev/null +++ b/doc/tetrahedron_refinements/1-edge/edge_12_refined/12.pvsm @@ -0,0 +1,2225 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/doc/tetrahedron_refinements/1-edge/edge_12_refined/12.txt b/doc/tetrahedron_refinements/1-edge/edge_12_refined/12.txt new file mode 100644 index 0000000..81f9f7e --- /dev/null +++ b/doc/tetrahedron_refinements/1-edge/edge_12_refined/12.txt @@ -0,0 +1,10 @@ +TET no. 0: +0.0, 0.5, 0.5 +0.0, 0.0, 0.0 +1.0, 0.0, 0.0 +0.0, 1.0, 0.0 +TET no. 1: +0.0, 0.5, 0.5 +1.0, 0.0, 0.0 +0.0, 0.0, 0.0 +0.0, 0.0, 1.0 diff --git a/doc/tetrahedron_refinements/1-edge/edge_12_refined/12.vtk b/doc/tetrahedron_refinements/1-edge/edge_12_refined/12.vtk new file mode 100644 index 0000000..fd2638d --- /dev/null +++ b/doc/tetrahedron_refinements/1-edge/edge_12_refined/12.vtk @@ -0,0 +1,25 @@ +# vtk DataFile Version 2.0 +VTK LEGACY FILE FORMAT ASCII - tetrahedral sample file for H5FED test +ASCII +DATASET UNSTRUCTURED_GRID + +POINTS 5 DOUBLE +0.0 0.5 0.5 +0.0 0.0 0.0 +1.0 0.0 0.0 +0.0 1.0 0.0 +0.0 0.0 1.0 + +CELLS 2 10 +4 0 1 2 3 +4 0 2 1 4 + +CELL_TYPES 2 +10 +10 + +CELL_DATA 2 +SCALARS cell_attribute_data float 1 +LOOKUP_TABLE default +0 +1 diff --git a/doc/tetrahedron_refinements/1-edge/edge_12_refined/12_small.png b/doc/tetrahedron_refinements/1-edge/edge_12_refined/12_small.png new file mode 100644 index 0000000000000000000000000000000000000000..ee2931f5cca8141e56fcfeb7f051d1f7f4fe1c15 GIT binary patch literal 8316 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 Ytn8x=!-GM;fFY6X76+^9&A!q958aBUK>z>% literal 0 HcmV?d00001 diff --git a/doc/tetrahedron_refinements/1-edge/edge_20_refined/20.pvsm b/doc/tetrahedron_refinements/1-edge/edge_20_refined/20.pvsm new file mode 100644 index 0000000..603a0ba --- /dev/null +++ b/doc/tetrahedron_refinements/1-edge/edge_20_refined/20.pvsm @@ -0,0 +1,2225 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/doc/tetrahedron_refinements/1-edge/edge_20_refined/20.txt b/doc/tetrahedron_refinements/1-edge/edge_20_refined/20.txt new file mode 100644 index 0000000..1e5caeb --- /dev/null +++ b/doc/tetrahedron_refinements/1-edge/edge_20_refined/20.txt @@ -0,0 +1,10 @@ +TET no. 0: +0.5, 0.0, 0.5 +0.0, 0.0, 0.0 +0.0, 1.0, 0.0 +0.0, 0.0, 1.0 +TET no. 1: +0.5, 0.0, 0.5 +0.0, 1.0, 0.0 +0.0, 0.0, 0.0 +1.0, 0.0, 0.0 diff --git a/doc/tetrahedron_refinements/1-edge/edge_20_refined/20.vtk b/doc/tetrahedron_refinements/1-edge/edge_20_refined/20.vtk new file mode 100644 index 0000000..177d3d3 --- /dev/null +++ b/doc/tetrahedron_refinements/1-edge/edge_20_refined/20.vtk @@ -0,0 +1,25 @@ +# vtk DataFile Version 2.0 +VTK LEGACY FILE FORMAT ASCII - tetrahedral sample file for H5FED test +ASCII +DATASET UNSTRUCTURED_GRID + +POINTS 5 DOUBLE +0.5 0.0 0.5 +0.0 0.0 0.0 +0.0 1.0 0.0 +0.0 0.0 1.0 +1.0 0.0 0.0 + +CELLS 2 10 +4 0 1 2 3 +4 0 2 1 4 + +CELL_TYPES 2 +10 +10 + +CELL_DATA 2 +SCALARS cell_attribute_data float 1 +LOOKUP_TABLE default +0 +1 diff --git a/doc/tetrahedron_refinements/1-edge/edge_20_refined/20_small.png b/doc/tetrahedron_refinements/1-edge/edge_20_refined/20_small.png new file mode 100644 index 0000000000000000000000000000000000000000..ae94c788706e2c587e6d30562329104942d29c19 GIT binary patch literal 9138 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 literal 0 HcmV?d00001 diff --git a/doc/tetrahedron_refinements/1-edge/edge_23_refined/23.png b/doc/tetrahedron_refinements/1-edge/edge_23_refined/23.png new file mode 100644 index 0000000000000000000000000000000000000000..8cf86cb4b855804f50cc861447a9f29b1db559a5 GIT binary patch literal 8487 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 OAm=qMtBdUUfBYAvdegK3 literal 0 HcmV?d00001 diff --git a/doc/tetrahedron_refinements/1-edge/edge_23_refined/23.pvsm b/doc/tetrahedron_refinements/1-edge/edge_23_refined/23.pvsm new file mode 100644 index 0000000..55e1da9 --- /dev/null +++ b/doc/tetrahedron_refinements/1-edge/edge_23_refined/23.pvsm @@ -0,0 +1,2225 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/doc/tetrahedron_refinements/1-edge/edge_23_refined/23.txt b/doc/tetrahedron_refinements/1-edge/edge_23_refined/23.txt new file mode 100644 index 0000000..f505f69 --- /dev/null +++ b/doc/tetrahedron_refinements/1-edge/edge_23_refined/23.txt @@ -0,0 +1,10 @@ +TET no. 0: +0.0, 0.0, 0.5 +1.0, 0.0, 0.0 +0.0, 1.0, 0.0 +0.0, 0.0, 0.0 +TET no. 1: +0.0, 0.0, 0.5 +0.0, 1.0, 0.0 +1.0, 0.0, 0.0 +0.0, 0.0, 1.0 diff --git a/doc/tetrahedron_refinements/1-edge/edge_23_refined/23.vtk b/doc/tetrahedron_refinements/1-edge/edge_23_refined/23.vtk new file mode 100644 index 0000000..7344fe8 --- /dev/null +++ b/doc/tetrahedron_refinements/1-edge/edge_23_refined/23.vtk @@ -0,0 +1,25 @@ +# vtk DataFile Version 2.0 +VTK LEGACY FILE FORMAT ASCII - tetrahedral sample file for H5FED test +ASCII +DATASET UNSTRUCTURED_GRID + +POINTS 5 DOUBLE +0.0 0.0 0.5 +1.0 0.0 0.0 +0.0 1.0 0.0 +0.0 0.0 0.0 +0.0 0.0 1.0 + +CELLS 2 10 +4 0 1 2 3 +4 0 2 1 4 + +CELL_TYPES 2 +10 +10 + +CELL_DATA 2 +SCALARS cell_attribute_data float 1 +LOOKUP_TABLE default +0 +1 diff --git a/doc/tetrahedron_refinements/1-edge/edge_23_refined/23_small.png b/doc/tetrahedron_refinements/1-edge/edge_23_refined/23_small.png new file mode 100644 index 0000000000000000000000000000000000000000..9d412d89d986405276f3bc84c531749c50009a05 GIT binary patch literal 8602 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 + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/doc/tetrahedron_refinements/1-edge/edge_30_refined/30.txt b/doc/tetrahedron_refinements/1-edge/edge_30_refined/30.txt new file mode 100644 index 0000000..a9a0eb6 --- /dev/null +++ b/doc/tetrahedron_refinements/1-edge/edge_30_refined/30.txt @@ -0,0 +1,10 @@ +TET no. 0: +0.5, 0.0, 0.0 +0.0, 1.0, 0.0 +0.0, 0.0, 1.0 +0.0, 0.0, 0.0 +TET no. 1: +0.5, 0.0, 0.0 +0.0, 0.0, 1.0 +0.0, 1.0, 0.0 +1.0, 0.0, 0.0 diff --git a/doc/tetrahedron_refinements/1-edge/edge_30_refined/30.vtk b/doc/tetrahedron_refinements/1-edge/edge_30_refined/30.vtk new file mode 100644 index 0000000..4943f6b --- /dev/null +++ b/doc/tetrahedron_refinements/1-edge/edge_30_refined/30.vtk @@ -0,0 +1,25 @@ +# vtk DataFile Version 2.0 +VTK LEGACY FILE FORMAT ASCII - tetrahedral sample file for H5FED test +ASCII +DATASET UNSTRUCTURED_GRID + +POINTS 5 DOUBLE +0.5 0.0 0.0 +0.0 1.0 0.0 +0.0 0.0 1.0 +0.0 0.0 0.0 +1.0 0.0 0.0 + +CELLS 2 10 +4 0 1 2 3 +4 0 2 1 4 + +CELL_TYPES 2 +10 +10 + +CELL_DATA 2 +SCALARS cell_attribute_data float 1 +LOOKUP_TABLE default +0 +1 diff --git a/doc/tetrahedron_refinements/1-edge/edge_30_refined/30_small.png b/doc/tetrahedron_refinements/1-edge/edge_30_refined/30_small.png new file mode 100644 index 0000000000000000000000000000000000000000..74ad080fa69498a78952e20814cf07f10bab3f3f GIT binary patch literal 7994 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 literal 0 HcmV?d00001 diff --git a/doc/tetrahedron_refinements/1-edge/edge_31_refined/31.png b/doc/tetrahedron_refinements/1-edge/edge_31_refined/31.png new file mode 100644 index 0000000000000000000000000000000000000000..d7dc63bfbc959baf7cc302f98919b2705281e569 GIT binary patch literal 9313 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 C?D?Vq literal 0 HcmV?d00001 diff --git a/doc/tetrahedron_refinements/1-edge/edge_31_refined/31.pvsm b/doc/tetrahedron_refinements/1-edge/edge_31_refined/31.pvsm new file mode 100644 index 0000000..490dcb1 --- /dev/null +++ b/doc/tetrahedron_refinements/1-edge/edge_31_refined/31.pvsm @@ -0,0 +1,2225 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/doc/tetrahedron_refinements/1-edge/edge_31_refined/31.txt b/doc/tetrahedron_refinements/1-edge/edge_31_refined/31.txt new file mode 100644 index 0000000..431e943 --- /dev/null +++ b/doc/tetrahedron_refinements/1-edge/edge_31_refined/31.txt @@ -0,0 +1,10 @@ +TET no. 0: +0.0, 0.5, 0.0 +0.0, 0.0, 1.0 +1.0, 0.0, 0.0 +0.0, 0.0, 0.0 +TET no. 1: +0.0, 0.5, 0.0 +1.0, 0.0, 0.0 +0.0, 0.0, 1.0 +0.0, 1.0, 0.0 diff --git a/doc/tetrahedron_refinements/1-edge/edge_31_refined/31.vtk b/doc/tetrahedron_refinements/1-edge/edge_31_refined/31.vtk new file mode 100644 index 0000000..a7c0c96 --- /dev/null +++ b/doc/tetrahedron_refinements/1-edge/edge_31_refined/31.vtk @@ -0,0 +1,25 @@ +# vtk DataFile Version 2.0 +VTK LEGACY FILE FORMAT ASCII - tetrahedral sample file for H5FED test +ASCII +DATASET UNSTRUCTURED_GRID + +POINTS 5 DOUBLE +0.0 0.5 0.0 +0.0 0.0 1.0 +1.0 0.0 0.0 +0.0 0.0 0.0 +0.0 1.0 0.0 + +CELLS 2 10 +4 0 1 2 3 +4 0 2 1 4 + +CELL_TYPES 2 +10 +10 + +CELL_DATA 2 +SCALARS cell_attribute_data float 1 +LOOKUP_TABLE default +0 +1 diff --git a/doc/tetrahedron_refinements/1-edge/edge_31_refined/31_small.png b/doc/tetrahedron_refinements/1-edge/edge_31_refined/31_small.png new file mode 100644 index 0000000000000000000000000000000000000000..77e56b21efafc016cd4e1c5861941bd10f05119a GIT binary patch literal 8901 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 literal 0 HcmV?d00001 diff --git a/doc/tetrahedron_refinements/2-edges/edge_01-12_refined/01-12.pvsm b/doc/tetrahedron_refinements/2-edges/edge_01-12_refined/01-12.pvsm new file mode 100644 index 0000000..a5fc96b --- /dev/null +++ b/doc/tetrahedron_refinements/2-edges/edge_01-12_refined/01-12.pvsm @@ -0,0 +1,1697 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/doc/tetrahedron_refinements/2-edges/edge_01-12_refined/01-12.txt b/doc/tetrahedron_refinements/2-edges/edge_01-12_refined/01-12.txt new file mode 100644 index 0000000..c6066e9 --- /dev/null +++ b/doc/tetrahedron_refinements/2-edges/edge_01-12_refined/01-12.txt @@ -0,0 +1,15 @@ +TET no. 0: +0.5, 0.5, 0.0 +0.0, 1.0, 0.0 +0.0, 0.5, 0.5 +0.0, 0.0, 0.0 +TET no. 1: +0.0, 0.5, 0.5 +1.0, 0.0, 0.0 +0.5, 0.5, 0.0 +0.0, 0.0, 0.0 +TET no. 2: +1.0, 0.0, 0.0 +0.0, 0.5, 0.5 +0.0, 0.0, 1.0 +0.0, 0.0, 0.0 diff --git a/doc/tetrahedron_refinements/2-edges/edge_01-12_refined/01-12.vtk b/doc/tetrahedron_refinements/2-edges/edge_01-12_refined/01-12.vtk new file mode 100644 index 0000000..9703b06 --- /dev/null +++ b/doc/tetrahedron_refinements/2-edges/edge_01-12_refined/01-12.vtk @@ -0,0 +1,29 @@ +# vtk DataFile Version 2.0 +VTK LEGACY FILE FORMAT ASCII - tetrahedral sample file for H5FED test +ASCII +DATASET UNSTRUCTURED_GRID + +POINTS 6 DOUBLE +0.5 0.5 0.0 +0.0 1.0 0.0 +0.0 0.5 0.5 +0.0 0.0 0.0 +1.0 0.0 0.0 +0.0 0.0 1.0 + +CELLS 3 15 +4 0 1 2 3 +4 2 4 0 3 +4 4 2 5 3 + +CELL_TYPES 3 +10 +10 +10 + +CELL_DATA 3 +SCALARS cell_attribute_data float 1 +LOOKUP_TABLE default +0 +1 +2 diff --git a/doc/tetrahedron_refinements/2-edges/edge_01-12_refined/01-12_smal.png b/doc/tetrahedron_refinements/2-edges/edge_01-12_refined/01-12_smal.png new file mode 100644 index 0000000000000000000000000000000000000000..6fff898fdbc9ca7c8510c42aeb09695b3b9f0858 GIT binary patch literal 8743 zcmb_?#^4?9Wx_tE=ginj~e(pxUUZYFZ+~arL{jU9f@#^E-NFGCi%LW+Fo}N z^k(9sPw!jtArS%Mx@Xjh50U*SqIB%!ZMXYG4$iLzXTS}!ztUHwlzNK!lABZ?Q+nvh z|1U@c$9gKO!nDY?sMMjoq`fqaygOa*4G){4e&1ofnHV{l^-NZVWB=OJ4lj$x3{+tb~9 zoo!mBTcxY3?`-C5R`U0D?0_!=>XEk1%?9&FT*5f)jC)4I(u#8(lpT}}^`#7=Iv%Li?9o=17< zrs2C$m=u$ic=QDHb4VpVRlczbiYm$~9>l8zRl1wiV(|v?29JTteZ83zQ*tl1eN92} zOUV8n@lNr9@?46U%DL)!Kv#`;qj=-g_x$#J!w)x3Rv*&PLsn_m;cssL`fy1CiEz?V zLoqHfuKwd6YXd<}p6Q};Ilov-=4wS4L*@7-O@3p+E1(rn$Da}YpZqK0@;X31{!Se1 z&r-h3_8|rkCGt7}dS@mnC!>Kp*Tr2F#}vmkz7NayZT^dg^~5&x>^#i)&myR3k$ex%pX61Ru*(J2%wBo~ey)dV+gC%5UbSA#W zAw0WOq#TWWpL}1YZVq*GNw zMfl8sj=$;3`?V`ax10Qmh8^y((G(gi^mI?A)0H|jaN6f1(ek4_YLXb(8wEsgfGXcfa8o)h?7b^u=;i7?bJc*Sp8gS%)b;up8fNY&6P^MU+2F@sCF`j z(N0V>IqVQNLXN{s=Sx$G43o~Xsk#7NjL0ht;P^SPu8$7HK3*h% z%l>sqxCed=O3+UTqL=)l7ptc#K<6Mi6(py<3GMTz>Qw8Z_(=@p|D!o|ctz!l9%A}Q z`yqm#N+6#4vsy805i8`dM5jt;tj409aX|`QW%K-*vg!63n=+RUd$ig?qRzJx?R0~E zgTLo1_1W%wUE7fqh#fB9d;W&G1HS&i5waNC)kSN1|3d9Vu6d)=x1;suwyDZC^`{0q zo(?mkx>$g#0HEGPXVD7gm^rmyz92N(@*{O-8P=^(GXdQiS}3w_`uqlVspBo_OL(p2T3l11BYJ7L_ZE0 z8TXKQ*Ot{#a~x{#^dP@=e%b^=mf3*yCuqP>@QuA_mm^u}^2ggHJ`5K)F$iS1pd0&g z8!bc&bDBc_F~EHk3xF|{=)J4w#5Q`eTRsRsgZLZrYVs!83`68l^VH>n?X2p6t|7y% zwB;&?R-(n?QRSg%{ult)tS2x~1p&m_Ur71KO91${K=FX#7-Z-27Y+a>1`@R}fc=T~ z%-?gK1p+>sg9^k)#|#ZqQEB&&3F~y207!1VtBX|x2$|#ue&2`hDeI^ln%!7toC9wXluS_N)%l4sV^BMdGi8w;l;ef25^pcy+-9BwZW|TBO+dt zm@39lW(o_%OGAsH&}6%b7s72L7A;5YpXajH*Mj%Zw=uwIBNfja%7htXS*_0;VUJK-)`zVU8A9e`V@`%#_{#XOVs_ zZt3_Ou;)SpVAgD0fduCa*U~j!rN@RVP2YxQZm=0cb=(A~1+Ja=uMj!o^LZ^LZvqB0 zf4!;}5>c`Q1-+CegP;M%0L7sJpsim6AoXEDNtqKct#0ETe#&Vsb zP+Ze##T9Y}#0;gVo$Z6ALZWi8?;YN#N!Wf^M* zS$U5gKKCJnlMf4$>Z{2k6OTFlK6;JaS5;b3EV;I|%wJ6|Al}jE*tFLKf6vD=kF5uV zV6;Qgl;ao89$o+NWeh+W-`q~_>2R}F`f}tAA^S3GL%yIryIj$WsKpl=vT09E4RKz- z{^A^?zox%7$4*&e+M3yN*MCL16w#p^t{mRyFzQicX%K(R2F^HUBbNItBu=(+)E@k} zQWM^EJN;zV(#0yHu9;UHM12Dg5!7J(xp-idLdb-DGg|xLBi{xS15{&(Yr`HtkFxctmu__J!9{s)KSy*KYZ^*7)A6?yRnI@SX%baA2jnqN?J~cjA44 zX`jRw{N+w7&-E)$7uWtgCniIt3R2#Cte#jt%x>mDmXP|5$eAt-QG>cZMcfvDNjH(` zZ&SidG?8}G&WEw{R2F{Y{^{3mj(k<;raTh6EBcQ@m;+OhZI#V;yXRS(ElC|!W%*_K ziDguURE2E|qTQlW{&8ygYU_jcTKgjj8-ssLe>5~TsIhYfX3>!4`fGd~y6oO=aK(A8 zXMo3|$LmAfg6~Dpop;9u2uS@Xc%c0)_sdjS;6sO){V0JrtNqdsw7|v}wD)4S9H&+i zeF658U!i$WdcE|TvK@v{otTj?5%2Ny4!w^sEhB&Q>nyRmymNU z&+1?th>}-C0eQ*5?b!RCP~=Mtdd0?7+k^Vk`nu|Hn!&h2-o#ma5!Rs`lb!@{QA~akt-Z#$liLw)#qa4ap*2 zCfQ3zM_0I7^7C5Mdr2kr>QN{}(*{}*tONOwWFMf%srpf120Nu7&4Vx9ltpP{$~bf9 z{^R;qsNgUyH>8!pZ2GUnmx-_474N3te8S<$h|ikuY|fFnEl&aD!ubW-qe;oR)a}I2 zTbF)ICQ9t}g3h;68KVO0zDl>tpS2NUr%~R9Mq&7qf;B|&$|+>Yt=c7=wpGB|DaxG! z-qdKl-5e>ZPe)G%V$BTh+YtMFg7Su!?0V=Sd&|)R-Jw*&VrVR2B`~!8<4Yv=@5`LG zQfr)U-SN++89Hxh?UoPjAya{;zFi0^UMRbo637sgd9gKhrZRYd^TtGFQ~|w`XxhWu z$J=Ml(@3=?UDK^>ZrZ7Y!!ha{1IYJ)zJ4}uox6`68<^TanlBIkYU%xzgZfFgfG45U zXL2D1k23E4MV_>c$P3IoO^7bv`+x~#1%F&d1|OeS%f9Fz(GPe3IWLnL-oeJa>oxsy zu;Mt><9I}*#Hl|_mM_$Fw7D`_ya6KB}~GR}Q1 z;v6GiO)fK|#M4c4^%{rF>Ykz7Mpy1J?o5+yEEbqrwo`}farv@V1iF;1*b%Ext?J#|mFShd3NSZcUv0L~Afq49|HSUoAHb2hHU-z?I>!o7Yy}&x zV`ytjCqDe(RZR_|Jy*+6Y}u(b%@2dlg^@ZQQx_@%SE1xG=}XZHD!Pl>Gwjo8YCpC@ ze)=VBuBRJ~eR@94*dIC)jAn!V$j}&mFT5bsoF?wcTr}F_F&Dw#yPF zJeH7WQZ{d(woQeC>NI8FjZjL->}wFL7qk?ClQ(g{s@qrNnm1lG?i?-J%PA4sj3AiO zc{szj3s_O8502n_`X~1RKON4rMbb@3^2Hx^Su;Q)l@~h*1hy8z2-76l4b13F>LL3+ zVle@WH?pb*MPBE1Jr)=jbktA*KhIZxZ>J)ujQE=s8wP%4Sqb%1q5>uL*KWsr*TW12 zTe^)EP1;h?c$5rvOVELW^V=rs>J&S?PXoo7=$Ql+{ef-?A#_;g0au_9)AT$B)542_ z!3_k{bwaxZv@2k{@hhAkQafv0?Ql@NVA=pe0Pq7Gz@u~rtVIzj5h`)(hO)g&#?Tq5 z=n7HEy}M}@ce!8qypL(traJ|Zjr*e2(?qy5NmGROX{M`MW41Ht*yeJf*iw(_J2<~} zAcO7Hdun@%n!Piz@^Harx8r3?Pe_Yp zDz15OzFMF23zIfdDFo6BxNqF&FsqEe?xgYKy!bSHzy9pecy`_Y93)cv-V^M}+3rW- zPvPX6w%a~VBk3mo_~};Q(&>P6b$7kE{#&2V;0c z3>>;M=Y^i3K@r(o_#J(YS2epv0F+M<17cl{NF&Z}W^*p9edDh)S>xQ5kT*0qG^pN^ z@Iu(5d$|{NiUPYaMOr+cW^S?crt_wY=GKCjlV;u<^PsmvyBq zrx=HuaB`(mlqeSj7j!C`3uFi`;oM2A`y?v`3SKVsLAaVK*X}hgH9Sw-RDRK~sjXfe zKmX_Exz_NV;2jhk>_sihT>Md>$I*5&VZ(cgA66|; zbG?85B$a5N(hh<3Twl8U7}-aj?UL2ia=!j%h?z~x6jz?mjrW4#7Nh-?LsDHhpDAYeYK=k$c>-#|9iV?{d_9 zWfR_kh%&P1h{RqD#J%luc$laJ9TyE4|4eR|@tT_^uSjb;sW5#&3JDU{0@Z5GV`ih!!r~qib?s3N7M-#h+iB8(X@saRkd(nl_#W1oOsZQ80|>cN_0RRyAG_ z{O+)~5gkJu#Vbf);Nzsavfk~gFtICeC^X2x;y^;Pnx2fHud}Oc;G9tGP;Bh8R~4Cj zr23@W_M%w=Sx!xpP(@#LS0P_z-fHM^|Nr}rYqD}^4_ty(~V4wc8{c-={8>QY5c~FqG3Jp9GBAHys4UbQ@#+1Es9{#SaRpMki8`Hz=3rbZ>L^2IB4fPQZvk$XW zu#||Dh=SnN{=gwbV#3W5eamC3iRbg=1DWXv%+x-->u;{CD|MieG5A=+nBW|1+6L`- z(??+acg&vG4e`v2x#}9D@y-Re<~3EYT5$eDHxKR2Do-iGze|1pbX48ZNwY7tI+$8v zaaE`}z6oC~Ms54GJ7b$Al>Cq5ubEGzOFf<8fyw{Ga=pYWwaL6*?#pycPP00a8K;{P zZ#pTOD=AeyfRAz((`^54-)!?5;k6I|$XRPYISJwEIYOI zc?i?=L{S=xQv4@ZDXPRdUv2ihR9Q0`OKP; zfJ~GR%GmV%_=j18*@XbQIJ)?g0j}WsJ3Kf!$v9Sg}8*c zUPRC=7n!{i^90^BS^IJI6$<}4PF#6O(58i5`lR)X%Wd->Di~n$4N*~Gj1jfQd(*lc zNizD%zSR=YuD0+a-!D9ry=(pJ&eIWGcoS!fcU>_&V;c~ps7Q*(Ie@%#I)nGWFCW(? zuK0{p;F+`Vd$?pljvi;Ph_oFLAJWe+c+fl%dR{&1D=O_^-$)U$su#3g6QbUiL zdrm&B;W@-}9HId;Y^oDoY<2MIfy%hj)DfH^RO(Og(%@BHW`vs{*Yh^>qOjyyZmu(L zc{j#l%8Xp!tvWx?oK|pT%dCXqKir%|oX9*zhF5Wzx((g5HRo9)Zs2Q*RU_676KP4E zhmgGtq4?%Ip4l#a4&eoZc?14Vp@JKx(3x1sS)PRL?eojLC2?1#Vl}Y!nc;>)_Lu#W z>9sQ-&MHIwehAkmWMa3Yygp|<$6(W3$<9QoWHKx&>0?4X< zS9jX?>zR5e$*b02-5tXcJ0l*C^>87h)TEN>S$vP9`ruh__0w0 z_~v8lm%GV(wQ3A)%iLqfeT~`|XOZZ%$}f};Jy=|`TGc!Xzxi1D<$6ul=YDYe1?vA{ z;^qS#hj3vgqjCy2>bg(Go|{u(6)|`3Q=;=%9&%M8W*pWuWn6kjuJca5*E=iU!#Wvg zMjIVp)meu)7L_NLCkLj!|Nj2_tJ~Vd{ddxrg<1S7UhS33R#vIJH*P5mq0C}_bS8d2 zdnUeOabKt{p@aGX=xi&OI+Dv=kta{q&dgvZB3&%-rl;drc$^t8C1tmw2EHD1d)kfX z%rt_8CjPAus_01?-zV-=Ygfw#*|R*LBE^8PhwWNkpqaqx$FQ?cCHq=`2mt=x6O}vq z;;$z05Rrm5i#zCbKgZ|6?AD*2D0dpv7VRWD(b9}2;o<~U31rkOQ zMuIBc%3jEztGr%FxVc=cokK1z1zSC;XvnLKEs%!G9^j%-;R0g5(i2C z%^3G2X^Wy>GcpiQ_MD_W^6$UKKe6r@K6=e(fHV2?Yj={xH>}aLou#D!W;Peob+&LavanL6w4@L({lxuCVd}w%Rcyfg43F!&< z;*^KpqG&%wmhPyGrg_7X|AAfC;oju7fVviIipO{zrGFglyA+v}(~z8TSnAYUlDDXX zV$8WqM|VLt#?Q#$(T8?ih%>ActOwm2^;S{oVR3Zagdm>oVwBy?I? zJ-PGJ`Z-<|MWttiPp(hy)r%$H=8HZz9S5FrzrQOO{OJ6`8-AjG;~qY^G8Cu?@MGTJ z*Ur~22TKK-<`=W3OlpR=^Uny}lwHvPyUsijDA9{ZM7g!0Fvp4oRxkb&3bAG%XCByD zaa_C61K+KF7;|K(G)K6uCfJz3wPArIEK%)0>WXN11iZL*a524!SNo}rlELgG13EC` zl4%PeUo-WCBBx7<^yq6~Nad$oXn0k+J%8=pT-|DX!NJuJhF&i+(E;)m8c-3PtyS~c zW!zU9ri@(BB&yWsDA$?Qv}ysxxFk^NuGmTq!v|XpPJOxanyif>i$3C6FthYql^vBv zuOy$uZ(6Wz7>@)kIyTPCC6IAC|7AVY*YVQv3Tgo&0IU)_)kc2QTyr{kr76R?N95S{ zIrfA1(g%z=rk8}^kP^0*EVhYngGl2qsganvm4#CiWrZ3FIPmgNEsQRRs!llF?+rqs z6^Hg@NpW+%ZtfC0rAAd0!*Vxy?vI`8ZJO!Fjw^;&J*0j7MelourRAjMrd3UaOfl%8 zucK;F)}cJyVedRWKOY$NNd0ICE2(HfmzvRV_t#QwqPLQi?{(F_ErXQU$v0Y~xC;2Y zhH=J*oTUojqaL1J}H(dS1&=xHd>RZp)R8NOt5>3 z5XnS@AbzBC$C=$g-pw^4=L84=ug@(yK7b7Q4XqyzNcM62k>XLQ3E37Tb$ds?^A~l; zQQ!vA@!M-eSc{ocKas|R(Ty8M3%QkEtc@SGtdlf)4B!-&U65_r)$DXXdut&K-ps2F zGwW)TzCJ{*l|I7wT7)g#KkZRHtwzPSO?unLtRGoFzNTKdBev)zZ>Ek5jorej!>OTE zp4A9LJ`;h-cK(EJzv$AB(Vss?eO67IT5Qvebj4pmo}Cm+G|?AI2J9UdcPxzZhY5sb z)TG&)WOCNoPefmkBMz4K0ij15nh6o=l?ovZRFI+d2%)w4aM`hAV{hJ z&{qkrl=S%1+8}rUR14 zjaHp~!#fUNd6U8;NUJrHS7sUb!E5QA8r(U-nZeW_JNA#*^ZQ!+TGinYna~oy&H*!2 zUA{XQ4+zjJVF6DcIi9)Q2OTJkuLM|K5H`4C=wMgqKX`Qh4d8`)kyNMko%BYl0hZ51 zTW~~UnzooH1HKv9;MHTc1h*Vm&J|A_8g048Z9!WMotx74+M{MGC;!oraHVZ>fNVfJ zrqkmcLMP|;94;I#B^-=~9lP!+iS`3z_D(KNq&l(hsV|#}Avhr0>Bze=;!etq)rvVE& zqCWAn_%<)dCXB&4rEj9{7Sa-X2!{$Q{IGK;iZsWKeDl99^8el&;ATkIkdk7)! e`G3L(;u=RT>1S2aEvUyGfRY?ownoN0?Ee6v-Uey_ literal 0 HcmV?d00001 diff --git a/doc/tetrahedron_refinements/2-edges/edge_01-12_refined/01-12_small.png b/doc/tetrahedron_refinements/2-edges/edge_01-12_refined/01-12_small.png new file mode 100644 index 0000000000000000000000000000000000000000..6fff898fdbc9ca7c8510c42aeb09695b3b9f0858 GIT binary patch literal 8743 zcmb_?#^4?9Wx_tE=ginj~e(pxUUZYFZ+~arL{jU9f@#^E-NFGCi%LW+Fo}N z^k(9sPw!jtArS%Mx@Xjh50U*SqIB%!ZMXYG4$iLzXTS}!ztUHwlzNK!lABZ?Q+nvh z|1U@c$9gKO!nDY?sMMjoq`fqaygOa*4G){4e&1ofnHV{l^-NZVWB=OJ4lj$x3{+tb~9 zoo!mBTcxY3?`-C5R`U0D?0_!=>XEk1%?9&FT*5f)jC)4I(u#8(lpT}}^`#7=Iv%Li?9o=17< zrs2C$m=u$ic=QDHb4VpVRlczbiYm$~9>l8zRl1wiV(|v?29JTteZ83zQ*tl1eN92} zOUV8n@lNr9@?46U%DL)!Kv#`;qj=-g_x$#J!w)x3Rv*&PLsn_m;cssL`fy1CiEz?V zLoqHfuKwd6YXd<}p6Q};Ilov-=4wS4L*@7-O@3p+E1(rn$Da}YpZqK0@;X31{!Se1 z&r-h3_8|rkCGt7}dS@mnC!>Kp*Tr2F#}vmkz7NayZT^dg^~5&x>^#i)&myR3k$ex%pX61Ru*(J2%wBo~ey)dV+gC%5UbSA#W zAw0WOq#TWWpL}1YZVq*GNw zMfl8sj=$;3`?V`ax10Qmh8^y((G(gi^mI?A)0H|jaN6f1(ek4_YLXb(8wEsgfGXcfa8o)h?7b^u=;i7?bJc*Sp8gS%)b;up8fNY&6P^MU+2F@sCF`j z(N0V>IqVQNLXN{s=Sx$G43o~Xsk#7NjL0ht;P^SPu8$7HK3*h% z%l>sqxCed=O3+UTqL=)l7ptc#K<6Mi6(py<3GMTz>Qw8Z_(=@p|D!o|ctz!l9%A}Q z`yqm#N+6#4vsy805i8`dM5jt;tj409aX|`QW%K-*vg!63n=+RUd$ig?qRzJx?R0~E zgTLo1_1W%wUE7fqh#fB9d;W&G1HS&i5waNC)kSN1|3d9Vu6d)=x1;suwyDZC^`{0q zo(?mkx>$g#0HEGPXVD7gm^rmyz92N(@*{O-8P=^(GXdQiS}3w_`uqlVspBo_OL(p2T3l11BYJ7L_ZE0 z8TXKQ*Ot{#a~x{#^dP@=e%b^=mf3*yCuqP>@QuA_mm^u}^2ggHJ`5K)F$iS1pd0&g z8!bc&bDBc_F~EHk3xF|{=)J4w#5Q`eTRsRsgZLZrYVs!83`68l^VH>n?X2p6t|7y% zwB;&?R-(n?QRSg%{ult)tS2x~1p&m_Ur71KO91${K=FX#7-Z-27Y+a>1`@R}fc=T~ z%-?gK1p+>sg9^k)#|#ZqQEB&&3F~y207!1VtBX|x2$|#ue&2`hDeI^ln%!7toC9wXluS_N)%l4sV^BMdGi8w;l;ef25^pcy+-9BwZW|TBO+dt zm@39lW(o_%OGAsH&}6%b7s72L7A;5YpXajH*Mj%Zw=uwIBNfja%7htXS*_0;VUJK-)`zVU8A9e`V@`%#_{#XOVs_ zZt3_Ou;)SpVAgD0fduCa*U~j!rN@RVP2YxQZm=0cb=(A~1+Ja=uMj!o^LZ^LZvqB0 zf4!;}5>c`Q1-+CegP;M%0L7sJpsim6AoXEDNtqKct#0ETe#&Vsb zP+Ze##T9Y}#0;gVo$Z6ALZWi8?;YN#N!Wf^M* zS$U5gKKCJnlMf4$>Z{2k6OTFlK6;JaS5;b3EV;I|%wJ6|Al}jE*tFLKf6vD=kF5uV zV6;Qgl;ao89$o+NWeh+W-`q~_>2R}F`f}tAA^S3GL%yIryIj$WsKpl=vT09E4RKz- z{^A^?zox%7$4*&e+M3yN*MCL16w#p^t{mRyFzQicX%K(R2F^HUBbNItBu=(+)E@k} zQWM^EJN;zV(#0yHu9;UHM12Dg5!7J(xp-idLdb-DGg|xLBi{xS15{&(Yr`HtkFxctmu__J!9{s)KSy*KYZ^*7)A6?yRnI@SX%baA2jnqN?J~cjA44 zX`jRw{N+w7&-E)$7uWtgCniIt3R2#Cte#jt%x>mDmXP|5$eAt-QG>cZMcfvDNjH(` zZ&SidG?8}G&WEw{R2F{Y{^{3mj(k<;raTh6EBcQ@m;+OhZI#V;yXRS(ElC|!W%*_K ziDguURE2E|qTQlW{&8ygYU_jcTKgjj8-ssLe>5~TsIhYfX3>!4`fGd~y6oO=aK(A8 zXMo3|$LmAfg6~Dpop;9u2uS@Xc%c0)_sdjS;6sO){V0JrtNqdsw7|v}wD)4S9H&+i zeF658U!i$WdcE|TvK@v{otTj?5%2Ny4!w^sEhB&Q>nyRmymNU z&+1?th>}-C0eQ*5?b!RCP~=Mtdd0?7+k^Vk`nu|Hn!&h2-o#ma5!Rs`lb!@{QA~akt-Z#$liLw)#qa4ap*2 zCfQ3zM_0I7^7C5Mdr2kr>QN{}(*{}*tONOwWFMf%srpf120Nu7&4Vx9ltpP{$~bf9 z{^R;qsNgUyH>8!pZ2GUnmx-_474N3te8S<$h|ikuY|fFnEl&aD!ubW-qe;oR)a}I2 zTbF)ICQ9t}g3h;68KVO0zDl>tpS2NUr%~R9Mq&7qf;B|&$|+>Yt=c7=wpGB|DaxG! z-qdKl-5e>ZPe)G%V$BTh+YtMFg7Su!?0V=Sd&|)R-Jw*&VrVR2B`~!8<4Yv=@5`LG zQfr)U-SN++89Hxh?UoPjAya{;zFi0^UMRbo637sgd9gKhrZRYd^TtGFQ~|w`XxhWu z$J=Ml(@3=?UDK^>ZrZ7Y!!ha{1IYJ)zJ4}uox6`68<^TanlBIkYU%xzgZfFgfG45U zXL2D1k23E4MV_>c$P3IoO^7bv`+x~#1%F&d1|OeS%f9Fz(GPe3IWLnL-oeJa>oxsy zu;Mt><9I}*#Hl|_mM_$Fw7D`_ya6KB}~GR}Q1 z;v6GiO)fK|#M4c4^%{rF>Ykz7Mpy1J?o5+yEEbqrwo`}farv@V1iF;1*b%Ext?J#|mFShd3NSZcUv0L~Afq49|HSUoAHb2hHU-z?I>!o7Yy}&x zV`ytjCqDe(RZR_|Jy*+6Y}u(b%@2dlg^@ZQQx_@%SE1xG=}XZHD!Pl>Gwjo8YCpC@ ze)=VBuBRJ~eR@94*dIC)jAn!V$j}&mFT5bsoF?wcTr}F_F&Dw#yPF zJeH7WQZ{d(woQeC>NI8FjZjL->}wFL7qk?ClQ(g{s@qrNnm1lG?i?-J%PA4sj3AiO zc{szj3s_O8502n_`X~1RKON4rMbb@3^2Hx^Su;Q)l@~h*1hy8z2-76l4b13F>LL3+ zVle@WH?pb*MPBE1Jr)=jbktA*KhIZxZ>J)ujQE=s8wP%4Sqb%1q5>uL*KWsr*TW12 zTe^)EP1;h?c$5rvOVELW^V=rs>J&S?PXoo7=$Ql+{ef-?A#_;g0au_9)AT$B)542_ z!3_k{bwaxZv@2k{@hhAkQafv0?Ql@NVA=pe0Pq7Gz@u~rtVIzj5h`)(hO)g&#?Tq5 z=n7HEy}M}@ce!8qypL(traJ|Zjr*e2(?qy5NmGROX{M`MW41Ht*yeJf*iw(_J2<~} zAcO7Hdun@%n!Piz@^Harx8r3?Pe_Yp zDz15OzFMF23zIfdDFo6BxNqF&FsqEe?xgYKy!bSHzy9pecy`_Y93)cv-V^M}+3rW- zPvPX6w%a~VBk3mo_~};Q(&>P6b$7kE{#&2V;0c z3>>;M=Y^i3K@r(o_#J(YS2epv0F+M<17cl{NF&Z}W^*p9edDh)S>xQ5kT*0qG^pN^ z@Iu(5d$|{NiUPYaMOr+cW^S?crt_wY=GKCjlV;u<^PsmvyBq zrx=HuaB`(mlqeSj7j!C`3uFi`;oM2A`y?v`3SKVsLAaVK*X}hgH9Sw-RDRK~sjXfe zKmX_Exz_NV;2jhk>_sihT>Md>$I*5&VZ(cgA66|; zbG?85B$a5N(hh<3Twl8U7}-aj?UL2ia=!j%h?z~x6jz?mjrW4#7Nh-?LsDHhpDAYeYK=k$c>-#|9iV?{d_9 zWfR_kh%&P1h{RqD#J%luc$laJ9TyE4|4eR|@tT_^uSjb;sW5#&3JDU{0@Z5GV`ih!!r~qib?s3N7M-#h+iB8(X@saRkd(nl_#W1oOsZQ80|>cN_0RRyAG_ z{O+)~5gkJu#Vbf);Nzsavfk~gFtICeC^X2x;y^;Pnx2fHud}Oc;G9tGP;Bh8R~4Cj zr23@W_M%w=Sx!xpP(@#LS0P_z-fHM^|Nr}rYqD}^4_ty(~V4wc8{c-={8>QY5c~FqG3Jp9GBAHys4UbQ@#+1Es9{#SaRpMki8`Hz=3rbZ>L^2IB4fPQZvk$XW zu#||Dh=SnN{=gwbV#3W5eamC3iRbg=1DWXv%+x-->u;{CD|MieG5A=+nBW|1+6L`- z(??+acg&vG4e`v2x#}9D@y-Re<~3EYT5$eDHxKR2Do-iGze|1pbX48ZNwY7tI+$8v zaaE`}z6oC~Ms54GJ7b$Al>Cq5ubEGzOFf<8fyw{Ga=pYWwaL6*?#pycPP00a8K;{P zZ#pTOD=AeyfRAz((`^54-)!?5;k6I|$XRPYISJwEIYOI zc?i?=L{S=xQv4@ZDXPRdUv2ihR9Q0`OKP; zfJ~GR%GmV%_=j18*@XbQIJ)?g0j}WsJ3Kf!$v9Sg}8*c zUPRC=7n!{i^90^BS^IJI6$<}4PF#6O(58i5`lR)X%Wd->Di~n$4N*~Gj1jfQd(*lc zNizD%zSR=YuD0+a-!D9ry=(pJ&eIWGcoS!fcU>_&V;c~ps7Q*(Ie@%#I)nGWFCW(? zuK0{p;F+`Vd$?pljvi;Ph_oFLAJWe+c+fl%dR{&1D=O_^-$)U$su#3g6QbUiL zdrm&B;W@-}9HId;Y^oDoY<2MIfy%hj)DfH^RO(Og(%@BHW`vs{*Yh^>qOjyyZmu(L zc{j#l%8Xp!tvWx?oK|pT%dCXqKir%|oX9*zhF5Wzx((g5HRo9)Zs2Q*RU_676KP4E zhmgGtq4?%Ip4l#a4&eoZc?14Vp@JKx(3x1sS)PRL?eojLC2?1#Vl}Y!nc;>)_Lu#W z>9sQ-&MHIwehAkmWMa3Yygp|<$6(W3$<9QoWHKx&>0?4X< zS9jX?>zR5e$*b02-5tXcJ0l*C^>87h)TEN>S$vP9`ruh__0w0 z_~v8lm%GV(wQ3A)%iLqfeT~`|XOZZ%$}f};Jy=|`TGc!Xzxi1D<$6ul=YDYe1?vA{ z;^qS#hj3vgqjCy2>bg(Go|{u(6)|`3Q=;=%9&%M8W*pWuWn6kjuJca5*E=iU!#Wvg zMjIVp)meu)7L_NLCkLj!|Nj2_tJ~Vd{ddxrg<1S7UhS33R#vIJH*P5mq0C}_bS8d2 zdnUeOabKt{p@aGX=xi&OI+Dv=kta{q&dgvZB3&%-rl;drc$^t8C1tmw2EHD1d)kfX z%rt_8CjPAus_01?-zV-=Ygfw#*|R*LBE^8PhwWNkpqaqx$FQ?cCHq=`2mt=x6O}vq z;;$z05Rrm5i#zCbKgZ|6?AD*2D0dpv7VRWD(b9}2;o<~U31rkOQ zMuIBc%3jEztGr%FxVc=cokK1z1zSC;XvnLKEs%!G9^j%-;R0g5(i2C z%^3G2X^Wy>GcpiQ_MD_W^6$UKKe6r@K6=e(fHV2?Yj={xH>}aLou#D!W;Peob+&LavanL6w4@L({lxuCVd}w%Rcyfg43F!&< z;*^KpqG&%wmhPyGrg_7X|AAfC;oju7fVviIipO{zrGFglyA+v}(~z8TSnAYUlDDXX zV$8WqM|VLt#?Q#$(T8?ih%>ActOwm2^;S{oVR3Zagdm>oVwBy?I? zJ-PGJ`Z-<|MWttiPp(hy)r%$H=8HZz9S5FrzrQOO{OJ6`8-AjG;~qY^G8Cu?@MGTJ z*Ur~22TKK-<`=W3OlpR=^Uny}lwHvPyUsijDA9{ZM7g!0Fvp4oRxkb&3bAG%XCByD zaa_C61K+KF7;|K(G)K6uCfJz3wPArIEK%)0>WXN11iZL*a524!SNo}rlELgG13EC` zl4%PeUo-WCBBx7<^yq6~Nad$oXn0k+J%8=pT-|DX!NJuJhF&i+(E;)m8c-3PtyS~c zW!zU9ri@(BB&yWsDA$?Qv}ysxxFk^NuGmTq!v|XpPJOxanyif>i$3C6FthYql^vBv zuOy$uZ(6Wz7>@)kIyTPCC6IAC|7AVY*YVQv3Tgo&0IU)_)kc2QTyr{kr76R?N95S{ zIrfA1(g%z=rk8}^kP^0*EVhYngGl2qsganvm4#CiWrZ3FIPmgNEsQRRs!llF?+rqs z6^Hg@NpW+%ZtfC0rAAd0!*Vxy?vI`8ZJO!Fjw^;&J*0j7MelourRAjMrd3UaOfl%8 zucK;F)}cJyVedRWKOY$NNd0ICE2(HfmzvRV_t#QwqPLQi?{(F_ErXQU$v0Y~xC;2Y zhH=J*oTUojqaL1J}H(dS1&=xHd>RZp)R8NOt5>3 z5XnS@AbzBC$C=$g-pw^4=L84=ug@(yK7b7Q4XqyzNcM62k>XLQ3E37Tb$ds?^A~l; zQQ!vA@!M-eSc{ocKas|R(Ty8M3%QkEtc@SGtdlf)4B!-&U65_r)$DXXdut&K-ps2F zGwW)TzCJ{*l|I7wT7)g#KkZRHtwzPSO?unLtRGoFzNTKdBev)zZ>Ek5jorej!>OTE zp4A9LJ`;h-cK(EJzv$AB(Vss?eO67IT5Qvebj4pmo}Cm+G|?AI2J9UdcPxzZhY5sb z)TG&)WOCNoPefmkBMz4K0ij15nh6o=l?ovZRFI+d2%)w4aM`hAV{hJ z&{qkrl=S%1+8}rUR14 zjaHp~!#fUNd6U8;NUJrHS7sUb!E5QA8r(U-nZeW_JNA#*^ZQ!+TGinYna~oy&H*!2 zUA{XQ4+zjJVF6DcIi9)Q2OTJkuLM|K5H`4C=wMgqKX`Qh4d8`)kyNMko%BYl0hZ51 zTW~~UnzooH1HKv9;MHTc1h*Vm&J|A_8g048Z9!WMotx74+M{MGC;!oraHVZ>fNVfJ zrqkmcLMP|;94;I#B^-=~9lP!+iS`3z_D(KNq&l(hsV|#}Avhr0>Bze=;!etq)rvVE& zqCWAn_%<)dCXB&4rEj9{7Sa-X2!{$Q{IGK;iZsWKeDl99^8el&;ATkIkdk7)! e`G3L(;u=RT>1S2aEvUyGfRY?ownoN0?Ee6v-Uey_ literal 0 HcmV?d00001 diff --git a/doc/tetrahedron_refinements/2-edges/edge_01-20_refined/01-20.png b/doc/tetrahedron_refinements/2-edges/edge_01-20_refined/01-20.png new file mode 100644 index 0000000000000000000000000000000000000000..9d5cdf58c2aea82f4b40dc06cc784e05dbe6d52c GIT binary patch literal 9787 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 HJdgiB!wP1r literal 0 HcmV?d00001 diff --git a/doc/tetrahedron_refinements/2-edges/edge_01-20_refined/01-20.pvsm b/doc/tetrahedron_refinements/2-edges/edge_01-20_refined/01-20.pvsm new file mode 100644 index 0000000..0ceadce --- /dev/null +++ b/doc/tetrahedron_refinements/2-edges/edge_01-20_refined/01-20.pvsm @@ -0,0 +1,1697 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/doc/tetrahedron_refinements/2-edges/edge_01-20_refined/01-20.txt b/doc/tetrahedron_refinements/2-edges/edge_01-20_refined/01-20.txt new file mode 100644 index 0000000..18b4cc7 --- /dev/null +++ b/doc/tetrahedron_refinements/2-edges/edge_01-20_refined/01-20.txt @@ -0,0 +1,15 @@ +TET no. 0: +0.5, 0.0, 0.5 +1.0, 0.0, 0.0 +0.5, 0.5, 0.0 +0.0, 0.0, 0.0 +TET no. 1: +0.5, 0.5, 0.0 +0.0, 0.0, 1.0 +0.5, 0.0, 0.5 +0.0, 0.0, 0.0 +TET no. 2: +0.0, 0.0, 1.0 +0.5, 0.5, 0.0 +0.0, 1.0, 0.0 +0.0, 0.0, 0.0 diff --git a/doc/tetrahedron_refinements/2-edges/edge_01-20_refined/01-20.vtk b/doc/tetrahedron_refinements/2-edges/edge_01-20_refined/01-20.vtk new file mode 100644 index 0000000..8f89517 --- /dev/null +++ b/doc/tetrahedron_refinements/2-edges/edge_01-20_refined/01-20.vtk @@ -0,0 +1,29 @@ +# vtk DataFile Version 2.0 +VTK LEGACY FILE FORMAT ASCII - tetrahedral sample file for H5FED test +ASCII +DATASET UNSTRUCTURED_GRID + +POINTS 6 DOUBLE +0.5 0.0 0.5 +1.0 0.0 0.0 +0.5 0.5 0.0 +0.0 0.0 0.0 +0.0 0.0 1.0 +0.0 1.0 0.0 + +CELLS 3 15 +4 0 1 2 3 +4 2 4 0 3 +4 4 2 5 3 + +CELL_TYPES 3 +10 +10 +10 + +CELL_DATA 3 +SCALARS cell_attribute_data float 1 +LOOKUP_TABLE default +0 +1 +2 diff --git a/doc/tetrahedron_refinements/2-edges/edge_01-20_refined/01-20_small.png b/doc/tetrahedron_refinements/2-edges/edge_01-20_refined/01-20_small.png new file mode 100644 index 0000000000000000000000000000000000000000..b03d2eaafdc616c245ec72dc1160121d9ce81b2d GIT binary patch literal 9470 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�fMngsmv2R2=XvbX6DyAR1aGMsaN32;O{!d+=P%NHcz&dSqsUSrzY zs-`UYvf0#T^smyfU+s&?N{JWfRleg+a-5JEkPDVtT6J=5vY+qDvb~Nkq?3wCf$px3 zPGcPTwZELg4=dn>xa!*9m7LuRjSGaU;wdWWn81mHrTD;&I(3QAgh}Fy{16z^WfgjWWe+>Eh_;<&<)T6>@wa_6kVX6-~ zO}_p2SeXMLEs&NA1XsjcFrn6>M+yMcnhTfa(Va8)KSPYvzv+IpU=r}QoI`i)FW zwdEV48qBIfiyt3`Ozr*ekjmh=j~4*S*CV@4iv$_j36lHU4^9qF*0ihl^&qM(E)Gr( z`TwnyGm_DO6q7{zefBB3ac)XlQt(G4q(N(Ic0*CuzO{q3uSRF7E};OG@6N9nsH-UR zC=GoqTTbnkp>idvC921=mmhCFg5-62P{8H^G{5C-&}CrxgG8&5A)1~!#bpOT?LuHNAY-E*n-eW16WUcQV3XTsd!zy3V&8LNP z6ObJ*B-_Y`iwYj&;bnd%fV+*xT8E<-Z7^^!I%L6(M=hJK{ob>7Av z(0N5VQ1or5|5@Iom`|>Ev3K$L=jcnEfVuAIiN~!MDK&wzhG64KDv)!jnx&QX`x?dVXwBd>6+oK nJIJ(_CIgE9e+@p{F9@GJu<$n~w;$m>OMsMwoOrdULBRh3U95cM literal 0 HcmV?d00001 diff --git a/doc/tetrahedron_refinements/2-edges/edge_01-23_refined/01-23.png b/doc/tetrahedron_refinements/2-edges/edge_01-23_refined/01-23.png new file mode 100644 index 0000000000000000000000000000000000000000..9922355f2ff18f08b3b276574cfb65a6d872dfe3 GIT binary patch literal 10861 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 R_?af!zRh9lgU!tI{|}$~_LTqt literal 0 HcmV?d00001 diff --git a/doc/tetrahedron_refinements/2-edges/edge_01-23_refined/01-23.pvsm b/doc/tetrahedron_refinements/2-edges/edge_01-23_refined/01-23.pvsm new file mode 100644 index 0000000..d690ff6 --- /dev/null +++ b/doc/tetrahedron_refinements/2-edges/edge_01-23_refined/01-23.pvsm @@ -0,0 +1,1697 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/doc/tetrahedron_refinements/2-edges/edge_01-23_refined/01-23.txt b/doc/tetrahedron_refinements/2-edges/edge_01-23_refined/01-23.txt new file mode 100644 index 0000000..38e651c --- /dev/null +++ b/doc/tetrahedron_refinements/2-edges/edge_01-23_refined/01-23.txt @@ -0,0 +1,20 @@ +TET no. 0: +1.0, 0.0, 0.0 +0.5, 0.5, 0.0 +0.0, 0.0, 0.5 +0.0, 0.0, 0.0 +TET no. 1: +0.5, 0.5, 0.0 +0.0, 1.0, 0.0 +0.0, 0.0, 0.5 +0.0, 0.0, 0.0 +TET no. 2: +0.5, 0.5, 0.0 +0.0, 0.0, 0.5 +0.0, 1.0, 0.0 +0.0, 0.0, 1.0 +TET no. 3: +1.0, 0.0, 0.0 +0.0, 0.0, 0.5 +0.5, 0.5, 0.0 +0.0, 0.0, 1.0 diff --git a/doc/tetrahedron_refinements/2-edges/edge_01-23_refined/01-23.vtk b/doc/tetrahedron_refinements/2-edges/edge_01-23_refined/01-23.vtk new file mode 100644 index 0000000..f7310fd --- /dev/null +++ b/doc/tetrahedron_refinements/2-edges/edge_01-23_refined/01-23.vtk @@ -0,0 +1,32 @@ +# vtk DataFile Version 2.0 +VTK LEGACY FILE FORMAT ASCII - tetrahedral sample file for H5FED test +ASCII +DATASET UNSTRUCTURED_GRID + +POINTS 6 DOUBLE +1.0 0.0 0.0 +0.5 0.5 0.0 +0.0 0.0 0.5 +0.0 0.0 0.0 +0.0 1.0 0.0 +0.0 0.0 1.0 + +CELLS 4 20 +4 0 1 2 3 +4 1 4 2 3 +4 1 2 4 5 +4 0 2 1 5 + +CELL_TYPES 4 +10 +10 +10 +10 + +CELL_DATA 4 +SCALARS cell_attribute_data float 1 +LOOKUP_TABLE default +0 +1 +2 +3 diff --git a/doc/tetrahedron_refinements/2-edges/edge_01-23_refined/01-23_smal.png b/doc/tetrahedron_refinements/2-edges/edge_01-23_refined/01-23_smal.png new file mode 100644 index 0000000000000000000000000000000000000000..ccbb10cc2a460ab5687da1955c05c62f4522ad6e GIT binary patch literal 12185 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 literal 0 HcmV?d00001 diff --git a/doc/tetrahedron_refinements/2-edges/edge_01-30_refined/01-30.pvsm b/doc/tetrahedron_refinements/2-edges/edge_01-30_refined/01-30.pvsm new file mode 100644 index 0000000..cb94856 --- /dev/null +++ b/doc/tetrahedron_refinements/2-edges/edge_01-30_refined/01-30.pvsm @@ -0,0 +1,1697 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/doc/tetrahedron_refinements/2-edges/edge_01-30_refined/01-30.txt b/doc/tetrahedron_refinements/2-edges/edge_01-30_refined/01-30.txt new file mode 100644 index 0000000..870a776 --- /dev/null +++ b/doc/tetrahedron_refinements/2-edges/edge_01-30_refined/01-30.txt @@ -0,0 +1,15 @@ +TET no. 0: +0.5, 0.5, 0.0 +1.0, 0.0, 0.0 +0.5, 0.0, 0.0 +0.0, 0.0, 1.0 +TET no. 1: +0.5, 0.0, 0.0 +0.0, 1.0, 0.0 +0.5, 0.5, 0.0 +0.0, 0.0, 1.0 +TET no. 2: +0.0, 1.0, 0.0 +0.5, 0.0, 0.0 +0.0, 0.0, 0.0 +0.0, 0.0, 1.0 diff --git a/doc/tetrahedron_refinements/2-edges/edge_01-30_refined/01-30.vtk b/doc/tetrahedron_refinements/2-edges/edge_01-30_refined/01-30.vtk new file mode 100644 index 0000000..e1069c1 --- /dev/null +++ b/doc/tetrahedron_refinements/2-edges/edge_01-30_refined/01-30.vtk @@ -0,0 +1,29 @@ +# vtk DataFile Version 2.0 +VTK LEGACY FILE FORMAT ASCII - tetrahedral sample file for H5FED test +ASCII +DATASET UNSTRUCTURED_GRID + +POINTS 6 DOUBLE +0.5 0.5 0.0 +1.0 0.0 0.0 +0.5 0.0 0.0 +0.0 0.0 1.0 +0.0 1.0 0.0 +0.0 0.0 0.0 + +CELLS 3 15 +4 0 1 2 3 +4 2 4 0 3 +4 4 2 5 3 + +CELL_TYPES 3 +10 +10 +10 + +CELL_DATA 3 +SCALARS cell_attribute_data float 1 +LOOKUP_TABLE default +0 +1 +2 diff --git a/doc/tetrahedron_refinements/2-edges/edge_01-30_refined/01-30_small.png b/doc/tetrahedron_refinements/2-edges/edge_01-30_refined/01-30_small.png new file mode 100644 index 0000000000000000000000000000000000000000..4ef8008e78ba814bb203de4757043e3895110691 GIT binary patch literal 11008 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 z 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 S{eYLc$Y*hY=lMmfeg7Y`D5Pir literal 0 HcmV?d00001 diff --git a/doc/tetrahedron_refinements/2-edges/edge_01-31_refined/01-31.pvsm b/doc/tetrahedron_refinements/2-edges/edge_01-31_refined/01-31.pvsm new file mode 100644 index 0000000..a1b5946 --- /dev/null +++ b/doc/tetrahedron_refinements/2-edges/edge_01-31_refined/01-31.pvsm @@ -0,0 +1,1697 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/doc/tetrahedron_refinements/2-edges/edge_01-31_refined/01-31.txt b/doc/tetrahedron_refinements/2-edges/edge_01-31_refined/01-31.txt new file mode 100644 index 0000000..ff361ec --- /dev/null +++ b/doc/tetrahedron_refinements/2-edges/edge_01-31_refined/01-31.txt @@ -0,0 +1,15 @@ +TET no. 0: +0.0, 0.5, 0.0 +0.0, 1.0, 0.0 +0.5, 0.5, 0.0 +0.0, 0.0, 1.0 +TET no. 1: +0.5, 0.5, 0.0 +0.0, 0.0, 0.0 +0.0, 0.5, 0.0 +0.0, 0.0, 1.0 +TET no. 2: +0.0, 0.0, 0.0 +0.5, 0.5, 0.0 +1.0, 0.0, 0.0 +0.0, 0.0, 1.0 diff --git a/doc/tetrahedron_refinements/2-edges/edge_01-31_refined/01-31.vtk b/doc/tetrahedron_refinements/2-edges/edge_01-31_refined/01-31.vtk new file mode 100644 index 0000000..8580cf2 --- /dev/null +++ b/doc/tetrahedron_refinements/2-edges/edge_01-31_refined/01-31.vtk @@ -0,0 +1,29 @@ +# vtk DataFile Version 2.0 +VTK LEGACY FILE FORMAT ASCII - tetrahedral sample file for H5FED test +ASCII +DATASET UNSTRUCTURED_GRID + +POINTS 6 DOUBLE +0.0 0.5 0.0 +0.0 1.0 0.0 +0.5 0.5 0.0 +0.0 0.0 1.0 +0.0 0.0 0.0 +1.0 0.0 0.0 + +CELLS 3 15 +4 0 1 2 3 +4 2 4 0 3 +4 4 2 5 3 + +CELL_TYPES 3 +10 +10 +10 + +CELL_DATA 3 +SCALARS cell_attribute_data float 1 +LOOKUP_TABLE default +0 +1 +2 diff --git a/doc/tetrahedron_refinements/2-edges/edge_01-31_refined/01-31_small.png b/doc/tetrahedron_refinements/2-edges/edge_01-31_refined/01-31_small.png new file mode 100644 index 0000000000000000000000000000000000000000..e875b719147964febb62e2c2ddc81d4901d17e41 GIT binary patch literal 12429 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 literal 0 HcmV?d00001 diff --git a/doc/tetrahedron_refinements/2-edges/edge_12-20_refined/12-20.png b/doc/tetrahedron_refinements/2-edges/edge_12-20_refined/12-20.png new file mode 100644 index 0000000000000000000000000000000000000000..4525fad128ade72b17337bd8ed2ccfb832106fb9 GIT binary patch literal 9769 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 KmG_s+<^KotBAG4# literal 0 HcmV?d00001 diff --git a/doc/tetrahedron_refinements/2-edges/edge_12-20_refined/12-20.pvsm b/doc/tetrahedron_refinements/2-edges/edge_12-20_refined/12-20.pvsm new file mode 100644 index 0000000..c3f128b --- /dev/null +++ b/doc/tetrahedron_refinements/2-edges/edge_12-20_refined/12-20.pvsm @@ -0,0 +1,1697 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/doc/tetrahedron_refinements/2-edges/edge_12-20_refined/12-20.txt b/doc/tetrahedron_refinements/2-edges/edge_12-20_refined/12-20.txt new file mode 100644 index 0000000..93f842d --- /dev/null +++ b/doc/tetrahedron_refinements/2-edges/edge_12-20_refined/12-20.txt @@ -0,0 +1,15 @@ +TET no. 0: +0.0, 0.5, 0.5 +0.0, 0.0, 1.0 +0.5, 0.0, 0.5 +0.0, 0.0, 0.0 +TET no. 1: +0.5, 0.0, 0.5 +0.0, 1.0, 0.0 +0.0, 0.5, 0.5 +0.0, 0.0, 0.0 +TET no. 2: +0.0, 1.0, 0.0 +0.5, 0.0, 0.5 +1.0, 0.0, 0.0 +0.0, 0.0, 0.0 diff --git a/doc/tetrahedron_refinements/2-edges/edge_12-20_refined/12-20.vtk b/doc/tetrahedron_refinements/2-edges/edge_12-20_refined/12-20.vtk new file mode 100644 index 0000000..79acc34 --- /dev/null +++ b/doc/tetrahedron_refinements/2-edges/edge_12-20_refined/12-20.vtk @@ -0,0 +1,29 @@ +# vtk DataFile Version 2.0 +VTK LEGACY FILE FORMAT ASCII - tetrahedral sample file for H5FED test +ASCII +DATASET UNSTRUCTURED_GRID + +POINTS 6 DOUBLE +0.0 0.5 0.5 +0.0 0.0 1.0 +0.5 0.0 0.5 +0.0 0.0 0.0 +0.0 1.0 0.0 +1.0 0.0 0.0 + +CELLS 3 15 +4 0 1 2 3 +4 2 4 0 3 +4 4 2 5 3 + +CELL_TYPES 3 +10 +10 +10 + +CELL_DATA 3 +SCALARS cell_attribute_data float 1 +LOOKUP_TABLE default +0 +1 +2 diff --git a/doc/tetrahedron_refinements/2-edges/edge_12-20_refined/12-20_small.png b/doc/tetrahedron_refinements/2-edges/edge_12-20_refined/12-20_small.png new file mode 100644 index 0000000000000000000000000000000000000000..cd84e9c5e57b0fbab9fbb680685c522983e91a69 GIT binary patch literal 9346 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 literal 0 HcmV?d00001 diff --git a/doc/tetrahedron_refinements/2-edges/edge_12-23_refined/12-23.png b/doc/tetrahedron_refinements/2-edges/edge_12-23_refined/12-23.png new file mode 100644 index 0000000000000000000000000000000000000000..5a61741e5b5bac63dab89f0ef2cd95d77f29f70e GIT binary patch literal 11278 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 + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/doc/tetrahedron_refinements/2-edges/edge_12-23_refined/12-23.txt b/doc/tetrahedron_refinements/2-edges/edge_12-23_refined/12-23.txt new file mode 100644 index 0000000..143d814 --- /dev/null +++ b/doc/tetrahedron_refinements/2-edges/edge_12-23_refined/12-23.txt @@ -0,0 +1,15 @@ +TET no. 0: +0.0, 0.0, 0.5 +0.0, 0.0, 1.0 +0.0, 0.5, 0.5 +1.0, 0.0, 0.0 +TET no. 1: +0.0, 0.5, 0.5 +0.0, 0.0, 0.0 +0.0, 0.0, 0.5 +1.0, 0.0, 0.0 +TET no. 2: +0.0, 0.0, 0.0 +0.0, 0.5, 0.5 +0.0, 1.0, 0.0 +1.0, 0.0, 0.0 diff --git a/doc/tetrahedron_refinements/2-edges/edge_12-23_refined/12-23.vtk b/doc/tetrahedron_refinements/2-edges/edge_12-23_refined/12-23.vtk new file mode 100644 index 0000000..efe3fa0 --- /dev/null +++ b/doc/tetrahedron_refinements/2-edges/edge_12-23_refined/12-23.vtk @@ -0,0 +1,29 @@ +# vtk DataFile Version 2.0 +VTK LEGACY FILE FORMAT ASCII - tetrahedral sample file for H5FED test +ASCII +DATASET UNSTRUCTURED_GRID + +POINTS 6 DOUBLE +0.0 0.0 0.5 +0.0 0.0 1.0 +0.0 0.5 0.5 +1.0 0.0 0.0 +0.0 0.0 0.0 +0.0 1.0 0.0 + +CELLS 3 15 +4 0 1 2 3 +4 2 4 0 3 +4 4 2 5 3 + +CELL_TYPES 3 +10 +10 +10 + +CELL_DATA 3 +SCALARS cell_attribute_data float 1 +LOOKUP_TABLE default +0 +1 +2 diff --git a/doc/tetrahedron_refinements/2-edges/edge_12-23_refined/12-23_small.png b/doc/tetrahedron_refinements/2-edges/edge_12-23_refined/12-23_small.png new file mode 100644 index 0000000000000000000000000000000000000000..0a41d5d48cac867147cc5d6e7b42ae69ba137ca3 GIT binary patch literal 12470 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 literal 0 HcmV?d00001 diff --git a/doc/tetrahedron_refinements/2-edges/edge_12-30_refined/12-30.png b/doc/tetrahedron_refinements/2-edges/edge_12-30_refined/12-30.png new file mode 100644 index 0000000000000000000000000000000000000000..173f194c74edc4d92ffc46ee1d4defd27159aef2 GIT binary patch literal 12286 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 + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/doc/tetrahedron_refinements/2-edges/edge_12-30_refined/12-30.txt b/doc/tetrahedron_refinements/2-edges/edge_12-30_refined/12-30.txt new file mode 100644 index 0000000..5bb4c81 --- /dev/null +++ b/doc/tetrahedron_refinements/2-edges/edge_12-30_refined/12-30.txt @@ -0,0 +1,20 @@ +TET no. 0: +1.0, 0.0, 0.0 +0.0, 0.5, 0.5 +0.5, 0.0, 0.0 +0.0, 1.0, 0.0 +TET no. 1: +0.0, 0.5, 0.5 +0.0, 0.0, 0.0 +0.5, 0.0, 0.0 +0.0, 1.0, 0.0 +TET no. 2: +0.0, 0.5, 0.5 +0.5, 0.0, 0.0 +0.0, 0.0, 0.0 +0.0, 0.0, 1.0 +TET no. 3: +1.0, 0.0, 0.0 +0.5, 0.0, 0.0 +0.0, 0.5, 0.5 +0.0, 0.0, 1.0 diff --git a/doc/tetrahedron_refinements/2-edges/edge_12-30_refined/12-30.vtk b/doc/tetrahedron_refinements/2-edges/edge_12-30_refined/12-30.vtk new file mode 100644 index 0000000..03ee1f9 --- /dev/null +++ b/doc/tetrahedron_refinements/2-edges/edge_12-30_refined/12-30.vtk @@ -0,0 +1,32 @@ +# vtk DataFile Version 2.0 +VTK LEGACY FILE FORMAT ASCII - tetrahedral sample file for H5FED test +ASCII +DATASET UNSTRUCTURED_GRID + +POINTS 6 DOUBLE +1.0 0.0 0.0 +0.0 0.5 0.5 +0.5 0.0 0.0 +0.0 1.0 0.0 +0.0 0.0 0.0 +0.0 0.0 1.0 + +CELLS 4 20 +4 0 1 2 3 +4 1 4 2 3 +4 1 2 4 5 +4 0 2 1 5 + +CELL_TYPES 4 +10 +10 +10 +10 + +CELL_DATA 4 +SCALARS cell_attribute_data float 1 +LOOKUP_TABLE default +0 +1 +2 +3 diff --git a/doc/tetrahedron_refinements/2-edges/edge_12-30_refined/12-30_small.png b/doc/tetrahedron_refinements/2-edges/edge_12-30_refined/12-30_small.png new file mode 100644 index 0000000000000000000000000000000000000000..6a34cf2394447f5417b7ca5427136a9bb32f90ac GIT binary patch literal 13490 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 E0W~j6rvLx| literal 0 HcmV?d00001 diff --git a/doc/tetrahedron_refinements/2-edges/edge_12-31_refined/12-31.pvsm b/doc/tetrahedron_refinements/2-edges/edge_12-31_refined/12-31.pvsm new file mode 100644 index 0000000..a5acbf4 --- /dev/null +++ b/doc/tetrahedron_refinements/2-edges/edge_12-31_refined/12-31.pvsm @@ -0,0 +1,1697 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/doc/tetrahedron_refinements/2-edges/edge_12-31_refined/12-31.txt b/doc/tetrahedron_refinements/2-edges/edge_12-31_refined/12-31.txt new file mode 100644 index 0000000..8745825 --- /dev/null +++ b/doc/tetrahedron_refinements/2-edges/edge_12-31_refined/12-31.txt @@ -0,0 +1,15 @@ +TET no. 0: +0.0, 0.5, 0.5 +0.0, 1.0, 0.0 +0.0, 0.5, 0.0 +1.0, 0.0, 0.0 +TET no. 1: +0.0, 0.5, 0.0 +0.0, 0.0, 1.0 +0.0, 0.5, 0.5 +1.0, 0.0, 0.0 +TET no. 2: +0.0, 0.0, 1.0 +0.0, 0.5, 0.0 +0.0, 0.0, 0.0 +1.0, 0.0, 0.0 diff --git a/doc/tetrahedron_refinements/2-edges/edge_12-31_refined/12-31.vtk b/doc/tetrahedron_refinements/2-edges/edge_12-31_refined/12-31.vtk new file mode 100644 index 0000000..f5503a8 --- /dev/null +++ b/doc/tetrahedron_refinements/2-edges/edge_12-31_refined/12-31.vtk @@ -0,0 +1,29 @@ +# vtk DataFile Version 2.0 +VTK LEGACY FILE FORMAT ASCII - tetrahedral sample file for H5FED test +ASCII +DATASET UNSTRUCTURED_GRID + +POINTS 6 DOUBLE +0.0 0.5 0.5 +0.0 1.0 0.0 +0.0 0.5 0.0 +1.0 0.0 0.0 +0.0 0.0 1.0 +0.0 0.0 0.0 + +CELLS 3 15 +4 0 1 2 3 +4 2 4 0 3 +4 4 2 5 3 + +CELL_TYPES 3 +10 +10 +10 + +CELL_DATA 3 +SCALARS cell_attribute_data float 1 +LOOKUP_TABLE default +0 +1 +2 diff --git a/doc/tetrahedron_refinements/2-edges/edge_12-31_refined/12-31_small.png b/doc/tetrahedron_refinements/2-edges/edge_12-31_refined/12-31_small.png new file mode 100644 index 0000000000000000000000000000000000000000..9835ee14109af7447325e9cbd1c295b18306f671 GIT binary patch literal 10551 zcmZvCcQ_p1_x~&rK}4cQ@4ZD08=Vln*XSWwBGEh1yXZmm7HxIH>b>_C7Ks{db&FNL z`~Lj-dw$P-?wn_4?wmR2+}E6Y=G+shp{9V3OMwdj0RB5gIW06DMEBt580aIJ5G^yB z;CxmzbU{^nJW9nYo16_5AC3Y48EYb#Tl z#IT6AOaq2R%@@km{fm%;x3M+M+YP;oKD=@@$RLx0HW9h!ByyS+iX_B^?=99O)fm|s z{MgU#df;Q@@zd z&qKImnYg5%*FOD!ZhZT_++2m-MsvQ1mS#m0(f%YoOVJ?6fdPt@jL!zkjq+1PWuTfy z_xQ`B;o^k+VD$4Z-%uaw4OULJp1BLV3rj-@!o{iF4-@yr7kn%vv7gg3n<|b@0kO-bj>JQ1%JKpo<;twg13?KGbU7rxNhp%4h&JVE{Ggx=c`9v z;TZ8&F6`J-z;Dl&=Ik$$<}4kUZ?Vw>>l0M^uA$ufujRug3t(!VIfTY=Dt1iy&q+)_D>=Ym1mM^(*<2L@eMl9+Oq3Af&wsUK=hh;djhdCHVV$Z9smC%PzKOLMmdZh`kw z0c}3~e`4ipKi3XAB>elYUJmq+eG-IeIvZ=e0W=UO9p{_vOZw&TUVo(j0jdTE@)(Zy zt7J8xZe~nvj}c{Z3A?&T1$)zPM1(LGMnS`F0&fCcQg{YnRFbIyY6YT0YPvWt$8XQY z;LM8Dh3yAkbVpxXarUn=Z!-I{XFIan9dCr!a_rQ7Scd&rLt^OAs>v+r+fz1-m7Qg& zie-AXODvw5Ps}!z!mlS1SNxR^(iWBDi{4E$`3+I0fq68UFRH||#Is`64uqB=?hqqq zDB}lR1`C`a(mA?K&A|fsa4I$MkM^_Wywq@`V%?FqnD>V3%eSd3+%N^?8(|-Z`Lxzg zH!Y=NT~1MN{XUN7yn66A%}N?)zyH{L6#K0m4ednwVU7=w!FhRl)o5Yvy`3-2Ybm~V z%k8z}0ckK&H~)j%zawq|0s(d3lW^j_jeLxD!25gX=B|POGZpfpr<%zNc5uO46=3*! zJTFbQD(%w4Wo;~rM*mgI@!A%vm{UvLu9}Wc2r<3*!CAGs3M^oL@Xr6VVQ2wL6PrUL zX~MybTp^r}Ry61)Yt3**26#M(TuyK`!1eX%qC9K=gIP)?v-5tQF)Pb?Dp8$Aj2lQhmE*F8KH_jZgz5Hk5SvqS%(O$>2h(*zgC;DbJF ziOJveOx<2}@32H~XSh2L53zq?(f`%mw&gs)REVEY?fm1avZcGF8>XV*PW}5rDmyZh zwca91nlW-G$!Fhv7V#nvRfX{G(_i}R!1 zfMO(nnl;a89?iujVnOmH**kmHeRwrktcF6~BU>|DGmHvG=*4`x`lgwYNK2Wif=XIj zz{Y&E)6LC0{-1dF;cuQZlWk`t+p8$1D&dSB%Ht@(^2Zay{*BY0!xj#~*XNrvl>B|z zru0H+b+_}?Lm)j3XJjJKsb68sds&?B&~GpWGaEs+QXvu;okaT}|Lcr@_V^?@S>hg- zaH5@Pf3mw)`w{A#Z_W%B*2Yt)9@%bLQgHoMdmmE0srl|8)mo2V1Nw+gU2C6g6|W@Y zCl}rJ!AGO_9NcNC3qQcJuViby@b3N%P&F42YsomArQl=v?fCQ|hmEW!UWhBa;r!>n zeCNKmJnBhsaketS+R%O^an)dC?r+<6-T{%L1aW!04&5eRuj9CDx@+q8$-Xg+A-AyR zl%De?L-Cj{j^zc(hE`;jo$ClB>UaF)rCJ>Wz9Akw@CAgV#_-1DvuI(YDPReD=H4fq znNKPaMd?p4htt;@>?k}qs#ZP5VbJ^3`!*Aouxq_=JP<@x&@ zk~yRj+`{-(iyf8^>)_2eT}6&p-NUD?;H(4p+U0Y1p^tMvQs%UEvm=2l1aR(~l}H*D z8{9TPRIX{;QLntD+tPb3JhSY;!{X5^a~ctn66#g11{eLZGZB7BS?`n^8L{#lCXJve z3OSJrWWfjd@8N2A5lG20OI^Pof>chveJ%2~fpnF%rPrK#!bI}u=Gq|}+ljW-55b5O zf1aqsRKc}t6McBsg!E`xZU2Bu+-rHoXvuGTomQW}^u)XXgPah@{3AiG5}&rxwLs?| zIPmsec6yOckl4>bnb$SKHQrk;b|&>aUYzP+p~KnY>cU2zK~*%@?a|1h@-(Qaao!Fz z8zu;`B#DdQ9UUIag;_$z8}@c%Jc6LckZI-+YvGY`w1EJzDuoP$8pE z^da{oxZf<&XwBRYb4a>{!6X4@Y-V#wp8JJ7P?bDz-QIrr+~hG|0Tv+8@m^9cs2|nJ z+np>okf$)g=}Ro}$-32~%|rxCkHXl_A#&|QyI=Rmh!=V+%%c7JQC0Q3gPp9HIq#uu zac&>(b&7_uHIOel)jL3oEiy)h9BomIz=0ZTga7@@&s*((zdZ4HS7CZ+p=DiKD+BIv z3|l6x33e@JA=E1-LUBy9PusaIL&r_BswxaRZ0;zUea@|Q8-b_K0NeJLolHZtYl-Fh z62J)4?P%_gM@#SYC|)np)p%pIf`&^y;#Ng(9NMw*X$5`nP2R4E(tDvlX}NVh`K(B> zI!?SnzA*ga4`D{usw6ndmMeHJE9+4c7%89S9p zuL{}#ZAZ5~!45nB%ou(KLi%eoOJd7A#vS=_V~Qh#o|>?={1GtkQ8L=IaeD*=3U7h@ z;TRg0#6Xfj3oE`6NXO@XE2ICA?m+%t@{f|a<;CzO1{>8c)I7p?N5A9s-MZ^%mA4Aa zzL8hcCN_B`cM7O@)0Vj}u^Sn51>r}u?P+MnA7-EDA|wJICjgJrZG!Bpu{(Q5fEp2^ z@|SZLzRyk!4|cYfy`W+S=_ep(OJb`r@$u zeOF7@EwJnw+^zXCEj-Ux1SAH+ek@ebN?9!Fj&e$S(6Z_91V zHJSRUs*#zyD5g2DIq!^oLgy3^Xk!g<1Yk*#zEAC+AUF4R3A~z!iJI+@Hf_pWwpeys z5#~ePbnJ(AJTmzEiSz^M2ir}uKV;Q@hEo*skWHdB`yrK>YW~3j)ifnjj^;OIV-doP z{IX^I&6ty$+@0#wAdUf$A;0c!N;Iaew{VTv+cUa+y{^;G5>rJeu1e6bP81K7$?MDh zZeu*BL+5W`2@o0qK-x$}WnJUAR)9iff$%5$+2Nll&KGia*cv0$=API93=0_EcU~)~ zpJ{k5bwBmL6&|YH4%cJ6du&T`uX9`a`dGCyDUj8IdMl2%gb0U|+9ac)-#zv)6()Ik zT@x=xhi+2P?Bp*1xdBe+2@q&U(0rtJ!{?7X$vAZ($9*4&9XdAAxq*%zI3@5p%dAE_ zzkmIbM#g1Q?fUU!^Tx=oT(=S#Ys=_9f7Qr5kL(_PDQj%p1N(hR%#rL@WuT2IFuMSR zyYt=pD`XD%dEFe#^7L!dd`EXS(;LALGb#^eJGMKv3pqhQf_`)dd;_=tQ1;!;b{{RI zpZ=C5%qS8A|9rW>HSLT;O(FR5H`duRAXX1!(E+5X2 zK#hA=ahCW7FVbI?Ah0?ytOCDFD$J7`7Hpg_(w_AZnZO}$M^UKo?_ple$IVatlFaLWo^L?IWz@=Yp3?}7y9&!|I~Nd>3cLYjzpqO zOCQT$ET!_5WXiE}$;j*KaIHQ-yZ?RDXC|o*FhD&5Y(hAYZG-S+B;Y-OK_2t4qgmH= z?CfnydpyfBAJwN5h`V~@0U@n0{QS#9r}U@RD@&8`r_6+UwQY6yKL}s<4V}Uwju?DN zv+w`9wgg~7rU?G{CF(?ubR$Z)4vn1m0^taOt;(Ug645 zbS5y}##YZsw#yA}e;a$z#R;xB_*~rrPuL=6u<-l(P(#W4srCERL~*6+a;{puzfUqx zxnJ4=4qq;()V>SgRX0jXWT>7J4P2Dp*R}q8_IkZjHi9;F@!HG-GKKW8zdG_?@lU9#Ui23AZS3{C4nRBGM0 zWkL%8`O@AR_oc}JY*~C*Y*?(g0iIy}k-_3_EVga=u_I;uVzrm;+2nT|C(2gGZ#Tjz zc|gMm=xH7Ba|4uH!Rk?uA@~c>5bauz^kVJI3MwZ1E1yrGv&E0`^VUKj=1*)FWe+FM zTC49_`-e|A98BSg2DEUl>J>{^Us$W3|IwMxEsqJiN$G5p;S`PeH-gTl70~GLAa%*H zN0|(OIR<(f0Ma0SoK>#-h)Sh9Bt^^-L`*vmGiY@`Sz4i7#cIWiK=68e_^myzW?)P{ zYQFHR)T$)TWbGu}Mp97OuZ+VScXAmgcZ4HQhIQ+i_En;cF|fqsS={&;>-BD){i7)} zW_O#KBA`g3f|a(G@qqe zF|m5Mmjv;Jo)ky&ta33a#8F!8mX#vQkO=Mga$%^Ey;jPUVc-oj5T^gA+UqfcuC?{> zM*y=P7*@zN+dDc==FKs*Bb3S}Ksk53ytlam&+S3WVKg+H9xA_8pHW!YHSE#s(Tsz^ zlKZy@<9)LF1k3@L7hQnvFi5Z&<6Bh*ToY&4>VhgT`ZD*Is}ElV4Fw5kE0xuKJmqbeRkI`md))}>8c4gi9B+v~t z_CInQw3Hrgq`)S@qf(2Sztzayw24wts?L8s*is$K{!M0C%cfs^`euH+y6KC4I13@U zW+=2)90}#7QlVBk67(=R%7`iT^U?vR1p&VjzyO&5rlBwR9*W_r4G_P1OxFJDJ1F6h z5Io>YCNn*mKc1_ab?=)Lqb$lMgG*B=+W_vTVOvCNXHUWHBUfl z4FPP;cS;zud=(U^(T*Ag*mjbt9p(!SlNwDYV`pNck2pLO4UHR>40w;cE{^wJxv5-C z%_(5Vv^#mO@txch5d)a+K)n&jTtW x_@I$SAd7bgY%`LEx!&gBJ2ZIOXq2^Z+kL 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 N-pQ-UL1oN?{txJ1?e72p literal 0 HcmV?d00001 diff --git a/doc/tetrahedron_refinements/2-edges/edge_20-23_refined/20-23.png b/doc/tetrahedron_refinements/2-edges/edge_20-23_refined/20-23.png new file mode 100644 index 0000000000000000000000000000000000000000..21301209e3c63a25797bfe7a1fb6d38497d25a14 GIT binary patch literal 9101 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 + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/doc/tetrahedron_refinements/2-edges/edge_20-23_refined/20-23.txt b/doc/tetrahedron_refinements/2-edges/edge_20-23_refined/20-23.txt new file mode 100644 index 0000000..5b7951a --- /dev/null +++ b/doc/tetrahedron_refinements/2-edges/edge_20-23_refined/20-23.txt @@ -0,0 +1,15 @@ +TET no. 0: +0.5, 0.0, 0.5 +0.0, 0.0, 1.0 +0.0, 0.0, 0.5 +0.0, 1.0, 0.0 +TET no. 1: +0.0, 0.0, 0.5 +1.0, 0.0, 0.0 +0.5, 0.0, 0.5 +0.0, 1.0, 0.0 +TET no. 2: +1.0, 0.0, 0.0 +0.0, 0.0, 0.5 +0.0, 0.0, 0.0 +0.0, 1.0, 0.0 diff --git a/doc/tetrahedron_refinements/2-edges/edge_20-23_refined/20-23.vtk b/doc/tetrahedron_refinements/2-edges/edge_20-23_refined/20-23.vtk new file mode 100644 index 0000000..79b1cc4 --- /dev/null +++ b/doc/tetrahedron_refinements/2-edges/edge_20-23_refined/20-23.vtk @@ -0,0 +1,29 @@ +# vtk DataFile Version 2.0 +VTK LEGACY FILE FORMAT ASCII - tetrahedral sample file for H5FED test +ASCII +DATASET UNSTRUCTURED_GRID + +POINTS 6 DOUBLE +0.5 0.0 0.5 +0.0 0.0 1.0 +0.0 0.0 0.5 +0.0 1.0 0.0 +1.0 0.0 0.0 +0.0 0.0 0.0 + +CELLS 3 15 +4 0 1 2 3 +4 2 4 0 3 +4 4 2 5 3 + +CELL_TYPES 3 +10 +10 +10 + +CELL_DATA 3 +SCALARS cell_attribute_data float 1 +LOOKUP_TABLE default +0 +1 +2 diff --git a/doc/tetrahedron_refinements/2-edges/edge_20-23_refined/20-23_small.png b/doc/tetrahedron_refinements/2-edges/edge_20-23_refined/20-23_small.png new file mode 100644 index 0000000000000000000000000000000000000000..160c2fcd7cee11e8539a782efcc2f35fc1b74122 GIT binary patch literal 8556 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 literal 0 HcmV?d00001 diff --git a/doc/tetrahedron_refinements/2-edges/edge_20-30_refined/20-30.png b/doc/tetrahedron_refinements/2-edges/edge_20-30_refined/20-30.png new file mode 100644 index 0000000000000000000000000000000000000000..d3a3f63c9d9845e798c317027c3c9c67f5b4508a GIT binary patch literal 10525 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 bxl=0Iw+xS}z3=MnW^y@(R% literal 0 HcmV?d00001 diff --git a/doc/tetrahedron_refinements/2-edges/edge_20-30_refined/20-30.pvsm b/doc/tetrahedron_refinements/2-edges/edge_20-30_refined/20-30.pvsm new file mode 100644 index 0000000..199faf5 --- /dev/null +++ b/doc/tetrahedron_refinements/2-edges/edge_20-30_refined/20-30.pvsm @@ -0,0 +1,1697 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/doc/tetrahedron_refinements/2-edges/edge_20-30_refined/20-30.txt b/doc/tetrahedron_refinements/2-edges/edge_20-30_refined/20-30.txt new file mode 100644 index 0000000..bfcdd46 --- /dev/null +++ b/doc/tetrahedron_refinements/2-edges/edge_20-30_refined/20-30.txt @@ -0,0 +1,15 @@ +TET no. 0: +0.5, 0.0, 0.0 +1.0, 0.0, 0.0 +0.5, 0.0, 0.5 +0.0, 1.0, 0.0 +TET no. 1: +0.5, 0.0, 0.5 +0.0, 0.0, 0.0 +0.5, 0.0, 0.0 +0.0, 1.0, 0.0 +TET no. 2: +0.0, 0.0, 0.0 +0.5, 0.0, 0.5 +0.0, 0.0, 1.0 +0.0, 1.0, 0.0 diff --git a/doc/tetrahedron_refinements/2-edges/edge_20-30_refined/20-30.vtk b/doc/tetrahedron_refinements/2-edges/edge_20-30_refined/20-30.vtk new file mode 100644 index 0000000..0b90708 --- /dev/null +++ b/doc/tetrahedron_refinements/2-edges/edge_20-30_refined/20-30.vtk @@ -0,0 +1,29 @@ +# vtk DataFile Version 2.0 +VTK LEGACY FILE FORMAT ASCII - tetrahedral sample file for H5FED test +ASCII +DATASET UNSTRUCTURED_GRID + +POINTS 6 DOUBLE +0.5 0.0 0.0 +1.0 0.0 0.0 +0.5 0.0 0.5 +0.0 1.0 0.0 +0.0 0.0 0.0 +0.0 0.0 1.0 + +CELLS 3 15 +4 0 1 2 3 +4 2 4 0 3 +4 4 2 5 3 + +CELL_TYPES 3 +10 +10 +10 + +CELL_DATA 3 +SCALARS cell_attribute_data float 1 +LOOKUP_TABLE default +0 +1 +2 diff --git a/doc/tetrahedron_refinements/2-edges/edge_20-30_refined/20-30_small.png b/doc/tetrahedron_refinements/2-edges/edge_20-30_refined/20-30_small.png new file mode 100644 index 0000000000000000000000000000000000000000..3b68099ac68430a3d6a02d40aae66c8f1adfb197 GIT binary patch literal 10014 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 literal 0 HcmV?d00001 diff --git a/doc/tetrahedron_refinements/2-edges/edge_20-31_refined/20-31.png b/doc/tetrahedron_refinements/2-edges/edge_20-31_refined/20-31.png new file mode 100644 index 0000000000000000000000000000000000000000..d70820355e99cf0a53e494298f7d62f9d6442e63 GIT binary patch literal 11377 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 + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/doc/tetrahedron_refinements/2-edges/edge_20-31_refined/20-31.txt b/doc/tetrahedron_refinements/2-edges/edge_20-31_refined/20-31.txt new file mode 100644 index 0000000..4d7864b --- /dev/null +++ b/doc/tetrahedron_refinements/2-edges/edge_20-31_refined/20-31.txt @@ -0,0 +1,20 @@ +TET no. 0: +1.0, 0.0, 0.0 +0.0, 0.5, 0.0 +0.5, 0.0, 0.5 +0.0, 0.0, 0.0 +TET no. 1: +1.0, 0.0, 0.0 +0.0, 1.0, 0.0 +0.5, 0.0, 0.5 +0.0, 0.5, 0.0 +TET no. 2: +0.5, 0.0, 0.5 +0.0, 1.0, 0.0 +0.0, 0.0, 1.0 +0.0, 0.5, 0.0 +TET no. 3: +0.5, 0.0, 0.5 +0.0, 0.5, 0.0 +0.0, 0.0, 1.0 +0.0, 0.0, 0.0 diff --git a/doc/tetrahedron_refinements/2-edges/edge_20-31_refined/20-31.vtk b/doc/tetrahedron_refinements/2-edges/edge_20-31_refined/20-31.vtk new file mode 100644 index 0000000..01a6012 --- /dev/null +++ b/doc/tetrahedron_refinements/2-edges/edge_20-31_refined/20-31.vtk @@ -0,0 +1,32 @@ +# vtk DataFile Version 2.0 +VTK LEGACY FILE FORMAT ASCII - tetrahedral sample file for H5FED test +ASCII +DATASET UNSTRUCTURED_GRID + +POINTS 6 DOUBLE +1.0 0.0 0.0 +0.0 0.5 0.0 +0.5 0.0 0.5 +0.0 0.0 0.0 +0.0 1.0 0.0 +0.0 0.0 1.0 + +CELLS 4 20 +4 0 1 2 3 +4 0 4 2 1 +4 2 4 5 1 +4 2 1 5 3 + +CELL_TYPES 4 +10 +10 +10 +10 + +CELL_DATA 4 +SCALARS cell_attribute_data float 1 +LOOKUP_TABLE default +0 +1 +2 +3 diff --git a/doc/tetrahedron_refinements/2-edges/edge_20-31_refined/20-31_small.png b/doc/tetrahedron_refinements/2-edges/edge_20-31_refined/20-31_small.png new file mode 100644 index 0000000000000000000000000000000000000000..9936656b7b4e6e4571bbd06c68e8acb9db599ed9 GIT binary patch literal 12039 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 literal 0 HcmV?d00001 diff --git a/doc/tetrahedron_refinements/2-edges/edge_23-30_refined/23-30.png b/doc/tetrahedron_refinements/2-edges/edge_23-30_refined/23-30.png new file mode 100644 index 0000000000000000000000000000000000000000..87503547c7cc1abef03f7248499efcec5fa0d7cf GIT binary patch literal 10720 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 literal 0 HcmV?d00001 diff --git a/doc/tetrahedron_refinements/2-edges/edge_23-30_refined/23-30.pvsm b/doc/tetrahedron_refinements/2-edges/edge_23-30_refined/23-30.pvsm new file mode 100644 index 0000000..25f7b58 --- /dev/null +++ b/doc/tetrahedron_refinements/2-edges/edge_23-30_refined/23-30.pvsm @@ -0,0 +1,1697 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/doc/tetrahedron_refinements/2-edges/edge_23-30_refined/23-30.txt b/doc/tetrahedron_refinements/2-edges/edge_23-30_refined/23-30.txt new file mode 100644 index 0000000..5659a72 --- /dev/null +++ b/doc/tetrahedron_refinements/2-edges/edge_23-30_refined/23-30.txt @@ -0,0 +1,15 @@ +TET no. 0: +0.0, 0.0, 0.5 +0.0, 0.0, 0.0 +0.5, 0.0, 0.0 +0.0, 1.0, 0.0 +TET no. 1: +0.5, 0.0, 0.0 +0.0, 0.0, 1.0 +0.0, 0.0, 0.5 +0.0, 1.0, 0.0 +TET no. 2: +0.0, 0.0, 1.0 +0.5, 0.0, 0.0 +1.0, 0.0, 0.0 +0.0, 1.0, 0.0 diff --git a/doc/tetrahedron_refinements/2-edges/edge_23-30_refined/23-30.vtk b/doc/tetrahedron_refinements/2-edges/edge_23-30_refined/23-30.vtk new file mode 100644 index 0000000..49fc7c6 --- /dev/null +++ b/doc/tetrahedron_refinements/2-edges/edge_23-30_refined/23-30.vtk @@ -0,0 +1,29 @@ +# vtk DataFile Version 2.0 +VTK LEGACY FILE FORMAT ASCII - tetrahedral sample file for H5FED test +ASCII +DATASET UNSTRUCTURED_GRID + +POINTS 6 DOUBLE +0.0 0.0 0.5 +0.0 0.0 0.0 +0.5 0.0 0.0 +0.0 1.0 0.0 +0.0 0.0 1.0 +1.0 0.0 0.0 + +CELLS 3 15 +4 0 1 2 3 +4 2 4 0 3 +4 4 2 5 3 + +CELL_TYPES 3 +10 +10 +10 + +CELL_DATA 3 +SCALARS cell_attribute_data float 1 +LOOKUP_TABLE default +0 +1 +2 diff --git a/doc/tetrahedron_refinements/2-edges/edge_23-30_refined/23-30_small.png b/doc/tetrahedron_refinements/2-edges/edge_23-30_refined/23-30_small.png new file mode 100644 index 0000000000000000000000000000000000000000..4aa0d7e8f1cfa00b604ed6c94880735a2737d1e6 GIT binary patch literal 11315 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 literal 0 HcmV?d00001 diff --git a/doc/tetrahedron_refinements/2-edges/edge_23-31_refined/23-31.png b/doc/tetrahedron_refinements/2-edges/edge_23-31_refined/23-31.png new file mode 100644 index 0000000000000000000000000000000000000000..62d761a343de4c401148b77908fcff14e7fd9360 GIT binary patch literal 11334 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 CxW@hf literal 0 HcmV?d00001 diff --git a/doc/tetrahedron_refinements/2-edges/edge_23-31_refined/23-31.pvsm b/doc/tetrahedron_refinements/2-edges/edge_23-31_refined/23-31.pvsm new file mode 100644 index 0000000..ae8c9f9 --- /dev/null +++ b/doc/tetrahedron_refinements/2-edges/edge_23-31_refined/23-31.pvsm @@ -0,0 +1,1697 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/doc/tetrahedron_refinements/2-edges/edge_23-31_refined/23-31.txt b/doc/tetrahedron_refinements/2-edges/edge_23-31_refined/23-31.txt new file mode 100644 index 0000000..651464c --- /dev/null +++ b/doc/tetrahedron_refinements/2-edges/edge_23-31_refined/23-31.txt @@ -0,0 +1,15 @@ +TET no. 0: +0.0, 0.5, 0.0 +0.0, 0.0, 0.0 +0.0, 0.0, 0.5 +1.0, 0.0, 0.0 +TET no. 1: +0.0, 0.0, 0.5 +0.0, 1.0, 0.0 +0.0, 0.5, 0.0 +1.0, 0.0, 0.0 +TET no. 2: +0.0, 1.0, 0.0 +0.0, 0.0, 0.5 +0.0, 0.0, 1.0 +1.0, 0.0, 0.0 diff --git a/doc/tetrahedron_refinements/2-edges/edge_23-31_refined/23-31.vtk b/doc/tetrahedron_refinements/2-edges/edge_23-31_refined/23-31.vtk new file mode 100644 index 0000000..cb3887e --- /dev/null +++ b/doc/tetrahedron_refinements/2-edges/edge_23-31_refined/23-31.vtk @@ -0,0 +1,29 @@ +# vtk DataFile Version 2.0 +VTK LEGACY FILE FORMAT ASCII - tetrahedral sample file for H5FED test +ASCII +DATASET UNSTRUCTURED_GRID + +POINTS 6 DOUBLE +0.0 0.5 0.0 +0.0 0.0 0.0 +0.0 0.0 0.5 +1.0 0.0 0.0 +0.0 1.0 0.0 +0.0 0.0 1.0 + +CELLS 3 15 +4 0 1 2 3 +4 2 4 0 3 +4 4 2 5 3 + +CELL_TYPES 3 +10 +10 +10 + +CELL_DATA 3 +SCALARS cell_attribute_data float 1 +LOOKUP_TABLE default +0 +1 +2 diff --git a/doc/tetrahedron_refinements/2-edges/edge_23-31_refined/23-31_small.png b/doc/tetrahedron_refinements/2-edges/edge_23-31_refined/23-31_small.png new file mode 100644 index 0000000000000000000000000000000000000000..00beed5d90c8153de4711e21571514d42ea084fd GIT binary patch literal 11262 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 literal 0 HcmV?d00001 diff --git a/doc/tetrahedron_refinements/2-edges/edge_30-31_refined/30-31.pvsm b/doc/tetrahedron_refinements/2-edges/edge_30-31_refined/30-31.pvsm new file mode 100644 index 0000000..25016fe --- /dev/null +++ b/doc/tetrahedron_refinements/2-edges/edge_30-31_refined/30-31.pvsm @@ -0,0 +1,1839 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/doc/tetrahedron_refinements/2-edges/edge_30-31_refined/30-31.txt b/doc/tetrahedron_refinements/2-edges/edge_30-31_refined/30-31.txt new file mode 100644 index 0000000..d79c1dd --- /dev/null +++ b/doc/tetrahedron_refinements/2-edges/edge_30-31_refined/30-31.txt @@ -0,0 +1,15 @@ +TET no. 0: +0.5, 0.0, 0.0 +0.0, 0.0, 0.0 +0.0, 0.5, 0.0 +0.0, 0.0, 1.0 +TET no. 1: +0.0, 0.5, 0.0 +1.0, 0.0, 0.0 +0.5, 0.0, 0.0 +0.0, 0.0, 1.0 +TET no. 2: +1.0, 0.0, 0.0 +0.0, 0.5, 0.0 +0.0, 1.0, 0.0 +0.0, 0.0, 1.0 diff --git a/doc/tetrahedron_refinements/2-edges/edge_30-31_refined/30-31.vtk b/doc/tetrahedron_refinements/2-edges/edge_30-31_refined/30-31.vtk new file mode 100644 index 0000000..fbcba62 --- /dev/null +++ b/doc/tetrahedron_refinements/2-edges/edge_30-31_refined/30-31.vtk @@ -0,0 +1,29 @@ +# vtk DataFile Version 2.0 +VTK LEGACY FILE FORMAT ASCII - tetrahedral sample file for H5FED test +ASCII +DATASET UNSTRUCTURED_GRID + +POINTS 6 DOUBLE +0.5 0.0 0.0 +0.0 0.0 0.0 +0.0 0.5 0.0 +0.0 0.0 1.0 +1.0 0.0 0.0 +0.0 1.0 0.0 + +CELLS 3 15 +4 0 1 2 3 +4 2 4 0 3 +4 4 2 5 3 + +CELL_TYPES 3 +10 +10 +10 + +CELL_DATA 3 +SCALARS cell_attribute_data float 1 +LOOKUP_TABLE default +0 +1 +2 diff --git a/doc/tetrahedron_refinements/2-edges/edge_30-31_refined/30-31_small.png b/doc/tetrahedron_refinements/2-edges/edge_30-31_refined/30-31_small.png new file mode 100644 index 0000000000000000000000000000000000000000..26ae5a50ae0b05539ef749ac4f43624a04b15346 GIT binary patch literal 9739 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 + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/doc/tetrahedron_refinements/3-edges/edge_01-12-20_refined/01-12-20.txt b/doc/tetrahedron_refinements/3-edges/edge_01-12-20_refined/01-12-20.txt new file mode 100644 index 0000000..46b1210 --- /dev/null +++ b/doc/tetrahedron_refinements/3-edges/edge_01-12-20_refined/01-12-20.txt @@ -0,0 +1,20 @@ +TET no. 0: +0.0, 0.5, 0.5 +0.5, 0.5, 0.0 +0.0, 1.0, 0.0 +0.0, 0.0, 0.0 +TET no. 1: +0.0, 0.0, 1.0 +0.5, 0.0, 0.5 +0.0, 0.5, 0.5 +0.0, 0.0, 0.0 +TET no. 2: +0.5, 0.0, 0.5 +1.0, 0.0, 0.0 +0.5, 0.5, 0.0 +0.0, 0.0, 0.0 +TET no. 3: +0.5, 0.5, 0.0 +0.0, 0.5, 0.5 +0.5, 0.0, 0.5 +0.0, 0.0, 0.0 diff --git a/doc/tetrahedron_refinements/3-edges/edge_01-12-20_refined/01-12-20.vtk b/doc/tetrahedron_refinements/3-edges/edge_01-12-20_refined/01-12-20.vtk new file mode 100644 index 0000000..919e005 --- /dev/null +++ b/doc/tetrahedron_refinements/3-edges/edge_01-12-20_refined/01-12-20.vtk @@ -0,0 +1,33 @@ +# vtk DataFile Version 2.0 +VTK LEGACY FILE FORMAT ASCII - tetrahedral sample file for H5FED test +ASCII +DATASET UNSTRUCTURED_GRID + +POINTS 7 DOUBLE +0.0 0.5 0.5 +0.5 0.5 0.0 +0.0 1.0 0.0 +0.0 0.0 0.0 +0.0 0.0 1.0 +0.5 0.0 0.5 +1.0 0.0 0.0 + +CELLS 4 20 +4 0 1 2 3 +4 4 5 0 3 +4 5 6 1 3 +4 1 0 5 3 + +CELL_TYPES 4 +10 +10 +10 +10 + +CELL_DATA 4 +SCALARS cell_attribute_data float 1 +LOOKUP_TABLE default +0 +1 +2 +3 diff --git a/doc/tetrahedron_refinements/3-edges/edge_01-12-20_refined/01-12-20_small.png b/doc/tetrahedron_refinements/3-edges/edge_01-12-20_refined/01-12-20_small.png new file mode 100644 index 0000000000000000000000000000000000000000..251a077b703110199cc5d7cba4dd1b3e49b4b9c8 GIT binary patch literal 10952 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 TTYdl{5yXD8)26bGj8p#)rb4xs literal 0 HcmV?d00001 diff --git a/doc/tetrahedron_refinements/3-edges/edge_01-12-23_refined/01-12-23.pvsm b/doc/tetrahedron_refinements/3-edges/edge_01-12-23_refined/01-12-23.pvsm new file mode 100644 index 0000000..8761dd0 --- /dev/null +++ b/doc/tetrahedron_refinements/3-edges/edge_01-12-23_refined/01-12-23.pvsm @@ -0,0 +1,1697 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/doc/tetrahedron_refinements/3-edges/edge_01-12-23_refined/01-12-23.txt b/doc/tetrahedron_refinements/3-edges/edge_01-12-23_refined/01-12-23.txt new file mode 100644 index 0000000..7cbdea3 --- /dev/null +++ b/doc/tetrahedron_refinements/3-edges/edge_01-12-23_refined/01-12-23.txt @@ -0,0 +1,20 @@ +TET no. 0: +0.0, 0.5, 0.5 +0.5, 0.5, 0.0 +0.0, 1.0, 0.0 +0.0, 0.0, 0.0 +TET no. 1: +0.0, 0.5, 0.5 +1.0, 0.0, 0.0 +0.5, 0.5, 0.0 +0.0, 0.0, 0.0 +TET no. 2: +0.0, 0.5, 0.5 +0.0, 0.0, 0.0 +0.0, 0.0, 0.5 +1.0, 0.0, 0.0 +TET no. 3: +0.0, 0.5, 0.5 +0.0, 0.0, 0.5 +0.0, 0.0, 1.0 +1.0, 0.0, 0.0 diff --git a/doc/tetrahedron_refinements/3-edges/edge_01-12-23_refined/01-12-23.vtk b/doc/tetrahedron_refinements/3-edges/edge_01-12-23_refined/01-12-23.vtk new file mode 100644 index 0000000..5c81fc6 --- /dev/null +++ b/doc/tetrahedron_refinements/3-edges/edge_01-12-23_refined/01-12-23.vtk @@ -0,0 +1,33 @@ +# vtk DataFile Version 2.0 +VTK LEGACY FILE FORMAT ASCII - tetrahedral sample file for H5FED test +ASCII +DATASET UNSTRUCTURED_GRID + +POINTS 7 DOUBLE +0.0 0.5 0.5 +0.5 0.5 0.0 +0.0 1.0 0.0 +0.0 0.0 0.0 +1.0 0.0 0.0 +0.0 0.0 0.5 +0.0 0.0 1.0 + +CELLS 4 20 +4 0 1 2 3 +4 0 4 1 3 +4 0 3 5 4 +4 0 5 6 4 + +CELL_TYPES 4 +10 +10 +10 +10 + +CELL_DATA 4 +SCALARS cell_attribute_data float 1 +LOOKUP_TABLE default +0 +1 +2 +3 diff --git a/doc/tetrahedron_refinements/3-edges/edge_01-12-23_refined/01-12-23_small.png b/doc/tetrahedron_refinements/3-edges/edge_01-12-23_refined/01-12-23_small.png new file mode 100644 index 0000000000000000000000000000000000000000..2c3538dda694ba299fa478237ce941b7fee7128b GIT binary patch literal 12489 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 rVSwn{chB%$Y?KY8{|D#a@dOOn_hHFAlN+$Oh5 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 + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/doc/tetrahedron_refinements/3-edges/edge_01-12-30_refined/01-12-30.txt b/doc/tetrahedron_refinements/3-edges/edge_01-12-30_refined/01-12-30.txt new file mode 100644 index 0000000..e762bb7 --- /dev/null +++ b/doc/tetrahedron_refinements/3-edges/edge_01-12-30_refined/01-12-30.txt @@ -0,0 +1,20 @@ +TET no. 0: +0.5, 0.5, 0.0 +0.0, 1.0, 0.0 +0.0, 0.5, 0.5 +0.0, 0.0, 0.0 +TET no. 1: +0.5, 0.5, 0.0 +0.0, 0.5, 0.5 +0.0, 0.0, 1.0 +0.0, 0.0, 0.0 +TET no. 2: +0.5, 0.5, 0.0 +0.5, 0.0, 0.0 +0.0, 0.0, 0.0 +0.0, 0.0, 1.0 +TET no. 3: +0.5, 0.5, 0.0 +1.0, 0.0, 0.0 +0.5, 0.0, 0.0 +0.0, 0.0, 1.0 diff --git a/doc/tetrahedron_refinements/3-edges/edge_01-12-30_refined/01-12-30.vtk b/doc/tetrahedron_refinements/3-edges/edge_01-12-30_refined/01-12-30.vtk new file mode 100644 index 0000000..08e4f75 --- /dev/null +++ b/doc/tetrahedron_refinements/3-edges/edge_01-12-30_refined/01-12-30.vtk @@ -0,0 +1,33 @@ +# vtk DataFile Version 2.0 +VTK LEGACY FILE FORMAT ASCII - tetrahedral sample file for H5FED test +ASCII +DATASET UNSTRUCTURED_GRID + +POINTS 7 DOUBLE +0.5 0.5 0.0 +0.0 1.0 0.0 +0.0 0.5 0.5 +0.0 0.0 0.0 +0.0 0.0 1.0 +0.5 0.0 0.0 +1.0 0.0 0.0 + +CELLS 4 20 +4 0 1 2 3 +4 0 2 4 3 +4 0 5 3 4 +4 0 6 5 4 + +CELL_TYPES 4 +10 +10 +10 +10 + +CELL_DATA 4 +SCALARS cell_attribute_data float 1 +LOOKUP_TABLE default +0 +1 +2 +3 diff --git a/doc/tetrahedron_refinements/3-edges/edge_01-12-30_refined/01-12-30_small.png b/doc/tetrahedron_refinements/3-edges/edge_01-12-30_refined/01-12-30_small.png new file mode 100644 index 0000000000000000000000000000000000000000..e24ad117e8d1e385e979ccfe9030ef734e43cee8 GIT binary patch literal 11104 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 ZcO4EiMbRnco>j3xPD)v__?@x;{{e3|Kd}G+ literal 0 HcmV?d00001 diff --git a/doc/tetrahedron_refinements/3-edges/edge_01-12-31_refined/01-12-31.png b/doc/tetrahedron_refinements/3-edges/edge_01-12-31_refined/01-12-31.png new file mode 100644 index 0000000000000000000000000000000000000000..0542c672c4f082800db81316cdd1553f4c41bce4 GIT binary patch literal 12876 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 C{W*yM literal 0 HcmV?d00001 diff --git a/doc/tetrahedron_refinements/3-edges/edge_01-12-31_refined/01-12-31.pvsm b/doc/tetrahedron_refinements/3-edges/edge_01-12-31_refined/01-12-31.pvsm new file mode 100644 index 0000000..fc5ca34 --- /dev/null +++ b/doc/tetrahedron_refinements/3-edges/edge_01-12-31_refined/01-12-31.pvsm @@ -0,0 +1,1697 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/doc/tetrahedron_refinements/3-edges/edge_01-12-31_refined/01-12-31.txt b/doc/tetrahedron_refinements/3-edges/edge_01-12-31_refined/01-12-31.txt new file mode 100644 index 0000000..c6b8104 --- /dev/null +++ b/doc/tetrahedron_refinements/3-edges/edge_01-12-31_refined/01-12-31.txt @@ -0,0 +1,45 @@ +TET no. 0: +0.5, 0.5, 0.0 +0.0, 0.5, 0.5 +0.0, 0.5, 0.0 +0.0, 1.0, 0.0 +TET no. 1: +0.0, 0.5, 0.0 +0.0, 0.5, 0.5 +0.5, 0.5, 0.0 +0.25, 0.25, 0.25 +TET no. 2: +0.0, 0.0, 1.0 +0.0, 0.0, 0.0 +1.0, 0.0, 0.0 +0.25, 0.25, 0.25 +TET no. 3: +0.5, 0.5, 0.0 +0.0, 0.0, 1.0 +1.0, 0.0, 0.0 +0.25, 0.25, 0.25 +TET no. 4: +0.5, 0.5, 0.0 +0.0, 0.5, 0.5 +0.0, 0.0, 1.0 +0.25, 0.25, 0.25 +TET no. 5: +0.0, 0.5, 0.5 +0.0, 0.0, 0.0 +0.0, 0.0, 1.0 +0.25, 0.25, 0.25 +TET no. 6: +0.0, 0.5, 0.5 +0.0, 0.5, 0.0 +0.0, 0.0, 0.0 +0.25, 0.25, 0.25 +TET no. 7: +0.0, 0.5, 0.0 +1.0, 0.0, 0.0 +0.0, 0.0, 0.0 +0.25, 0.25, 0.25 +TET no. 8: +0.5, 0.5, 0.0 +1.0, 0.0, 0.0 +0.0, 0.5, 0.0 +0.25, 0.25, 0.25 diff --git a/doc/tetrahedron_refinements/3-edges/edge_01-12-31_refined/01-12-31.vtk b/doc/tetrahedron_refinements/3-edges/edge_01-12-31_refined/01-12-31.vtk new file mode 100644 index 0000000..2ba707d --- /dev/null +++ b/doc/tetrahedron_refinements/3-edges/edge_01-12-31_refined/01-12-31.vtk @@ -0,0 +1,49 @@ +# vtk DataFile Version 2.0 +VTK LEGACY FILE FORMAT ASCII - tetrahedral sample file for H5FED test +ASCII +DATASET UNSTRUCTURED_GRID + +POINTS 8 DOUBLE +0.5 0.5 0.0 +0.0 0.5 0.5 +0.0 0.5 0.0 +0.0 1.0 0.0 +0.25 0.25 0.25 +0.0 0.0 1.0 +0.0 0.0 0.0 +1.0 0.0 0.0 + +CELLS 9 45 +4 0 1 2 3 +4 2 1 0 4 +4 5 6 7 4 +4 0 5 7 4 +4 0 1 5 4 +4 1 6 5 4 +4 1 2 6 4 +4 2 7 6 4 +4 0 7 2 4 + +CELL_TYPES 9 +10 +10 +10 +10 +10 +10 +10 +10 +10 + +CELL_DATA 9 +SCALARS cell_attribute_data float 1 +LOOKUP_TABLE default +0 +1 +2 +3 +4 +5 +6 +7 +8 diff --git a/doc/tetrahedron_refinements/3-edges/edge_01-12-31_refined/01-12-31_small.png b/doc/tetrahedron_refinements/3-edges/edge_01-12-31_refined/01-12-31_small.png new file mode 100644 index 0000000000000000000000000000000000000000..978be5bd798c64dcd6e7d0dc80c25d1d2df1dc81 GIT binary patch literal 15042 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 V6vP!KU%XR*l$g9|m9Syp{{fn5d7c0O literal 0 HcmV?d00001 diff --git a/doc/tetrahedron_refinements/3-edges/edge_01-20-23_refined/01-20-23.png b/doc/tetrahedron_refinements/3-edges/edge_01-20-23_refined/01-20-23.png new file mode 100644 index 0000000000000000000000000000000000000000..f707772834d1b5495b31d1da1381c6e14978d33e GIT binary patch literal 11187 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 literal 0 HcmV?d00001 diff --git a/doc/tetrahedron_refinements/3-edges/edge_01-20-23_refined/01-20-23.pvsm b/doc/tetrahedron_refinements/3-edges/edge_01-20-23_refined/01-20-23.pvsm new file mode 100644 index 0000000..300361d --- /dev/null +++ b/doc/tetrahedron_refinements/3-edges/edge_01-20-23_refined/01-20-23.pvsm @@ -0,0 +1,1839 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/doc/tetrahedron_refinements/3-edges/edge_01-20-23_refined/01-20-23.txt b/doc/tetrahedron_refinements/3-edges/edge_01-20-23_refined/01-20-23.txt new file mode 100644 index 0000000..b34f94d --- /dev/null +++ b/doc/tetrahedron_refinements/3-edges/edge_01-20-23_refined/01-20-23.txt @@ -0,0 +1,20 @@ +TET no. 0: +0.5, 0.0, 0.5 +1.0, 0.0, 0.0 +0.5, 0.5, 0.0 +0.0, 0.0, 0.0 +TET no. 1: +0.5, 0.0, 0.5 +0.5, 0.5, 0.0 +0.0, 1.0, 0.0 +0.0, 0.0, 0.0 +TET no. 2: +0.5, 0.0, 0.5 +0.0, 0.0, 0.5 +0.0, 0.0, 0.0 +0.0, 1.0, 0.0 +TET no. 3: +0.5, 0.0, 0.5 +0.0, 0.0, 1.0 +0.0, 0.0, 0.5 +0.0, 1.0, 0.0 diff --git a/doc/tetrahedron_refinements/3-edges/edge_01-20-23_refined/01-20-23.vtk b/doc/tetrahedron_refinements/3-edges/edge_01-20-23_refined/01-20-23.vtk new file mode 100644 index 0000000..21c3f5f --- /dev/null +++ b/doc/tetrahedron_refinements/3-edges/edge_01-20-23_refined/01-20-23.vtk @@ -0,0 +1,33 @@ +# vtk DataFile Version 2.0 +VTK LEGACY FILE FORMAT ASCII - tetrahedral sample file for H5FED test +ASCII +DATASET UNSTRUCTURED_GRID + +POINTS 7 DOUBLE +0.5 0.0 0.5 +1.0 0.0 0.0 +0.5 0.5 0.0 +0.0 0.0 0.0 +0.0 1.0 0.0 +0.0 0.0 0.5 +0.0 0.0 1.0 + +CELLS 4 20 +4 0 1 2 3 +4 0 2 4 3 +4 0 5 3 4 +4 0 6 5 4 + +CELL_TYPES 4 +10 +10 +10 +10 + +CELL_DATA 4 +SCALARS cell_attribute_data float 1 +LOOKUP_TABLE default +0 +1 +2 +3 diff --git a/doc/tetrahedron_refinements/3-edges/edge_01-20-23_refined/01-20-23_small.png b/doc/tetrahedron_refinements/3-edges/edge_01-20-23_refined/01-20-23_small.png new file mode 100644 index 0000000000000000000000000000000000000000..42ed22667121f1de1223a1eca2ed944caa8a145a GIT binary patch literal 13097 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 B7cu|< literal 0 HcmV?d00001 diff --git a/doc/tetrahedron_refinements/3-edges/edge_01-20-30_refined/01-20-30.png b/doc/tetrahedron_refinements/3-edges/edge_01-20-30_refined/01-20-30.png new file mode 100644 index 0000000000000000000000000000000000000000..457159f8bd789d48201bfa8f5ba90ccd2632b021 GIT binary patch literal 12504 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 literal 0 HcmV?d00001 diff --git a/doc/tetrahedron_refinements/3-edges/edge_01-20-30_refined/01-20-30.pvsm b/doc/tetrahedron_refinements/3-edges/edge_01-20-30_refined/01-20-30.pvsm new file mode 100644 index 0000000..9519779 --- /dev/null +++ b/doc/tetrahedron_refinements/3-edges/edge_01-20-30_refined/01-20-30.pvsm @@ -0,0 +1,1839 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/doc/tetrahedron_refinements/3-edges/edge_01-20-30_refined/01-20-30.txt b/doc/tetrahedron_refinements/3-edges/edge_01-20-30_refined/01-20-30.txt new file mode 100644 index 0000000..14f5eb3 --- /dev/null +++ b/doc/tetrahedron_refinements/3-edges/edge_01-20-30_refined/01-20-30.txt @@ -0,0 +1,45 @@ +TET no. 0: +0.5, 0.0, 0.5 +0.5, 0.5, 0.0 +0.5, 0.0, 0.0 +1.0, 0.0, 0.0 +TET no. 1: +0.5, 0.0, 0.0 +0.5, 0.5, 0.0 +0.5, 0.0, 0.5 +0.25, 0.25, 0.25 +TET no. 2: +0.0, 1.0, 0.0 +0.0, 0.0, 0.0 +0.0, 0.0, 1.0 +0.25, 0.25, 0.25 +TET no. 3: +0.5, 0.0, 0.5 +0.0, 1.0, 0.0 +0.0, 0.0, 1.0 +0.25, 0.25, 0.25 +TET no. 4: +0.5, 0.0, 0.5 +0.5, 0.5, 0.0 +0.0, 1.0, 0.0 +0.25, 0.25, 0.25 +TET no. 5: +0.5, 0.5, 0.0 +0.0, 0.0, 0.0 +0.0, 1.0, 0.0 +0.25, 0.25, 0.25 +TET no. 6: +0.5, 0.5, 0.0 +0.5, 0.0, 0.0 +0.0, 0.0, 0.0 +0.25, 0.25, 0.25 +TET no. 7: +0.5, 0.0, 0.0 +0.0, 0.0, 1.0 +0.0, 0.0, 0.0 +0.25, 0.25, 0.25 +TET no. 8: +0.5, 0.0, 0.5 +0.0, 0.0, 1.0 +0.5, 0.0, 0.0 +0.25, 0.25, 0.25 diff --git a/doc/tetrahedron_refinements/3-edges/edge_01-20-30_refined/01-20-30.vtk b/doc/tetrahedron_refinements/3-edges/edge_01-20-30_refined/01-20-30.vtk new file mode 100644 index 0000000..bcb761a --- /dev/null +++ b/doc/tetrahedron_refinements/3-edges/edge_01-20-30_refined/01-20-30.vtk @@ -0,0 +1,49 @@ +# vtk DataFile Version 2.0 +VTK LEGACY FILE FORMAT ASCII - tetrahedral sample file for H5FED test +ASCII +DATASET UNSTRUCTURED_GRID + +POINTS 8 DOUBLE +0.5 0.0 0.5 +0.5 0.5 0.0 +0.5 0.0 0.0 +1.0 0.0 0.0 +0.25 0.25 0.25 +0.0 1.0 0.0 +0.0 0.0 0.0 +0.0 0.0 1.0 + +CELLS 9 45 +4 0 1 2 3 +4 2 1 0 4 +4 5 6 7 4 +4 0 5 7 4 +4 0 1 5 4 +4 1 6 5 4 +4 1 2 6 4 +4 2 7 6 4 +4 0 7 2 4 + +CELL_TYPES 9 +10 +10 +10 +10 +10 +10 +10 +10 +10 + +CELL_DATA 9 +SCALARS cell_attribute_data float 1 +LOOKUP_TABLE default +0 +1 +2 +3 +4 +5 +6 +7 +8 diff --git a/doc/tetrahedron_refinements/3-edges/edge_01-20-30_refined/01-20-30_small.png b/doc/tetrahedron_refinements/3-edges/edge_01-20-30_refined/01-20-30_small.png new file mode 100644 index 0000000000000000000000000000000000000000..185cc0be697648e45d21887b332ac313bf5a8838 GIT binary patch literal 13795 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

3ova+ zahm$jkoX93uZy5X_|I(*s6tICg#Z`+!=)UlrnhCDikb}3aw(V(+k1u0^?E2?SoPkmb$b6E_#Ghx^NDS`=u z1Kad2Xzn?7roqZ|!+4XUhQ--~T`MOD00pt0n0Ce8CRN=g zp@-Fu=r?SSMY9xT##w)wJ9H$sb3BH4BaG2$D8fmkQI?L(J#Bhl(k#assLqiVbCGh9 zNbBW)IQ(FykzTT$bICuLbzSyP(_wB>tH&6@9g$$rW%z%IGfdkIpa09O(YK=R8|BMmqIIKRr6^ zsF><_5Ke=KU7o&wLjxoc=jD>)7CX(?!a4l1qANuWvWFv!8m}^bkM9)+J{=wYt8hdB zT)*oZdVgf%dNvoL}iRgQBpW5lE6qmQWpN_0bcw=f$SNrtGOn_6@kxaRv2{|9s!@7VwV literal 0 HcmV?d00001 diff --git a/doc/tetrahedron_refinements/3-edges/edge_01-20-31_refined/01-20-31.png b/doc/tetrahedron_refinements/3-edges/edge_01-20-31_refined/01-20-31.png new file mode 100644 index 0000000000000000000000000000000000000000..2820b18f24c3d7c7a946f61adb90918ffc243e8b GIT binary patch literal 11184 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 literal 0 HcmV?d00001 diff --git a/doc/tetrahedron_refinements/3-edges/edge_01-20-31_refined/01-20-31.pvsm b/doc/tetrahedron_refinements/3-edges/edge_01-20-31_refined/01-20-31.pvsm new file mode 100644 index 0000000..b079d3b --- /dev/null +++ b/doc/tetrahedron_refinements/3-edges/edge_01-20-31_refined/01-20-31.pvsm @@ -0,0 +1,1839 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/doc/tetrahedron_refinements/3-edges/edge_01-20-31_refined/01-20-31.txt b/doc/tetrahedron_refinements/3-edges/edge_01-20-31_refined/01-20-31.txt new file mode 100644 index 0000000..3b3fd70 --- /dev/null +++ b/doc/tetrahedron_refinements/3-edges/edge_01-20-31_refined/01-20-31.txt @@ -0,0 +1,20 @@ +TET no. 0: +0.5, 0.5, 0.0 +0.0, 0.5, 0.0 +0.0, 1.0, 0.0 +0.0, 0.0, 1.0 +TET no. 1: +0.5, 0.5, 0.0 +0.0, 0.0, 0.0 +0.0, 0.5, 0.0 +0.0, 0.0, 1.0 +TET no. 2: +0.5, 0.5, 0.0 +0.0, 0.0, 1.0 +0.5, 0.0, 0.5 +0.0, 0.0, 0.0 +TET no. 3: +0.5, 0.5, 0.0 +0.5, 0.0, 0.5 +1.0, 0.0, 0.0 +0.0, 0.0, 0.0 diff --git a/doc/tetrahedron_refinements/3-edges/edge_01-20-31_refined/01-20-31.vtk b/doc/tetrahedron_refinements/3-edges/edge_01-20-31_refined/01-20-31.vtk new file mode 100644 index 0000000..9acf5c3 --- /dev/null +++ b/doc/tetrahedron_refinements/3-edges/edge_01-20-31_refined/01-20-31.vtk @@ -0,0 +1,33 @@ +# vtk DataFile Version 2.0 +VTK LEGACY FILE FORMAT ASCII - tetrahedral sample file for H5FED test +ASCII +DATASET UNSTRUCTURED_GRID + +POINTS 7 DOUBLE +0.5 0.5 0.0 +0.0 0.5 0.0 +0.0 1.0 0.0 +0.0 0.0 1.0 +0.0 0.0 0.0 +0.5 0.0 0.5 +1.0 0.0 0.0 + +CELLS 4 20 +4 0 1 2 3 +4 0 4 1 3 +4 0 3 5 4 +4 0 5 6 4 + +CELL_TYPES 4 +10 +10 +10 +10 + +CELL_DATA 4 +SCALARS cell_attribute_data float 1 +LOOKUP_TABLE default +0 +1 +2 +3 diff --git a/doc/tetrahedron_refinements/3-edges/edge_01-20-31_refined/01-20-31_small.png b/doc/tetrahedron_refinements/3-edges/edge_01-20-31_refined/01-20-31_small.png new file mode 100644 index 0000000000000000000000000000000000000000..74e9cc99b402bb6f84c20dea6edcb8ec37a7f073 GIT binary patch literal 11903 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 literal 0 HcmV?d00001 diff --git a/doc/tetrahedron_refinements/3-edges/edge_01-23-30_refined/01-23-30.png b/doc/tetrahedron_refinements/3-edges/edge_01-23-30_refined/01-23-30.png new file mode 100644 index 0000000000000000000000000000000000000000..4933c892c963b190aff2729ec809b73047a44be1 GIT binary patch literal 8949 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 i3WolF|4WbW + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/doc/tetrahedron_refinements/3-edges/edge_01-23-30_refined/01-23-30.txt b/doc/tetrahedron_refinements/3-edges/edge_01-23-30_refined/01-23-30.txt new file mode 100644 index 0000000..95ea0be --- /dev/null +++ b/doc/tetrahedron_refinements/3-edges/edge_01-23-30_refined/01-23-30.txt @@ -0,0 +1,20 @@ +TET no. 0: +0.5, 0.0, 0.0 +0.0, 0.0, 0.5 +0.0, 0.0, 0.0 +0.0, 1.0, 0.0 +TET no. 1: +0.5, 0.0, 0.0 +0.0, 0.0, 1.0 +0.0, 0.0, 0.5 +0.0, 1.0, 0.0 +TET no. 2: +0.5, 0.0, 0.0 +0.0, 1.0, 0.0 +0.5, 0.5, 0.0 +0.0, 0.0, 1.0 +TET no. 3: +0.5, 0.0, 0.0 +0.5, 0.5, 0.0 +1.0, 0.0, 0.0 +0.0, 0.0, 1.0 diff --git a/doc/tetrahedron_refinements/3-edges/edge_01-23-30_refined/01-23-30.vtk b/doc/tetrahedron_refinements/3-edges/edge_01-23-30_refined/01-23-30.vtk new file mode 100644 index 0000000..84985ee --- /dev/null +++ b/doc/tetrahedron_refinements/3-edges/edge_01-23-30_refined/01-23-30.vtk @@ -0,0 +1,33 @@ +# vtk DataFile Version 2.0 +VTK LEGACY FILE FORMAT ASCII - tetrahedral sample file for H5FED test +ASCII +DATASET UNSTRUCTURED_GRID + +POINTS 7 DOUBLE +0.5 0.0 0.0 +0.0 0.0 0.5 +0.0 0.0 0.0 +0.0 1.0 0.0 +0.0 0.0 1.0 +0.5 0.5 0.0 +1.0 0.0 0.0 + +CELLS 4 20 +4 0 1 2 3 +4 0 4 1 3 +4 0 3 5 4 +4 0 5 6 4 + +CELL_TYPES 4 +10 +10 +10 +10 + +CELL_DATA 4 +SCALARS cell_attribute_data float 1 +LOOKUP_TABLE default +0 +1 +2 +3 diff --git a/doc/tetrahedron_refinements/3-edges/edge_01-23-30_refined/01-23-30_small.png b/doc/tetrahedron_refinements/3-edges/edge_01-23-30_refined/01-23-30_small.png new file mode 100644 index 0000000000000000000000000000000000000000..6cdac2a9157a382387c9841a8fa93022dd05b0d7 GIT binary patch literal 9206 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

_W! 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 literal 0 HcmV?d00001 diff --git a/doc/tetrahedron_refinements/3-edges/edge_01-23-31_refined/01-23-31.png b/doc/tetrahedron_refinements/3-edges/edge_01-23-31_refined/01-23-31.png new file mode 100644 index 0000000000000000000000000000000000000000..605c5793a28169fb91b7c92103ac1ecd4d033040 GIT binary patch literal 11889 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 E3p2b2Q2+n{ literal 0 HcmV?d00001 diff --git a/doc/tetrahedron_refinements/3-edges/edge_01-23-31_refined/01-23-31.pvsm b/doc/tetrahedron_refinements/3-edges/edge_01-23-31_refined/01-23-31.pvsm new file mode 100644 index 0000000..12811cb --- /dev/null +++ b/doc/tetrahedron_refinements/3-edges/edge_01-23-31_refined/01-23-31.pvsm @@ -0,0 +1,1839 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/doc/tetrahedron_refinements/3-edges/edge_01-23-31_refined/01-23-31.txt b/doc/tetrahedron_refinements/3-edges/edge_01-23-31_refined/01-23-31.txt new file mode 100644 index 0000000..be41cc0 --- /dev/null +++ b/doc/tetrahedron_refinements/3-edges/edge_01-23-31_refined/01-23-31.txt @@ -0,0 +1,20 @@ +TET no. 0: +0.0, 0.5, 0.0 +0.0, 0.0, 0.0 +0.0, 0.0, 0.5 +1.0, 0.0, 0.0 +TET no. 1: +0.0, 0.5, 0.0 +0.0, 0.0, 0.5 +0.0, 0.0, 1.0 +1.0, 0.0, 0.0 +TET no. 2: +0.0, 0.5, 0.0 +0.5, 0.5, 0.0 +1.0, 0.0, 0.0 +0.0, 0.0, 1.0 +TET no. 3: +0.0, 0.5, 0.0 +0.0, 1.0, 0.0 +0.5, 0.5, 0.0 +0.0, 0.0, 1.0 diff --git a/doc/tetrahedron_refinements/3-edges/edge_01-23-31_refined/01-23-31.vtk b/doc/tetrahedron_refinements/3-edges/edge_01-23-31_refined/01-23-31.vtk new file mode 100644 index 0000000..e052b9c --- /dev/null +++ b/doc/tetrahedron_refinements/3-edges/edge_01-23-31_refined/01-23-31.vtk @@ -0,0 +1,33 @@ +# vtk DataFile Version 2.0 +VTK LEGACY FILE FORMAT ASCII - tetrahedral sample file for H5FED test +ASCII +DATASET UNSTRUCTURED_GRID + +POINTS 7 DOUBLE +0.0 0.5 0.0 +0.0 0.0 0.0 +0.0 0.0 0.5 +1.0 0.0 0.0 +0.0 0.0 1.0 +0.5 0.5 0.0 +0.0 1.0 0.0 + +CELLS 4 20 +4 0 1 2 3 +4 0 2 4 3 +4 0 5 3 4 +4 0 6 5 4 + +CELL_TYPES 4 +10 +10 +10 +10 + +CELL_DATA 4 +SCALARS cell_attribute_data float 1 +LOOKUP_TABLE default +0 +1 +2 +3 diff --git a/doc/tetrahedron_refinements/3-edges/edge_01-23-31_refined/01-23-31_small.png b/doc/tetrahedron_refinements/3-edges/edge_01-23-31_refined/01-23-31_small.png new file mode 100644 index 0000000000000000000000000000000000000000..d2d5180b3bc7af0d0ec54f951f2bf0b6264504b1 GIT binary patch literal 11900 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 h#3@3UWca#G5Y6%r;v{|ERgMIitH literal 0 HcmV?d00001 diff --git a/doc/tetrahedron_refinements/3-edges/edge_01-30-31_refined/01-30-31.png b/doc/tetrahedron_refinements/3-edges/edge_01-30-31_refined/01-30-31.png new file mode 100644 index 0000000000000000000000000000000000000000..bb21646e5f6499a92f4f4d68203393ac388aadd9 GIT binary patch literal 10969 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 qDj{GTe3VE{`u~IfA6nyWKmF?3<|>BG?ML7N + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/doc/tetrahedron_refinements/3-edges/edge_01-30-31_refined/01-30-31.txt b/doc/tetrahedron_refinements/3-edges/edge_01-30-31_refined/01-30-31.txt new file mode 100644 index 0000000..4b56be1 --- /dev/null +++ b/doc/tetrahedron_refinements/3-edges/edge_01-30-31_refined/01-30-31.txt @@ -0,0 +1,20 @@ +TET no. 0: +0.0, 0.5, 0.0 +0.5, 0.0, 0.0 +0.0, 0.0, 0.0 +0.0, 0.0, 1.0 +TET no. 1: +0.0, 1.0, 0.0 +0.5, 0.5, 0.0 +0.0, 0.5, 0.0 +0.0, 0.0, 1.0 +TET no. 2: +0.5, 0.5, 0.0 +1.0, 0.0, 0.0 +0.5, 0.0, 0.0 +0.0, 0.0, 1.0 +TET no. 3: +0.5, 0.5, 0.0 +0.5, 0.0, 0.0 +0.0, 0.5, 0.0 +0.0, 0.0, 1.0 diff --git a/doc/tetrahedron_refinements/3-edges/edge_01-30-31_refined/01-30-31.vtk b/doc/tetrahedron_refinements/3-edges/edge_01-30-31_refined/01-30-31.vtk new file mode 100644 index 0000000..6698bee --- /dev/null +++ b/doc/tetrahedron_refinements/3-edges/edge_01-30-31_refined/01-30-31.vtk @@ -0,0 +1,33 @@ +# vtk DataFile Version 2.0 +VTK LEGACY FILE FORMAT ASCII - tetrahedral sample file for H5FED test +ASCII +DATASET UNSTRUCTURED_GRID + +POINTS 7 DOUBLE +0.0 0.5 0.0 +0.5 0.0 0.0 +0.0 0.0 0.0 +0.0 0.0 1.0 +0.0 1.0 0.0 +0.5 0.5 0.0 +1.0 0.0 0.0 + +CELLS 4 20 +4 0 1 2 3 +4 4 5 0 3 +4 5 6 1 3 +4 5 1 0 3 + +CELL_TYPES 4 +10 +10 +10 +10 + +CELL_DATA 4 +SCALARS cell_attribute_data float 1 +LOOKUP_TABLE default +0 +1 +2 +3 diff --git a/doc/tetrahedron_refinements/3-edges/edge_01-30-31_refined/01-30-31_small.png b/doc/tetrahedron_refinements/3-edges/edge_01-30-31_refined/01-30-31_small.png new file mode 100644 index 0000000000000000000000000000000000000000..536c03e83539f0fefc08eaaa03cd2a93207a9be9 GIT binary patch literal 12172 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 literal 0 HcmV?d00001 diff --git a/doc/tetrahedron_refinements/3-edges/edge_12-20-23_refined/12-20-23.pvsm b/doc/tetrahedron_refinements/3-edges/edge_12-20-23_refined/12-20-23.pvsm new file mode 100644 index 0000000..c912c83 --- /dev/null +++ b/doc/tetrahedron_refinements/3-edges/edge_12-20-23_refined/12-20-23.pvsm @@ -0,0 +1,1839 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/doc/tetrahedron_refinements/3-edges/edge_12-20-23_refined/12-20-23.txt b/doc/tetrahedron_refinements/3-edges/edge_12-20-23_refined/12-20-23.txt new file mode 100644 index 0000000..737fbb4 --- /dev/null +++ b/doc/tetrahedron_refinements/3-edges/edge_12-20-23_refined/12-20-23.txt @@ -0,0 +1,45 @@ +TET no. 0: +0.0, 0.0, 0.5 +0.0, 0.5, 0.5 +0.5, 0.0, 0.5 +0.0, 0.0, 1.0 +TET no. 1: +0.5, 0.0, 0.5 +0.0, 0.5, 0.5 +0.0, 0.0, 0.5 +0.25, 0.25, 0.25 +TET no. 2: +0.0, 1.0, 0.0 +1.0, 0.0, 0.0 +0.0, 0.0, 0.0 +0.25, 0.25, 0.25 +TET no. 3: +0.0, 0.0, 0.5 +0.0, 1.0, 0.0 +0.0, 0.0, 0.0 +0.25, 0.25, 0.25 +TET no. 4: +0.0, 0.0, 0.5 +0.0, 0.5, 0.5 +0.0, 1.0, 0.0 +0.25, 0.25, 0.25 +TET no. 5: +0.0, 0.5, 0.5 +1.0, 0.0, 0.0 +0.0, 1.0, 0.0 +0.25, 0.25, 0.25 +TET no. 6: +0.0, 0.5, 0.5 +0.5, 0.0, 0.5 +1.0, 0.0, 0.0 +0.25, 0.25, 0.25 +TET no. 7: +0.5, 0.0, 0.5 +0.0, 0.0, 0.0 +1.0, 0.0, 0.0 +0.25, 0.25, 0.25 +TET no. 8: +0.0, 0.0, 0.5 +0.0, 0.0, 0.0 +0.5, 0.0, 0.5 +0.25, 0.25, 0.25 diff --git a/doc/tetrahedron_refinements/3-edges/edge_12-20-23_refined/12-20-23.vtk b/doc/tetrahedron_refinements/3-edges/edge_12-20-23_refined/12-20-23.vtk new file mode 100644 index 0000000..2acbfb1 --- /dev/null +++ b/doc/tetrahedron_refinements/3-edges/edge_12-20-23_refined/12-20-23.vtk @@ -0,0 +1,49 @@ +# vtk DataFile Version 2.0 +VTK LEGACY FILE FORMAT ASCII - tetrahedral sample file for H5FED test +ASCII +DATASET UNSTRUCTURED_GRID + +POINTS 8 DOUBLE +0.0 0.0 0.5 +0.0 0.5 0.5 +0.5 0.0 0.5 +0.0 0.0 1.0 +0.25 0.25 0.25 +0.0 1.0 0.0 +1.0 0.0 0.0 +0.0 0.0 0.0 + +CELLS 9 45 +4 0 1 2 3 +4 2 1 0 4 +4 5 6 7 4 +4 0 5 7 4 +4 0 1 5 4 +4 1 6 5 4 +4 1 2 6 4 +4 2 7 6 4 +4 0 7 2 4 + +CELL_TYPES 9 +10 +10 +10 +10 +10 +10 +10 +10 +10 + +CELL_DATA 9 +SCALARS cell_attribute_data float 1 +LOOKUP_TABLE default +0 +1 +2 +3 +4 +5 +6 +7 +8 diff --git a/doc/tetrahedron_refinements/3-edges/edge_12-20-23_refined/12-20-23_small.png b/doc/tetrahedron_refinements/3-edges/edge_12-20-23_refined/12-20-23_small.png new file mode 100644 index 0000000000000000000000000000000000000000..f766e81315dd5ca7a44e439884965b785eaac556 GIT binary patch literal 13838 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 literal 0 HcmV?d00001 diff --git a/doc/tetrahedron_refinements/3-edges/edge_12-20-30_refined/12-20-30.png b/doc/tetrahedron_refinements/3-edges/edge_12-20-30_refined/12-20-30.png new file mode 100644 index 0000000000000000000000000000000000000000..68596c3abfed39e7c0941d10bf3c161c8a530f7a GIT binary patch literal 10319 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 literal 0 HcmV?d00001 diff --git a/doc/tetrahedron_refinements/3-edges/edge_12-20-30_refined/12-20-30.pvsm b/doc/tetrahedron_refinements/3-edges/edge_12-20-30_refined/12-20-30.pvsm new file mode 100644 index 0000000..1e5c1b5 --- /dev/null +++ b/doc/tetrahedron_refinements/3-edges/edge_12-20-30_refined/12-20-30.pvsm @@ -0,0 +1,1839 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/doc/tetrahedron_refinements/3-edges/edge_12-20-30_refined/12-20-30.txt b/doc/tetrahedron_refinements/3-edges/edge_12-20-30_refined/12-20-30.txt new file mode 100644 index 0000000..c93ac84 --- /dev/null +++ b/doc/tetrahedron_refinements/3-edges/edge_12-20-30_refined/12-20-30.txt @@ -0,0 +1,20 @@ +TET no. 0: +0.5, 0.0, 0.5 +0.5, 0.0, 0.0 +1.0, 0.0, 0.0 +0.0, 1.0, 0.0 +TET no. 1: +0.5, 0.0, 0.5 +0.0, 0.0, 0.0 +0.5, 0.0, 0.0 +0.0, 1.0, 0.0 +TET no. 2: +0.5, 0.0, 0.5 +0.0, 1.0, 0.0 +0.0, 0.5, 0.5 +0.0, 0.0, 0.0 +TET no. 3: +0.5, 0.0, 0.5 +0.0, 0.5, 0.5 +0.0, 0.0, 1.0 +0.0, 0.0, 0.0 diff --git a/doc/tetrahedron_refinements/3-edges/edge_12-20-30_refined/12-20-30.vtk b/doc/tetrahedron_refinements/3-edges/edge_12-20-30_refined/12-20-30.vtk new file mode 100644 index 0000000..c16175c --- /dev/null +++ b/doc/tetrahedron_refinements/3-edges/edge_12-20-30_refined/12-20-30.vtk @@ -0,0 +1,33 @@ +# vtk DataFile Version 2.0 +VTK LEGACY FILE FORMAT ASCII - tetrahedral sample file for H5FED test +ASCII +DATASET UNSTRUCTURED_GRID + +POINTS 7 DOUBLE +0.5 0.0 0.5 +0.5 0.0 0.0 +1.0 0.0 0.0 +0.0 1.0 0.0 +0.0 0.0 0.0 +0.0 0.5 0.5 +0.0 0.0 1.0 + +CELLS 4 20 +4 0 1 2 3 +4 0 4 1 3 +4 0 3 5 4 +4 0 5 6 4 + +CELL_TYPES 4 +10 +10 +10 +10 + +CELL_DATA 4 +SCALARS cell_attribute_data float 1 +LOOKUP_TABLE default +0 +1 +2 +3 diff --git a/doc/tetrahedron_refinements/3-edges/edge_12-20-30_refined/12-20-30_small.png b/doc/tetrahedron_refinements/3-edges/edge_12-20-30_refined/12-20-30_small.png new file mode 100644 index 0000000000000000000000000000000000000000..a05c998d712511d17603d55ca9e5b35a4209af00 GIT binary patch literal 11510 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 literal 0 HcmV?d00001 diff --git a/doc/tetrahedron_refinements/3-edges/edge_12-20-31_refined/12-20-31.png b/doc/tetrahedron_refinements/3-edges/edge_12-20-31_refined/12-20-31.png new file mode 100644 index 0000000000000000000000000000000000000000..ab0e09457aa00cf21515c03f39faa8a784ba7be2 GIT binary patch literal 10317 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 literal 0 HcmV?d00001 diff --git a/doc/tetrahedron_refinements/3-edges/edge_12-20-31_refined/12-20-31.pvsm b/doc/tetrahedron_refinements/3-edges/edge_12-20-31_refined/12-20-31.pvsm new file mode 100644 index 0000000..5985b94 --- /dev/null +++ b/doc/tetrahedron_refinements/3-edges/edge_12-20-31_refined/12-20-31.pvsm @@ -0,0 +1,1839 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/doc/tetrahedron_refinements/3-edges/edge_12-20-31_refined/12-20-31.txt b/doc/tetrahedron_refinements/3-edges/edge_12-20-31_refined/12-20-31.txt new file mode 100644 index 0000000..5e4e669 --- /dev/null +++ b/doc/tetrahedron_refinements/3-edges/edge_12-20-31_refined/12-20-31.txt @@ -0,0 +1,20 @@ +TET no. 0: +0.0, 0.5, 0.5 +0.0, 1.0, 0.0 +0.0, 0.5, 0.0 +1.0, 0.0, 0.0 +TET no. 1: +0.0, 0.5, 0.5 +0.0, 0.5, 0.0 +0.0, 0.0, 0.0 +1.0, 0.0, 0.0 +TET no. 2: +0.0, 0.5, 0.5 +0.5, 0.0, 0.5 +1.0, 0.0, 0.0 +0.0, 0.0, 0.0 +TET no. 3: +0.0, 0.5, 0.5 +0.0, 0.0, 1.0 +0.5, 0.0, 0.5 +0.0, 0.0, 0.0 diff --git a/doc/tetrahedron_refinements/3-edges/edge_12-20-31_refined/12-20-31.vtk b/doc/tetrahedron_refinements/3-edges/edge_12-20-31_refined/12-20-31.vtk new file mode 100644 index 0000000..1cd26c7 --- /dev/null +++ b/doc/tetrahedron_refinements/3-edges/edge_12-20-31_refined/12-20-31.vtk @@ -0,0 +1,33 @@ +# vtk DataFile Version 2.0 +VTK LEGACY FILE FORMAT ASCII - tetrahedral sample file for H5FED test +ASCII +DATASET UNSTRUCTURED_GRID + +POINTS 7 DOUBLE +0.0 0.5 0.5 +0.0 1.0 0.0 +0.0 0.5 0.0 +1.0 0.0 0.0 +0.0 0.0 0.0 +0.5 0.0 0.5 +0.0 0.0 1.0 + +CELLS 4 20 +4 0 1 2 3 +4 0 2 4 3 +4 0 5 3 4 +4 0 6 5 4 + +CELL_TYPES 4 +10 +10 +10 +10 + +CELL_DATA 4 +SCALARS cell_attribute_data float 1 +LOOKUP_TABLE default +0 +1 +2 +3 diff --git a/doc/tetrahedron_refinements/3-edges/edge_12-20-31_refined/12-20-31_small.png b/doc/tetrahedron_refinements/3-edges/edge_12-20-31_refined/12-20-31_small.png new file mode 100644 index 0000000000000000000000000000000000000000..0618bca2016ee1aab74781886ae5f095c08b3f45 GIT binary patch literal 10059 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 lqNhwQ~y)*gzzX0WoFxvnC literal 0 HcmV?d00001 diff --git a/doc/tetrahedron_refinements/3-edges/edge_12-23-30_refined/12-23-30.png b/doc/tetrahedron_refinements/3-edges/edge_12-23-30_refined/12-23-30.png new file mode 100644 index 0000000000000000000000000000000000000000..5fba02a56d9b25394ad5ce0928f85243e988f948 GIT binary patch literal 9721 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 j4gCMc{| + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/doc/tetrahedron_refinements/3-edges/edge_12-23-30_refined/12-23-30.txt b/doc/tetrahedron_refinements/3-edges/edge_12-23-30_refined/12-23-30.txt new file mode 100644 index 0000000..10cc56f --- /dev/null +++ b/doc/tetrahedron_refinements/3-edges/edge_12-23-30_refined/12-23-30.txt @@ -0,0 +1,20 @@ +TET no. 0: +0.0, 0.0, 0.5 +0.0, 0.0, 0.0 +0.5, 0.0, 0.0 +0.0, 1.0, 0.0 +TET no. 1: +0.0, 0.0, 0.5 +0.5, 0.0, 0.0 +1.0, 0.0, 0.0 +0.0, 1.0, 0.0 +TET no. 2: +0.0, 0.0, 0.5 +0.0, 0.5, 0.5 +0.0, 1.0, 0.0 +1.0, 0.0, 0.0 +TET no. 3: +0.0, 0.0, 0.5 +0.0, 0.0, 1.0 +0.0, 0.5, 0.5 +1.0, 0.0, 0.0 diff --git a/doc/tetrahedron_refinements/3-edges/edge_12-23-30_refined/12-23-30.vtk b/doc/tetrahedron_refinements/3-edges/edge_12-23-30_refined/12-23-30.vtk new file mode 100644 index 0000000..c503c80 --- /dev/null +++ b/doc/tetrahedron_refinements/3-edges/edge_12-23-30_refined/12-23-30.vtk @@ -0,0 +1,33 @@ +# vtk DataFile Version 2.0 +VTK LEGACY FILE FORMAT ASCII - tetrahedral sample file for H5FED test +ASCII +DATASET UNSTRUCTURED_GRID + +POINTS 7 DOUBLE +0.0 0.0 0.5 +0.0 0.0 0.0 +0.5 0.0 0.0 +0.0 1.0 0.0 +1.0 0.0 0.0 +0.0 0.5 0.5 +0.0 0.0 1.0 + +CELLS 4 20 +4 0 1 2 3 +4 0 2 4 3 +4 0 5 3 4 +4 0 6 5 4 + +CELL_TYPES 4 +10 +10 +10 +10 + +CELL_DATA 4 +SCALARS cell_attribute_data float 1 +LOOKUP_TABLE default +0 +1 +2 +3 diff --git a/doc/tetrahedron_refinements/3-edges/edge_12-23-30_refined/12-23-30_small.png b/doc/tetrahedron_refinements/3-edges/edge_12-23-30_refined/12-23-30_small.png new file mode 100644 index 0000000000000000000000000000000000000000..bd8ce6945aed412bb497b4966b5c0bc3e16cc832 GIT binary patch literal 9754 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 literal 0 HcmV?d00001 diff --git a/doc/tetrahedron_refinements/3-edges/edge_12-23-31_refined/12-23-31.png b/doc/tetrahedron_refinements/3-edges/edge_12-23-31_refined/12-23-31.png new file mode 100644 index 0000000000000000000000000000000000000000..ff80ac9ef115928d1438a8d425c9a40253084a60 GIT binary patch literal 9742 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 U+an(XKxN3$ZnJI0ddBhp1JUnQzW@LL literal 0 HcmV?d00001 diff --git a/doc/tetrahedron_refinements/3-edges/edge_12-23-31_refined/12-23-31.pvsm b/doc/tetrahedron_refinements/3-edges/edge_12-23-31_refined/12-23-31.pvsm new file mode 100644 index 0000000..2038386 --- /dev/null +++ b/doc/tetrahedron_refinements/3-edges/edge_12-23-31_refined/12-23-31.pvsm @@ -0,0 +1,1839 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/doc/tetrahedron_refinements/3-edges/edge_12-23-31_refined/12-23-31.txt b/doc/tetrahedron_refinements/3-edges/edge_12-23-31_refined/12-23-31.txt new file mode 100644 index 0000000..976d23c --- /dev/null +++ b/doc/tetrahedron_refinements/3-edges/edge_12-23-31_refined/12-23-31.txt @@ -0,0 +1,20 @@ +TET no. 0: +0.0, 0.0, 0.5 +0.0, 0.5, 0.0 +0.0, 0.0, 0.0 +1.0, 0.0, 0.0 +TET no. 1: +0.0, 0.0, 1.0 +0.0, 0.5, 0.5 +0.0, 0.0, 0.5 +1.0, 0.0, 0.0 +TET no. 2: +0.0, 0.5, 0.5 +0.0, 1.0, 0.0 +0.0, 0.5, 0.0 +1.0, 0.0, 0.0 +TET no. 3: +0.0, 0.5, 0.5 +0.0, 0.5, 0.0 +0.0, 0.0, 0.5 +1.0, 0.0, 0.0 diff --git a/doc/tetrahedron_refinements/3-edges/edge_12-23-31_refined/12-23-31.vtk b/doc/tetrahedron_refinements/3-edges/edge_12-23-31_refined/12-23-31.vtk new file mode 100644 index 0000000..44e12a3 --- /dev/null +++ b/doc/tetrahedron_refinements/3-edges/edge_12-23-31_refined/12-23-31.vtk @@ -0,0 +1,33 @@ +# vtk DataFile Version 2.0 +VTK LEGACY FILE FORMAT ASCII - tetrahedral sample file for H5FED test +ASCII +DATASET UNSTRUCTURED_GRID + +POINTS 7 DOUBLE +0.0 0.0 0.5 +0.0 0.5 0.0 +0.0 0.0 0.0 +1.0 0.0 0.0 +0.0 0.0 1.0 +0.0 0.5 0.5 +0.0 1.0 0.0 + +CELLS 4 20 +4 0 1 2 3 +4 4 5 0 3 +4 5 6 1 3 +4 5 1 0 3 + +CELL_TYPES 4 +10 +10 +10 +10 + +CELL_DATA 4 +SCALARS cell_attribute_data float 1 +LOOKUP_TABLE default +0 +1 +2 +3 diff --git a/doc/tetrahedron_refinements/3-edges/edge_12-23-31_refined/12-23-31_small.png b/doc/tetrahedron_refinements/3-edges/edge_12-23-31_refined/12-23-31_small.png new file mode 100644 index 0000000000000000000000000000000000000000..814f05a3f1b0747be971120ebbd3410f013f656b GIT binary patch literal 10575 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 bK4KCQ)paL)P^m&TK>~`hYBCk?%)a~|Huq&G literal 0 HcmV?d00001 diff --git a/doc/tetrahedron_refinements/3-edges/edge_12-30-31_refined/12-30-31.png b/doc/tetrahedron_refinements/3-edges/edge_12-30-31_refined/12-30-31.png new file mode 100644 index 0000000000000000000000000000000000000000..2279f61da1eed3d9ca5d9f41794e9b23acc953fc GIT binary patch literal 10665 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 + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/doc/tetrahedron_refinements/3-edges/edge_12-30-31_refined/12-30-31.txt b/doc/tetrahedron_refinements/3-edges/edge_12-30-31_refined/12-30-31.txt new file mode 100644 index 0000000..94b209a --- /dev/null +++ b/doc/tetrahedron_refinements/3-edges/edge_12-30-31_refined/12-30-31.txt @@ -0,0 +1,20 @@ +TET no. 0: +0.0, 0.5, 0.0 +0.0, 0.5, 0.5 +0.0, 1.0, 0.0 +1.0, 0.0, 0.0 +TET no. 1: +0.0, 0.5, 0.0 +0.0, 0.0, 1.0 +0.0, 0.5, 0.5 +1.0, 0.0, 0.0 +TET no. 2: +0.0, 0.5, 0.0 +1.0, 0.0, 0.0 +0.5, 0.0, 0.0 +0.0, 0.0, 1.0 +TET no. 3: +0.0, 0.5, 0.0 +0.5, 0.0, 0.0 +0.0, 0.0, 0.0 +0.0, 0.0, 1.0 diff --git a/doc/tetrahedron_refinements/3-edges/edge_12-30-31_refined/12-30-31.vtk b/doc/tetrahedron_refinements/3-edges/edge_12-30-31_refined/12-30-31.vtk new file mode 100644 index 0000000..f730169 --- /dev/null +++ b/doc/tetrahedron_refinements/3-edges/edge_12-30-31_refined/12-30-31.vtk @@ -0,0 +1,33 @@ +# vtk DataFile Version 2.0 +VTK LEGACY FILE FORMAT ASCII - tetrahedral sample file for H5FED test +ASCII +DATASET UNSTRUCTURED_GRID + +POINTS 7 DOUBLE +0.0 0.5 0.0 +0.0 0.5 0.5 +0.0 1.0 0.0 +1.0 0.0 0.0 +0.0 0.0 1.0 +0.5 0.0 0.0 +0.0 0.0 0.0 + +CELLS 4 20 +4 0 1 2 3 +4 0 4 1 3 +4 0 3 5 4 +4 0 5 6 4 + +CELL_TYPES 4 +10 +10 +10 +10 + +CELL_DATA 4 +SCALARS cell_attribute_data float 1 +LOOKUP_TABLE default +0 +1 +2 +3 diff --git a/doc/tetrahedron_refinements/3-edges/edge_12-30-31_refined/12-30-31_small.png b/doc/tetrahedron_refinements/3-edges/edge_12-30-31_refined/12-30-31_small.png new file mode 100644 index 0000000000000000000000000000000000000000..4b3727f85fbca583cb1a832b76dcf1b96d383444 GIT binary patch literal 11703 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 ZQm$Bc&zy_aUYe}|1z8oD%J-&U{|_((lobE~ literal 0 HcmV?d00001 diff --git a/doc/tetrahedron_refinements/3-edges/edge_20-23-30_refined/20-23-30.png b/doc/tetrahedron_refinements/3-edges/edge_20-23-30_refined/20-23-30.png new file mode 100644 index 0000000000000000000000000000000000000000..745babc9785602090571dc9565b4d5bf42a26264 GIT binary patch literal 11436 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 literal 0 HcmV?d00001 diff --git a/doc/tetrahedron_refinements/3-edges/edge_20-23-30_refined/20-23-30.pvsm b/doc/tetrahedron_refinements/3-edges/edge_20-23-30_refined/20-23-30.pvsm new file mode 100644 index 0000000..67ea187 --- /dev/null +++ b/doc/tetrahedron_refinements/3-edges/edge_20-23-30_refined/20-23-30.pvsm @@ -0,0 +1,1839 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/doc/tetrahedron_refinements/3-edges/edge_20-23-30_refined/20-23-30.txt b/doc/tetrahedron_refinements/3-edges/edge_20-23-30_refined/20-23-30.txt new file mode 100644 index 0000000..b256914 --- /dev/null +++ b/doc/tetrahedron_refinements/3-edges/edge_20-23-30_refined/20-23-30.txt @@ -0,0 +1,20 @@ +TET no. 0: +0.5, 0.0, 0.5 +0.5, 0.0, 0.0 +1.0, 0.0, 0.0 +0.0, 1.0, 0.0 +TET no. 1: +0.0, 0.0, 1.0 +0.0, 0.0, 0.5 +0.5, 0.0, 0.5 +0.0, 1.0, 0.0 +TET no. 2: +0.0, 0.0, 0.5 +0.0, 0.0, 0.0 +0.5, 0.0, 0.0 +0.0, 1.0, 0.0 +TET no. 3: +0.5, 0.0, 0.5 +0.0, 0.0, 0.5 +0.5, 0.0, 0.0 +0.0, 1.0, 0.0 diff --git a/doc/tetrahedron_refinements/3-edges/edge_20-23-30_refined/20-23-30.vtk b/doc/tetrahedron_refinements/3-edges/edge_20-23-30_refined/20-23-30.vtk new file mode 100644 index 0000000..6145dac --- /dev/null +++ b/doc/tetrahedron_refinements/3-edges/edge_20-23-30_refined/20-23-30.vtk @@ -0,0 +1,33 @@ +# vtk DataFile Version 2.0 +VTK LEGACY FILE FORMAT ASCII - tetrahedral sample file for H5FED test +ASCII +DATASET UNSTRUCTURED_GRID + +POINTS 7 DOUBLE +0.5 0.0 0.5 +0.5 0.0 0.0 +1.0 0.0 0.0 +0.0 1.0 0.0 +0.0 0.0 1.0 +0.0 0.0 0.5 +0.0 0.0 0.0 + +CELLS 4 20 +4 0 1 2 3 +4 4 5 0 3 +4 5 6 1 3 +4 0 5 1 3 + +CELL_TYPES 4 +10 +10 +10 +10 + +CELL_DATA 4 +SCALARS cell_attribute_data float 1 +LOOKUP_TABLE default +0 +1 +2 +3 diff --git a/doc/tetrahedron_refinements/3-edges/edge_20-23-30_refined/20-23-30_small.png b/doc/tetrahedron_refinements/3-edges/edge_20-23-30_refined/20-23-30_small.png new file mode 100644 index 0000000000000000000000000000000000000000..724d701b28bdf81138e13f41e30cf78a2de65ccd GIT binary patch literal 11443 zcmZWvWmFtZvz}#vun>X;f6)sitDml5IT>+uR6P-nuj z5sDBfvV-(0L%x?ShkvInB~ddkCaHJQ5A^||(vUAN<9u7X#zHuLZkskCqkA{BNgPpLh^qXLjM#UvY=OMh7O!jU`VN8)0u$WsWlGq9U^=O?-;iY%E&V4J!(tS^||ZifZ^Pc?_-TSl&64K{hnM>PbY^+uClJs6`zduZ z-?J^%lY(?3D{uX*deanRl{dncw5t84Wzsz->|%oy^#1szEtVCL714o+wp0_-D`1zP z;^it}v%<2%lKS51y55{;(j)jr#4W0w!p!~+&|C_JUCeiu{?s1ALCzrbIB-r|>*)xM zD8adUca>++vn(Of7}*|8QJ_(vF(UzQ-ctqsg@9qTo@@w|<(`iVaPw!k^_2CLir(@_ z<^Do^x|1lZNngbHxAfsm;ahoJ4{o~l0PAzrj<QxlLNH3tV-&STU&Yv)QoU<{q@%!U%F-^4}tt zRa2m%rK1hXqfTzbj{%YYAOZIFyuEhRA`ApcmyVpW7Jv4{L^nq_+hK(KuY->mr|-E0 zfFg+uknE0)bu)#i$2Qk~)(Wg|n69y%?d{nMZYuMqBKM&dV^CmF@DCN$Ej#}R;HN?W z$+L_M`k@a)CfaZgIES`7-IiJZ3{IWPcC%dvjqNIA!$i!hE1DwYSIDml1Ku*evY%7Q zh2hPvfDID~pyu=}c-qiqFV4Ri^Gb#^(NlOgZj^Dx!FCmQ!$c]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 W4HB>rJo=Jo3`mH{h?a`z`TigE0wGQS literal 0 HcmV?d00001 diff --git a/doc/tetrahedron_refinements/3-edges/edge_20-23-31_refined/20-23-31.png b/doc/tetrahedron_refinements/3-edges/edge_20-23-31_refined/20-23-31.png new file mode 100644 index 0000000000000000000000000000000000000000..0a65637628a758d450b3e358fd826855576d0c48 GIT binary patch literal 9930 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 Nex0+;b!*=v{|CgVt+oIF literal 0 HcmV?d00001 diff --git a/doc/tetrahedron_refinements/3-edges/edge_20-23-31_refined/20-23-31.pvsm b/doc/tetrahedron_refinements/3-edges/edge_20-23-31_refined/20-23-31.pvsm new file mode 100644 index 0000000..ee586d4 --- /dev/null +++ b/doc/tetrahedron_refinements/3-edges/edge_20-23-31_refined/20-23-31.pvsm @@ -0,0 +1,1839 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/doc/tetrahedron_refinements/3-edges/edge_20-23-31_refined/20-23-31.txt b/doc/tetrahedron_refinements/3-edges/edge_20-23-31_refined/20-23-31.txt new file mode 100644 index 0000000..4af572d --- /dev/null +++ b/doc/tetrahedron_refinements/3-edges/edge_20-23-31_refined/20-23-31.txt @@ -0,0 +1,20 @@ +TET no. 0: +0.0, 0.0, 0.5 +0.5, 0.0, 0.5 +0.0, 0.0, 1.0 +0.0, 1.0, 0.0 +TET no. 1: +0.0, 0.0, 0.5 +1.0, 0.0, 0.0 +0.5, 0.0, 0.5 +0.0, 1.0, 0.0 +TET no. 2: +0.0, 0.0, 0.5 +0.0, 1.0, 0.0 +0.0, 0.5, 0.0 +1.0, 0.0, 0.0 +TET no. 3: +0.0, 0.0, 0.5 +0.0, 0.5, 0.0 +0.0, 0.0, 0.0 +1.0, 0.0, 0.0 diff --git a/doc/tetrahedron_refinements/3-edges/edge_20-23-31_refined/20-23-31.vtk b/doc/tetrahedron_refinements/3-edges/edge_20-23-31_refined/20-23-31.vtk new file mode 100644 index 0000000..fd10588 --- /dev/null +++ b/doc/tetrahedron_refinements/3-edges/edge_20-23-31_refined/20-23-31.vtk @@ -0,0 +1,33 @@ +# vtk DataFile Version 2.0 +VTK LEGACY FILE FORMAT ASCII - tetrahedral sample file for H5FED test +ASCII +DATASET UNSTRUCTURED_GRID + +POINTS 7 DOUBLE +0.0 0.0 0.5 +0.5 0.0 0.5 +0.0 0.0 1.0 +0.0 1.0 0.0 +1.0 0.0 0.0 +0.0 0.5 0.0 +0.0 0.0 0.0 + +CELLS 4 20 +4 0 1 2 3 +4 0 4 1 3 +4 0 3 5 4 +4 0 5 6 4 + +CELL_TYPES 4 +10 +10 +10 +10 + +CELL_DATA 4 +SCALARS cell_attribute_data float 1 +LOOKUP_TABLE default +0 +1 +2 +3 diff --git a/doc/tetrahedron_refinements/3-edges/edge_20-23-31_refined/20-23-31_small.png b/doc/tetrahedron_refinements/3-edges/edge_20-23-31_refined/20-23-31_small.png new file mode 100644 index 0000000000000000000000000000000000000000..aef9241ee543a4f7a0ee090ad7884d4f37f46b62 GIT binary patch literal 10771 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 literal 0 HcmV?d00001 diff --git a/doc/tetrahedron_refinements/3-edges/edge_20-30-31_refined/20-30-31.png b/doc/tetrahedron_refinements/3-edges/edge_20-30-31_refined/20-30-31.png new file mode 100644 index 0000000000000000000000000000000000000000..83a458d2f693fcc84e51840919b7680247c46155 GIT binary patch literal 10304 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Ȇ#uQ%TK)I92 zKvAzZm;B<|K7?`;TRp{af2? z?QDc*Tl1a;{utJsOpX7&$6+d-P*V8U41^YDL + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/doc/tetrahedron_refinements/3-edges/edge_20-30-31_refined/20-30-31.txt b/doc/tetrahedron_refinements/3-edges/edge_20-30-31_refined/20-30-31.txt new file mode 100644 index 0000000..8b5ea47 --- /dev/null +++ b/doc/tetrahedron_refinements/3-edges/edge_20-30-31_refined/20-30-31.txt @@ -0,0 +1,20 @@ +TET no. 0: +0.5, 0.0, 0.0 +1.0, 0.0, 0.0 +0.5, 0.0, 0.5 +0.0, 1.0, 0.0 +TET no. 1: +0.5, 0.0, 0.0 +0.5, 0.0, 0.5 +0.0, 0.0, 1.0 +0.0, 1.0, 0.0 +TET no. 2: +0.5, 0.0, 0.0 +0.0, 0.5, 0.0 +0.0, 1.0, 0.0 +0.0, 0.0, 1.0 +TET no. 3: +0.5, 0.0, 0.0 +0.0, 0.0, 0.0 +0.0, 0.5, 0.0 +0.0, 0.0, 1.0 diff --git a/doc/tetrahedron_refinements/3-edges/edge_20-30-31_refined/20-30-31.vtk b/doc/tetrahedron_refinements/3-edges/edge_20-30-31_refined/20-30-31.vtk new file mode 100644 index 0000000..e6fb10c --- /dev/null +++ b/doc/tetrahedron_refinements/3-edges/edge_20-30-31_refined/20-30-31.vtk @@ -0,0 +1,33 @@ +# vtk DataFile Version 2.0 +VTK LEGACY FILE FORMAT ASCII - tetrahedral sample file for H5FED test +ASCII +DATASET UNSTRUCTURED_GRID + +POINTS 7 DOUBLE +0.5 0.0 0.0 +1.0 0.0 0.0 +0.5 0.0 0.5 +0.0 1.0 0.0 +0.0 0.0 1.0 +0.0 0.5 0.0 +0.0 0.0 0.0 + +CELLS 4 20 +4 0 1 2 3 +4 0 2 4 3 +4 0 5 3 4 +4 0 6 5 4 + +CELL_TYPES 4 +10 +10 +10 +10 + +CELL_DATA 4 +SCALARS cell_attribute_data float 1 +LOOKUP_TABLE default +0 +1 +2 +3 diff --git a/doc/tetrahedron_refinements/3-edges/edge_20-30-31_refined/20-30-31_small.png b/doc/tetrahedron_refinements/3-edges/edge_20-30-31_refined/20-30-31_small.png new file mode 100644 index 0000000000000000000000000000000000000000..ecde568fdba1b5c9f408247d2fb57a468b5de09b GIT binary patch literal 11075 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

N^ah@IxQ3 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 literal 0 HcmV?d00001 diff --git a/doc/tetrahedron_refinements/3-edges/edge_23-30-31_refined/23-30-31.png b/doc/tetrahedron_refinements/3-edges/edge_23-30-31_refined/23-30-31.png new file mode 100644 index 0000000000000000000000000000000000000000..bb06a64bf4366815434be1375097e95f0487dd0d GIT binary patch literal 13930 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 literal 0 HcmV?d00001 diff --git a/doc/tetrahedron_refinements/3-edges/edge_23-30-31_refined/23-30-31.pvsm b/doc/tetrahedron_refinements/3-edges/edge_23-30-31_refined/23-30-31.pvsm new file mode 100644 index 0000000..e36de7f --- /dev/null +++ b/doc/tetrahedron_refinements/3-edges/edge_23-30-31_refined/23-30-31.pvsm @@ -0,0 +1,1839 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/doc/tetrahedron_refinements/3-edges/edge_23-30-31_refined/23-30-31.txt b/doc/tetrahedron_refinements/3-edges/edge_23-30-31_refined/23-30-31.txt new file mode 100644 index 0000000..0d99541 --- /dev/null +++ b/doc/tetrahedron_refinements/3-edges/edge_23-30-31_refined/23-30-31.txt @@ -0,0 +1,45 @@ +TET no. 0: +0.0, 0.5, 0.0 +0.0, 0.0, 0.5 +0.5, 0.0, 0.0 +0.0, 0.0, 0.0 +TET no. 1: +0.5, 0.0, 0.0 +0.0, 0.0, 0.5 +0.0, 0.5, 0.0 +0.25, 0.25, 0.25 +TET no. 2: +0.0, 0.0, 1.0 +1.0, 0.0, 0.0 +0.0, 1.0, 0.0 +0.25, 0.25, 0.25 +TET no. 3: +0.0, 0.5, 0.0 +0.0, 0.0, 1.0 +0.0, 1.0, 0.0 +0.25, 0.25, 0.25 +TET no. 4: +0.0, 0.5, 0.0 +0.0, 0.0, 0.5 +0.0, 0.0, 1.0 +0.25, 0.25, 0.25 +TET no. 5: +0.0, 0.0, 0.5 +1.0, 0.0, 0.0 +0.0, 0.0, 1.0 +0.25, 0.25, 0.25 +TET no. 6: +0.0, 0.0, 0.5 +0.5, 0.0, 0.0 +1.0, 0.0, 0.0 +0.25, 0.25, 0.25 +TET no. 7: +0.5, 0.0, 0.0 +0.0, 1.0, 0.0 +1.0, 0.0, 0.0 +0.25, 0.25, 0.25 +TET no. 8: +0.0, 0.5, 0.0 +0.0, 1.0, 0.0 +0.5, 0.0, 0.0 +0.25, 0.25, 0.25 diff --git a/doc/tetrahedron_refinements/3-edges/edge_23-30-31_refined/23-30-31.vtk b/doc/tetrahedron_refinements/3-edges/edge_23-30-31_refined/23-30-31.vtk new file mode 100644 index 0000000..3b7024b --- /dev/null +++ b/doc/tetrahedron_refinements/3-edges/edge_23-30-31_refined/23-30-31.vtk @@ -0,0 +1,49 @@ +# vtk DataFile Version 2.0 +VTK LEGACY FILE FORMAT ASCII - tetrahedral sample file for H5FED test +ASCII +DATASET UNSTRUCTURED_GRID + +POINTS 8 DOUBLE +0.0 0.5 0.0 +0.0 0.0 0.5 +0.5 0.0 0.0 +0.0 0.0 0.0 +0.25 0.25 0.25 +0.0 0.0 1.0 +1.0 0.0 0.0 +0.0 1.0 0.0 + +CELLS 9 45 +4 0 1 2 3 +4 2 1 0 4 +4 5 6 7 4 +4 0 5 7 4 +4 0 1 5 4 +4 1 6 5 4 +4 1 2 6 4 +4 2 7 6 4 +4 0 7 2 4 + +CELL_TYPES 9 +10 +10 +10 +10 +10 +10 +10 +10 +10 + +CELL_DATA 9 +SCALARS cell_attribute_data float 1 +LOOKUP_TABLE default +0 +1 +2 +3 +4 +5 +6 +7 +8 diff --git a/doc/tetrahedron_refinements/3-edges/edge_23-30-31_refined/23-30-31_small.png b/doc/tetrahedron_refinements/3-edges/edge_23-30-31_refined/23-30-31_small.png new file mode 100644 index 0000000000000000000000000000000000000000..90359d826ac07100aa601784025ec8b58e7218f6 GIT binary patch literal 17172 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 a@Ic$6(M-+E)GJ{ckdsoDEdOZo_5T1vW}O27 literal 0 HcmV?d00001 diff --git a/doc/tetrahedron_refinements/4-edges/edge_01-12-20-31_refined/01-12-20-31.png b/doc/tetrahedron_refinements/4-edges/edge_01-12-20-31_refined/01-12-20-31.png new file mode 100644 index 0000000000000000000000000000000000000000..fb173dc69a64feb91f4b8ec18f236dcc69154f15 GIT binary patch literal 11314 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 literal 0 HcmV?d00001 diff --git a/doc/tetrahedron_refinements/4-edges/edge_01-12-20-31_refined/01-12-20-31.pvsm b/doc/tetrahedron_refinements/4-edges/edge_01-12-20-31_refined/01-12-20-31.pvsm new file mode 100644 index 0000000..adedabe --- /dev/null +++ b/doc/tetrahedron_refinements/4-edges/edge_01-12-20-31_refined/01-12-20-31.pvsm @@ -0,0 +1,2021 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/doc/tetrahedron_refinements/4-edges/edge_01-12-20-31_refined/01-12-20-31.txt b/doc/tetrahedron_refinements/4-edges/edge_01-12-20-31_refined/01-12-20-31.txt new file mode 100644 index 0000000..dbf6c22 --- /dev/null +++ b/doc/tetrahedron_refinements/4-edges/edge_01-12-20-31_refined/01-12-20-31.txt @@ -0,0 +1,25 @@ +TET no. 0: +0.0, 0.0, 0.0 +0.5, 0.0, 0.5 +0.0, 0.0, 1.0 +0.0, 0.5, 0.5 +TET no. 1: +0.0, 0.0, 0.0 +1.0, 0.0, 0.0 +0.5, 0.0, 0.5 +0.5, 0.5, 0.0 +TET no. 2: +0.0, 0.0, 0.0 +0.5, 0.5, 0.0 +0.5, 0.0, 0.5 +0.0, 0.5, 0.5 +TET no. 3: +0.0, 0.0, 0.0 +0.0, 0.5, 0.0 +0.5, 0.5, 0.0 +0.0, 0.5, 0.5 +TET no. 4: +0.0, 0.5, 0.0 +0.5, 0.5, 0.0 +0.0, 0.5, 0.5 +0.0, 1.0, 0.0 diff --git a/doc/tetrahedron_refinements/4-edges/edge_01-12-20-31_refined/01-12-20-31.vtk b/doc/tetrahedron_refinements/4-edges/edge_01-12-20-31_refined/01-12-20-31.vtk new file mode 100644 index 0000000..79c8ce1 --- /dev/null +++ b/doc/tetrahedron_refinements/4-edges/edge_01-12-20-31_refined/01-12-20-31.vtk @@ -0,0 +1,37 @@ +# vtk DataFile Version 2.0 +VTK LEGACY FILE FORMAT ASCII - tetrahedral sample file for H5FED test +ASCII +DATASET UNSTRUCTURED_GRID + +POINTS 8 DOUBLE +0.0 0.0 0.0 +0.5 0.0 0.5 +0.0 0.0 1.0 +0.0 0.5 0.5 +1.0 0.0 0.0 +0.5 0.5 0.0 +0.0 0.5 0.0 +0.0 1.0 0.0 + +CELLS 5 25 +4 0 1 2 3 +4 0 4 1 5 +4 0 5 1 3 +4 0 6 5 3 +4 6 5 3 7 + +CELL_TYPES 5 +10 +10 +10 +10 +10 + +CELL_DATA 5 +SCALARS cell_attribute_data float 1 +LOOKUP_TABLE default +0 +1 +2 +3 +4 diff --git a/doc/tetrahedron_refinements/4-edges/edge_01-12-20-31_refined/01-12-20-31_small.png b/doc/tetrahedron_refinements/4-edges/edge_01-12-20-31_refined/01-12-20-31_small.png new file mode 100644 index 0000000000000000000000000000000000000000..fc06bc8a28bc82baae6ca54920a50683b28c7093 GIT binary patch literal 11660 zcmZ`sOWUnql%NFniD@(&nYZiR@CxR$*!y@vHQ$9t|b^f4!4E%OWfQLk5qPlz8yVtt1 zn6{=cp0hZ1^j>nBQ*oLSDX8>9M*&d;^PQ?5wF%a{^Jz-tNXoDr1X-PTqEDPMy&sV_ zOGL5pMKOiZ;%kxeM-3&rBA(p)-CFl9CdU;9)jH#XB{5xPPGnDp&<$tWO9^;eOF+tp z2FDKg(9f&5zOLItKTqvbW2${NSjhlU4N05Fshgdc#lL>imzbVLPDZD3;FKK006FXp z9HH=&4S2&;fhzCP-49Lp3etN2vu-4S=0|+Dk=#<;vg^9bF z|HB4SRR9sD4Fs3(IswihjMG20Dc*dUO|-AFXX?D|SnpW3DI^$-#K9y?B}~10_+cJy z9&RrLie3iP8y5OY%*53iCug_fhBY<)Idp|`@_|l{qIa}>KJLDoNR#oZ#p@KuJhZ~ ziz9w>kChndo9#WG;xfkz)pZ8yVsTOCgm3^tax-)G`#ToRy6r-S5w>JA&ZyKA|7$U9 z{B!lTmc7;NFI5g`EnM&0d?&AS5B-hmsur~3)n16bae-7DIKWQarW$hvYh~lTsPdJ$ z4`=y*9nAsX)!x;*FQpZ7$YLQFer0hKSIKyqyz9H`Tfm*(()cepG>{vGk1<-#xHjxoCB0lazO=x` za`P@xKPfT0{uD<3!TK9nvUv~(7Mw-|I1fLO$_c9ptL?A>xlGek+W#3~m73C?(&m1+ zyWX1bBWnh&%yBKyt*b$b=0N~(=z_kN8%$v2bqxaMpeMUJ;>juXL)XympN2GuZ7PEC(lU` z`SqgC{`aGhkCvvUIdH%+cqGJ6~0R;jWFlEaA-;cQA)SvS;E_}AH<1%k9Z!ZJm>MRzM zEn3u1l)HrmtI+@m87xw23?{I!0T?e~sW_I`H#9fQZE~zY55oRaU9xN(TX?W?mU13| z!lcIRPg?QiJJmhIKpOD?q|b>f#Ia*$4aKZ0dk0|(c9e1!%9ny;h@LnRA*P0S`u&;D zgn+^djEHf~(VQ1-Hdt`%x>5JgY3MceBvmaL8h(Ur&kv6|CX)G|>kbJUBJlmQG-kOJhk z<+AH@ubOm-yC)2FX*<2akVSLxYx;|zZOh?Qb>wV!(h4`;J3vYb$Zf8^c&u&_b^1Qs zKkSr3CxSg!(;FfrN1+(wySQnA#gf(W*YEku`cu-UlnExsQgCy!8E@NN4@TefXJ5UW znTkYcT@Z-~6$nrJ5#zfcA?DkkNV|3H}s6cJ6x|mU}+x{iZ z;8yBxs-ikLG^^sXq?6cs9 z6TjC>lR!|9hrRe-FK8fjfO`4ao#*sq&fsrItaSM1fkeNh;NBODm7MmT_VKTd+66Xn z?J=@CS&2VcTerVR&yyLn?B@%=e`R%_(@>ZwBLR#xFn}38_Gex{3ma3L{0|m<5eJdf zl?>8;w2W+wY-c^Y|Hl4iBV0SpbZ-fr_DC{cm*vvY=|Bja3Bj2juu}v zx}R~LU^NIuqe8%d zk^h%5;MIhchQ(6lkOg>r@%rO2cpT$-;YobVIozIImR)A}D++=OMCk#*>EHRS`()co zu#VPRvdD{WH2bsT9<>XxAa{MIMT=zMJLy&;!y>VEHU~m zGfhkm=?gsCFspF<{rYH@CF_}RVoAh1iGG!yhdhRpULq?;79#}wONRwJiVjbk9^lZA zlU?%fc2Z?@I^1ZjMeggAQ^nU3Qbxw>$uSw(-+A72H^9Mmelg74Yj{0Ab3)V&o>9>I zO`K{Q0~i~l0!OtqgKo>w0f?Izp09umOWDk4U+NhghIqa8f6M1>C9`Km`t9T7_XdUE zVb&X%fIpv}JZBF4$29D&J5likSL`+$8_4JP_hY$2KfHHQ9rqdc$>84cAAY2!zc&y^ z2mX1$0xR=LFW(YjWOYVAB3HzlQ^?%N+#p@Ah@a*;1>OW4KHs>Nw6w3DFx)ecu>rV# zr+G1fg4vd~P#hV*Q`2{Uvd_HmBAEs=W+ffQVhU5xi5hH}o^GD+JNSS&A4K5nb&qGc zDKmUo(Tz50^yTn)({4+QfWN`F{-*8`w`*!}Y>?^SK_O}ab0(cjAJWPIkegAqjUfud z-pk%QFs=>K0B!qO@+JQVxI4dM#lKvw9u0NTKB9Dqhh&gm3hrhcrZ}cM>Rl9R2mmwx zV1ab_%OO<9C_|IaXWrV=tdur6(`$gE3f?NuZUsqJ0v`;P!Bh*rztAxNY~$Yp9g?>X zeR^I;$~wf(kOr;P^KiY_V+=2hTTK4y$6qJX6Gux;p23Yw3%)Knwk!Y$;}w&{CiPdO4&{?y@PGKU-GVQCac5}@n4O!(1{)-ECK?dI8bko3 z`_9Mb)|GeF_jNo8b?>yi%A&$Urb2RbC^dmzU7ySe^fa0LtH4FNRsUSQF3o{M-%Taa zDsd0O9@rI}A7_JR@$q1d{jMnJqbtS&U3Zt7*bOcWisWvQ|l^9-O6#cOW!3>CVd@Ye9w1J*YXK9T8-7bi{;rV1SB zTZ{1`KffBcvs;{VJ?{N6j+XWP$?wSj=yGjaV8mOiE4_&v4(uWh7?=17W>5Fz(qK9W zTT@c57Wn7I^V?&9a>wje27yN;3j_BLT>gNu_i)AM9@=mv=hO3mU8I%)b<3J8L0+ky z^ht!i;wO%soVHg1;mfB{h-Uk-2ekFKE_c0sp=u8WMxwlSAtN>+E14un+7UT2Zk2gM zt~W_#wlmLH{CmDX_r1NG1Ia6|Axt-lDhZ6pDcidF=PD4FyOahuNv0ds zU5Ec`@AAXCs86~2-@VIS7?Fd<`k6)NHc-wF#OBy^mYXrBuM-}sTYupP_ix;N-MeS5 z)TS4t=aj|&A0UzxX>`cbMs=VNI;u}RZgIQamSZCd{%K79r&YiIJo<#=#L1M8B!?1I$r z7f}|<;P3Plm6oA*;qAblb9-818aD5^CU8_QgoRif~j@1|a5Z^bT zM|aVG(LeQTU8gAt?K$5mNJz|mcE4Qx>z7fJm_CK*frH7}ys@vl+-cC?J#Cv!SUc*9 zILYSvhFKkaSjkokRtw*lxKGzQUXPzBODIbs=AWom@c~wH6yQnh(0!^&2j|-@5m_?a z{x|NC5$*PiPNb31cg$)#pU#zA2TCx}1@p2rjq&m(t!q?X)f1B}``N zOe}l?{jSe7o!31^j+1+Cp!qG5B{a0Dw5g0Wk{d_>D<2v_x>Yk+WD_I_Y2RBxfLlEH z1WhGRoBC3ga)uq|IYGZ$W@ShV$S~~eAe_4Qy*JM|oN!(7t8h|-9zK7KU?j>W z%)aw(X!+4HFpY>fKt_0*Z?f9c@m;Ox)WnVEQqHm^GD{*$;u8uqE{U$fh{uFxosE1j zeNC}5gZK*C90J7`TEFkV@0Ts@Xz`X?<5K1z0j}N(10%18=N$n{Bj4UlFsp+F>Z(nf z3AsXf0b0(-Q(z*37S`+f7uO5_$673Bm}auQ*95W7m&j`t+$z6d+H zG0O|=C6apDBZ`O^Quxq(?ttTVR()cyB4^u$0sOOq1>cwf;NAIz#kx;zkkGc35b#m+ zzgLU|O|6QkcRG2Mkk=R_+OkG?9SR*M7{We6OfH<~*GIUDPx2HhE*h%Or%0jwvT%2; zPXxpJT2F_KvyiJut1Osz`M)h5IPGD;t}tNFKv)q=MnFVk5n3flf@(L*H>%qs?AKw_ z^(;I_ob*+w%0G6T8ck9@I}GH31~^0M6npmm z2y}2Df(!Kl$_&HgxkXeR(WCwol7VJ7f-w?y+r=kZ0i$YEC!-;48tG5cyJXP6#?s$Q zt#kN=|>6UR?+@d!uV%oeBevS%R%XHIFXGpwna8TL^7G1VUZY+35Nq7LNf$obRAG8 zM-7W=*T|Asgg70rSR1ZeJHeyThN^11SqcCvvkS4fLmq#_55QX{n>aiYYukOr^XU$} zewlS9u>Ht|m4PcXBSHUcj?CDiJ^Y;bXd)~Ah;f|r<>&%B;?%9+UsVYeYGscHC}SBm zaYZEJ+8=A5#2D=69J>`d1su>l%Odj-f zW4t_5?|o=9A?Rc7wM0(AW=8W=nNqKkI^$};_>?)so8W^c$m8v38sft5 zQZY&1!2n+aPXLldXea zay-w^BnNiI3F34B5!)V;pqeh>5qTR|AY$`C;t!)CNGn;IF)6T=cuS(`=u?x zf`NDI{{L1dJ1I1q7o8enXK>ZTA{dw1%|@b<7v)YEKMcOD$6Yeg)E|xP9G04G^nWL} zlDi2OKD64lqTKb@`mz6j6ES3S%C-@@B1CZJo7wNt@RQ`dx)S~DY&nGU8ZTG(2^M^8 z3K(lYWOFat0CBab0CopJ>9p5ELz-EM!2i@$0^L;i73R`0CR$kc(uL9~2xtmua;NU~ zUz*-)dKiT}J?kM?#3f$U9-BZpM0D_Srj?}y40ch~Q z3dL;XJ$&@6F(*AkyiH__3;5LXdraf{5fEf;NZ48Ivf)+Zchcz$czAemk1nq?S4=NPsout!}4&OGOS7P(dNYP=;$q04xZ= z1LIuYpsCYeRE?o|%?A860e=)hBkAb+E-k@GQ4{7XLSdqdp}nT`;$_}#p&jXRG}yot z6z28$;?9K(&@98#fbuvkH9zOC>=AISOwR|Gto0XawCm$&jfbu8 zP^g-rJE1FY{#@a2CuKQEmKH(-Y5zy0bHj7HFZ>|qJIS4Py{(7*5 zv14QOWtA@?04v?jDChxWTFNZPB$Av@8X#ICS`t}}?0DVXc4O1EjUZoiiM2EJO1?43 zl|Sh%(Mkkc%Hv)*8o!VLUY=OMDhQ_0(6zBi$Z06cZOV7W_%Vh8F=gX}pemk5Y_O)x zz(Z++s?{koIja+-qp?#tKRa=&=;wtD2`X?eJc?g}?`jK|zCj`c9K{j)rV=K|zo?>t z1y^q^-)7=lajTN*4cJ;b`1S`GY%KLRti@l+-m}dnPviWVADM@n%Abm$aN{VG9{zYW zGUr7(@N3kkWl!DXewPBbo~y&22q>(CgG7(Pd2Tb7M5$JB3#KPE*i`CyZdf*bz_SOJ zzMEw>!HcsWC(L1caoLPQ=J?c+)tS(q5NT%(Mi{nZd;J0w;$2cJ{_4Kv7x`l5tg;jH z-JZlBJC)d@80PE)6V@w8 z)T_RPAKgz>mra;6gd!03vS^6`Ro7#8xq+h-nfnMa{V>CHbJTj1VLVYgCkmQga!%x3 zm5_W+ysTx2;m{q^9&7mMb{GyE%%HVjo;02TC zu+@JCX=T2i%r{@CYxbbZ`*6u=)B1}uHB^&~+g#bQKeemtO~Sr|{g&&F*OML5E10dW z$P+c~$ah5dK3Y?IK0ox3Ft)y^2IT;{^!I)ypjq78mqibu&|ykZLEqz1C7#mSblf(a z&Z-VOG^4cEHoX>w!nnKpLBEb%f| zs7ZI&iaiS7zY?Xi_x$1;ADKH<%o3qr_|o09pzWNqUldqLw`&~^_p<$RlGr+T!_3I` zGTJ|lujO43(8^nssfA{h=Gywm>yR$~TaH?e8icbn$ON574{CK*`CM_f39cBLpcTT1 z=wSleJkKxGMR{T{OQD?>0GC>mm|N&JGB5cSdZn<(NO_^!asXg_$q%S-Y|qM4Ot-E1 zaX;usW&G7JTzr4~-jmWvZmfITrG(S|Y=};ic2a)L7FwIPXj$Br!-)BO|&Ufx+wM6xbj_+0K;Bsa!qMUb) z446XEa=$a_hnbZv&;_sSq)-j-6Zi)^BL0##B0}!?m7`&*TObJJGI~zK>xr!xd-sl? z^!yMI*rVW%e=KASba^qQbZ|{)Cs zLR(ow$W>nFv$)MfX}0R|3i&%>q&cC5MwjV2%i- zY<*uAVTS@N73o3X!LcVNN+a?qbFKDGJ>F zWk$@T?V$lg{T+s%ZMj_GbFpW~%0GjWqx3|W@^_iMZ=5&+rfDmKCt7JnB{+6rz%k2L z;#T!O7h9_B)tAZhcaZbxC!ORl*Ww)oxccRWWxV;3sZF~&qk6OUan5OO5+R1)4^d5) zErbnoT!M>OGkOvB+nSO;opg$NJ+x$1Wy@;195>oRnD)N%dG8nI=H+GO8Au*%^B@2o zY>eJJzq5=`A?o>%D*o9A+s`)f*B`0(Gb@8hK02ZU)`%(fQ<@0;zKn z$B07M8&e_Y&q&n?!;>HDG%e9WyMNf=1E^p%WdTtBO=5^$3jR1QI zm$w0O9X^klkDBk8w+rq^iY(;k>2vy#Qj^{BcDhRU>AH+7(-Qq`OYhH$Su3Y4{~TGP znOcFKTU!iN&yRj963FFHHgvc`JmFGAoT;a1F5<7(k$Q5SFqIen832pf9%g|1S6-6O zt1C;oy-mD*KD^G|k`Eu2a;s@Mw&MBx-Jp?iRE+2F_x-Mbc|JgzoDr#>?cD6mePwV-G7>_!SFLAm!lvx!fU#h z2qzie=#AqS7f^P+)eTLn>%Qt%-(Zm=3ZQ?PX!kii5X2+fvflc~K68c$AZ-A`^F*ejqcb`o(ZELJd(35oFj> zvvsyuVMT*VlOr`I=wW=usI_d~%>|`|+zh)-r+{N%{Y8qSB#Qo{b8k3*tuJx|Y zg=WwM0BL*f3pbB~tLM)=f~5>U(P|@<@Rh9F4ILerujJYsc^P91jrSM`Xt}_hCj=UA zM=GL|RZ?_0Y9}XsCru}ELr2xx6KOJP z1tLq``kzn)`mwHVn#!NZzzl_J1%DpzQuud~*)JqT)hR5-$mPFZ6PiJd>9*0^U-MVh zb5dhM?#kt!CREAJSmuAJY>8d|v|7rt*~4t2cTy*}N_Gx)9*m`dj|RZkeP$jeF+DEd zw?H{OU5)wMvIpzUJJEj|tJ5?udu6tI2MaPc=cLPDyR$ZcT#$<4w)Sxvq*XR#EE0xM{0#0V zRLuI(&Gl5Z@+xVSzP9`G6(%%3$ec9;lUu>q*!DHQ&$WnAVd2tIlciU(h? zi(Nu+z}`&3Y{r6rL#gYrKFC8cd=q_-dFp95LtUaTRhVkw^*JR#{O!OHj{;Bs`_9Om zR!V9Wkt=q1<~4DVo|T--0(U%Q zdrsn+*);`mA?KqpQ2K-l5KA)mmn?p*)oB>1{HGPufVixZF|)m|rAx7rmo>o7LkB<6 zkeas?pD~=oKJS@tO>LsdTTV3RS#{bLgN}lRQg!XzapQFy1Qm}yOg>3otF$%lm@AZh z?PQqOn2OFHU18#T^2qW0ek*!=5ew?#KfjmiAjmbUH6MG`CTb$f3!L$|_DQKeIiwhH zx;xx%=gqdvdh{Y+;o8aa{o!jF7R)$g=16@yZO^bNF^`V z zB%iXZugwXUtfPRX<+@*o`RsdZbD_JOM=IUpaXI{H$hXy1z3PX#XamHh z&S~YQ>EE{QVpuFyz>agaZr$+bTyhO^Mh>$qis_e?K71Xx_lu8 z3B^8t%Yw~io))ARc81+20;L~K;`fGn{Rx*8gX^tEro zDvA)Ut$Id7l02Pl?Ot0&d%AX-cD`FJiS96!Vl#Rot|(%JGmOimhfh?1GnH=IXM{i! z8aXj+t)|_C+ugqz$aO=DiVb+bJUT9LmkAlPR|1yg8z?t#in$fD ziB0V#W?U0tFxw2nIol37jWrukZIf0jyH_Mb*y>I=>`qBCjV%aqAh-u!Hs_V zdh~P}v9#jypE8OS)PHybl+Z=L=FB@NHmEI^1@h&u9ks-Sccpc2vRi6%GXNKksHF0Hie)D|3 zL7tXuYr$yG^vK$OnYziXf-j-5NRcUjtK<-7g5?A9U{y%l{cHiTjO2kw%Sv zFhCF-QTP#W@({67v=S>_>Z!<&rT9_uzpjbJ z+&DfkU8e}}O}&_f+A+iUv^{9rCeh8A&6$DQ!Hj_pKCO3)N6sFJF(krKHK}N($RTe5 zLx)#D6qFStKX2Kx*?3`8KfpX3fQcvSP~evqQvo)$gdCD$Juxi|xf_MWzmakhVII+E z<82$flB?RQs3-HsTvL>Gze`p~NTd@$D8znInft_@7NuA8HU=7DN=Am-t6>d4 zn9!R@Yi++89Q$-V>Dy!6_S66kb8$L5oT2<{eW)UHlQ-pE0>3zP_p6wvksz%1ZW0`ONpH^i^nn!$$ zg-j`9x5HiBj-}fuxu)Y|kWi4&PJ4ZJTTH=C>2P%Ne@-A3O*U@@Y|Ej~TDw;56H>JN za3Gd+Vb|f;eN0?qufeauheTLPatI;>Z@xJ}H~mEivU%&)&K_XnF_hLA5lt;-oP2eRWIHL&9>nQRM2)y>$kRO{)B}6 z4#qjeZofv==1=SBxs^v^So}|iE+mA>l3HZLP@_Sz=wr6J{=NweMDs6uHKREd|2(GV zi)!G0Q}t8HtMiT7j-HzRC>7qD5&#uThtUzct<_d<@l|hOk>|xz3}cTLJQ$-Cqh~n~ zn_FTvw>e~Zlwa@KEYGXlksDh0a_NDHQwFC^eC)&GS>tM@yx&Hh zMDB}HrkaBcLG1@)anIEO4kZd*I(w#Bd^2{oh)wcXAUDBZB2vDnaEOpd&mBV zlCfIm#E$Y7lusXL%_rJDP>KBTiA$4I!8Tq)@~Kq2?XPixnTa)jS60EaY1W!M!<|_D zlXd~<5V;bbDeZ*kL(WI+Iry&-_;(+WM1`{xoneq~L7&d}rhi~8(0TdGY-(#V8gR-r z3OGBHIHi1;*4DSwiyluD^?N77KXw{4Di0e2LIQ6Msal1`o!*1hn ze2X&ZPY(h>s(|`xQ&06tssY}Pf=s%~xUJ#$MAhXGv9xWWpb5wr6y=^(FfSfxrdz#x zy>$&ohcmoA=+mZTv4m_cLyqHLyCIVe50+lS?GErrNk;Ih&G7!uKxR# zHt2P3wVVv%o`ZDH;6R={Cs7qHQm$N%VYm)&NQv%3`C5#HGMSh5V*C84oX=O_h{trHn#})tp literal 0 HcmV?d00001 diff --git a/doc/tetrahedron_refinements/4-edges/edge_01-12-23-30_refined/01-12-23-30.png b/doc/tetrahedron_refinements/4-edges/edge_01-12-23-30_refined/01-12-23-30.png new file mode 100644 index 0000000000000000000000000000000000000000..2a253b370905984f04adab0444bba373f11f4d87 GIT binary patch literal 12300 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 literal 0 HcmV?d00001 diff --git a/doc/tetrahedron_refinements/4-edges/edge_01-12-23-30_refined/01-12-23-30.pvsm b/doc/tetrahedron_refinements/4-edges/edge_01-12-23-30_refined/01-12-23-30.pvsm new file mode 100644 index 0000000..0b415d4 --- /dev/null +++ b/doc/tetrahedron_refinements/4-edges/edge_01-12-23-30_refined/01-12-23-30.pvsm @@ -0,0 +1,2021 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/doc/tetrahedron_refinements/4-edges/edge_01-12-23-30_refined/01-12-23-30.txt b/doc/tetrahedron_refinements/4-edges/edge_01-12-23-30_refined/01-12-23-30.txt new file mode 100644 index 0000000..dd59055 --- /dev/null +++ b/doc/tetrahedron_refinements/4-edges/edge_01-12-23-30_refined/01-12-23-30.txt @@ -0,0 +1,30 @@ +TET no. 0: +0.5, 0.5, 0.0 +1.0, 0.0, 0.0 +0.5, 0.0, 0.0 +0.0, 0.0, 1.0 +TET no. 1: +0.5, 0.5, 0.0 +0.0, 0.0, 0.5 +0.0, 0.5, 0.5 +0.0, 0.0, 1.0 +TET no. 2: +0.5, 0.5, 0.0 +0.5, 0.0, 0.0 +0.0, 0.0, 0.5 +0.0, 0.0, 1.0 +TET no. 3: +0.0, 1.0, 0.0 +0.0, 0.5, 0.5 +0.5, 0.5, 0.0 +0.0, 0.0, 0.5 +TET no. 4: +0.0, 1.0, 0.0 +0.5, 0.5, 0.0 +0.5, 0.0, 0.0 +0.0, 0.0, 0.5 +TET no. 5: +0.0, 1.0, 0.0 +0.5, 0.0, 0.0 +0.0, 0.0, 0.0 +0.0, 0.0, 0.5 diff --git a/doc/tetrahedron_refinements/4-edges/edge_01-12-23-30_refined/01-12-23-30.vtk b/doc/tetrahedron_refinements/4-edges/edge_01-12-23-30_refined/01-12-23-30.vtk new file mode 100644 index 0000000..cbbd55e --- /dev/null +++ b/doc/tetrahedron_refinements/4-edges/edge_01-12-23-30_refined/01-12-23-30.vtk @@ -0,0 +1,40 @@ +# vtk DataFile Version 2.0 +VTK LEGACY FILE FORMAT ASCII - tetrahedral sample file for H5FED test +ASCII +DATASET UNSTRUCTURED_GRID + +POINTS 8 DOUBLE +0.5 0.5 0.0 +1.0 0.0 0.0 +0.5 0.0 0.0 +0.0 0.0 1.0 +0.0 0.0 0.5 +0.0 0.5 0.5 +0.0 1.0 0.0 +0.0 0.0 0.0 + +CELLS 6 30 +4 0 1 2 3 +4 0 4 5 3 +4 0 2 4 3 +4 6 5 0 4 +4 6 0 2 4 +4 6 2 7 4 + +CELL_TYPES 6 +10 +10 +10 +10 +10 +10 + +CELL_DATA 6 +SCALARS cell_attribute_data float 1 +LOOKUP_TABLE default +0 +1 +2 +3 +4 +5 diff --git a/doc/tetrahedron_refinements/4-edges/edge_01-12-23-30_refined/01-12-23-30_small.png b/doc/tetrahedron_refinements/4-edges/edge_01-12-23-30_refined/01-12-23-30_small.png new file mode 100644 index 0000000000000000000000000000000000000000..87bbc76b7b8502d8915698a7e87ff02d79273041 GIT binary patch literal 14415 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 + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/doc/tetrahedron_refinements/4-edges/edge_01-12-23-31_refined/01-12-23-31.txt b/doc/tetrahedron_refinements/4-edges/edge_01-12-23-31_refined/01-12-23-31.txt new file mode 100644 index 0000000..7250207 --- /dev/null +++ b/doc/tetrahedron_refinements/4-edges/edge_01-12-23-31_refined/01-12-23-31.txt @@ -0,0 +1,25 @@ +TET no. 0: +1.0, 0.0, 0.0 +0.0, 0.0, 0.5 +0.0, 0.0, 0.0 +0.0, 0.5, 0.0 +TET no. 1: +1.0, 0.0, 0.0 +0.0, 0.0, 1.0 +0.0, 0.0, 0.5 +0.0, 0.5, 0.5 +TET no. 2: +1.0, 0.0, 0.0 +0.0, 0.5, 0.5 +0.0, 0.0, 0.5 +0.0, 0.5, 0.0 +TET no. 3: +1.0, 0.0, 0.0 +0.5, 0.5, 0.0 +0.0, 0.5, 0.5 +0.0, 0.5, 0.0 +TET no. 4: +0.5, 0.5, 0.0 +0.0, 0.5, 0.5 +0.0, 0.5, 0.0 +0.0, 1.0, 0.0 diff --git a/doc/tetrahedron_refinements/4-edges/edge_01-12-23-31_refined/01-12-23-31.vtk b/doc/tetrahedron_refinements/4-edges/edge_01-12-23-31_refined/01-12-23-31.vtk new file mode 100644 index 0000000..a0c5d67 --- /dev/null +++ b/doc/tetrahedron_refinements/4-edges/edge_01-12-23-31_refined/01-12-23-31.vtk @@ -0,0 +1,37 @@ +# vtk DataFile Version 2.0 +VTK LEGACY FILE FORMAT ASCII - tetrahedral sample file for H5FED test +ASCII +DATASET UNSTRUCTURED_GRID + +POINTS 8 DOUBLE +1.0 0.0 0.0 +0.0 0.0 0.5 +0.0 0.0 0.0 +0.0 0.5 0.0 +0.0 0.0 1.0 +0.0 0.5 0.5 +0.5 0.5 0.0 +0.0 1.0 0.0 + +CELLS 5 25 +4 0 1 2 3 +4 0 4 1 5 +4 0 5 1 3 +4 0 6 5 3 +4 6 5 3 7 + +CELL_TYPES 5 +10 +10 +10 +10 +10 + +CELL_DATA 5 +SCALARS cell_attribute_data float 1 +LOOKUP_TABLE default +0 +1 +2 +3 +4 diff --git a/doc/tetrahedron_refinements/4-edges/edge_01-12-23-31_refined/01-12-23-31_small.png b/doc/tetrahedron_refinements/4-edges/edge_01-12-23-31_refined/01-12-23-31_small.png new file mode 100644 index 0000000000000000000000000000000000000000..e7ef9112d574c23c6e0b85f2ef21c5cb0f436ff1 GIT binary patch literal 11705 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 Z;gE(KfeqA(|Jtqr(&7p~D#Y~t{s(CdkT?JU literal 0 HcmV?d00001 diff --git a/doc/tetrahedron_refinements/4-edges/edge_01-12-30-31_refined/01-12-30-31.png b/doc/tetrahedron_refinements/4-edges/edge_01-12-30-31_refined/01-12-30-31.png new file mode 100644 index 0000000000000000000000000000000000000000..d3668913f0a60549ac56c0ee032ccc4c34a53409 GIT binary patch literal 11100 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 + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/doc/tetrahedron_refinements/4-edges/edge_01-12-30-31_refined/01-12-30-31.txt b/doc/tetrahedron_refinements/4-edges/edge_01-12-30-31_refined/01-12-30-31.txt new file mode 100644 index 0000000..0e2f72f --- /dev/null +++ b/doc/tetrahedron_refinements/4-edges/edge_01-12-30-31_refined/01-12-30-31.txt @@ -0,0 +1,25 @@ +TET no. 0: +0.0, 0.0, 1.0 +0.5, 0.0, 0.0 +1.0, 0.0, 0.0 +0.5, 0.5, 0.0 +TET no. 1: +0.0, 0.0, 1.0 +0.0, 0.0, 0.0 +0.5, 0.0, 0.0 +0.0, 0.5, 0.0 +TET no. 2: +0.0, 0.0, 1.0 +0.0, 0.5, 0.0 +0.5, 0.0, 0.0 +0.5, 0.5, 0.0 +TET no. 3: +0.0, 0.0, 1.0 +0.0, 0.5, 0.5 +0.0, 0.5, 0.0 +0.5, 0.5, 0.0 +TET no. 4: +0.0, 0.5, 0.5 +0.0, 0.5, 0.0 +0.5, 0.5, 0.0 +0.0, 1.0, 0.0 diff --git a/doc/tetrahedron_refinements/4-edges/edge_01-12-30-31_refined/01-12-30-31.vtk b/doc/tetrahedron_refinements/4-edges/edge_01-12-30-31_refined/01-12-30-31.vtk new file mode 100644 index 0000000..2fde230 --- /dev/null +++ b/doc/tetrahedron_refinements/4-edges/edge_01-12-30-31_refined/01-12-30-31.vtk @@ -0,0 +1,37 @@ +# vtk DataFile Version 2.0 +VTK LEGACY FILE FORMAT ASCII - tetrahedral sample file for H5FED test +ASCII +DATASET UNSTRUCTURED_GRID + +POINTS 8 DOUBLE +0.0 0.0 1.0 +0.5 0.0 0.0 +1.0 0.0 0.0 +0.5 0.5 0.0 +0.0 0.0 0.0 +0.0 0.5 0.0 +0.0 0.5 0.5 +0.0 1.0 0.0 + +CELLS 5 25 +4 0 1 2 3 +4 0 4 1 5 +4 0 5 1 3 +4 0 6 5 3 +4 6 5 3 7 + +CELL_TYPES 5 +10 +10 +10 +10 +10 + +CELL_DATA 5 +SCALARS cell_attribute_data float 1 +LOOKUP_TABLE default +0 +1 +2 +3 +4 diff --git a/doc/tetrahedron_refinements/4-edges/edge_01-12-30-31_refined/01-12-30-31_small.png b/doc/tetrahedron_refinements/4-edges/edge_01-12-30-31_refined/01-12-30-31_small.png new file mode 100644 index 0000000000000000000000000000000000000000..e18841eaa6da51efc98b01fa967c66965cbb144b GIT binary patch literal 12300 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 literal 0 HcmV?d00001 diff --git a/doc/tetrahedron_refinements/4-edges/edge_01-20-23-30_refined/01-20-23-30.png b/doc/tetrahedron_refinements/4-edges/edge_01-20-23-30_refined/01-20-23-30.png new file mode 100644 index 0000000000000000000000000000000000000000..400523e22ffad2239553d52c93597ea91a897c83 GIT binary patch literal 12390 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 F{{Vi6DAxc0 literal 0 HcmV?d00001 diff --git a/doc/tetrahedron_refinements/4-edges/edge_01-20-23-30_refined/01-20-23-30.pvsm b/doc/tetrahedron_refinements/4-edges/edge_01-20-23-30_refined/01-20-23-30.pvsm new file mode 100644 index 0000000..5007341 --- /dev/null +++ b/doc/tetrahedron_refinements/4-edges/edge_01-20-23-30_refined/01-20-23-30.pvsm @@ -0,0 +1,2021 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/doc/tetrahedron_refinements/4-edges/edge_01-20-23-30_refined/01-20-23-30.txt b/doc/tetrahedron_refinements/4-edges/edge_01-20-23-30_refined/01-20-23-30.txt new file mode 100644 index 0000000..75ac129 --- /dev/null +++ b/doc/tetrahedron_refinements/4-edges/edge_01-20-23-30_refined/01-20-23-30.txt @@ -0,0 +1,25 @@ +TET no. 0: +0.0, 1.0, 0.0 +0.0, 0.0, 0.5 +0.0, 0.0, 1.0 +0.5, 0.0, 0.5 +TET no. 1: +0.0, 1.0, 0.0 +0.0, 0.0, 0.0 +0.0, 0.0, 0.5 +0.5, 0.0, 0.0 +TET no. 2: +0.0, 1.0, 0.0 +0.5, 0.0, 0.0 +0.0, 0.0, 0.5 +0.5, 0.0, 0.5 +TET no. 3: +0.0, 1.0, 0.0 +0.5, 0.5, 0.0 +0.5, 0.0, 0.0 +0.5, 0.0, 0.5 +TET no. 4: +0.5, 0.5, 0.0 +0.5, 0.0, 0.0 +0.5, 0.0, 0.5 +1.0, 0.0, 0.0 diff --git a/doc/tetrahedron_refinements/4-edges/edge_01-20-23-30_refined/01-20-23-30.vtk b/doc/tetrahedron_refinements/4-edges/edge_01-20-23-30_refined/01-20-23-30.vtk new file mode 100644 index 0000000..548d77d --- /dev/null +++ b/doc/tetrahedron_refinements/4-edges/edge_01-20-23-30_refined/01-20-23-30.vtk @@ -0,0 +1,37 @@ +# vtk DataFile Version 2.0 +VTK LEGACY FILE FORMAT ASCII - tetrahedral sample file for H5FED test +ASCII +DATASET UNSTRUCTURED_GRID + +POINTS 8 DOUBLE +0.0 1.0 0.0 +0.0 0.0 0.5 +0.0 0.0 1.0 +0.5 0.0 0.5 +0.0 0.0 0.0 +0.5 0.0 0.0 +0.5 0.5 0.0 +1.0 0.0 0.0 + +CELLS 5 25 +4 0 1 2 3 +4 0 4 1 5 +4 0 5 1 3 +4 0 6 5 3 +4 6 5 3 7 + +CELL_TYPES 5 +10 +10 +10 +10 +10 + +CELL_DATA 5 +SCALARS cell_attribute_data float 1 +LOOKUP_TABLE default +0 +1 +2 +3 +4 diff --git a/doc/tetrahedron_refinements/4-edges/edge_01-20-23-30_refined/01-20-23-30_small.png b/doc/tetrahedron_refinements/4-edges/edge_01-20-23-30_refined/01-20-23-30_small.png new file mode 100644 index 0000000000000000000000000000000000000000..a68929aec5236c2db6e90e75f964b0502aef234e GIT binary patch literal 13375 zcma)jWmJ{T_x7A~=td+22|*+TL1_>;(%s#Hbhq>YL{v(UZjkOq`T)|>-JQ~%^5^+| zd%wN+T6533W3Ab<=bG7j_P*w;l7b{I7C9CG09RT{Oy!~Oekg$i(1$xI7d8Duh3O!r z?fg(n{jW&$SPT94(#_$W`9uA`zrkhKjurqMbJAk()IQGarMSZ%OHy>E%{Q&`dZII_ zWaVLyJSK#QcLd;?gbAKoaJtE}46~8Tjy?7|2*Apm!geDNN6nU2M+VTSWIuJUU8J^v zO4YRo2J*J}eVR^iUq}$3HZx!J2{zV_HPt4-KoJQHj;)2EK>cZ$#L6BXfBIvP_`@wY z30i3hFv8GiwNRiL!*G-kI1MNH7b8N9PZBUf7O4M_1x>*CmULZ`6VGPQ$FCnTy~G!q z2{2r-35z5KJ>3K;Ze4tjZddwP*Y~jfm1-T<_CUt@V;jaPrQ?;YnV;5lFsEO9bNGcx z&pD-)_Ue~T14dIOdu9co@6NvyYtU^Z_HxB+npbdCa)iiDb8_QKV8^lOIhjse7oBOp zqxu3zS?HaWguaUe)Q-wf#N{V-9c;V6a5PHq>|^Nu@w27CtM zuzS|*@VLS(T-zebaZ@!?;e*N}^Hr0O^*t{C!|aEaqd$f;bwsW*$7&F;0Qgb%ifr3E zQ3ZTHpSL@^iIvvI?a#{k-xwR-dXyNl_Xp^atgCwvV(|maDFHjhQElrT1~Y-oZz22s_~ZhtT*v z{iSld{+NpBe`8IKn@^<5u<@#?tW?*6QN4-bZPlz~P_zvybjm>W%=cHz(W>4+c z1cjg(W?ziB$Qw1iO2heSl9`j4o0avO5;e3;dmOqQE|tdg^BYF|ElVex4B~1f7k)k` zCl%il#P7%F(Fd zdB{v*d|B=|T77chUY&aGk-3Ks)6&o`72CPnx$pZkJz0LTjM}s==m}jme30K_>M1w6Y&b?Z z2Cae2WK{hb{hh>?*j6Jh`G+^%zrEy-W>;!6w~tdXp^yh`BQXu0G`?|l7zxdKqRp(r zUA&G}$nuW=9Y0fU@Mk<+K_O`eT?gG$xrLK=mopCtOV8)qDPXqplD*_Jze(Gp_A=WV z$PiHch_#Qk|7e=F8^2>#?8$;+A*|HjR)hpz8X3jLj&I(weHHcZ~oS~u3eta;_3e>{)ucorgBvNL)AhoJet z;pF|+%yw;XiEJ5aIn*wl(N*?A0e7kZsY(gtCSZX6-B$jGB5VUv?@7Pm8u8hZSEeV^ z-nY*OwduSmzY7+jb@kl-xOxo>&c{h<$!ucQs5_BZa=Con!0{MVbV<QB!UmNrc^?e|4F-f`t0H zoe~bvzJSosk^=)0D0q2f4NpslZNsfr{J+DV1=4oizTMcINIeq@`gG6xfE@&Hnzs<& zLdm&G_Af$E^eEe=69(jYfI|`*NNs>1cX0r_ir7?0Lr6oVSIf`lp9=S`79APHiZkOU zD3AV~JS+k5U75L-fMvZlyR~c7Vu`T2^d|+Vz-F)xhT)jVabx(4CltL`))F*)?2%W^G4{d?n?ee z7H|I!W`MtcqN7$-bcz92162!n*%7ohX)v{1%h?mEb!TNk|+MDnBZ+ z+4oslu9?69{&>!QC=Yox&SY08#U#o6pX>Sil4FBtPbfTC7-9r}4YUT)K~8Vd(A>kd z64%7xY5vrcu#xGb>Q2OQs-?*4XAF(NrQb***iY-TEm1;XR9ENCWbca!bD5#wK}R|= zLrcYUo}#*4V74#cP2~mb$>=gs{u2lOKf_@b#rGh+K7ks`Lu{UG*2RXrEqC{1$DgnU z#wLd@TK6SQb60cwEpYh=1F!&qtwu-z>(XE80!zZ7m{P$?h!PoAA;!3Z`*F$ zjFYYC)V~b^WQE8p^p1A=6ht`s%Kn||7!(hJ-S`~FyccA$tDil+&n=b1v`hB)7b-i4-x70Y`i z5d&loo8gWNK;%PwnPaD@Zphqo;iD-6u zXX>L;Q}5FD0EJY+35-Zy=fGgJ4VOkwI7CKoKJyi^weu5DwhEBQ7D#%vAYf#XNsQ*) zzB{&4TSrU+=i&@qkGHId7S*Bb3hpt-9m^OrhK_?ulFF{z z1)PK~lFEHGcGFUxr^x(PcL<|~UWdAI)7Nhs4GLq1P3}cPA#2q4TQ#u1^=$JF_}9HZ z-Y}>Y_0MC1Vn%TINYL=m``zeGpekB!@^GJFT#EvMk|H(8AQVB7wR)m3~j@U-+ed!TK~4Pi{$8dadH@|VdF$SaR-3(Q<_ zCKGiWl-#(bp^-!^!_RDEv6c>z830IH-e#*kzC>-v??`Fb>+L9Gl4(_>2Iwv3LtH0Jw*`u3yUJizA43WO_c<>nB2z(1*hear`M~EM*YL``LGsq>;I{nkHoO7Y>3>9&mdp6O!*i z83&1JeDPA$i1yVf^J5 zKv?9N&E0cV#0n5~hRs#0t(Qg!KdB*Ua$U9cR@`ybwuPMfN`J^-bOU2QX$6k?tKo^x zeId|nP07-5_5P-^f2!FZ{f7v&i??)PzC_hXu}`$YOCdx`Zt^QHYlAOF7%{EZnV5lt zL7CCG<=@eX@}sDl<+msRyYD#rZA+9Ga++pB&67r@>(fNz@)_uVz9Nw^-n?9{o z!E`1(M3WCIkh9R2T+Fgg{JK(zznR+n(IZ@Y{uFK@_nsEa3)G(2_0lt) zQD{IsxU&HvTAoQIrU7zZ=Ko7bpVQ-QM7Gs{KnfH$+UyqpquWNqT zA^U+LPo;bNMqOu^rU!vsPhVjY6-F5BLH6I}aa{%yQnzy7RZ#%@ms72mjo z%jvk1?iuck*AK`V=(!YJy$GO>>og=!V?6p?yZ#I)=_xl?se0Q`A$bV0{1PM$9Za-h zyRMj-HFodAr^2p2H^tDY9Vp~8=Rtn)(&8Wrdz7XJ=p2&6aD?~iJnr-wqGy?E?W^^# z?s^YQ_psjyJ?O~U`~Lh+z|4NQR(uhQ{^Of&X&7Q7ab5Om5%U#HA#fGF_jmS;O_OFv z42!Bf#krs4S(lvY!3LGmtY|*dCG3#e7!RqYzw?u&V57$8cz;$qAS1IW01`E(_@|}u z__#O8TH{j*Mw72)f>8q8t(jmAMp(q(RXbIyb?lCogbM+w_E##oqDSw*Jp!psLe*mt zq#j$S?aW0t6=IInh*oJyKVKIaUGj(&x%WB<{29yb$@~$TOFj1nYR~F1ydEn?Xf)`1 zdU1M@)pUpvvA?TbY1$tv<(`HsMDgLRn~0zYN+F&{^UhVluC06STuPK@%f?KyCKxhy zxl-wq5Av^OueM|px(%*1h~4eY`vAVww6 zj!uSmFnFK*bun`}b47{uP@_6)``ejE@v{sCOufqV$n^02+xeyQ3oWiU|4p}p5a!v# zW{rRCa%@%gCl8hewnoTvtzj*42sn_qQrT?Nl7t@(M%g^!=O!S6gy!tLz#jkh0e^I0 zw}wbw^3)V{*V~H2w4@cvyFm=#>dV+I&ZH5)^;>vV){s_Tbu`r(EJwztHO;Z{Nx7J= zFKb?Kk%QlxK_NjQcW)(2$(m^2>|7?Ssx*5meCH7>+xbj=2zzyHdpJw*)6m%z4+gkb z9w3`5GXtfp{ViNFEn=I#pOJ@WZe)6_qWam#<-Nh;-y(v~Qn|@t3$S0D#;<`os(~#o zL$=u!{XEv<;fCwSn7>8w?2E>WD;4xE=m7B=e32Iu6c@b1i*S0nPL}Q5_V1Gq=EhCh$J&YrXY8Fi(q5Q?q!mPU`4}CSF^tSKXfD6QUzd9KoaF`Wl&X<#zYbP#Kva& zcukNe#E!(LOhHkubnWo9=lhPRwj=E;?W@eDyID9<3_$FAG`Epva zGJ?u#-dS`I*B;u=+0OaS!ibUHy-_f5y+R?_A#`6a2Q=3q&^+kM}g)eQ%kq}o=D zu1PtBnqIxdea8Qe1v(t)S7X21Izq`Xt z>z-mk*wHd06d@lpOVZ&({|Yf0c`1;`P~|&r1F3SfHo=LXO`L@?>#Em4<3oE~7wW!L z=Vne3<%)d1Z5@#2H;#m0Z2~J*d=qfOA1frPme=#A=^{UQ>10}29KRy)kvCgo{UKJ; z`*8B}-;5Lh-nX;!p|exBQ+JMX(v|)+HoH8xD~$JouN6^JQSxT!*r+cMUKm*{ z0pX{rHB4*9M7{NOvYpn+(>(hrq4s7F6m8PdGDR`$O%w7m#22r_s>A@I(a@gd3@ z8&gXWmh?l1p*qtLr;j{#-Tl`wxtclH5``cNhI3V3XuKtg7rei{KzIfR@MFD653|5U z>I_=3r;9Q5u-h4sJ;#AA@He?a7s5XBKp72`8sTW4XA9=KC(|dwT?Llp&W80;$G@_Y z++n5P41WdtSsKg+bWGGfNHg)|Pn!&}vBVcu9 zj*0u-!eZrED1loT7ASq>{}QH2<@~hF3E3N!4o!nHRk#o~KLkDu#ae#^Fo;}d_KPQ7 zGAp=c2tUjpEX+0DffWrn>0W#g*O`(mixD1~7sX#tK&R%~JZB`YbdZ06kSLdUZFKUZ zUlDO+jPZ$@0gURXh{{(y67fL?4 z!cH?0x6d8JEMKQrC`l=;2sK9?;IGMQG4qpOo}rzkot@EoCiUQ>u&r1u3^#r$r+y>! zA^KL`BP?ecq!*|+SLuHo!Gzn|`TwbOiZwn=Y9>!l%BU3ab#9;Soy8)%p}2wBa?Mx) zk~@}bNCBxD8yKVCi4rq&Yf2dVWH$M9k2{C%=H0IJVkS=XAnX?(KQ^KyY9{yF)lPvV zf=7;M+sQrw0R7dI?gHr@r>2Xug}D2~8>4*~w`ekrLf%FGzi%`FXX5{hg{ws-M=2|ve1 zbGpRo{o$Xl91LyWUCm6RtRj^NX|<}Kp9KG*#>!oob8v1CVg8qy#0NoG1qD8TibZ4y z*lg}15-NJJV#H* z=#U}D4U@Kg(v~V%%%AsCmqthyKX+#59(8FZPa9NSnfQ0p)l_R$`+7$l<+4$Z!!B%V zYv+Y7E<)ot3|0u;L|29|13o-B9Q0k3;R0g)q!g3#3roE^2x0DB0@$h zD=W@}a*?u-MESBq)GZAc%Iu%{0`a(i(BN#6Z0KeBCJks7ud6zg;IpE$u=K@|^`C{G zI~%P%0)0HoYd5XSFaog0HSP%zs-k*`3*-5G_yAM2$o5^jsf(Jp#qaa6z5GqT_;N3_ z2XicnQW*PmNFe*cyN zOY=GlI-&heiR-|2i<@(3tT>+nd6RH)(#0IU{CC#Pbb1y~UuYppRX^zkY&XL`5hzQz z`N=N6q}NVv{PYQLCbEp~+1UG}iyEEA3HiLIv|1`Ze!Xw>IK`ayXw76K!q7y;its~KhA=cSk zn>5;kgj+UbWGyT#LRC{i-@`2`rB}gpR=she3KQhz#IV_#r*KjzalE<}CAm}8&1(Up z?KwdRr>{02-d@`GB^i}HCfQ6^?YZBuHQx#qSQ7AK zeE`zsUv9GElV7bIR%v*N9Rn>~iN>38B-PDT;J7D{Qs zDDori3ceY1VB^PP*qgw%0xhXDHs~3^{E^?ejF9+x?e|fg{>UGzwd8~uT*N;vl{**=`Q>CP`{`I%(3j{_cF@(u8?5 z5aY2fOL3@9R*AYnqNeo zVv{?#AcwO$CQA$(41_CZrXE67gsrlHam`Po$zsW3T~8KAMtZETa=i7!Bc~`G^r`5^ zGqBRy6;}-*e_A+NfYM%G>53Lg;Pdla>xi$|vb1hH2QzwV>;@;gn^D7(3i%|JfhSqg zlqU>l49GVf@1n*xn^D2vR*+7nepJwA0@%-?h>2W)RKWyll`Srf^ckp|SOb(v+=uJP zIO$+mHMF{UY{ic<%0PlPXFkpCzU@poVz?B0y zTKb|$Px;SXcmFx=i@3kvNcgq&YpXu~z7tRT{W!AY2dUzV0uQ{Cr*1`ZR{YNDz~Pj| zu+~JWk$Q;d(2@1Ln9;rWN!gTbDsCRWYU$a#eOy9=7d6C!PA3FGi!)s5`Rucc0}i2= zOND(Z6e>Z?NIBydkWVM-v4*`5J-YVi^XHqU0K|*| zD6>HawxJ-sM+hvbdHs^KJC$wx?N9aJARLrF&w8FUR$Ll}UeQ(%mDwsD7{qhBxYIK4 zBFMwYlcxm%i8d&p7ORWLvd2}rV7%kZmppb2FUcFnO`==6WGiA#*`u2C* zcHG7J>0{iMsgTW1Dnfg3|c=!}7zMYSUL@C8UYgO9Qbl57B7$aVu3m5Id zavxJU+Llez4TLXy3K7@v)|L`U{>INt82Iu?no?J+PIVvT66X@b@iT(KmiCn$i8b2@ z>Vk^^Ke?3d#$QaDC*x0BOyki2TB^m8cRViG#sY`?WT4EnnNZ^AQ`e`io%{8F8vdxx zr5~w?el8v2dGW&qzS$An`Ehov73 zxq}?xQR?&`ThGS`EIawXCL>72ld$}YeB2AXnx>%uM-_rZl7XST@D$Qc2(rN%eCNgo zD765&Wr=QwzCU%Y$#1Zo_e*RwT%w7xVOHrOXo7jrz7R~jy)*lF*53Qs8U~*Y1K4_n z0`^AJtQ@JnQi00FWFE9JDpHxt@#O=RWK^w#@^Cb=XFr&+=#gB9v>rcrzPqj~aPcIlQ9OiQ zpkM~|I8`9Q0UuNZgR}q!wZ$643E$~ohW7Du?8=8q2}LRw46Zz652|ewYVdJe_LB=u zCiCE?en2V!wL{0%$($>3Ak~?AR@O{?Ij8N}gP*nj8j;)kW2JlWT9PYiFQFlOmS{NE z+WuOecn2lgqS)*z;q}N&28nVA*uXtOOQ+kGLVSy|6YSw8YC<>Ax-BQ{)^Tr0JPFDp z0Y(qjhuqZ#Pq{r^iW0DVzUN%eWwJHAt2wDnIX=((N3(6poFSKU-U8CqgBmfCF=^$~ zPjbu;AX48M!za?~5aP*o`l7J~FFI|I)+NCa4!7ACf_@~`^_+;s6n%YOSYdXhXj6^> zER_2vE_+TW6GHfi0l_FmuTI-?8w+0N4x4G#Lh<~(%jb?T4L%bTCQEOKgGYFaXt)b%a9Ejvs9 z@^WP-7>bw;e^4BEmo_x@Asv6O`R~cYlFra)2*!yEQq~2VzfFDl{p2;e=K^VX!{Z%K z)yK|#-^$-rF)HZ@oT_*-Aw!KMKoztYAo1L)&tzO)w9pYOI@bv(5&Te+2lQPJc3TT9 z@w92tU-Q^m+gUd!Fil45GK*T7K9?S!EKy39NkOu2vM;EP)d^8dIBNzaxRa{R;~_680>z54wlGXT9`gKN*jm)loW7< z7ea*4rH`F=68AG~_&cn~do|*W?e{wB(a|Gpc1pHq%blEDF^O11izAD^-@a#7O!(%#>6f+FBJ>AOc<7<)tv2F*J7Ge%|V-wQat5|Idy(gTK*Lht{ zf{*Z4t2qzqrGtV+7F)K|KmR*gOME^vOBYna03%%5C060-0L|a{#4;vlMsh(V)2yx zB9l(pOIh<^Pboo^c;R?qkV7|02xmKmeh*@K;(3!K6CKtxdNHugvoFTRf4W)MzJf>V ztW3{@f0Y1?#-9RSrzqxq={&cKI15C zIObU*v)F+q_wioPLe_ zG8MOW-55L5x!!mur6J{^cMuZe_a!w_pn~TNkumr;P8VE$y6z)G|WCWey+<&EWnVuH>;RMVYF1QN9Jcuz8c0J`7BX% zgk1xV7o@-$Kq&Ml7|Puq1uhxbNa7OL)#h)tG8z58xpJEaCBn<|tC+YC&ga@gsyfT2 zUhw|hJNoN@3N<<)i3D)h$OPD9#(j4yCM%}wH>Zv<&tIM3*!`;UuYqj9Q3yA@J%az^ z&S5LIcwOt)yWak|WWf3c(p~d*)y@1>YoB`!A6Q+ZR=%|EXI*;%nb<5k2A#3_qWPI_ zG=Y@Uow|+Jj&MKyjLXxD;uhj!?0X0j6D(i^e(;D-%y@$QV`c`Elg*)rd#Ie9uY9ws zUr=lcofYTLx@J#yPzdkr>LSEcAl(kBDsw*yU5V%#uy#QKColkiU?Uj1ltC5!yLes` zCt}H(O6iZ4l<8+|U~0N*x>lb~bQXubv^J1FiLZ68n!?ix;gDy>&8D8P{uc4GG1_g%#oavDc+ikblC%7&E zc}M})@n@XGdE3-0bZqR(wf|;YM_a2+&+=sF_jB{i$~7EQolp@yyS6`3$DRnJrn)`6 zw%lnQ3+$AyE78-Gsd62j5ce!*5Q@*rCmGfGW!+%EO?TtxUJ{*-65sfm3de%PYO1@J zh?TJKL-=kSy_(>ONdzYCzZl!z(y3Nzy+f?Qasyf-EG4iNbSi>SHj9Q_Gh8!(w}*f% zWB+2Dx%FdX`7jx!K-z@x{=iSRp+Juqn|NVi7t^j7%4=O=@0(@apHEW=`RO>_+?L#z ztOpp0W(BiP_6BO7P{#-|dns}66oj8oVc^D;@{joFEL!@sbMMJc$7N=2Q|?jDKX)v% zD3dZBcXT}M-io9nYa#Jv?X6|sG9$ntGvi4(T5n2n`_R?GyD1*``;w0jm%tL$P_wL) zsr5aR99bKIk=_$cM0kb?;E(;+_Va<`SXUf0v%3@`cUUk$I&8b&$i~oGbT0-BdnRq$LH5i!|#j2=wkVK1)m@q@+^|DXe@g1 zZ$kBCgJKCK9O9U@epH8Y@tZA3o2rjPC+b6J*i4W5lmzl9fyqET><{V&6hS%l%;Tos z-&aOh)1pu%Z=~Uh$+f)mc`)s~ucx$+8K>pwbKflpV*vgSwu2xzW8Z^FX>_SQXchi$ zE&JZ}Cze%a621~b$g~c3Sdj{AF+|~wWF|*)jBC7I^1mi`j0=>a?Yi7wK?fu$JvMHg zFD>sfY?yQrs{@Yc7WgwTBsy-x1Lhe2N6o|S_%yk5&BQ#A68rpNbjS}P2$&!Tqw7*06~C@;Mo zXX*|+X4{PoZ1HF7=9Y@v|5vGyX!6W0dmosSn4s*@Il~5_~|2i1T1UR>5EP zJ@*+m;jn6)GOO`^gPY8A)1$hmrh^;QxmN*YUqK6$OXDIdQ&i)B1d@FYKy_)~?3K#L`v^Bv4lz`K* zuSN+6n=PD+2UPvRUYv;#ix&s)HNqXLFUv2Fm^TGd_FbSj5fq6qE2X64qY8}FErHwe zWu5lTkgI+)tp)4V%uaQ$&#Q-`2JiKjTjMD9`|%&03ZxaM30{45R&P@3QG0{@^5iI& zU16?+bc0-JD#t-SWZXNKZ@?q0Udkj&G-E<(FV`+`yfkldZ^+-|kE054wDnRD|JUCP z1Uqs3bM2nwkhfuF*08DS3^6diwD5<2__gP|(|~3CfJX-kC^%hY5-09XIgT3&*PYKN zKTIi-^ncd=%+<3_xu(xL%gjS_G25-~KC{?7CfLB6W#N9^ImkL%xuuQ7#(pt6huI^Ec$wU8xNluB1V!XdIXIx> z9Azq%FctnO_s$0CThoYs!t^x)=$1e$PtExXoap}M2SQ3_5+1gQ*%!;2wIkjs|K22aURfJM!L6Yj%Tf6s=7 zMzz*IN|;2MeHx`_{cj4C?C@Cmy7|=I{i>`cpOfeGr(xUSFKQLO+Lz6B&Xw2aq^-Y( zGE=Jwb$fM#LkHE*ik*v*6xc-A7dWz92IfzT#YXE~Vm!n~lNWXclU#-0eAph+&J@k; z?~u$ZAJanY%U}G9zC!e76nI3)n|$w#Ij`SI;l$&g8)2D0Bq>yMVpQW+OEvZh$z&4Z zP+h1Lq2YAd(JD)Q4BfqO3q)j5r`=<&F>Nxz_l8wN82%)`-hFc}>5oM;_#5`eYeNt*u7#`AJoaQp^?gNKn&-pz zE=+n4tGcoJk6zsl?b+9C;Rc6oPKmr|sLTB4{Y`iG+Nqp6%x-qFgr0j1sh5Shc|ik z{n6i6S@|%h=+y=4I&>Xqy-W>$;KAMW%szuYoE&&VP$bC|p~5}rWqvupzV5*Go^APn zN$C^qAuUn!yf@I0!h;)jo%%gp$-IXGOJA z`ZkjyH9AOSN|Uomj?d@r_j>+&{(AoY{n1PJ?(4cf=hOST&$~F=Db3ZGiy(-SgZ*Y# z1ev)KL1t9Wo&mpLyWfu?h$iB&*=9F8qvz|h*Hg_A9|w*J7!J5o`_VB1>{ba{b$3(?ja^aFwwY>X%IWGH!tbNUY30%loSKhh zFXdysbE@gzf+n>P>ayLqs_++BrBqUyj zxcA7gZm{y`P9pLNR#rH&5UI8W(ngkGimG474m!chOgQH69C&$~f?Pm1-k~5(m17)< zJSMLn;iU3p$j9!_0ivt$081Pfl8|gz34gXZvycy(7D)P4Am#IS75U%Z@W)Xu(S9wM zs_XmH+F(m7P|4*6Vwb>|L;IB`hPsvbR9~5lA+s1xqi=kcyQx zShso*gK~?4%+(8biFRNk4f70Ly`w1=Wo$o!|4bK6*m z;wCnt0#TzD-;ZeON-*1ghRhzD!(9!#F!%7@o4kT1v8g&1$hoa7WYMla|76u%B*D~m zmN8gnPyUR4tNe)(Ah0|X6zhW$0mW*8LN{kqIOhp?ufmg#t-b#QZ^!^TSs?ftpc5#z z`D+i`lz_@&fffGaIMxkO0Yjz7h2oI=ck$l(Yo0oi+Oj7=WesO!$ej?DFz~^9?m`gk zB-n=nDyao!?^>V1o2QHfx)Q5K-Gqz{%J6;zsO*V7uJZ~IV8Kx#OJcbO%I{^`f% z6i`78U?RbA;148*OF`AdhwDNuUo=l@F=V)lt0auRfeigN(Qr{N?g4VwG9JeL7iZ zojn^VN|GUW3x@thB}WIAputT7m;cBMB9B9~hrx_J~%WjRI1T75E`fH(td8$jwha8lu;$Ba&l z;M^G;8t#aEw(`Glzw^Vq2ZV-*r(OZ(H?(66mjdbh9<19j;CI(fVih}s_s52f)Y-C- zN%bQ_89iqGq%8Qs)bh`;5lsQxCojfKemC_y0&Zi7g}@Z2_5d$uftR3(cip7 zA1&a~bYU5~@RAI9lzdF6KZtdkm(Ys7)aGN=9ITbykGK~;3hWvIuBu&#)MY<}T3-8G z(8mM7WR6-HN)Z8ytjZ=qfkrVrQv0mljo}dX>Y+#pk|$NZQQd)yX&L?r$+Qj(HGIsG z@m?=SxdZ<%zdX87K>upI85Je^9$u4DNI&>K27Pjd+#n7^dC9f|MsMi?-|`mp(VUN+ zy=FR6qNwb?ruhiE_9-}oVuyvd{L`|NcShEII)whng}C3dIG=v9x86F%b?kSdRgUFl zU|a}tc&0pK?pcz+)dz@B%Db~LZI3pTat|ISD(w(2DWvD7a${m9 zzx6+x{^aF5asKky^JS)^Tbj+I$L}{;&p=GCvJjij9o(s_Q7t~-F)9!cU6)2Gwy=>i z;P|zBOBv-!BNY&oFK<&g=X7I)GDtGS&mH7;j0(7YSLO&C(%t3`B?HY{X{Fqcp!Pk5 zkK~smwyl+vA-*b=;76pIZQ&iz$g8yLd1qHs8Gjx}B|v7s)tN_p=${CF`vL^fQDqAQ zRZ%}#0Ya_@A!#*I^zj-b*wXYTmWY4NQa9@ATxaoh3-9t^Vc^huHzyOej4wB*XO_+I zugS;Gei-)8ow=+LYN;4i&72t8y^vCpi{#Q_cT+12`@ZrYYB`I+g5e%1ne zC;f=XZIkyc)i1Hx5T?Th{n=V6xAKVe?Tx6xjDhCtCc)8rmA>+q{pNJH`v~8t8)1)OCm(^Eo3AqVH(Q&eERB`5(fnWtBUR7v%53r1~{sRQ6294w`Sh z5tYtHQtwbW&Rd9K+q`Q~Z`|^!Xof~9L+)}{N3c@iOJzymESGa0IOL1c#y^Gw|MF!~ zvpp(>W0B9SvND!Xf7aI`{UQcyL4;U#-Y6WUANZuy4pv#R*d}dMS zmp2zM`#e3$XVid({9i>%n3iuTYvtzX*)=cnpg(l zo~7%lHSW{jjPN8ULt85c`Knb!uy)w$x2Uz-@Dj}K?{fXxIjEuA z7Q^x9n+4y`H=s}Y5=@ngbI;Co)|qHFVne^QLF!&O$dSxD7Htp`dluDiX8&1L7h8$! zZa;_CE!VGizfY6j6I|)@jF8N2tINl71~yzp?TsdDvqJj(&6B9PS3;f5ZR)0p14LFE zzEty6tIk6PYfH_j(=QVZG{;nSWi89r;$!s$BayVYT}%bn0!wWiS^$c+a^(6YuUknx zY}*{cb0o>tF|YsQ-&X~#NJVWvRPRm$}<|Neg1ItBln!AzKr2=7JC;(+!o?1{%=6T{2O zr#z7F#@)zZDT9{qo~vm!e*dBMpC32nJ1{C&rk~DWzl>CUol)HpBV+}Qry!dTG+})G z8ZcQ=L*B!f5C;~LJj+bS%dm?hD8p4jcKY}_QuVmMGIX?@C)e)Nw@+}=Vh7jyD|<8f z*f#Jf-&{*h03_gj`Sjw;{fMrwp|Wp>T%X;w^4s?5zI8&uylv29`jkgk)kdm%2)hy< z?wKYaYwqH+V|tv$vH5hORWdi`+gN1f-}4KZpQvx(+KRqLAs?tLYuJSj2?vsYNbSFBse;BEAo4Gm&cgz!Ru zWnV&=DVh6h!fW32X2b@hODtvlH{&pRIJlF_Q&o47q}3k$Vyy)8+tp84i*?%^CNOO* zkrpv#)z!VOM3&^!L#y9Pk@O4?T*G>0_nn!o|9Yk`5kh^9JYvMxUkPQ#LX!aMXTyEy>YD_*ZUv@@ z*#L8Gl?#39GmdLjzLDSacU1g}ZC?Jutx*=tJin%u>C((3#4p;8xjxrDLB5B6>msIHD zO~xW6_H#$J>hlO*f4}yf+;DQ;c-9Dab@kkK%pxcZqI~+h%>}LYs&?pmRblb;U9CQ5 zYCqbOQ)iNj^lyEO9lRt=4%89xTWfB;v;;lOg--88K7H2Zho-J+Qnei5T>1iA1Bp=i z<(@*OqgBCgVRG$CQD*DM2MpRz;i`5F+P?eOpF42=+K!gF%9`t-Z}cmX^GEZDr3q#a z0tOu*Dty7PQT%*poU?YHZ?%t0(V_?E??J}nqu`2G5RAtTMgTVg5<9SITY+Xuspfz~X;iXXVnEm2zX z%Y;8$x)av7V}1k4?iWgwky3_aQ=Zsp$WgN91s1JlM_G`Um-R-~4y zJziLRsvl{J%#|x6)Nj#)`^3c`e%;OaBQ;a+D4cQkRX&!@{~k%ZziY6vSx|d#@zRwM zDb?o=ST9sY3tZLW4JijWt@f)<%5LaB3-Wk@bq9!G+wu;Zh-X@O;m*_j$YnFaq}SZG zO<$V@i-X;JA|Q)NoW=z?ObE|+Q2bgBHDRg_$fLA6onXVM^SF>K8M0@9HfXgOB3y?& zymk8vYy}9v?EGkG)s1|5PXpwd`F8bZa3L`KrvEn>JLo1%Hr9!6^@q`h4ls|^oo=bW zWT^wwQ-xG@thHzc z^4yW3Rb9r78foto#6^yA2UssSy>cmN%J zG!2#Adlnm!XZ+d9BhY3mrzgoc_dE(U_8u4CH2tyM!h2&cg;Q(cy=;?3X<(@`}Jg`TXWT*_oEHt4`N+|~`(t-6!L$!1E-ox+A&(tBsU1gV!83lFsTITLCM^+ zK24Zo1CbKLTiPP0NG!*EH%_IVziV(+vtW~s-4Ilq1O6lV-ipvJtPkbc2D`-fb1--D z>GtpC`pWK|JIUnU7Ov?IywFIs9V3LyTCcmeFffZ?6shIFT{TC!>l#cDwr8XbOUraD zvb`8@<2)2cBPFM8M26a;^U|ulj~Z4%I!~u5yIUH+iln`fRz%heq)qpS3$xl3gwL;@ z#|=Y(sG8~YRS!weHGq%yU+U-dek?k@3bH%B+{Ug>I{Lw!7u%h`$Hog%v5ykeVSV!H zVTG1M-!VieH#Qp_xU)f(vSwDf-&*H%kG`@_Dfdo z|GmWShvKW|QCzDxB#P*YN0~DKhx7vs-{VP>zQ#ZtAly2Iv=a%=+#Xt zPw9xw`nH2xgzHpRKZ(rDqj+y?5_~_LM6e!ZJohq2mi)9hR6iGRC@T5zl=yEoF8|e@ zLLT8^OT?={a?f*}cFcSjWC_B2x&xO|hCB2E3v-*HW;ZQ4&58Tx+xXy=wChh<$Ku2E zjM>Wm&>C5)9Yoo&nB2E);>71wBHCwcI|c==R0f&_fh+ACc^%}OMDZMD|1GR4|3{vM zk!;6SYjLsX<=DaaGEvzXoJqUEDeCgSz1XcDg|)phJ0xlcx7NA6T`RV9Ku*0|52D%h z%lQjpx#r^H_iT{NJ~V6u`4lF+>?ogRfwstxg|A)KNLsH#a*3C5LO1Uz+;dFbunX(JGujQ3;N`2oVfK;D4`TbJ1`Ah~c0XU^Eks$is?rPz}V=$gfTAg z+p35vIp6czN;`m^H0#~h`1TqtSg5RL!>XEn`aZpU>WgHnF`hzd<*wYtP0HV=WXq<8 z155WF%K6{L1ED-EvmPU)9TRa6-^D1hv9kL($SQnwa}G2!Agf)k$X`c=xF zy!h*@k#)QK^^3<4h{nw5CV_%8clH=XFQ%p?$L7tDD^uN8J567p_qRj55%}VL` z)MHj%6fPmQV>|%OSW~Mj+EA)QIh$umSz&<|>Y4AWBPAB%cM}3)_4=`{xPHzJ&lFqH z_xp5OW4KV?iMiTBYG%}#e(K`T=!pk}5p+VixtrNyB~7;=E109SwagYOe*`Qm!P8Qw z&qo-T*SVJ#FeXjETrQ|NgA2-`WYd>}GZ8Q*P`a(Vk_h>?EcY)U6#-W1?t6&&WV-c= z`F1?6^Nsq+nc5cK0HL0l4=6+o)AO$o#-N-2i7saVzocY4p~v`_Fw(5az0osWm?2ps z=WN+k=){q^LL7Qs%0BwwQ2yeQaMd&YoVeY%q}SKv(?6Bn<2)foRyv!ncu#sWN7?-a zea21eCV}i@3gNIa*|klYJ@03K|BdImC#WhU7?CPAF&kFpB)V<0KoP^4DnUa1W6TyI zF@8ar-NF}G7~&e#yJ@+A*4QahNKBWf2^WXP&friGakZbdDPw$oRVjm4Z4=R4W(QTi z0I~;b2dU^n8KeA2Lvedj$L%XpZ^f<4B(s%aqNVQ0r>p9a)6b0Dg*vqm5SiRd;^N=o zp3H`f5xwo~f5lrB5P(C>)eQm6GRvM27sk1AgKWIloHIw=3-x_%nL(|5$FI7$YV)}G zM8zMS-KRnT>-hcfN7gB8vQF@JW|dA(;_u%c&tb&<8~_d5O7h|u&|ky+p5)|y7~!&) zGzm&xUnab^$4B0_WX>l+zEyYN9ywtU;@nhFqC$e33M%duA*_s1xaa85anX*m4%{CW z2P7FIA060+(5e02-Jcb`1Y&VR*T-Y#nc6rl zSk$m4fpKjT;jkjPE9CR@g`W>#+n=8~p`$Wee>_q$DE(MTV;TE0tJeH8Oxy`-(kH+r zb|n!Ggt(Bh-iesHq-|SRRDWPQiQsbe;!xZf+>i^gigY-9qB(bw&!Fe{4 zl;i~|HpKIB>kW^Q-f&6kqU!-Ko)8r|O>UHIY9 zaEGFKm((O^3jXuWt8gsg*{6vdi(=n~{)6Pr&=pO| z`SIf9!vcMH@A6`mMaBtjQ<5UI6ZbophQg?K19(|sp_Zs*aPDrroG&jZpgZ8(G!6p< zhGMRtBY1?E$?>Qr!2@m4oiCx+hAv4gJTs~dcjJoQ^dA2HV;7ew^l3;Yr0#0Y=<#WJ zZr{S9nqdp*lOxL34;X3Xrj0q$nhF|g1vxuy&bqfmwxMDvKD*$HxcG?Bky#bwxA(E} z0NPsItx3h!9LfajM6oTzeuL)jmU?g%c~LGDc<7~X8RTc%42d$WODWHa7;@u(7|B$%cn z#_Urc|K1Wxo;2>}P=P{iP)}r<6zN?$`n~04EFiks>kW7Z{@5WpxZ$HHZihA=mL69K z!5$QGv5 zy8-iF7CF4!;@l1v6_kHD3h)Rg{9B6yTjtz&5Z|u}5Q5222%xmtIStF9heFoMKayU= z)__?Yg{skFj7js?&uRUda6yycQTRv}%9K7Pf)r%ELu?{oU7EUHb7p?7C}ps&61Lb8 z9GJ-AjB2gX;|eFKNgU9myEaZ>rk8hqGzaj)TSna+7_cpulR4aB<1x-`SkPIrrq2t; z;v|BHH8^O=vCq%z_H(T+na_r6o8=bH+!NY3mrYfm!Iv=RUMps>!kxK|sG^X#Eqfm` zJ)BhlF+Q>btw-i$y_I*&P)aB$Je!AAb4}_~oU07IMZ?y3z;U^8J7T$w4?8}zXA^q; z0dbFgup8$h>5P;Jr8RG|vFEZ;kX?hh9bY!k(f8papOQ?V>M4P{U3q`O1836E9!c}F zo^p!uE2#Phccf@i%bGiGF%ugz1DVA8@KGbEp{ zO?We(y1bP#Egu+I=siEH+Hij9Yq|mv+41|C*~7ps&`Wf^*%ED!=j@#;44?G{I&O_f zM&X6WH`kF7(&s1P2kS390cXy&o)lJ)H#1%E13~`E?KWFsU!oNG=-1O_%SQW#@8~Xj zW{Bu;ub0nNfF~_#HbGz|6A<+^0PjAJ=3^_gn!bH^;y(Rg-7`9pr50AT*r}=D49@%> zUhj1zZ7l#zW#h09o#=^41VqxJesZ?*Mwm9jc(FQfyJ`5^%;C2WXZWb?K#x3p58rnARZO)W*&X(|yr~4BQ*alr_g|zcl0zvM{fWa} zJb4R7`;a&rT-1|ri?Qp=^=eC%;Es?JqAjv#Oz)5U6Mryf4s1SE=e<&b+2UUKc^ea% zdDEl@@&@7@?OrXi^=n;^k#24GgUOXI^$il%ipZK*x}LFfm}VX-3Wd{MjuL8|!L ztf5P)o~{}uaCP=d8%GT{j`hdeO=m4A(bzBK+bH-a7OP%kwRja8cYAMijIDw2Q;F_5 zZZ-DBb=HicGj-Woe#E5rDzRLz%F&)38^>3)~Sqj)k^p zeL;N$Kboc8ZgbcX>m20%Tsl|Bt|Vqwor52G1?uOvmb_N1Y<%p4jfo?c1Xmd9!<7u$ zN^(KTi4BFTo!kWc>a(gkHHz-9^RYiZ7?KV4w zu2i``KUqB~S;i5Lc^1yKk9K)^Sd^ni>$;!!yH!(&1XW zH%Z+k-UGKSH%DqudiI?Rc=AmX^kV37*oLky1M=ERD_nT8I$XPR9EPtGc9=~gi+5_M zT!7PZQ#?e5;!s-Ykn-Q+H$NV8ExT#X=6;&%HH{^hFAiL9sh#PAxOiC`ITs@Y?H;(k zlI(h>Q*fJ_ZFm)P!mI^H2m}2bu?pD~@0|W_+IwBm!XBLFAhwC8Zb&*# zEZX^7mP9yiHa**?CqOji5&xdsma1^+O+Gd~;TP_V=6V#GD2lTYxo@-9aNp2f!~EdW zH2+j1C*Ufp${V1NHwE?Et<^H?(EH#^o0-3x{ibWbJifF!0IB~}bXsx?3O#qzZ?CkH z5V3yq^~#O;waMyLwt!hEh<9?khit&_=O$iCRVcb3W~p=P|d~f zHg^mqMhsT36n}Bmpswwuc;E0Y#f#_LT^~wp9qMQguxphS`N)&%khxGkRJCyruSPc* zI{sF3v7x?8W9aj+%XSE1pw2adYDpneW;c;p`5y*4|R_}gpe^*Uq| zAQnz>_wZsPh322@T0BZhe9A93A}^qZKegxjq(@t{y=l>b6XuoT-L+q3+cGa5Y5XO+ z?_pOd>pIzT(}Y91%A&5*7WIGj%sOr|nSQwrQ2;hBmSwW+xdGdakO-?@y+;hmfBCin zNGz}`(#G|ak*C=`)=x+Gw)Rc`#7`-lR5ZpyU&d+E#;qJYU}B7gZ(}$$+PHd2O=5Ms zuwx+0Ybx{FUn8)kBR2iAjDy=#NPoWONI^X=JsOnhX5N#ejv`(!jJv!m6~^i6Lml#U zt>bRq$5R!mj`6Ykd4!<%$D?msH4A(ds%-h#-heWO4*6qnaI}SW54$U4*}b2Wf;dd!_qWQ}-`N%#VIi&uq3LruUx#SUkR;id8D%!wT}pO#z7E+4CFo z@!y^;P!l!#{e6At{C-r_Twevm_L_gwKytI|SoB!G)3Q5<3+Y#*ldenKFu9nj{yX{H zR9DBsiBAR!MCwA|?bEj1L{T&Mijy0#RGUv%59>eOhDb0;Hs}uLMj4Z$v8im$`ozUY9PHDs)M=M$SfCwKy|8dVk+AE zAyv*PZt?H&YdiPCeA(fmfh4`VEy2vP=RO53>)ElWi+MRtj#xzILaZyO6Jh2!`XSVX zL+GACqpsQ80}$%5Avc`w3i69&bwnjW<{kJLAP&1luxG_CV$oHpzXR;ByHkMABmUMT zYXFIcd-nvf;vRRPma^A)fMK3OR`V&_lb)+7GGvvfbRvMxB4UYhf z+&%DC=AJ}2L~bf@ZV%N@7z$RAw25z;Ae^xu`P}W{h5IbC*e;*ovJaDD>xUq3w!0G# zD-i3C?0Zb<^H2|)xzU-ar-W#xe&QeSVrE42T<`{#R6eEI{tP|n$Tf)hZjh5$_-x{a zmpSSE>tpy1?pe}(y4R0Y^ zTs8StH2o*2W#^|JIX^_ad_BS$P_*v$Pa>@R`Alp{6ZH}CSK618_n+etz$$8A%p{>b zF5@8<(dn+Q@4c|z_G|hM5VKn~`MkY9_*K?w*6o8#u)eo`$8J$+)cIY^vJCx+gO1Z$ zxzjl&dmcYvNHkGB8{QA)cSt*hF9VACpHe#xJ8G3VqSO)RvwZHA4z8`EXikCj)14qx zVVs}vV`^i2f9=3%d%%nK{nv*_J2+9`%AEME0`9`TMy741O?)GQxF0M6M+mbZ@Z|ah zpE6OSc_(rO9dAsnulYTZHx;+%k!N@B7Y4Hao$E;{;3lRJT8i~h-=Hp!kG_)J%I@f& z_pHD8+fdWqbyIskIVJ%Lm23>4KrChq#_L%X9&C^NJw%ojbEX%sfDd;Yl;MbMt zRk^9rWAB@+m28Ce=$;0*LdgKUNy*w4^XE9^8+uHdt7FV)ys+TH&T}6TWcICQnVF6# zF + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/doc/tetrahedron_refinements/4-edges/edge_01-20-23-31_refined/01-20-23-31.txt b/doc/tetrahedron_refinements/4-edges/edge_01-20-23-31_refined/01-20-23-31.txt new file mode 100644 index 0000000..1018f2e --- /dev/null +++ b/doc/tetrahedron_refinements/4-edges/edge_01-20-23-31_refined/01-20-23-31.txt @@ -0,0 +1,30 @@ +TET no. 0: +0.0, 0.5, 0.0 +0.0, 1.0, 0.0 +0.5, 0.5, 0.0 +0.0, 0.0, 1.0 +TET no. 1: +0.0, 0.5, 0.0 +0.5, 0.0, 0.5 +0.0, 0.0, 0.5 +0.0, 0.0, 1.0 +TET no. 2: +0.0, 0.5, 0.0 +0.5, 0.5, 0.0 +0.5, 0.0, 0.5 +0.0, 0.0, 1.0 +TET no. 3: +0.0, 0.0, 0.0 +0.0, 0.0, 0.5 +0.0, 0.5, 0.0 +0.5, 0.0, 0.5 +TET no. 4: +0.0, 0.0, 0.0 +0.0, 0.5, 0.0 +0.5, 0.5, 0.0 +0.5, 0.0, 0.5 +TET no. 5: +0.0, 0.0, 0.0 +0.5, 0.5, 0.0 +1.0, 0.0, 0.0 +0.5, 0.0, 0.5 diff --git a/doc/tetrahedron_refinements/4-edges/edge_01-20-23-31_refined/01-20-23-31.vtk b/doc/tetrahedron_refinements/4-edges/edge_01-20-23-31_refined/01-20-23-31.vtk new file mode 100644 index 0000000..c797e30 --- /dev/null +++ b/doc/tetrahedron_refinements/4-edges/edge_01-20-23-31_refined/01-20-23-31.vtk @@ -0,0 +1,40 @@ +# vtk DataFile Version 2.0 +VTK LEGACY FILE FORMAT ASCII - tetrahedral sample file for H5FED test +ASCII +DATASET UNSTRUCTURED_GRID + +POINTS 8 DOUBLE +0.0 0.5 0.0 +0.0 1.0 0.0 +0.5 0.5 0.0 +0.0 0.0 1.0 +0.5 0.0 0.5 +0.0 0.0 0.5 +0.0 0.0 0.0 +1.0 0.0 0.0 + +CELLS 6 30 +4 0 1 2 3 +4 0 4 5 3 +4 0 2 4 3 +4 6 5 0 4 +4 6 0 2 4 +4 6 2 7 4 + +CELL_TYPES 6 +10 +10 +10 +10 +10 +10 + +CELL_DATA 6 +SCALARS cell_attribute_data float 1 +LOOKUP_TABLE default +0 +1 +2 +3 +4 +5 diff --git a/doc/tetrahedron_refinements/4-edges/edge_01-20-23-31_refined/01-20-23-31_small.png b/doc/tetrahedron_refinements/4-edges/edge_01-20-23-31_refined/01-20-23-31_small.png new file mode 100644 index 0000000000000000000000000000000000000000..c8022af3698cf02b42091dc732ae4d146e03184d GIT binary patch literal 13405 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 Kq^cxLg8v^}fgjKS literal 0 HcmV?d00001 diff --git a/doc/tetrahedron_refinements/4-edges/edge_01-20-30-31_refined/01-20-30-31.png b/doc/tetrahedron_refinements/4-edges/edge_01-20-30-31_refined/01-20-30-31.png new file mode 100644 index 0000000000000000000000000000000000000000..de84a6e7ab29cab420fe88b705104d23f75e76be GIT binary patch literal 11131 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 XNkV?;Psc2931Ye1ZrA-C^z;7*n)M@N literal 0 HcmV?d00001 diff --git a/doc/tetrahedron_refinements/4-edges/edge_01-20-30-31_refined/01-20-30-31.pvsm b/doc/tetrahedron_refinements/4-edges/edge_01-20-30-31_refined/01-20-30-31.pvsm new file mode 100644 index 0000000..fc4acae --- /dev/null +++ b/doc/tetrahedron_refinements/4-edges/edge_01-20-30-31_refined/01-20-30-31.pvsm @@ -0,0 +1,2021 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/doc/tetrahedron_refinements/4-edges/edge_01-20-30-31_refined/01-20-30-31.txt b/doc/tetrahedron_refinements/4-edges/edge_01-20-30-31_refined/01-20-30-31.txt new file mode 100644 index 0000000..ee5f2ee --- /dev/null +++ b/doc/tetrahedron_refinements/4-edges/edge_01-20-30-31_refined/01-20-30-31.txt @@ -0,0 +1,25 @@ +TET no. 0: +0.0, 0.0, 1.0 +0.0, 0.5, 0.0 +0.0, 0.0, 0.0 +0.5, 0.0, 0.0 +TET no. 1: +0.0, 0.0, 1.0 +0.0, 1.0, 0.0 +0.0, 0.5, 0.0 +0.5, 0.5, 0.0 +TET no. 2: +0.0, 0.0, 1.0 +0.5, 0.5, 0.0 +0.0, 0.5, 0.0 +0.5, 0.0, 0.0 +TET no. 3: +0.0, 0.0, 1.0 +0.5, 0.0, 0.5 +0.5, 0.5, 0.0 +0.5, 0.0, 0.0 +TET no. 4: +0.5, 0.0, 0.5 +0.5, 0.5, 0.0 +0.5, 0.0, 0.0 +1.0, 0.0, 0.0 diff --git a/doc/tetrahedron_refinements/4-edges/edge_01-20-30-31_refined/01-20-30-31.vtk b/doc/tetrahedron_refinements/4-edges/edge_01-20-30-31_refined/01-20-30-31.vtk new file mode 100644 index 0000000..607d115 --- /dev/null +++ b/doc/tetrahedron_refinements/4-edges/edge_01-20-30-31_refined/01-20-30-31.vtk @@ -0,0 +1,37 @@ +# vtk DataFile Version 2.0 +VTK LEGACY FILE FORMAT ASCII - tetrahedral sample file for H5FED test +ASCII +DATASET UNSTRUCTURED_GRID + +POINTS 8 DOUBLE +0.0 0.0 1.0 +0.0 0.5 0.0 +0.0 0.0 0.0 +0.5 0.0 0.0 +0.0 1.0 0.0 +0.5 0.5 0.0 +0.5 0.0 0.5 +1.0 0.0 0.0 + +CELLS 5 25 +4 0 1 2 3 +4 0 4 1 5 +4 0 5 1 3 +4 0 6 5 3 +4 6 5 3 7 + +CELL_TYPES 5 +10 +10 +10 +10 +10 + +CELL_DATA 5 +SCALARS cell_attribute_data float 1 +LOOKUP_TABLE default +0 +1 +2 +3 +4 diff --git a/doc/tetrahedron_refinements/4-edges/edge_01-20-30-31_refined/01-20-30-31_small.png b/doc/tetrahedron_refinements/4-edges/edge_01-20-30-31_refined/01-20-30-31_small.png new file mode 100644 index 0000000000000000000000000000000000000000..79fa9c13b1fbf601a0b8dd45aca3c1f000e8831b GIT binary patch literal 12651 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 Ja5MeP{{b%faJB#d literal 0 HcmV?d00001 diff --git a/doc/tetrahedron_refinements/4-edges/edge_01-23-30-31_refined/01-23-30-31.pvsm b/doc/tetrahedron_refinements/4-edges/edge_01-23-30-31_refined/01-23-30-31.pvsm new file mode 100644 index 0000000..ebd092c --- /dev/null +++ b/doc/tetrahedron_refinements/4-edges/edge_01-23-30-31_refined/01-23-30-31.pvsm @@ -0,0 +1,2021 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/doc/tetrahedron_refinements/4-edges/edge_01-23-30-31_refined/01-23-30-31.txt b/doc/tetrahedron_refinements/4-edges/edge_01-23-30-31_refined/01-23-30-31.txt new file mode 100644 index 0000000..3d333dc --- /dev/null +++ b/doc/tetrahedron_refinements/4-edges/edge_01-23-30-31_refined/01-23-30-31.txt @@ -0,0 +1,25 @@ +TET no. 0: +0.0, 0.0, 1.0 +0.5, 0.5, 0.0 +0.0, 1.0, 0.0 +0.0, 0.5, 0.0 +TET no. 1: +0.0, 0.0, 1.0 +1.0, 0.0, 0.0 +0.5, 0.5, 0.0 +0.5, 0.0, 0.0 +TET no. 2: +0.0, 0.0, 1.0 +0.5, 0.0, 0.0 +0.5, 0.5, 0.0 +0.0, 0.5, 0.0 +TET no. 3: +0.0, 0.0, 1.0 +0.0, 0.0, 0.5 +0.5, 0.0, 0.0 +0.0, 0.5, 0.0 +TET no. 4: +0.0, 0.0, 0.5 +0.5, 0.0, 0.0 +0.0, 0.5, 0.0 +0.0, 0.0, 0.0 diff --git a/doc/tetrahedron_refinements/4-edges/edge_01-23-30-31_refined/01-23-30-31.vtk b/doc/tetrahedron_refinements/4-edges/edge_01-23-30-31_refined/01-23-30-31.vtk new file mode 100644 index 0000000..bec2f00 --- /dev/null +++ b/doc/tetrahedron_refinements/4-edges/edge_01-23-30-31_refined/01-23-30-31.vtk @@ -0,0 +1,37 @@ +# vtk DataFile Version 2.0 +VTK LEGACY FILE FORMAT ASCII - tetrahedral sample file for H5FED test +ASCII +DATASET UNSTRUCTURED_GRID + +POINTS 8 DOUBLE +0.0 0.0 1.0 +0.5 0.5 0.0 +0.0 1.0 0.0 +0.0 0.5 0.0 +1.0 0.0 0.0 +0.5 0.0 0.0 +0.0 0.0 0.5 +0.0 0.0 0.0 + +CELLS 5 25 +4 0 1 2 3 +4 0 4 1 5 +4 0 5 1 3 +4 0 6 5 3 +4 6 5 3 7 + +CELL_TYPES 5 +10 +10 +10 +10 +10 + +CELL_DATA 5 +SCALARS cell_attribute_data float 1 +LOOKUP_TABLE default +0 +1 +2 +3 +4 diff --git a/doc/tetrahedron_refinements/4-edges/edge_01-23-30-31_refined/01-23-30-31_small.png b/doc/tetrahedron_refinements/4-edges/edge_01-23-30-31_refined/01-23-30-31_small.png new file mode 100644 index 0000000000000000000000000000000000000000..4ab60042021020d2d048c6948e86c1b22654a358 GIT binary patch literal 13719 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�weyW4OqCKq`M#UlzawG=g;!RH?l=by7vl^)7Dv( z_?O&7XIy5}djPrhM#Isl0CTAbpH%j+%*}>ZJ*?nta}eD;&i6ke(>n9Wmm*WXc+F62 zu>{i&*XXhz9V!}z+YX{1Oe~M$cuHD;%0i%mDZs!-7oQi4($YJ)EI$RfOluW~gU-|b z6K-VZGPuHXvm?hr7;8RCriFRX+{GCuebWdu_P^0cJ=4q$1Ws*OmIX#y1{W~!{ff%J zFzsCoWK>f+xPF-mcVKJzr${xnjr)h6LKrj;#AJxrF8vye(_hN6vvNd7Xb_3rpSo0R zB*BPW%)-jgcW`|(6`(mc|6}dUMLa_oz8^c9zEmGN!T^a$m^CkXSRts;kjtled#C#@ zsKFGAls>1+x%vG$ZZ33qF98SP8*+a;#r(wk}U=Ms_-q^c6*+u^rx=4cJC=cHPN)uZraw zG#z0)57jbx*D`b1JwI4Qz4Asw$>tz(;08XaqJeV!AZ$~|E0`l z3$PO#0|A7#d?VW4C*@zv^R1T3jKPQ1&orYSIeFhcUF*5Y9blHN+K3LdllZ(m-)mA? zmC;kHADIg1H7Z(tC3RS#G;Jwj!LD;X-|ezUiR7!3*uf{+V$qLDN_$PHG+r{_XacrD z{kupZ);)Roz5kI|0(-AW0d{lISg%WTlLj~(`eBT>8H0HuGWIzvmUJ6Rc|+qT#&Hg- zW-bLC6$Hs-tEo>FB&kc0zs~L%#eV^V8TYc81Ei!!jlf_;vSu)BzE!liZI*!fXscRup=+O zKw5P+*@gfrv2|RAm@K_T+p3s=U#JoIwMwFq7b_KOEEOqndCJbD?zi1H`S;Tw&-5dhl_l36G@lRBdVa_VhZ<;}b@w`Z_Wn_>v3Iu!drPuANH zB4-0ik-#?|b*wdif$U&Wyphz}EZkr`b+LEA5G$JeBtZAQGG%DI*ko>bRSD}Mv( zuvO3oEO&`BuH7)#t#m2v=1SpcUVekr{gX!CeK>efR~hMdB!xI%J4JEMCSHo97-kap zQxq;>>LO!Z6AMWt$75tw8AOdl-syDT!$E)47$_BB>P%x@ar8UidR?YUiCZEmchZTG zzDq7(%+&B zKn=T7#kwX-c4V;5k~Dy+>o@RK0lQcw>a_G#i5;?2a009~uE0S4t}D;7M)mY6p?3`| zeq|Dwq|<_GHxwahm2wQjuG#X!Dh&R*K=d6>c!_wc8Bqg`54@}%F{e8eBhvE+J0K;LziyNa(y8aJcOd#m+3ZZXu~bw1Ly?dY22k9T_p^9NA`(1nPcxper?Uex2w}eS21&In!JM= zm5`*PFXirO#M|nJ+;(xc7Z}VeioCOmYWu7~$A@JoL5ZXO%U!8%hlaKjtK}n#Y`e6S##A5o(-}7L`bS62%iO~T-izM^P5eqdG8}BPi=YgBf&oAd#uKCxyM!r>x~NEcqQmhl|7AF zxK**!%yg#g_WgV(_=?4o<=m#x$ziD_D__7MJ9ZTGi#$${x3%blM+rJn{B_=<- zKxB_v8D|sYXNek3+~6JlRA6%X^^dK(_w^?8Ri=X#wc}!l^)V)wr}xdg*!lYCgwJh```=9 z&ag%LJzgb{^9pm|h&8VWMdR+FeW2NE zLy{NovwiGQoKD$^dWv^JLUC7dnQ6(=;EtRH(}DP+r(IIxcGSvkd7W~OJxl)qPE;`) z6Crz_{GdG=`!akeX7qbXb;Qtc%#u$p4;cPR_l*h$|JJ&haF6F;IxlAC*V~zOqQ{Om zR|(Id@|f=|brml0$}t_+nH(;JeZak#Jrjk0Z{-aqG$Y8ZfJz$rM!Kp~b6Pu2WxD?d z*sN??AlYTm)@{pb??X+M*&N8;E*cyyZS!_~o!%9W1{7am$1L5GzxPx;t}@jTZVLvH z_*<1@p3H9;&Lo~ez0CaU#deyvd*P>OP19+2P|gwf4iP?KuR*6c2y%JX|1aOR|6lre bf7)!?u=Ma^^4blcJ;Y|4z2(iV-v9g`sdoi4 literal 0 HcmV?d00001 diff --git a/doc/tetrahedron_refinements/4-edges/edge_12-20-23-30_refined/12-20-23-30.pvsm b/doc/tetrahedron_refinements/4-edges/edge_12-20-23-30_refined/12-20-23-30.pvsm new file mode 100644 index 0000000..e77bb21 --- /dev/null +++ b/doc/tetrahedron_refinements/4-edges/edge_12-20-23-30_refined/12-20-23-30.pvsm @@ -0,0 +1,2021 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/doc/tetrahedron_refinements/4-edges/edge_12-20-23-30_refined/12-20-23-30.txt b/doc/tetrahedron_refinements/4-edges/edge_12-20-23-30_refined/12-20-23-30.txt new file mode 100644 index 0000000..0bb6c1b --- /dev/null +++ b/doc/tetrahedron_refinements/4-edges/edge_12-20-23-30_refined/12-20-23-30.txt @@ -0,0 +1,25 @@ +TET no. 0: +0.0, 1.0, 0.0 +0.5, 0.0, 0.0 +0.0, 0.0, 0.0 +0.0, 0.0, 0.5 +TET no. 1: +0.0, 1.0, 0.0 +1.0, 0.0, 0.0 +0.5, 0.0, 0.0 +0.5, 0.0, 0.5 +TET no. 2: +0.0, 1.0, 0.0 +0.5, 0.0, 0.5 +0.5, 0.0, 0.0 +0.0, 0.0, 0.5 +TET no. 3: +0.0, 1.0, 0.0 +0.0, 0.5, 0.5 +0.5, 0.0, 0.5 +0.0, 0.0, 0.5 +TET no. 4: +0.0, 0.5, 0.5 +0.5, 0.0, 0.5 +0.0, 0.0, 0.5 +0.0, 0.0, 1.0 diff --git a/doc/tetrahedron_refinements/4-edges/edge_12-20-23-30_refined/12-20-23-30.vtk b/doc/tetrahedron_refinements/4-edges/edge_12-20-23-30_refined/12-20-23-30.vtk new file mode 100644 index 0000000..56cc70f --- /dev/null +++ b/doc/tetrahedron_refinements/4-edges/edge_12-20-23-30_refined/12-20-23-30.vtk @@ -0,0 +1,37 @@ +# vtk DataFile Version 2.0 +VTK LEGACY FILE FORMAT ASCII - tetrahedral sample file for H5FED test +ASCII +DATASET UNSTRUCTURED_GRID + +POINTS 8 DOUBLE +0.0 1.0 0.0 +0.5 0.0 0.0 +0.0 0.0 0.0 +0.0 0.0 0.5 +1.0 0.0 0.0 +0.5 0.0 0.5 +0.0 0.5 0.5 +0.0 0.0 1.0 + +CELLS 5 25 +4 0 1 2 3 +4 0 4 1 5 +4 0 5 1 3 +4 0 6 5 3 +4 6 5 3 7 + +CELL_TYPES 5 +10 +10 +10 +10 +10 + +CELL_DATA 5 +SCALARS cell_attribute_data float 1 +LOOKUP_TABLE default +0 +1 +2 +3 +4 diff --git a/doc/tetrahedron_refinements/4-edges/edge_12-20-23-30_refined/12-20-23-30_small.png b/doc/tetrahedron_refinements/4-edges/edge_12-20-23-30_refined/12-20-23-30_small.png new file mode 100644 index 0000000000000000000000000000000000000000..b7a97f8022ad8fb14d62d6f206181920e1471d7f GIT binary patch literal 13460 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 K{j3ny_5VLi6^roz literal 0 HcmV?d00001 diff --git a/doc/tetrahedron_refinements/4-edges/edge_12-20-23-31_refined/12-20-23-31.png b/doc/tetrahedron_refinements/4-edges/edge_12-20-23-31_refined/12-20-23-31.png new file mode 100644 index 0000000000000000000000000000000000000000..88a7c193af8fba986bc028ecc62112d94a3abdb4 GIT binary patch literal 11339 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 E0}*oW8vp + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/doc/tetrahedron_refinements/4-edges/edge_12-20-23-31_refined/12-20-23-31.txt b/doc/tetrahedron_refinements/4-edges/edge_12-20-23-31_refined/12-20-23-31.txt new file mode 100644 index 0000000..ef98ac1 --- /dev/null +++ b/doc/tetrahedron_refinements/4-edges/edge_12-20-23-31_refined/12-20-23-31.txt @@ -0,0 +1,25 @@ +TET no. 0: +1.0, 0.0, 0.0 +0.0, 0.5, 0.0 +0.0, 1.0, 0.0 +0.0, 0.5, 0.5 +TET no. 1: +1.0, 0.0, 0.0 +0.0, 0.0, 0.0 +0.0, 0.5, 0.0 +0.0, 0.0, 0.5 +TET no. 2: +1.0, 0.0, 0.0 +0.0, 0.0, 0.5 +0.0, 0.5, 0.0 +0.0, 0.5, 0.5 +TET no. 3: +1.0, 0.0, 0.0 +0.5, 0.0, 0.5 +0.0, 0.0, 0.5 +0.0, 0.5, 0.5 +TET no. 4: +0.5, 0.0, 0.5 +0.0, 0.0, 0.5 +0.0, 0.5, 0.5 +0.0, 0.0, 1.0 diff --git a/doc/tetrahedron_refinements/4-edges/edge_12-20-23-31_refined/12-20-23-31.vtk b/doc/tetrahedron_refinements/4-edges/edge_12-20-23-31_refined/12-20-23-31.vtk new file mode 100644 index 0000000..17fdb4d --- /dev/null +++ b/doc/tetrahedron_refinements/4-edges/edge_12-20-23-31_refined/12-20-23-31.vtk @@ -0,0 +1,37 @@ +# vtk DataFile Version 2.0 +VTK LEGACY FILE FORMAT ASCII - tetrahedral sample file for H5FED test +ASCII +DATASET UNSTRUCTURED_GRID + +POINTS 8 DOUBLE +1.0 0.0 0.0 +0.0 0.5 0.0 +0.0 1.0 0.0 +0.0 0.5 0.5 +0.0 0.0 0.0 +0.0 0.0 0.5 +0.5 0.0 0.5 +0.0 0.0 1.0 + +CELLS 5 25 +4 0 1 2 3 +4 0 4 1 5 +4 0 5 1 3 +4 0 6 5 3 +4 6 5 3 7 + +CELL_TYPES 5 +10 +10 +10 +10 +10 + +CELL_DATA 5 +SCALARS cell_attribute_data float 1 +LOOKUP_TABLE default +0 +1 +2 +3 +4 diff --git a/doc/tetrahedron_refinements/4-edges/edge_12-20-23-31_refined/12-20-23-31_small.png b/doc/tetrahedron_refinements/4-edges/edge_12-20-23-31_refined/12-20-23-31_small.png new file mode 100644 index 0000000000000000000000000000000000000000..e52951a0a9795de2ec01a646efb9402762078f85 GIT binary patch literal 12206 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 literal 0 HcmV?d00001 diff --git a/doc/tetrahedron_refinements/4-edges/edge_12-20-30-31_refined/12-20-30-31.png b/doc/tetrahedron_refinements/4-edges/edge_12-20-30-31_refined/12-20-30-31.png new file mode 100644 index 0000000000000000000000000000000000000000..d22d824b1e76b7535d2c814d41b2d25b17c0645e GIT binary patch literal 11216 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 literal 0 HcmV?d00001 diff --git a/doc/tetrahedron_refinements/4-edges/edge_12-20-30-31_refined/12-20-30-31.pvsm b/doc/tetrahedron_refinements/4-edges/edge_12-20-30-31_refined/12-20-30-31.pvsm new file mode 100644 index 0000000..acc0f01 --- /dev/null +++ b/doc/tetrahedron_refinements/4-edges/edge_12-20-30-31_refined/12-20-30-31.pvsm @@ -0,0 +1,2021 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/doc/tetrahedron_refinements/4-edges/edge_12-20-30-31_refined/12-20-30-31.txt b/doc/tetrahedron_refinements/4-edges/edge_12-20-30-31_refined/12-20-30-31.txt new file mode 100644 index 0000000..8a9007b --- /dev/null +++ b/doc/tetrahedron_refinements/4-edges/edge_12-20-30-31_refined/12-20-30-31.txt @@ -0,0 +1,30 @@ +TET no. 0: +0.0, 0.5, 0.5 +0.0, 1.0, 0.0 +0.0, 0.5, 0.0 +1.0, 0.0, 0.0 +TET no. 1: +0.0, 0.5, 0.5 +0.5, 0.0, 0.0 +0.5, 0.0, 0.5 +1.0, 0.0, 0.0 +TET no. 2: +0.0, 0.5, 0.5 +0.0, 0.5, 0.0 +0.5, 0.0, 0.0 +1.0, 0.0, 0.0 +TET no. 3: +0.0, 0.0, 1.0 +0.5, 0.0, 0.5 +0.0, 0.5, 0.5 +0.5, 0.0, 0.0 +TET no. 4: +0.0, 0.0, 1.0 +0.0, 0.5, 0.5 +0.0, 0.5, 0.0 +0.5, 0.0, 0.0 +TET no. 5: +0.0, 0.0, 1.0 +0.0, 0.5, 0.0 +0.0, 0.0, 0.0 +0.5, 0.0, 0.0 diff --git a/doc/tetrahedron_refinements/4-edges/edge_12-20-30-31_refined/12-20-30-31.vtk b/doc/tetrahedron_refinements/4-edges/edge_12-20-30-31_refined/12-20-30-31.vtk new file mode 100644 index 0000000..d79f570 --- /dev/null +++ b/doc/tetrahedron_refinements/4-edges/edge_12-20-30-31_refined/12-20-30-31.vtk @@ -0,0 +1,40 @@ +# vtk DataFile Version 2.0 +VTK LEGACY FILE FORMAT ASCII - tetrahedral sample file for H5FED test +ASCII +DATASET UNSTRUCTURED_GRID + +POINTS 8 DOUBLE +0.0 0.5 0.5 +0.0 1.0 0.0 +0.0 0.5 0.0 +1.0 0.0 0.0 +0.5 0.0 0.0 +0.5 0.0 0.5 +0.0 0.0 1.0 +0.0 0.0 0.0 + +CELLS 6 30 +4 0 1 2 3 +4 0 4 5 3 +4 0 2 4 3 +4 6 5 0 4 +4 6 0 2 4 +4 6 2 7 4 + +CELL_TYPES 6 +10 +10 +10 +10 +10 +10 + +CELL_DATA 6 +SCALARS cell_attribute_data float 1 +LOOKUP_TABLE default +0 +1 +2 +3 +4 +5 diff --git a/doc/tetrahedron_refinements/4-edges/edge_12-20-30-31_refined/12-20-30-31_small.png b/doc/tetrahedron_refinements/4-edges/edge_12-20-30-31_refined/12-20-30-31_small.png new file mode 100644 index 0000000000000000000000000000000000000000..687e110dfc17cafe1b54d2a138c4e8bf0907e423 GIT binary patch literal 12010 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

R;}N_Jk7)Y)Jz(Ul0od zP8b9?E>PeDim=yBHZq@LQ6yVkfwdA!?a%1ne(~wjY<~{H>9#kcBzN(K3G9c)FK;&P`I44gUi~D2>C#G73r!^_A19wOMP`Q=dO^hPTd`lKq?|b68p3Svu?dthwX}uogzQoy zbtrTwgwi%wG6r8ophn!rF$k)Fua*0&XH5(> kYT*B0clZBm2jB3w-50xNc!y02?@tFlNhwN}e}D%59|d70>Hq)$ literal 0 HcmV?d00001 diff --git a/doc/tetrahedron_refinements/4-edges/edge_12-23-30-31_refined/12-23-30-31.png b/doc/tetrahedron_refinements/4-edges/edge_12-23-30-31_refined/12-23-30-31.png new file mode 100644 index 0000000000000000000000000000000000000000..a1b072498265c5a973ee22a87a5028cb2ca94059 GIT binary patch literal 11742 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 o)c; + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/doc/tetrahedron_refinements/4-edges/edge_12-23-30-31_refined/12-23-30-31.txt b/doc/tetrahedron_refinements/4-edges/edge_12-23-30-31_refined/12-23-30-31.txt new file mode 100644 index 0000000..efdbbde --- /dev/null +++ b/doc/tetrahedron_refinements/4-edges/edge_12-23-30-31_refined/12-23-30-31.txt @@ -0,0 +1,25 @@ +TET no. 0: +1.0, 0.0, 0.0 +0.0, 0.5, 0.5 +0.0, 0.0, 1.0 +0.0, 0.0, 0.5 +TET no. 1: +1.0, 0.0, 0.0 +0.0, 1.0, 0.0 +0.0, 0.5, 0.5 +0.0, 0.5, 0.0 +TET no. 2: +1.0, 0.0, 0.0 +0.0, 0.5, 0.0 +0.0, 0.5, 0.5 +0.0, 0.0, 0.5 +TET no. 3: +1.0, 0.0, 0.0 +0.5, 0.0, 0.0 +0.0, 0.5, 0.0 +0.0, 0.0, 0.5 +TET no. 4: +0.5, 0.0, 0.0 +0.0, 0.5, 0.0 +0.0, 0.0, 0.5 +0.0, 0.0, 0.0 diff --git a/doc/tetrahedron_refinements/4-edges/edge_12-23-30-31_refined/12-23-30-31.vtk b/doc/tetrahedron_refinements/4-edges/edge_12-23-30-31_refined/12-23-30-31.vtk new file mode 100644 index 0000000..0ed6fb8 --- /dev/null +++ b/doc/tetrahedron_refinements/4-edges/edge_12-23-30-31_refined/12-23-30-31.vtk @@ -0,0 +1,37 @@ +# vtk DataFile Version 2.0 +VTK LEGACY FILE FORMAT ASCII - tetrahedral sample file for H5FED test +ASCII +DATASET UNSTRUCTURED_GRID + +POINTS 8 DOUBLE +1.0 0.0 0.0 +0.0 0.5 0.5 +0.0 0.0 1.0 +0.0 0.0 0.5 +0.0 1.0 0.0 +0.0 0.5 0.0 +0.5 0.0 0.0 +0.0 0.0 0.0 + +CELLS 5 25 +4 0 1 2 3 +4 0 4 1 5 +4 0 5 1 3 +4 0 6 5 3 +4 6 5 3 7 + +CELL_TYPES 5 +10 +10 +10 +10 +10 + +CELL_DATA 5 +SCALARS cell_attribute_data float 1 +LOOKUP_TABLE default +0 +1 +2 +3 +4 diff --git a/doc/tetrahedron_refinements/4-edges/edge_12-23-30-31_refined/12-23-30-31_small.png b/doc/tetrahedron_refinements/4-edges/edge_12-23-30-31_refined/12-23-30-31_small.png new file mode 100644 index 0000000000000000000000000000000000000000..9c964ed7bfa94cfc520f58f214c9c6139bf7d488 GIT binary patch literal 12377 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 literal 0 HcmV?d00001 diff --git a/doc/tetrahedron_refinements/4-edges/edge_20-23-30-31_refined/20-23-30-31.pvsm b/doc/tetrahedron_refinements/4-edges/edge_20-23-30-31_refined/20-23-30-31.pvsm new file mode 100644 index 0000000..a1d1d01 --- /dev/null +++ b/doc/tetrahedron_refinements/4-edges/edge_20-23-30-31_refined/20-23-30-31.pvsm @@ -0,0 +1,2021 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/doc/tetrahedron_refinements/4-edges/edge_20-23-30-31_refined/20-23-30-31.txt b/doc/tetrahedron_refinements/4-edges/edge_20-23-30-31_refined/20-23-30-31.txt new file mode 100644 index 0000000..ad141b9 --- /dev/null +++ b/doc/tetrahedron_refinements/4-edges/edge_20-23-30-31_refined/20-23-30-31.txt @@ -0,0 +1,25 @@ +TET no. 0: +0.0, 1.0, 0.0 +0.5, 0.0, 0.5 +1.0, 0.0, 0.0 +0.5, 0.0, 0.0 +TET no. 1: +0.0, 1.0, 0.0 +0.0, 0.0, 1.0 +0.5, 0.0, 0.5 +0.0, 0.0, 0.5 +TET no. 2: +0.0, 1.0, 0.0 +0.0, 0.0, 0.5 +0.5, 0.0, 0.5 +0.5, 0.0, 0.0 +TET no. 3: +0.0, 1.0, 0.0 +0.0, 0.5, 0.0 +0.0, 0.0, 0.5 +0.5, 0.0, 0.0 +TET no. 4: +0.0, 0.5, 0.0 +0.0, 0.0, 0.5 +0.5, 0.0, 0.0 +0.0, 0.0, 0.0 diff --git a/doc/tetrahedron_refinements/4-edges/edge_20-23-30-31_refined/20-23-30-31.vtk b/doc/tetrahedron_refinements/4-edges/edge_20-23-30-31_refined/20-23-30-31.vtk new file mode 100644 index 0000000..08449f0 --- /dev/null +++ b/doc/tetrahedron_refinements/4-edges/edge_20-23-30-31_refined/20-23-30-31.vtk @@ -0,0 +1,37 @@ +# vtk DataFile Version 2.0 +VTK LEGACY FILE FORMAT ASCII - tetrahedral sample file for H5FED test +ASCII +DATASET UNSTRUCTURED_GRID + +POINTS 8 DOUBLE +0.0 1.0 0.0 +0.5 0.0 0.5 +1.0 0.0 0.0 +0.5 0.0 0.0 +0.0 0.0 1.0 +0.0 0.0 0.5 +0.0 0.5 0.0 +0.0 0.0 0.0 + +CELLS 5 25 +4 0 1 2 3 +4 0 4 1 5 +4 0 5 1 3 +4 0 6 5 3 +4 6 5 3 7 + +CELL_TYPES 5 +10 +10 +10 +10 +10 + +CELL_DATA 5 +SCALARS cell_attribute_data float 1 +LOOKUP_TABLE default +0 +1 +2 +3 +4 diff --git a/doc/tetrahedron_refinements/4-edges/edge_20-23-30-31_refined/20-23-30-31_small.png b/doc/tetrahedron_refinements/4-edges/edge_20-23-30-31_refined/20-23-30-31_small.png new file mode 100644 index 0000000000000000000000000000000000000000..4de4f1256dc2005057e59d475b5b20e313be641d GIT binary patch literal 13974 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 QmJIM+Qc}(<^TWy literal 0 HcmV?d00001 diff --git a/doc/tetrahedron_refinements/5-edges/edge_01-12-20-23-30_refined/01-12-20-23-30.png b/doc/tetrahedron_refinements/5-edges/edge_01-12-20-23-30_refined/01-12-20-23-30.png new file mode 100644 index 0000000000000000000000000000000000000000..1ecc4f3e4ffe1dbf7f1e7c1f6f01c11ec92bb3f7 GIT binary patch literal 10265 zcmeIY`9IX_8$W)Jp+TA={gfDs6@Wk%XvRO|G@W`&kvuUjMsg?uKjx6*L_{D11xX1S*p6K z2%%XX?yLO}QZzwGp+#8%o)F(X7)MASd8~F~^Nx=^TiN;VhQ!C8{x*qgV5wFQ-2S&F zK7{A8&#P^Hz40L@a`VBu!#j$Eruz?4opiJpySsPpI~aMS`jTfOAvN%iCH5{to%S7r z=XCwO$10mYUQ79qG&S+zW9iC!4sX6V1zb2+zANY0ksqIrzbWn6d37!DzjZAv8UAo$ zYKRD#dU4_R_G&Uh0t+z#p@IrJLfCmW2_aUI4AyS@Q4wMW{=d!tS6D-+yLp21ralm_T$H;_u(8ZaAC>Q zimUS~^&0lUYUPE*nL%+vIy~0dTtqpRr`K>49?vM4wAo=q3UY?PNHzVI*nUIW;7Ps% z5hB>YrMG{UL)%00h}IA^%n&E*p~eec zTMG3o@ue9GMeR8nqyho_))h@}Qw4#UW}6Dy9lHqsR*{kZv45kIhh{ zSALthLy#xPQarEB_QR1lrV_|&AJWjxTNB5m!tck+VnP|l4gy_>-g4Wu;e+{ltb7^5 zJbH@e@i*n`t?$~R1WOl69BgPH{5V8*_L}hbxq7{6uS2N^tuSAU~83I zXuq$i!`ZyH2-tGlPqz>RX2MVF{CTrrw+9yqFK%;H&m)S!Kn>}AnXYlnZLmH!citB9 z+gY{Jm{}leMpw3_PApR!L}jpalR?y(VuG-Lo9lH$Qv7NzveG`XbVe5;8LXG>6Rrj{ zcEMI+-aO)8d3q~^s`a3b&fe~lG&52>n67tm#nSm*gh^l-?;P3=^jq(4`(w551iosYcKKd#dq7II*rn^Z?Z%+O;Cb~lb+fA)(%Rr1O3 zQS*yMR~G{X znflhLYNg^^PI<&CaCeiTO+a+uCbSx&K4P725OX7PhCsU2rFM6nc5Z-C#(Q{Wk9BI< z*8cq!WP!Dqa5$sy{R*~p^n@Pz#wMNZH=fpo@F-937Lbo%lY#`n;Z-wBHdWw|(|?Novf%uY zX)h7P**34_EA(T0xI#@A&X?3tnLz0z+_(pa;E{)X0A>x83`S)sa zWdktrJXmfi*tH`MLY;L;#tHBOn_W3P*Q#>q88GYK4mN4XK7XD}Av3I7iXNBIhaXG2 zS=!8HK=NSE&c6z?N(T%7vyeRK=X2B6{zhrKxOlrK9f^D)3IxC9Mu+}`|=1$)>_82w6zUubm^{6=@XXMpbB?}t zD?!fW_Eu~kY1|h?IInyHw*nl0)PbmI)wB+JoKmwk-NEzV^?pd!qb%yzy2rg`x-AN+ zN9YbH$CsKdm>LV%!mT&FrEtrgjJ1LNO3phzT*}!yd)%GuMP+K%q&h|Z`t|PWf>y7$ z5AGc;-OhIdf&!aIO;Ts>o08 zoSa7rr`-M=*uL(qwF7n;BQd>oiNK)o&g%9UiBr(_Y{OuBL0Vrj^ zmfI_A^REpX*)mKR>I5nCi28i(I*PFT(z0{3Umf+1uXx{jHtj+A;}eschad-wFOV6g@0*CByI9nAKM-p*1oYTM=MHy6Z=6+NICP z+fG4PY!!Kxy)Nx3@nr;f_%)m4t4E%ufCAQV)jRLY-9J5T>m}+}^tbtu)c4Bti`Gd% zWYj(UZ;$^}i+@}uldFFBhrE}D4hG5)6gsQpjTwIZV+g%e7dx@uv>CL-D4|}G*eS@X z%{d9#f|>#DT=l1?R6xdcK$sf=%({t60cAXDqlhLhW#01 zsC|1iBuv_A`tb8{Tu=dJN%Y2(s5wW*QQWZKE$b-_p)wX#?bTDcdyyk5f~o^5O{*M+ z}#4GwWptxM2>P)OLFw%_9jt8;-3Wns%jDC0!@*^)xd&r%+G9kE&Mh&RhK#1?;15 zC%*Cha|TdANSj4nbIKhw)UIzLv9kT+I8^Zs3)OVD?lDx^KVuj;L;jX;fU=FP8k?iWO~#PKiDesOGXI2CP3_n3?p4^GuR(Ft>!W@!3P%0 z9R=E7R%nG)6Pxp7Sn`f(W)Hut&{sb$!-yNFRYlGFWLVqL|EbB0T;H|OUQBSisK%Fy z<{&Gwm~f_vLKz`6g@V^hWtfd_hMVdjjj0Ca|IQ{If3$+(*9lpJWQhq6#ubH75X@E4 zpmm)m2?5L(t`HNvlvLsUp6;J4ec|tLFzI{p%7r6@e*Z)~a^P}<-BDEKYn^vg1Bd?! z8!XoI4DZl{`u{1qw1)UFQwKs6WqNXjo)VFPQWOQ-x*MAl@5B`*YE0*iCKMQ7S8;{@ zuhJnVk%&c&sS`+Y6)uyI)jTm_-pyJ6W5BVlA%1@R{94v?+Wjy};+%gI;=HI`<_=%M z#@_ewyhFcLkvlEor)5OhUT_TG|1UM!6?8%73K48+O_)~IyoTuc7T{qF3l22$fs<=- z4N+BQ!0>wsBBTrGg0oTox!2Q|$_n}u0v_8L^-p}bYI`|dkX|Y>2&dRDzU{ns=*Q%O z9cd&rIP#57fFlNJR;`i^UBzioXAB>dVTt22`P-fl!`f~VXOz(eHNm);Vik(c0U7r6 z3LcNx40s(hAhxEvsU}Fw1IIX)5Id(eXjU`CgdJb0G{OLYlXdt%p1%ga$N>$XK|Qmk z0|#1G;Q{=D!t_eU^MdIpB3`Ma3mQMPL1c2gX{wP-9`iaBGRxd~igPS$THDif{i0Z0S@iO5=vA)6Y|)d! zJ>qfYmgLXA?=d@2O3TNn4e<5_kIbNx!QRxW2XYy5l7#u)m$bk zB;8Fo79&wbx7ShCA7QxcsN0>(41u(qAklB^BwATQ z5gJ}Y9Jg`7p$ZMLsJ#_|)4s(ts>s9QAc@8$$C6ElG8BH}A|k9d9uOJ0?7(v|fXQXP zc&&UiO3Y9Bo^0lr)_`}^sZEL&S-51=Ix*Lw- z5GY)8JaAuNqY6;N!-c`Bpc)SVCcB2{Y7@;Xe+&|7uA^EBssSQ^Cx45WXR0pPRYPpI zO~NxNTL@sLCMLAara5Kc(0>{NfL%uCY!ew&RN*IR$K*uMrBMy68`yjE232$bQiX&( zVtP59vs*Oe-F*rytY`PeFGGs?R+CHi$$9E6j)=pmA%-qwlxE@x$<~S~925}Y3dva{ z3fU|KoJ;laAnP2HVJ(r-!Qp(9t>8=uOdxxP&T)l3(lG(?$4Qfue;4ZMl*lj-6+Te} z`O68LK?U$7e3?xnt)?Z0Q9d8I;A!cAUtlYZ8RQ2v)_y6LP(>~|A-6Y=150dRlk^$h zs`F`2LxS?p=FN}C?`nth({wdlvH{ranLLXM$KkbY{&8Id zn{`y-7SWKxQrtO6UsX)dGh$eBh6yI~;)PN+DJDzaoIUoEURIyyMP_o*pUV7$E>V;! z?>GckRxf4#@3^id0cjh$_Bz1*P(#w_Dm|4kCQwZ!bKoN9rNS?4>aeI!HjTMfLGB_9 z0zaj+j>Ktx0;qKvm2~WmGJh1px}*?pQ^t(?(~e=~ugzPWNKhH0zm)lZg;Uy%9I!WR zQbV4+Q$G}shFNO3F|ky5Rx0ll_7X7_xN@0`3@9Tv)Ya%%2#EfhB=^vmphUG+nn$#E z;-Y!V{Nr2k0^o)jJXp&`3GhJ8G4bN(gwI>xHU)(&(@tbyGvZ_d6fS`A^W~jOfZfRb z{L{Gc16Fa-5f%P~2+wE!6Avw^n1gjre!&WlHnfY=UESt$^ciu^q{)q!(gde#ubm^}8JO8_yn z1B?%c^@O8rQg6DvYHbqg&5@y_8njtAaiI1yxBAd|-ZQF~uQ1(N`wEi;r~*3m~kktJYm4#u6K(ReTI9yvZ(9`u26K+Hc2v5 zUrS6_y^yg{^*PPvfYpa8o8j+UFZ|egp<1p<(AeDzop1`2#deoBUtDqP=1$3{F1NaS zpSmp>D<;p5I-Ean%`=$pKr3#~a7i)NpM8O>KUb4Kwus{Rx+KX~ZVksks+trxp-zFd$ zL*HRI%}wiRS-tXtQ$GhslO%b>*V6Pky@U;Q3M&7EJ(ujSeSMcqx85T!kYeFSxG34` zQ>Kx;cj(sDSW(Ec=AqO6pEbKA7ozrNgA7q6yqmLm!;Lffn^SZ@-Sw~X|NN%Qw`u9v z3@UUk%|Q^KH4M>#%kMwE`0mvec%% zcWK$fH})KD+Vx*wk3A%HwPma)z(L0eAh|8@Gc4MitZl>a^IY;gd9D>>&-XiD^HXBK zFHj1USq&rd)5vFaij^iVPZvL-E$O42`*H8wU;N8guWt`Bx?V-!`n>M^BZ8*&J7j-F z{j{qrRua*uIh5m=N5s3ldjICE-?9Da(4)5|8*-MzZOr}-our;6L(SP*W_QnbINa%= ziUZytZ|GOfd+#SbIWhVAlXl8v?W03E53Ub7^DTyQPLw$FTPt!(cGY4>pqu9xy!-RN zUzT|0&dfgl-uD$m#Sj^mFz5)<6-ny`NwMa_bqP0CyYr}4zT;flc1Ca3x+v= zx%FN86>stda>)@H(s|IotLg4Vw=>0OkD9na-*ID903kbE)-!s|MsP3;x@D+Vaq$If-j>9}MNZ?#hM3Y7lhkJi98KVfUE5 ztpR#g(C^>IYO%emYvB@+r^i$QAsT|49tWKA&(gcL?RTl5ZPsFa0Gya=g6B|U>bl(i z)2``j$Qbnk8O@z%VfV1>*dl%hwagf_Y6t<-_!2**TQsOQM48 zyn7&M!A;kwJ7*RVO-MpVa8-iYEI*0V>K)n%FT6f&Tjd&uxA=rwH)oJq{!oHe9!jsU zwO<>D#8qVMe&#H68bmf==?2{vOn1Y-dWJU~l_GP9!gbD&a zm0$*KO??jm4ecn@Xgce5t{#pn0>=u1@G-2~Y)w5HL8e3TnFRm&d#2*S|1|MFfP`kt zv&a?E$uo>0HeTEPVZ*|*qWInPJ?nqyb(inqHg8dS53*dO&g47N(=3jv(V@ryn6z!M zVwC1D3R)e9pnrkctL}*_i+x*4&V);%lX$_GFlaeO3C1Y&(@DtmKLFn`{ z&d`x=?Oa+?d?yHpV?o$Ce;&icrCr|v3j+a_0q^zrPfVj*>k@&hO;+I;B z43Qyg_r`0%`|dDN!iPgQ`=WX8?=Kwv-6sb?(f~-zXel6yLM}EgH}u9S9ESz5`zH@96e#C?pf|+0h|Ydl_G;2W9n%-_5mzuslxBfs&p4hVFF|ihW_fwi#Obm zadQo>+25d9N1EI9_3`eH|IdcCyliQFR$3htl*eHReZ_<^W9N&7Tk;LyAc3a1m4amH zwaays7--|)op$-Qm?3^LQUtrqSja%iFv-q#=CMw`^A|!n&M_4caVQmrrIFBm5Qv~c zL90NAklD1O9O`%GKi55P3-_oa_h7hSA{}upl1xNsH5K<*KRsk0;m_*Wmx+loV00lcC02_RG z2p{acL=uhsH(h(ZVGmi8rne1rfMPhNK#uhBS)myy{|?sfs?$&qxIU&-j$Z1*l+7iL z1TBRIm}PU!Bm{i;i_HWcP>7-+S00KngO_imxjC1bkP<PKM?iNS!9E+ORy$ubh6QF~ah$t`s1%g#5STJ5NPd=F#d;P0pU}|I; z11pNUG%(Qfdg3~XxvpkN;n=`hm<~SrHuclz*a<}}Nkr6NvFvQU{0u%4_3ZMmJqr#p z0#2?FfQ!~qi?41AVoxROgJGdf|R)VC2TR z;s%dnYoA6wX!E(;dgQ}5JM6o$8U_1qC;rvHr*&lK)r4^~qkGr=I)kH;`XKvc#Hihi z%jZ4GT75ldL*B$1c#u)f(oaaa;*5+psPp@h^&Vu521?l{*5nlQg?@=KIx7-D;TXS` zhZOGza^Ls2{9)vPX5f-$22)R_{PW{Jzf>`O6B$`9V$21~1)7)XE2egT8GUr@WAc)U zf-zBRHZV@IY8V5Bg^Io+*D*6@f>pc(Zr*Kb@_yTkLXxV9&H!gahOW%q=S_f!PW zKi{2v}UUktvFIVy8Et7v*=eDb8SRcn14Q6DDFhywnD^uWKUC@ryKAWt}#afFdV zahY2w(n3@(IFALJ?kws*qr%bt5s!(ll- z6C~r8(^r!>LyGkPunt0|cd$EBI~sFKe@|DU;BkjOROc-J*81tz&vO&Uw3n0?r^k}e z9SCEpIQC77|Q%0SE-AC9-{8GslVn9vV@ha3aBd0E$8(EUfmm#oZ6L zI;4E_CK3Pq0t-kZSQmQau=+AZA$oMgnvo zk@^WaN(3~A;)6I0!HTUoOUC8@8%SK)@``|?BGV_0)N25=PiWAlzi#>J#zXiAFTEA} zC2%o?kriT|^G?I%W&z9iZvVxCnLuFNn1Mm_AH_o)LmL(8+_-^zUJ=llqi#%N2Ed;7 zSRC{9;aoyxK;9M}%`jwOEW1Cho5KfHMo>ck|NbWK*UFB-z51@9yLJOD + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/doc/tetrahedron_refinements/5-edges/edge_01-12-20-23-30_refined/01-12-20-23-30.txt b/doc/tetrahedron_refinements/5-edges/edge_01-12-20-23-30_refined/01-12-20-23-30.txt new file mode 100644 index 0000000..1f68f4c --- /dev/null +++ b/doc/tetrahedron_refinements/5-edges/edge_01-12-20-23-30_refined/01-12-20-23-30.txt @@ -0,0 +1,35 @@ +TET no. 0: +0.0, 0.0, 0.0 +0.0, 0.0, 0.5 +0.0, 1.0, 0.0 +0.5, 0.0, 0.0 +TET no. 1: +0.0, 1.0, 0.0 +0.0, 0.0, 0.5 +0.0, 0.5, 0.5 +0.5, 0.0, 0.0 +TET no. 2: +0.0, 1.0, 0.0 +0.5, 0.0, 0.0 +0.0, 0.5, 0.5 +0.5, 0.5, 0.0 +TET no. 3: +0.5, 0.5, 0.0 +0.5, 0.0, 0.0 +0.0, 0.5, 0.5 +0.5, 0.0, 0.5 +TET no. 4: +0.5, 0.0, 0.0 +0.0, 0.0, 0.5 +0.0, 0.5, 0.5 +0.5, 0.0, 0.5 +TET no. 5: +0.0, 0.0, 0.5 +0.5, 0.0, 0.5 +0.0, 0.0, 1.0 +0.0, 0.5, 0.5 +TET no. 6: +0.5, 0.0, 0.0 +1.0, 0.0, 0.0 +0.5, 0.0, 0.5 +0.5, 0.5, 0.0 diff --git a/doc/tetrahedron_refinements/5-edges/edge_01-12-20-23-30_refined/01-12-20-23-30.vtk b/doc/tetrahedron_refinements/5-edges/edge_01-12-20-23-30_refined/01-12-20-23-30.vtk new file mode 100644 index 0000000..753fae0 --- /dev/null +++ b/doc/tetrahedron_refinements/5-edges/edge_01-12-20-23-30_refined/01-12-20-23-30.vtk @@ -0,0 +1,44 @@ +# vtk DataFile Version 2.0 +VTK LEGACY FILE FORMAT ASCII - tetrahedral sample file for H5FED test +ASCII +DATASET UNSTRUCTURED_GRID + +POINTS 9 DOUBLE +0.0 0.0 0.0 +0.0 0.0 0.5 +0.0 1.0 0.0 +0.5 0.0 0.0 +0.0 0.5 0.5 +0.5 0.5 0.0 +0.5 0.0 0.5 +0.0 0.0 1.0 +1.0 0.0 0.0 + +CELLS 7 35 +4 0 1 2 3 +4 2 1 4 3 +4 2 3 4 5 +4 5 3 4 6 +4 3 1 4 6 +4 1 6 7 4 +4 3 8 6 5 + +CELL_TYPES 7 +10 +10 +10 +10 +10 +10 +10 + +CELL_DATA 7 +SCALARS cell_attribute_data float 1 +LOOKUP_TABLE default +0 +1 +2 +3 +4 +5 +6 diff --git a/doc/tetrahedron_refinements/5-edges/edge_01-12-20-23-30_refined/01-12-20-23-30_small.png b/doc/tetrahedron_refinements/5-edges/edge_01-12-20-23-30_refined/01-12-20-23-30_small.png new file mode 100644 index 0000000000000000000000000000000000000000..a197e67cb1e9534b6db64dfb13ae1c8a201f8f95 GIT binary patch literal 12108 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 HCPDuPj89`Z literal 0 HcmV?d00001 diff --git a/doc/tetrahedron_refinements/5-edges/edge_01-12-20-23-31_refined/01-12-20-23-31.png b/doc/tetrahedron_refinements/5-edges/edge_01-12-20-23-31_refined/01-12-20-23-31.png new file mode 100644 index 0000000000000000000000000000000000000000..52e40ee7a257d1a18f554ca2f74744a9fec26251 GIT binary patch literal 14204 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 + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/doc/tetrahedron_refinements/5-edges/edge_01-12-20-23-31_refined/01-12-20-23-31.txt b/doc/tetrahedron_refinements/5-edges/edge_01-12-20-23-31_refined/01-12-20-23-31.txt new file mode 100644 index 0000000..dd4781c --- /dev/null +++ b/doc/tetrahedron_refinements/5-edges/edge_01-12-20-23-31_refined/01-12-20-23-31.txt @@ -0,0 +1,35 @@ +TET no. 0: +1.0, 0.0, 0.0 +0.5, 0.0, 0.5 +0.0, 0.0, 0.0 +0.5, 0.5, 0.0 +TET no. 1: +0.0, 0.0, 0.0 +0.5, 0.0, 0.5 +0.0, 0.0, 0.5 +0.5, 0.5, 0.0 +TET no. 2: +0.0, 0.0, 0.0 +0.5, 0.5, 0.0 +0.0, 0.0, 0.5 +0.0, 0.5, 0.0 +TET no. 3: +0.0, 0.5, 0.0 +0.5, 0.5, 0.0 +0.0, 0.0, 0.5 +0.0, 0.5, 0.5 +TET no. 4: +0.5, 0.5, 0.0 +0.5, 0.0, 0.5 +0.0, 0.0, 0.5 +0.0, 0.5, 0.5 +TET no. 5: +0.5, 0.0, 0.5 +0.0, 0.5, 0.5 +0.0, 0.0, 1.0 +0.0, 0.0, 0.5 +TET no. 6: +0.5, 0.5, 0.0 +0.0, 1.0, 0.0 +0.0, 0.5, 0.5 +0.0, 0.5, 0.0 diff --git a/doc/tetrahedron_refinements/5-edges/edge_01-12-20-23-31_refined/01-12-20-23-31.vtk b/doc/tetrahedron_refinements/5-edges/edge_01-12-20-23-31_refined/01-12-20-23-31.vtk new file mode 100644 index 0000000..806886e --- /dev/null +++ b/doc/tetrahedron_refinements/5-edges/edge_01-12-20-23-31_refined/01-12-20-23-31.vtk @@ -0,0 +1,44 @@ +# vtk DataFile Version 2.0 +VTK LEGACY FILE FORMAT ASCII - tetrahedral sample file for H5FED test +ASCII +DATASET UNSTRUCTURED_GRID + +POINTS 9 DOUBLE +1.0 0.0 0.0 +0.5 0.0 0.5 +0.0 0.0 0.0 +0.5 0.5 0.0 +0.0 0.0 0.5 +0.0 0.5 0.0 +0.0 0.5 0.5 +0.0 0.0 1.0 +0.0 1.0 0.0 + +CELLS 7 35 +4 0 1 2 3 +4 2 1 4 3 +4 2 3 4 5 +4 5 3 4 6 +4 3 1 4 6 +4 1 6 7 4 +4 3 8 6 5 + +CELL_TYPES 7 +10 +10 +10 +10 +10 +10 +10 + +CELL_DATA 7 +SCALARS cell_attribute_data float 1 +LOOKUP_TABLE default +0 +1 +2 +3 +4 +5 +6 diff --git a/doc/tetrahedron_refinements/5-edges/edge_01-12-20-23-31_refined/01-12-20-23-31_small.png b/doc/tetrahedron_refinements/5-edges/edge_01-12-20-23-31_refined/01-12-20-23-31_small.png new file mode 100644 index 0000000000000000000000000000000000000000..2ed0e94f07b2363a732b635a3f00aab76655c07a GIT binary patch literal 12973 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 literal 0 HcmV?d00001 diff --git a/doc/tetrahedron_refinements/5-edges/edge_01-12-20-30-31_refined/01-12-20-30-31.png b/doc/tetrahedron_refinements/5-edges/edge_01-12-20-30-31_refined/01-12-20-30-31.png new file mode 100644 index 0000000000000000000000000000000000000000..94e0da3d985fcfd690187a511c1e8efadc46b8cb GIT binary patch literal 13861 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 + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/doc/tetrahedron_refinements/5-edges/edge_01-12-20-30-31_refined/01-12-20-30-31.txt b/doc/tetrahedron_refinements/5-edges/edge_01-12-20-30-31_refined/01-12-20-30-31.txt new file mode 100644 index 0000000..de7e133 --- /dev/null +++ b/doc/tetrahedron_refinements/5-edges/edge_01-12-20-30-31_refined/01-12-20-30-31.txt @@ -0,0 +1,35 @@ +TET no. 0: +0.0, 0.0, 1.0 +0.0, 0.5, 0.5 +0.0, 0.0, 0.0 +0.5, 0.0, 0.5 +TET no. 1: +0.0, 0.0, 0.0 +0.0, 0.5, 0.5 +0.0, 0.5, 0.0 +0.5, 0.0, 0.5 +TET no. 2: +0.0, 0.0, 0.0 +0.5, 0.0, 0.5 +0.0, 0.5, 0.0 +0.5, 0.0, 0.0 +TET no. 3: +0.5, 0.0, 0.0 +0.5, 0.0, 0.5 +0.0, 0.5, 0.0 +0.5, 0.5, 0.0 +TET no. 4: +0.5, 0.0, 0.5 +0.0, 0.5, 0.5 +0.0, 0.5, 0.0 +0.5, 0.5, 0.0 +TET no. 5: +0.0, 0.5, 0.5 +0.5, 0.5, 0.0 +0.0, 1.0, 0.0 +0.0, 0.5, 0.0 +TET no. 6: +0.5, 0.0, 0.5 +1.0, 0.0, 0.0 +0.5, 0.5, 0.0 +0.5, 0.0, 0.0 diff --git a/doc/tetrahedron_refinements/5-edges/edge_01-12-20-30-31_refined/01-12-20-30-31.vtk b/doc/tetrahedron_refinements/5-edges/edge_01-12-20-30-31_refined/01-12-20-30-31.vtk new file mode 100644 index 0000000..cd1d15b --- /dev/null +++ b/doc/tetrahedron_refinements/5-edges/edge_01-12-20-30-31_refined/01-12-20-30-31.vtk @@ -0,0 +1,44 @@ +# vtk DataFile Version 2.0 +VTK LEGACY FILE FORMAT ASCII - tetrahedral sample file for H5FED test +ASCII +DATASET UNSTRUCTURED_GRID + +POINTS 9 DOUBLE +0.0 0.0 1.0 +0.0 0.5 0.5 +0.0 0.0 0.0 +0.5 0.0 0.5 +0.0 0.5 0.0 +0.5 0.0 0.0 +0.5 0.5 0.0 +0.0 1.0 0.0 +1.0 0.0 0.0 + +CELLS 7 35 +4 0 1 2 3 +4 2 1 4 3 +4 2 3 4 5 +4 5 3 4 6 +4 3 1 4 6 +4 1 6 7 4 +4 3 8 6 5 + +CELL_TYPES 7 +10 +10 +10 +10 +10 +10 +10 + +CELL_DATA 7 +SCALARS cell_attribute_data float 1 +LOOKUP_TABLE default +0 +1 +2 +3 +4 +5 +6 diff --git a/doc/tetrahedron_refinements/5-edges/edge_01-12-20-30-31_refined/01-12-20-30-31_small.png b/doc/tetrahedron_refinements/5-edges/edge_01-12-20-30-31_refined/01-12-20-30-31_small.png new file mode 100644 index 0000000000000000000000000000000000000000..8db8ca8a7901f7dace55a5113649857bed1b9082 GIT binary patch literal 12074 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 T2PyCmXAlch)cHc=>ks}PoN!j& literal 0 HcmV?d00001 diff --git a/doc/tetrahedron_refinements/5-edges/edge_01-12-23-30-31_refined/01-12-23-30-31.pvsm b/doc/tetrahedron_refinements/5-edges/edge_01-12-23-30-31_refined/01-12-23-30-31.pvsm new file mode 100644 index 0000000..d5f0d5c --- /dev/null +++ b/doc/tetrahedron_refinements/5-edges/edge_01-12-23-30-31_refined/01-12-23-30-31.pvsm @@ -0,0 +1,2225 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/doc/tetrahedron_refinements/5-edges/edge_01-12-23-30-31_refined/01-12-23-30-31.txt b/doc/tetrahedron_refinements/5-edges/edge_01-12-23-30-31_refined/01-12-23-30-31.txt new file mode 100644 index 0000000..8cb4b7a --- /dev/null +++ b/doc/tetrahedron_refinements/5-edges/edge_01-12-23-30-31_refined/01-12-23-30-31.txt @@ -0,0 +1,35 @@ +TET no. 0: +0.0, 0.0, 1.0 +0.0, 0.0, 0.5 +1.0, 0.0, 0.0 +0.0, 0.5, 0.5 +TET no. 1: +1.0, 0.0, 0.0 +0.0, 0.0, 0.5 +0.5, 0.0, 0.0 +0.0, 0.5, 0.5 +TET no. 2: +1.0, 0.0, 0.0 +0.0, 0.5, 0.5 +0.5, 0.0, 0.0 +0.5, 0.5, 0.0 +TET no. 3: +0.5, 0.5, 0.0 +0.0, 0.5, 0.5 +0.5, 0.0, 0.0 +0.0, 0.5, 0.0 +TET no. 4: +0.0, 0.5, 0.5 +0.0, 0.0, 0.5 +0.5, 0.0, 0.0 +0.0, 0.5, 0.0 +TET no. 5: +0.0, 0.0, 0.5 +0.0, 0.5, 0.0 +0.0, 0.0, 0.0 +0.5, 0.0, 0.0 +TET no. 6: +0.0, 0.5, 0.5 +0.0, 1.0, 0.0 +0.0, 0.5, 0.0 +0.5, 0.5, 0.0 diff --git a/doc/tetrahedron_refinements/5-edges/edge_01-12-23-30-31_refined/01-12-23-30-31.vtk b/doc/tetrahedron_refinements/5-edges/edge_01-12-23-30-31_refined/01-12-23-30-31.vtk new file mode 100644 index 0000000..6434881 --- /dev/null +++ b/doc/tetrahedron_refinements/5-edges/edge_01-12-23-30-31_refined/01-12-23-30-31.vtk @@ -0,0 +1,44 @@ +# vtk DataFile Version 2.0 +VTK LEGACY FILE FORMAT ASCII - tetrahedral sample file for H5FED test +ASCII +DATASET UNSTRUCTURED_GRID + +POINTS 9 DOUBLE +0.0 0.0 1.0 +0.0 0.0 0.5 +1.0 0.0 0.0 +0.0 0.5 0.5 +0.5 0.0 0.0 +0.5 0.5 0.0 +0.0 0.5 0.0 +0.0 0.0 0.0 +0.0 1.0 0.0 + +CELLS 7 35 +4 0 1 2 3 +4 2 1 4 3 +4 2 3 4 5 +4 5 3 4 6 +4 3 1 4 6 +4 1 6 7 4 +4 3 8 6 5 + +CELL_TYPES 7 +10 +10 +10 +10 +10 +10 +10 + +CELL_DATA 7 +SCALARS cell_attribute_data float 1 +LOOKUP_TABLE default +0 +1 +2 +3 +4 +5 +6 diff --git a/doc/tetrahedron_refinements/5-edges/edge_01-12-23-30-31_refined/01-12-23-30-31_small.png b/doc/tetrahedron_refinements/5-edges/edge_01-12-23-30-31_refined/01-12-23-30-31_small.png new file mode 100644 index 0000000000000000000000000000000000000000..f8f78f725a535e0b8129ae355681b079def3b2da GIT binary patch literal 12589 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 UH(Azyy5az2C6y#9#7#c@FC>xzbN~PV literal 0 HcmV?d00001 diff --git a/doc/tetrahedron_refinements/5-edges/edge_01-20-23-30-31_refined/01-20-23-30-31.png b/doc/tetrahedron_refinements/5-edges/edge_01-20-23-30-31_refined/01-20-23-30-31.png new file mode 100644 index 0000000000000000000000000000000000000000..4682b53a8d8889b468029c228be6e8cec3040240 GIT binary patch literal 14640 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 literal 0 HcmV?d00001 diff --git a/doc/tetrahedron_refinements/5-edges/edge_01-20-23-30-31_refined/01-20-23-30-31.pvsm b/doc/tetrahedron_refinements/5-edges/edge_01-20-23-30-31_refined/01-20-23-30-31.pvsm new file mode 100644 index 0000000..aabb801 --- /dev/null +++ b/doc/tetrahedron_refinements/5-edges/edge_01-20-23-30-31_refined/01-20-23-30-31.pvsm @@ -0,0 +1,2225 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/doc/tetrahedron_refinements/5-edges/edge_01-20-23-30-31_refined/01-20-23-30-31.txt b/doc/tetrahedron_refinements/5-edges/edge_01-20-23-30-31_refined/01-20-23-30-31.txt new file mode 100644 index 0000000..e3c5d37 --- /dev/null +++ b/doc/tetrahedron_refinements/5-edges/edge_01-20-23-30-31_refined/01-20-23-30-31.txt @@ -0,0 +1,35 @@ +TET no. 0: +0.0, 1.0, 0.0 +0.0, 0.5, 0.0 +0.0, 0.0, 1.0 +0.5, 0.5, 0.0 +TET no. 1: +0.0, 0.0, 1.0 +0.0, 0.5, 0.0 +0.0, 0.0, 0.5 +0.5, 0.5, 0.0 +TET no. 2: +0.0, 0.0, 1.0 +0.5, 0.5, 0.0 +0.0, 0.0, 0.5 +0.5, 0.0, 0.5 +TET no. 3: +0.5, 0.0, 0.5 +0.5, 0.5, 0.0 +0.0, 0.0, 0.5 +0.5, 0.0, 0.0 +TET no. 4: +0.5, 0.5, 0.0 +0.0, 0.5, 0.0 +0.0, 0.0, 0.5 +0.5, 0.0, 0.0 +TET no. 5: +0.0, 0.5, 0.0 +0.5, 0.0, 0.0 +0.0, 0.0, 0.0 +0.0, 0.0, 0.5 +TET no. 6: +0.5, 0.5, 0.0 +1.0, 0.0, 0.0 +0.5, 0.0, 0.0 +0.5, 0.0, 0.5 diff --git a/doc/tetrahedron_refinements/5-edges/edge_01-20-23-30-31_refined/01-20-23-30-31.vtk b/doc/tetrahedron_refinements/5-edges/edge_01-20-23-30-31_refined/01-20-23-30-31.vtk new file mode 100644 index 0000000..cda05ff --- /dev/null +++ b/doc/tetrahedron_refinements/5-edges/edge_01-20-23-30-31_refined/01-20-23-30-31.vtk @@ -0,0 +1,44 @@ +# vtk DataFile Version 2.0 +VTK LEGACY FILE FORMAT ASCII - tetrahedral sample file for H5FED test +ASCII +DATASET UNSTRUCTURED_GRID + +POINTS 9 DOUBLE +0.0 1.0 0.0 +0.0 0.5 0.0 +0.0 0.0 1.0 +0.5 0.5 0.0 +0.0 0.0 0.5 +0.5 0.0 0.5 +0.5 0.0 0.0 +0.0 0.0 0.0 +1.0 0.0 0.0 + +CELLS 7 35 +4 0 1 2 3 +4 2 1 4 3 +4 2 3 4 5 +4 5 3 4 6 +4 3 1 4 6 +4 1 6 7 4 +4 3 8 6 5 + +CELL_TYPES 7 +10 +10 +10 +10 +10 +10 +10 + +CELL_DATA 7 +SCALARS cell_attribute_data float 1 +LOOKUP_TABLE default +0 +1 +2 +3 +4 +5 +6 diff --git a/doc/tetrahedron_refinements/5-edges/edge_01-20-23-30-31_refined/01-20-23-30-31_small.png b/doc/tetrahedron_refinements/5-edges/edge_01-20-23-30-31_refined/01-20-23-30-31_small.png new file mode 100644 index 0000000000000000000000000000000000000000..78c874ecb493cb6d7b90ecac446dcdd9d8f06782 GIT binary patch literal 13442 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 literal 0 HcmV?d00001 diff --git a/doc/tetrahedron_refinements/5-edges/edge_12-20-23-30-31_refined/12-20-23-30-31.png b/doc/tetrahedron_refinements/5-edges/edge_12-20-23-30-31_refined/12-20-23-30-31.png new file mode 100644 index 0000000000000000000000000000000000000000..f1b0d7d311bc02b1f5a1ab2c690c35b7d2f57eb8 GIT binary patch literal 14580 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 Fe*mgq79#)v literal 0 HcmV?d00001 diff --git a/doc/tetrahedron_refinements/5-edges/edge_12-20-23-30-31_refined/12-20-23-30-31.pvsm b/doc/tetrahedron_refinements/5-edges/edge_12-20-23-30-31_refined/12-20-23-30-31.pvsm new file mode 100644 index 0000000..dc3b819 --- /dev/null +++ b/doc/tetrahedron_refinements/5-edges/edge_12-20-23-30-31_refined/12-20-23-30-31.pvsm @@ -0,0 +1,2225 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/doc/tetrahedron_refinements/5-edges/edge_12-20-23-30-31_refined/12-20-23-30-31.txt b/doc/tetrahedron_refinements/5-edges/edge_12-20-23-30-31_refined/12-20-23-30-31.txt new file mode 100644 index 0000000..59c2432 --- /dev/null +++ b/doc/tetrahedron_refinements/5-edges/edge_12-20-23-30-31_refined/12-20-23-30-31.txt @@ -0,0 +1,35 @@ +TET no. 0: +0.0, 1.0, 0.0 +0.0, 0.5, 0.5 +1.0, 0.0, 0.0 +0.0, 0.5, 0.0 +TET no. 1: +1.0, 0.0, 0.0 +0.0, 0.5, 0.5 +0.5, 0.0, 0.5 +0.0, 0.5, 0.0 +TET no. 2: +1.0, 0.0, 0.0 +0.0, 0.5, 0.0 +0.5, 0.0, 0.5 +0.5, 0.0, 0.0 +TET no. 3: +0.5, 0.0, 0.0 +0.0, 0.5, 0.0 +0.5, 0.0, 0.5 +0.0, 0.0, 0.5 +TET no. 4: +0.0, 0.5, 0.0 +0.0, 0.5, 0.5 +0.5, 0.0, 0.5 +0.0, 0.0, 0.5 +TET no. 5: +0.0, 0.5, 0.5 +0.0, 0.0, 0.5 +0.0, 0.0, 1.0 +0.5, 0.0, 0.5 +TET no. 6: +0.0, 0.5, 0.0 +0.0, 0.0, 0.0 +0.0, 0.0, 0.5 +0.5, 0.0, 0.0 diff --git a/doc/tetrahedron_refinements/5-edges/edge_12-20-23-30-31_refined/12-20-23-30-31.vtk b/doc/tetrahedron_refinements/5-edges/edge_12-20-23-30-31_refined/12-20-23-30-31.vtk new file mode 100644 index 0000000..a00d37d --- /dev/null +++ b/doc/tetrahedron_refinements/5-edges/edge_12-20-23-30-31_refined/12-20-23-30-31.vtk @@ -0,0 +1,44 @@ +# vtk DataFile Version 2.0 +VTK LEGACY FILE FORMAT ASCII - tetrahedral sample file for H5FED test +ASCII +DATASET UNSTRUCTURED_GRID + +POINTS 9 DOUBLE +0.0 1.0 0.0 +0.0 0.5 0.5 +1.0 0.0 0.0 +0.0 0.5 0.0 +0.5 0.0 0.5 +0.5 0.0 0.0 +0.0 0.0 0.5 +0.0 0.0 1.0 +0.0 0.0 0.0 + +CELLS 7 35 +4 0 1 2 3 +4 2 1 4 3 +4 2 3 4 5 +4 5 3 4 6 +4 3 1 4 6 +4 1 6 7 4 +4 3 8 6 5 + +CELL_TYPES 7 +10 +10 +10 +10 +10 +10 +10 + +CELL_DATA 7 +SCALARS cell_attribute_data float 1 +LOOKUP_TABLE default +0 +1 +2 +3 +4 +5 +6 diff --git a/doc/tetrahedron_refinements/5-edges/edge_12-20-23-30-31_refined/12-20-23-30-31_small.png b/doc/tetrahedron_refinements/5-edges/edge_12-20-23-30-31_refined/12-20-23-30-31_small.png new file mode 100644 index 0000000000000000000000000000000000000000..0fee2a67d4175ffea8011971b295a83b0bc2f585 GIT binary patch literal 13160 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 A!vFvP literal 0 HcmV?d00001 diff --git a/doc/tetrahedron_refinements/6-edges/edge_01-12-20-23-30-31_refined/01-12-20-23-30-31.aux b/doc/tetrahedron_refinements/6-edges/edge_01-12-20-23-30-31_refined/01-12-20-23-30-31.aux new file mode 100644 index 0000000..f23e546 --- /dev/null +++ b/doc/tetrahedron_refinements/6-edges/edge_01-12-20-23-30-31_refined/01-12-20-23-30-31.aux @@ -0,0 +1 @@ +\relax diff --git a/doc/tetrahedron_refinements/6-edges/edge_01-12-20-23-30-31_refined/01-12-20-23-30-31.log b/doc/tetrahedron_refinements/6-edges/edge_01-12-20-23-30-31_refined/01-12-20-23-30-31.log new file mode 100644 index 0000000..1ed57a0 --- /dev/null +++ b/doc/tetrahedron_refinements/6-edges/edge_01-12-20-23-30-31_refined/01-12-20-23-30-31.log @@ -0,0 +1,172 @@ +This is pdfeTeX, Version 3.141592-1.21a-2.2 (Web2C 7.5.4) (format=pdflatex 2007.12.27) 11 APR 2008 16:25 +entering extended mode +**tets.tex +(./tets.tex +LaTeX2e <2003/12/01> +Babel and hyphenation patterns for american, french, german, ngerman, b +ahasa, basque, bulgarian, catalan, croatian, czech, danish, dutch, esperanto, e +stonian, finnish, greek, icelandic, irish, italian, latin, magyar, norsk, polis +h, portuges, romanian, russian, serbian, slovak, slovene, spanish, swedish, tur +kish, ukrainian, nohyphenation, loaded. +(/sw/share/texmf-dist/tex/latex/base/article.cls +Document Class: article 2004/02/16 v1.4f Standard LaTeX document class +(/sw/share/texmf-dist/tex/latex/base/size12.clo +File: size12.clo 2004/02/16 v1.4f Standard LaTeX file (size option) +) +\c@part=\count79 +\c@section=\count80 +\c@subsection=\count81 +\c@subsubsection=\count82 +\c@paragraph=\count83 +\c@subparagraph=\count84 +\c@figure=\count85 +\c@table=\count86 +\abovecaptionskip=\skip41 +\belowcaptionskip=\skip42 +\bibindent=\dimen102 +) +(/sw/share/texmf-dist/tex/latex/graphics/graphicx.sty +Package: graphicx 1999/02/16 v1.0f Enhanced LaTeX Graphics (DPC,SPQR) + +(/sw/share/texmf-dist/tex/latex/graphics/keyval.sty +Package: keyval 1999/03/16 v1.13 key=value parser (DPC) +\KV@toks@=\toks14 +) +(/sw/share/texmf-dist/tex/latex/graphics/graphics.sty +Package: graphics 2001/07/07 v1.0n Standard LaTeX Graphics (DPC,SPQR) + +(/sw/share/texmf-dist/tex/latex/graphics/trig.sty +Package: trig 1999/03/16 v1.09 sin cos tan (DPC) +) +(/sw/share/texmf-dist/tex/latex/graphics/graphics.cfg +File: graphics.cfg 2005/02/03 v1.3 graphics configuration of teTeX/TeXLive +) +Package graphics Info: Driver file: pdftex.def on input line 80. + +(/sw/share/texmf-dist/tex/latex/graphics/pdftex.def +File: pdftex.def 2002/06/19 v0.03k graphics/color for pdftex +\Gread@gobject=\count87 +)) +\Gin@req@height=\dimen103 +\Gin@req@width=\dimen104 +) +(/sw/share/texmf-dist/tex/latex/geometry/geometry.sty +Package: geometry 2002/07/08 v3.2 Page Geometry +\Gm@cnth=\count88 +\Gm@cntv=\count89 +\c@Gm@tempcnt=\count90 +\Gm@bindingoffset=\dimen105 +\Gm@wd@mp=\dimen106 +\Gm@odd@mp=\dimen107 +\Gm@even@mp=\dimen108 +\Gm@dimlist=\toks15 + +(/sw/share/texmf-dist/tex/latex/geometry/geometry.cfg)) (./tets.aux) +\openout1 = `tets.aux'. + +LaTeX Font Info: Checking defaults for OML/cmm/m/it on input line 7. +LaTeX Font Info: ... okay on input line 7. +LaTeX Font Info: Checking defaults for T1/cmr/m/n on input line 7. +LaTeX Font Info: ... okay on input line 7. +LaTeX Font Info: Checking defaults for OT1/cmr/m/n on input line 7. +LaTeX Font Info: ... okay on input line 7. +LaTeX Font Info: Checking defaults for OMS/cmsy/m/n on input line 7. +LaTeX Font Info: ... okay on input line 7. +LaTeX Font Info: Checking defaults for OMX/cmex/m/n on input line 7. +LaTeX Font Info: ... okay on input line 7. +LaTeX Font Info: Checking defaults for U/cmr/m/n on input line 7. +LaTeX Font Info: ... okay on input line 7. + +(/sw/share/texmf-dist/tex/context/base/supp-pdf.tex +(/sw/share/texmf-dist/tex/context/base/supp-mis.tex +loading : Context Support Macros / Miscellaneous (2004.10.26) +\protectiondepth=\count91 +\scratchcounter=\count92 +\scratchtoks=\toks16 +\scratchdimen=\dimen109 +\scratchskip=\skip43 +\scratchmuskip=\muskip10 +\scratchbox=\box26 +\scratchread=\read1 +\scratchwrite=\write3 +\zeropoint=\dimen110 +\onepoint=\dimen111 +\onebasepoint=\dimen112 +\minusone=\count93 +\thousandpoint=\dimen113 +\onerealpoint=\dimen114 +\emptytoks=\toks17 +\nextbox=\box27 +\nextdepth=\dimen115 +\everyline=\toks18 +\!!counta=\count94 +\!!countb=\count95 +\recursecounter=\count96 +) +loading : Context Support Macros / PDF (2004.03.26) +\nofMPsegments=\count97 +\nofMParguments=\count98 +\MPscratchCnt=\count99 +\MPscratchDim=\dimen116 +\MPnumerator=\count100 +\everyMPtoPDFconversion=\toks19 +) +-------------------- Geometry parameters +paper: a4paper +landscape: -- +twocolumn: -- +twoside: -- +asymmetric: -- +h-parts: 28.45274pt, 540.60239pt, 28.45274pt +v-parts: 28.45274pt, 773.915pt, 42.67911pt +hmarginratio: -- +vmarginratio: 2:3 +lines: -- +heightrounded: -- +bindingoffset: 0.0pt +truedimen: -- +includehead: -- +includefoot: -- +includemp: -- +driver: pdftex +-------------------- Page layout dimensions and switches +\paperwidth 597.50787pt +\paperheight 845.04684pt +\textwidth 540.60239pt +\textheight 773.915pt +\oddsidemargin -43.81725pt +\evensidemargin -43.81725pt +\topmargin -43.81725pt +\headheight 0.0pt +\headsep 0.0pt +\footskip 0.0pt +\marginparwidth 35.0pt +\marginparsep 10.0pt +\columnsep 10.0pt +\skip\footins 10.8pt plus 4.0pt minus 2.0pt +\hoffset 0.0pt +\voffset 0.0pt +\mag 1000 + +(1in=72.27pt, 1cm=28.45pt) +----------------------- + +File: tets.png Graphic file (type png) + [1 + +{/sw/var/lib/texmf/fonts/map/pdftex/updmap/pdftex.map} <./tets.png>] (./tets.au +x) ) +Here is how much of TeX's memory you used: + 1200 strings out of 94500 + 15321 string characters out of 1176113 + 65163 words of memory out of 1500000 + 4420 multiletter control sequences out of 10000+50000 + 3938 words of font info for 15 fonts, out of 1200000 for 2000 + 580 hyphenation exceptions out of 8191 + 25i,4n,19p,220b,105s stack positions out of 5000i,500n,6000p,200000b,5000s +PDF statistics: + 8 PDF objects out of 65536 + 0 named destinations out of 20000 + 6 words of extra memory for PDF output out of 65536 + +Output written on tets.pdf (1 page, 15748 bytes). diff --git a/doc/tetrahedron_refinements/6-edges/edge_01-12-20-23-30-31_refined/01-12-20-23-30-31.pdf b/doc/tetrahedron_refinements/6-edges/edge_01-12-20-23-30-31_refined/01-12-20-23-30-31.pdf new file mode 100644 index 0000000000000000000000000000000000000000..ce3653291d088c8dd5b96dc26c0d2a68398bc8ee GIT binary patch literal 15748 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 U$kX;nC^!%&`^|QhHq1l+3(DIM!2kdN literal 0 HcmV?d00001 diff --git a/doc/tetrahedron_refinements/6-edges/edge_01-12-20-23-30-31_refined/01-12-20-23-30-31.pvsm b/doc/tetrahedron_refinements/6-edges/edge_01-12-20-23-30-31_refined/01-12-20-23-30-31.pvsm new file mode 100644 index 0000000..d5c68bb --- /dev/null +++ b/doc/tetrahedron_refinements/6-edges/edge_01-12-20-23-30-31_refined/01-12-20-23-30-31.pvsm @@ -0,0 +1,2225 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/doc/tetrahedron_refinements/6-edges/edge_01-12-20-23-30-31_refined/01-12-20-23-30-31.tex b/doc/tetrahedron_refinements/6-edges/edge_01-12-20-23-30-31_refined/01-12-20-23-30-31.tex new file mode 100644 index 0000000..1080b60 --- /dev/null +++ b/doc/tetrahedron_refinements/6-edges/edge_01-12-20-23-30-31_refined/01-12-20-23-30-31.tex @@ -0,0 +1,11 @@ +\documentclass[a4paper,12pt]{article} + +\usepackage{graphicx} +\thispagestyle{empty} +\textwidth 190mm +\usepackage[left=10mm,top=10mm,right=10mm,nohead,nofoot]{geometry} +\begin{document} +\includegraphics[width=180mm]{tets.png} + +Refined edges: 01 12 20 23 30 31 +\end{document} diff --git a/doc/tetrahedron_refinements/6-edges/edge_01-12-20-23-30-31_refined/01-12-20-23-30-31.tex.orig b/doc/tetrahedron_refinements/6-edges/edge_01-12-20-23-30-31_refined/01-12-20-23-30-31.tex.orig new file mode 100644 index 0000000..1080b60 --- /dev/null +++ b/doc/tetrahedron_refinements/6-edges/edge_01-12-20-23-30-31_refined/01-12-20-23-30-31.tex.orig @@ -0,0 +1,11 @@ +\documentclass[a4paper,12pt]{article} + +\usepackage{graphicx} +\thispagestyle{empty} +\textwidth 190mm +\usepackage[left=10mm,top=10mm,right=10mm,nohead,nofoot]{geometry} +\begin{document} +\includegraphics[width=180mm]{tets.png} + +Refined edges: 01 12 20 23 30 31 +\end{document} diff --git a/doc/tetrahedron_refinements/6-edges/edge_01-12-20-23-30-31_refined/01-12-20-23-30-31.txt b/doc/tetrahedron_refinements/6-edges/edge_01-12-20-23-30-31_refined/01-12-20-23-30-31.txt new file mode 100644 index 0000000..0a450ad --- /dev/null +++ b/doc/tetrahedron_refinements/6-edges/edge_01-12-20-23-30-31_refined/01-12-20-23-30-31.txt @@ -0,0 +1,40 @@ +TET no. 0: +0.0, 1.0, 0.0 +0.0, 0.5, 0.5 +0.5, 0.5, 0.0 +0.0, 0.5, 0.0 +TET no. 1: +1.0, 0.0, 0.0 +0.5, 0.5, 0.0 +0.5, 0.0, 0.5 +0.5, 0.0, 0.0 +TET no. 2: +0.0, 0.0, 1.0 +0.5, 0.0, 0.5 +0.0, 0.5, 0.5 +0.0, 0.0, 0.5 +TET no. 3: +0.0, 0.5, 0.0 +0.0, 0.0, 0.5 +0.5, 0.0, 0.0 +0.0, 0.0, 0.0 +TET no. 4: +0.5, 0.5, 0.0 +0.0, 0.5, 0.5 +0.5, 0.0, 0.5 +0.0, 0.5, 0.0 +TET no. 5: +0.0, 0.5, 0.0 +0.0, 0.0, 0.5 +0.0, 0.5, 0.5 +0.5, 0.0, 0.5 +TET no. 6: +0.5, 0.0, 0.0 +0.5, 0.0, 0.5 +0.0, 0.0, 0.5 +0.0, 0.5, 0.0 +TET no. 7: +0.5, 0.5, 0.0 +0.5, 0.0, 0.0 +0.0, 0.5, 0.0 +0.5, 0.0, 0.5 diff --git a/doc/tetrahedron_refinements/6-edges/edge_01-12-20-23-30-31_refined/01-12-20-23-30-31.vtk b/doc/tetrahedron_refinements/6-edges/edge_01-12-20-23-30-31_refined/01-12-20-23-30-31.vtk new file mode 100644 index 0000000..5d70914 --- /dev/null +++ b/doc/tetrahedron_refinements/6-edges/edge_01-12-20-23-30-31_refined/01-12-20-23-30-31.vtk @@ -0,0 +1,48 @@ +# vtk DataFile Version 2.0 +VTK LEGACY FILE FORMAT ASCII - tetrahedral sample file for H5FED test +ASCII +DATASET UNSTRUCTURED_GRID + +POINTS 10 DOUBLE +0.0 1.0 0.0 +0.0 0.5 0.5 +0.5 0.5 0.0 +0.0 0.5 0.0 +1.0 0.0 0.0 +0.5 0.0 0.5 +0.5 0.0 0.0 +0.0 0.0 1.0 +0.0 0.0 0.5 +0.0 0.0 0.0 + +CELLS 8 40 +4 0 1 2 3 +4 4 2 5 6 +4 7 5 1 8 +4 3 8 6 9 +4 2 1 5 3 +4 3 8 1 5 +4 6 5 8 3 +4 2 6 3 5 + +CELL_TYPES 8 +10 +10 +10 +10 +10 +10 +10 +10 + +CELL_DATA 8 +SCALARS cell_attribute_data float 1 +LOOKUP_TABLE default +0 +1 +2 +3 +4 +5 +6 +7 diff --git a/doc/tetrahedron_refinements/6-edges/edge_01-12-20-23-30-31_refined/01-12-20-23-30-31_small.png b/doc/tetrahedron_refinements/6-edges/edge_01-12-20-23-30-31_refined/01-12-20-23-30-31_small.png new file mode 100644 index 0000000000000000000000000000000000000000..53be1d107dc6b8c311bcbffc970bd701c7e77ee5 GIT binary patch literal 12561 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 "${fname_texfile}" <<-EOF +\documentclass[a4paper,12pt]{article} + +\usepackage{graphicx} +\thispagestyle{empty} +\textwidth 190mm +\usepackage[left=10mm,top=10mm,right=10mm,nohead,nofoot]{geometry} +\begin{document} +\includegraphics[width=180mm]{${fname_image}} + +${annotation} +\end{document} +EOF +} + +function compile_texfile() { + local -r fname_texfile=$1 + + pdflatex "${fname_texfile}" +} + +fname_image="tets.png" +fname_texfile=${fname_image%.*}.tex +annotation=${PWD##*/} +annotation=${annotation//[a-z_]} +annotation="Refined edges: ${annotation//-/ }" + +write_file "${fname_texfile}" "${fname_image}" "${annotation}" +compile_texfile "${fname_texfile}" diff --git a/doc/tetrahedron_refinements/6-edges/edge_01-12-20-23-30-31_refined/output_file.jpg b/doc/tetrahedron_refinements/6-edges/edge_01-12-20-23-30-31_refined/output_file.jpg new file mode 100644 index 0000000000000000000000000000000000000000..7b9e33a51179badd1f36b084821b08caf599840f GIT binary patch literal 29397 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 literal 0 HcmV?d00001 diff --git a/doc/tetrahedron_refinements/README b/doc/tetrahedron_refinements/README new file mode 100644 index 0000000..879eaea --- /dev/null +++ b/doc/tetrahedron_refinements/README @@ -0,0 +1,5 @@ +Add annotation to image: + +$ convert -font helvetica -fill black -pointsize 24 \ + -draw "text 10,30 'Refined edges: 01 12 20 23 30 31'" \ + tets.png output_file.jpg diff --git a/doc/tetrahedron_refinements/text2vtk.py b/doc/tetrahedron_refinements/text2vtk.py new file mode 100755 index 0000000..f4f4285 --- /dev/null +++ b/doc/tetrahedron_refinements/text2vtk.py @@ -0,0 +1,76 @@ +#!/usr/bin/python + +import sys +import re + +pts = [] +tet = [] +tets = [] +tet_no = 0 +fh = open ( sys.argv[1] ) + +def append_tet ( tet ): + if tet == []: + return + if len(tet) != 4: + print tet + print ( "Wrong number of points in tet %d!" % len ( tets ) ) + sys.exit ( 1 ) + tets.append ( tet ) + +def write_vtk_header (): + print "# vtk DataFile Version 2.0" + print "VTK LEGACY FILE FORMAT ASCII - tetrahedral sample file for H5FED test" + print "ASCII" + print "DATASET UNSTRUCTURED_GRID" + print + +def write_vtk_points_double ( pts ): + print "POINTS %d DOUBLE" % ( len(pts) ) + for pt in pts: + print "%s %s %s" % ( pt[0], pt[1], pt[2] ) + print + +def write_vtk_cells ( cells ): + num_cells = len ( cells ) + size = num_cells + for cell in cells: + size += len ( cell ) + print "CELLS %d %d" % ( num_cells, size ) + for cell in cells: + print "%d\t" % (len(cell)), + for el in cell: + print "%d " % (el), + print + print + +def write_vtk_cell_types ( cells ): + print "CELL_TYPES %d" % ( len(cells) ) + for cell in cells: + print "10" + print + +def write_vtk_fooder ( cells ): + print "CELL_DATA %d" % ( len(cells) ) + print "SCALARS cell_attribute_data float 1" + print "LOOKUP_TABLE default" + for i in range(len(cells)): + print "%d" % (i) + +for line in fh: + line = line.rstrip('\n') + if line[0:3] == "TET": + append_tet ( tet ) + tet = [] + else: + pt = re.sub ( ' ', '', line).split(',') + if not pt in pts: + pts.append ( pt ) + tet.append ( pts.index ( pt ) ) + +append_tet ( tet ) +write_vtk_header() +write_vtk_points_double ( pts ) +write_vtk_cells ( tets ) +write_vtk_cell_types ( tets ) +write_vtk_fooder ( tets ) diff --git a/examples/H5/Makefile.am b/examples/H5/Makefile.am new file mode 100644 index 0000000..4ec6e1a --- /dev/null +++ b/examples/H5/Makefile.am @@ -0,0 +1,28 @@ +AM_CPPFLAGS += -I${abs_top_builddir}/src/include +FFLAGS += -cpp $(AM_CPPFLAGS) +LDFLAGS += -L${abs_top_builddir}/src/lib + +LDADD = + +if ENABLE_FORTRAN +LDADD += -lH5hutF +endif + +LDADD += -lH5hut + +noinst_PROGRAMS = + +if ENABLE_C +noinst_PROGRAMS += openclose +endif + +if ENABLE_FORTRAN +noinst_PROGRAMS += +endif + +EXTRA_PROGRAMS = openclose + +openclose_SOURCES = openclose.c + +%.o : %.f90 + $(FC) $(FFLAGS) -c $< diff --git a/examples/H5/openclose.c b/examples/H5/openclose.c new file mode 100644 index 0000000..8717166 --- /dev/null +++ b/examples/H5/openclose.c @@ -0,0 +1,34 @@ +#include "H5hut.h" + +#if !defined (PARALLEL_IO) +#define MPI_Init(argc, argv) +#define MPI_Comm_size(comm, nprocs) { *nprocs = 1; } +#define MPI_Comm_rank(comm, myproc) { *myproc = 0; } +#define MPI_Finalize() +#define MPI_COMM_WORLD (0) +#endif + +int +main ( + int argc, + char** argv + ) { + MPI_Comm comm = MPI_COMM_WORLD; + + int myproc; + int nprocs; + MPI_Init (&argc, &argv); + MPI_Comm_size (comm, &nprocs); + MPI_Comm_rank (comm, &myproc); + + h5_file_t f = H5OpenFile ("testfile.h5", H5_O_WRONLY, comm); + H5CloseFile (f); + + h5_prop_t prop = H5CreateFileProp (); + H5SetPropFileMPIO (prop, &comm); + f = H5OpenFile2 ("testfile.h5", H5_O_WRONLY, prop); + H5CloseProp (prop); + + MPI_Finalize (); + return 0; +} diff --git a/examples/H5Block/H5BlockExample.pbs b/examples/H5Block/H5BlockExample.pbs new file mode 100644 index 0000000..a11d34c --- /dev/null +++ b/examples/H5Block/H5BlockExample.pbs @@ -0,0 +1,7 @@ +#!/bin/bash +#PBS -l size=16 +#PBS -j oe + +cd /scratch/agsell/H5Part/test +yod -np 16 ./H5BlockParTestScalarField -w -g + diff --git a/examples/H5Block/H5BlockExampleF.f90 b/examples/H5Block/H5BlockExampleF.f90 new file mode 100644 index 0000000..d748bab --- /dev/null +++ b/examples/H5Block/H5BlockExampleF.f90 @@ -0,0 +1,624 @@ +Program H5BlockParTestScalarFieldF + IMPLICIT NONE +#ifdef PARALLEL_IO + INCLUDE 'mpif.h' +#endif + INCLUDE 'H5hutF.h' + + INTEGER :: nargs = 0 + INTEGER :: myproc = 0 + INTEGER :: nprocs = 1 + INTEGER :: comm = 0 + INTEGER :: mpi_err + INTEGER*8 :: h5_err + INTEGER :: i + CHARACTER(LEN=32) :: arg_str + INTEGER :: opt_read = 0 + INTEGER :: opt_write = 0 + INTEGER :: opt_with_ghosts = 0 + CHARACTER(LEN=128) :: fname + INTEGER*8 :: layout (6) + INTEGER*8 :: layout1 (6,1) + INTEGER*8 :: layout8 (6,8) + INTEGER*8 :: layout8g (6,8) + INTEGER*8 :: layout16 (6,16) + INTEGER*8 :: layout16g(6,16) + INTEGER*8 :: layout32 (6,32) + INTEGER*8 :: layout32g(6,32) + + DATA layout1 / 1,64, 1,64, 1,512 / + + DATA layout8 / 1,64, 1,64, 1, 64, & + 1,64, 1,64, 65,128, & + 1,64, 1,64, 129,192, & + 1,64, 1,64, 193,256, & + 1,64, 1,64, 257,320, & + 1,64, 1,64, 321,384, & + 1,64, 1,64, 385,448, & + 1,64, 1,64, 449,512 / + + DATA layout8g / 1,64, 1,64, 1, 65, & + 1,64, 1,64, 64,129, & + 1,64, 1,64, 128,193, & + 1,64, 1,64, 192,257, & + 1,64, 1,64, 256,321, & + 1,64, 1,64, 320,385, & + 1,64, 1,64, 384,449, & + 1,64, 1,64, 448,512 / + + DATA layout16 / 1,64, 1,32, 1, 64, & + 1,64, 33,64, 1, 64, & + 1,64, 1,32, 65,128, & + 1,64, 33,64, 65,128, & + 1,64, 1,32, 129,192, & + 1,64, 33,64, 129,192, & + 1,64, 1,32, 193,256, & + 1,64, 33,64, 193,256, & + 1,64, 1,32, 257,320, & + 1,64, 33,64, 257,320, & + 1,64, 1,32, 321,384, & + 1,64, 33,64, 321,384, & + 1,64, 1,32, 385,448, & + 1,64, 33,64, 385,448, & + 1,64, 1,32, 449,512, & + 1,64, 33,64, 449,512 / + + DATA layout16g/ 1,64, 1,33, 1, 65, & + 1,64, 32,64, 1, 65, & + 1,64, 1,33, 64,129, & + 1,64, 32,64, 64,129, & + 1,64, 1,33, 128,193, & + 1,64, 32,64, 128,193, & + 1,64, 1,33, 192,257, & + 1,64, 32,64, 192,257, & + 1,64, 1,33, 256,321, & + 1,64, 32,64, 256,321, & + 1,64, 1,33, 320,385, & + 1,64, 32,64, 320,385, & + 1,64, 1,33, 384,449, & + 1,64, 32,64, 384,449, & + 1,64, 1,33, 448,512, & + 1,64, 32,64, 448,512 / + + DATA layout32 / 1,32, 1,32, 1, 64, & + 1,32, 33,64, 1, 64, & + 33,64, 1,32, 1, 64, & + 33,64, 33,64, 1, 64, & + 1,32, 1,32, 65,128, & + 1,32, 33,64, 65,128, & + 33,64, 1,32, 65,128, & + 33,64, 33,64, 65,128, & + 1,32, 1,32, 129,192, & + 1,32, 33,64, 129,192, & + 33,64, 1,32, 129,192, & + 33,64, 33,64, 129,192, & + 1,32, 1,32, 193,256, & + 1,32, 33,64, 193,256, & + 33,64, 1,32, 193,256, & + 33,64, 33,64, 193,256, & + 1,32, 1,32, 257,320, & + 1,32, 33,64, 257,320, & + 33,64, 1,32, 257,320, & + 33,64, 33,64, 257,320, & + 1,32, 1,32, 321,384, & + 1,32, 33,64, 321,384, & + 33,64, 1,32, 321,384, & + 33,64, 33,64, 321,384, & + 1,32, 1,32, 385,448, & + 1,32, 33,64, 385,448, & + 33,64, 1,32, 385,448, & + 33,64, 33,64, 385,448, & + 1,32, 1,32, 449,512, & + 1,32, 33,64, 449,512, & + 33,64, 1,32, 449,512, & + 33,64, 33,64, 449,512 / + + DATA layout32G/ 1,33, 1,33, 1, 65, & + 1,33, 32,64, 1, 65, & + 32,64, 1,33, 1, 65, & + 32,64, 32,64, 1, 65, & + 1,33, 1,33, 64,129, & + 1,33, 32,64, 64,129, & + 32,64, 1,33, 64,129, & + 32,64, 32,64, 64,129, & + 1,33, 1,33, 128,193, & + 1,33, 32,64, 128,193, & + 32,64, 1,33, 128,193, & + 32,64, 32,64, 128,193, & + 1,33, 1,33, 192,257, & + 1,33, 32,64, 192,257, & + 32,64, 1,33, 192,257, & + 32,64, 32,64, 192,257, & + 1,33, 1,33, 256,321, & + 1,33, 32,64, 256,321, & + 32,64, 1,33, 256,321, & + 32,64, 32,64, 256,321, & + 1,33, 1,33, 320,385, & + 1,33, 32,64, 320,385, & + 32,64, 1,33, 320,385, & + 32,64, 32,64, 320,385, & + 1,33, 1,33, 384,449, & + 1,33, 32,64, 384,449, & + 32,64, 1,33, 384,449, & + 32,64, 32,64, 384,449, & + 1,33, 1,33, 448,512, & + 1,33, 32,64, 448,512, & + 32,64, 1,33, 448,512, & + 32,64, 32,64, 448,512 / + nargs = IARGC () + IF (nargs == 0) THEN + PRINT *, "Usage: H5BlockExampleF -w | -r [-g]" + CALL EXIT (1) + END IF + DO i = 1, nargs + CALL GETARG ( i, arg_str ) + IF ( arg_str == "-r" ) THEN + opt_read = 1 + ELSE IF ( arg_str == "-w" ) THEN + opt_write = 1 + ELSE IF ( arg_str == "-g" ) THEN + opt_with_ghosts = 1 + ELSE + PRINT *, "Illegal option ", arg_str, "\n" + PRINT *, "Usage: H5BlockExampleF -w | -r [-g]" + CALL EXIT (1) + END IF + END DO + +#ifdef PARALLEL_IO + comm = MPI_COMM_WORLD + CALL MPI_Init ( mpi_err ) + comm = MPI_COMM_WORLD + CALL MPI_Comm_rank ( comm, myproc, mpi_err) + CALL MPI_Comm_size ( comm, nprocs, mpi_err) +#endif + SELECTCASE ( nprocs ) + CASE ( 1 ) + fname = "blockfile1.h5" + layout = layout1 ( :, myproc+1 ) + + CASE ( 8 ) + IF ( opt_with_ghosts == 1 ) THEN + fname = "blockfile8G.h5" + layout = layout8g ( :, myproc+1 ) + ELSE + fname = "blockfile8.h5" + layout = layout8 ( :, myproc+1 ) + END IF + + CASE ( 16 ) + IF ( opt_with_ghosts == 1 ) THEN + fname = "blockfile16G.h5" + layout = layout16g ( :, myproc+1 ) + ELSE + fname = "blockfile16.h5" + layout = layout16 ( :, myproc+1 ) + END IF + + CASE ( 32 ) + IF ( opt_with_ghosts == 1 ) THEN + fname = "blockfile32G.h5" + layout = layout32g ( :, myproc+1 ) + ELSE + fname = "blockfile32.h5" + layout = layout32 ( :, myproc+1 ) + END IF + + CASE DEFAULT + PRINT *, "Run this test on 1, 8, 16 or 32 cores!" +#ifdef PARALLEL_IO + CALL MPI_Finalize +#endif + CALL EXIT (1) + END SELECT + + h5_err = h5_set_verbosity_level ( 511_8 ) + + IF ( opt_write == 1 ) THEN + h5_err = write_file ( fname, myproc, comm, layout ) + IF ( h5_err < 0 ) THEN + PRINT "('[proc ', I3, ']: Faild to write file ', A, '!')", myproc, fname + END IF + + ELSE IF ( opt_read == 1 ) THEN + h5_err = read_file ( fname, myproc, comm, layout ) + IF ( h5_err < 0 ) THEN + PRINT "('[proc ', I3, ']: Faild to read file ', A, '!')", myproc, fname + END IF + + ENDIF +#ifdef PARALLEL_IO + PRINT "('[proc ', I3, ']: Cleanup.')", myproc + CALL MPI_Finalize +#endif + PRINT "('[proc ', I3, ']: Done.')", myproc + CALL EXIT (0) + +!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! +!! + CONTAINS + + !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! + !! + INTEGER*8 FUNCTION write_file ( fname, myproc, comm, layout ) + IMPLICIT NONE + + CHARACTER(LEN=*), INTENT(IN) :: fname + INTEGER, INTENT(IN) :: myproc + INTEGER, INTENT(IN) :: comm + INTEGER*8, INTENT(IN) :: layout(6) + + INCLUDE 'H5hutF.h' + + INTEGER*8 :: file + INTEGER*8 :: timestep = 1 + + PRINT "('[proc ', I3, ']: Open file for writing ...')", myproc +#ifdef PARALLEL_IO + file = h5_openw_par (fname, comm) +#else + file = h5_openw_par (fname) +#endif + IF ( file == 0 ) THEN + write_file = -1 + RETURN + ENDIF + + h5_err = h5_setstep ( file, timestep ) + IF ( h5_err < 0 ) THEN + write_file = h5_err + RETURN + ENDIF + + h5_err = write_field ( file, myproc, layout ) + IF ( h5_err < 0 ) THEN + write_file = h5_err + RETURN + ENDIF + + h5_err = write_attributes ( file ) + IF ( h5_err < 0 ) THEN + write_file = h5_err + RETURN + ENDIF + + h5_err = h5_close ( file ) + IF ( h5_err < 0 ) THEN + write_file = h5_err + RETURN + ENDIF + + write_file = 0 + END FUNCTION write_file + + !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! + !! + INTEGER*8 FUNCTION write_field ( file, myproc, layout ) + IMPLICIT NONE + + INTEGER*8, INTENT(IN) :: file + INTEGER, INTENT(IN) :: myproc + INTEGER*8, INTENT(IN) :: layout(6) + + INCLUDE 'H5hutF.h' + + INTEGER*8 :: i, j, k + INTEGER*8 :: i_start + INTEGER*8 :: i_end + INTEGER*8 :: j_start + INTEGER*8 :: j_end + INTEGER*8 :: k_start + INTEGER*8 :: k_end + INTEGER*8 :: i_dims + INTEGER*8 :: j_dims + INTEGER*8 :: k_dims + REAL*8 :: value + + REAL*8, DIMENSION(:,:,:), ALLOCATABLE :: data + + i_start = layout(1) + i_end = layout(2) + j_start = layout(3) + j_end = layout(4) + k_start = layout(5) + k_end = layout(6) + i_dims = i_end - i_start + 1 + j_dims = j_end - j_start + 1 + k_dims = k_end - k_start + 1 + + ALLOCATE ( data (i_dims,j_dims, k_dims) ) + + PRINT "('[proc ', I3, ']: Defining layout for writing ...')", myproc + PRINT "('[proc ', I3, ']: ', I3, ':', I3, ', ', I3, ':', I3,', ', I3, ':', I3)", & + myproc, & + i_start, i_end, & + j_start, j_end, & + k_start, k_end + + h5_err = h5bl_3d_setview ( file, i_start, i_end, j_start, j_end, k_start, k_end ) + IF ( h5_err < 0 ) THEN + write_field = h5_err + RETURN + END IF + + DO i = 1, i_dims + DO j = 1, j_dims + DO k = 1, k_dims + value = (k-1) + 1000*(j-1) + 100000*(i-1) + 10000000*myproc + data(i,j,k) = value + END DO + END DO + END DO + + PRINT "('[proc ', I3, ']: Writing field ...')", myproc + h5_err = h5bl_3d_write_scalar_field_r8 ( file, "TestField", data ) + IF ( h5_err < 0 ) THEN + write_field = h5_err + RETURN + END IF + + write_field = 0 + END FUNCTION write_field + + !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! + !! + INTEGER*8 FUNCTION write_attributes ( file ) + IMPLICIT NONE + INTEGER*8, INTENT(IN) :: file + + INCLUDE 'H5hutF.h' + + INTEGER*8 :: h5_err = 0 + CHARACTER(LEN=128) :: s_val + INTEGER*8 :: i8_val(1) + INTEGER*4 :: i4_val(1) + REAL*8 :: r8_val(1) + REAL*4 :: r4_val(1) + + PRINT "('[proc ', I3, ']: Writing string attribute ...')", myproc + s_val = "42" + h5_err = h5bl_writefieldattrib_string ( file, "TestField", "TestString", s_val ) + IF ( h5_err < 0 ) THEN + write_attributes = h5_err + RETURN + END IF + + PRINT "('[proc ', I3, ']: Writing int64 attribute ...')", myproc + i8_val(1) = 42 + h5_err = h5bl_writefieldattrib_i8 ( file, "TestField", "TestInt64", i8_val, 1_8 ) + IF ( h5_err < 0 ) THEN + write_attributes = h5_err + RETURN + END IF + + PRINT "('[proc ', I3, ']: Writing int32 attribute ...')", myproc + i4_val(1) = 42 + h5_err = h5bl_writefieldattrib_i4 ( file, "TestField", "TestInt32", i4_val, 1_8 ) + IF ( h5_err < 0 ) THEN + write_attributes = h5_err + RETURN + END IF + + PRINT "('[proc ', I3, ']: Writing float64 attribute ...')", myproc + r8_val(1) = 42.0 + h5_err = h5bl_writefieldattrib_r8 ( file, "TestField", "TestFloat64", r8_val, 1_8 ) + IF ( h5_err < 0 ) THEN + write_attributes = h5_err + RETURN + END IF + + PRINT "('[proc ', I3, ']: Writing float32 attribute ...')", myproc + r4_val(1) = 42.0 + h5_err = h5bl_writefieldattrib_r4 ( file, "TestField", "TestFloat32", r4_val, 1_8 ) + IF ( h5_err < 0 ) THEN + write_attributes = h5_err + RETURN + END IF + + write_attributes = 0 + END FUNCTION write_attributes + + !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! + !! + INTEGER*8 FUNCTION read_file ( fname, myproc, comm, layout ) + IMPLICIT NONE + + CHARACTER(LEN=*), INTENT(IN) :: fname + INTEGER, INTENT(IN) :: myproc + INTEGER, INTENT(IN) :: comm + INTEGER*8, INTENT(IN) :: layout(6) + + INCLUDE 'H5hutF.h' + + INTEGER*8 :: file + INTEGER*8 :: timestep = 1 + + PRINT "('[proc ', I3, ']: Open file for reading ...')", myproc +#ifdef PARALLEL_IO + file = h5_openr_par ( fname, comm ) +#else + file = h5_openr (fname +#endif + if ( file == 0 ) THEN + read_file = -1 + RETURN + ENDIF + + h5_err = h5_setstep ( file, timestep ) + IF ( h5_err < 0 ) THEN + read_file = -1 + RETURN + ENDIF + + h5_err = read_field ( file, myproc, layout ) + IF ( h5_err < 0 ) THEN + read_file = -1 + RETURN + ENDIF + + h5_err = read_attributes ( file ) + IF ( h5_err < 0 ) THEN + read_file = -1 + RETURN + ENDIF + + h5_err = h5_close ( file ) + IF ( h5_err < 0 ) THEN + read_file = -1 + RETURN + ENDIF + + read_file = 0 + END FUNCTION read_file + + !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! + !! + INTEGER*8 FUNCTION read_field ( file, myproc, layout ) + IMPLICIT NONE + + INTEGER*8, INTENT(IN) :: file + INTEGER, INTENT(IN) :: myproc + INTEGER*8, INTENT(IN) :: layout(6) + + INCLUDE 'H5hutF.h' + + INTEGER*8 :: i, j, k + INTEGER*8 :: i_start, i_start2 + INTEGER*8 :: i_end, i_end2 + INTEGER*8 :: j_start, j_start2 + INTEGER*8 :: j_end, j_end2 + INTEGER*8 :: k_start, k_start2 + INTEGER*8 :: k_end, k_end2 + INTEGER*8 :: i_dims + INTEGER*8 :: j_dims + INTEGER*8 :: k_dims + INTEGER*8 :: ri, rj, rk, proc + REAL*8 :: value + + REAL*8, DIMENSION(:,:,:), ALLOCATABLE :: data + + i_start = layout(1) + i_end = layout(2) + j_start = layout(3) + j_end = layout(4) + k_start = layout(5) + k_end = layout(6) + i_dims = i_end - i_start + 1 + j_dims = j_end - j_start + 1 + k_dims = k_end - k_start + 1 + + ALLOCATE ( data (i_dims, j_dims, k_dims) ) + + PRINT "('[proc ', I3, ']: Defining layout for reading ...')", myproc + PRINT "('[proc ', I3, ']: ', I3, ':', I3, ', ', I3, ':', I3,', ', I3, ':', I3)", & + myproc, & + i_start, i_end, & + j_start, j_end, & + k_start, k_end + + h5_err = h5bl_3d_setview ( file, i_start, i_end, j_start, j_end, k_start, k_end ) + IF ( h5_err < 0 ) THEN + read_field = -1 + RETURN + END IF + + PRINT "('[proc ', I3, ']: Reading field ...')", myproc + h5_err = h5bl_3d_read_scalar_field_r8 ( file, "TestField", data ) + IF ( h5_err < 0 ) THEN + read_field = -1 + RETURN + END IF + + DO i = 1, i_dims + DO j = 1, j_dims + DO k = 1, k_dims + value = (k-1) + 1000*(j-1) + 100000*(i-1) + 10000000*myproc + if ( data(i,j,k) /= value ) THEN + PRINT "('[proc ', I3, ']: error: data(',I4,',',I4,',',I4,') = ',F10.2,' /= ',F10.2)", & + i, j, k, data(i,j,k), value + read_field = -2 + RETURN + END IF + END DO + END DO + END DO + read_field = 0 + END FUNCTION read_field + + INTEGER*8 FUNCTION read_attributes ( file ) + IMPLICIT NONE + INTEGER*8, INTENT(IN) :: file + + INCLUDE 'H5hutF.h' + + INTEGER*8 :: h5_err = 0 + CHARACTER(LEN=128) :: s_val + INTEGER*8 :: i8_val(1) + INTEGER*4 :: i4_val(1) + REAL*8 :: r8_val(1) + REAL*4 :: r4_val(1) + + PRINT "('[proc ', I3, ']: Reading string attribute ...')", myproc + h5_err = h5bl_readfieldattrib_string ( file, "TestField", "TestString", s_val ) + IF ( h5_err < 0 ) THEN + PRINT "('[proc ', I3, ']: Oops ...')", myproc + read_attributes = h5_err + RETURN + END IF + IF ( s_val /= "42" ) THEN + PRINT "('[proc ', I3, ']: Error reading string attribute: Value is ', A, ' but should be 42')", & + myproc, s_val + END IF + + PRINT "('[proc ', I3, ']: Reading int64 attribute ...')", myproc + h5_err = h5bl_readfieldattrib_i8 ( file, "TestField", "TestInt64", i8_val ) + IF ( h5_err < 0 ) THEN + PRINT "('[proc ', I3, ']: Oops ...')", myproc + read_attributes = h5_err + RETURN + END IF + IF ( i8_val(1) /= 42 ) THEN + PRINT "('[proc ', I3, ']: Error reading int64 attribute: Value is ', I8, ' but should be 42')", & + myproc, i8_val(1) + END IF + + PRINT "('[proc ', I3, ']: Reading int32 attribute ...')", myproc + h5_err = h5bl_readfieldattrib_i4 ( file, "TestField", "TestInt32", i4_val ) + IF ( h5_err < 0 ) THEN + PRINT "('[proc ', I3, ']: Oops ...')", myproc + read_attributes = h5_err + RETURN + END IF + IF ( i4_val(1) /= 42 ) THEN + PRINT "('[proc ', I3, ']: Error reading int32 attribute: Value is ', I8, ' but should be 42')", & + myproc, i4_val(1) + END IF + + PRINT "('[proc ', I3, ']: Reading float64 attribute ...')", myproc + h5_err = h5bl_readfieldattrib_r8 ( file, "TestField", "TestFloat64", r8_val ) + IF ( h5_err < 0 ) THEN + PRINT "('[proc ', I3, ']: Oops ...')", myproc + read_attributes = h5_err + RETURN + END IF + IF ( r8_val(1) /= 42.0 ) THEN + PRINT "('[proc ', I3, ']: Error reading float64 attribute: Value is ', F10.2, ' but should be 42.0')", & + myproc, r8_val(1) + END IF + + PRINT "('[proc ', I3, ']: Reading float32 attribute ...')", myproc + h5_err = h5bl_readfieldattrib_r4 ( file, "TestField", "TestFloat32", r4_val ) + IF ( h5_err < 0 ) THEN + PRINT "('[proc ', I3, ']: Oops ...')", myproc + read_attributes = h5_err + RETURN + END IF + IF ( r4_val(1) /= 42.0 ) THEN + PRINT "('[proc ', I3, ']: Error reading float32 attribute: Value is ', F10.2, ' but should be 42.0')", & + myproc, r4_val(1) + END IF + + read_attributes = h5_err + END FUNCTION read_attributes + + END PROGRAM diff --git a/examples/H5Block/Makefile.am b/examples/H5Block/Makefile.am new file mode 100644 index 0000000..062d420 --- /dev/null +++ b/examples/H5Block/Makefile.am @@ -0,0 +1,35 @@ +AM_CPPFLAGS += -I${abs_top_builddir}/src/include +FFLAGS += -cpp $(AM_CPPFLAGS) +LDFLAGS += -L${abs_top_builddir}/src/lib + +LDADD = + +if ENABLE_C +LDADD += +endif + +if ENABLE_FORTRAN +LDADD += -lH5hutF +endif + +LDADD += -lH5hut + +noinst_PROGRAMS = + +if ENABLE_C +noinst_PROGRAMS += read_write +endif + +if ENABLE_FORTRAN +noinst_PROGRAMS += H5BlockExampleF +endif + +read_write_SOURCES = read_write.c +H5BlockExampleF_SOURCES = H5BlockExampleF.f90 + +%.o : %.f90 + $(FC) $(FFLAGS) -c $< + + +distclean-local: + $(RM) *~ diff --git a/examples/H5Block/README b/examples/H5Block/README new file mode 100644 index 0000000..64faa5a --- /dev/null +++ b/examples/H5Block/README @@ -0,0 +1,189 @@ +Since we have no different version for serial and parallel system, +all tests are compiled for "parallel" systems (which may have only +one processor). + +Only one time-step! + +* H5BlockWriteScalarField1Proc + - 1 processor + - Write field data "TestField" with dimension sizes + (64, 64, 512) and scalar values: + data[i,j,k] = k + 1000*j + 100000*i + - Set field attribute "TestString" to "42" + - Set field attribute "TestInt64" to 42 + - Set field attribute "TestFloat64" to 42.0 + - filename: blockfile1.h5 + +* H5BlockReadScalarField1Proc + - 1 processor + - read file "blockfile1.h5" + - check values of field data + - check values of attributes + +* H5BlockWriteScalarField8Procs + - 8 processors + - Write field data "TestField" with dimension sizes + (64, 64, 512) and scalar values: + data[i,j,k] = k + 1000*j + 100000*i + 10000000*proc + - layout: + proc 0: ( 0:63, 0:63, 0: 63) + proc 1: ( 0:63, 0:63, 64:127) + proc 2: ( 0:63, 0:63, 128:191) + proc 3: ( 0:63, 0:63, 192,255) + proc 4: ( 0:63, 0:63, 256:319) + proc 5: ( 0:63, 0:63, 320:383) + proc 6: ( 0:63, 0:63, 384:447) + proc 7: ( 0:63, 0:63, 448:511) + - filename = blockfile2.h5 + +* H5BlockReadScalarField8Procs + - 8 processors + - read file "blockfile2.h5" + - check values of field data + - layout as above + +* H5BlockWriteScalarField8ProcsWithGosts + - 8 processors + - Write field data "TestField" with dimension sizes + (64, 64, 512) and scalar values: + data[i,j,k] = k + 1000*j + 100000*i + 10000000*proc + - layout: + proc 0: ( 0:63, 0:63, 0: 64) + proc 1: ( 0:63, 0:63, 63:128) + proc 2: ( 0:63, 0:63, 127:192) + proc 3: ( 0:63, 0:63, 191,256) + proc 4: ( 0:63, 0:63, 255:320) + proc 5: ( 0:63, 0:63, 319:384) + proc 6: ( 0:63, 0:63, 383:448) + proc 7: ( 0:63, 0:63, 447:511) + - filename: blockfile3.h5 + +* H5BlockReadScalarField8ProcsWithGostZones + - 8 processors + - read file "blockfile3.h5" + - check values of field data + - layout as above + +* H5BlockWriteScalarField16ProcsWithGostZones + - 16 processors + - Write field data "TestField" with dimension sizes + (64, 64, 512) and scalar values: + data[i,j,k] = k + 1000*j + 100000*i + 10000000*proc + - layout: + proc 0: ( 0:63, 0:32, 0: 64) + proc 1: ( 0:63, 31:63, 0: 64) + proc 2: ( 0:63, 0:32, 63:128) + proc 3: ( 0:63, 31:63, 63:128) + proc 4: ( 0:63, 0:32, 127:192) + proc 5: ( 0:63, 31:63, 127:192) + proc 6: ( 0:63, 0:32, 191,256) + proc 7: ( 0:63, 31:63, 191,256) + proc 8: ( 0:63, 0:32, 255:320) + proc 9: ( 0:63, 31:63, 255:320) + proc 10: ( 0:63, 0:32, 319:384) + proc 11: ( 0:63, 31:63, 319:384) + proc 12: ( 0:63, 0:32, 383:448) + proc 13: ( 0:63, 31:63, 383:448) + proc 14: ( 0:63, 0:32, 447:511) + proc 15: ( 0:63, 31:63, 447:511) + - filename: blockfile4.h5 + +* H5BlockReadScalarField16ProcsWithGosts + - 16 processors + - read file "blockfile4.h5" + - check values of field data + - layout as above + + + +* H5BlockWriteScalarField32Procs + - 32 processors + - Write field data "TestField" with dimension sizes + (64, 64, 512) and scalar values: + data[i,j,k] = k + 1000*j + 100000*i + 10000000*proc + - layout: + proc 0: ( 0:31, 0:31, 0: 63) + proc 1: ( 0:31, 32:63, 0: 63) + proc 2: ( 32:63, 0:31, 0: 63) + proc 3: ( 32:63, 32:63, 0: 63) + proc 4: ( 0:31, 0:31, 64:127) + proc 5: ( 0:31, 32:63, 64:127) + proc 6: ( 32:63, 0:31, 64:127) + proc 7: ( 32:63, 32:63, 64:127) + proc 8: ( 0:31, 0:31, 128:191) + proc 9: ( 0:31, 32:63, 128:191) + proc 10: ( 32:63, 0:31, 128:191) + proc 11: ( 32:63, 32:63, 128:191) + proc 12: ( 0:31, 0:31, 192:255) + proc 13: ( 0:31, 32:63, 192:255) + proc 14: ( 32:63, 0:31, 192:255) + proc 15: ( 32:63, 32:63, 192:255) + proc 16: ( 0:31, 0:31, 256:319) + proc 17: ( 0:31, 32:63, 256:319) + proc 18: ( 32:63, 0:31, 256:319) + proc 19: ( 32:63, 32:63, 256:319) + proc 20: ( 0:31, 0:31, 320:383) + proc 21: ( 0:31, 32:63, 320:383) + proc 22: ( 32:63, 0:31, 320:383) + proc 23: ( 32:63, 32:63, 320:383) + proc 24: ( 0:31, 0:31, 384:447) + proc 25: ( 0:31, 32:63, 384:447) + proc 26: ( 32:63, 0:31, 384:447) + proc 27: ( 32:63, 32:63, 384:447) + proc 28: ( 0:31, 0:31, 448:511) + proc 29: ( 0:31, 32:63, 448:511) + proc 30: ( 32:63, 0:31, 448:511) + proc 31: ( 32:63, 32:63, 448:511) + - filename: blockfile5.h5 + +* H5BlockReadScalarField32Procs + - 32 processors + - read file "blockfile4.h5" + - check values of field data + - layout as above + +* H5BlockWriteScalarField32ProcsWithGosts + - 32 processors + - Write field data "TestField" with dimension sizes + (64, 64, 512) and scalar values: + data[i,j,k] = k + 1000*j + 100000*i + 10000000*proc + - layout: + proc 0: ( 0:32, 0:32, 0: 64) + proc 1: ( 0:32, 31:63, 0: 64) + proc 2: ( 31:63, 0:32, 0: 64) + proc 3: ( 31:63, 31:63, 0: 64) + proc 4: ( 0:32, 0:32, 63:128) + proc 5: ( 0:32, 31:63, 63:128) + proc 6: ( 31:63, 0:32, 63:128) + proc 7: ( 31:63, 31:63, 63:128) + proc 8: ( 0:32, 0:32, 127:192) + proc 9: ( 0:32, 31:63, 127:192) + proc 10: ( 31:63, 0:32, 127:192) + proc 11: ( 31:63, 31:63, 127:192) + proc 12: ( 0:32, 0:32, 191:256) + proc 13: ( 0:32, 31:63, 191:256) + proc 14: ( 31:63, 0:32, 191:256) + proc 15: ( 31:63, 31:63, 191:256) + proc 16: ( 0:32, 0:32, 255:320) + proc 17: ( 0:32, 31:63, 255:320) + proc 18: ( 31:63, 0:32, 255:320) + proc 19: ( 31:63, 31:63, 255:320) + proc 20: ( 0:32, 0:32, 319:384) + proc 21: ( 0:32, 31:63, 319:384) + proc 22: ( 31:63, 0:32, 319:384) + proc 23: ( 31:63, 31:63, 319:384) + proc 24: ( 0:31, 0:31, 383:448) + proc 25: ( 0:31, 31:63, 383:448) + proc 26: ( 31:63, 0:31, 383:448) + proc 27: ( 31:63, 31:63, 383:448) + proc 28: ( 0:32, 0:32, 447:511) + proc 29: ( 0:32, 31:63, 447:511) + proc 30: ( 31:63, 0:32, 447:511) + proc 31: ( 31:63, 31:63, 447:511) + filename: blockfile6.h5 + +* H5BlockReadScalarField32ProcsWithGhosts + - 32 processors + - read file "blockfile6.h5" + - check values of field data + - layout as above diff --git a/examples/H5Block/fields.c b/examples/H5Block/fields.c new file mode 100644 index 0000000..eab49a1 --- /dev/null +++ b/examples/H5Block/fields.c @@ -0,0 +1,45 @@ +#include +#include +#include +#include + +#define XSIZE 8 +#define YSIZE 8 +#define ZSIZE 8 +#define DATASIZE XSIZE*YSIZE*ZSIZE +#define H5OpenFileParallel H5PartOpenFileParallel +#define H5SetStep H5PartSetStep +#define H5Block3dSetLayout H5BlockDefine3DFieldLayout +#define H5CloseFile H5PartCloseFile + +int main(int argc, char** argv) +{ + int rank, nprocs; + h5part_float64_t ex[DATASIZE]; + h5part_float64_t ey[DATASIZE]; + h5part_float64_t ez[DATASIZE]; + h5part_float64_t q[DATASIZE]; + h5part_int64_t nparticles = DATASIZE; + H5PartFile *file; + + // initialize MPI + MPI_Init (&argc, &argv); + MPI_Comm_rank (MPI_COMM_WORLD, &rank); + MPI_Comm_size (MPI_COMM_WORLD, &nprocs); + + H5PartSetVerbosityLevel(H5PART_VERB_DEBUG); + + file = H5OpenFileParallel("fields.h5", H5PART_WRITE, MPI_COMM_WORLD); + H5SetStep(file, 0); + H5Block3dSetLayout(file, + rank*XSIZE, (rank+1)*XSIZE - 1, + 0, YSIZE - 1, + 0, ZSIZE - 1); + H5Block3dWriteScalarFieldFloat64(file, "Q", q); + H5Block3dWrite3dVectorFieldFloat64(file, "E", ex, ez, ey); + H5CloseFile(file); + + MPI_Finalize(); + return EXIT_SUCCESS; +} + diff --git a/examples/H5Block/read_write.c b/examples/H5Block/read_write.c new file mode 100644 index 0000000..46f188b --- /dev/null +++ b/examples/H5Block/read_write.c @@ -0,0 +1,568 @@ +#include +#include +#include + +#include +#include "H5hut.h" + +#define NPROCS 8 + +struct H5BlockPartition { + h5_int64_t i_start; + h5_int64_t i_end; + h5_int64_t j_start; + h5_int64_t j_end; + h5_int64_t k_start; + h5_int64_t k_end; +}; + +struct H5BlockPartition Layout1[1] = { + { 0, 63, 0, 63, 0, 511 } +}; + +struct H5BlockPartition Layout8[8] = { + { 0,63, 0,63, 0, 63}, + { 0,63, 0,63, 64,127}, + { 0,63, 0,63, 128,191}, + { 0,63, 0,63, 192,255}, + { 0,63, 0,63, 256,319}, + { 0,63, 0,63, 320,383}, + { 0,63, 0,63, 384,447}, + { 0,63, 0,63, 448,511} +}; + +struct H5BlockPartition Layout8G[8] = { + { 0,63, 0,63, 0, 64}, + { 0,63, 0,63, 63,128}, + { 0,63, 0,63, 127,192}, + { 0,63, 0,63, 191,256}, + { 0,63, 0,63, 255,320}, + { 0,63, 0,63, 319,384}, + { 0,63, 0,63, 383,448}, + { 0,63, 0,63, 447,511} +}; + +struct H5BlockPartition Layout16[16] = { + { 0,63, 0,31, 0, 63}, + { 0,63, 32,63, 0, 63}, + { 0,63, 0,31, 64,127}, + { 0,63, 32,63, 64,127}, + { 0,63, 0,31, 128,191}, + { 0,63, 32,63, 128,191}, + { 0,63, 0,31, 192,255}, + { 0,63, 32,63, 192,255}, + { 0,63, 0,31, 256,319}, + { 0,63, 32,63, 256,319}, + { 0,63, 0,31, 320,383}, + { 0,63, 32,63, 320,383}, + { 0,63, 0,31, 384,447}, + { 0,63, 32,63, 384,447}, + { 0,63, 0,31, 448,511}, + { 0,63, 32,63, 448,511} +}; + +struct H5BlockPartition Layout16G[16] = { + { 0,63, 0,32, 0, 64}, + { 0,63, 31,63, 0, 64}, + { 0,63, 0,32, 63,128}, + { 0,63, 31,63, 63,128}, + { 0,63, 0,32, 127,192}, + { 0,63, 31,63, 127,192}, + { 0,63, 0,32, 191,256}, + { 0,63, 31,63, 191,256}, + { 0,63, 0,32, 255,320}, + { 0,63, 31,63, 255,320}, + { 0,63, 0,32, 319,384}, + { 0,63, 31,63, 319,384}, + { 0,63, 0,32, 383,448}, + { 0,63, 31,63, 383,448}, + { 0,63, 0,32, 447,511}, + { 0,63, 31,63, 447,511} +}; + + +struct H5BlockPartition Layout32[32] = { + { 0,31, 0,31, 0, 63}, + { 0,31, 32,63, 0, 63}, + { 32,63, 0,31, 0, 63}, + { 32,63, 32,63, 0, 63}, + { 0,31, 0,31, 64,127}, + { 0,31, 32,63, 64,127}, + { 32,63, 0,31, 64,127}, + { 32,63, 32,63, 64,127}, + { 0,31, 0,31, 128,191}, + { 0,31, 32,63, 128,191}, + { 32,63, 0,31, 128,191}, + { 32,63, 32,63, 128,191}, + { 0,31, 0,31, 192,255}, + { 0,31, 32,63, 192,255}, + { 32,63, 0,31, 192,255}, + { 32,63, 32,63, 192,255}, + { 0,31, 0,31, 256,319}, + { 0,31, 32,63, 256,319}, + { 32,63, 0,31, 256,319}, + { 32,63, 32,63, 256,319}, + { 0,31, 0,31, 320,383}, + { 0,31, 32,63, 320,383}, + { 32,63, 0,31, 320,383}, + { 32,63, 32,63, 320,383}, + { 0,31, 0,31, 384,447}, + { 0,31, 32,63, 384,447}, + { 32,63, 0,31, 384,447}, + { 32,63, 32,63, 384,447}, + { 0,31, 0,31, 448,511}, + { 0,31, 32,63, 448,511}, + { 32,63, 0,31, 448,511}, + { 32,63, 32,63, 448,511} +}; + +struct H5BlockPartition Layout32G[32] = { + { 0,32, 0,32, 0, 64}, + { 0,32, 31,63, 0, 64}, + { 31,63, 0,32, 0, 64}, + { 31,63, 31,63, 0, 64}, + { 0,32, 0,32, 63,128}, + { 0,32, 31,63, 63,128}, + { 31,63, 0,32, 63,128}, + { 31,63, 31,63, 63,128}, + { 0,32, 0,32, 127,192}, + { 0,32, 31,63, 127,192}, + { 31,63, 0,32, 127,192}, + { 31,63, 31,63, 127,192}, + { 0,32, 0,32, 191,256}, + { 0,32, 31,63, 191,256}, + { 31,63, 0,32, 191,256}, + { 31,63, 31,63, 191,256}, + { 0,32, 0,32, 255,320}, + { 0,32, 31,63, 255,320}, + { 31,63, 0,32, 255,320}, + { 31,63, 31,63, 255,320}, + { 0,32, 0,32, 319,384}, + { 0,32, 31,63, 319,384}, + { 31,63, 0,32, 319,384}, + { 31,63, 31,63, 319,384}, + { 0,31, 0,31, 383,448}, + { 0,31, 31,63, 383,448}, + { 31,63, 0,31, 383,448}, + { 31,63, 31,63, 383,448}, + { 0,32, 0,32, 447,511}, + { 0,32, 31,63, 447,511}, + { 31,63, 0,32, 447,511}, + { 31,63, 31,63, 447,511} +}; + +#if 0 +static h5_int64_t +_calc_index_KJI ( + int myproc, + h5_int64_t i, + h5_int64_t i_dims, + h5_int64_t j, + h5_int64_t j_dims, + h5_int64_t k, + h5_int64_t k_dims + ) { + + return i + j*i_dims + k*i_dims*j_dims; +} +#endif + +#define _calc_index( i, i_dims, j, j_dims, k, k_dims ) \ + (i + j*i_dims + k*i_dims*j_dims) + +static h5_int64_t +_write_data ( + h5_file_t f, + int myproc, + struct H5BlockPartition* view + ) { + + h5_int64_t i, j, k, idx; + h5_int64_t herr; + h5_float64_t *data; + h5_int64_t i_dims = view->i_end - view->i_start + 1; + h5_int64_t j_dims = view->j_end - view->j_start + 1; + h5_int64_t k_dims = view->k_end - view->k_start + 1; + + printf ( "Writing scalar field data to step #%lld\n", (long long)H5GetStep (f)); + + data = malloc ( i_dims * j_dims * k_dims * sizeof ( *data ) ); + for ( i = 0; i < i_dims; i++ ) { + for ( j = 0; j < j_dims; j++ ) { + for ( k = 0; k < k_dims; k++ ) { + idx = _calc_index ( + i, i_dims, + j, j_dims, + k, k_dims ); + *(data + idx) = k + + 1000*j + + 100000*i + + 10000000*myproc; + } + } + } + + herr = H5Block3dSetView ( + f, + view->i_start, view->i_end, + view->j_start, view->j_end, + view->k_start, view->k_end ); + if ( herr < 0 ) return herr; + + herr = H5Block3dWriteScalarFieldFloat64 ( f, "TestField", data ); + if ( herr < 0 ) return herr; + + free ( data ); + + return 1; +} + +static h5_int64_t +_write_attributes ( + h5_file_t f, + const int myproc + ) { + printf ("Writing attributes to field '%s' in step #%lld\n", "TestField", (long long)H5GetStep (f)); + h5_int64_t herr = H5BlockWriteFieldAttribString ( + f, + "TestField", + "TestString", + "42" ); + if ( herr < 0 ) return -1; + + h5_int64_t ival[1] = { 42 }; + h5_float64_t rval[1] = { 42.0 }; + herr = H5BlockWriteFieldAttribInt64 ( + f, + "TestField", + "TestInt64", + ival, 1 ); + if ( herr < 0 ) return -1; + + herr = H5BlockWriteFieldAttribFloat64 ( + f, + "TestField", + "TestFloat64", + rval, 1 ); + if ( herr < 0 ) return -1; + + herr = H5Block3dSetFieldOrigin ( f, "TestField", 1.0, 2.0, 3.0 ); + if ( herr < 0 ) return -1; + + herr = H5Block3dSetFieldSpacing ( f, "TestField", 2.0, 3.0, 4.0 ); + if ( herr < 0 ) return -1; + + return H5_SUCCESS; +} + +static h5_int64_t +_write_file ( + const char *fname, + const int myproc, + MPI_Comm comm, + struct H5BlockPartition *layout + ) { + + h5_file_t f; + h5_int64_t timestep = 0; + h5_int64_t herr; + + printf ("PROC[%d]: Open file \"%s\" for writing ...\n", + myproc, fname ); + + f = H5OpenFile ( fname, H5_O_WRONLY, comm ); + if ( f == H5_FAILURE ) return -1; + + herr = H5SetStep ( f, timestep ); + if ( herr < 0 ) return herr; + + if ( _write_data ( f, myproc, layout ) < 0 ) { + printf ("Failed to write file \"%s\"\n", fname ); + return 2; + } + + if ( _write_attributes ( f, myproc ) < 0 ) { + printf ("Failed to write attributes \"%s\"\n", fname ); + return 2; + } + + herr = H5CloseFile (f); + if ( herr < 0 ) return -1; + + return 0; +} + +static h5_int64_t +_read_data ( + h5_file_t f, + int myproc, + struct H5BlockPartition *layout + ) { + + h5_int64_t i, j, k, idx; + h5_int64_t herr; + h5_float64_t *data; + h5_int64_t i_dims = layout->i_end - layout->i_start + 1; + h5_int64_t j_dims = layout->j_end - layout->j_start + 1; + h5_int64_t k_dims = layout->k_end - layout->k_start + 1; + + printf ( "Reading Step #%lld\n", (long long)H5GetStep (f) ); + + data = malloc ( i_dims * j_dims * k_dims * sizeof ( *data ) ); + + herr = H5Block3dSetView ( + f, + layout->i_start, layout->i_end, + layout->j_start, layout->j_end, + layout->k_start, layout->k_end ); + if ( herr < 0 ) return herr; + + herr = H5Block3dReadScalarFieldFloat64 ( f, "TestField", data ); + if ( herr < 0 ) return herr; + + for ( i = 0; i < i_dims; i++ ) { + for ( j = 0; j < j_dims; j++ ) { + for ( k = 0; k < k_dims; k++ ) { + idx = _calc_index ( + i, i_dims, + j, j_dims, + k, k_dims ); + + h5_float64_t value = k + + 1000 * j + + 100000 * i + + 10000000 * myproc; + if ( *(data + idx) != value ) { + printf ( + "PROC[%d]: " + "value missmatch for (%lld,%lld,%lld); is: %f;" + " should be: %f\n", + myproc, + (long long)i, (long long)j, (long long)k, + *( data + idx ), value ); + return -1; + } + } + } + } + + free ( data ); + + return 0; +} + +static h5_int64_t +_read_attributes ( + h5_file_t f, + const int myproc, + MPI_Comm comm + ) { + h5_int64_t timestep = 0; + + h5_int64_t herr = H5SetStep ( f, timestep ); + if ( herr < 0 ) return herr; + + char sval[16]; + herr = H5BlockReadFieldAttribString ( + f, + "TestField", + "TestString", + sval ); + if ( herr < 0 ) return -1; + if ( strcmp ( sval, "42" ) != 0 ) { + printf ( "Error reading string attribute: " + "Value is \"%s\" and should be \"42\"\n", sval ); + } + + h5_int64_t ival[1]; + h5_float64_t rval[1]; + herr = H5BlockReadFieldAttribInt64 ( + f, + "TestField", + "TestInt64", + ival ); + if ( herr < 0 ) return -1; + if ( ival[0] != 42 ) { + printf ( "Error reading int64 attribute: " + "Value is %lld and should be 42\n", + (long long) ival[0] ); + } + + herr = H5BlockReadFieldAttribFloat64 ( + f, + "TestField", + "TestFloat64", + rval ); + if ( herr < 0 ) return -1; + if ( rval[0] != 42.0 ) { + printf ( "Error reading float64 attribute: " + "Value is %f and should be 42.0\n", + rval[0] ); + } + + h5_float64_t x_origin; + h5_float64_t y_origin; + h5_float64_t z_origin; + h5_float64_t x_spacing; + h5_float64_t y_spacing; + h5_float64_t z_spacing; + + herr = H5Block3dGetFieldOrigin ( + f, "TestField", + &x_origin, + &y_origin, + &z_origin ); + if ( herr < 0 ) return -1; + + if ( x_origin != 1.0 || y_origin != 2.0 || z_origin != 3.0 ) { + printf ( + "Error reading field origin: Read values (%f,%f,%f)\n", + x_origin, y_origin, z_origin ); + } + herr = H5Block3dGetFieldSpacing ( + f, "TestField", + &x_spacing, + &y_spacing, + &z_spacing ); + if ( herr < 0 ) return -1; + if ( x_spacing != 2.0 || y_spacing != 3.0 || z_spacing != 4.0 ) { + printf ( + "Error reading field spacing: Read values (%f,%f,%f)\n", + x_spacing, y_spacing, z_spacing ); + } + + return 0; +} + +static h5_int64_t +_read_file ( + const char *fname, + const int myproc, + MPI_Comm comm, + struct H5BlockPartition *layout + ) { + + h5_file_t f; + h5_int64_t timestep = 0; + h5_int64_t herr; + + printf ("PROC[%d]: Open file \"%s\" for reading ...\n", + myproc, fname ); + + f = H5OpenFile ( fname, H5_O_RDONLY, comm ); + if ( f == H5_FAILURE ) return -1; + + herr = H5SetStep ( f, timestep ); + if ( herr < 0 ) return herr; + + if ( _read_data ( f, myproc, layout ) < 0 ) { + printf ("Failed to read file \"%s\"\n", fname ); + return 2; + } + if ( _read_attributes ( f, myproc, comm ) < 0 ) { + printf ("Failed to read attributes \"%s\"\n", fname ); + return 3; + } + + herr = H5CloseFile ( f ); + if ( herr < 0 ) return -1; + + return 0; +} + +int +main ( + int argc, + char **argv + ) { + char *fname; + int myproc; + int nprocs; + int opt_with_ghosts = 0; + int opt_read = 0; + int opt_write = 0; + struct H5BlockPartition *layout; + MPI_Comm comm = MPI_COMM_WORLD; + + if (argc == 1) { + fprintf ( stderr, + "Usage: %s -w|-r [-g]\n", + argv[0] ); + return 1; + } + while ( --argc ) { + if ( strcmp ( argv[argc], "-r" ) == 0 ) + opt_read = 1; + else if ( strcmp ( argv[argc], "-w" ) == 0 ) + opt_write = 1; + else if ( strcmp ( argv[argc], "-g" ) == 0 ) + opt_with_ghosts = 1; + else { + fprintf ( stderr, + "Illegal option %s\n\n" + "Usage: %s -w -r -g\n", + argv[argc], argv[0] ); + return 1; + } + } + + MPI_Init( &argc, &argv ); + MPI_Comm_size ( comm, &nprocs ); + MPI_Comm_rank( comm, &myproc ); + switch ( nprocs ) { + case 1: + fname = "blockfile1.h5"; + layout = &Layout1[myproc]; + break; + case 8: + if ( opt_with_ghosts ) { + fname = "blockfile8G.h5"; + layout = &Layout8G[myproc]; + } else { + fname = "blockfile8.h5"; + layout = &Layout8[myproc]; + } + break; + case 16: + if ( opt_with_ghosts ) { + fname = "blockfile16G.h5"; + layout = &Layout16G[myproc]; + } else { + fname = "blockfile16.h5"; + layout = &Layout16[myproc]; + } + break; + case 32: + if ( opt_with_ghosts ) { + fname = "blockfile32G.h5"; + layout = &Layout32G[myproc]; + } else { + fname = "blockfile32.h5"; + layout = &Layout32[myproc]; + } + break; + default: + printf ( "Run this test on %d, %d, %d or %d processor(s)!\n", 1, 8, 16, 32); + return 1; + } + + H5SetVerbosityLevel ( 4 ); + + if ( opt_write ) { + if ( _write_file ( fname, myproc, comm, layout ) < 0 ) { + printf ("Failed to write file \"%s\"\n", fname ); + goto cleanup; + } + } else if ( opt_read ) { + if ( _read_file ( fname, myproc, comm, layout ) < 0 ) { + printf ("Failed to read file \"%s\"\n", fname ); + goto cleanup; + } + } + printf ("Done.\n"); + +cleanup: + MPI_Finalize(); + + return 0; +} diff --git a/examples/H5Fed/Makefile.am b/examples/H5Fed/Makefile.am new file mode 100644 index 0000000..012958f --- /dev/null +++ b/examples/H5Fed/Makefile.am @@ -0,0 +1,47 @@ +# test level Makefile.am + +OBJEXT = o + +AM_LDFLAGS = -L../../src/lib @LDFLAGS@ +LIBS = -lH5hut @LIBS@ +AM_CPPFLAGS = -I../../src/include @AM_CPPFLAGS@ + +noinst_PROGRAMS = \ + tetmesh_write \ + tetmesh_write1 \ + tetmesh_write2 \ + tetmesh_read \ + tetmesh_adjacencies \ + tetmesh_write_tags \ + tetmesh_read_tags \ + trimesh_read \ + trimesh_write \ + trimesh_2gnuplot \ + trimesh_adjacencies \ + trimesh_write_dunetest + +# map_tet2globalid \ +# map_triangle2globalid + +# Extra files that I wish to include in the dist tar ball. +EXTRA_DIST = \ + tetmesh_adjacencies.c \ + tetmesh_read.c \ + tetmesh_read_tags.c \ + tetmesh_write.c \ + tetmesh_write1.c \ + tetmesh_write2.c \ + tetmesh_write_tags.c \ + trimesh_adjacencies.c \ + trimesh_read.c \ + trimesh_write.c \ + trimesh_2gnuplot.c \ + trimesh_write_dunetest.c + +# map_tet2globalid.c \ +# map_triangle2globalid.c \ +# $(bin_SCRIPTS) + +clean-local: + $(RM) *.h5 *~ + diff --git a/examples/H5Fed/map_tet2globalid.c b/examples/H5Fed/map_tet2globalid.c new file mode 100644 index 0000000..65a16c1 --- /dev/null +++ b/examples/H5Fed/map_tet2globalid.c @@ -0,0 +1,63 @@ +#include +#include + +#include "H5hut.h" + +#ifndef PARALLEL_IO +#ifndef MPI_COMM_WORLD +#define MPI_COMM_WORLD 0 +#endif +#endif + +struct vertex { + h5_float64_t P[3]; +}; + +typedef struct vertex vertex_t; + +struct tet { + h5_glb_id_t global_id; + h5_glb_id_t parent_id; + h5_glb_id_t vids[4]; +}; +typedef struct tet tet_t; + +int +main ( + int argc, + char *argv[] + ) { + + H5PartSetVerbosityLevel ( 4 ); + + h5_file *f = H5OpenFile ( "simple_tet.h5", 0 ); + if ( f == NULL ) { + fprintf ( stderr, "!!! Can't open file.\n" ); + return -1; + } + + h5_size_t num_meshes = H5FedGetNumMeshes ( f, TETRAHEDRAL_MESH ); + printf ( " Number of meshes: %d\n", num_meshes ); + + h5_id_t mesh_id = 0; + + h5_err_t h5err = H5FedOpenMesh ( f, mesh_id, TETRAHEDRAL_MESH ); + if ( h5err < 0 ) { + fprintf ( stderr, "!!! Can't open mesh %d\n", mesh_id ); + return -1; + } + h5_glb_id_t global_vids[4] = { 0, 3, 4, 5 }; + h5_glb_id_t global_tid = H5FedMapTet2GlobalID ( f, global_vids ); + if ( global_tid < 0 ) { + fprintf ( stderr, "!!! Oops ...\n" ); + return 1; + } + printf ( " Global entity ID: %d\n", global_tid ); + + h5err = H5CloseFile ( f ); + if ( h5err < 0 ) { + fprintf ( stderr, "!!! Can't close file.\n" ); + return -1; + } + return 0; +} diff --git a/examples/H5Fed/map_triangle2globalid.c b/examples/H5Fed/map_triangle2globalid.c new file mode 100644 index 0000000..aa33f7b --- /dev/null +++ b/examples/H5Fed/map_triangle2globalid.c @@ -0,0 +1,63 @@ +#include +#include + +#include "H5hut.h" + +#ifndef PARALLEL_IO +#ifndef MPI_COMM_WORLD +#define MPI_COMM_WORLD 0 +#endif +#endif + +struct vertex { + h5_float64_t P[3]; +}; + +typedef struct vertex vertex_t; + +struct tet { + h5_glb_id_t global_id; + h5_glb_id_t parent_id; + h5_glb_id_t vids[4]; +}; +typedef struct tet tet_t; + +int +main ( + int argc, + char *argv[] + ) { + + H5PartSetVerbosityLevel ( 4 ); + + h5_file *f = H5OpenFile ( "simple_tet.h5", 0 ); + if ( f == NULL ) { + fprintf ( stderr, "!!! Can't open file.\n" ); + return -1; + } + + h5_size_t num_meshes = H5FedGetNumMeshes ( f, TETRAHEDRAL_MESH ); + printf ( " Number of meshes: %d\n", num_meshes ); + + h5_id_t mesh_id = 0; + + h5_err_t h5err = H5FedOpenMesh ( f, mesh_id, TETRAHEDRAL_MESH ); + if ( h5err < 0 ) { + fprintf ( stderr, "!!! Can't open mesh %d\n", mesh_id ); + return -1; + } + h5_glb_id_t global_vids[3] = { 3, 4, 5 }; // sorted 4, 5, 3 + h5_glb_id_t global_tid = H5FedMapTriangle2GlobalID ( f, global_vids ); + if ( global_tid < 0 ) { + fprintf ( stderr, "!!! Oops ...\n" ); + return 1; + } + printf ( " Global triangle ID: 0x%08x\n", (unsigned int)global_tid ); + + h5err = H5CloseFile ( f ); + if ( h5err < 0 ) { + fprintf ( stderr, "!!! Can't close file.\n" ); + return -1; + } + return 0; +} diff --git a/examples/H5Fed/tetmesh_adjacencies.c b/examples/H5Fed/tetmesh_adjacencies.c new file mode 100644 index 0000000..768782c --- /dev/null +++ b/examples/H5Fed/tetmesh_adjacencies.c @@ -0,0 +1,566 @@ +#include +#include +#include + +#include "H5hut.h" + +#define PRINT_UPADJACENCIES 1 +#define PRINT_DOWNADJACENCIES 0 + +const h5_oid_t MESH_TYPE = H5_TETRAHEDRAL_MESH; +const char* FNAME = "simple_tet.h5"; + +typedef struct timer { + clock_t _start; + clock_t _end; + clock_t _elapsed; + struct timer* (*new)(void); + void (*delete)(struct timer*); + void (*start)(struct timer*); + void (*stop)(struct timer*); + void (*reset)(struct timer*); + double (*elapsed)(struct timer*); +} Timer; + +extern Timer Timer_; +static Timer* +new ( + void + ) { + Timer* this = malloc (sizeof (Timer)); + *this = Timer_; + return this; +} + +static void +delete (Timer* this) { + free (this); +} + +static void +start (Timer* this) { + this->_start = clock(); +} + +static void +stop (Timer* this) { + this->_end = clock(); + this->_elapsed += this->_end - this->_start; + this->_start = this->_end; +} + +static void +reset (Timer* this) { + this->_start = this->_end = this->_elapsed = 0; +} + +static double +elapsed (Timer* this) { + return (double)(this->_elapsed)/CLOCKS_PER_SEC; +} + +Timer Timer_ = { + 0, + 0, + 0, + new, + delete, + start, + stop, + reset, + elapsed +}; + +static h5_err_t +print_adjacencies_of_vertex ( + h5t_mesh_t* const m, + h5_loc_id_t local_id, + int dumpit, + Timer* timer + ) { + h5_loc_idlist_t* uadj_edges; + h5_loc_idlist_t* uadj_triangles; + h5_loc_idlist_t* uadj_tets; + timer->reset(timer); + timer->start(timer); + H5FedGetAdjacencies (m, local_id, 1, &uadj_edges); + H5FedGetAdjacencies (m, local_id, 2, &uadj_triangles); + H5FedGetAdjacencies (m, local_id, 3, &uadj_tets); + timer->stop(timer); + int n = uadj_tets->num_items; + if (uadj_triangles->num_items > n) n = uadj_triangles->num_items; + if (uadj_edges->num_items > n) n = uadj_edges->num_items; + if (dumpit) { + for (int i = 0; i < n; i++) { + char v[256]; + char k[256]; + char d[256]; + char t[256]; + h5_loc_id_t local_vids[4]; + if (i == 0) { + H5FedGetVertexIndicesOfEntity ( + m, local_id, local_vids); + snprintf (v, sizeof(v), "=[%lld]=", + (long long)local_vids[0]); + } else { + *v = '\0'; + } + if (i < uadj_edges->num_items) { + H5FedGetVertexIndicesOfEntity ( + m, uadj_edges->items[i], local_vids); + snprintf (k, sizeof(k), "=[%lld,%lld]=", + (long long)local_vids[0], + (long long)local_vids[1]); + } else { + *k = '\0'; + } + if (i < uadj_triangles->num_items) { + H5FedGetVertexIndicesOfEntity ( + m, uadj_triangles->items[i], local_vids); + snprintf (d, sizeof(d), "=[%lld,%lld,%lld]=", + (long long)local_vids[0], + (long long)local_vids[1], + (long long)local_vids[2]); + } else { + *d = '\0'; + } + if (i < uadj_tets->num_items) { + H5FedGetVertexIndicesOfEntity ( + m, uadj_tets->items[i], local_vids); + snprintf (t, sizeof(t), "=[%lld,%lld,%lld,%lld]=", + (long long)local_vids[0], + (long long)local_vids[1], + (long long)local_vids[2], + (long long)local_vids[3]); + } else { + *t = '\0'; + } + printf ("| %-18s | %-18s | %-18s | %-18s |\n", v, k, d, t); + } + } + H5FedReleaseListOfAdjacencies (m, &uadj_edges); + H5FedReleaseListOfAdjacencies (m, &uadj_triangles); + H5FedReleaseListOfAdjacencies (m, &uadj_tets); + return H5_SUCCESS; +} + +static h5_err_t +print_adjacencies_of_edge ( + h5t_mesh_t* const m, + h5_loc_id_t local_id, + int dumpit, + Timer* timer + ) { + h5_loc_idlist_t* dadj_vertices; + h5_loc_idlist_t* uadj_triangles; + h5_loc_idlist_t* uadj_tets; + timer->reset(timer); + timer->start(timer); + H5FedGetAdjacencies (m, local_id, 0, &dadj_vertices); + H5FedGetAdjacencies (m, local_id, 2, &uadj_triangles); + H5FedGetAdjacencies (m, local_id, 3, &uadj_tets); + timer->stop(timer); + int n = dadj_vertices->num_items; + if (uadj_triangles->num_items > n) n = uadj_triangles->num_items; + if (uadj_tets->num_items > n) n = uadj_tets->num_items; + + if (dumpit) { + for (int i = 0; i < n; i++) { + char v[256]; + char k[256]; + char d[256]; + char t[256]; + h5_loc_id_t local_vids[4]; + if (i < dadj_vertices->num_items) { + H5FedGetVertexIndicesOfEntity ( + m, dadj_vertices->items[i], local_vids); + snprintf (v, sizeof(v), "=[%lld]=", + (long long)local_vids[0]); + } else { + *v = '\0'; + } + if (i == 0) { + H5FedGetVertexIndicesOfEntity ( + m, local_id, local_vids); + snprintf (k, sizeof(k), "=[%lld,%lld]=", + (long long)local_vids[0], + (long long)local_vids[1]); + } else { + *k = '\0'; + } + if (i < uadj_triangles->num_items) { + H5FedGetVertexIndicesOfEntity ( + m, uadj_triangles->items[i], local_vids); + snprintf (d, sizeof(d), "=[%lld,%lld,%lld]=", + (long long)local_vids[0], + (long long)local_vids[1], + (long long)local_vids[2]); + } else { + *d = '\0'; + } + if (i < uadj_tets->num_items) { + H5FedGetVertexIndicesOfEntity ( + m, uadj_tets->items[i], local_vids); + snprintf (t, sizeof(t), "=[%lld,%lld,%lld,%lld]=", + (long long)local_vids[0], + (long long)local_vids[1], + (long long)local_vids[2], + (long long)local_vids[3]); + } else { + *t = '\0'; + } + printf ("| %-18s | %-18s | %-18s | %-18s |\n", v, k, d, t); + } + } + H5FedReleaseListOfAdjacencies (m, &dadj_vertices); + H5FedReleaseListOfAdjacencies (m, &uadj_triangles); + H5FedReleaseListOfAdjacencies (m, &uadj_tets); + return H5_SUCCESS; +} + +static h5_err_t +print_adjacencies_of_triangle ( + h5t_mesh_t* const m, + h5_loc_id_t local_id, + int dumpit, + Timer* timer + ) { + h5_loc_idlist_t* dadj_vertices; + h5_loc_idlist_t* dadj_edges; + h5_loc_idlist_t* uadj_tets; + timer->reset(timer); + timer->start(timer); + H5FedGetAdjacencies (m, local_id, 0, &dadj_vertices); + H5FedGetAdjacencies (m, local_id, 1, &dadj_edges); + H5FedGetAdjacencies (m, local_id, 3, &uadj_tets); + timer->stop(timer); + int n = dadj_vertices->num_items; + if (dadj_edges->num_items > n) n = dadj_edges->num_items; + if (uadj_tets->num_items > n) n = uadj_tets->num_items; + if (dumpit) { + for (int i = 0; i < n; i++) { + char v[256]; + char k[256]; + char d[256]; + char t[256]; + h5_loc_id_t local_vids[4]; + if (i < dadj_vertices->num_items) { + H5FedGetVertexIndicesOfEntity ( + m, dadj_vertices->items[i], local_vids); + snprintf (v, sizeof(v), "=[%lld]=", + (long long)local_vids[0]); + } else { + *v = '\0'; + } + if (i < dadj_edges->num_items) { + H5FedGetVertexIndicesOfEntity ( + m, dadj_edges->items[i], local_vids); + snprintf (k, sizeof(k), "=[%lld,%lld]=", + (long long)local_vids[0], + (long long)local_vids[1]); + } else { + *k = '\0'; + } + if (i == 0) { + H5FedGetVertexIndicesOfEntity ( + m, local_id, local_vids); + snprintf (d, sizeof(k), "=[%lld,%lld,%lld]=", + (long long)local_vids[0], + (long long)local_vids[1], + (long long)local_vids[2]); + } else { + *d = '\0'; + } + if (i < uadj_tets->num_items) { + H5FedGetVertexIndicesOfEntity ( + m, uadj_tets->items[i], local_vids); + snprintf (t, sizeof(t), "=[%lld,%lld,%lld,%lld]=", + (long long)local_vids[0], + (long long)local_vids[1], + (long long)local_vids[2], + (long long)local_vids[3]); + } else { + *t = '\0'; + } + printf ( "| %-18s | %-18s | %-18s | %-18s |\n", v, k, d, t ); + } + } + H5FedReleaseListOfAdjacencies (m, &dadj_vertices); + H5FedReleaseListOfAdjacencies (m, &dadj_edges); + H5FedReleaseListOfAdjacencies (m, &uadj_tets); + return H5_SUCCESS; +} + +static h5_err_t +print_adjacencies_of_tet ( + h5t_mesh_t* const m, + h5_loc_id_t local_id, + int dumpit, + Timer* timer + ) { + h5_loc_idlist_t* dadj_vertices; + h5_loc_idlist_t* dadj_edges; + h5_loc_idlist_t* dadj_triangles; + timer->reset(timer); + timer->start(timer); + H5FedGetAdjacencies (m, local_id, 0, &dadj_vertices); + H5FedGetAdjacencies (m, local_id, 1, &dadj_edges); + H5FedGetAdjacencies (m, local_id, 2, &dadj_triangles); + timer->stop(timer); + int n = dadj_vertices->num_items; + if (dadj_edges->num_items > n) n = dadj_edges->num_items; + if (dadj_triangles->num_items > n) n = dadj_triangles->num_items; + if (dumpit) { + for (int i = 0; i < n; i++) { + char v[256]; + char k[256]; + char d[256]; + char t[256]; + h5_loc_id_t local_vids[4]; + if (i < dadj_vertices->num_items) { + H5FedGetVertexIndicesOfEntity ( + m, dadj_vertices->items[i], local_vids); + snprintf (v, sizeof(v), "=[%lld]=", + (long long)local_vids[0]); + } else { + *v = '\0'; + } + if (i < dadj_edges->num_items) { + H5FedGetVertexIndicesOfEntity ( + m, dadj_edges->items[i], local_vids); + snprintf (k, sizeof(k), "=[%lld,%lld]=", + (long long)local_vids[0], + (long long)local_vids[1]); + } else { + *k = '\0'; + } + if (i < dadj_triangles->num_items) { + H5FedGetVertexIndicesOfEntity ( + m, dadj_triangles->items[i], local_vids); + snprintf (d, sizeof(d), "=[%lld,%lld,%lld]=", + (long long)local_vids[0], + (long long)local_vids[1], + (long long)local_vids[2]); + } else { + *d = '\0'; + } + if (i == 0) { + H5FedGetVertexIndicesOfEntity ( + m, local_id, local_vids); + snprintf (d, sizeof(k), "=[%lld,%lld,%lld,%lld]=", + (long long)local_vids[0], + (long long)local_vids[1], + (long long)local_vids[2], + (long long)local_vids[2]); + } else { + *t = '\0'; + } + printf ("| %-18s | %-18s | %-18s | %-18s |\n", v, k, d, t); + } + } + H5FedReleaseListOfAdjacencies (m, &dadj_vertices); + H5FedReleaseListOfAdjacencies (m, &dadj_edges); + H5FedReleaseListOfAdjacencies (m, &dadj_triangles); + return H5_SUCCESS; +} + +static h5_err_t +traverse_vertices ( + h5t_mesh_t* const m, + int dumpit, + Timer* timer + ) { + h5_loc_id_t local_id; + h5_loc_idx_t num = 0; + double t_total = 0.0; + double t_min = CLOCKS_PER_SEC; + double t_max = 0.0; + double t = 0.0; + + printf ("\nAdjacencies to vertices\n"); + h5t_iterator_t* iter = H5FedBeginTraverseEntities (m, 3); + while ((local_id = H5FedTraverseEntities (iter)) >= 0) { + print_adjacencies_of_vertex (m, local_id, dumpit, timer); + num++; + t = timer->elapsed(timer); + t_total += t; + if (t < t_min) t_min = t; + if (t > t_max) t_max = t; + } + fprintf ( + stderr, + "%lld\ttotal: %f\tmin: %f\tavg: %f\tmax: %f\n", + (long long)num, + t_total, + t_min, + t_total / (double)num, + t_max); + return H5FedEndTraverseEntities (iter); +} + +static h5_err_t +traverse_edges ( + h5t_mesh_t* const m, + int dumpit, + Timer* timer + ) { + h5_loc_id_t local_id; + h5_loc_idx_t num = 0; + double t_total = 0.0; + double t_min = CLOCKS_PER_SEC; + double t_max = 0.0; + double t = 0.0; + printf ("\nAdjacencies to edges\n"); + h5t_iterator_t* iter = H5FedBeginTraverseEntities (m, 2); + while ((local_id = H5FedTraverseEntities (iter)) >= 0) { + print_adjacencies_of_edge (m, local_id, dumpit, timer); + num++; + t = timer->elapsed(timer); + t_total += t; + if (t < t_min) t_min = t; + if (t > t_max) t_max = t; + } + fprintf ( + stderr, + "%lld\ttotal: %f\tmin: %f\tavg: %f\tmax: %f\n", + (long long)num, + t_total, + t_min, + t_total / (double)num, + t_max); + return H5FedEndTraverseEntities (iter); +} + +static h5_err_t +traverse_triangles ( + h5t_mesh_t* const m, + int dumpit, + Timer* timer + ) { + h5_loc_id_t local_id; + h5_loc_idx_t num = 0; + double t_min = CLOCKS_PER_SEC; + double t_max = 0.0; + double t_total = 0.0; + double t = 0.0; + printf ("\nAdjacencies to triangle\n"); + h5t_iterator_t* iter = H5FedBeginTraverseEntities (m, 1); + while ((local_id = H5FedTraverseEntities (iter)) >= 0) { + print_adjacencies_of_triangle (m, local_id, dumpit, timer); + num++; + t = timer->elapsed(timer); + t_total += t; + if (t < t_min) t_min = t; + if (t > t_max) t_max = t; + } + fprintf ( + stderr, + "%lld\ttotal: %f\tmin: %f\tavg: %f\tmax: %f\n", + (long long)num, + t_total, + t_min, + t_total / (double)num, + t_max); + return H5FedEndTraverseEntities (iter); +} + +static h5_err_t +traverse_elems ( + h5t_mesh_t* const m, + int dumpit, + Timer* timer + ) { + h5_loc_id_t local_id; + h5_loc_idx_t num = 0; + double t_total = 0.0; + double t_min = CLOCKS_PER_SEC; + double t_max = 0.0; + double t = 0.0; + printf ("\nAdjacencies to tetrahedra\n"); + h5t_iterator_t* iter = H5FedBeginTraverseEntities (m, 0); + while ((local_id = H5FedTraverseEntities (iter)) >= 0) { + print_adjacencies_of_tet (m, local_id, dumpit, timer); + num++; + t = timer->elapsed(timer); + t_total += t; + if (t < t_min) t_min = t; + if (t > t_max) t_max = t; + } + fprintf ( + stderr, + "%lld\ttotal: %f\tmin: %f\tavg: %f\tmax: %f\n", + (long long)num, + t_total, + t_min, + t_total / (double)num, + t_max); + return H5FedEndTraverseEntities (iter); +} + +static h5_err_t +traverse_level ( + h5t_mesh_t* const m, + const h5t_lvl_idx_t level_id, + int dumpit, + Timer* timer + ) { + printf (" Setting level to %d\n", level_id); + H5FedSetLevel (m, level_id); + traverse_vertices (m, dumpit, timer); + traverse_edges (m, dumpit, timer); + traverse_triangles (m, dumpit, timer); + traverse_elems (m, dumpit, timer); + return H5_SUCCESS; +} + +static h5_err_t +traverse_mesh ( + h5_file_t const f, + const h5_id_t mesh_id + ) { + h5t_mesh_t* mesh; + int dumpit = 0; + Timer* timer = Timer_.new(); + + /* open mesh and get number of levels */ + printf (" Opening mesh with id %lld\n", mesh_id); + H5FedOpenTetrahedralMeshByIndex (f, mesh_id, &mesh); + h5_size_t num_levels = H5FedGetNumLevels (mesh); + printf (" Number of levels in mesh: %lld\n", (long long)num_levels); + + /* loop over all levels */ + h5t_lvl_idx_t level_id; + for (level_id = 0; level_id < num_levels; level_id++) { + traverse_level (mesh, level_id, dumpit, timer); + } + /* done */ + H5FedCloseMesh (mesh); + timer->delete(timer); + return H5_SUCCESS; +} + +int +main ( + int argc, + char* argv[] + ) { + + /* abort program on error, so we don't have to handle them */ + H5SetErrorHandler (H5AbortErrorhandler); + H5SetVerbosityLevel (2); + + /* open file and get number of meshes */ + h5_file_t f = H5OpenFile (FNAME, H5_O_RDONLY, 0); + h5_size_t num_meshes = H5FedGetNumTetrahedralMeshes (f); + printf (" Number of meshes: %lld\n", (long long)num_meshes); + + /* loop over all meshes */ + h5_id_t mesh_id; + for (mesh_id = 0; mesh_id < num_meshes; mesh_id++) { + traverse_mesh (f, mesh_id); + } + + /* done */ + H5CloseFile (f); + return 0; +} diff --git a/examples/H5Fed/tetmesh_read.c b/examples/H5Fed/tetmesh_read.c new file mode 100644 index 0000000..019f822 --- /dev/null +++ b/examples/H5Fed/tetmesh_read.c @@ -0,0 +1,350 @@ +#include +#include +#include + +#include + +#include "H5hut.h" + +const char* FNAME = "simple_tet.h5"; + + +typedef struct timer { + clock_t _start; + clock_t _end; + struct timer* (*new)(void); + void (*delete)(struct timer*); + void (*start)(struct timer*); + void (*stop)(struct timer*); + double (*elapsed)(struct timer*); +} Timer; + +extern Timer Timer_; +static Timer* +new ( + void + ) { + Timer* this = malloc (sizeof (Timer)); + *this = Timer_; + return this; +} + +static void +delete (Timer* this) { + free (this); +} + +static void +start (Timer* this) { + this->_start = clock(); +} + +static void +stop (Timer* this) { + this->_end = clock(); +} + +static double +elapsed (Timer* this) { + return (double)(this->_end - this->_start)/CLOCKS_PER_SEC; +} + +Timer Timer_ = { + 0, + 0, + new, + delete, + start, + stop, + elapsed +}; + +static h5_err_t +traverse_vertices ( + h5t_mesh_t* const m, + int dumpit, + Timer* timer + ) { + printf ( " %-32s", "Traversing vertices: "); + + /* get number of vertices we have to expect */ + h5_size_t num_vertices_expect = H5FedGetNumVerticesTotal (m); + + /* get iterator for co-dim 3 entities, i.e vertices */ + h5t_iterator_t* iter = H5FedBeginTraverseEntities (m, 3); + + /* iterate */ + h5_loc_id_t local_id; + h5_size_t num_vertices = 0; + timer->start(timer); + while ((local_id = H5FedTraverseEntities (iter)) >= 0) { + if (dumpit) { + printf ("\n"); + h5_float64_t P[3]; + H5FedGetVertexCoordsByID (m, local_id, P); + char v[256]; + snprintf (v, sizeof(v), "=%llx=", (long long)local_id); + printf ("| %-18s | (%f, %f, %f) |\n", + v, P[0], P[1], P[2]); + } + num_vertices++; + } + + /* done */ + H5FedEndTraverseEntities (iter); + timer->stop(timer); + + /* report error if we got a different number then expected */ + if (num_vertices != num_vertices_expect) { + fprintf (stderr, "!!! Got %lud vertices, but expected %lud.\n", + (unsigned long)num_vertices, + (unsigned long)num_vertices_expect); + } + + printf (" %fsec, number of vertices: %lu\n", + timer->elapsed(timer), + (unsigned long)num_vertices); + return H5_SUCCESS; +} + +static h5_err_t +traverse_edges ( + h5t_mesh_t* const m, + int dumpit, + Timer* timer + ) { + printf ( " %-32s", "Traversing edges: "); + timer->start(timer); + /* get iterator for co-dim 2 entities, i.e. edges */ + h5t_iterator_t* iter = H5FedBeginTraverseEntities (m, 2); + + /* iterate */ + h5_loc_id_t local_id; + h5_size_t num_edges = 0; + while ((local_id = H5FedTraverseEntities (iter)) >= 0) { + if (dumpit) { + printf ("\n"); + char v[256]; + char k[256]; + h5_loc_id_t local_vids[4]; + snprintf ( k, sizeof(k), "=%llx=", (long long)local_id ); + H5FedGetVertexIndicesOfEntity ( m, local_id, local_vids ); + snprintf ( v, sizeof(v), "=[%lld,%lld]=", + (long long)local_vids[0], (long long)local_vids[1] ); + printf ( "| %-18s | %-18s |\n", k, v ); + } + num_edges++; + } + + /* done */ + H5FedEndTraverseEntities (iter); + timer->stop(timer); + printf (" %fsec, number of edges: %lu\n", + timer->elapsed(timer), + (unsigned long)num_edges); + return H5_SUCCESS; +} + +static h5_err_t +traverse_triangles ( + h5t_mesh_t* const m, + int dumpit, + Timer* timer + ) { + printf ( " %-32s", "Traversing triangles: "); + + timer->start (timer); + /* get iterator for co-dim 1 entities, i.e. triangles */ + h5t_iterator_t* iter = H5FedBeginTraverseEntities (m, 1); + + /* iterate */ + h5_loc_id_t local_id; + h5_size_t num_triangles = 0; + while ((local_id = H5FedTraverseEntities (iter)) >= 0) { + if (dumpit) { + printf ("\n"); + char v[256]; + char d[256]; + h5_loc_id_t local_vids[4]; + snprintf ( d, sizeof(d), "=%llx=", (long long)local_id ); + H5FedGetVertexIndicesOfEntity ( m, local_id, local_vids ); + snprintf ( v, sizeof(v), "=[%lld,%lld,%lld]=", + (long long)local_vids[0], + (long long)local_vids[1], + (long long)local_vids[2] ); + printf ( "| %-18s | %-18s |\n", d, v ); + } + num_triangles++; + } + + /* done */ + H5FedEndTraverseEntities (iter); + timer->stop(timer); + printf (" %fsec, number of triangles: %lu\n", + timer->elapsed(timer), + (unsigned long)num_triangles); + return H5_SUCCESS; +} + +static h5_err_t +traverse_boundary_triangles ( + h5t_mesh_t* const m, + int dumpit, + Timer* timer + ) { + printf ( " %-32s", "Traversing boundary triangles: "); + + timer->start(timer); + /* get iterator for co-dim 1 entities, i.e. triangles */ + h5t_iterator_t* iter = H5FedBeginTraverseBoundaryFaces (m, 1); + + /* iterate */ + h5_loc_id_t local_id; + h5_size_t num_triangles = 0; + while ((local_id = H5FedTraverseEntities (iter)) >= 0) { + if (dumpit) { + printf ("\n"); + char v[256]; + char d[256]; + h5_loc_id_t local_vids[4]; + snprintf ( d, sizeof(d), "=%llx=", (long long)local_id ); + H5FedGetVertexIndicesOfEntity ( m, local_id, local_vids ); + snprintf ( v, sizeof(v), "=[%lld,%lld,%lld]=", + (long long)local_vids[0], + (long long)local_vids[1], + (long long)local_vids[2] ); + printf ( "| %-18s | %-18s |\n", d, v ); + } + num_triangles++; + } + + /* done */ + H5FedEndTraverseEntities (iter); + timer->stop(timer); + printf (" %fsec, number of boundary triangles: %lu\n", + timer->elapsed(timer), + (unsigned long)num_triangles); + return H5_SUCCESS; +} + +static h5_err_t +traverse_elems ( + h5t_mesh_t* const m, + int dumpit, + Timer* timer + ) { + printf ( " %-32s", "Traversing elements: "); + timer->start(timer); + /* get number of elements we have to expect */ + h5_size_t num_elems_expect = H5FedGetNumElementsTotal (m); + + /* get iterator for co-dim 0 */ + h5t_iterator_t* iter = H5FedBeginTraverseEntities (m, 0); + + /* iterate over all co-dim 0 entities, i.e. elements */ + h5_loc_id_t local_id; + h5_size_t num_elems = 0; + while ((local_id = H5FedTraverseEntities (iter)) >= 0) { + if (dumpit) { + printf ("\n"); + char v[256]; + char t[256]; + h5_loc_id_t local_vids[4]; + snprintf ( t, sizeof(t), "=%llx=", (long long)local_id ); + H5FedGetVertexIndicesOfEntity (m, local_id, local_vids); + snprintf ( v, sizeof(v), "=[%lld,%lld,%lld,%lld]=", + (long long)local_vids[0], (long long)local_vids[1], + (long long)local_vids[2], (long long)local_vids[3] ); + printf ( "| %-18s | %-18s |\n", t, v ); + } + num_elems++; + } + + /* done */ + H5FedEndTraverseEntities (iter); + timer->stop(timer); + /* report error if we got a different number then expected */ + if (num_elems != num_elems_expect) { + fprintf (stderr, "!!! Got %lld elements, but expected %lld.\n", + (long long)num_elems, (long long)num_elems_expect); + exit(1); + } + + printf (" %fsec, number of elements: %lld\n", + timer->elapsed(timer), + (long long)num_elems); + return H5_SUCCESS; +} + + +static h5_err_t +traverse_level ( + h5t_mesh_t* const m, + const h5t_lvl_idx_t level_id, + int dumpit, + Timer* timer + ) { + printf ("Setting level to %d\n", level_id); + H5FedSetLevel (m, level_id); + traverse_vertices (m, dumpit, timer); + traverse_edges (m, dumpit, timer); + traverse_triangles (m, dumpit, timer); + traverse_boundary_triangles (m, dumpit, timer); + traverse_elems (m, dumpit, timer); + return H5_SUCCESS; +} + +static h5_err_t +traverse_mesh ( + h5_file_t const f, + const h5_id_t mesh_id, + int dumpit + ) { + h5t_mesh_t* mesh; + Timer* timer = Timer_.new(); + + timer->start(timer); + /* open mesh and get number of levels */ + printf (" Opening mesh with id %lld\n", mesh_id); + H5FedOpenTetrahedralMeshByIndex (f, mesh_id, &mesh); + timer->stop(timer); + printf (" %fsec\n", timer->elapsed(timer)); + h5_size_t num_levels = H5FedGetNumLevels (mesh); + printf (" Number of levels in mesh: %lld\n", (long long)num_levels); + + /* loop over all levels */ + h5t_lvl_idx_t level_id; + for (level_id = 0; level_id < num_levels; level_id++) { + traverse_level (mesh, level_id, dumpit, timer); + } + /* done */ + H5FedCloseMesh (mesh); + timer->delete(timer); + return H5_SUCCESS; +} + +int +main ( + int argc, + char* argv[] + ) { + /* abort program on error, so we don't have to handle them */ + H5SetErrorHandler (H5AbortErrorhandler); + H5SetVerbosityLevel (2); + + /* open file and get number of meshes */ + h5_file_t f = H5OpenFile (FNAME, H5_O_RDONLY, 0); + h5_size_t num_meshes = H5FedGetNumTetrahedralMeshes (f); + printf (" Number of meshes: %lld\n", (long long)num_meshes); + + /* loop over all meshes */ + h5_id_t mesh_id; + int dumpit = 0; + for (mesh_id = 0; mesh_id < num_meshes; mesh_id++) { + traverse_mesh (f, mesh_id, dumpit); + } + + /* done */ + H5CloseFile (f); + return 0; +} diff --git a/examples/H5Fed/tetmesh_read_tags.c b/examples/H5Fed/tetmesh_read_tags.c new file mode 100644 index 0000000..a5dca7f --- /dev/null +++ b/examples/H5Fed/tetmesh_read_tags.c @@ -0,0 +1,400 @@ +#include +#include +#include + +#include "H5hut.h" + +const char* FNAME = "simple_tet.h5"; + +#ifndef PARALLEL_IO +#ifndef MPI_COMM_WORLD +#define MPI_COMM_WORLD 0 +#endif +#endif + +typedef struct timer { + clock_t _start; + clock_t _end; + struct timer* (*new)(void); + void (*delete)(struct timer*); + void (*start)(struct timer*); + void (*stop)(struct timer*); + double (*elapsed)(struct timer*); +} Timer; + +extern Timer Timer_; +static Timer* +new ( + void + ) { + Timer* self = malloc (sizeof (Timer)); + *self = Timer_; + return self; +} + +static void +delete (Timer* self) { + free (self); +} + +static void +start (Timer* self) { + self->_start = clock(); +} + +static void +stop (Timer* self) { + self->_end = clock(); +} + +static double +elapsed (Timer* self) { + return (double)(self->_end - self->_start)/CLOCKS_PER_SEC; +} + +Timer Timer_ = { + 0, + 0, + new, + delete, + start, + stop, + elapsed +}; + +struct vertex { + h5_float64_t P[3]; +}; + +typedef struct vertex vertex_t; + +struct tet { + h5_glb_id_t global_id; + h5_glb_id_t parent_id; + h5_glb_id_t vids[4]; +}; +typedef struct tet tet_t; + +static h5_err_t +traverse_vertices ( + h5t_mesh_t* const m, + h5t_tagset_t* tagset, + int dumpit, + Timer* timer + ) { + printf ( " %-32s", "Traversing vertices: "); + + /* get iterator for co-dim 3 entities, i.e vertices */ + h5t_iterator_t* iter = H5FedBeginTraverseEntities (m, 3); + + /* iterate */ + h5_loc_id_t local_id; + h5_size_t num_entities = 0; + h5_size_t num_entities_tagged = 0; + timer->start(timer); + while ((local_id = H5FedTraverseEntities (iter)) >= 0) { + num_entities++; + if (dumpit) { + printf ("\n"); + h5_float64_t P[3]; + H5FedGetVertexCoordsByID (m, local_id, P); + char v[256]; + snprintf (v, sizeof(v), "=%llx=", (long long)local_id); + printf ("| %-18s | (%f, %f, %f) |", + v, P[0], P[1], P[2]); + } + + h5_size_t size = 3; + h5_int64_t tval[3]; + if ((local_id = H5FedGetTag (tagset, local_id, &size, tval)) < 0) { + continue; // not tagged + } + if (dumpit) { + printf (" (%llx, %llx, %llx) |", + tval[0], tval[1], tval[2]); + } + num_entities_tagged++; + if (tval[0] != local_id || + tval[1] != local_id+1 || + tval[2] != local_id+2) { + fprintf (stderr, + "!!! Wrong tag values for entity %lld\n", + (long long)local_id); + exit (1); + } + } + /* done */ + H5FedEndTraverseEntities (iter); + timer->stop(timer); + + if (dumpit) { + printf ("\n\nTime elapsed:"); + } + printf (" %fsec, total number of entities: %lu; tagged: %lu\n", + timer->elapsed(timer), + (unsigned long)num_entities, (unsigned long)num_entities_tagged); + return H5_SUCCESS; +} + +static h5_err_t +traverse_edges ( + h5t_mesh_t* const m, + h5t_tagset_t* tagset, + int dumpit, + Timer* timer + ) { + printf ( " %-32s", "Traversing edges: "); + timer->start(timer); + + /* get iterator for co-dim 2 entities, i.e. edges */ + h5t_iterator_t* iter = H5FedBeginTraverseEntities (m, 2); + + /* iterate */ + h5_loc_id_t local_id; + h5_size_t num_entities = 0; + h5_size_t num_entities_tagged = 0; + while ((local_id = H5FedTraverseEntities (iter)) >= 0) { + num_entities++; + if (dumpit) { + printf ("\n"); + char v[256]; + char k[256]; + h5_loc_id_t local_vids[4]; + snprintf ( k, sizeof(k), "=%llx=", (long long)local_id ); + H5FedGetVertexIndicesOfEntity ( m, local_id, local_vids ); + snprintf ( v, sizeof(v), "=[%lld,%lld]=", + (long long)local_vids[0], (long long)local_vids[1] ); + printf ( "| %-18s | %-18s |", k, v ); + } + h5_size_t size = 3; + h5_int64_t tval[3]; + if ((local_id = H5FedGetTag (tagset, local_id, &size, tval)) < 0) + continue; // not tagged + if (dumpit) { + printf (" (%llx, %llx, %llx) |", + tval[0], tval[1], tval[2]); + } + num_entities_tagged++; + + if (tval[0] != local_id || + tval[1] != local_id+1 || + tval[2] != local_id+2) { + fprintf (stderr, + "!!! Wrong tag values for entity %lld\n", + (long long)local_id); + exit (1); + } + } + + /* done */ + H5FedEndTraverseEntities (iter); + timer->stop(timer); + + if (dumpit) { + printf ("\n\nTime elapsed:"); + } + printf (" %fsec, total number of entities: %lu; tagged: %lu\n", + timer->elapsed(timer), + (unsigned long)num_entities, (unsigned long)num_entities_tagged); + return H5_SUCCESS; +} + +static h5_err_t +traverse_triangles ( + h5t_mesh_t* const m, + h5t_tagset_t* tagset, + int dumpit, + Timer* timer + ) { + printf ( " %-32s", "Traversing triangles: "); + timer->start(timer); + /* get iterator for co-dim 1 entities, i.e. triangles */ + h5t_iterator_t* iter = H5FedBeginTraverseEntities (m, 1); + + /* iterate */ + h5_loc_id_t local_id; + h5_size_t num_entities = 0; + h5_size_t num_entities_tagged = 0; + while ((local_id = H5FedTraverseEntities (iter)) >= 0) { + num_entities++; + if (dumpit) { + printf ("\n"); + char v[256]; + char k[256]; + h5_loc_id_t local_vids[4]; + snprintf ( k, sizeof(k), "=%llx=", (long long)local_id ); + H5FedGetVertexIndicesOfEntity ( m, local_id, local_vids ); + snprintf ( v, sizeof(v), "=[%lld,%lld,%lld]=", + (long long)local_vids[0], + (long long)local_vids[1], + (long long)local_vids[2] ); + printf ( "| %-18s | %-18s |", k, v ); + } + h5_size_t size = 3; + h5_int64_t tval[3]; + if ((local_id = H5FedGetTag (tagset, local_id, &size, tval)) < 0) + continue; // not tagged + if (dumpit) { + printf (" (%llx, %llx, %llx) |", + tval[0], tval[1], tval[2]); + } + num_entities_tagged++; + + if (tval[0] != local_id || tval[1] != local_id+1 || tval[2] != local_id+2) { + fprintf (stderr, + "!!! Wrong tag values for entity %lld\n", + (long long)local_id); + exit (1); + } + } + + /* done */ + H5FedEndTraverseEntities (iter); + timer->stop(timer); + + if (dumpit) { + printf ("\n\nTime elapsed:"); + } + printf (" %fsec, total number of entities: %lu; tagged: %lu\n", + timer->elapsed(timer), + (unsigned long)num_entities, (unsigned long)num_entities_tagged); + return H5_SUCCESS; +} + +static h5_err_t +traverse_tets ( + h5t_mesh_t* const m, + h5t_tagset_t* tagset, + int dumpit, + Timer* timer + ) { + printf ( " %-32s", "Traversing tetrahedra: "); + timer->start(timer); + /* get iterator for co-dim 0 entities, i.e. tetrahedra */ + h5t_iterator_t* iter = H5FedBeginTraverseEntities (m, 0); + /* iterate */ + h5_loc_id_t local_id; + h5_size_t num_entities = 0; + h5_size_t num_entities_tagged = 0; + while ((local_id = H5FedTraverseEntities (iter)) >= 0) { + num_entities++; + if (dumpit) { + printf ("\n"); + char v[256]; + char k[256]; + h5_loc_id_t local_vids[4]; + snprintf ( k, sizeof(k), "=%llx=", (long long)local_id ); + H5FedGetVertexIndicesOfEntity ( m, local_id, local_vids ); + snprintf ( v, sizeof(v), "=[%lld,%lld,%lld,%lld]=", + (long long)local_vids[0], + (long long)local_vids[1], + (long long)local_vids[2], + (long long)local_vids[3] ); + printf ( "| %-18s | %-18s |", k, v ); + } + h5_size_t size = 3; + h5_int64_t tval[3]; + if ((local_id = H5FedGetTag (tagset, local_id, &size, tval)) < 0) + continue; // not tagged + if (dumpit) { + printf (" (%llx, %llx, %llx) |", + tval[0], tval[1], tval[2]); + } + num_entities_tagged++; + + if (tval[0] != local_id || tval[1] != local_id+1 || tval[2] != local_id+2) { + fprintf (stderr, + "!!! Wrong tag values for entity %lld\n", + (long long)local_id); + exit (1); + } + } + + /* done */ + H5FedEndTraverseEntities (iter); + timer->stop(timer); + + if (dumpit) { + printf ("\n\nTime elapsed:"); + } + printf (" %fsec, total number of entities: %lu; tagged: %lu\n", + timer->elapsed(timer), + (unsigned long)num_entities, (unsigned long)num_entities_tagged); + return H5_SUCCESS; +} + +static h5_err_t +traverse_level ( + h5t_mesh_t* const m, + h5t_tagset_t* tagset, + const h5t_lvl_idx_t level_id, + int dumpit, + Timer* timer + ) { + printf ("Setting level to %d\n", level_id); + H5FedSetLevel (m, level_id); + traverse_vertices (m, tagset, dumpit, timer); + traverse_edges (m, tagset, dumpit, timer); + traverse_triangles (m, tagset, dumpit, timer); + traverse_tets (m, tagset, dumpit, timer); + return H5_SUCCESS; +} + +static h5_err_t +traverse_mesh ( + const h5_file_t f, + const h5_id_t mesh_id, + int dumpit + ) { + h5t_mesh_t* mesh; + Timer* timer = Timer_.new(); + timer->start(timer); + /* open mesh and get number of levels */ + printf (" Opening mesh with id %lld\n", mesh_id); + H5FedOpenTetrahedralMeshByIndex (f, mesh_id, &mesh); + timer->stop(timer); + printf (" %fsec\n", timer->elapsed(timer)); + + h5t_tagset_t* tagset; + H5FedOpenMTagset (mesh, "testtag", &tagset); + + h5_size_t num_levels = H5FedGetNumLevels (mesh); + printf (" Number of levels in mesh: %lld\n", (long long)num_levels); + + /* loop over all levels */ + h5t_lvl_idx_t level_id; + for (level_id = 0; level_id < num_levels; level_id++) { + traverse_level (mesh, tagset, level_id, dumpit, timer); + } + /* done */ + H5FedCloseMTagset (tagset); + H5FedCloseMesh (mesh); + timer->delete(timer); + return H5_SUCCESS; +} + +int +main ( + int argc, + char* argv[] + ) { + /* abort program on error, so we don't have to handle them */ + H5SetErrorHandler (H5AbortErrorhandler); + H5SetVerbosityLevel (2); + + /* open file and get number of meshes */ + h5_file_t f = H5OpenFile (FNAME, H5_O_RDONLY, 0); + h5_size_t num_meshes = H5FedGetNumTetrahedralMeshes (f); + printf (" Number of meshes: %lld\n", (long long)num_meshes); + + /* loop over all meshes */ + h5_id_t mesh_id; + int dumpit = 1; + for (mesh_id = 0; mesh_id < num_meshes; mesh_id++) { + traverse_mesh (f, mesh_id, dumpit); + } + + /* done */ + H5CloseFile (f); + return 0; +} diff --git a/examples/H5Fed/tetmesh_write.c b/examples/H5Fed/tetmesh_write.c new file mode 100644 index 0000000..e009745 --- /dev/null +++ b/examples/H5Fed/tetmesh_write.c @@ -0,0 +1,83 @@ +#include +#include +#include + +#include "H5hut.h" + +#ifndef PARALLEL_IO +#ifndef MPI_COMM_WORLD +#define MPI_COMM_WORLD 0 +#endif +#endif + +const char* FNAME = "simple_tet.h5"; + +typedef struct vertex { + h5_float64_t P[3]; +} vertex_t; + +typedef struct elem { + h5_loc_idx_t vids[4]; +} elem_t; + +vertex_t Vertices[] = { + {{-1.0, 0.0, 0.0}}, + {{ 1.0, 0.0, 0.0}}, + {{ 0.0, 1.0, 0.0}}, + {{ 0.0, 0.0, 1.0}}, + {{ 0.0, -1.0, 0.0}} +}; + +elem_t Elems[] = { + {{ 0, 1, 2, 3 }}, // 0, 3, 2, 1 + {{ 0, 1, 3, 4 }} // 0, 4, 3, 1 +}; + +const int num_vertices = sizeof (Vertices) / sizeof (Vertices[0]); +const int num_elems = sizeof (Elems) / sizeof (Elems[0]); + +int +main ( + int argc, + char* argv[] + ) { + /* abort program on errors in library */ + H5SetErrorHandler (H5AbortErrorhandler); + H5SetVerbosityLevel (5); + + /* open file and add mesh */ + h5_file_t const f = H5OpenFile (FNAME, H5_O_WRONLY, 0); + h5t_mesh_t* mesh; + H5FedAddTetrahedralMesh (f, "0", &mesh); + + /* store vertices */ + H5FedBeginStoreVertices (mesh, num_vertices); + int i; + for (i = 0; i < num_vertices; i++) { + H5FedStoreVertex (mesh, -1, Vertices[i].P); + } + H5FedEndStoreVertices (mesh); + + /* store elements */ + H5FedBeginStoreElements (mesh, num_elems); + for (i = 0; i < num_elems; i++) { + H5FedStoreElement (mesh, Elems[i].vids); + } + H5FedEndStoreElements (mesh); + + /* add 1. Level */ + H5FedAddLevel(mesh); + H5FedBeginRefineElements (mesh); + H5FedRefineElement (mesh, 0); + H5FedEndRefineElements (mesh); + + /* add 2. Level */ + H5FedAddLevel(mesh); + H5FedBeginRefineElements (mesh); + H5FedRefineElement (mesh, 2); + H5FedEndRefineElements (mesh); + + H5FedCloseMesh (mesh); + H5CloseFile (f); + return 0; +} diff --git a/examples/H5Fed/tetmesh_write1.c b/examples/H5Fed/tetmesh_write1.c new file mode 100644 index 0000000..62ac1d2 --- /dev/null +++ b/examples/H5Fed/tetmesh_write1.c @@ -0,0 +1,75 @@ +#include +#include +#include + +#include "H5hut.h" + +#ifndef PARALLEL_IO +#ifndef MPI_COMM_WORLD +#define MPI_COMM_WORLD 0 +#endif +#endif + +const char* FNAME = "simple_tet1.h5"; + +typedef struct vertex { + h5_float64_t P[3]; +} vertex_t; + +typedef struct elem { + h5_loc_idx_t vids[4]; +} elem_t; + +vertex_t Vertices[] = { + {{-1.0, 0.0, 0.0}}, + {{ 0.0, 0.0, 1.0}}, + {{ 0.0, 1.0, 0.0}}, + {{ 1.0, 0.0, 0.0}}, +}; + +elem_t Elems[] = { + {{ 0, 1, 2, 3 }}, +}; + +const int num_vertices = sizeof (Vertices) / sizeof (Vertices[0]); +const int num_elems = sizeof (Elems) / sizeof (Elems[0]); + +int +main ( + int argc, + char* argv[] + ) { + /* abort program on errors in library */ + H5SetErrorHandler (H5AbortErrorhandler); + H5SetVerbosityLevel (H5_DEBUG_ALL); + + /* open file and add mesh */ + h5_file_t const f = H5OpenFile (FNAME, H5_O_WRONLY, 0); + h5t_mesh_t* mesh; + H5FedAddTetrahedralMesh (f, "0", &mesh); + + /* store vertices */ + H5FedBeginStoreVertices (mesh, num_vertices); + int i; + for (i = 0; i < num_vertices; i++) { + H5FedStoreVertex (mesh, -1, Vertices[i].P); + } + H5FedEndStoreVertices (mesh); + + /* store elements */ + H5FedBeginStoreElements (mesh, num_elems); + for (i = 0; i < num_elems; i++) { + H5FedStoreElement (mesh, Elems[i].vids); + } + H5FedEndStoreElements (mesh); + + /* add 1. Level */ + H5FedAddLevel(mesh); + H5FedBeginRefineElements (mesh); + H5FedRefineElement (mesh, 0); + H5FedEndRefineElements (mesh); + + H5FedCloseMesh (mesh); + H5CloseFile (f); + return 0; +} diff --git a/examples/H5Fed/tetmesh_write2.c b/examples/H5Fed/tetmesh_write2.c new file mode 100644 index 0000000..2b3c066 --- /dev/null +++ b/examples/H5Fed/tetmesh_write2.c @@ -0,0 +1,109 @@ +#include +#include +#include + +#include "H5hut.h" + +const char* FNAME = "large_tet.h5"; +const h5_int32_t num_levels = 11; + + +typedef struct vertex { + h5_float64_t P[3]; +} vertex_t; + +typedef struct elem { + h5_loc_idx_t vids[4]; +} elem_t; + +vertex_t Vertices[] = { + {{-1.0, 0.0, 0.0}}, + {{ 1.0, 0.0, 0.0}}, + {{ 0.0, 1.0, 0.0}}, + {{ 0.0, 0.0, 1.0}} +}; + +elem_t Elems[] = { + {{ 0, 1, 2, 3 }} +}; + +const int num_vertices = sizeof (Vertices) / sizeof (Vertices[0]); +const int num_elems = sizeof (Elems) / sizeof (Elems[0]); + +static h5_int32_t +power ( + const h5_int32_t x, + const h5_int32_t y + ) { + h5_int32_t p = 1; + h5_int32_t b = y; + // bits in b correspond to values of powerN + // so start with p=1, and for each set bit in b, + // multiply corresponding table entry + h5_int32_t powerN = x; + + while (b != 0) { + if ((b&1) != 0) p *= powerN; + b >>= 1; + powerN = powerN * powerN; + } + return p; +} + +int +main ( + int argc, + char* argv[] + ) { + /* abort program on errors in library */ + H5SetErrorHandler (H5AbortErrorhandler); + H5SetVerbosityLevel (2); + // H5SetVerbosityLevel (H5_DEBUG_ALL); + + /* open file and add mesh */ + h5_file_t const f = H5OpenFile (FNAME, H5_O_WRONLY, 0); + h5t_mesh_t* mesh; + H5FedAddTetrahedralMesh (f, "0", &mesh); + + /* store vertices */ + H5FedBeginStoreVertices (mesh, num_vertices); + int i; + for (i = 0; i < num_vertices; i++) { + H5FedStoreVertex (mesh, -1, Vertices[i].P); + } + H5FedEndStoreVertices (mesh); + + /* store elements */ + H5FedBeginStoreElements (mesh, num_elems); + for (i = 0; i < num_elems; i++) { + H5FedStoreElement (mesh, Elems[i].vids); + } + H5FedEndStoreElements (mesh); + + /* add 1. Level */ + H5FedAddLevel(mesh); + H5FedBeginRefineElements (mesh); + H5FedRefineElement (mesh, 0); + H5FedEndRefineElements (mesh); + + /* add levels 2 to num_levels-1 */ + h5_int32_t num_elems_last_level = 1; + h5_int32_t level_id; + for (level_id = 2; level_id < num_levels; level_id++) { + + /* refine 4 to the power of level_id-1 elems */ + H5FedAddLevel(mesh); + h5_int32_t num_elems2refine = power (4, level_id-1); + H5FedBeginRefineElements (mesh); + for (i = num_elems_last_level; + i < num_elems_last_level+num_elems2refine; + i++) { + H5FedRefineElement (mesh, i); + } + H5FedEndRefineElements (mesh); + num_elems_last_level += 2 * num_elems2refine; + } + H5FedCloseMesh (mesh); + H5CloseFile (f); + return 0; +} diff --git a/examples/H5Fed/tetmesh_write_tags.c b/examples/H5Fed/tetmesh_write_tags.c new file mode 100644 index 0000000..56ebed0 --- /dev/null +++ b/examples/H5Fed/tetmesh_write_tags.c @@ -0,0 +1,230 @@ +#include +#include +#include +#include + +#include "H5hut.h" + +const h5_oid_t MESH_TYPE = H5_TETRAHEDRAL_MESH; +const char* FNAME = "simple_tet.h5"; + +typedef struct timer { + clock_t _start; + clock_t _end; + struct timer* (*new)(void); + void (*delete)(struct timer*); + void (*start)(struct timer*); + void (*stop)(struct timer*); + double (*elapsed)(struct timer*); +} Timer; + +extern Timer Timer_; +static Timer* +new ( + void + ) { + Timer* this = malloc (sizeof (Timer)); + *this = Timer_; + return this; +} + +static void +delete (Timer* this) { + free (this); +} + +static void +start (Timer* this) { + this->_start = clock(); +} + +static void +stop (Timer* this) { + this->_end = clock(); +} + +static double +elapsed (Timer* this) { + return (double)(this->_end - this->_start)/CLOCKS_PER_SEC; +} + +Timer Timer_ = { + 0, + 0, + new, + delete, + start, + stop, + elapsed +}; + +static h5_err_t +set_vertex_tags ( + h5t_mesh_t* m, + h5t_tagset_t* const tagset, + int verify, + Timer* timer + ) { + h5_loc_id_t local_id; + h5_int64_t val[3]; + h5_info ("Tagging all vertices ..."); + timer->start(timer); + h5t_iterator_t* iter = H5FedBeginTraverseEntities (m, 3); + while ((local_id = H5FedTraverseEntities (iter)) >= 0) { + val[0] = local_id; + val[1] = local_id+1; + val[2] = local_id+2; + H5FedSetTag (tagset, local_id, 3, val); + if (verify) { + h5_int64_t retval[3]; + h5_size_t dim = 3; + H5FedGetTag (tagset, local_id, &dim, retval); + if (memcmp (val, retval, sizeof(val))) { + h5_warn ("Oops on entity %llx!", (long long)local_id); + } + } + h5_debug ("Tagging %llx", (long long)local_id); + } + timer->stop(timer); + h5_info (" Time to tag to all vertices: %fsec", timer->elapsed(timer)); + return H5FedEndTraverseEntities (iter); +} + +static h5_err_t +set_edge_tags ( + h5t_mesh_t* const m, + h5t_tagset_t* tagset, + int dumpit, + Timer* timer + ) { + h5_loc_id_t local_id; + h5_int64_t val[3]; + h5_info ("Tagging all edges ..."); + timer->start(timer); + h5t_iterator_t* iter = H5FedBeginTraverseEntities (m, 2); + while ((local_id = H5FedTraverseEntities (iter)) >= 0) { + val[0] = local_id; + val[1] = local_id+1; + val[2] = local_id+2; + H5FedSetTag (tagset, local_id, 3, val); + h5_int64_t retval[3]; + h5_size_t dims; + H5FedGetTag (tagset, local_id, &dims, retval); + if (memcmp ( val, retval, sizeof(val))) { + h5_warn ("Oops on entity %llx!", (long long)local_id); + } + } + timer->stop(timer); + h5_info (" Time to tag all edges: %fsec", timer->elapsed(timer)); + return H5FedEndTraverseEntities (iter); +} + +static h5_err_t +set_tri_tags ( + h5t_mesh_t* const m, + h5t_tagset_t* tagset, + int dumpit, + Timer* timer + ) { + h5_loc_id_t local_id; + h5_int64_t val[3]; + h5_info ("Tagging all triangles ..."); + timer->start(timer); + h5t_iterator_t* iter = H5FedBeginTraverseEntities (m, 1); + while ((local_id = H5FedTraverseEntities (iter)) >= 0) { + val[0] = local_id; + val[1] = local_id+1; + val[2] = local_id+2; + H5FedSetTag (tagset, local_id, 3, val); + h5_int64_t retval[3]; + h5_size_t dims; + H5FedGetTag (tagset, local_id, &dims, retval); + if (memcmp (val, retval, sizeof(val))) { + h5_warn ("Oops on entity %llx!", (long long)local_id); + } + } + timer->stop(timer); + h5_info (" Time to tag all triangles: %fsec", timer->elapsed(timer)); + return H5FedEndTraverseEntities (iter); +} + +static h5_err_t +set_tet_tags ( + h5t_mesh_t* const m, + h5t_tagset_t* tagset, + int dumpit, + Timer* timer + ) { + h5_loc_id_t local_id; + h5_int64_t val[3]; + h5_info ("Tagging all tetrahedra ..."); + timer->start(timer); + h5t_iterator_t* iter = H5FedBeginTraverseEntities (m, 0); + while ((local_id = H5FedTraverseEntities (iter)) >= 0) { + val[0] = local_id; + val[1] = local_id+1; + val[2] = local_id+2; + H5FedSetTag (tagset, local_id, 3, val); + h5_int64_t retval[3]; + h5_size_t dims; + H5FedGetTag (tagset, local_id, &dims, retval); + if (memcmp (val, retval, sizeof(val))) { + h5_warn ("Oops on entity %llx!", (long long)local_id); + } + } + timer->stop(timer); + h5_info (" Time to tag to all tetrahedra: %fsec", timer->elapsed(timer)); + return H5FedEndTraverseEntities (iter); +} + +int +main ( + int argc, + char* argv[] + ) { + int verify = 1; + /* abort program on error, so we don't have to handle them */ + H5SetErrorHandler (H5AbortErrorhandler); + H5SetVerbosityLevel (3); + + /* open file and get number of meshes */ + h5_file_t f = H5OpenFile (FNAME, H5_O_RDWR, 0); + h5t_mesh_t* mesh; + Timer* timer = Timer_.new(); + timer->start(timer); + H5FedOpenTetrahedralMesh (f, "0", &mesh); + timer->stop(timer); + h5_info (" Time to open mesh %fsec", timer->elapsed(timer)); + + /* open last level */ + h5_size_t num_levels = H5FedGetNumLevels (mesh); + //H5FedSetLevel (mesh, num_levels-1); + H5FedSetLevel (mesh, 0); + + /* add new tagset and write some data to it */ + h5t_tagset_t* tagset = NULL; + H5FedAddMTagset (mesh, "testtag", H5_INT64_T, &tagset); + set_vertex_tags (mesh, tagset, verify, timer); + set_edge_tags (mesh, tagset, verify, timer); + set_tri_tags (mesh, tagset, verify, timer); + set_tet_tags (mesh, tagset, verify, timer); + + // close tagset + timer->start(timer); + H5FedCloseMTagset (tagset); + timer->stop(timer); + h5_info (" Time to write tagset to disk %fsec", timer->elapsed(timer)); + + // close mesh + timer->start(timer); + H5FedCloseMesh (mesh); + timer->stop(timer); + h5_info (" Time to close mesh %fsec", timer->elapsed(timer)); + + // close file + timer->start(timer); + H5CloseFile (f); + timer->stop(timer); + h5_info (" Time to close file %fsec", timer->elapsed(timer)); + return 0; +} diff --git a/examples/H5Fed/trimesh_2gnuplot.c b/examples/H5Fed/trimesh_2gnuplot.c new file mode 100644 index 0000000..37ae6ec --- /dev/null +++ b/examples/H5Fed/trimesh_2gnuplot.c @@ -0,0 +1,101 @@ +#include +#include + +#include "H5hut.h" +#if defined (PARALLEL_IO) +#include +#endif + +#define H5FedGetNumLeafElementsTotal H5FedGetNumElementsTotal +/* + Traverse elements and output coordinates + */ +static h5_err_t +traverse_elems ( + h5t_mesh_t* const m + ) { + /* get number of elements we have to expect */ + h5_size_t num_elems_expect = H5FedGetNumLeafElementsTotal (m); + + /* get iterator for co-dim 0 */ + h5t_iterator_t* iter = H5FedBeginTraverseEntities (m, 0); + + /* iterate over all co-dim 0 entities, i.e. elements */ + h5_loc_id_t local_id; + h5_size_t num_elems = 0; + while ((local_id = H5FedTraverseEntities (iter)) >= 0) { + h5_loc_id_t local_vids[4]; + H5FedGetVertexIndicesOfEntity (m, local_id, local_vids); + + printf ("# cell %llx\n", (long long unsigned)local_id ); + h5_float64_t P[3]; + for (int i = 0; i < 3; i++) { + H5FedGetVertexCoordsByIndex (m, local_vids[i], P); + printf (" %8.6f %8.6f\n", P[0], P[1]); + } + H5FedGetVertexCoordsByIndex (m, local_vids[0], P); + printf (" %8.6f %8.6f\n", P[0], P[1]); + printf ("\n"); + num_elems++; + } + + /* done */ + H5FedEndTraverseEntities (iter); + + /* report error if we got a different number then expected */ + if (num_elems != num_elems_expect) { + fprintf (stderr, "!!! Got %lld elements, but expected %lld.\n", + (long long)num_elems, (long long)num_elems_expect); + exit(1); + } + return H5_SUCCESS; +} + +int +main ( + int argc, + char* argv[] + ) { + +#if defined (PARALLEL_IO) + MPI_Comm comm = MPI_COMM_WORLD; + MPI_Init (&argc, &argv); +#else + MPI_Comm comm = 0; +#endif + if (argc < 2 || argc > 3) { + fprintf (stderr, "Usage: %s FILE [LEVEL]\n", argv[0]); + exit (42); + } + + /* abort program on error, so we don't have to handle them */ + H5SetErrorHandler (H5AbortErrorhandler); + H5SetVerbosityLevel (0); + + /* open file and get number of meshes */ + h5_file_t f = H5OpenFile (argv[1], H5_O_RDONLY, comm); + h5t_mesh_t* m; + H5FedOpenTriangleMeshByIndex (f, 0, &m); + int num_levels = H5FedGetNumLevels (m); + int level = num_levels-1; + if (argc >= 3) { + level = atoi (argv[2]); + } + if (level >= num_levels || level < 0) { + fprintf (stderr, "level %d out of range\n", level); + goto done; + } + H5FedSetLevel (m, level); + traverse_elems (m); + + +done: + H5FedCloseMesh (m); + H5CloseFile (f); + +#if defined (PARALLEL_IO) + MPI_Finalize (); +#endif + + return 0; +} diff --git a/examples/H5Fed/trimesh_adjacencies.c b/examples/H5Fed/trimesh_adjacencies.c new file mode 100644 index 0000000..e44146b --- /dev/null +++ b/examples/H5Fed/trimesh_adjacencies.c @@ -0,0 +1,326 @@ +#include +#include +#include + +#include "H5hut.h" + +#define PRINT_UPADJACENCIES 1 +#define PRINT_DOWNADJACENCIES 0 + +const h5_oid_t MESH_TYPE = H5_TRIANGLE_MESH; +const char* FNAME = "simple_triangle.h5"; + +static h5_err_t +print_adjacencies_of_vertex ( + h5t_mesh_t* const m, + h5_loc_id_t local_id, + clock_t* time_used + ) { + h5_loc_idlist_t* uadj_edges; + h5_loc_idlist_t* uadj_triangles; + clock_t time_used_before = clock(); + H5FedGetAdjacencies (m, local_id, 1, &uadj_edges); + H5FedGetAdjacencies (m, local_id, 2, &uadj_triangles); + *time_used = clock() - time_used_before; + int n = 0; + if (uadj_triangles->num_items > n) n = uadj_triangles->num_items; + if (uadj_edges->num_items > n) n = uadj_edges->num_items; + int i; + for (i = 0; i < n; i++) { + char v[256]; + char k[256]; + char d[256]; + h5_loc_id_t local_vids[4]; + if (i == 0) { + H5FedGetVertexIndicesOfEntity ( + m, local_id, local_vids); + snprintf (v, sizeof(v), "=[%lld]=", + (long long)local_vids[0]); + } else { + *v = '\0'; + } + if (i < uadj_edges->num_items) { + H5FedGetVertexIndicesOfEntity ( + m, uadj_edges->items[i], local_vids); + snprintf (k, sizeof(k), "=[%lld,%lld]=", + (long long)local_vids[0], + (long long)local_vids[1]); + } else { + *k = '\0'; + } + if (i < uadj_triangles->num_items) { + H5FedGetVertexIndicesOfEntity ( + m, uadj_triangles->items[i], local_vids); + snprintf (d, sizeof(d), "=[%lld,%lld,%lld]=", + (long long)local_vids[0], + (long long)local_vids[1], + (long long)local_vids[2]); + } else { + *d = '\0'; + } + printf ("| %-18s | %-18s | %-18s |\n", v, k, d); + } + H5FedReleaseListOfAdjacencies (m, &uadj_edges); + H5FedReleaseListOfAdjacencies (m, &uadj_triangles); + return H5_SUCCESS; +} + +static h5_err_t +print_adjacencies_of_edge ( + h5t_mesh_t* const m, + h5_loc_id_t local_id, + clock_t* time_used + ) { + h5_loc_idlist_t* dadj_vertices; + h5_loc_idlist_t* uadj_triangles; + clock_t time_used_before = clock(); + H5FedGetAdjacencies (m, local_id, 0, &dadj_vertices); + H5FedGetAdjacencies (m, local_id, 2, &uadj_triangles); + *time_used = clock() - time_used_before; + int n = dadj_vertices->num_items; + if (uadj_triangles->num_items > n) n = uadj_triangles->num_items; + + int i; + for (i = 0; i < n; i++) { + char v[256]; + char k[256]; + char d[256]; + h5_loc_id_t local_vids[4]; + if (i < dadj_vertices->num_items) { + H5FedGetVertexIndicesOfEntity ( + m, dadj_vertices->items[i], local_vids); + snprintf (v, sizeof(v), "=[%lld]=", + (long long)local_vids[0]); + } else { + *v = '\0'; + } + if (i == 0) { + H5FedGetVertexIndicesOfEntity ( + m, local_id, local_vids); + snprintf (k, sizeof(k), "=[%lld,%lld]=", + (long long)local_vids[0], + (long long)local_vids[1]); + } else { + *k = '\0'; + } + if (i < uadj_triangles->num_items) { + H5FedGetVertexIndicesOfEntity ( + m, uadj_triangles->items[i], local_vids); + snprintf (d, sizeof(d), "=[%lld,%lld,%lld]=", + (long long)local_vids[0], + (long long)local_vids[1], + (long long)local_vids[2]); + } else { + *d = '\0'; + } + printf ("| %-18s | %-18s | %-18s |\n", v, k, d); + } + H5FedReleaseListOfAdjacencies (m, &dadj_vertices); + H5FedReleaseListOfAdjacencies (m, &uadj_triangles); + return H5_SUCCESS; +} + +static h5_err_t +print_adjacencies_of_elem ( + h5t_mesh_t* const m, + h5_loc_id_t local_id, + clock_t* time_used + ) { + h5_loc_idlist_t* dadj_vertices; + h5_loc_idlist_t* dadj_edges; + clock_t time_used_before = clock(); + H5FedGetAdjacencies (m, local_id, 0, &dadj_vertices); + H5FedGetAdjacencies (m, local_id, 1, &dadj_edges); + *time_used = clock() - time_used_before; + int n = dadj_vertices->num_items; + if (dadj_edges->num_items > n) n = dadj_edges->num_items; + int i; + for (i = 0; i < n; i++) { + char v[256]; + char k[256]; + char d[256]; + h5_loc_id_t local_vids[4]; + if (i < dadj_vertices->num_items) { + H5FedGetVertexIndicesOfEntity ( + m, dadj_vertices->items[i], local_vids); + snprintf (v, sizeof(v), "=[%lld]=", + (long long)local_vids[0]); + } else { + *v = '\0'; + } + if (i < dadj_edges->num_items) { + H5FedGetVertexIndicesOfEntity ( + m, dadj_edges->items[i], local_vids); + snprintf (k, sizeof(k), "=[%lld,%lld]=", + (long long)local_vids[0], + (long long)local_vids[1]); + } else { + *k = '\0'; + } + if (i == 0) { + H5FedGetVertexIndicesOfEntity ( + m, local_id, local_vids); + snprintf (d, sizeof(k), "=[%lld,%lld,%lld]=", + (long long)local_vids[0], + (long long)local_vids[1], + (long long)local_vids[2]); + } else { + *d = '\0'; + } + printf ( "| %-18s | %-18s | %-18s |\n", v, k, d ); + } + H5FedReleaseListOfAdjacencies (m, &dadj_vertices); + H5FedReleaseListOfAdjacencies (m, &dadj_edges); + return H5_SUCCESS; +} + +static h5_err_t +traverse_vertices ( + h5t_mesh_t* const m + ) { + h5_loc_id_t local_id; + h5_loc_idx_t num = 0; + clock_t t_total = 0; + clock_t t_min = CLOCKS_PER_SEC; + clock_t t_max = 0; + clock_t t = 0; + printf ("\nAdjacencies to vertices\n"); + h5t_iterator_t* iter = H5FedBeginTraverseEntities (m, 2); + while ((local_id = H5FedTraverseEntities (iter)) >= 0) { + print_adjacencies_of_vertex (m, local_id, &t); + num++; + t_total += t; + if (t < t_min) t_min = t; + if (t > t_max) t_max = t; + } + fprintf ( + stderr, + "%lld\ttotal: %f\tmin: %f\tavg: %f\tmax: %f\n", + (long long)num, + (double)t_total / (double)CLOCKS_PER_SEC, + (double)t_min / (double)CLOCKS_PER_SEC, + (double)t_total / (double)CLOCKS_PER_SEC / (double)num, + (double)t_max / (double)CLOCKS_PER_SEC ); + return H5FedEndTraverseEntities (iter); +} + +static h5_err_t +traverse_edges ( + h5t_mesh_t* const m + ) { + h5_loc_id_t local_id; + h5_loc_idx_t num = 0; + clock_t t_total = 0; + clock_t t_min = CLOCKS_PER_SEC; + clock_t t_max = 0; + clock_t t = 0; + printf ("\nAdjacencies to edges\n"); + h5t_iterator_t* iter = H5FedBeginTraverseEntities (m, 1); + while ((local_id = H5FedTraverseEntities (iter)) >= 0) { + print_adjacencies_of_edge (m, local_id, &t); + num++; + t_total += t; + if (t < t_min) t_min = t; + if (t > t_max) t_max = t; + } + fprintf ( + stderr, + "%lld\ttotal: %f\tmin: %f\tavg: %f\tmax: %f\n", + (long long)num, + (double)t_total / (double)CLOCKS_PER_SEC, + (double)t_min / (double)CLOCKS_PER_SEC, + (double)t_total / (double)CLOCKS_PER_SEC / (double)num, + (double)t_max / (double)CLOCKS_PER_SEC ); + return H5FedEndTraverseEntities (iter); +} + +static h5_err_t +traverse_elems ( + h5t_mesh_t* const m + ) { + h5_loc_id_t local_id; + h5_loc_idx_t num = 0; + clock_t t_total = 0; + clock_t t_min = CLOCKS_PER_SEC; + clock_t t_max = 0; + clock_t t = 0; + printf ("\nAdjacencies to tetrahedra\n"); + h5t_iterator_t* iter = H5FedBeginTraverseEntities (m, 0); + while ((local_id = H5FedTraverseEntities (iter)) >= 0) { + print_adjacencies_of_elem (m, local_id, &t); + num++; + t_total += t; + if (t < t_min) t_min = t; + if (t > t_max) t_max = t; + } + fprintf ( + stderr, + "%lld\ttotal: %f\tmin: %f\tavg: %f\tmax: %f\n", + (long long)num, + (double)t_total / (double)CLOCKS_PER_SEC, + (double)t_min / (double)CLOCKS_PER_SEC, + (double)t_total / (double)CLOCKS_PER_SEC / (double)num, + (double)t_max / (double)CLOCKS_PER_SEC); + return H5FedEndTraverseEntities (iter); +} + +static h5_err_t +traverse_level ( + h5t_mesh_t* const m, + const h5t_lvl_idx_t level_id + ) { + printf (" Setting level to %d\n", level_id); + H5FedSetLevel (m, level_id); + traverse_vertices (m); + traverse_edges (m); + traverse_elems (m); + return H5_SUCCESS; +} + +static h5_err_t +traverse_mesh ( + const h5_file_t f, + const h5_id_t mesh_id + ) { + h5t_mesh_t* m; + /* open mesh and get number of levels */ + printf (" Opening mesh with id %lld\n", mesh_id); + H5FedOpenTriangleMeshByIndex (f, mesh_id, &m); + h5_size_t num_levels = H5FedGetNumLevels (m); + printf (" Number of levels in mesh: %lld\n", (long long)num_levels); + + /* loop over all levels */ + h5t_lvl_idx_t level_id; + for (level_id = 0; level_id < num_levels; level_id++) { + traverse_level (m, level_id); + } + /* done */ + H5FedCloseMesh (m); + return H5_SUCCESS; +} + +int +main ( + int argc, + char* argv[] + ) { + + /* abort program on error, so we don't have to handle them */ + H5SetErrorHandler (H5AbortErrorhandler); + H5SetVerbosityLevel (2); + + /* open file and get number of meshes */ + h5_file_t f = H5OpenFile (FNAME, H5_O_RDONLY, 0); + h5_size_t num_meshes = H5FedGetNumTriangleMeshes (f); + printf (" Number of meshes: %lld\n", (long long)num_meshes); + + /* loop over all meshes */ + h5_id_t mesh_id; + for (mesh_id = 0; mesh_id < num_meshes; mesh_id++) { + traverse_mesh (f, mesh_id); + } + + /* done */ + H5CloseFile (f); + return 0; +} diff --git a/examples/H5Fed/trimesh_read.c b/examples/H5Fed/trimesh_read.c new file mode 100644 index 0000000..f2899fe --- /dev/null +++ b/examples/H5Fed/trimesh_read.c @@ -0,0 +1,268 @@ +#include +#include + +#include "H5hut.h" +#if defined (PARALLEL_IO) +#include +#endif + +const char* FNAME = "simple_triangle.h5"; + +static h5_err_t +traverse_vertices ( + h5t_mesh_t* const m + ) { + /* get number of vertices we have to expect */ + h5_size_t num_vertices_expect = H5FedGetNumVerticesTotal (m); + + /* get iterator for co-dim 2 entities, i.e. vertices */ + h5t_iterator_t* iter = H5FedBeginTraverseEntities (m, 2); + + /* iterate */ + h5_loc_id_t local_id; + h5_size_t num_vertices = 0; + while ((local_id = H5FedTraverseEntities (iter)) >= 0) { + h5_float64_t P[3]; + H5FedGetVertexCoordsByID (m, local_id, P); + char v[256]; + snprintf (v, sizeof(v), "=%llx=", (long long)local_id); + printf ("| %-18s | (%f, %f, %f) |\n", + v, P[0], P[1], P[2]); + num_vertices++; + } + + /* done */ + H5FedEndTraverseEntities (iter); + + /* report error if we got a different number then expected */ + if (num_vertices != num_vertices_expect) { + fprintf (stderr, "!!! Got %lld vertices, but expected %lld.\n", + (long long)num_vertices, (long long)num_vertices_expect); + exit (1); + } + + printf (" Number of vertices on level: %lld\n", (long long)num_vertices); + return H5_SUCCESS; +} + +static h5_err_t +traverse_edges ( + h5t_mesh_t* const m + ) { + printf ( "Travering edges on level %lld:\n", (long long)H5FedGetLevel(m) ); + + /* get iterator for co-dim 1 entities, i.e. edges */ + h5t_iterator_t* iter = H5FedBeginTraverseEntities (m, 1); + + /* iterate */ + h5_loc_id_t local_id; + h5_size_t num_edges = 0; + while ((local_id = H5FedTraverseEntities (iter)) >= 0) { + char v[256]; + char k[256]; + h5_loc_id_t local_vids[4]; + snprintf ( k, sizeof(k), "=%llx=", (long long)local_id ); + H5FedGetVertexIndicesOfEntity ( m, local_id, local_vids ); + snprintf ( v, sizeof(v), "=[%lld,%lld]=", + (long long)local_vids[0], (long long)local_vids[1] ); + printf ( "| %-18s | %-18s |\n", k, v ); + num_edges++; + } + + /* done */ + H5FedEndTraverseEntities (iter); + + printf (" Number of edges: %lld\n", (long long)num_edges); + return H5_SUCCESS; +} + +static h5_err_t +traverse_boundary_edges ( + h5t_mesh_t* const m + ) { + printf ("Travering boundary edges on level %lld:\n", (long long)H5FedGetLevel(m)); + + /* get iterator for co-dim 1 entities, i.e. edges */ + h5t_iterator_t* iter = H5FedBeginTraverseBoundaryFaces (m, 1); + + /* iterate */ + h5_loc_id_t local_id; + h5_size_t num_edges = 0; + while ((local_id = H5FedTraverseEntities (iter)) >= 0) { + char v[256]; + char k[256]; + h5_loc_id_t local_vids[4]; + snprintf ( k, sizeof(k), "=%llx=", (long long)local_id); + H5FedGetVertexIndicesOfEntity (m, local_id, local_vids); + snprintf ( v, sizeof(v), "=[%lld,%lld]=", + (long long)local_vids[0], (long long)local_vids[1] ); + printf ( "| %-18s | %-18s |\n", k, v ); + num_edges++; + } + + /* done */ + H5FedEndTraverseEntities (iter); + + printf (" Number of edges: %lld\n", (long long)num_edges); + return H5_SUCCESS; +} + +static h5_err_t +traverse_elems ( + h5t_mesh_t* const m + ) { + /* get number of elements we have to expect */ + h5_size_t num_elems_expect = H5FedGetNumElementsTotal (m); + + /* get iterator for co-dim 0 */ + h5t_iterator_t* iter = H5FedBeginTraverseEntities (m, 0); + + /* iterate over all co-dim 0 entities, i.e. elements */ + h5_loc_id_t local_id; + h5_size_t num_elems = 0; + while ((local_id = H5FedTraverseEntities (iter)) >= 0) { + char v[256]; + char t[256]; + h5_loc_id_t local_vids[4]; + snprintf (t, sizeof(t), "=%llx=", (long long)local_id); + H5FedGetVertexIndicesOfEntity (m, local_id, local_vids); + snprintf (v, sizeof(v), "=[%lld,%lld,%lld]=", + (long long)local_vids[0], + (long long)local_vids[1], + (long long)local_vids[2]); + printf ("| %-18s | %-18s |\n", t, v); + num_elems++; + } + + /* done */ + H5FedEndTraverseEntities (iter); + + /* report error if we got a different number then expected */ + if (num_elems != num_elems_expect) { + fprintf (stderr, "!!! Got %lld elements, but expected %lld.\n", + (long long)num_elems, (long long)num_elems_expect); + exit(1); + + + } + + printf (" Number of elements on level: %lld\n", (long long)num_elems); + return H5_SUCCESS; +} + +/* + Traverse elements and output coordinates + */ +static h5_err_t +traverse_elems2 ( + h5t_mesh_t* const m + ) { + /* get number of elements we have to expect */ + h5_size_t num_elems_expect = H5FedGetNumElementsTotal (m); + + /* get iterator for co-dim 0 */ + h5t_iterator_t* iter = H5FedBeginTraverseEntities (m, 0); + + /* iterate over all co-dim 0 entities, i.e. elements */ + h5_loc_id_t local_id; + h5_size_t num_elems = 0; + while ((local_id = H5FedTraverseEntities (iter)) >= 0) { + printf ("%05llu", (unsigned long long)num_elems); + h5_loc_id_t local_vids[4]; + H5FedGetVertexIndicesOfEntity (m, local_id, local_vids); + int i; + for (i = 0; i < 3; i++) { + h5_float64_t P[3]; + H5FedGetVertexCoordsByIndex (m, local_vids[i], P); + printf (" %8.6f %8.6f %8.6f", P[0], P[1], P[2]); + } + printf ("\n"); + num_elems++; + } + + /* done */ + H5FedEndTraverseEntities (iter); + + /* report error if we got a different number then expected */ + if (num_elems != num_elems_expect) { + fprintf (stderr, "!!! Got %lld elements, but expected %lld.\n", + (long long)num_elems, (long long)num_elems_expect); + exit(1); + } + return H5_SUCCESS; +} + +static h5_err_t +traverse_level ( + h5t_mesh_t* const m, + const h5_loc_id_t level_id + ) { + printf (" Setting level to %d\n", level_id); + H5FedSetLevel (m, level_id); + traverse_vertices (m); + traverse_edges (m); + traverse_boundary_edges (m); + traverse_elems (m); + traverse_elems2 (m); + return H5_SUCCESS; +} + +static h5_err_t +traverse_mesh ( + const h5_file_t f, + const h5_id_t mesh_id + ) { + h5t_mesh_t* m; + /* open mesh and get number of levels */ + printf (" Opening mesh with id %lld\n", mesh_id); + H5FedOpenTriangleMeshByIndex (f, mesh_id, &m); + h5_size_t num_levels = H5FedGetNumLevels (m); + printf (" Number of levels in mesh: %lld\n", (long long)num_levels); + + /* loop over all levels */ + h5t_lvl_idx_t level_id; + for (level_id = 0; level_id < num_levels; level_id++) { + traverse_level (m, level_id); + } + /* done */ + H5FedCloseMesh (m); + return H5_SUCCESS; +} + + +int +main ( + int argc, + char* argv[] + ) { + +#if defined (PARALLEL_IO) + MPI_Comm comm = MPI_COMM_WORLD; + MPI_Init (&argc, &argv); +#else + MPI_Comm comm = 0; +#endif + + /* abort program on error, so we don't have to handle them */ + H5SetErrorHandler (H5AbortErrorhandler); + H5SetVerbosityLevel (0); + + /* open file and get number of meshes */ + h5_file_t f = H5OpenFile (FNAME, H5_O_RDONLY, comm); + h5_size_t num_meshes = H5FedGetNumTriangleMeshes (f); + printf (" Number of meshes: %lld\n", (long long)num_meshes); + + /* loop over all meshes */ + h5_id_t mesh_id; + for (mesh_id = 0; mesh_id < num_meshes; mesh_id++) { + traverse_mesh (f, mesh_id); + } + + /* done */ + H5CloseFile (f); +#if defined (PARALLEL_IO) + MPI_Finalize (); +#endif + + return 0; +} diff --git a/examples/H5Fed/trimesh_write.c b/examples/H5Fed/trimesh_write.c new file mode 100644 index 0000000..c53fbc4 --- /dev/null +++ b/examples/H5Fed/trimesh_write.c @@ -0,0 +1,69 @@ +#include +#include + +#include "H5hut.h" + +const char* FNAME = "simple_triangle.h5"; + +typedef struct vertex { + h5_float64_t P[3]; +} vertex_t; + +typedef struct elem { + h5_loc_idx_t vids[3]; +} elem_t; + +vertex_t Vertices[] = { + { {-1.0, 0.0, 0.0} }, + { { 1.0, 0.0, 0.0} }, + { { 0.0, 1.0, 0.0} }, + { { 0.0, -1.0, 0.0} } +}; + +elem_t Elems[] = { + { { 0, 1, 2 } }, + { { 0, 1, 3 } } +}; + +const int num_vertices = sizeof (Vertices) / sizeof (Vertices[0]); +const int num_elems = sizeof (Elems) / sizeof (Elems[0]); + +int +main ( + int argc, + char* argv[] + ) { + /* abort program on errors in library */ + H5SetErrorHandler (H5AbortErrorhandler); + H5SetVerbosityLevel (5); + + /* open file and add mesh */ + const h5_file_t f = H5OpenFile (FNAME, H5_O_WRONLY, 0); + h5t_mesh_t* m; + H5FedAddTriangleMesh (f, "0", &m); + + /* store vertices */ + H5FedBeginStoreVertices (m, num_vertices); + int i; + for (i = 0; i < num_vertices; i++) { + H5FedStoreVertex (m, -1, Vertices[i].P); + } + H5FedEndStoreVertices (m); + + /* store elements */ + H5FedBeginStoreElements (m, num_elems); + for (i = 0; i < num_elems; i++) { + H5FedStoreElement (m, Elems[i].vids); + } + H5FedEndStoreElements (m); + + /* add 1. Level */ + H5FedAddLevel(m); + H5FedBeginRefineElements (m); + H5FedRefineElement (m, 0); + H5FedEndRefineElements (m); + + H5FedCloseMesh (m); + H5CloseFile (f); + return 0; +} diff --git a/examples/H5Fed/trimesh_write_dunetest.c b/examples/H5Fed/trimesh_write_dunetest.c new file mode 100644 index 0000000..8c88fc4 --- /dev/null +++ b/examples/H5Fed/trimesh_write_dunetest.c @@ -0,0 +1,70 @@ +#include +#include + +#include "H5hut.h" + +const char* FNAME = "simple_dunetest.h5"; + +typedef struct vertex { + h5_float64_t P[3]; +} vertex_t; + +typedef struct elem { + h5_loc_idx_t vids[3]; +} elem_t; + +vertex_t Vertices[] = { + { { 0.0, 0.0, 0.0} }, + { {-0.5, 1.0, 0.0} }, + { { 0.5, 1.0, 0.0} }, + { { 1.0, 0.0, 0.0} }, + { { 0.5, -1.0, 0.0} }, + { {-0.5, -1.0, 0.0} }, + { {-1.0, 0.0, 0.0} } +}; + +elem_t Elems[] = { + { { 0, 1, 2 } }, + { { 0, 2, 3 } }, + { { 0, 3, 4 } }, + { { 0, 4, 5 } }, + { { 0, 5, 6 } }, + { { 0, 1, 6 } } +}; + +const int num_vertices = sizeof (Vertices) / sizeof (Vertices[0]); +const int num_elems = sizeof (Elems) / sizeof (Elems[0]); + +int +main ( + int argc, + char* argv[] + ) { + /* abort program on errors in library */ + H5SetErrorHandler (H5AbortErrorhandler); + H5SetVerbosityLevel (2); + + /* open file and add mesh */ + const h5_file_t f = H5OpenFile (FNAME, H5_O_WRONLY, 0); + h5t_mesh_t* m; + H5FedAddTriangleMesh (f, "0", &m); + + /* store vertices */ + H5FedBeginStoreVertices (m, num_vertices); + int i; + for (i = 0; i < num_vertices; i++) { + H5FedStoreVertex (m, -1, Vertices[i].P); + } + H5FedEndStoreVertices (m); + + /* store elements */ + H5FedBeginStoreElements (m, num_elems); + for (i = 0; i < num_elems; i++) { + H5FedStoreElement (m, Elems[i].vids); + } + H5FedEndStoreElements (m); + + H5FedCloseMesh (m); + H5CloseFile (f); + return 0; +} diff --git a/examples/H5Fed/write_boundary.c b/examples/H5Fed/write_boundary.c new file mode 100644 index 0000000..54f8144 --- /dev/null +++ b/examples/H5Fed/write_boundary.c @@ -0,0 +1,100 @@ +#include +#include + +#include "H5hut.h" + +#ifndef PARALLEL_IO +#ifndef MPI_COMM_WORLD +#define MPI_COMM_WORLD 0 +#endif +#endif + +struct vertex { + h5_glb_id_t global_id; + h5_float64_t P[3]; +}; + +typedef struct vertex vertex_t; + +struct tet { + h5_glb_id_t global_id; + h5_glb_id_t parent_id; + h5_glb_id_t vids[4]; +}; +typedef struct tet tet_t; + +struct boundary { + h5_glb_id_t vids[3]; +}; +typedef struct boundary boundary_t; + +vertex_t V0[5] = { + { 0, {-1.0, 0.0, 0.0} }, + { 1, { 1.0, 0.0, 0.0} }, + { 2, { 0.0, 1.0, 0.0} }, + { 3, { 0.0, 0.0, 1.0} }, + { 4, { 0.0, -1.0, 0.0} } +}; + +vertex_t V1[1] = { + { 5, {0.0, 0.0, 0.0 } } +}; + +// sorted vertices: 0, 4, 5, 3, 2, 1 + +tet_t T0[2] = { + { 1, -1, { 0, 1, 2, 3 } }, // 0, 3, 2, 1 + { 0, -1, { 0, 1, 3, 4 } } // 0, 4, 3, 1 +}; + +tet_t T1[2] = { + { 2, 0, { 0, 3, 4, 5 } }, // 0, 4, 5, 3 + { 3, 0, { 1, 3, 4, 5 } } // 4, 5, 3, 1 +}; + +boundary_t boundary[2] = { + {{ 0, 1, 2 }}, + {{ 2, 3, 4 }} +}; + +int +main ( + int argc, + char *argv[] + ) { + H5PartSetVerbosityLevel ( 4 ); + + h5_file_t *f = H5OpenFile ( "simple_tet.h5", 0 ); + if ( f == NULL ) { + fprintf ( stderr, "!!! Can't open file.\n" ); + return -1; + } + + h5_err_t h5err = H5FedOpenMesh ( f, 0, TETRAHEDRAL_MESH ); + if ( h5err < 0 ) { + fprintf ( stderr, "!!! Can't open mesh %d\n", 0 ); + return -1; + } + h5err = H5FedAddBoundary ( f ); + if ( h5err < 0 ) { + fprintf ( stderr, "!!! Can't add boundary.\n" ); + return -1; + } + h5err = H5FedAddNumBoundaryfaces ( f, 1 ); + if ( h5err < 0 ) { + fprintf ( stderr, "!!! Can't add boundary.\n" ); + return -1; + } + h5err = H5FedStoreBoundaryface ( f, boundary[0].vids ); + if ( h5err < 0 ) { + fprintf ( stderr, "!!! Can't write boundary.\n" ); + return -1; + } + + h5err = H5CloseFile ( f ); + if ( h5err < 0 ) { + fprintf ( stderr, "!!! Can't close file.\n" ); + return -1; + } + return 0; +} diff --git a/examples/H5Part/Bench.c b/examples/H5Part/Bench.c new file mode 100644 index 0000000..c5e4499 --- /dev/null +++ b/examples/H5Part/Bench.c @@ -0,0 +1,263 @@ +#include +#include +#include +#include +/* #include */ +#include +#include +#ifndef PARALLEL_IO +#define PARALLEL_IO +#endif + +#ifndef DISABLE_H5PART +#include "H5hut.h" +#endif + +#define FILENAME "testio" +/* normally 64 steps for real benchmark */ +/* #define NSTEPS 5 */ + +/* normally 51e6 for real benchmark */ +#define NPARTICLES 51e4 +#define NTRIALS 3 + +/* + +bench + +*/ + + +int main(int argc,char *argv[]){ + + if (argc < 3) { + printf("Usage: bench \n"); + exit(-1); + } + else { + printf("nparticles: %d, nsteps: %d \n", atoi(argv[1]), atoi(argv[2])); + } + + MPI_Info info; + int nprocs,rank; + int trial; + int i,j,n; /* iteration variables */ + double starttime,curtime, endtime; + + int nparticles = atoi(argv[1]); + int nsteps = atoi(argv[2]); + + double *x,*y,*z,*px,*py,*pz; + typedef double *ddouble; + ddouble data[6]; + MPI_Datatype chunktype; + int offset; + int localnp; + char filename[128]; /*= FILENAME; */ +#ifndef DISABLE_H5PART + h5_file_t f; +#endif + char newfilename[128]; + FILE *fd; + MPI_File file; + MPI_Offset foffset; + + MPI_Comm dcomm = MPI_COMM_WORLD; + + MPI_Init(&argc,&argv); + MPI_Comm_rank(dcomm,&rank); + MPI_Comm_size(dcomm,&nprocs); + + localnp=nparticles/(int64_t)nprocs; + for(offset=0,i=0;i +#include "H5hut.h" + +/* + A simple regression test that shows how you use this API + to write and read multi-timestep files of particle data. +*/ + + +#ifdef PARALLEL_IO + +int main(int argc,char *argv[]){ + int sz=5; + double *x,*y,*z; + h5_int64_t *id; + h5_file_t file; + int i,t,nt,nds; + int nprocs,myproc; + MPI_Comm comm=MPI_COMM_WORLD; + + MPI_Init(&argc,&argv); + MPI_Comm_size(comm,&nprocs); + MPI_Comm_rank(comm,&myproc); + + x=(double*)malloc(sz*nprocs*sizeof(double)); + y=(double*)malloc(sz*nprocs*sizeof(double)); + z=(double*)malloc(sz*nprocs*sizeof(double)); + id=(h5_int64_t*)malloc(sz*nprocs*sizeof(h5_int64_t)); + /* parallel file creation */ + file=H5OpenFile ("parttest.h5",H5_O_WRONLY,comm); + if(!file) { + perror("File open failed: exiting!"); + exit(0); + } + + for(t=0;t<5;t++){ + MPI_Barrier(comm); + for(i=0;i>1); + printf("Set new view = %d:%d\n",(int)idStart,(int)(idEnd>>1)); + H5PartGetView(file,&idStart,&idEnd); + np=H5PartGetNumParticles(file); + printf("steps= %u datasets= %u particles= %d with view %d:%d\n", + nt,nds,(int)np,(int)idStart,(int)idEnd); + H5PartSetStep(file,nt-1); // set to last step + printf("Setting to last step = %u\n",nt-1); + for(i=0;i<10;i++){ x[i]=y[i]=z[i]=0.0; id[i]=0; } /* clear the arrays */ + H5PartReadDataFloat64(file,"x",x); + H5PartReadDataFloat64(file,"y",y); + H5PartReadDataFloat64(file,"z",z); + H5PartReadDataInt64(file,"id",id); + + for(i=0;i>1,(int)idEnd); + H5PartSetView(file,(idEnd>>1),idEnd); + np=H5PartGetNumParticles(file); + printf("Now particles in selection are %d\n",np); + printf("doubleCheck=%lld\n", (long long)H5PartGetView(file,0,0)); + + for(i=0;i<10;i++){ x[i]=y[i]=z[i]=0.0; id[i]=0; } /* clear the arrays */ + + H5PartReadDataFloat64(file,"x",x); + H5PartReadDataFloat64(file,"y",y); + H5PartReadDataFloat64(file,"z",z); + H5PartReadDataInt64(file,"id",id); + for(i=0;i +#include +#include +#include + +#define DATASIZE 32 + +int main( + int argc, char** argv + ) { + int i, rank, nprocs; + h5_int32_t data[DATASIZE]; + h5_int64_t stat; + h5_file_t file; + + // initialize MPI + MPI_Init (&argc, &argv); + MPI_Comm_rank (MPI_COMM_WORLD, &rank); + MPI_Comm_size (MPI_COMM_WORLD, &nprocs); + + H5SetVerbosityLevel (1); + + char filename[8]; + sprintf (filename, "%d.h5", rank); + file = H5OpenFile (filename, H5_O_WRONLY|H5_VFD_CORE, MPI_COMM_SELF); + assert (file != H5_FAILURE); + + stat = H5SetStep (file, 0); + assert (stat == H5_SUCCESS); + + stat = H5PartSetNumParticles(file, DATASIZE); + assert (stat == H5_SUCCESS); + + // create fake data + for (i=0; i +#include +#include +#include + +#define DATASIZE 32 + +int main(int argc, char** argv) +{ + int rank, nprocs; + h5part_float64_t x[DATASIZE]; + h5part_float64_t y[DATASIZE]; + h5part_float64_t z[DATASIZE]; + h5part_float64_t px[DATASIZE]; + h5part_float64_t py[DATASIZE]; + h5part_float64_t pz[DATASIZE]; + h5part_int64_t nparticles = DATASIZE; + H5PartFile *file; + + // initialize MPI + MPI_Init (&argc, &argv); + MPI_Comm_rank (MPI_COMM_WORLD, &rank); + MPI_Comm_size (MPI_COMM_WORLD, &nprocs); + + H5PartSetVerbosityLevel(H5PART_VERB_DEBUG); + + file = H5PartOpenFileParallel("particles.h5", H5PART_WRITE, MPI_COMM_WORLD); + H5PartSetStep(file, 0); + H5PartSetNumParticles(file, nparticles); + H5PartWriteDataFloat64(file, "x", x); + H5PartWriteDataFloat64(file, "y", y); + H5PartWriteDataFloat64(file, "z", z); + H5PartWriteDataFloat64(file, "px", px); + H5PartWriteDataFloat64(file, "py", py); + H5PartWriteDataFloat64(file, "pz", pz); + H5PartCloseFile(file); + + MPI_Finalize(); + return EXIT_SUCCESS; +} + diff --git a/examples/H5Part/read_canonicalview.c b/examples/H5Part/read_canonicalview.c new file mode 100644 index 0000000..bb142a3 --- /dev/null +++ b/examples/H5Part/read_canonicalview.c @@ -0,0 +1,27 @@ + +#include +#include "H5hut.h" + +int +main ( + int argc, char* argv[] + ){ + h5_file_t file; + int nprocs, myproc; + MPI_Comm comm = MPI_COMM_WORLD; + + MPI_Init (&argc, &argv); + MPI_Comm_size (comm, &nprocs); + MPI_Comm_rank (comm, &myproc); + H5SetVerbosityLevel (4); + file = H5OpenFile ("parttest.h5", H5_O_RDONLY, comm); + + H5SetStep (file, 0); + + H5PartSetCanonicalView (file); + h5_int64_t num_particles = H5PartGetNumParticles (file); + printf ("[proc %d]: particles in view: %lld\n", myproc, num_particles); + + H5CloseFile(file); + return MPI_Finalize(); +} diff --git a/examples/H5Part/simplef.f90 b/examples/H5Part/simplef.f90 new file mode 100644 index 0000000..7720dee --- /dev/null +++ b/examples/H5Part/simplef.f90 @@ -0,0 +1,56 @@ +program H5PartTest + implicit none + + include 'mpif.h' + include 'H5PartF.h' + + integer :: comm, rank, ierr + integer*8 :: file_id, status, npoints, i + real*8, allocatable :: particles(:) + integer*8, allocatable :: id(:) + real*8 :: r8val + integer*8 :: i8val + + comm = MPI_COMM_WORLD + call mpi_init(ierr) + call mpi_comm_rank(comm, rank, ierr) + + ! open the a file for parallel writing + file_id = h5pt_set_verbosity_level(5) + file_id = h5pt_openw_par('test.h5', comm) + + ! in the Fortran API, time steps start at 1 + status = h5pt_setstep(file_id, 1_8) + + ! write an attribute to the file + status = h5pt_writefileattrib_string(file_id, 'desc', 'This is a test.') + + r8val = 0.5 + i8val = 1 + status = h5pt_writefileattrib_r8(file_id, 'double', r8val, i8val) + + ! create fake data + npoints = 99 + allocate(particles(npoints), id(npoints)) + do i=1,npoints + particles(i) = real(i+npoints*rank) + id(i) = i+npoints*rank + enddo + + ! set the size of the 1D array + status = h5pt_setnpoints(file_id, npoints) + + ! write the particles + status = h5pt_writedata_r8(file_id, "x", particles) + + ! write the ids + status = h5pt_writedata_i8(file_id, "id", id) + + ! close the file + status = h5pt_close(file_id) + + deallocate(particles, id) + + call mpi_finalize(ierr) + +end program H5PartTest diff --git a/examples/H5Part/stridedf.f90 b/examples/H5Part/stridedf.f90 new file mode 100644 index 0000000..7eb369e --- /dev/null +++ b/examples/H5Part/stridedf.f90 @@ -0,0 +1,61 @@ +program H5PartTest + implicit none + + include 'mpif.h' + include 'H5PartF.h' + + integer :: comm, rank, ierr + integer*8 :: file_id, status, npoints, i + real*8, allocatable :: particles(:) + integer*8, allocatable :: id(:) + + comm = MPI_COMM_WORLD + call mpi_init(ierr) + call mpi_comm_rank(comm, rank, ierr) + + ! open the a file for parallel writing + file_id = h5pt_openw_par('test.h5', comm) + + ! in the Fortran API, steps start at 1 + status = h5pt_setstep(file_id, 1_8) + + ! write an attribute to the file + status = h5pt_writefileattrib_string(file_id, 'desc', 'This is a test.') + + ! create fake data + npoints = 99 + allocate(particles(6*npoints), id(npoints)) + do i=0,npoints-1 + particles(6*i+1) = 0.0 + real(i+npoints*rank) + particles(6*i+2) = 0.1 + real(i+npoints*rank) + particles(6*i+3) = 0.2 + real(i+npoints*rank) + particles(6*i+4) = 0.3 + real(i+npoints*rank) + particles(6*i+5) = 0.4 + real(i+npoints*rank) + particles(6*i+6) = 0.5 + real(i+npoints*rank) + id(i+1) = i+npoints*rank + enddo + + ! set the striding to 6 + status = h5pt_setnpoints_strided(file_id, npoints, 6_8) + + ! write the particles + status = h5pt_writedata_r8(file_id, "x", particles(1)) + status = h5pt_writedata_r8(file_id, "y", particles(2)) + status = h5pt_writedata_r8(file_id, "z", particles(3)) + status = h5pt_writedata_r8(file_id, "px", particles(4)) + status = h5pt_writedata_r8(file_id, "py", particles(5)) + status = h5pt_writedata_r8(file_id, "pz", particles(6)) + + ! disable the striding to write the ids + status = h5pt_setnpoints(file_id, npoints) + status = h5pt_writedata_i8(file_id, "id", id) + + ! close the file + status = h5pt_close(file_id) + + deallocate(particles, id) + + call mpi_finalize(ierr) + +end program H5PartTest + diff --git a/examples/H5Part/write_setnumparticles.c b/examples/H5Part/write_setnumparticles.c new file mode 100644 index 0000000..3694bf2 --- /dev/null +++ b/examples/H5Part/write_setnumparticles.c @@ -0,0 +1,38 @@ + +#include +#include "H5hut.h" + +#define NUM_PARTICLES 3 + +int +main ( + int argc, + char* argv[] + ){ + h5_file_t file; + int nprocs = 0; + int myproc = 0; + int step = 0; + + MPI_Comm comm = MPI_COMM_WORLD; + + MPI_Init (&argc,&argv); + MPI_Comm_size (comm,&nprocs); + MPI_Comm_rank (comm,&myproc); + + h5_int64_t id[NUM_PARTICLES]; + h5_int64_t num_particles = NUM_PARTICLES; + + for (int i = 0; i < num_particles; i++) { + id[i] = i + num_particles * myproc; + } + + + file = H5OpenFile ("parttest.h5", H5_O_WRONLY, comm); + H5SetStep (file, step); + H5PartSetNumParticles (file,num_particles); + H5PartWriteDataInt64 (file, "id", id); + H5CloseFile(file); + + MPI_Finalize (); +} diff --git a/examples/H5Part/write_setview.c b/examples/H5Part/write_setview.c new file mode 100644 index 0000000..a3c8765 --- /dev/null +++ b/examples/H5Part/write_setview.c @@ -0,0 +1,58 @@ +#include +#include +#include +#include + +#define DATASIZE 32 +#define ITERS 4 + +int main ( + int argc, char** argv + ) { + int i, rank, nprocs; + h5_int32_t data[ITERS*DATASIZE]; + h5_int64_t stat; + h5_int64_t offset; + h5_file_t file; + + // initialize MPI + MPI_Init (&argc, &argv); + MPI_Comm_rank (MPI_COMM_WORLD, &rank); + MPI_Comm_size (MPI_COMM_WORLD, &nprocs); + + H5SetVerbosityLevel(1); + + file = H5OpenFile ("test.h5", H5_O_WRONLY, MPI_COMM_WORLD); + assert (file != H5_FAILURE); + + stat = H5SetStep(file, 0); + assert (stat == H5_SUCCESS); + + stat = H5PartSetNumParticles(file, ITERS*DATASIZE); + assert (stat == H5_SUCCESS); + + // create fake data + for (i=0; i +!! \ingroup h5block_model_f +!! See \ref H5Block3dSetView +!! \return 0 on success or error code +!< +INTEGER*8 FUNCTION h5bl_3d_setview ( filehandle, i_start, i_end, j_start, j_end, k_start, k_end ) + INTEGER*8, INTENT(IN) :: filehandle + INTEGER*8, INTENT(IN) :: i_start + INTEGER*8, INTENT(IN) :: i_end + INTEGER*8, INTENT(IN) :: j_start + INTEGER*8, INTENT(IN) :: j_end + INTEGER*8, INTENT(IN) :: k_start + INTEGER*8, INTENT(IN) :: k_end +END FUNCTION + +!> +!! \ingroup h5block_model_f +!! See \ref H5Block3dGetView +!! \return 0 on success or error code +!< +INTEGER*8 FUNCTION h5bl_3d_getview ( filehandle, i_start, i_end, j_start, j_end, k_start, k_end ) + INTEGER*8, INTENT(IN) :: filehandle + INTEGER*8, INTENT(OUT) :: i_start + INTEGER*8, INTENT(OUT) :: i_end + INTEGER*8, INTENT(OUT) :: j_start + INTEGER*8, INTENT(OUT) :: j_end + INTEGER*8, INTENT(OUT) :: k_start + INTEGER*8, INTENT(OUT) :: k_end +END FUNCTION + +!> +!! \ingroup h5block_model_f +!! See \ref H5Block3dGetReducedView +!! \return 0 on success or error code +!< +INTEGER*8 FUNCTION h5bl_3d_getreducedview ( filehandle, i_start, i_end, j_start, j_end, k_start, k_end ) + INTEGER*8, INTENT(IN) :: filehandle + INTEGER*8, INTENT(OUT) :: i_start + INTEGER*8, INTENT(OUT) :: i_end + INTEGER*8, INTENT(OUT) :: j_start + INTEGER*8, INTENT(OUT) :: j_end + INTEGER*8, INTENT(OUT) :: k_start + INTEGER*8, INTENT(OUT) :: k_end +END FUNCTION + +!> +!! \ingroup h5block_model_f +!! See \ref H5Block3dHasView +!! \return rank of processor error code +!< +INTEGER*8 FUNCTION h5bl_3d_hasview ( filehandle ) + INTEGER*8, INTENT(IN) :: filehandle +END FUNCTION + +!> +!! \ingroup h5block_model_f +!! See \ref H5Block3dSetChunk +!! \return 0 on success or error code +!< +INTEGER*8 FUNCTION h5bl_3d_setchunk ( filehandle, i, j, k ) + INTEGER*8, INTENT(IN) :: filehandle + INTEGER*8, INTENT(IN) :: i + INTEGER*8, INTENT(IN) :: j + INTEGER*8, INTENT(IN) :: k +END FUNCTION + +!> +!! \ingroup h5block_model_f +!! See \ref H5BlockGetNumFields +!! \return number of fields or error code +!< +INTEGER*8 FUNCTION h5bl_getnumfields ( filehandle ) + INTEGER*8, INTENT(IN) :: filehandle +END FUNCTION + +!> +!! \ingroup h5block_model_f +!! See \ref H5BlockGetFieldInfo +!! \return 0 on success or error code +!< +INTEGER*8 FUNCTION h5bl_getfieldinfo ( filehandle, idx, field_name, grid_rank, grid_dims, field_dims ) + INTEGER*8, INTENT(IN) :: filehandle + INTEGER*8, INTENT(IN) :: idx + CHARACTER(LEN=*), INTENT(OUT) :: field_name + INTEGER*8, INTENT(OUT) :: grid_rank + INTEGER*8, INTENT(OUT) :: grid_dims(*) + INTEGER*8, INTENT(OUT) :: field_dims + INTEGER*8, INTENT(OUT) :: type +END FUNCTION + diff --git a/src/Fortran/H5Block_F.c b/src/Fortran/H5Block_F.c new file mode 100755 index 0000000..1939d0f --- /dev/null +++ b/src/Fortran/H5Block_F.c @@ -0,0 +1,324 @@ +#include +#include + +#include "h5core/h5_core.h" +#include "Underscore.h" + +#if defined(F77_SINGLE_UNDERSCORE) +#define F77NAME(a,b) a +#elif defined(F77_CRAY_UNDERSCORE) +#define F77NAME(a,b) b +#elif defined(F77_NO_UNDERSCORE) +#else +#error Error, no way to determine how to construct fortran bindings +#endif + +#if !defined(F77_NO_UNDERSCORE) + +#define h5bl_3d_setview F77NAME ( \ + h5bl_3d_setview_, \ + H5BL_3D_SETVIEW ) +#define h5bl_3d_getview F77NAME ( \ + h5bl_3d_getview_, \ + H5BL_3D_GETVIEW ) +#define h5bl_3d_setchunk F77NAME ( \ + h5bl_3d_setchunk_, \ + H5BL_3D_SETCHUNK ) +#define h5bl_3d_getreducedview F77NAME ( \ + h5bl_3d_getreducedview_, \ + H5BL_3D_GETREDUCEDVIEW ) +#define h5bl_3d_hasview F77NAME ( \ + h5bl_hasview_, \ + H5BL_HASVIEW ) +#define h5bl_getnumfields F77NAME ( \ + h5bl_getnumfields_, \ + H5BL_GETNUMFIELDS ) +#define h5bl_getfieldinfo F77NAME ( \ + h5bl_getfieldinfo_, \ + H5BL_GETFIELDINFO ) +#define h5bl_writefieldattrib_string F77NAME ( \ + h5bl_writefieldattrib_string_, \ + H5BL_WRITEFIELDATTRIB_STRING ) +#define h5bl_getnfieldattribs F77NAME ( \ + h5bl_getnfieldattribs_, \ + H5BL_GETNFIELDATTRIBS ) +#define h5bl_getfieldattribinfo F77NAME ( \ + h5bl_getfieldattribinfo_, \ + h5bl_getfieldattribinfo ) +#define h5bl_readfieldattrib_string F77NAME ( \ + h5bl_readfieldattrib_string_, \ + H5BL_READFIELDATTRIB_STRING ) +#endif + +h5_err_t +h5bl_3d_setview ( + h5_int64_t *const f, + const h5_int64_t *i_start, /*!< start index of i */ + const h5_int64_t *i_end, /*!< end index of i */ + const h5_int64_t *j_start, /*!< start index of j */ + const h5_int64_t *j_end, /*!< end index of j */ + const h5_int64_t *k_start, /*!< start index of k */ + const h5_int64_t *k_end /*!< end index of k */ + ) { + + h5_file_t *fh = h5_filehandlefor2c(f); + H5_API_ENTER (h5_err_t, + "f=%p, " + "i_start=%lld, i_end=%lld, " + "j_start=%lld, j_end=%lld, " + "k_start=%lld, k_end=%lld", + fh, + (long long)i_start, (long long)i_end, + (long long)j_start, (long long)j_end, + (long long)k_start, (long long)k_end); + H5_API_RETURN(h5b_3d_set_view ( + fh, + *i_start-1, *i_end-1, + *j_start-1, *j_end-1, + *k_start-1, *k_end-1 )); +} + +h5_err_t +h5bl_3d_setchunk ( + h5_int64_t *const f, + const h5_int64_t *i, + const h5_int64_t *j, + const h5_int64_t *k + ) { + + h5_file_t *fh = h5_filehandlefor2c(f); + H5_API_ENTER (h5_err_t, + "f=%p, i=%lld, j=%lld, k=%lld", + fh, (long long)i, (long long)j, (long long)k); + H5_API_RETURN(h5b_3d_set_chunk ( fh, *i, *j, *k )); +} + +h5_err_t +h5bl_3d_getview ( + h5_int64_t *const f, + h5_int64_t *const i_start, + h5_int64_t *const i_end, + h5_int64_t *const j_start, + h5_int64_t *const j_end, + h5_int64_t *const k_start, + h5_int64_t *const k_end + ) { + + h5_file_t *fh = h5_filehandlefor2c(f); + H5_API_ENTER (h5_err_t, + "f=%p, " + "i_start=%p, i_end=%p, " + "j_start=%p, j_end=%p, " + "k_start=%p, k_end=%p", + fh, + i_start, i_end, + j_start, j_end, + k_start, k_end); + H5_API_RETURN (h5b_3d_get_view ( + fh, + (h5_size_t*)i_start, (h5_size_t*)i_end, + (h5_size_t*)j_start, (h5_size_t*)j_end, + (h5_size_t*)k_start, (h5_size_t*)k_end )); +} + +h5_err_t +h5bl_3d_getreducedview ( + h5_int64_t *const f, + h5_int64_t *const i_start, + h5_int64_t *const i_end, + h5_int64_t *const j_start, + h5_int64_t *const j_end, + h5_int64_t *const k_start, + h5_int64_t *const k_end + ) { + + h5_file_t *fh = h5_filehandlefor2c(f); + H5_API_ENTER (h5_err_t, + "f=%p, " + "i_start=%p, i_end=%p, " + "j_start=%p, j_end=%p, " + "k_start=%p, k_end=%p", + fh, + i_start, i_end, + j_start, j_end, + k_start, k_end); + H5_API_RETURN(h5b_3d_get_reduced_view ( + fh, + (h5_size_t*)i_start, (h5_size_t*)i_end, + (h5_size_t*)j_start, (h5_size_t*)j_end, + (h5_size_t*)k_start, (h5_size_t*)k_end )); +} + +h5_int64_t +h5bl_3d_hasview ( + h5_int64_t *const f + ) { + + h5_file_t *fh = h5_filehandlefor2c(f); + H5_API_ENTER (h5_int64_t, "f=%p", fh); + H5_API_RETURN (h5b_3d_has_view ( fh )); +} + +h5_err_t +h5bl_getnumfields ( + h5_int64_t *const f + ) { + + h5_file_t *fh = h5_filehandlefor2c(f); + H5_API_ENTER (h5_int64_t, "f=%p", fh); + H5_API_RETURN (h5b_get_num_fields ( fh )); +} + +h5_err_t +h5bl_getfieldinfo ( + h5_int64_t *const f, + const h5_int64_t *idx, + char *name, + h5_size_t *field_rank, + h5_size_t *field_dims, + h5_size_t *elem_rank, + h5_int64_t *type, + const int l_name + ) { + + h5_file_t *fh = h5_filehandlefor2c(f); + H5_API_ENTER (h5_err_t, + "f=%p, idx=%lld, " + "name=%p," + "field_rank=%p, field_dims=%p, elem_rank=%p, type=%p, l_name=%d", + fh, (long long)*idx, name, + field_rank, field_dims, elem_rank, type, l_name); + h5_err_t herr = h5b_get_field_info ( + fh, *idx, name, (h5_size_t)l_name, + field_rank, field_dims, elem_rank, type ); + h5_strc2for ( name, l_name ); + H5_API_RETURN(herr); +} + +h5_err_t +h5bl_writefieldattrib_string ( + h5_int64_t *const f, + const char *field_name, + const char *attrib_name, + const char *buffer, + const int l_field_name, + const int l_attrib_name, + const int l_buffer + ) { + + h5_file_t *fh = h5_filehandlefor2c(f); + char *field_name2 = h5_strdupfor2c ( field_name, l_field_name ); + char *attrib_name2 = h5_strdupfor2c ( attrib_name, l_attrib_name ); + char *buffer2 = h5_strdupfor2c ( buffer, l_buffer ); + H5_API_ENTER (h5_err_t, + "f=%p, " + "field_name='%s', " + "attrib_name='%s', " + "buffer='%s', " + "l_field_name=%d, " + "l_attrib_name=%d, " + "l_buffer=%d", + fh, + field_name2, + attrib_name2, + buffer2, l_field_name, l_attrib_name, l_buffer); + h5_err_t herr = h5_write_field_attrib ( + fh, field_name2, attrib_name2, + H5_STRING_T, buffer2, strlen(buffer2)+1 ); + + free ( field_name2 ); + free ( attrib_name2 ); + free ( buffer2 ); + H5_API_RETURN(herr); +} + + +h5_err_t +h5bl_getnfieldattribs ( + h5_int64_t *const f, + const char *name, + const int l_name + ) { + + h5_file_t *fh = h5_filehandlefor2c(f); + char *name2 = h5_strdupfor2c ( name, l_name ); + H5_API_ENTER (h5_err_t, + "f=%p, name='%s', l_name=%d", fh, name2, l_name); + h5_err_t herr = h5b_get_num_field_attribs ( fh, name2 ); + free ( name2 ); + H5_API_RETURN(herr); +} + +h5_err_t +h5bl_getfieldattribinfo ( + h5_int64_t *const f, + const char *field_name, + const h5_int64_t *attrib_idx, + char *attrib_name, + h5_size_t *attrib_nelem, + const int l_field_name, + const int l_attrib_name + ) { + + h5_file_t *fh = h5_filehandlefor2c(f); + char *field_name2 = h5_strdupfor2c ( field_name, l_field_name ); + H5_API_ENTER (h5_err_t, + "f=%p field_name='%s', " + "attrib_idx=%lld, " + "attrib_name=%p, " + "attrib_nelem=%p, l_field_name=%d, l_attrib_name=%d", + fh, + field_name2, + (long long)*attrib_idx, + attrib_name, attrib_nelem, l_field_name, l_attrib_name); + + h5_int64_t attrib_type; + h5_err_t herr = h5b_get_field_attrib_info ( + fh, field_name2, *attrib_idx, + attrib_name, l_attrib_name, + &attrib_type, + attrib_nelem ); + + h5_strc2for ( attrib_name, l_attrib_name ); + + free ( field_name2 ); + H5_API_RETURN(herr); +} + + +h5_err_t +h5bl_readfieldattrib_string ( + h5_int64_t *const f, + const char *field_name, + const char *attrib_name, + char *buffer, + const int l_field_name, + const int l_attrib_name, + const int l_buffer + ) { + + h5_file_t *fh = h5_filehandlefor2c(f); + char *field_name2 = h5_strdupfor2c ( field_name, l_field_name ); + char *attrib_name2 = h5_strdupfor2c ( attrib_name, l_attrib_name ); + H5_API_ENTER (h5_err_t, + "f=%p, " + "field_name='%s', " + "attrib_name='%s', " + "buffer=%p, l_field_name=%d, l_attrib_name=%d, l_buffer=%d", + fh, + field_name, + attrib_name, + buffer, l_field_name, l_attrib_name, l_buffer); + + h5_err_t herr = h5_read_field_attrib ( + fh, field_name2, attrib_name2, + H5_STRING_T, buffer ); + + h5_strc2for ( buffer, l_buffer ); + + free ( field_name2 ); + free ( attrib_name2 ); + + H5_API_RETURN(herr); +} + diff --git a/src/Fortran/H5Block_attribs.c b/src/Fortran/H5Block_attribs.c new file mode 100644 index 0000000..bac8064 --- /dev/null +++ b/src/Fortran/H5Block_attribs.c @@ -0,0 +1,455 @@ +/* + Copyright (c) 2006-2012, The Regents of the University of California, + through Lawrence Berkeley National Laboratory (subject to receipt of any + required approvals from the U.S. Dept. of Energy) and the Paul Scherrer + Institut (Switzerland). All rights reserved. + + License: see file COPYING in top level of source distribution. +*/ + +#include "h5_private.h" +#include "h5core/h5b_attribs.h" + +#define H5_R8_T H5_FLOAT64_T +#define H5_R4_T H5_FLOAT32_T +#define H5_I8_T H5_INT64_T +#define H5_I4_T H5_INT32_T + +/* + __ _ _ _ ___ _ __ _ _ + / _` | | | |/ _ \ '__| | | | + | (_| | |_| | __/ | | |_| | + \__, |\__,_|\___|_| \__, | + |_| |___/ +*/ + +#define h5bl_getnfieldattribs F77_NAME ( \ + h5bl_getnfieldattribs, \ + h5bl_getnfieldattribs_, \ + H5BL_GETNFIELDATTRIBS) +h5_int64_t +h5bl_getnfieldattribs ( + const h5_int64_t* const fh, + const char* const name, + const int l_name + ) { + h5_file_t f = h5_filehandlefor2c (fh); + H5_API_ENTER (h5_int64_t, + "fh=%p, name='%*s'", + (h5_file_p)f, l_name, name); + char* name2 = h5_strdupfor2c ( name, l_name ); + h5_int64_t herr = h5b_get_num_field_attribs (f, name2); + free (name2); + H5_API_RETURN (herr); +} + +#define h5bl_getfieldattribinfo F77_NAME ( \ + h5bl_getfieldattribinfo, \ + h5bl_getfieldattribinfo_, \ + h5bl_getfieldattribinfo) +h5_int64_t +h5bl_getfieldattribinfo ( + const h5_int64_t* const fh, + const char* const field_name, + const h5_int64_t* const attrib_idx, + char* const attrib_name, + h5_int64_t* const attrib_nelem, + const int l_field_name, + const int l_attrib_name + ) { + h5_file_t f = h5_filehandlefor2c (fh); + H5_API_ENTER (h5_err_t, + "fh=%p, field_name='%*s', attrib_idx=%lld, " + "attrib_name=%p, attrib_nelem=%p", + (h5_file_p)f, + l_field_name, field_name, + (long long)*attrib_idx, + attrib_name, attrib_nelem); + + char *field_name2 = h5_strdupfor2c ( field_name, l_field_name ); + h5_int64_t attrib_type; + h5_int64_t herr = h5b_get_field_attrib_info ( + f, + field_name2, *attrib_idx - 1, + attrib_name, l_attrib_name, + &attrib_type, + (h5_size_t*)attrib_nelem ); + + h5_strc2for ( attrib_name, l_attrib_name ); + + free (field_name2); + H5_API_RETURN (herr); +} + +/* + _ __ + (_) / /__ + | | / / _ \ + | |/ / (_) | + |_/_/ \___/ +*/ +static inline h5_int64_t +write_field_attrib ( + const h5_file_t fh, + const char* field_name, + const int l_field_name, + const char* attrib_name, + const int l_attrib_name, + const h5_int64_t attrib_type, + const void* attrib_value, + const hsize_t attrib_nelems + ) { + char *field_name2 = h5_strdupfor2c (field_name, l_field_name); + char *attrib_name2 = h5_strdupfor2c (attrib_name, l_attrib_name); + h5_int64_t h5err = h5b_write_field_attrib ( + fh, field_name2, + attrib_name2, attrib_type, + attrib_value, attrib_nelems); + free (field_name2); + free (attrib_name2); + return h5err; +} + +static inline h5_int64_t +read_field_attrib ( + const h5_file_t fh, + const char* field_name, + const int l_field_name, + const char* attrib_name, + const int l_attrib_name, + const hid_t attrib_type, + void* attrib_value + ) { + char *field_name2 = h5_strdupfor2c (field_name, l_field_name); + char *attrib_name2 = h5_strdupfor2c (attrib_name, l_attrib_name); + h5_int64_t h5err = h5b_read_field_attrib ( + fh, field_name2, + attrib_name2, attrib_type, attrib_value); + free (field_name2); + free (attrib_name2); + return h5err; +} + +/* + _ _ + ___| |_ _ __(_)_ __ __ _ + / __| __| '__| | '_ \ / _` | + \__ \ |_| | | | | | | (_| | + |___/\__|_| |_|_| |_|\__, | + |___/ +*/ +#define h5bl_writefieldattrib_string F77_NAME ( \ + h5bl_writefieldattrib_string, \ + h5bl_writefieldattrib_string_, \ + H5BL_WRITEFIELDATTRIB_STRING) +h5_int64_t +h5bl_writefieldattrib_string ( + const h5_int64_t* const fh, + const char* const field_name, + const char* const attrib_name, + const char* const attrib_value, + const int l_field_name, + const int l_attrib_name, + const int l_attrib_value + ) { + h5_file_t f = h5_filehandlefor2c (fh); + H5_API_ENTER (h5_int64_t, + "fh=%p, field_name='%.*s', " + "attrib_name='%.*s' attrib_value='%.*s'", + (h5_file_p)f, + l_field_name, field_name, + l_attrib_name, attrib_name, + l_attrib_value, attrib_value); + char* attrib_value2 = h5_strdupfor2c (attrib_value, l_attrib_value); + h5_int64_t h5err = write_field_attrib ( + f, + field_name, l_field_name, + attrib_name, l_attrib_name, + H5_STRING_T, + attrib_value2, strlen(attrib_value2)+1 ); + free (attrib_value2); + H5_API_RETURN (h5err); +} + +#define h5bl_readfieldattrib_string F77_NAME ( \ + h5bl_readfieldattrib_string, \ + h5bl_readfieldattrib_string_, \ + H5BL_READFIELDATTRIB_STRING) +h5_err_t +h5bl_readfieldattrib_string ( + const h5_int64_t* const fh, + const char* const field_name, + const char* const attrib_name, + char* const attrib_value, + const int l_field_name, + const int l_attrib_name, + const int l_attrib_value + ) { + h5_file_t f = h5_filehandlefor2c (fh); + H5_API_ENTER (h5_int64_t, + "f=%p, field_name='%.*s', attrib_name='%.*s' attrib_value='%p'", + (h5_file_p)f, + l_field_name, field_name, + l_attrib_name, attrib_name, + attrib_value); + h5_int64_t h5err = read_field_attrib ( + f, + field_name, l_field_name, + attrib_name, l_attrib_name, + H5_STRING_T, attrib_value); + + h5_strc2for (attrib_value, l_attrib_value); + H5_API_RETURN (h5err); +} + +/* + _ + _ __ ___ __ _| | + | '__/ _ \/ _` | | + | | | __/ (_| | | + |_| \___|\__,_|_| +*/ +#define h5bl_writefieldattrib_r8 F77_NAME ( \ + h5bl_writefieldattrib_r8, \ + h5bl_writefieldattrib_r8_, \ + H5BL_WRITEFIELDATTRIB_R8) +h5_int64_t +h5bl_writefieldattrib_r8 ( + const h5_int64_t* const fh, + const char* const field_name, + const char* const attrib_name, + const h5_float64_t* const attrib_value, + const h5_int64_t* const attrib_nelems, + const int l_field_name, + const int l_attrib_name + ) { + h5_file_t f = h5_filehandlefor2c (fh); + H5_API_ENTER (h5_int64_t, + "fh=%p, field_name='%.*s', attrib_name='%.*s', " + "attrib_value=%p, attrib_nelems=%lld", + (h5_file_p)f, + l_field_name, field_name, + l_attrib_name, attrib_name, + attrib_value, *attrib_nelems); + H5_API_RETURN (write_field_attrib ( + f, + field_name, l_field_name, + attrib_name, l_attrib_name, + H5_R8_T, + attrib_value, *attrib_nelems)); +} + +#define h5bl_readfieldattrib_r8 F77_NAME ( \ + h5bl_readfieldattrib_r8, \ + h5bl_readfieldattrib_r8_, \ + H5BL_READFIELDATTRIB_R8) +h5_err_t +h5bl_readfieldattrib_r8 ( + const h5_int64_t* const fh, + const char* const field_name, + const char* const attrib_name, + h5_float64_t* const attrib_value, + const int l_field_name, + const int l_attrib_name + ) { + h5_file_t f = h5_filehandlefor2c (fh); + H5_API_ENTER (h5_int64_t, + "fh=%p, field_name='%.*s', attrib_name='%.*s', " + "attrib_value=%p", + (h5_file_p)f, + l_field_name, field_name, + l_attrib_name, attrib_name, + attrib_value); + H5_API_RETURN (read_field_attrib ( + f, + field_name, l_field_name, + attrib_name, l_attrib_name, + H5_R8_T, + attrib_value)); +} + +#define h5bl_writefieldattrib_r4 F77_NAME ( \ + h5bl_writefieldattrib_r4, \ + h5bl_writefieldattrib_r4_, \ + H5BL_WRITEFIELDATTRIB_R4) +h5_int64_t +h5bl_writefieldattrib_r4 ( + const h5_int64_t* const fh, + const char* const field_name, + const char* const attrib_name, + const h5_float32_t* const attrib_value, + const h5_int64_t* const attrib_nelems, + const int l_field_name, + const int l_attrib_name + ) { + h5_file_t f = h5_filehandlefor2c (fh); + H5_API_ENTER (h5_int64_t, + "fh=%p, field_name='%.*s', attrib_name='%.*s', " + "attrib_value=%p, attrib_nelems=%lld", + (h5_file_p)f, + l_field_name, field_name, + l_attrib_name, attrib_name, + attrib_value, *attrib_nelems); + H5_API_RETURN (write_field_attrib ( + f, + field_name, l_field_name, + attrib_name, l_attrib_name, + H5_R4_T, + attrib_value, *attrib_nelems)); +} + +#define h5bl_readfieldattrib_r4 F77_NAME ( \ + h5bl_readfieldattrib_r4, \ + h5bl_readfieldattrib_r4_, \ + H5BL_READFIELDATTRIB_R4) +h5_err_t +h5bl_readfieldattrib_r4 ( + const h5_int64_t* const fh, + const char* const field_name, + const char* const attrib_name, + h5_float32_t* const attrib_value, + const int l_field_name, + const int l_attrib_name + ) { + h5_file_t f = h5_filehandlefor2c (fh); + H5_API_ENTER (h5_int64_t, + "fh=%p, field_name='%.*s', attrib_name='%.*s', " + "attrib_value=%p", + (h5_file_p)f, + l_field_name, field_name, + l_attrib_name, attrib_name, + attrib_value); + H5_API_RETURN (read_field_attrib ( + f, + field_name, l_field_name, + attrib_name, l_attrib_name, + H5_R4_T, + attrib_value)); +} + +/* + _ _ + (_)_ __ | |_ ___ __ _ ___ _ __ + | | '_ \| __/ _ \/ _` |/ _ \ '__| + | | | | | || __/ (_| | __/ | + |_|_| |_|\__\___|\__, |\___|_| + |___/ +*/ +#define h5bl_writefieldattrib_i8 F77_NAME ( \ + h5bl_writefieldattrib_i8, \ + h5bl_writefieldattrib_i8_, \ + H5BL_WRITEFIELDATTRIB_I8) +h5_int64_t +h5bl_writefieldattrib_i8 ( + const h5_int64_t* const fh, + const char* const field_name, + const char* const attrib_name, + const h5_int64_t* const attrib_value, + const h5_int64_t* const attrib_nelems, + const int l_field_name, + const int l_attrib_name + ) { + h5_file_t f = h5_filehandlefor2c (fh); + H5_API_ENTER (h5_int64_t, + "fh=%p, field_name='%.*s', attrib_name='%.*s', " + "attrib_value=%p, attrib_nelems=%lld", + (h5_file_p)f, + l_field_name, field_name, + l_attrib_name, attrib_name, + attrib_value, *attrib_nelems); + H5_API_RETURN (write_field_attrib ( + f, + field_name, l_field_name, + attrib_name, l_attrib_name, + H5_I8_T, + attrib_value, *attrib_nelems)); +} + +#define h5bl_readfieldattrib_i8 F77_NAME ( \ + h5bl_readfieldattrib_i8, \ + h5bl_readfieldattrib_i8_, \ + H5BL_READFIELDATTRIB_I8) +h5_err_t +h5bl_readfieldattrib_i8 ( + const h5_int64_t* const fh, + const char* const field_name, + const char* const attrib_name, + h5_int64_t* const attrib_value, + const int l_field_name, + const int l_attrib_name, + const int l_attrib_value + ) { + h5_file_t f = h5_filehandlefor2c (fh); + H5_API_ENTER (h5_int64_t, + "fh=%p, field_name='%.*s', attrib_name='%.*s', " + "attrib_value=%p", + (h5_file_p)f, + l_field_name, field_name, + l_attrib_name, attrib_name, + attrib_value); + H5_API_RETURN (read_field_attrib ( + f, + field_name, l_field_name, + attrib_name, l_attrib_name, + H5_I8_T, + attrib_value)); +} + +#define h5bl_writefieldattrib_i4 F77_NAME ( \ + h5bl_writefieldattrib_i4, \ + h5bl_writefieldattrib_i4_, \ + H5BL_WRITEFIELDATTRIB_I4 ) +h5_int64_t +h5bl_writefieldattrib_i4 ( + const h5_int64_t* const fh, + const char* const field_name, + const char* const attrib_name, + const h5_int32_t* const attrib_value, + const h5_int64_t* const attrib_nelems, + const int l_field_name, + const int l_attrib_name + ) { + h5_file_t f = h5_filehandlefor2c (fh); + H5_API_ENTER (h5_int64_t, + "fh=%p, field_name='%.*s', attrib_name='%.*s', " + "attrib_value=%p, attrib_nelems=%lld", + (h5_file_p)f, + l_field_name, field_name, + l_attrib_name, attrib_name, + attrib_value, *attrib_nelems); + H5_API_RETURN (write_field_attrib ( + f, + field_name, l_field_name, + attrib_name, l_attrib_name, + H5_I4_T, + attrib_value, *attrib_nelems)); +} + +#define h5bl_readfieldattrib_i4 F77_NAME ( \ + h5bl_readfieldattrib_i4, \ + h5bl_readfieldattrib_i4_, \ + H5BL_READFIELDATTRIB_I4) +h5_err_t +h5bl_readfieldattrib_i4 ( + const h5_int64_t* const fh, + const char* const field_name, + const char* const attrib_name, + h5_int32_t* const attrib_value, + const int l_field_name, + const int l_attrib_name + ) { + h5_file_t f = h5_filehandlefor2c (fh); + H5_API_ENTER (h5_int64_t, + "fh=%p, field_name='%.*s', attrib_name='%.*s', " + "attrib_value=%p", + (h5_file_p)f, + l_field_name, field_name, + l_attrib_name, attrib_name, + attrib_value); + H5_API_RETURN (read_field_attrib ( + f, + field_name, l_field_name, + attrib_name, l_attrib_name, + H5_I4_T, + attrib_value)); +} diff --git a/src/Fortran/H5Block_attribsF.f90 b/src/Fortran/H5Block_attribsF.f90 new file mode 100644 index 0000000..020aa6e --- /dev/null +++ b/src/Fortran/H5Block_attribsF.f90 @@ -0,0 +1,249 @@ + +! __ _ _ _ _ _ _ _ _ +! / _(_) ___| | __| | __ _| |_| |_ _ __(_) |__ _ _| |_ ___ ___ +! | |_| |/ _ \ |/ _` | / _` | __| __| '__| | '_ \| | | | __/ _ \/ __| +! | _| | __/ | (_| | | (_| | |_| |_| | | | |_) | |_| | || __/\__ \ +! |_| |_|\___|_|\__,_| \__,_|\__|\__|_| |_|_.__/ \__,_|\__\___||___/ + +! +! __ _ _ _ ___ _ __ _ _ +! / _` | | | |/ _ \ '__| | | | +! | (_| | |_| | __/ | | |_| | +! \__, |\__,_|\___|_| \__, | +! |_| |___/ + +!> +!! \ingroup h5block_attrib_f +!! See \ref H5BlockGetNumFieldAttribs +!! \return number of attributes or error code +!< +INTEGER*8 FUNCTION h5bl_getnfieldattribs (filehandle, field_name) + INTEGER*8, INTENT(IN) :: filehandle !< file handle + CHARACTER(LEN=*), INTENT(IN) :: field_name !< name of field +END FUNCTION + +!> +!! \ingroup h5block_attrib_f +!! See \ref H5BlockGetFieldAttribInfo +!! \return 0 on success or error code +!< +INTEGER*8 FUNCTION h5bl_getfieldattribinfo (filehandle, field_name, idx, attrib_name, attrib_nelems) + INTEGER*8,INTENT(IN) :: filehandle !< file handle + CHARACTER(LEN=*), INTENT(IN) :: field_name !< name of field + INTEGER*8,INTENT(IN) :: idx !< index of attribute being queried + CHARACTER(LEN=*), INTENT(OUT):: attrib_name !< name of attribute + INTEGER*8,INTENT(OUT):: attrib_nelems !< number of elements in the attrib array +END FUNCTION + +! _ __ _ _ +! (_) / /__ ___| |_ _ __(_)_ __ __ _ +! | | / / _ \ / __| __| '__| | '_ \ / _` | +! | |/ / (_) | \__ \ |_| | | | | | | (_| | +! |_/_/ \___/ |___/\__|_| |_|_| |_|\__, | +! |___/ + +!> +!! \ingroup h5block_attrib_f +!! See \ref H5BlockWriteFieldAttribString +!! \return 0 on success or error code +!< +INTEGER*8 FUNCTION h5bl_writefieldattrib_string (filehandle, field_name, attrib_name, attrib_value, attrib_nelems) + INTEGER*8, INTENT(IN) :: filehandle !< file handle + CHARACTER(LEN=*), INTENT(IN) :: field_name !< name of field + CHARACTER(LEN=*), INTENT(IN) :: attrib_name !< name of attribute + CHARACTER(LEN=*), INTENT(IN) :: attrib_value!< attribute data to be written + INTEGER*8, INTENT(IN) :: attrib_nelems !< number of elements in data array +END FUNCTION + +!> +!! \ingroup h5block_attrib_f +!! \return 0 on success or error code +!< +INTEGER*8 FUNCTION h5bl_readfieldattrib_string (filehandle, field_name, attrib_name, attrib_value) + INTEGER*8, INTENT(IN) :: filehandle !< file handle + CHARACTER(LEN=*), INTENT(IN) :: field_name !< name of field + CHARACTER(LEN=*), INTENT(IN) :: attrib_name !< name of attribute + CHARACTER(LEN=*), INTENT(IN) :: attrib_value!< attribute data will be read into this array +END FUNCTION + +! _ __ _ +! (_) / /__ _ __ ___ __ _| | +! | | / / _ \ | '__/ _ \/ _` | | +! | |/ / (_) | | | | __/ (_| | | +! |_/_/ \___/ |_| \___|\__,_|_| + +!> +!! \ingroup h5block_attrib_f +!! +!! See \ref H5BlockWriteFieldAttribFloat64 +!! \return 0 on success or error code +!< +INTEGER*8 FUNCTION h5bl_writefieldattrib_r8 (filehandle, field_name, attrib_name, attrib_value, attrib_nelems) + INTEGER*8,INTENT(IN) :: filehandle !< file handle + CHARACTER(LEN=*), INTENT(IN) :: field_name !< name of field + CHARACTER(LEN=*), INTENT(IN) :: attrib_name !< name of attribute to write + REAL*8, INTENT(OUT):: attrib_value(*) !< attribute data to be written + INTEGER*8, INTENT(IN) :: attrib_nelems !< number of elements in data array +END FUNCTION + +!> +!! \ingroup h5block_attrib_f +!! See \ref H5BlockReadFieldAttribFloat64 +!! \return 0 on success or error code +!< +INTEGER*8 FUNCTION h5bl_readfieldattrib_r8 ( filehandle, field_name, attrib_name, attrib_value ) + INTEGER*8,INTENT(IN) :: filehandle !< file handle + CHARACTER(LEN=*), INTENT(IN) :: field_name !< name of field + CHARACTER(LEN=*), INTENT(IN) :: attrib_name !< name of attribute to read + REAL*8, INTENT(OUT):: attrib_value(*) !< attribute data will be read into this array +END FUNCTION + +!> +!! \ingroup h5block_attrib_f +!! See \ref H5BlockWriteFieldAttribFloat32 +!! \return 0 on success or error code +!< +INTEGER*8 FUNCTION h5bl_writefieldattrib_r4 (filehandle, field_name, attrib_name, attrib_value, attrib_nelems) + INTEGER*8,INTENT(IN) :: filehandle !< file handle + CHARACTER(LEN=*), INTENT(IN) :: field_name !< name of field + CHARACTER(LEN=*), INTENT(IN) :: attrib_name !< name of attribute to write + REAL*4, INTENT(OUT):: attrib_value(*) !< attribute datato be written + INTEGER*8, INTENT(IN) :: attrib_nelems !< number of elements in data array +END FUNCTION + +!> +!! \ingroup h5block_attrib_f +!! See \ref H5BlockReadFieldAttribFloat32 +!! \return 0 on success or error code +!< +INTEGER*8 FUNCTION h5bl_readfieldattrib_r4 (filehandle, field_name, attrib_name, attrib_value) + INTEGER*8,INTENT(IN) :: filehandle !< file handle + CHARACTER(LEN=*), INTENT(IN) :: field_name !< name of field + CHARACTER(LEN=*), INTENT(IN) :: attrib_name !< name of attribute to read + REAL*4, INTENT(OUT):: attrib_value(*) !< attribute data will be read into this array +END FUNCTION + +! _ __ _ _ +! (_) / /__ (_)_ __ | |_ ___ __ _ ___ _ __ +! | | / / _ \ | | '_ \| __/ _ \/ _` |/ _ \ '__| +! | |/ / (_) | | | | | | || __/ (_| | __/ | +! |_/_/ \___/ |_|_| |_|\__\___|\__, |\___|_| +! |___/ + +!> +!! \ingroup h5block_attrib_f +!! See \ref H5BlockWriteFieldAttribInt64 +!! \return 0 on success or error code +!< +INTEGER*8 FUNCTION h5bl_writefieldattrib_i8 (filehandle, field_name, attrib_name, attrib_value, attrib_nelems) + INTEGER*8,INTENT(IN) :: filehandle !< file handle + CHARACTER(LEN=*), INTENT(IN) :: field_name !< name of field + CHARACTER(LEN=*), INTENT(IN) :: attrib_name !< name of attribute to write + INTEGER*8,INTENT(OUT):: attrib_value(*) !< attribute data to be written + INTEGER*8, INTENT(IN) :: attrib_nelems !< number of elements in data array +END FUNCTION + +!> +!! \ingroup h5block_attrib_f +!! See \ref H5BlockReadFieldAttribInt64 +!! \return 0 on success or error code +!< +INTEGER*8 FUNCTION h5bl_readfieldattrib_i8 (filehandle, field_name, attrib_name, attrib_value) + INTEGER*8,INTENT(IN) :: filehandle !< file handle + CHARACTER(LEN=*), INTENT(IN) :: field_name !< name of field + CHARACTER(LEN=*), INTENT(IN) :: attrib_name !< name of attribute to read + INTEGER*8,INTENT(OUT):: attrib_value(*) !< attribute data will be read into this array +END FUNCTION + +!> +!! \ingroup h5block_attrib_f +!! See \ref H5BlockWriteFieldAttribInt32 +!! \return 0 on success or error code +!< +INTEGER*8 FUNCTION h5bl_writefieldattrib_i4 (filehandle, field_name, attrib_name, attrib_value, attrib_nelems) + INTEGER*8,INTENT(IN) :: filehandle !< file handle + CHARACTER(LEN=*), INTENT(IN) :: field_name !< name of field + CHARACTER(LEN=*), INTENT(IN) :: attrib_name !< name of attribute to write + INTEGER*4,INTENT(OUT):: attrib_value(*) !< attribute data to be written + INTEGER*8, INTENT(IN) :: attrib_nelems !< number of elements in data array +END FUNCTION + +!> +!! \ingroup h5block_attrib_f +!! See \ref H5BlockReadFieldAttribInt32 +!! \return 0 on success or error code +!< +INTEGER*8 FUNCTION h5bl_readfieldattrib_i4 (filehandle, field_name, attrib_name, attrib_value) + INTEGER*8,INTENT(IN) :: filehandle !< file handle + CHARACTER(LEN=*), INTENT(IN) :: field_name !< name of field + CHARACTER(LEN=*), INTENT(IN) :: attrib_name !< name of attribute to read + INTEGER*4,INTENT(OUT):: attrib_value(*) !< attribute data will be read into this array +END FUNCTION + +! __ _ _ _ _ +! / _(_) ___| | __| | ___ _ __ __ _ ___(_)_ __ __ _ +! | |_| |/ _ \ |/ _` | / __| '_ \ / _` |/ __| | '_ \ / _` | +! | _| | __/ | (_| | \__ \ |_) | (_| | (__| | | | | (_| | +! |_| |_|\___|_|\__,_| |___/ .__/ \__,_|\___|_|_| |_|\__, | +! |_| |___/ + +!> +!! \ingroup h5block_attrib_f +!! See \ref H5Block3dGetFieldSpacing +!! \return 0 on success or error code +!< +INTEGER*8 FUNCTION h5bl_3d_get_field_spacing (filehandle, name, x, y, z) + INTEGER*8, INTENT(IN) :: filehandle + CHARACTER(LEN=*), INTENT(IN) :: name + REAL*8, INTENT(OUT) :: x + REAL*8, INTENT(OUT) :: y + REAL*8, INTENT(OUT) :: z +END FUNCTION + +!> +!! \ingroup h5block_attrib_f +!! See \ref H5Block3dSetFieldSpacing +!! \return 0 on success or error code +!< +INTEGER*8 FUNCTION h5bl_3d_set_field_spacing (filehandle, name, x, y, z) + INTEGER*8, INTENT(IN) :: filehandle + CHARACTER(LEN=*), INTENT(IN) :: name + REAL*8, INTENT(IN) :: x + REAL*8, INTENT(IN) :: y + REAL*8, INTENT(IN) :: z +END FUNCTION + +! __ _ _ _ _ _ +! / _(_) ___| | __| | ___ _ __(_) __ _(_)_ __ +! | |_| |/ _ \ |/ _` | / _ \| '__| |/ _` | | '_ \ +! | _| | __/ | (_| | | (_) | | | | (_| | | | | | +! |_| |_|\___|_|\__,_| \___/|_| |_|\__, |_|_| |_| +! |___/ + +!> +!! \ingroup h5block_attrib_f +!! See \ref H5Block3dGetFieldOrigin +!! \return 0 on success or error code +!< +INTEGER*8 FUNCTION h5bl_3d_get_field_origin (filehandle, name, x, y, z) + INTEGER*8, INTENT(IN) :: filehandle + CHARACTER(LEN=*), INTENT(IN) :: name + REAL*8, INTENT(OUT) :: x + REAL*8, INTENT(OUT) :: y + REAL*8, INTENT(OUT) :: z +END FUNCTION + +!> +!! \ingroup h5block_attrib_f +!! See \ref H5Block3dSetFieldOrigin +!! \return 0 on success or error code +!< +INTEGER*8 FUNCTION h5bl_3d_set_field_origin (filehandle, name, x, y, z) + INTEGER*8, INTENT(IN) :: filehandle + CHARACTER(LEN=*), INTENT(IN) :: name + REAL*8, INTENT(IN) :: x + REAL*8, INTENT(IN) :: y + REAL*8, INTENT(IN) :: z +END FUNCTION + +!> @} diff --git a/src/Fortran/H5Block_io.c b/src/Fortran/H5Block_io.c new file mode 100644 index 0000000..3a2c1c7 --- /dev/null +++ b/src/Fortran/H5Block_io.c @@ -0,0 +1,387 @@ +/* + Copyright (c) 2006-2012, The Regents of the University of California, + through Lawrence Berkeley National Laboratory (subject to receipt of any + required approvals from the U.S. Dept. of Energy) and the Paul Scherrer + Institut (Switzerland). All rights reserved. + + License: see file COPYING in top level of source distribution. +*/ + +#include "h5_private.h" +#include "h5core/h5b_io.h" + +#define h5bl_3d_write_scalar_field_r8 F77_NAME ( \ + h5bl_3d_write_scalar_field_r8, \ + h5bl_3d_write_scalar_field_r8_, \ + H5BL_3D_WRITE_SCALAR_FIELD_R8 ) +h5_err_t +h5bl_3d_write_scalar_field_r8 ( + const h5_int64_t* const fh, + const char* const name, + const h5_float64_t* const buffer, + const int l_name + ) { + h5_file_t f = h5_filehandlefor2c (fh); + H5_API_ENTER (h5_err_t, + "fh=%p, name='%*s', buffer=%p", + (h5_file_p)f, l_name, name, buffer); + char *name2 = h5_strdupfor2c ( name, l_name ); + h5_err_t herr = h5b_write_scalar_data ( + f, name2, (void*)buffer, H5T_NATIVE_DOUBLE ); + free ( name2 ); + H5_API_RETURN(herr); +} + +#define h5bl_3d_read_scalar_field_r8 F77_NAME ( \ + h5bl_3d_read_scalar_field_r8, \ + h5bl_3d_read_scalar_field_r8_, \ + H5BL_3D_READ_SCALAR_FIELD_R8 ) +h5_err_t +h5bl_3d_read_scalar_field_r8 ( + const h5_int64_t* const fh, + const char* const name, + h5_float64_t* const buffer, + const int l_name + ) { + h5_file_t f = h5_filehandlefor2c (fh); + H5_API_ENTER (h5_err_t, + "fh=%p, name='%s', buffer=%p, l_name=%d", + (h5_file_p)f, name, buffer, l_name); + char *name2 = h5_strdupfor2c ( name, l_name ); + h5_err_t herr = h5b_read_scalar_data ( + f, name2, buffer, H5T_NATIVE_DOUBLE ); + free ( name2 ); + H5_API_RETURN(herr); +} + +#define h5bl_3d_write_vector3d_field_r8 F77_NAME ( \ + h5bl_3d_write_vector3d_field_r8, \ + h5bl_3d_write_vector3d_field_r8_, \ + H5BL_3D_WRITE_VECTOR3D_FIELD_R8 ) +h5_err_t +h5bl_3d_write_vector3d_field_r8 ( + const h5_int64_t* const fh, + const char* const name, + const h5_float64_t* const x_buf, + const h5_float64_t* const y_buf, + const h5_float64_t* const z_buf, + const int l_name + ) { + h5_file_t f = h5_filehandlefor2c (fh); + H5_API_ENTER (h5_err_t, + "fh=%p, name='%s', x_buf=%p, y_buf=%p, z_buf=%p, l_name=%d", + (h5_file_p)f, name, x_buf, y_buf, z_buf, l_name); + char *name2 = h5_strdupfor2c ( name, l_name ); + h5_err_t herr = h5b_write_vector3d_data ( + f, name2, + (void*)x_buf, (void*)y_buf, (void*)z_buf, H5T_NATIVE_DOUBLE ); + free ( name2 ); + H5_API_RETURN(herr); +} + +#define h5bl_3d_read_vector3d_field_r8 F77_NAME ( \ + h5bl_3d_read_vector3d_field_r8, \ + h5bl_3d_read_vector3d_field_r8_, \ + H5BL_3D_READ_VECTOR3D_FIELD_R8 ) +h5_err_t +h5bl_3d_read_vector3d_field_r8 ( + const h5_int64_t* const fh, + const char* const name, + h5_float64_t* const x_buf, + h5_float64_t* const y_buf, + h5_float64_t* const z_buf, + const int l_name + ) { + h5_file_t f = h5_filehandlefor2c (fh); + H5_API_ENTER (h5_err_t, + "fh=%p, name='%s', x_buf=%p, y_buf=%p, z_buf=%p, l_name=%d", + (h5_file_p)f, name, x_buf, y_buf, z_buf, l_name); + char *name2 = h5_strdupfor2c ( name, l_name ); + h5_err_t herr = h5b_read_vector3d_data ( + f, name2, + (void*)x_buf, (void*)y_buf, (void*)z_buf, H5T_NATIVE_DOUBLE ); + free ( name2 ); + H5_API_RETURN(herr); +} + +#define h5bl_3d_write_scalar_field_r4 F77_NAME ( \ + h5bl_3d_write_scalar_field_r4, \ + h5bl_3d_write_scalar_field_r4_, \ + H5BL_3D_WRITE_SCALAR_FIELD_R4 ) +h5_err_t +h5bl_3d_write_scalar_field_r4 ( + const h5_int64_t*const fh, + const char* const name, + const h5_float32_t* const buffer, + const int l_name + ) { + h5_file_t f = h5_filehandlefor2c (fh); + H5_API_ENTER (h5_err_t, + "fh=%p, name='%s', buffer=%p, l_name=%d", + (h5_file_p)f, name, buffer, l_name); + char *name2 = h5_strdupfor2c ( name, l_name ); + h5_err_t herr = h5b_write_scalar_data ( + f, name2, (void*)buffer, H5T_NATIVE_FLOAT ); + free ( name2 ); + H5_API_RETURN(herr); +} + +#define h5bl_3d_read_scalar_field_r4 F77_NAME ( \ + h5bl_3d_read_scalar_field_r4, \ + h5bl_3d_read_scalar_field_r4_, \ + H5BL_3D_READ_SCALAR_FIELD_R4 ) +h5_err_t +h5bl_3d_read_scalar_field_r4 ( + const h5_int64_t* const fh, + const char* const name, + h5_float32_t* const buffer, + const int l_name + ) { + h5_file_t f = h5_filehandlefor2c (fh); + H5_API_ENTER (h5_err_t, + "fh=%p, name='%s', buffer=%p, l_name=%d", + (h5_file_p)f, name, buffer, l_name); + char *name2 = h5_strdupfor2c ( name, l_name ); + h5_err_t herr = h5b_read_scalar_data ( + f, name2, buffer, H5T_NATIVE_FLOAT ); + free ( name2 ); + H5_API_RETURN(herr); +} + +#define h5bl_3d_write_vector3d_field_r4 F77_NAME ( \ + h5bl_3d_write_vector3d_field_r4, \ + h5bl_3d_write_vector3d_field_r4_, \ + H5BL_3D_WRITE_VECTOR3D_FIELD_R4 ) +h5_err_t +h5bl_3d_write_vector3d_field_r4 ( + const h5_int64_t* const fh, + const char* const name, + const h5_float32_t* const x_buf, + const h5_float32_t* const y_buf, + const h5_float32_t* const z_buf, + const int l_name + ) { + h5_file_t f = h5_filehandlefor2c (fh); + H5_API_ENTER (h5_err_t, + "fh=%p, name='%s', x_buf=%p, y_buf=%p, z_buf=%p, l_name=%d", + (h5_file_p)f, name, x_buf, y_buf, z_buf, l_name); + char *name2 = h5_strdupfor2c ( name, l_name ); + h5_err_t herr = h5b_write_vector3d_data ( + f, name2, + (void*)x_buf, (void*)y_buf, (void*)z_buf, H5T_NATIVE_FLOAT ); + free ( name2 ); + H5_API_RETURN(herr); +} + +#define h5bl_3d_read_vector3d_field_r4 F77_NAME ( \ + h5bl_3d_read_vector3d_field_r4, \ + h5bl_3d_read_vector3d_field_r4_, \ + H5BL_3D_READ_VECTOR3D_FIELD_R4 ) +h5_err_t +h5bl_3d_read_vector3d_field_r4 ( + const h5_int64_t* const fh, + const char* const name, + h5_float32_t* const x_buf, + h5_float32_t* const y_buf, + h5_float32_t* const z_buf, + const int l_name + ) { + h5_file_t f = h5_filehandlefor2c (fh); + H5_API_ENTER (h5_err_t, + "fh=%p, name='%s', x_buf=%p, y_buf=%p, z_buf=%p, l_name=%d", + (h5_file_p)f, name, x_buf, y_buf, z_buf, l_name); + char *name2 = h5_strdupfor2c ( name, l_name ); + h5_err_t herr = h5b_read_vector3d_data ( + f, name2, + (void*)x_buf, (void*)y_buf, (void*)z_buf, H5T_NATIVE_FLOAT ); + free ( name2 ); + H5_API_RETURN (herr); +} + +#define h5bl_3d_write_scalar_field_i8 F77_NAME ( \ + h5bl_3d_write_scalar_field_i8, \ + h5bl_3d_write_scalar_field_i8_, \ + H5BL_3D_WRITE_SCALAR_FIELD_I8 ) +h5_err_t +h5bl_3d_write_scalar_field_i8 ( + const h5_int64_t* const fh, + const char* const name, + const h5_int64_t* const buffer, + const int l_name + ) { + h5_file_t f = h5_filehandlefor2c (fh); + H5_API_ENTER (h5_err_t, + "fh=%p, name='%s', buffer=%p, l_name=%d", + (h5_file_p)f, name, buffer, l_name); + char *name2 = h5_strdupfor2c ( name, l_name ); + h5_err_t herr = h5b_write_scalar_data ( + f, name2, (void*)buffer, H5T_NATIVE_INT64 ); + free ( name2 ); + H5_API_RETURN (herr); +} + +#define h5bl_3d_read_scalar_field_i8 F77_NAME ( \ + h5bl_3d_read_scalar_field_i8, \ + h5bl_3d_read_scalar_field_i8_, \ + H5BL_3D_READ_SCALAR_FIELD_I8 ) +h5_err_t +h5bl_3d_read_scalar_field_i8 ( + const h5_int64_t* const fh, + const char* const name, + h5_int64_t* const buffer, + const int l_name + ) { + h5_file_t f = h5_filehandlefor2c (fh); + H5_API_ENTER (h5_err_t, + "fh=%p, name='%s', buffer=%p, l_name=%d", + (h5_file_p)f, name, buffer, l_name); + char *name2 = h5_strdupfor2c ( name, l_name ); + h5_err_t herr = h5b_read_scalar_data ( + f, name2, buffer, H5T_NATIVE_INT64 ); + free (name2); + H5_API_RETURN (herr); +} + +#define h5bl_3d_write_vector3d_field_i8 F77_NAME ( \ + h5bl_3d_write_vector3d_field_i8, \ + h5bl_3d_write_vector3d_field_i8_, \ + H5BL_3D_WRITE_VECTOR3D_FIELD_I8 ) +h5_err_t +h5bl_3d_write_vector3d_field_i8 ( + const h5_int64_t* const fh, + const char* const name, + const h5_int64_t* const x_buf, + const h5_int64_t* const y_buf, + const h5_int64_t* const z_buf, + const int l_name + ) { + h5_file_t f = h5_filehandlefor2c (fh); + H5_API_ENTER (h5_err_t, + "fh=%p, name='%s', x_buf=%p, y_buf=%p, z_buf=%p, l_name=%d", + (h5_file_p)f, name, x_buf, y_buf, z_buf, l_name); + char *name2 = h5_strdupfor2c ( name, l_name ); + h5_err_t herr = h5b_write_vector3d_data ( + f, name2, + (void*)x_buf, (void*)y_buf, (void*)z_buf, H5T_NATIVE_INT64 ); + free ( name2 ); + H5_API_RETURN(herr); +} + +#define h5bl_3d_read_vector3d_field_i8 F77_NAME ( \ + h5bl_3d_read_vector3d_field_i8, \ + h5bl_3d_read_vector3d_field_i8_, \ + H5BL_3D_READ_VECTOR3D_FIELD_I8 ) +h5_err_t +h5bl_3d_read_vector3d_field_i8 ( + const h5_int64_t *const fh, + const char* const name, + h5_int64_t* const x_buf, + h5_int64_t* const y_buf, + h5_int64_t* const z_buf, + const int l_name + ) { + h5_file_t f = h5_filehandlefor2c (fh); + H5_API_ENTER (h5_err_t, + "fh=%p, name='%s', x_buf=%p, y_buf=%p, z_buf=%p, l_name=%d", + (h5_file_p)f, name, x_buf, y_buf, z_buf, l_name); + char *name2 = h5_strdupfor2c ( name, l_name ); + h5_err_t herr = h5b_read_vector3d_data ( + f, name2, + (void*)x_buf, (void*)y_buf, (void*)z_buf, H5T_NATIVE_INT64 ); + free ( name2 ); + H5_API_RETURN(herr); +} + +#define h5bl_3d_write_scalar_field_i4 F77_NAME ( \ + h5bl_3d_write_scalar_field_i4, \ + h5bl_3d_write_scalar_field_i4_, \ + H5BL_3D_WRITE_SCALAR_FIELD_I4 ) +h5_err_t +h5bl_3d_write_scalar_field_i4 ( + const h5_int64_t* const fh, + const char* const name, + const h5_int32_t* const buffer, + const int l_name + ) { + h5_file_t f = h5_filehandlefor2c (fh); + H5_API_ENTER (h5_err_t, + "fh=%p, name='%s', buffer=%p, l_name=%d", + (h5_file_p)f, name, buffer, l_name); + char *name2 = h5_strdupfor2c ( name, l_name ); + h5_err_t herr = h5b_write_scalar_data ( + f, name2, (void*)buffer, H5T_NATIVE_INT32 ); + free ( name2 ); + H5_API_RETURN(herr); +} + +#define h5bl_3d_read_scalar_field_i4 F77_NAME ( \ + h5bl_3d_read_scalar_field_i4, \ + h5bl_3d_read_scalar_field_i4_, \ + H5BL_3D_READ_SCALAR_FIELD_I4 ) +h5_err_t +h5bl_3d_read_scalar_field_i4 ( + const h5_int64_t* const fh, + const char* const name, + h5_int32_t* const buffer, + const int l_name + ) { + h5_file_t f = h5_filehandlefor2c (fh); + H5_API_ENTER (h5_err_t, + "fh=%p, name='%s', buffer=%p, l_name=%d", + (h5_file_p)f, name, buffer, l_name); + char *name2 = h5_strdupfor2c ( name, l_name ); + h5_err_t herr = h5b_read_scalar_data ( + f, name2, buffer, H5T_NATIVE_INT32 ); + free ( name2 ); + H5_API_RETURN(herr); +} + +#define h5bl_3d_write_vector3d_field_i4 F77_NAME ( \ + h5bl_3d_write_vector3d_field_i4, \ + h5bl_3d_write_vector3d_field_i4_, \ + H5BL_3D_WRITE_VECTOR3D_FIELD_I4 ) +h5_err_t +h5bl_3d_write_vector3d_field_i4 ( + const h5_int64_t* const fh, + const char* const name, + const h5_int32_t* const x_buf, + const h5_int32_t* const y_buf, + const h5_int32_t* const z_buf, + const int l_name + ) { + h5_file_t f = h5_filehandlefor2c (fh); + H5_API_ENTER (h5_err_t, + "fh=%p, name='%s', x_buf=%p, y_buf=%p, z_buf=%p, l_name=%d", + (h5_file_p)f, name, x_buf, y_buf, z_buf, l_name); + char *name2 = h5_strdupfor2c ( name, l_name ); + h5_err_t herr = h5b_write_vector3d_data ( + f, name2, + (void*)x_buf, (void*)y_buf, (void*)z_buf, H5T_NATIVE_INT32 ); + free ( name2 ); + H5_API_RETURN(herr); +} + +#define h5bl_3d_read_vector3d_field_i4 F77_NAME ( \ + h5bl_3d_read_vector3d_field_i4, \ + h5bl_3d_read_vector3d_field_i4_, \ + H5BL_3D_READ_VECTOR3D_FIELD_I4 ) +h5_err_t +h5bl_3d_read_vector3d_field_i4 ( + const h5_int64_t* const fh, + const char* const name, + h5_int32_t* const x_buf, + h5_int32_t* const y_buf, + h5_int32_t* const z_buf, + const int l_name + ) { + h5_file_t f = h5_filehandlefor2c (fh); + H5_API_ENTER (h5_err_t, + "fh=%p, name='%s', x_buf=%p, y_buf=%p, z_buf=%p, l_name=%d", + (h5_file_p)f, name, x_buf, y_buf, z_buf, l_name); + char *name2 = h5_strdupfor2c ( name, l_name ); + h5_err_t herr = h5b_read_vector3d_data ( + f, name2, + (void*)x_buf, (void*)y_buf, (void*)z_buf, H5T_NATIVE_INT32 ); + free ( name2 ); + H5_API_RETURN(herr); +} diff --git a/src/Fortran/H5Block_ioF.f90 b/src/Fortran/H5Block_ioF.f90 new file mode 100644 index 0000000..12662d6 --- /dev/null +++ b/src/Fortran/H5Block_ioF.f90 @@ -0,0 +1,181 @@ +!> \ingroup h5hut_f90_api +!! \addtogroup h5block_data_f +!! @{ + +!> +!! See \ref H5Block3dWriteScalarFieldFloat64 +!! \return 0 on success or error code +!< +INTEGER*8 FUNCTION h5bl_3d_write_scalar_field_r8 ( filehandle, name, buffer ) + INTEGER*8, INTENT(IN) :: filehandle !< the handle returned at file open + CHARACTER(LEN=*), INTENT(IN) :: name !< the name of the dataset + REAL*8, INTENT(IN) :: buffer(*) !< the array of data +END FUNCTION + +!> +!! See \ref H5Block3dReadScalarFieldFloat64 +!! \return 0 on success or error code +!< +INTEGER*8 FUNCTION h5bl_3d_read_scalar_field_r8 ( filehandle, name, buffer ) + INTEGER*8, INTENT(IN) :: filehandle !< the handle returned at file open + CHARACTER(LEN=*), INTENT(IN) :: name !< the name of the dataset + REAL*8, INTENT(OUT) :: buffer(*) !< buffer to read the data into +END FUNCTION + +!> +!! See \ref H5Block3dWriteVector3dFieldFloat64 +!! \return 0 on success or error code +!< +INTEGER*8 FUNCTION h5bl_3d_write_vector3d_field_r8 ( filehandle, name, x, y, z ) + INTEGER*8, INTENT(IN) :: filehandle !< the handle returned at file open + CHARACTER(LEN=*), INTENT(IN) :: name !< the name of the dataset + REAL*8, INTENT(IN) :: x(*) !< the array of x data to write + REAL*8, INTENT(IN) :: y(*) !< the array of y data to write + REAL*8, INTENT(IN) :: z(*) !< the array of z data to write +END FUNCTION + +!> +!! See \ref H5Block3dReadVector3dFieldFloat64 +!! \return 0 on success or error code +!< +INTEGER*8 FUNCTION h5bl_3d_read_vector3d_field_r8 ( filehandle, name, x, y, z ) + INTEGER*8, INTENT(IN) :: filehandle !< the handle returned at file open + CHARACTER(LEN=*), INTENT(IN) :: name !< the name of the dataset + REAL*8, INTENT(OUT) :: x(*) !< buffer to read the x data into + REAL*8, INTENT(OUT) :: y(*) !< buffer to read the y data into + REAL*8, INTENT(OUT) :: z(*) !< buffer to read the z data into +END FUNCTION + +!> +!! See \ref H5Block3dWriteScalarFieldFloat32 +!! \return 0 on success or error code +!< +INTEGER*8 FUNCTION h5bl_3d_write_scalar_field_r4 ( filehandle, name, buffer ) + INTEGER*8, INTENT(IN) :: filehandle !< the handle returned at file open + CHARACTER(LEN=*), INTENT(IN) :: name !< the name of the dataset + REAL*4, INTENT(IN) :: buffer(*) !< the array of data +END FUNCTION + +!> +!! See \ref H5Block3dReadScalarFieldFloat32 +!! \return 0 on success or error code +!< +INTEGER*8 FUNCTION h5bl_3d_read_scalar_field_r4 ( filehandle, name, buffer ) + INTEGER*8, INTENT(IN) :: filehandle !< the handle returned at file open + CHARACTER(LEN=*), INTENT(IN) :: name !< the name of the dataset + REAL*4, INTENT(OUT) :: buffer(*) !< buffer to read the data into +END FUNCTION + +!> +!! See \ref H5Block3dWriteVector3dFieldFloat32 +!! \return 0 on success or error code +!< +INTEGER*8 FUNCTION h5bl_3d_write_vector3d_field_r4 ( filehandle, name, x, y, z ) + INTEGER*8, INTENT(IN) :: filehandle !< the handle returned at file open + CHARACTER(LEN=*), INTENT(IN) :: name !< the name of the dataset + REAL*4, INTENT(IN) :: x(*) !< the array of x data to write + REAL*4, INTENT(IN) :: y(*) !< the array of y data to write + REAL*4, INTENT(IN) :: z(*) !< the array of z data to write +END FUNCTION + +!> +!! See \ref H5Block3dReadVector3dFieldFloat32 +!! \return 0 on success or error code +!< +INTEGER*8 FUNCTION h5bl_3d_read_vector3d_field_r4 ( filehandle, name, x, y, z ) + INTEGER*8, INTENT(IN) :: filehandle !< the handle returned at file open + CHARACTER(LEN=*), INTENT(IN) :: name !< the name of the dataset + REAL*4, INTENT(OUT) :: x(*) !< buffer to read the x data into + REAL*4, INTENT(OUT) :: y(*) !< buffer to read the y data into + REAL*4, INTENT(OUT) :: z(*) !< buffer to read the z data into +END FUNCTION + +!> +!! See \ref H5Block3dWriteScalarFieldInt64 +!! \return 0 on success or error code +!< +INTEGER*8 FUNCTION h5bl_3d_write_scalar_field_i8 ( filehandle, name, buffer ) + INTEGER*8, INTENT(IN) :: filehandle !< the handle returned at file open + CHARACTER(LEN=*), INTENT(IN) :: name !< the name of the dataset + INTEGER*8, INTENT(IN) :: buffer(*) !< the array of data +END FUNCTION + +!> +!! See \ref H5Block3dReadScalarFieldInt64 +!! \return 0 on success or error code +!< +INTEGER*8 FUNCTION h5bl_3d_read_scalar_field_i8 ( filehandle, name, buffer ) + INTEGER*8, INTENT(IN) :: filehandle !< the handle returned at file open + CHARACTER(LEN=*), INTENT(IN) :: name !< the name of the dataset + INTEGER*8, INTENT(OUT) :: buffer(*) !< buffer to read the data into +END FUNCTION + +!> +!! See \ref H5Block3dWriteVector3dFieldInt64 +!! \return 0 on success or error code +!< +INTEGER*8 FUNCTION h5bl_3d_write_vector3d_field_i8 ( filehandle, name, x, y, z ) + INTEGER*8, INTENT(IN) :: filehandle !< the handle returned at file open + CHARACTER(LEN=*), INTENT(IN) :: name !< the name of the dataset + INTEGER*8, INTENT(IN) :: x(*) !< the array of x data to write + INTEGER*8, INTENT(IN) :: y(*) !< the array of y data to write + INTEGER*8, INTENT(IN) :: z(*) !< the array of z data to write +END FUNCTION + +!> +!! See \ref H5Block3dReadVector3dFieldInt64 +!! \return 0 on success or error code +!< +INTEGER*8 FUNCTION h5bl_3d_read_vector3d_field_i8 ( filehandle, name, x, y, z ) + INTEGER*8, INTENT(IN) :: filehandle !< the handle returned at file open + CHARACTER(LEN=*), INTENT(IN) :: name !< the name of the dataset + INTEGER*8, INTENT(OUT) :: x(*) !< buffer to read the x data into + INTEGER*8, INTENT(OUT) :: y(*) !< buffer to read the y data into + INTEGER*8, INTENT(OUT) :: z(*) !< buffer to read the z data into +END FUNCTION + +!> +!! See \ref H5Block3dWriteScalarFieldInt32 +!! \return 0 on success or error code +!< +INTEGER*8 FUNCTION h5bl_3d_write_scalar_field_i4 ( filehandle, name, buffer ) + INTEGER*8, INTENT(IN) :: filehandle !< the handle returned at file open + CHARACTER(LEN=*), INTENT(IN) :: name !< the name of the dataset + INTEGER*4, INTENT(IN) :: buffer(*) !< the array of data +END FUNCTION + +!> +!! See \ref H5Block3dReadScalarFieldInt32 +!! \return 0 on success or error code +!< +INTEGER*8 FUNCTION h5bl_3d_read_scalar_field_i4 ( filehandle, name, buffer ) + INTEGER*8, INTENT(IN) :: filehandle !< the handle returned at file open + CHARACTER(LEN=*), INTENT(IN) :: name !< the name of the dataset + INTEGER*4, INTENT(OUT) :: buffer(*) !< buffer to read the data into +END FUNCTION + +!> +!! See \ref H5Block3dWriteVector3dFieldInt32 +!! \return 0 on success or error code +!< +INTEGER*8 FUNCTION h5bl_3d_write_vector3d_field_i4 ( filehandle, name, x, y, z ) + INTEGER*8, INTENT(IN) :: filehandle !< the handle returned at file open + CHARACTER(LEN=*), INTENT(IN) :: name !< the name of the dataset + INTEGER*4, INTENT(IN) :: x(*) !< the array of x data to write + INTEGER*4, INTENT(IN) :: y(*) !< the array of y data to write + INTEGER*4, INTENT(IN) :: z(*) !< the array of z data to write +END FUNCTION + +!> +!! See \ref H5Block3dReadVector3dFieldInt32 +!! \return 0 on success or error code +!< +INTEGER*8 FUNCTION h5bl_3d_read_vector3d_field_i4 ( filehandle, name, x, y, z ) + INTEGER*8, INTENT(IN) :: filehandle !< the handle returned at file open + CHARACTER(LEN=*), INTENT(IN) :: name !< the name of the dataset + INTEGER*4, INTENT(OUT) :: x(*) !< buffer to read the x data into + INTEGER*4, INTENT(OUT) :: y(*) !< buffer to read the y data into + INTEGER*4, INTENT(OUT) :: z(*) !< buffer to read the z data into +END FUNCTION + +!> @} diff --git a/src/Fortran/H5Block_readwrite_F.c b/src/Fortran/H5Block_readwrite_F.c new file mode 100644 index 0000000..33ac9a9 --- /dev/null +++ b/src/Fortran/H5Block_readwrite_F.c @@ -0,0 +1,677 @@ + +#include + +#include "h5core/h5_core.h" +#include "Underscore.h" + +#if defined(F77_SINGLE_UNDERSCORE) +#define F77NAME(a,b) a +#elif defined(F77_CRAY_UNDERSCORE) +#define F77NAME(a,b) b +#elif defined(F77_NO_UNDERSCORE) +#else +#error Error, no way to determine how to construct fortran bindings +#endif + +#if !defined(F77_NO_UNDERSCORE) +#define h5bl_3d_write_scalar_field_r8 F77NAME ( \ + h5bl_3d_write_scalar_field_r8_, \ + H5BL_3D_WRITE_SCALAR_FIELD_R8 ) +#endif + +h5_err_t +h5bl_3d_write_scalar_field_r8 ( + h5_int64_t *const f, + const char *name, + const h5_float64_t *buffer, + const int l_name + ) { + + h5_file_t *fh = h5_filehandlefor2c(f); + H5_API_ENTER (h5_err_t, + "f=%p, name='%s', buffer=%p, l_name=%d", + fh, name, buffer, l_name); + char *name2 = h5_strdupfor2c ( name, l_name ); + h5_err_t herr = h5b_write_scalar_data ( + fh, name2, (void*)buffer, H5T_NATIVE_DOUBLE ); + free ( name2 ); + H5_API_RETURN(herr); +} + +#if !defined(F77_NO_UNDERSCORE) +#define h5bl_3d_read_scalar_field_r8 F77NAME ( \ + h5bl_3d_read_scalar_field_r8_, \ + H5BL_3D_READ_SCALAR_FIELD_R8 ) +#endif + +h5_err_t +h5bl_3d_read_scalar_field_r8 ( + h5_int64_t *const f, + const char *name, + h5_float64_t *buffer, + const int l_name + ) { + + h5_file_t *fh = h5_filehandlefor2c(f); + H5_API_ENTER (h5_err_t, + "f=%p, name='%s', buffer=%p, l_name=%d", + fh, name, buffer, l_name); + char *name2 = h5_strdupfor2c ( name, l_name ); + h5_err_t herr = h5b_read_scalar_data ( + fh, name2, buffer, H5T_NATIVE_DOUBLE ); + free ( name2 ); + H5_API_RETURN(herr); +} + +#if !defined(F77_NO_UNDERSCORE) +#define h5bl_3d_write_vector3d_field_r8 F77NAME ( \ + h5bl_3d_write_vector3d_field_r8_, \ + H5BL_3D_WRITE_VECTOR3D_FIELD_R8 ) +#endif + +h5_err_t +h5bl_3d_write_vector3d_field_r8 ( + h5_int64_t *const f, + const char *name, + const h5_float64_t *x_buf, + const h5_float64_t *y_buf, + const h5_float64_t *z_buf, + const int l_name + ) { + + h5_file_t *fh = h5_filehandlefor2c(f); + H5_API_ENTER (h5_err_t, + "f=%p, name='%s', x_buf=%p, y_buf=%p, z_buf=%p, l_name=%d", + fh, name, x_buf, y_buf, z_buf, l_name); + char *name2 = h5_strdupfor2c ( name, l_name ); + h5_err_t herr = h5b_write_vector3d_data ( + fh, name2, + (void*)x_buf, (void*)y_buf, (void*)z_buf, H5T_NATIVE_DOUBLE ); + free ( name2 ); + H5_API_RETURN(herr); +} + +#if !defined(F77_NO_UNDERSCORE) +#define h5bl_3d_read_vector3d_field_r8 F77NAME ( \ + h5bl_3d_read_vector3d_field_r8_, \ + H5BL_3D_READ_VECTOR3D_FIELD_R8 ) +#endif + +h5_err_t +h5bl_3d_read_vector3d_field_r8 ( + h5_int64_t *const f, + const char *name, + h5_float64_t *x_buf, + h5_float64_t *y_buf, + h5_float64_t *z_buf, + const int l_name + ) { + h5_file_t *fh = h5_filehandlefor2c(f); + H5_API_ENTER (h5_err_t, + "f=%p, name='%s', x_buf=%p, y_buf=%p, z_buf=%p, l_name=%d", + fh, name, x_buf, y_buf, z_buf, l_name); + char *name2 = h5_strdupfor2c ( name, l_name ); + h5_err_t herr = h5b_read_vector3d_data ( + fh, name2, + (void*)x_buf, (void*)y_buf, (void*)z_buf, H5T_NATIVE_DOUBLE ); + free ( name2 ); + H5_API_RETURN(herr); +} + +#if !defined(F77_NO_UNDERSCORE) +#define h5bl_3d_write_scalar_field_r4 F77NAME ( \ + h5bl_3d_write_scalar_field_r4_, \ + H5BL_3D_WRITE_SCALAR_FIELD_R4 ) +#endif + +h5_err_t +h5bl_3d_write_scalar_field_r4 ( + h5_int64_t *const f, + const char *name, + const h5_float32_t *buffer, + const int l_name + ) { + h5_file_t *fh = h5_filehandlefor2c(f); + H5_API_ENTER (h5_err_t, + "f=%p, name='%s', buffer=%p, l_name=%d", + fh, name, buffer, l_name); + char *name2 = h5_strdupfor2c ( name, l_name ); + h5_err_t herr = h5b_write_scalar_data ( + fh, name2, (void*)buffer, H5T_NATIVE_FLOAT ); + free ( name2 ); + H5_API_RETURN(herr); +} + +#if !defined(F77_NO_UNDERSCORE) +#define h5bl_3d_read_scalar_field_r4 F77NAME ( \ + h5bl_3d_read_scalar_field_r4_, \ + H5BL_3D_READ_SCALAR_FIELD_R4 ) +#endif + +h5_err_t +h5bl_3d_read_scalar_field_r4 ( + h5_int64_t *const f, + const char *name, + h5_float32_t *buffer, + const int l_name + ) { + h5_file_t *fh = h5_filehandlefor2c(f); + H5_API_ENTER (h5_err_t, + "f=%p, name='%s', buffer=%p, l_name=%d", + fh, name, buffer, l_name); + char *name2 = h5_strdupfor2c ( name, l_name ); + h5_err_t herr = h5b_read_scalar_data ( + fh, name2, buffer, H5T_NATIVE_FLOAT ); + free ( name2 ); + H5_API_RETURN(herr); +} + +#if !defined(F77_NO_UNDERSCORE) +#define h5bl_3d_write_vector3d_field_r4 F77NAME ( \ + h5bl_3d_write_vector3d_field_r4_, \ + H5BL_3D_WRITE_VECTOR3D_FIELD_R4 ) +#endif + +h5_err_t +h5bl_3d_write_vector3d_field_r4 ( + h5_int64_t *const f, + const char *name, + const h5_float32_t *x_buf, + const h5_float32_t *y_buf, + const h5_float32_t *z_buf, + const int l_name + ) { + h5_file_t *fh = h5_filehandlefor2c(f); + H5_API_ENTER (h5_err_t, + "f=%p, name='%s', x_buf=%p, y_buf=%p, z_buf=%p, l_name=%d", + fh, name, x_buf, y_buf, z_buf, l_name); + char *name2 = h5_strdupfor2c ( name, l_name ); + h5_err_t herr = h5b_write_vector3d_data ( + fh, name2, + (void*)x_buf, (void*)y_buf, (void*)z_buf, H5T_NATIVE_FLOAT ); + free ( name2 ); + H5_API_RETURN(herr); +} + +#if !defined(F77_NO_UNDERSCORE) +#define h5bl_3d_read_vector3d_field_r4 F77NAME ( \ + h5bl_3d_read_vector3d_field_r4_, \ + H5BL_3D_READ_VECTOR3D_FIELD_R4 ) +#endif + +h5_err_t +h5bl_3d_read_vector3d_field_r4 ( + h5_int64_t *const f, + const char *name, + h5_float32_t *x_buf, + h5_float32_t *y_buf, + h5_float32_t *z_buf, + const int l_name + ) { + h5_file_t *fh = h5_filehandlefor2c(f); + H5_API_ENTER (h5_err_t, + "f=%p, name='%s', x_buf=%p, y_buf=%p, z_buf=%p, l_name=%d", + fh, name, x_buf, y_buf, z_buf, l_name); + char *name2 = h5_strdupfor2c ( name, l_name ); + h5_err_t herr = h5b_read_vector3d_data ( + fh, name2, + (void*)x_buf, (void*)y_buf, (void*)z_buf, H5T_NATIVE_FLOAT ); + free ( name2 ); + H5_API_RETURN(herr); +} + +#if !defined(F77_NO_UNDERSCORE) +#define h5bl_3d_write_scalar_field_i8 F77NAME ( \ + h5bl_3d_write_scalar_field_i8_, \ + H5BL_3D_WRITE_SCALAR_FIELD_I8 ) +#endif + +h5_err_t +h5bl_3d_write_scalar_field_i8 ( + h5_int64_t *const f, + const char *name, + const h5_int64_t *buffer, + const int l_name + ) { + h5_file_t *fh = h5_filehandlefor2c(f); + H5_API_ENTER (h5_err_t, + "f=%p, name='%s', buffer=%p, l_name=%d", + fh, name, buffer, l_name); + char *name2 = h5_strdupfor2c ( name, l_name ); + h5_err_t herr = h5b_write_scalar_data ( + fh, name2, (void*)buffer, H5T_NATIVE_INT64 ); + free ( name2 ); + H5_API_RETURN(herr); +} + +#if !defined(F77_NO_UNDERSCORE) +#define h5bl_3d_read_scalar_field_i8 F77NAME ( \ + h5bl_3d_read_scalar_field_i8_, \ + H5BL_3D_READ_SCALAR_FIELD_I8 ) +#endif + +h5_err_t +h5bl_3d_read_scalar_field_i8 ( + h5_int64_t *const f, + const char *name, + h5_int64_t *buffer, + const int l_name + ) { + h5_file_t *fh = h5_filehandlefor2c(f); + H5_API_ENTER (h5_err_t, + "f=%p, name='%s', buffer=%p, l_name=%d", + fh, name, buffer, l_name); + char *name2 = h5_strdupfor2c ( name, l_name ); + h5_err_t herr = h5b_read_scalar_data ( + fh, name2, buffer, H5T_NATIVE_INT64 ); + free ( name2 ); + H5_API_RETURN(herr); +} + +#if !defined(F77_NO_UNDERSCORE) +#define h5bl_3d_write_vector3d_field_i8 F77NAME ( \ + h5bl_3d_write_vector3d_field_i8_, \ + H5BL_3D_WRITE_VECTOR3D_FIELD_I8 ) +#endif + +h5_err_t +h5bl_3d_write_vector3d_field_i8 ( + h5_int64_t *const f, + const char *name, + const h5_int64_t *x_buf, + const h5_int64_t *y_buf, + const h5_int64_t *z_buf, + const int l_name + ) { + h5_file_t *fh = h5_filehandlefor2c(f); + H5_API_ENTER (h5_err_t, + "f=%p, name='%s', x_buf=%p, y_buf=%p, z_buf=%p, l_name=%d", + fh, name, x_buf, y_buf, z_buf, l_name); + char *name2 = h5_strdupfor2c ( name, l_name ); + h5_err_t herr = h5b_write_vector3d_data ( + fh, name2, + (void*)x_buf, (void*)y_buf, (void*)z_buf, H5T_NATIVE_INT64 ); + free ( name2 ); + H5_API_RETURN(herr); +} + +#if !defined(F77_NO_UNDERSCORE) +#define h5bl_3d_read_vector3d_field_i8 F77NAME ( \ + h5bl_3d_read_vector3d_field_i8_, \ + H5BL_3D_READ_VECTOR3D_FIELD_I8 ) +#endif + +h5_err_t +h5bl_3d_read_vector3d_field_i8 ( + h5_int64_t *const f, + const char *name, + h5_int64_t *x_buf, + h5_int64_t *y_buf, + h5_int64_t *z_buf, + const int l_name + ) { + h5_file_t *fh = h5_filehandlefor2c(f); + H5_API_ENTER (h5_err_t, + "f=%p, name='%s', x_buf=%p, y_buf=%p, z_buf=%p, l_name=%d", + fh, name, x_buf, y_buf, z_buf, l_name); + char *name2 = h5_strdupfor2c ( name, l_name ); + h5_err_t herr = h5b_read_vector3d_data ( + fh, name2, + (void*)x_buf, (void*)y_buf, (void*)z_buf, H5T_NATIVE_INT64 ); + free ( name2 ); + H5_API_RETURN(herr); +} + +#if !defined(F77_NO_UNDERSCORE) +#define h5bl_3d_write_scalar_field_i4 F77NAME ( \ + h5bl_3d_write_scalar_field_i4_, \ + H5BL_3D_WRITE_SCALAR_FIELD_I4 ) +#endif + +h5_err_t +h5bl_3d_write_scalar_field_i4 ( + h5_int64_t *const f, + const char *name, + const h5_int32_t *buffer, + const int l_name + ) { + h5_file_t *fh = h5_filehandlefor2c(f); + H5_API_ENTER (h5_err_t, + "f=%p, name='%s', buffer=%p, l_name=%d", + fh, name, buffer, l_name); + char *name2 = h5_strdupfor2c ( name, l_name ); + h5_err_t herr = h5b_write_scalar_data ( + fh, name2, (void*)buffer, H5T_NATIVE_INT32 ); + free ( name2 ); + H5_API_RETURN(herr); +} + +#if !defined(F77_NO_UNDERSCORE) +#define h5bl_3d_read_scalar_field_i4 F77NAME ( \ + h5bl_3d_read_scalar_field_i4_, \ + H5BL_3D_READ_SCALAR_FIELD_I4 ) +#endif + +h5_err_t +h5bl_3d_read_scalar_field_i4 ( + h5_int64_t *const f, + const char *name, + h5_int32_t *buffer, + const int l_name + ) { + h5_file_t *fh = h5_filehandlefor2c(f); + H5_API_ENTER (h5_err_t, + "f=%p, name='%s', buffer=%p, l_name=%d", + fh, name, buffer, l_name); + char *name2 = h5_strdupfor2c ( name, l_name ); + h5_err_t herr = h5b_read_scalar_data ( + fh, name2, buffer, H5T_NATIVE_INT32 ); + free ( name2 ); + H5_API_RETURN(herr); +} + +#if !defined(F77_NO_UNDERSCORE) +#define h5bl_3d_write_vector3d_field_i4 F77NAME ( \ + h5bl_3d_write_vector3d_field_i4_, \ + H5BL_3D_WRITE_VECTOR3D_FIELD_I4 ) +#endif + +h5_err_t +h5bl_3d_write_vector3d_field_i4 ( + h5_int64_t *const f, + const char *name, + const h5_int32_t *x_buf, + const h5_int32_t *y_buf, + const h5_int32_t *z_buf, + const int l_name + ) { + h5_file_t *fh = h5_filehandlefor2c(f); + H5_API_ENTER (h5_err_t, + "f=%p, name='%s', x_buf=%p, y_buf=%p, z_buf=%p, l_name=%d", + fh, name, x_buf, y_buf, z_buf, l_name); + char *name2 = h5_strdupfor2c ( name, l_name ); + h5_err_t herr = h5b_write_vector3d_data ( + fh, name2, + (void*)x_buf, (void*)y_buf, (void*)z_buf, H5T_NATIVE_INT32 ); + free ( name2 ); + H5_API_RETURN(herr); +} + +#if !defined(F77_NO_UNDERSCORE) +#define h5bl_3d_read_vector3d_field_i4 F77NAME ( \ + h5bl_3d_read_vector3d_field_i4_, \ + H5BL_3D_READ_VECTOR3D_FIELD_I4 ) +#endif + +h5_err_t +h5bl_3d_read_vector3d_field_i4 ( + h5_int64_t *const f, + const char *name, + h5_int32_t *x_buf, + h5_int32_t *y_buf, + h5_int32_t *z_buf, + const int l_name + ) { + h5_file_t *fh = h5_filehandlefor2c(f); + H5_API_ENTER (h5_err_t, + "f=%p, name='%s', x_buf=%p, y_buf=%p, z_buf=%p, l_name=%d", + fh, name, x_buf, y_buf, z_buf, l_name); + char *name2 = h5_strdupfor2c ( name, l_name ); + h5_err_t herr = h5b_read_vector3d_data ( + fh, name2, + (void*)x_buf, (void*)y_buf, (void*)z_buf, H5T_NATIVE_INT32 ); + free ( name2 ); + H5_API_RETURN(herr); +} + +#if !defined(F77_NO_UNDERSCORE) +#define h5bl_writefieldattrib_r8 F77NAME ( \ + h5bl_writefieldattrib_r8_, \ + H5BL_WRITEFIELDATTRIB_R8 ) +#endif + +h5_err_t +h5bl_writefieldattrib_r8 ( + h5_int64_t *const f, + const char *field_name, + const char *attrib_name, + const h5_float64_t *buffer, + const h5_size_t *nelems, + const int l_field_name, + const int l_attrib_name + ) { + h5_file_t *fh = h5_filehandlefor2c(f); + H5_API_ENTER (h5_err_t, + "f=%p, field_name='%s', attrib_name='%s', " + "buffer=%p, nelems=%lld, l_field_name=%d, l_attrib_name=%d", + fh, field_name, attrib_name, buffer, (long long)*nelems, + l_field_name, l_attrib_name); + char *field_name2 = h5_strdupfor2c ( field_name, l_field_name ); + char *attrib_name2 = h5_strdupfor2c ( attrib_name, l_attrib_name ); + h5_err_t herr = h5_write_field_attrib ( + fh, field_name2, attrib_name2, + H5T_NATIVE_DOUBLE, buffer, *nelems ); + free ( field_name2 ); + free ( attrib_name2 ); + H5_API_RETURN(herr); +} + +#if !defined(F77_NO_UNDERSCORE) +#define h5bl_readfieldattrib_r8 F77NAME ( \ + h5bl_readfieldattrib_r8_, \ + H5BL_READFIELDATTRIB_R8 ) +#endif + +h5_err_t +h5bl_readfieldattrib_r8 ( + h5_int64_t *const f, + const char *field_name, + const char *attrib_name, + h5_float64_t *buffer, + const int l_field_name, + const int l_attrib_name + ) { + + h5_file_t *fh = h5_filehandlefor2c(f); + H5_API_ENTER (h5_err_t, + "f=%p, field_name='%s', attrib_name='%s', " + "values=%p, l_field_name=%d, l_attrib_name=%d", + fh, field_name, attrib_name, buffer, + l_field_name, l_attrib_name); + char *field_name2 = h5_strdupfor2c ( field_name, l_field_name ); + char *attrib_name2 = h5_strdupfor2c ( attrib_name, l_attrib_name ); + h5_err_t herr = h5_read_field_attrib ( + fh, field_name2, attrib_name2, H5T_NATIVE_DOUBLE, buffer ); + free ( field_name2 ); + free ( attrib_name2 ); + H5_API_RETURN(herr); +} + +#if !defined(F77_NO_UNDERSCORE) +#define h5bl_writefieldattrib_r4 F77NAME ( \ + h5bl_writefieldattrib_r4_, \ + H5BL_WRITEFIELDATTRIB_R4 ) +#endif + +h5_err_t +h5bl_writefieldattrib_r4 ( + h5_int64_t *const f, + const char *field_name, + const char *attrib_name, + const h5_float32_t *buffer, + const h5_size_t *nelems, + const int l_field_name, + const int l_attrib_name + ) { + + h5_file_t *fh = h5_filehandlefor2c(f); + H5_API_ENTER (h5_err_t, + "f=%p, field_name='%s', attrib_name='%s', " + "buffer=%p, nelems=%lld, l_field_name=%d, l_attrib_name=%d", + fh, field_name, attrib_name, buffer, (long long)*nelems, + l_field_name, l_attrib_name); + char *field_name2 = h5_strdupfor2c ( field_name, l_field_name ); + char *attrib_name2 = h5_strdupfor2c ( attrib_name, l_attrib_name ); + h5_err_t herr = h5_write_field_attrib ( + fh, field_name2, attrib_name2, + H5T_NATIVE_FLOAT, buffer, *nelems ); + free ( field_name2 ); + free ( attrib_name2 ); + H5_API_RETURN(herr); +} + +#if !defined(F77_NO_UNDERSCORE) +#define h5bl_readfieldattrib_r4 F77NAME ( \ + h5bl_readfieldattrib_r4_, \ + H5BL_READFIELDATTRIB_R4 ) +#endif + +h5_err_t +h5bl_readfieldattrib_r4 ( + h5_int64_t *const f, + const char *field_name, + const char *attrib_name, + h5_float32_t *buffer, + const int l_field_name, + const int l_attrib_name + ) { + + h5_file_t *fh = h5_filehandlefor2c(f); + H5_API_ENTER (h5_err_t, + "f=%p, field_name='%s', attrib_name='%s', " + "values=%p, l_field_name=%d, l_attrib_name=%d", + fh, field_name, attrib_name, buffer, + l_field_name, l_attrib_name); + char *field_name2 = h5_strdupfor2c ( field_name, l_field_name ); + char *attrib_name2 = h5_strdupfor2c ( attrib_name, l_attrib_name ); + h5_err_t herr = h5_read_field_attrib ( + fh, field_name2, attrib_name2, H5T_NATIVE_FLOAT, buffer ); + free ( field_name2 ); + free ( attrib_name2 ); + H5_API_RETURN(herr); +} + +#if !defined(F77_NO_UNDERSCORE) +#define h5bl_writefieldattrib_i8 F77NAME ( \ + h5bl_writefieldattrib_i8_, \ + H5BL_WRITEFIELDATTRIB_I8 ) +#endif + +h5_err_t +h5bl_writefieldattrib_i8 ( + h5_int64_t *const f, + const char *field_name, + const char *attrib_name, + const h5_int64_t *buffer, + const h5_size_t *nelems, + const int l_field_name, + const int l_attrib_name + ) { + + h5_file_t *fh = h5_filehandlefor2c(f); + H5_API_ENTER (h5_err_t, + "f=%p, field_name='%s', attrib_name='%s', " + "buffer=%p, nelems=%lld, l_field_name=%d, l_attrib_name=%d", + fh, field_name, attrib_name, buffer, (long long)*nelems, + l_field_name, l_attrib_name); + char *field_name2 = h5_strdupfor2c ( field_name, l_field_name ); + char *attrib_name2 = h5_strdupfor2c ( attrib_name, l_attrib_name ); + h5_err_t herr = h5_write_field_attrib ( + fh, field_name2, attrib_name2, + H5T_NATIVE_INT64, buffer, *nelems ); + free ( field_name2 ); + free ( attrib_name2 ); + H5_API_RETURN(herr); +} + +#if !defined(F77_NO_UNDERSCORE) +#define h5bl_readfieldattrib_i8 F77NAME ( \ + h5bl_readfieldattrib_i8_, \ + H5BL_READFIELDATTRIB_I8 ) +#endif + +h5_err_t +h5bl_readfieldattrib_i8 ( + h5_int64_t *const f, + const char *field_name, + const char *attrib_name, + h5_int64_t *buffer, + const int l_field_name, + const int l_attrib_name + ) { + h5_file_t *fh = h5_filehandlefor2c(f); + H5_API_ENTER (h5_err_t, + "f=%p, field_name='%s', attrib_name='%s', " + "values=%p, l_field_name=%d, l_attrib_name=%d", + fh, field_name, attrib_name, buffer, + l_field_name, l_attrib_name); + char *field_name2 = h5_strdupfor2c ( field_name, l_field_name ); + char *attrib_name2 = h5_strdupfor2c ( attrib_name, l_attrib_name ); + h5_err_t herr = h5_read_field_attrib ( + fh, field_name2, attrib_name2, H5T_NATIVE_INT64, buffer ); + free ( field_name2 ); + free ( attrib_name2 ); + H5_API_RETURN(herr); +} + +#if !defined(F77_NO_UNDERSCORE) +#define h5bl_writefieldattrib_i4 F77NAME ( \ + h5bl_writefieldattrib_i4_, \ + H5BL_WRITEFIELDATTRIB_I4 ) +#endif + +h5_err_t +h5bl_writefieldattrib_i4 ( + h5_int64_t *const f, + const char *field_name, + const char *attrib_name, + const h5_int32_t *buffer, + const h5_size_t *nelems, + const int l_field_name, + const int l_attrib_name + ) { + h5_file_t *fh = h5_filehandlefor2c(f); + H5_API_ENTER (h5_err_t, + "f=%p, field_name='%s', attrib_name='%s', " + "buffer=%p, nelems=%lld, l_field_name=%d, l_attrib_name=%d", + fh, field_name, attrib_name, buffer, (long long)*nelems, + l_field_name, l_attrib_name); + char *field_name2 = h5_strdupfor2c ( field_name, l_field_name ); + char *attrib_name2 = h5_strdupfor2c ( attrib_name, l_attrib_name ); + h5_err_t herr = h5_write_field_attrib ( + fh, field_name2, attrib_name2, + H5T_NATIVE_INT32, buffer, *nelems ); + free ( field_name2 ); + free ( attrib_name2 ); + H5_API_RETURN(herr); +} + +#if !defined(F77_NO_UNDERSCORE) +#define h5bl_readfieldattrib_i4 F77NAME ( \ + h5bl_readfieldattrib_i4_, \ + H5BL_READFIELDATTRIB_I4 ) +#endif + +h5_err_t +h5bl_readfieldattrib_i4 ( + h5_int64_t *const f, + const char *field_name, + const char *attrib_name, + h5_int32_t *buffer, + const int l_field_name, + const int l_attrib_name + ) { + h5_file_t *fh = h5_filehandlefor2c(f); + H5_API_ENTER (h5_err_t, + "f=%p, field_name='%s', attrib_name='%s', " + "values=%p, l_field_name=%d, l_attrib_name=%d", + fh, field_name, attrib_name, buffer, + l_field_name, l_attrib_name); + char *field_name2 = h5_strdupfor2c ( field_name, l_field_name ); + char *attrib_name2 = h5_strdupfor2c ( attrib_name, l_attrib_name ); + h5_err_t herr = h5_read_field_attrib ( + fh, field_name2, attrib_name2, H5T_NATIVE_INT32, buffer ); + free ( field_name2 ); + free ( attrib_name2 ); + H5_API_RETURN(herr); +} diff --git a/src/Fortran/H5F.f90 b/src/Fortran/H5F.f90 new file mode 100644 index 0000000..7c234f2 --- /dev/null +++ b/src/Fortran/H5F.f90 @@ -0,0 +1,215 @@ +! Declaration of subroutines for Fortran Bindings + +!!!!!!!! File Opening and Closing !!!!!!!! + + +!> +!! \ingroup h5hut_file_f +!! Opens a file for reading. See \ref H5OpenFile +!! \return 0 on success or error code +!< +INTEGER*8 FUNCTION h5_openr ( filename ) + CHARACTER(LEN=*), INTENT(IN) :: filename !< the filename to open for reading +END FUNCTION + +!> +!! \ingroup h5hut_file_f +!! Opens a file for writing in truncate mode. See \ref H5OpenFile +!! \return 0 on success or error code +!< +INTEGER*8 FUNCTION h5_openw ( filename ) + CHARACTER(LEN=*), INTENT(IN) :: filename !< the filename to open for writing +END FUNCTION + +!> +!! \ingroup h5hut_file_f +!! Opens a file for writing in append mode. See \ref H5OpenFile +!! \return 0 on success or error code +!< +INTEGER*8 FUNCTION h5_opena ( filename ) + CHARACTER(LEN=*), INTENT(IN) :: filename !< the filename to open for appending +END FUNCTION + +!> +!! \ingroup h5hut_file_f +!! Opens a parallel file for reading. See \ref H5OpenFile +!! \return 0 on success or error code +!< +INTEGER*8 FUNCTION h5_openr_par ( filename, mpi_communicator ) + CHARACTER(LEN=*), INTENT(IN) :: filename !< the filename to open for reading + INTEGER, INTENT(IN) :: mpi_communicator !< the MPI communicator used by the program +END FUNCTION + +!> +!! \ingroup h5hut_file_f +!! Opens a parallel file for writing in truncate mode. See \ref H5OpenFile +!! \return 0 on success or error code +!< +INTEGER*8 FUNCTION h5_openw_par ( filename, mpi_communicator ) + CHARACTER(LEN=*), INTENT(IN) :: filename !< the filename to open for writing + INTEGER, INTENT(IN) :: mpi_communicator !< the MPI_Communicator used by the program +END FUNCTION + +!> +!! \ingroup h5hut_file_f +!! Opens a parallel file for writing in append mode. See \ref H5OpenFile +!! \return 0 on success or error code +!< +INTEGER*8 FUNCTION h5_opena_par ( filename, mpi_communicator ) + CHARACTER(LEN=*), INTENT(IN) :: filename !< the filename to open for appending + INTEGER, INTENT(IN) :: mpi_communicator !< the MPI_Communicator used by the program +END FUNCTION + +!> +!! \ingroup h5hut_file_f +!! Opens a file for reading and specifies an HDF5 alignment. +!! See \ref H5OpenFileAlign +!! \return 0 on success or error code +!< +INTEGER*8 FUNCTION h5_openr_align ( filename, align ) + CHARACTER(LEN=*), INTENT(IN) :: filename !< the filename to open for reading + INTEGER*8, INTENT(IN) :: align !< alignment value in bytes +END FUNCTION + +!> +!! \ingroup h5hut_file_f +!! Opens a file for writing in truncate mode and specifies an HDF5 alignment. +!! See \ref H5OpenFileAlign +!! \return 0 on success or error code +!< +INTEGER*8 FUNCTION h5_openw_align ( filename, align ) + CHARACTER(LEN=*), INTENT(IN) :: filename !< the filename to open for writing + INTEGER*8, INTENT(IN) :: align !< alignment value in bytes +END FUNCTION + +!> +!! \ingroup h5hut_file_f +!! Opens a file for writing in append mode and specifies an HDF5 alignment. +!! See \ref H5OpenFileAlign +!! \return 0 on success or error code +!< +INTEGER*8 FUNCTION h5_opena_align ( filename, align ) + CHARACTER(LEN=*), INTENT(IN) :: filename !< the filename to open for appending + INTEGER*8, INTENT(IN) :: align !< alignment value in bytes +END FUNCTION + +!> +!! \ingroup h5hut_file_f +!! Opens a parallel file for reading and specifies an HDF5 alignment. +!! See \ref H5OpenFileAlign +!! +!! Flags are specified as a comma separated string that can include: +!! +!! - \c fs_lustre - enable optimizations for the Lustre file system +!! - \c vfd_mpiposix - use the HDF5 MPI-POSIX virtual file driver +!! - \c vfd_mpio_ind - use MPI-IO in indepedent mode +!! +!! See \ref H5OpenFileAlign +!! \return 0 on success or error code +!< +INTEGER*8 FUNCTION h5_openr_par_align ( filename, mpi_communicator, align, flags ) + CHARACTER(LEN=*), INTENT(IN) :: filename !< the filename to open for reading + INTEGER, INTENT(IN) :: mpi_communicator !< the MPI_Communicator used by the program + INTEGER*8, INTENT(IN) :: align !< alignment value in bytes + CHARACTER(LEN=*), INTENT(IN) :: flags !< additional flags +END FUNCTION + +!> +!! \ingroup h5hut_file_f +!! Opens a parallel file for writing in truncate mode and specifies +!! an HDF5 alignment. +!! +!! Flags are specified as a comma separated string that can include: +!! +!! - \c fs_lustre - enable optimizations for the Lustre file system +!! - \c vfd_mpiposix - use the HDF5 MPI-POSIX virtual file driver +!! - \c vfd_mpio_ind - use MPI-IO in indepedent mode +!! +!! See \ref H5OpenFileAlign +!! \return 0 on success or error code +!< +INTEGER*8 FUNCTION h5_openw_par_align ( filename, mpi_communicator, align, flags ) + CHARACTER(LEN=*), INTENT(IN) :: filename !< the filename to open for writing + INTEGER, INTENT(IN) :: mpi_communicator !< the MPI_Communicator used by the program + INTEGER*8, INTENT(IN) :: align !< alignment value in bytes + CHARACTER(LEN=*), INTENT(IN) :: flags !< additional flags +END FUNCTION + +!> +!! \ingroup h5hut_file_f +!! Opens a parallel file for writing in append mode and specifies +!! an HDF5 alignment. +!! +!! Flags are specified as a comma separated string that can include: +!! +!! - \c fs_lustre - enable optimizations for the Lustre file system +!! - \c vfd_mpiposix - use the HDF5 MPI-POSIX virtual file driver +!! - \c vfd_mpio_ind - use MPI-IO in indepedent mode +!! +!! See \ref H5OpenFileAlign +!! \return 0 on success or error code +!< +INTEGER*8 FUNCTION h5_opena_par_align ( filename, mpi_communicator, align, flags ) + CHARACTER(LEN=*), INTENT(IN) :: filename !< the filename to open for appending + INTEGER, INTENT(IN) :: mpi_communicator !< the MPI_Communicator used by the program + INTEGER*8, INTENT(IN) :: align !< alignment value in bytes + CHARACTER(LEN=*), INTENT(IN) :: flags !< additional flags +END FUNCTION + +!> +!! \ingroup h5hut_file_f +!! Closes a file. See \ref H5CloseFile +!! \return 0 on success or error code +INTEGER*8 FUNCTION h5_close ( filehandle ) + INTEGER*8, INTENT(IN) :: filehandle !< the handle returned during file open +END FUNCTION + +!> +!! \ingroup h5hut_file_f +!! Close HDF5 library. See \ref H5Finalize +!! \return \c H5_SUCCESS or \c H5_FAILURE +INTEGER*8 FUNCTION h5_finalize () +END FUNCTION + +!> +!! \ingroup h5hut_file_f +!! Checks that a file is valid. See \ref H5CheckFile +!! \return 0 on success or error code +INTEGER*8 FUNCTION h5_check ( filehandle ) + INTEGER*8, INTENT(IN) :: filehandle !< the handle returned during file open +END FUNCTION + + +!> +!! \ingroup h5hut_model_f +!! See \ref H5SetStep +!! \return 0 on success or error code +INTEGER*8 FUNCTION h5_setstep (filehandle,step) + INTEGER*8, INTENT(IN) :: filehandle !< the handle returned during file open + INTEGER*8, INTENT(IN) :: step !< a timestep value >= 1 +END FUNCTION + +!> +!! \ingroup h5hut_model_f +!! See \ref H5GetStep +!! \return the the current step or \c H5_FAILURE +INTEGER*8 FUNCTION h5_getstep (filehandle) + INTEGER*8, INTENT(IN) :: filehandle !< the handle returned during file open +END FUNCTION + +!> +!! \ingroup h5hut_model_f +!! See \ref H5GetNumSteps +!! \return the number of steps or error code +INTEGER*8 FUNCTION h5_getnsteps (filehandle) + INTEGER*8, INTENT(IN) :: filehandle !< the handle returned during file open +END FUNCTION + +!> +!! \ingroup h5hut_error_f +!! See \ref H5SetVerbosityLevel +!! \return 0 on success or error code +INTEGER*8 FUNCTION h5_set_verbosity_level ( level ) + INTEGER*8, INTENT(IN) :: level !< the level from 0 (no output) to 5 (most detailed) +END FUNCTION + diff --git a/src/Fortran/H5Part.c b/src/Fortran/H5Part.c new file mode 100755 index 0000000..4beabba --- /dev/null +++ b/src/Fortran/H5Part.c @@ -0,0 +1,219 @@ +/* + Copyright (c) 2006-2012, The Regents of the University of California, + through Lawrence Berkeley National Laboratory (subject to receipt of any + required approvals from the U.S. Dept. of Energy) and the Paul Scherrer + Institut (Switzerland). All rights reserved. + + License: see file COPYING in top level of source distribution. +*/ + +#include "h5_private.h" +#include "h5core/h5u_model.h" + +/*==============Reading Data Characteristics============*/ + +#define h5pt_getndatasets F77_NAME ( \ + h5pt_getndatasets, \ + h5pt_getndatasets_, \ + H5PT_GETNDATASETS ) +h5_int64_t +h5pt_getndatasets ( + const h5_int64_t* const fh + ) { + h5_file_t f = h5_filehandlefor2c (fh); + H5_API_ENTER (h5_int64_t, "fh=%p", (h5_file_p)f); + H5_API_RETURN(h5u_get_num_datasets (f)); +} + +#define h5pt_getnpoints F77_NAME ( \ + h5pt_getnpoints, \ + h5pt_getnpoints_, \ + H5PT_GETNPOINTS ) +h5_int64_t +h5pt_getnpoints ( + const h5_int64_t* const fh + ) { + h5_file_t f = h5_filehandlefor2c (fh); + H5_API_ENTER (h5_int64_t, "fh=%p", (h5_file_p)f); + H5_API_RETURN (h5u_get_num_particles (f)); +} + +#define h5pt_getdatasetname F77_NAME ( \ + h5pt_getdatasetname, \ + h5pt_getdatasetname_, \ + H5PT_GETDATASETNAME ) +h5_int64_t +h5pt_getdatasetname ( + const h5_int64_t* const fh, + const h5_int64_t* index, + char* name, + const int l_name + ) { + h5_file_t f = h5_filehandlefor2c (fh); + H5_API_ENTER (h5_int64_t, + "fh=%p, index=%lld, name='%s', l_name=%d", + (h5_file_p)f, (long long)*index, name, l_name); + h5_int64_t herr = h5u_get_dataset_info ( + f, *index - 1, name, l_name, NULL, NULL ); + h5_strc2for (name, l_name); + H5_API_RETURN (herr); +} + +#define h5pt_getdatasetinfo F77_NAME( \ + h5pt_getdatasetinfo, \ + h5pt_getdatasetinfo_, \ + H5PT_GETDATASETINFO) +h5_int64_t +h5pt_getdatasetinfo ( + const h5_int64_t* const fh, + const h5_int64_t* dataset_idx, + char* dataset_name, + h5_int64_t* dataset_type, + h5_int64_t* dataset_nelem, + const int l_dataset_name + ) { + h5_file_t f = h5_filehandlefor2c (fh); + H5_API_ENTER (h5_int64_t, + "fh=%p, " + "dataset_idx=%lld, " + "dataset_name=%p, " + "dataset_type=%p, " + "dataset_nelem=%p", + (h5_file_p)f, + (long long)*dataset_idx, + dataset_name, dataset_type, dataset_nelem); + h5_int64_t h5err = h5u_get_dataset_info ( + f, + *dataset_idx - 1, + dataset_name, l_dataset_name, + dataset_type, + (h5_size_t*)dataset_nelem); + h5_strc2for (dataset_name, l_dataset_name); + convert_type2for (dataset_type); + H5_API_RETURN (h5err); +} + +/*=============Setting and getting views================*/ + +#define h5pt_setview F77_NAME ( \ + h5pt_setview, \ + h5pt_setview_, \ + H5PT_SETVIEW ) +h5_int64_t +h5pt_setview ( + const h5_int64_t* const fh, + const h5_int64_t* const start, + const h5_int64_t* const end + ) { + h5_file_t f = h5_filehandlefor2c (fh); + H5_API_ENTER (h5_int64_t, + "fh=%p, start=%lld, end=%lld", + (h5_file_p)f, (long long)*start, (long long)*end); + H5_API_RETURN (h5u_set_view (f, (*start)-1, (*end)-1)); +} + +#define h5pt_setview_indices F77_NAME ( \ + h5pt_setview_indices, \ + h5pt_setview_indices_, \ + H5PT_SETVIEW_INDICES ) +h5_int64_t +h5pt_setview_indices ( + const h5_int64_t* const fh, + const h5_int64_t* const indices, + const h5_int64_t* const nelem + ) { + h5_file_t f = h5_filehandlefor2c (fh); + H5_API_ENTER (h5_int64_t, + "fh=%p, indices=%p, nelem=%lld", + (h5_file_p)f, indices, (long long)*nelem); + h5_size_t* findices; + TRY (findices = h5_calloc (*nelem, sizeof (*indices))); + for (size_t i = 0; i < *nelem; i++) + findices[i] = indices[i] - 1; + TRY (h5u_set_view_indices (f, findices, *nelem)); + TRY (h5_free (findices)); + H5_API_RETURN (H5_SUCCESS); +} + +#define h5pt_setnpoints F77_NAME ( \ + h5pt_setnpoints, \ + h5pt_setnpoints_, \ + H5PT_SETNPOINTS ) +h5_int64_t +h5pt_setnpoints ( + const h5_int64_t* const fh, + const h5_int64_t* const npoints + ) { + h5_file_t f = h5_filehandlefor2c (fh); + H5_API_ENTER (h5_int64_t, + "fh=%p, npoints=%lld", + (h5_file_p)f, (long long)*npoints); + H5_API_RETURN (h5u_set_num_particles (f, *npoints, 1)); +} + +#define h5pt_setnpoints_strided F77_NAME ( \ + h5pt_setnpoints_strided, \ + h5pt_setnpoints_strided_, \ + H5PT_SETNPOINTS_STRIDED ) +h5_int64_t +h5pt_setnpoints_strided ( + const h5_int64_t* const fh, + const h5_int64_t* const npoints, + const h5_int64_t* const stride + ) { + h5_file_t f = h5_filehandlefor2c (fh); + H5_API_ENTER (h5_int64_t, + "fh=%p, npoints=%lld, stride=%lld", + (h5_file_p)f, (long long)*npoints, (long long)*stride); + H5_API_RETURN (h5u_set_num_particles (f, *npoints, *stride)); +} + +#define h5pt_resetview F77_NAME ( \ + h5pt_resetview, \ + h5pt_resetview_, \ + H5PT_RESETVIEW ) +h5_int64_t +h5pt_resetview ( + const h5_int64_t* const fh + ) { + h5_file_t f = h5_filehandlefor2c (fh); + H5_API_ENTER (h5_int64_t, + "fh=%p", + (h5_file_p)f); + H5_API_RETURN (h5u_reset_view (f)); +} + +#define h5pt_hasview F77_NAME ( \ + h5pt_hasview, \ + h5pt_hasview_, \ + H5PT_HASVIEW ) +h5_int64_t +h5pt_hasview ( + const h5_int64_t* const fh + ) { + h5_file_t f = h5_filehandlefor2c (fh); + H5_API_ENTER (h5_int64_t, + "fh=%p", + (h5_file_p)f); + H5_API_RETURN (h5u_has_view (f)); +} + +#define h5pt_getview F77_NAME ( \ + h5pt_getview, \ + h5pt_getview_, \ + H5PT_GETVIEW ) +h5_int64_t +h5pt_getview ( + const h5_int64_t* const fh, + h5_int64_t* const start, + h5_int64_t* const end + ) { + h5_file_t f = h5_filehandlefor2c (fh); + H5_API_ENTER (h5_int64_t, + "fh=%p, start=%p, end=%p", + (h5_file_p)f, start, end); + TRY (h5u_get_view (f, start, end)); + *start += 1; + *end += 1; + H5_API_RETURN (H5_SUCCESS); +} diff --git a/src/Fortran/H5PartF.f90 b/src/Fortran/H5PartF.f90 new file mode 100644 index 0000000..d75ece9 --- /dev/null +++ b/src/Fortran/H5PartF.f90 @@ -0,0 +1,127 @@ +!!!!!!!! Setting up the Data Model !!!!!!!! + + +!> +!! \ingroup h5part_model_f +!! +!! See \ref H5PartSetNumParticles +!! \return 0 on success or error code +!< +INTEGER*8 FUNCTION h5pt_setnpoints ( filehandle, npoints ) + INTEGER*8, INTENT(IN) :: filehandle !< the handle returned during file open + INTEGER*8, INTENT(IN) :: npoints !< the number of particles on *this* processor +END FUNCTION + +!> +!! \ingroup h5part_model_f +!! +!! See \ref H5PartSetNumParticlesStrided +!! \return 0 on success or error code +!< +INTEGER*8 FUNCTION h5pt_setnpoints_strided ( filehandle, npoints, stride ) + INTEGER*8, INTENT(IN) :: filehandle !< the handle returned during file open + INTEGER*8, INTENT(IN) :: npoints !< the number of particles on *this* processor + INTEGER*8, INTENT(IN) :: stride !< the stride value (e.g. the number of fields in the particle data array) +END FUNCTION + +!> +!! \ingroup h5part_model_f +!! +!! See \ref H5PartGetNumDatasets +!! \return the number of datasets or error code +!< +INTEGER*8 FUNCTION h5pt_getndatasets (filehandle) + INTEGER*8, INTENT(IN) :: filehandle !< the handle returned during file open +END FUNCTION + +!> +!! \ingroup h5part_model_f +!! +!! See \ref H5PartGetNumParticles +!! \return the number of particles or error code +!< +INTEGER*8 FUNCTION h5pt_getnpoints (filehandle) + INTEGER*8, INTENT(IN) :: filehandle !< the handle returned during file open +END FUNCTION + +!> +!! \ingroup h5part_model_f +!! +!! See \ref H5PartGetDatasetName +!! \return 0 on success or error code +!< +INTEGER*8 FUNCTION h5pt_getdatasetname (filehandle,index,name) + INTEGER*8, INTENT(IN) :: filehandle !< the handle returned during file open + INTEGER*8, INTENT(IN) :: index !< index of dataset to query (starting from 0) + CHARACTER(LEN=*), INTENT(OUT) :: name !< buffer to read the dataset name into +END FUNCTION + +!> +!! \ingroup h5part_model_f +!! +!! See \ref H5PartGetDatasetInfo +!! \return 0 on success or error code +!< +INTEGER*8 FUNCTION h5pt_getdatasetinfo (filehandle, idx, name, type, num_elems) + INTEGER*8,INTENT(IN) :: filehandle !< file handle + INTEGER*8,INTENT(IN) :: idx !< index of dataset being queried + CHARACTER(LEN=*), INTENT(OUT):: name !< name of datset + INTEGER*8,INTENT(OUT):: type !< type of datset + INTEGER*8,INTENT(OUT):: num_elems !< number of elements in the dataset +END FUNCTION + +!> +!! \ingroup h5part_model_f +!! +!! See \ref H5PartSetView +!! \return 0 on success or error code +!< +INTEGER*8 FUNCTION h5pt_setview (filehandle,start,end) + INTEGER*8, INTENT(IN) :: filehandle !< the handle returned during file open + INTEGER*8, INTENT(IN) :: start !< offset of the first particle in the view + INTEGER*8, INTENT(IN) :: end !< offset of the last particle in the view (inclusive) +END FUNCTION + +!> +!! \ingroup h5part_model_f +!! +!! See \ref H5PartSetViewIndices +!! \return 0 on success or error code +!< +INTEGER*8 FUNCTION h5pt_setview_indices (filehandle,indices,nelem) + INTEGER*8, INTENT(IN) :: filehandle !< the handle returned during file open + INTEGER*8, INTENT(IN) :: indices(*) !< list of indicies to select in this view + INTEGER*8, INTENT(IN) :: nelem !< number of particles in the list +END FUNCTION + +!> +!! \ingroup h5part_model_f +!! +!! See \ref H5PartResetView +!! \return 0 on success or error code +!< +INTEGER*8 FUNCTION h5pt_resetview (filehandle) + INTEGER*8, INTENT(IN) :: filehandle !< the handle returned during file open +END FUNCTION + +!> +!! \ingroup h5part_model_f +!! +!! See \ref H5PartResetView +!! \return 1 if true, 0 if false, or error code +!< +INTEGER*8 FUNCTION h5pt_hasview (filehandle) + INTEGER*8, INTENT(IN) :: filehandle !< the handle returned during file open +END FUNCTION + +!> +!! \ingroup h5part_model_f +!! +!! See \ref H5PartGetView +!! \return 0 on success or error code +!< +INTEGER*8 FUNCTION h5pt_getview (filehandle,start,end) + INTEGER*8, INTENT(IN) :: filehandle !< the handle returned during file open + INTEGER*8, INTENT(OUT) :: start !< buffer to store the offset of the first particle in the view + INTEGER*8, INTENT(OUT) :: end !< buffer to store the offset of the last particle in the view (inclusive) +END FUNCTION diff --git a/src/Fortran/H5Part_F.c b/src/Fortran/H5Part_F.c new file mode 100755 index 0000000..83c623a --- /dev/null +++ b/src/Fortran/H5Part_F.c @@ -0,0 +1,345 @@ +#include + +#include "h5core/h5_core.h" +#include "Underscore.h" + +#if defined(F77_SINGLE_UNDERSCORE) +#define F77NAME(a,b) a +#elif defined(F77_CRAY_UNDERSCORE) +#define F77NAME(a,b) b +#elif defined(F77_NO_UNDERSCORE) +#else +#error Error, no way to determine how to construct fortran bindings +#endif + +#if !defined(F77_NO_UNDERSCORE) + +#define h5pt_setnpoints F77NAME ( \ + h5pt_setnpoints_, \ + H5PT_SETNPOINTS ) +#define h5pt_setnpoints_strided F77NAME ( \ + h5pt_setnpoints_strided_, \ + H5PT_SETNPOINTS_STRIDED ) +#define h5pt_getnsteps F77NAME ( \ + h5pt_getnsteps_, \ + H5PT_GETNSTEPS ) +#define h5pt_getndatasets F77NAME ( \ + h5pt_getndatasets_, \ + H5PT_GETNDATASETS ) +#define h5pt_getnpoints F77NAME ( \ + h5pt_getnpoints_, \ + H5PT_GETNPOINTS ) +#define h5pt_getdatasetname F77NAME ( \ + h5pt_getdatasetname_, \ + H5PT_GETDATASETNAME ) +#define h5pt_setview F77NAME ( \ + h5pt_setview_, \ + H5PT_SETVIEW ) +#define h5pt_setview_indices F77NAME ( \ + h5pt_setview_indices_, \ + H5PT_SETVIEW_INDICES ) +#define h5pt_resetview F77NAME ( \ + h5pt_resetview_, \ + H5PT_RESETVIEW ) +#define h5pt_hasview F77NAME ( \ + h5pt_hasview_, \ + H5PT_HASVIEW ) +#define h5pt_getview F77NAME ( \ + h5pt_getview_, \ + H5PT_GETVIEW ) +#define h5pt_writedata_r8 F77NAME ( \ + h5pt_writedata_r8_, \ + H5PT_WRITEDATA_R8 ) +#define h5pt_writedata_r4 F77NAME ( \ + h5pt_writedata_r4_, \ + H5PT_WRITEDATA_R4 ) +#define h5pt_writedata_i8 F77NAME ( \ + h5pt_writedata_i8_, \ + H5PT_WRITEDATA_I8 ) +#define h5pt_writedata_i4 F77NAME ( \ + h5pt_writedata_i4_, \ + H5PT_WRITEDATA_I4 ) +#define h5pt_readdata_r8 F77NAME ( \ + h5pt_readdata_r8_, \ + H5PT_READDATA_R8 ) +#define h5pt_readdata_r4 F77NAME ( \ + h5pt_readdata_r4_, \ + H5PT_READDATA_R4 ) +#define h5pt_readdata_i8 F77NAME ( \ + h5pt_readdata_i8_, \ + H5PT_READDATA_I8 ) +#define h5pt_readdata_i4 F77NAME ( \ + h5pt_readdata_i4_, \ + H5PT_READDATA_I4 ) + +#endif + +h5_err_t +h5pt_setnpoints ( + const h5_int64_t *f, + h5_int64_t *n + ) { + + h5_file_t *fh = h5_filehandlefor2c(f); + H5_API_ENTER (h5_err_t, "f=%p, n=%lld", fh, (long long)*n); + H5_API_RETURN(h5u_set_num_particles ( fh, *n, 1 )); +} + +h5_err_t +h5pt_setnpoints_strided ( + const h5_int64_t *f, + h5_int64_t *n, + h5_int64_t *stride + ) { + + h5_file_t *fh = h5_filehandlefor2c(f); + H5_API_ENTER (h5_err_t, "f=%p, n=%lld, stride=%lld", + fh, (long long)*n, (long long)*stride); + H5_API_RETURN(h5u_set_num_particles ( fh, *n, *stride )); +} + +/*==============Reading Data Characteristics============*/ + +h5_int64_t +h5pt_getndatasets ( + const h5_int64_t *f + ) { + + h5_file_t *fh = h5_filehandlefor2c(f); + H5_API_ENTER (h5_int64_t, "f=%p", fh); + H5_API_RETURN(h5u_get_num_datasets ( fh )); +} + +h5_int64_t +h5pt_getnpoints ( + const h5_int64_t *f + ) { + + h5_file_t *fh = h5_filehandlefor2c(f); + H5_API_ENTER (h5_int64_t, "f=%p", fh); + H5_API_RETURN(h5u_get_num_particles ( fh )); +} + +h5_err_t +h5pt_getdatasetname ( + const h5_int64_t *f, + const h5_int64_t *index, + char *name, + const int l_name + ) { + + h5_file_t *fh = h5_filehandlefor2c(f); + H5_API_ENTER (h5_err_t, "f=%p, index=%lld, name='%s', l_name=%d", + fh, (long long)*index, name, l_name); + h5_err_t herr = h5u_get_dataset_info ( + fh, *index, name, l_name, NULL, NULL ); + h5_strc2for ( name, l_name ); + H5_API_RETURN(herr); +} + +/*=============Setting and getting views================*/ + +h5_err_t +h5pt_setview ( + const h5_int64_t *f, + const h5_int64_t *start, + const h5_int64_t *end + ) { + + h5_file_t *fh = h5_filehandlefor2c(f); + H5_API_ENTER (h5_err_t, "f=%p, start=%lld, end=%lld", + fh, (long long)*start, (long long)*end); + H5_API_RETURN(h5u_set_view ( fh, (*start)-1, (*end)-1 )); +} + +h5_err_t +h5pt_setview_indices ( + const h5_int64_t *f, + const h5_int64_t * const indices, + const h5_int64_t *nelem + ) { + + h5_file_t *fh = h5_filehandlefor2c(f); + H5_API_ENTER (h5_err_t, "f=%p, indices=%p, nelem=%lld", + fh, indices, (long long)*nelem); + H5_API_RETURN(h5u_set_view_indices ( fh, (const h5_size_t*const)indices, *nelem )); +} + +h5_err_t +h5pt_resetview ( + const h5_int64_t *f + ) { + + h5_file_t *fh = h5_filehandlefor2c(f); + H5_API_ENTER (h5_err_t, "f=%p", fh); + H5_API_RETURN(h5u_reset_view ( fh )); +} + +h5_err_t +h5pt_hasview ( + const h5_int64_t *f + ) { + + h5_file_t *fh = h5_filehandlefor2c(f); + H5_API_ENTER (h5_err_t, "f=%p", fh); + H5_API_RETURN(h5u_has_view ( fh )); +} + +h5_err_t +h5pt_getview ( + const h5_int64_t *f, + h5_int64_t *start, + h5_int64_t *end + ) { + + h5_file_t *fh = h5_filehandlefor2c(f); + H5_API_ENTER (h5_err_t, "f=%p, start=%p, end=%p", + fh, start, end); + H5_API_RETURN(h5u_get_view ( fh, start, end)); +} + + +/*==================Writing data ============*/ +h5_err_t +h5pt_writedata_r8 ( + const h5_int64_t *f, + const char *name, + const h5_float64_t *data, + const int l_name ) { + + h5_file_t *fh = h5_filehandlefor2c(f); + H5_API_ENTER (h5_err_t, "f=%p, name='%s', data=%p, l_name=%d", + fh, name, data, l_name); + char *name2 = h5_strdupfor2c ( name, l_name ); + h5_err_t herr = h5u_write_data ( + fh, name2, (void*)data, H5T_NATIVE_DOUBLE ); + free ( name2 ); + H5_API_RETURN(herr); +} + +h5_err_t +h5pt_writedata_r4 ( + const h5_int64_t *f, + const char *name, + const h5_float32_t *data, + const int l_name ) { + + h5_file_t *fh = h5_filehandlefor2c(f); + H5_API_ENTER (h5_err_t, "f=%p, name='%s', data=%p, l_name=%d", + fh, name, data, l_name); + char *name2 = h5_strdupfor2c ( name, l_name ); + h5_err_t herr = h5u_write_data ( + fh, name2, (void*)data, H5T_NATIVE_FLOAT ); + free ( name2 ); + H5_API_RETURN(herr); +} + +h5_err_t +h5pt_writedata_i8 ( + const h5_int64_t *f, + const char *name, + const h5_int64_t *data, + const int l_name ) { + + h5_file_t *fh = h5_filehandlefor2c(f); + H5_API_ENTER (h5_err_t, "f=%p, name='%s', data=%p, l_name=%d", + fh, name, data, l_name); + char *name2 = h5_strdupfor2c ( name, l_name ); + h5_err_t herr = h5u_write_data ( + fh, name2, (void*)data, H5T_NATIVE_INT64 ); + free ( name2 ); + H5_API_RETURN(herr); +} + +h5_err_t +h5pt_writedata_i4 ( + const h5_int64_t *f, + const char *name, + const h5_int32_t *data, + const int l_name ) { + + h5_file_t *fh = h5_filehandlefor2c(f); + H5_API_ENTER (h5_err_t, "f=%p, name='%s', data=%p, l_name=%d", + fh, name, data, l_name); + char *name2 = h5_strdupfor2c ( name, l_name ); + h5_err_t herr = h5u_write_data ( + fh, name2, (void*)data, H5T_NATIVE_INT32 ); + free ( name2 ); + H5_API_RETURN(herr); +} + + +/*==================Reading data ============*/ +h5_err_t +h5pt_readdata_r8 ( + const h5_int64_t *f, + const char *name, + h5_float64_t *data, + const int l_name + ) { + + h5_file_t *fh = h5_filehandlefor2c(f); + H5_API_ENTER (h5_err_t, "f=%p, name='%s', data=%p, l_name=%d", + fh, name, data, l_name); + char *name2 = h5_strdupfor2c ( name, l_name ); + h5_err_t herr = h5u_read_data ( + fh, name2, data, H5T_NATIVE_DOUBLE ); + free ( name2 ); + H5_API_RETURN(herr); +} + +h5_err_t +h5pt_readdata_r4 ( + const h5_int64_t *f, + const char *name, + h5_float32_t *data, + const int l_name + ) { + + h5_file_t *fh = h5_filehandlefor2c(f); + H5_API_ENTER (h5_err_t, "f=%p, name='%s', data=%p, l_name=%d", + fh, name, data, l_name); + char *name2 = h5_strdupfor2c ( name, l_name ); + h5_err_t herr = h5u_read_data ( + fh, name2, data, H5T_NATIVE_FLOAT ); + free ( name2 ); + H5_API_RETURN(herr); +} + +h5_err_t +h5pt_readdata_i8 ( + const h5_int64_t *f, + const char *name, + h5_int64_t *data, + const int l_name + ) { + + h5_file_t *fh = h5_filehandlefor2c(f); + H5_API_ENTER (h5_err_t, "f=%p, name='%s', data=%p, l_name=%d", + fh, name, data, l_name); + char *name2 = h5_strdupfor2c ( name, l_name ); + h5_err_t herr = h5u_read_data ( + fh, name2, data, H5T_NATIVE_INT64 ); + + free ( name2 ); + H5_API_RETURN(herr); +} + +h5_err_t +h5pt_readdata_i4 ( + const h5_int64_t *f, + const char *name, + h5_int32_t *data, + const int l_name + ) { + + h5_file_t *fh = h5_filehandlefor2c(f); + H5_API_ENTER (h5_err_t, "f=%p, name='%s', data=%p, l_name=%d", + fh, name, data, l_name); + char *name2 = h5_strdupfor2c ( name, l_name ); + h5_err_t herr = h5u_read_data ( + fh, name2, data, H5T_NATIVE_INT32 ); + free ( name2 ); + H5_API_RETURN(herr); +} + diff --git a/src/Fortran/H5Part_io.c b/src/Fortran/H5Part_io.c new file mode 100644 index 0000000..b5d7c3b --- /dev/null +++ b/src/Fortran/H5Part_io.c @@ -0,0 +1,191 @@ +/* + Copyright (c) 2006-2012, The Regents of the University of California, + through Lawrence Berkeley National Laboratory (subject to receipt of any + required approvals from the U.S. Dept. of Energy) and the Paul Scherrer + Institut (Switzerland). All rights reserved. + + License: see file COPYING in top level of source distribution. +*/ + +#include "h5_private.h" +#include "h5core/h5u_io.h" + +/*==================Writing data ============*/ +#define h5pt_writedata_r8 F77_NAME ( \ + h5pt_writedata_r8, \ + h5pt_writedata_r8_, \ + H5PT_WRITEDATA_R8 ) +h5_int64_t +h5pt_writedata_r8 ( + const h5_int64_t* const fh, + const char* const name, + const h5_float64_t* const data, + const int l_name + ) { + h5_file_t f = h5_filehandlefor2c (fh); + H5_API_ENTER (h5_int64_t, + "fh=%p, name='%s', data=%p, l_name=%d", + (h5_file_p)f, name, data, l_name); + char *name2 = h5_strdupfor2c ( name, l_name ); + h5_int64_t herr = h5u_write_data ( + f, name2, (void*)data, H5T_NATIVE_DOUBLE ); + free ( name2 ); + H5_API_RETURN(herr); +} + +#define h5pt_writedata_r4 F77_NAME ( \ + h5pt_writedata_r4, \ + h5pt_writedata_r4_, \ + H5PT_WRITEDATA_R4 ) +h5_int64_t +h5pt_writedata_r4 ( + const h5_int64_t* const fh, + const char* const name, + const h5_float32_t* const data, + const int l_name + ) { + h5_file_t f = h5_filehandlefor2c (fh); + H5_API_ENTER (h5_int64_t, + "fh=%p, name='%s', data=%p, l_name=%d", + (h5_file_p)f, name, data, l_name); + char *name2 = h5_strdupfor2c ( name, l_name ); + h5_int64_t herr = h5u_write_data ( + f, name2, (void*)data, H5T_NATIVE_FLOAT ); + free ( name2 ); + H5_API_RETURN(herr); +} + +#define h5pt_writedata_i8 F77_NAME ( \ + h5pt_writedata_i8, \ + h5pt_writedata_i8_, \ + H5PT_WRITEDATA_I8 ) +h5_int64_t +h5pt_writedata_i8 ( + const h5_int64_t* const fh, + const char* const name, + const h5_int64_t* const data, + const int l_name + ) { + h5_file_t f = h5_filehandlefor2c (fh); + H5_API_ENTER (h5_int64_t, + "fh=%p, name='%s', data=%p, l_name=%d", + (h5_file_p)f, name, data, l_name); + char *name2 = h5_strdupfor2c ( name, l_name ); + h5_int64_t herr = h5u_write_data ( + f, name2, (void*)data, H5T_NATIVE_INT64 ); + free ( name2 ); + H5_API_RETURN(herr); +} + +#define h5pt_writedata_i4 F77_NAME ( \ + h5pt_writedata_i4, \ + h5pt_writedata_i4_, \ + H5PT_WRITEDATA_I4 ) +h5_int64_t +h5pt_writedata_i4 ( + const h5_int64_t* const fh, + const char* const name, + const h5_int32_t* const data, + const int l_name + ) { + h5_file_t f = h5_filehandlefor2c (fh); + H5_API_ENTER (h5_int64_t, + "fh=%p, name='%s', data=%p, l_name=%d", + (h5_file_p)f, name, data, l_name); + char *name2 = h5_strdupfor2c ( name, l_name ); + h5_int64_t herr = h5u_write_data ( + f, name2, (void*)data, H5T_NATIVE_INT32 ); + free ( name2 ); + H5_API_RETURN(herr); +} + + +/*==================Reading data ============*/ +#define h5pt_readdata_r8 F77_NAME ( \ + h5pt_readdata_r8, \ + h5pt_readdata_r8_, \ + H5PT_READDATA_R8 ) +h5_int64_t +h5pt_readdata_r8 ( + const h5_int64_t* const fh, + const char* const name, + h5_float64_t* const data, + const int l_name + ) { + h5_file_t f = h5_filehandlefor2c (fh); + H5_API_ENTER (h5_int64_t, + "fh=%p, name='%s', data=%p, l_name=%d", + (h5_file_p)f, name, data, l_name); + char *name2 = h5_strdupfor2c ( name, l_name ); + h5_int64_t herr = h5u_read_data ( + f, name2, data, H5T_NATIVE_DOUBLE ); + free ( name2 ); + H5_API_RETURN(herr); +} + +#define h5pt_readdata_r4 F77_NAME ( \ + h5pt_readdata_r4, \ + h5pt_readdata_r4_, \ + H5PT_READDATA_R4 ) +h5_int64_t +h5pt_readdata_r4 ( + const h5_int64_t* const fh, + const char* const name, + h5_float32_t* const data, + const int l_name + ) { + h5_file_t f = h5_filehandlefor2c (fh); + H5_API_ENTER (h5_int64_t, + "fh=%p, name='%s', data=%p, l_name=%d", + (h5_file_p)f, name, data, l_name); + char *name2 = h5_strdupfor2c ( name, l_name ); + h5_int64_t herr = h5u_read_data ( + f, name2, data, H5T_NATIVE_FLOAT ); + free ( name2 ); + H5_API_RETURN(herr); +} + +#define h5pt_readdata_i8 F77_NAME ( \ + h5pt_readdata_i8, \ + h5pt_readdata_i8_, \ + H5PT_READDATA_I8 ) +h5_int64_t +h5pt_readdata_i8 ( + const h5_int64_t* const fh, + const char* const name, + h5_int64_t* const data, + const int l_name + ) { + h5_file_t f = h5_filehandlefor2c (fh); + H5_API_ENTER (h5_int64_t, + "fh=%p, name='%s', data=%p, l_name=%d", + (h5_file_p)f, name, data, l_name); + char *name2 = h5_strdupfor2c ( name, l_name ); + h5_int64_t herr = h5u_read_data ( + f, name2, data, H5T_NATIVE_INT64 ); + + free ( name2 ); + H5_API_RETURN(herr); +} + +#define h5pt_readdata_i4 F77_NAME ( \ + h5pt_readdata_i4, \ + h5pt_readdata_i4_, \ + H5PT_READDATA_I4 ) +h5_int64_t +h5pt_readdata_i4 ( + const h5_int64_t* const fh, + const char* const name, + h5_int32_t* const data, + const int l_name + ) { + h5_file_t f = h5_filehandlefor2c (fh); + H5_API_ENTER (h5_int64_t, + "hf=%p, name='%s', data=%p, l_name=%d", + (h5_file_p)f, name, data, l_name); + char *name2 = h5_strdupfor2c ( name, l_name ); + h5_int64_t herr = h5u_read_data ( + f, name2, data, H5T_NATIVE_INT32 ); + free ( name2 ); + H5_API_RETURN(herr); +} diff --git a/src/Fortran/H5Part_ioF.f90 b/src/Fortran/H5Part_ioF.f90 new file mode 100644 index 0000000..6535284 --- /dev/null +++ b/src/Fortran/H5Part_ioF.f90 @@ -0,0 +1,83 @@ +!!!!!!!! Reading and Writing Datasets !!!!!!!! + +!> +!! \ingroup h5part_data_f +!! See \ref H5PartWriteDataFloat64 +!! \return 0 on success or error code +INTEGER*8 FUNCTION h5pt_writedata_r8 ( filehandle, name, data ) + INTEGER*8, INTENT(IN) :: filehandle !< the handle returned during file open + CHARACTER(LEN=*), INTENT(IN) :: name !< the name of the dataset + REAL*8, INTENT(IN) :: data(*) !< the array of float64 data to write +END FUNCTION + +!> +!! \ingroup h5part_data_f +!! See \ref H5PartWriteDataFloat32 +!! \return 0 on success or error code +INTEGER*8 FUNCTION h5pt_writedata_r4 ( filehandle, name, data ) + INTEGER*8, INTENT(IN) :: filehandle !< the handle returned during file open + CHARACTER(LEN=*), INTENT(IN) :: name !< the name of the dataset + REAL, INTENT(IN) :: data(*) !< the array of float32 data to write +END FUNCTION + +!> +!! \ingroup h5part_data_f +!! See \ref H5PartWriteDataInt64 +!! \return 0 on success or error code +INTEGER*8 FUNCTION h5pt_writedata_i8 ( filehandle, name, data ) + INTEGER*8, INTENT(IN) :: filehandle !< the handle returned during file open + CHARACTER(LEN=*), INTENT(IN) :: name !< the name of the dataset + INTEGER*8, INTENT(IN) :: data(*) !< the array of int64 data to write +END FUNCTION + +!> +!! \ingroup h5part_data_f +!! See \ref H5PartWriteDataInt32 +!! \return 0 on success or error code +INTEGER*8 FUNCTION h5pt_writedata_i4 ( filehandle, name, data ) + INTEGER*8, INTENT(IN) :: filehandle !< the handle returned during file open + CHARACTER(LEN=*), INTENT(IN) :: name !< the name of the dataset + INTEGER, INTENT(IN) :: data(*) !< the array of int32 data to write +END FUNCTION + + +!> +!! \ingroup h5part_data_f +!! See \ref H5PartReadDataFloat64 +!! \return 0 on success or error code +INTEGER*8 FUNCTION h5pt_readdata_r8 (filehandle,name,data) + INTEGER*8, INTENT(IN) :: filehandle !< the handle returned during file open + CHARACTER(LEN=*), INTENT(IN) :: name !< the name of the dataset + REAL*8, INTENT(OUT) :: data(*) !< array to read float64 data into +END FUNCTION + +!> +!! \ingroup h5part_data_f +!! See \ref H5PartReadDataFloat32 +!! \return 0 on success or error code +INTEGER*8 FUNCTION h5pt_readdata_r4 (filehandle,name,data) + INTEGER*8, INTENT(IN) :: filehandle !< the handle returned during file open + CHARACTER(LEN=*), INTENT(IN) :: name !< the name of the dataset + REAL, INTENT(OUT) :: data(*) !< array to read float32 data into +END FUNCTION + +!> +!! \ingroup h5part_data_f +!! See \ref H5PartReadDataInt64 +!! \return 0 on success or error code +INTEGER*8 FUNCTION h5pt_readdata_i8 (filehandle,name,data) + INTEGER*8, INTENT(IN) :: filehandle !< the handle returned during file open + CHARACTER(LEN=*), INTENT(IN) :: name !< the name of the dataset + INTEGER*8, INTENT(OUT) :: data(*) !< array to read int64 data into +END FUNCTION + +!> +!! \ingroup h5part_data_f +!! See \ref H5PartReadDataInt32 +!! \return 0 on success or error code +INTEGER*8 FUNCTION h5pt_readdata_i4 (filehandle,name,data) + INTEGER*8, INTENT(IN) :: filehandle !< the handle returned during file open + CHARACTER(LEN=*), INTENT(IN) :: name !< the name of the dataset + INTEGER, INTENT(OUT) :: data(*) !< array to read int32 data into +END FUNCTION + diff --git a/src/Fortran/H5_F.c b/src/Fortran/H5_F.c new file mode 100644 index 0000000..ffbda20 --- /dev/null +++ b/src/Fortran/H5_F.c @@ -0,0 +1,216 @@ +#include +#include + +#include "h5core/h5_core.h" +#include "Underscore.h" + +#if defined(F77_SINGLE_UNDERSCORE) +#define F77NAME(a,b) a +#elif defined(F77_CRAY_UNDERSCORE) +#define F77NAME(a,b) b +#elif defined(F77_NO_UNDERSCORE) +#else +#error Error, no way to determine how to construct fortran bindings +#endif + +#if !defined(F77_NO_UNDERSCORE) + +#define h5_openr F77NAME ( \ + h5_openr_, \ + H5_OPENR ) +#define h5_openw F77NAME ( \ + h5_openw_, \ + H5_OPENW ) +#define h5_opena F77NAME ( \ + h5_opena_, \ + H5_OPENA ) +#define h5_openr_par_align F77NAME ( \ + h5_openr_par_align_, \ + H5_OPENR_PAR_ALIGN ) +#define h5_openw_par_align F77NAME ( \ + h5_openw_par_align_, \ + H5_OPENW_PAR_ALIGN ) +#define h5_opena_par_align F77NAME ( \ + h5_opena_par_align_, \ + H5_OPENA_PA_ALIGNR ) +#define h5_close F77NAME ( \ + h5_close_, \ + H5_CLOSE) +#define h5_check F77NAME ( \ + h5_check_, \ + H5_CHECK) +#define h5_setstep F77NAME ( \ + h5_setstep_, \ + H5_SETSTEP ) +#define h5_getnsteps F77NAME ( \ + h5_getnsteps_, \ + H5_GETNSTEPS ) +#define h5_set_verbosity_level F77NAME ( \ + h5_set_verbosity_level_, \ + H5_SET_VERBOSITY_LEVEL ) + +#endif + +/* open/close interface */ +h5_err_t +h5_openr ( + const char *name, + const int l_name + ) { + + H5_API_ENTER (h5_err_t, "name='%s', l_name=%d", name, l_name); + char *name2 = h5_strdupfor2c ( name, l_name ); + h5_file_t* f = h5_open_file ( name2, H5_O_RDONLY, 0, 0 ); + free ( name2 ); + H5_API_RETURN((h5_int64_t)(size_t)f); +} + +h5_err_t +h5_openw ( + const char *name, + const int l_name + ) { + + H5_API_ENTER (h5_err_t, "name='%s', l_name=%d", name, l_name); + char *name2 = h5_strdupfor2c ( name, l_name ); + h5_file_t* f = h5_open_file ( name2, H5_O_WRONLY, 0, 0 ); + free ( name2 ); + H5_API_RETURN((h5_int64_t)(size_t)f); +} + +h5_err_t +h5_opena ( + const char *name, + const int l_name + ) { + + H5_API_ENTER (h5_err_t, "name='%s', l_name=%d", name, l_name); + char *name2 = h5_strdupfor2c ( name, l_name ); + h5_file_t* f = h5_open_file ( name2, H5_O_APPEND, 0, 0 ); + free ( name2 ); + H5_API_RETURN((h5_int64_t)(size_t)f); +} + +#ifdef PARALLEL_IO +h5_err_t +h5_openr_par_align ( + const char *name, + MPI_Fint *fcomm, + const h5_int64_t *align, + const char *flags, + const int l_name, + const int l_flags + ) { + + H5_API_ENTER (h5_err_t, "name='%s', fcomm=%d, align=%lld, flags=%s, " + "l_name=%d, l_flags=%d", + name, *fcomm, (long long)*align, + flags, l_name, l_flags); + MPI_Comm ccomm = MPI_Comm_f2c (*fcomm); + char *name2 = h5_strdupfor2c ( name, l_name ); + char *flags2 = h5_strdupfor2c ( flags, l_flags ); + h5_int32_t fbits = H5_O_RDONLY | _flagsfor2c ( flags2 ); + h5_file_t* f = h5_open_file ( name2, fbits, ccomm, 0 ); + free ( name2 ); + free ( flags2 ); + H5_API_RETURN((h5_int64_t)(size_t)f); +} + +h5_err_t +h5_openw_par_align ( + const char *name, + MPI_Fint *fcomm, + const h5_int64_t *align, + const char *flags, + const int l_name, + const int l_flags + ) { + + H5_API_ENTER (h5_err_t, "name='%s', fcomm=%d, align=%lld, flags=%s, " + "l_name=%d, l_flags=%d", + name, *fcomm, (long long)*align, + flags, l_name, l_flags); + MPI_Comm ccomm = MPI_Comm_f2c (*fcomm); + char *name2 = h5_strdupfor2c ( name, l_name ); + char *flags2 = h5_strdupfor2c ( flags, l_flags ); + h5_int32_t fbits = H5_O_WRONLY | _flagsfor2c ( flags2 ); + h5_file_t* f = h5_open_file ( name2, fbits, ccomm, 0 ); + free ( name2 ); + free ( flags2 ); + H5_API_RETURN((h5_int64_t)(size_t)f); +} + +h5_err_t +h5_opena_par_align ( + const char *name, + MPI_Fint *fcomm, + const h5_int64_t *align, + const char *flags, + const int l_name, + const int l_flags + ) { + + H5_API_ENTER (h5_err_t, "name='%s', fcomm=%d, align=%lld, flags=%s, " + "l_name=%d, l_flags=%d", + name, *fcomm, (long long)*align, + flags, l_name, l_flags); + MPI_Comm ccomm = MPI_Comm_f2c (*fcomm); + char *name2 = h5_strdupfor2c ( name, l_name ); + char *flags2 = h5_strdupfor2c ( flags, l_flags ); + h5_int32_t fbits = H5_O_APPEND | _flagsfor2c ( flags2 ); + h5_file_t* f = h5_open_file ( name2, fbits, ccomm, *align ); + free ( name2 ); + free ( flags2 ); + H5_API_RETURN((h5_int64_t)(size_t)f); +} +#endif + +h5_err_t +h5_close ( + const h5_int64_t *f + ) { + + h5_file_t *fh = h5_filehandlefor2c(f); + H5_API_ENTER (h5_err_t, "f=%p", fh); + H5_API_RETURN(h5_close_file ( fh )); +} + +h5_err_t +h5_check ( + const h5_int64_t *f + ) { + + h5_file_t *fh = h5_filehandlefor2c(f); + H5_API_ENTER (h5_err_t, "f=%p", fh); + H5_API_RETURN(h5_check_filehandle ( fh )); +} + +h5_err_t +h5_setstep ( + const h5_int64_t *f, + h5_int64_t *step ) { + + h5_file_t *fh = h5_filehandlefor2c(f); + H5_API_ENTER (h5_err_t, "f=%p, step=%lld", fh, (long long)*step); + H5_API_RETURN(h5_set_step ( fh, (*step)-1 )); +} + +h5_ssize_t +h5_getnsteps ( + const h5_int64_t *f + ) { + + h5_file_t *fh = h5_filehandlefor2c(f); + H5_API_ENTER (h5_ssize_t, "f=%p", fh); + H5_API_RETURN(h5_get_num_steps ( fh )); +} + +h5_err_t +h5_set_verbosity_level ( + const h5_int64_t *level + ) { + + H5_API_ENTER (h5_err_t, "level=%lld", (long long)*level); + H5_API_RETURN(h5_set_debuglevel ( *level )); +} + diff --git a/src/Fortran/H5_attribs.c b/src/Fortran/H5_attribs.c new file mode 100644 index 0000000..57bedca --- /dev/null +++ b/src/Fortran/H5_attribs.c @@ -0,0 +1,649 @@ +/* + Copyright (c) 2006-2012, The Regents of the University of California, + through Lawrence Berkeley National Laboratory (subject to receipt of any + required approvals from the U.S. Dept. of Energy) and the Paul Scherrer + Institut (Switzerland). All rights reserved. + + License: see file COPYING in top level of source distribution. +*/ + +#include "h5_private.h" +#include "h5core/h5_attribs.h" + +/* + __ _ _ _ _ _ _ _ + / _(_) | ___ __ _| |_| |_ _ __(_) |__ _ _| |_ ___ ___ + | |_| | |/ _ \ / _` | __| __| '__| | '_ \| | | | __/ _ \/ __| + | _| | | __/ | (_| | |_| |_| | | | |_) | |_| | || __/\__ \ + |_| |_|_|\___| \__,_|\__|\__|_| |_|_.__/ \__,_|\__\___||___/ + __ _ _ _ ___ _ __ _ _ + / _` | | | |/ _ \ '__| | | | + | (_| | |_| | __/ | | |_| | + \__, |\__,_|\___|_| \__, | + |_| |___/ +*/ + +#define h5_getnfileattribs F77_NAME( \ + h5_getnfileattribs, \ + h5_getnfileattribs_, \ + H5_GETNFILEATTRIBS) +h5_int64_t +h5_getnfileattribs ( + const h5_int64_t* const fh + ) { + h5_file_t f = h5_filehandlefor2c(fh); + H5_API_ENTER (h5_int64_t, "fh=%p", (h5_file_p)f); + H5_API_RETURN (h5_get_num_file_attribs (f)); +} + +#define h5_getfileattribinfo F77_NAME( \ + h5_getfileattribinfo, \ + h5_getfileattribinfo_, \ + H5_GETFILEATTRIBINFO) +h5_int64_t +h5_getfileattribinfo ( + const h5_int64_t* const fh, + const h5_int64_t* attrib_idx, + char* attrib_name, + h5_int64_t* attrib_type, + h5_int64_t* attrib_nelem, + const int l_attrib_name + ) { + h5_file_t f = h5_filehandlefor2c(fh); + H5_API_ENTER (h5_int64_t, + "fh=%p, " + "attrib_idx=%lld, " + "attrib_name=%p, " + "attrib_type=%p, " + "attrib_nelem=%p", + (h5_file_p)fh, + (long long)*attrib_idx, + attrib_name, attrib_type, attrib_nelem); + h5_int64_t h5err = h5_get_file_attrib_info ( + f, + *attrib_idx - 1, + attrib_name, l_attrib_name, + attrib_type, + (h5_size_t*)attrib_nelem); + h5_strc2for (attrib_name, l_attrib_name); + convert_type2for (attrib_type); + H5_API_RETURN (h5err); +} + +/* + _ __ + (_) / /__ + | | / / _ \ + | |/ / (_) | + |_/_/ \___/ +*/ +static inline h5_int64_t +write_file_attrib ( + const h5_file_t f, + const char* name, + const int l_name, + const hid_t type, + const void* buffer, + const hsize_t l_buffer + ) { + char *name2 = h5_strdupfor2c (name, l_name); + h5_int64_t herr = h5_write_file_attrib (f, name2, type, buffer, l_buffer ); + free (name2); + return herr; +} + +static inline h5_int64_t +read_file_attrib ( + const h5_file_t f, + const char* name, + const int l_name, + const hid_t type, + void* const buffer + ) { + char* name2 = h5_strdupfor2c ( name, l_name ); + h5_int64_t herr = h5_read_file_attrib (f, name2, type, buffer); + free (name2); + return herr; +} + +/* + _ _ + ___| |_ _ __(_)_ __ __ _ + / __| __| '__| | '_ \ / _` | + \__ \ |_| | | | | | | (_| | + |___/\__|_| |_|_| |_|\__, | + |___/ +*/ +#define h5_writefileattrib_string F77_NAME ( \ + h5_writefileattrib_string, \ + h5_writefileattrib_string_, \ + H5_WRITEFILEATTRIB_STRING) +h5_int64_t +h5_writefileattrib_string ( + h5_int64_t *const fh, + const char *name, + const char *buffer, + const int l_name, + const int l_buffer + ) { + h5_file_t f = h5_filehandlefor2c(fh); + H5_API_ENTER (h5_int64_t, + "fh=%p, name='%.*s', buffer='%.*s'", + (h5_file_p)f, l_name, name, l_buffer, buffer); + char *buffer2 = h5_strdupfor2c (buffer, l_buffer); + h5_int64_t herr = write_file_attrib ( + f, name, l_name, H5_STRING_T, buffer2, strlen(buffer2)+1 ); + free (buffer2); + H5_API_RETURN (herr); +} + +#define h5_readfileattrib_string F77_NAME ( \ + h5_readfileattrib_string, \ + h5_readfileattrib_string_, \ + H5_READFILEATTRIB_STRING) +h5_int64_t +h5_readfileattrib_string ( + h5_int64_t *const fh, + const char *name, + char *buffer, + const int l_name, + const int l_buffer + ) { + h5_file_t f = h5_filehandlefor2c(fh); + H5_API_ENTER (h5_int64_t, + "fh=%p, name='%.*s', buffer='%.*s'", + (h5_file_p)f, l_name, name, l_buffer, buffer); + h5_int64_t herr = read_file_attrib (f, name, l_name, H5_STRING_T, buffer); + h5_strc2for (buffer, l_buffer); + H5_API_RETURN (herr); +} + +#define h5_writefileattrib_r8 F77_NAME ( \ + h5_writefileattrib_r8, \ + h5_writefileattrib_r8_, \ + H5_WRITEFILEATTRIB_R8) +h5_int64_t +h5_writefileattrib_r8 ( + const h5_int64_t *const fh, + const char *name, + const h5_int64_t *buffer, + const h5_int64_t *nelem, + const int l_name + ) { + h5_file_t f = h5_filehandlefor2c(fh); + H5_API_ENTER (h5_int64_t, + "fh=%p, name='%.*s', buffer=%p, nelem=%lld", + (h5_file_p)f, l_name, name, buffer, (long long)*nelem); + H5_API_RETURN (write_file_attrib( + f, + name, l_name, + H5_FLOAT64_T, + buffer, (hsize_t)*nelem)); +} + +#define h5_readfileattrib_r8 F77_NAME ( \ + h5_readfileattrib_r8, \ + h5_readfileattrib_r8_, \ + H5_READFILEATTRIB_R8 ) +h5_int64_t +h5_readfileattrib_r8 ( + h5_int64_t *const fh, + const char *name, + h5_int64_t *buffer, + const int l_name + ) { + h5_file_t f = h5_filehandlefor2c(fh); + H5_API_ENTER (h5_int64_t, + "(h5_file_p)fh=%p, name='%.*s', buffer=%p", + (h5_file_p)f, l_name, name, buffer); + H5_API_RETURN (read_file_attrib( + f, + name, l_name, + H5_FLOAT64_T, + (void*)buffer)); +} + +#define h5_writefileattrib_r4 F77_NAME ( \ + h5_writefileattrib_r4, \ + h5_writefileattrib_r4_, \ + H5_WRITEFILEATTRIB_R4 ) +h5_int64_t +h5_writefileattrib_r4 ( + const h5_int64_t *const fh, + const char *name, + const h5_int32_t *buffer, + const h5_int64_t *nelem, + const int l_name + ) { + h5_file_t f = h5_filehandlefor2c(fh); + H5_API_ENTER (h5_int64_t, + "fh=%p, name='%.*s', buffer=%p, nelem=%lld", + (h5_file_p)f, l_name, name, buffer, (long long)*nelem); + H5_API_RETURN (write_file_attrib( + f, + name, l_name, + H5_FLOAT32_T, + buffer, (hsize_t)*nelem)); +} + +#define h5_readfileattrib_r4 F77_NAME ( \ + h5_readfileattrib_r4, \ + h5_readfileattrib_r4_, \ + H5_READFILEATTRIB_R4 ) +h5_int64_t +h5_readfileattrib_r4 ( + const h5_int64_t *const fh, + const char *name, + h5_int32_t *buffer, + const int l_name + ) { + h5_file_t f = h5_filehandlefor2c(fh); + H5_API_ENTER (h5_int64_t, + "f=%p, name='%.*s', buffer=%p", + (h5_file_p)f, l_name, name, buffer); + H5_API_RETURN (read_file_attrib( + f, + name, l_name, + H5_FLOAT32_T, + buffer)); +} + +#define h5_writefileattrib_i8 F77_NAME ( \ + h5_writefileattrib_i8, \ + h5_writefileattrib_i8_, \ + H5_WRITEFILEATTRIB_I8) +h5_int64_t +h5_writefileattrib_i8 ( + const h5_int64_t *const fh, + const char *name, + const h5_int64_t *buffer, + const h5_int64_t *nelem, + const int l_name + ) { + h5_file_t f = h5_filehandlefor2c(fh); + H5_API_ENTER (h5_int64_t, + "fh=%p, name='%.*s', buffer=%p, nelem=%lld", + (h5_file_p)f, l_name, name, buffer, (long long)*nelem); + H5_API_RETURN (write_file_attrib( + f, + name, l_name, + H5_INT64_T, + buffer, (hsize_t)*nelem)); +} + +#define h5_readfileattrib_i8 F77_NAME ( \ + h5_readfileattrib_i8, \ + h5_readfileattrib_i8_, \ + H5_READFILEATTRIB_I8 ) +h5_int64_t +h5_readfileattrib_i8 ( + const h5_int64_t *const fh, + const char *name, + h5_int64_t *buffer, + const int l_name + ) { + h5_file_t f = h5_filehandlefor2c(fh); + H5_API_ENTER (h5_int64_t, + "fh=%p, name='%.*s', buffer=%p", + (h5_file_p)f, l_name, name, buffer); + H5_API_RETURN (read_file_attrib( + f, + name, l_name, + H5_INT64_T, + buffer)); +} + +#define h5_writefileattrib_i4 F77_NAME ( \ + h5_writefileattrib_i4, \ + h5_writefileattrib_i4_, \ + H5_WRITEFILEATTRIB_I4 ) +h5_int64_t +h5_writefileattrib_i4 ( + h5_int64_t *const fh, + const char *name, + const h5_int32_t *buffer, + const h5_int64_t *nelem, + const int l_name + ) { + h5_file_t f = h5_filehandlefor2c(fh); + H5_API_ENTER (h5_int64_t, + "fh=%p, name='%.*s', buffer=%p, nelem=%lld", + (h5_file_p)f, l_name, name, buffer, (long long)*nelem); + H5_API_RETURN (write_file_attrib( + f, + name, l_name, + H5_INT32_T, + buffer, (hsize_t)*nelem)); +} + +#define h5_readfileattrib_i4 F77_NAME ( \ + h5_readfileattrib_i4, \ + h5_readfileattrib_i4_, \ + H5_READFILEATTRIB_I4 ) +h5_int64_t +h5_readfileattrib_i4 ( + h5_int64_t *const fh, + const char *name, + h5_int32_t *buffer, + const int l_name + ) { + h5_file_t f = h5_filehandlefor2c(fh); + H5_API_ENTER (h5_int64_t, + "fh=%p, name='%.*s', buffer=%p", + (h5_file_p)f, l_name, name, buffer); + H5_API_RETURN (read_file_attrib( + f, + name, l_name, + H5_INT32_T, + buffer)); +} + +/* + _ _ _ _ _ _ + ___| |_ ___ _ __ __ _| |_| |_ _ __(_) |__ _ _| |_ ___ ___ + / __| __/ _ \ '_ \ / _` | __| __| '__| | '_ \| | | | __/ _ \/ __| + \__ \ || __/ |_) | | (_| | |_| |_| | | | |_) | |_| | || __/\__ \ + |___/\__\___| .__/ \__,_|\__|\__|_| |_|_.__/ \__,_|\__\___||___/ + |_| + */ +#define h5_getnstepattribs F77_NAME( \ + h5_getnstepattribs, \ + h5_getnstepattribs_, \ + H5_GETNSTEPATTRIBS) +h5_int64_t +h5_getnstepattribs ( + const h5_int64_t* fh + ) { + h5_file_t f = h5_filehandlefor2c(fh); + H5_API_ENTER (h5_int64_t, + "fh=%p", + (h5_file_p)f); + H5_API_RETURN (h5_get_num_step_attribs (f)); +} + +#define h5_getstepattribinfo F77_NAME( \ + h5_getstepattribinfo, \ + h5_getstepattribinfo_, \ + H5_GETSTEPATTRIBINFO) +h5_int64_t +h5_getstepattribinfo ( + const h5_int64_t* fh, + const h5_int64_t* attrib_idx, + char* attrib_name, + h5_int64_t* attrib_type, + h5_int64_t* attrib_nelem, + const int l_attrib_name + ) { + h5_file_t f = h5_filehandlefor2c(fh); + H5_API_ENTER (h5_int64_t, + "f=%p, " + "attrib_idx=%lld, " + "attrib_name=%p, " + "attrib_type=%p, " + "attrib_nelem=%p", + (h5_file_p)f, + (long long)*attrib_idx, + attrib_name, attrib_type, attrib_nelem); + h5_int64_t h5err = h5_get_step_attrib_info ( + f, + *attrib_idx - 1, + attrib_name, l_attrib_name, + attrib_type, + (h5_size_t*)attrib_nelem); + h5_strc2for (attrib_name, l_attrib_name); + convert_type2for (attrib_type); + H5_API_RETURN (h5err); +} + +static inline h5_int64_t +write_step_attrib ( + const h5_file_t fh, + const char* name, + const int l_name, + const hid_t type, + const void* buffer, + const hsize_t l_buffer + ) { + char *name2 = h5_strdupfor2c (name, l_name); + h5_int64_t herr = h5_write_step_attrib (fh, name2, type, buffer, l_buffer ); + free (name2); + return herr; +} + +static inline h5_int64_t +read_step_attrib ( + const h5_file_t fh, + const char* name, + const int l_name, + const hid_t type, + void* const buffer + ) { + char* name2 = h5_strdupfor2c ( name, l_name ); + h5_int64_t herr = h5_read_step_attrib (fh, name2, type, buffer); + free (name2); + return herr; +} + +#define h5_writestepattrib_string F77_NAME ( \ + h5_writestepattrib_string, \ + h5_writestepattrib_string_, \ + H5_WRITESTEPATTRIB_STRING) +h5_int64_t +h5_writestepattrib_string ( + const h5_int64_t *const fh, + const char *name, + const char *buffer, + const int l_name, + const int l_buffer + ) { + h5_file_t f = h5_filehandlefor2c(fh); + H5_API_ENTER (h5_int64_t, + "f=%p, name='%.*s', buffer='%.*s'", + (h5_file_p)f, l_name, name, l_buffer, buffer); + char *buffer2 = h5_strdupfor2c (buffer, l_buffer); + h5_int64_t herr = write_step_attrib ( + f, name, l_name, H5_STRING_T, buffer2, strlen(buffer2)+1 ); + free (buffer2); + H5_API_RETURN (herr); +} + +#define h5_readstepattrib_string F77_NAME ( \ + h5_readstepattrib_string, \ + h5_readstepattrib_string_, \ + H5_READSTEPATTRIB_STRING) +h5_int64_t +h5_readstepattrib_string ( + const h5_int64_t *const fh, + const char *name, + char *buffer, + const int l_name, + const int l_buffer + ) { + h5_file_t f = h5_filehandlefor2c(fh); + H5_API_ENTER (h5_int64_t, + "f=%p, name='%.*s', buffer='%.*s'", + (h5_file_p)f, l_name, name, l_buffer, buffer); + h5_int64_t herr = read_step_attrib (f, name, l_name, H5_STRING_T, buffer); + h5_strc2for (buffer, l_buffer); + H5_API_RETURN (herr); +} + +#define h5_writestepattrib_r8 F77_NAME ( \ + h5_writestepattrib_r8, \ + h5_writestepattrib_r8_, \ + H5_WRITESTEPATTRIB_R8) +h5_int64_t +h5_writestepattrib_r8 ( + const h5_int64_t *const fh, + const char *name, + const h5_float64_t *buffer, + const h5_int64_t *nelem, + const int l_name + ) { + h5_file_t f = h5_filehandlefor2c(fh); + H5_API_ENTER (h5_int64_t, + "f=%p, name='%.*s', buffer=%p, nelem=%lld", + (h5_file_p)f, l_name, name, buffer, (long long)*nelem); + H5_API_RETURN (write_step_attrib( + f, + name, l_name, + H5_FLOAT64_T, + buffer, (hsize_t)*nelem)); +} + +#define h5_readstepattrib_r8 F77_NAME ( \ + h5_readstepattrib_r8, \ + h5_readstepattrib_r8_, \ + H5_READSTEPATTRIB_R8 ) +h5_int64_t +h5_readstepattrib_r8 ( + const h5_int64_t *const fh, + const char *name, + h5_float64_t *buffer, + const int l_name + ) { + h5_file_t f = h5_filehandlefor2c(fh); + H5_API_ENTER (h5_int64_t, + "f=%p, name='%.*s', buffer=%p", + (h5_file_p)f, l_name, name, buffer); + H5_API_RETURN (read_step_attrib( + f, + name, l_name, + H5_FLOAT64_T, + (void*)buffer)); +} + +#define h5_writestepattrib_r4 F77_NAME ( \ + h5_writestepattrib_r4, \ + h5_writestepattrib_r4_, \ + H5_WRITESTEPATTRIB_R4 ) +h5_int64_t +h5_writestepattrib_r4 ( + h5_int64_t *const fh, + const char *name, + const h5_float64_t *buffer, + const h5_int64_t *nelem, + const int l_name + ) { + h5_file_t f = h5_filehandlefor2c(fh); + H5_API_ENTER (h5_int64_t, + "f=%p, name='%.*s', buffer=%p, nelem=%lld", + (h5_file_p)f, l_name, name, buffer, (long long)*nelem); + H5_API_RETURN (write_step_attrib( + f, + name, l_name, + H5_FLOAT32_T, + buffer, (hsize_t)*nelem)); +} + +#define h5_readstepattrib_r4 F77_NAME ( \ + h5_readstepattrib_r4, \ + h5_readstepattrib_r4_, \ + H5_READSTEPATTRIB_R4 ) +h5_int64_t +h5_readstepattrib_r4 ( + const h5_int64_t *const fh, + const char *name, + h5_float64_t *buffer, + const int l_name + ) { + h5_file_t f = h5_filehandlefor2c(fh); + H5_API_ENTER (h5_int64_t, + "f=%p, name='%.*s', buffer=%p", + (h5_file_p)f, l_name, name, buffer); + H5_API_RETURN (read_step_attrib( + f, + name, l_name, + H5_FLOAT32_T, + buffer)); +} + +#define h5_writestepattrib_i8 F77_NAME ( \ + h5_writestepattrib_i8, \ + h5_writestepattrib_i8_, \ + H5_WRITESTEPATTRIB_I8) +h5_int64_t +h5_writestepattrib_i8 ( + h5_int64_t *const fh, + const char *name, + const h5_float64_t *buffer, + const h5_int64_t *nelem, + const int l_name + ) { + h5_file_t f = h5_filehandlefor2c(fh); + H5_API_ENTER (h5_int64_t, + "f=%p, name='%.*s', buffer=%p, nelem=%lld", + (h5_file_p)f, l_name, name, buffer, (long long)*nelem); + H5_API_RETURN (write_step_attrib( + f, + name, l_name, + H5_INT64_T, + buffer, (hsize_t)*nelem)); +} + +#define h5_readstepattrib_i8 F77_NAME ( \ + h5_readstepattrib_i8, \ + h5_readstepattrib_i8_, \ + H5_READSTEPATTRIB_I8 ) +h5_int64_t +h5_readstepattrib_i8 ( + const h5_int64_t *const fh, + const char *name, + h5_float64_t *buffer, + const int l_name + ) { + h5_file_t f = h5_filehandlefor2c(fh); + H5_API_ENTER (h5_int64_t, + "f=%p, name='%.*s', buffer=%p", + (h5_file_p)f, l_name, name, buffer); + H5_API_RETURN (read_step_attrib( + f, + name, l_name, + H5_INT64_T, + buffer)); +} + +#define h5_writestepattrib_i4 F77_NAME ( \ + h5_writestepattrib_i4, \ + h5_writestepattrib_i4_, \ + H5_WRITESTEPATTRIB_I4 ) +h5_int64_t +h5_writestepattrib_i4 ( + const h5_int64_t *const fh, + const char *name, + const h5_float64_t *buffer, + const h5_int64_t *nelem, + const int l_name + ) { + h5_file_t f = h5_filehandlefor2c(fh); + H5_API_ENTER (h5_int64_t, + "f=%p, name='%.*s', buffer=%p, nelem=%lld", + (h5_file_p)f, l_name, name, buffer, (long long)*nelem); + H5_API_RETURN (write_step_attrib( + f, + name, l_name, + H5_INT32_T, + buffer, (hsize_t)*nelem)); +} + +#define h5_readstepattrib_i4 F77_NAME ( \ + h5_readstepattrib_i4, \ + h5_readstepattrib_i4_, \ + H5_READSTEPATTRIB_I4 ) +h5_int64_t +h5_readstepattrib_i4 ( + const h5_int64_t *const fh, + const char *name, + h5_float64_t *buffer, + const int l_name + ) { + h5_file_t f = h5_filehandlefor2c(fh); + H5_API_ENTER (h5_int64_t, + "f=%p, name='%.*s', buffer=%p", + (h5_file_p)f, l_name, name, buffer); + H5_API_RETURN (read_step_attrib( + f, + name, l_name, + H5_INT32_T, + buffer)); +} diff --git a/src/Fortran/H5_attribsF.f90 b/src/Fortran/H5_attribsF.f90 new file mode 100644 index 0000000..f98c45f --- /dev/null +++ b/src/Fortran/H5_attribsF.f90 @@ -0,0 +1,366 @@ +! __ _ _ _ _ _ _ _ +! / _(_) | ___ __ _| |_| |_ _ __(_) |__ _ _| |_ ___ ___ +! | |_| | |/ _ \ / _` | __| __| '__| | '_ \| | | | __/ _ \/ __| +! | _| | | __/ | (_| | |_| |_| | | | |_) | |_| | || __/\__ \ +! |_| |_|_|\___| \__,_|\__|\__|_| |_|_.__/ \__,_|\__\___||___/ +! __ _ _ _ ___ _ __ _ _ +! / _` | | | |/ _ \ '__| | | | +! | (_| | |_| | __/ | | |_| | +! \__, |\__,_|\___|_| \__, | +! |_| |___/ + +!> +!! \ingroup h5hut_attrib_f +!! See \ref H5GetNumFileAttribs +!! \return number of attributes or error code +!< +INTEGER*8 FUNCTION h5_getnfileattribs (filehandle) + INTEGER*8, INTENT(IN) :: filehandle !< file handle +END FUNCTION + +!> +!! \ingroup h5hut_attrib_f +!! See \ref H5GetFileAttribInfo +!! \return 0 on success or error code +!< +INTEGER*8 FUNCTION h5_getfileattribinfo (filehandle, idx, attrib_name, attrib_nelem) + INTEGER*8,INTENT(IN) :: filehandle !< file handle + INTEGER*8,INTENT(IN) :: idx !< index of attribute being queried + CHARACTER(LEN=*), INTENT(OUT):: attrib_name !< name of attribute + INTEGER*8,INTENT(OUT):: attrib_type !< type of attribute + INTEGER*8,INTENT(OUT):: attrib_nelem !< number of elements in the attrib array +END FUNCTION + +! __ _ _ _ _ _ _ _ +! / _(_) | ___ __ _| |_| |_ _ __(_) |__ _ _| |_ ___ ___ +! | |_| | |/ _ \ / _` | __| __| '__| | '_ \| | | | __/ _ \/ __| +! | _| | | __/ | (_| | |_| |_| | | | |_) | |_| | || __/\__ \ +! |_| |_|_|\___| \__,_|\__|\__|_| |_|_.__/ \__,_|\__\___||___/ +! _ __ _ _ +! (_) / /__ ___| |_ _ __(_)_ __ __ _ +! | | / / _ \ / __| __| '__| | '_ \ / _` | +! | |/ / (_) | \__ \ |_| | | | | | | (_| | +! |_/_/ \___/ |___/\__|_| |_|_| |_|\__, | +! |___/ + +!> +!! \ingroup h5hut_attrib_f +!! See \ref H5WriteFileAttribString +!! \return 0 on success or error code +!< +INTEGER*8 FUNCTION h5_writefileattrib_string (filehandle, attrib_name, attrib_value) + INTEGER*8, INTENT(IN) :: filehandle !< file handle + CHARACTER(LEN=*), INTENT(IN) :: attrib_name !< name of attribute to write + CHARACTER(LEN=*), INTENT(IN) :: attrib_value!< attribute data to be written +END FUNCTION + +!> +!! \ingroup h5hut_attrib_f +!! \return 0 on success or error code +!< +INTEGER*8 FUNCTION h5_readfileattrib_string (filehandle, attrib_name, attrib_value) + INTEGER*8, INTENT(IN) :: filehandle !< file handle + CHARACTER(LEN=*), INTENT(IN) :: attrib_name !< name of the attribute to read + CHARACTER(LEN=*), INTENT(IN) :: attrib_value!< attribute data will be read into this array +END FUNCTION + +! __ _ _ _ _ _ _ _ +! / _(_) | ___ __ _| |_| |_ _ __(_) |__ _ _| |_ ___ ___ +! | |_| | |/ _ \ / _` | __| __| '__| | '_ \| | | | __/ _ \/ __| +! | _| | | __/ | (_| | |_| |_| | | | |_) | |_| | || __/\__ \ +! |_| |_|_|\___| \__,_|\__|\__|_| |_|_.__/ \__,_|\__\___||___/ +! _ __ _ +! (_) / /__ _ __ ___ __ _| | +! | | / / _ \ | '__/ _ \/ _` | | +! | |/ / (_) | | | | __/ (_| | | +! |_/_/ \___/ |_| \___|\__,_|_| + +!> +!! \ingroup h5hut_attrib_f +!! See \ref H5WriteFileAttribFloat64 +!! \return 0 on success or error code +!< +INTEGER*8 FUNCTION h5_writefileattrib_r8 (filehandle, attrib_name, attrib_value, attrib_nelem) + INTEGER*8,INTENT(IN) :: filehandle !< file handle + CHARACTER(LEN=*), INTENT(IN) :: attrib_name !< name of attribute to read + REAL*8, INTENT(OUT):: attrib_value(*) !< attribute data to be written + INTEGER*8, INTENT(IN) :: attrib_nelem !< number of elements in data array +END FUNCTION + +!> +!! \ingroup h5hut_attrib_f +!! See \ref H5ReadFileAttribFloat64 +!! \return 0 on success or error code +!< +INTEGER*8 FUNCTION h5_readfileattrib_r8 (filehandle, attrib_name, attrib_value) + INTEGER*8,INTENT(IN) :: filehandle !< file handle + CHARACTER(LEN=*), INTENT(IN) :: attrib_name !< name of attribute to read + REAL*8, INTENT(OUT):: attrib_value(*) !< attribute data will be read into this array +END FUNCTION + +!> +!! \ingroup h5hut_attrib_f +!! See \ref H5WriteFileAttribFloat32 +!! \return 0 on success or error code +!< +INTEGER*8 FUNCTION h5_writefileattrib_r4 (filehandle, attrib_name, attrib_value, attrib_nelem) + INTEGER*8,INTENT(IN) :: filehandle !< file handle + CHARACTER(LEN=*), INTENT(IN) :: attrib_name !< name of attribute to read + REAL*4, INTENT(OUT):: attrib_value(*) !< attribute data to be written + INTEGER*8, INTENT(IN) :: attrib_nelem !< number of elements in data array +END FUNCTION + +!> +!! \ingroup h5hut_attrib_f +!! See \ref H5ReadFileAttribFloat32 +!! \return 0 on success or error code +!< +INTEGER*8 FUNCTION h5_readfileattrib_r4 ( filehandle, attrib_name, attrib_value ) + INTEGER*8,INTENT(IN) :: filehandle !< file handle + CHARACTER(LEN=*), INTENT(IN) :: attrib_name !< name of attribute to read + REAL*4, INTENT(OUT):: attrib_value(*) !< attribute data will be read into this array +END FUNCTION + +! __ _ _ _ _ _ _ _ +! / _(_) | ___ __ _| |_| |_ _ __(_) |__ _ _| |_ ___ ___ +! | |_| | |/ _ \ / _` | __| __| '__| | '_ \| | | | __/ _ \/ __| +! | _| | | __/ | (_| | |_| |_| | | | |_) | |_| | || __/\__ \ +! |_| |_|_|\___| \__,_|\__|\__|_| |_|_.__/ \__,_|\__\___||___/ +! _ __ _ _ +! (_) / /__ (_)_ __ | |_ ___ __ _ ___ _ __ +! | | / / _ \ | | '_ \| __/ _ \/ _` |/ _ \ '__| +! | |/ / (_) | | | | | | || __/ (_| | __/ | +! |_/_/ \___/ |_|_| |_|\__\___|\__, |\___|_| +! |___/ + +!> +!! \ingroup h5hut_attrib_f +!! See \ref H5WriteFileAttribInt64 +!! \return 0 on success or error code +!< +INTEGER*8 FUNCTION h5_writefileattrib_i8 (filehandle, attrib_name, attrib_value, attrib_nelem) + INTEGER*8,INTENT(IN) :: filehandle !< file handle + CHARACTER(LEN=*), INTENT(IN) :: attrib_name !< name of attribute to write + INTEGER*8,INTENT(OUT):: attrib_value(*) !< attribute data to be written + INTEGER*8, INTENT(IN) :: attrib_nelem !< number of elements in data array +END FUNCTION + +!> +!! \ingroup h5hut_attrib_f +!! See \ref H5ReadFileAttribInt64 +!! \return 0 on success or error code +!< +INTEGER*8 FUNCTION h5_readfileattrib_i8 (filehandle, attrib_name, attrib_value) + INTEGER*8,INTENT(IN) :: filehandle !< file handle + CHARACTER(LEN=*), INTENT(IN) :: attrib_name !< name of attribute to read + INTEGER*8,INTENT(OUT):: attrib_value(*) !< attribute data will be read into this array +END FUNCTION + +!> +!! \ingroup h5hut_attrib_f +!! See \ref H5WriteFileAttribInt32 +!! \return 0 on success or error code +!< +INTEGER*8 FUNCTION h5_writefileattrib_i4 (filehandle, attrib_name, attrib_value, attrib_nelem) + INTEGER*8,INTENT(IN) :: filehandle !< file handle + CHARACTER(LEN=*), INTENT(IN) :: attrib_name !< name of attribute to write + INTEGER*8,INTENT(OUT):: attrib_type !< type of attribute + INTEGER*4,INTENT(OUT):: attrib_value(*) !< attribute data to be written + INTEGER*8, INTENT(IN) :: attrib_nelem !< number of elements in data array +END FUNCTION + +!> +!! \ingroup h5hut_attrib_f +!! See \ref H5ReadFileAttribInt32 +!! \return 0 on success or error code +!< +INTEGER*8 FUNCTION h5_readfileattrib_i4 (filehandle, attrib_name, attrib_value) + INTEGER*8,INTENT(IN) :: filehandle !< file handle + CHARACTER(LEN=*), INTENT(IN) :: attrib_name !< name of attribute to read + INTEGER*4,INTENT(OUT):: attrib_value(*) !< attribute data will be read into this array +END FUNCTION + +! _ _ _ _ _ _ +! ___| |_ ___ _ __ __ _| |_| |_ _ __(_) |__ _ _| |_ ___ ___ +! / __| __/ _ \ '_ \ / _` | __| __| '__| | '_ \| | | | __/ _ \/ __| +! \__ \ || __/ |_) | | (_| | |_| |_| | | | |_) | |_| | || __/\__ \ +! |___/\__\___| .__/ \__,_|\__|\__|_| |_|_.__/ \__,_|\__\___||___/ +! |_| +! __ _ _ _ ___ _ __ _ _ +! / _` | | | |/ _ \ '__| | | | +! | (_| | |_| | __/ | | |_| | +! \__, |\__,_|\___|_| \__, | +! |_| |___/ + +!> +!! \ingroup h5hut_attrib_f +!! See \ref H5GetNumFileAttribs +!! \return number of attributes or error code +!< +INTEGER*8 FUNCTION h5_getnstepattribs (filehandle) + INTEGER*8, INTENT(IN) :: filehandle !< file handle +END FUNCTION + +!> +!! \ingroup h5hut_attrib_f +!! See \ref H5GetFileAttribInfo +!! \return 0 on success or error code +!< +INTEGER*8 FUNCTION h5_getstepattribinfo (filehandle, idx, attrib_name, attrib_nelem) + INTEGER*8,INTENT(IN) :: filehandle !< file handle + INTEGER*8,INTENT(IN) :: idx !< index of attribute being queried + CHARACTER(LEN=*), INTENT(OUT):: attrib_name !< name of attribute + INTEGER*8,INTENT(OUT):: attrib_nelem !< number of elements in the attrib array +END FUNCTION + +! _ _ _ _ _ _ +! ___| |_ ___ _ __ __ _| |_| |_ _ __(_) |__ _ _| |_ ___ ___ +! / __| __/ _ \ '_ \ / _` | __| __| '__| | '_ \| | | | __/ _ \/ __| +! \__ \ || __/ |_) | | (_| | |_| |_| | | | |_) | |_| | || __/\__ \ +! |___/\__\___| .__/ \__,_|\__|\__|_| |_|_.__/ \__,_|\__\___||___/ +! |_| +! _ __ _ _ +! (_) / /__ ___| |_ _ __(_)_ __ __ _ +! | | / / _ \ / __| __| '__| | '_ \ / _` | +! | |/ / (_) | \__ \ |_| | | | | | | (_| | +! |_/_/ \___/ |___/\__|_| |_|_| |_|\__, | +! |___/ + +!> +!! \ingroup h5hut_attrib_f +!! See \ref H5WriteStepAttribString +!! \return 0 on success or error code +!< +INTEGER*8 FUNCTION h5_writestepattrib_string (filehandle, attrib_name, attrib_value) + INTEGER*8, INTENT(IN) :: filehandle !< file handle + CHARACTER(LEN=*), INTENT(IN) :: attrib_name !< name of attribute to write + CHARACTER(LEN=*), INTENT(IN) :: attrib_value!< attribute data to be written +END FUNCTION + +!> +!! \ingroup h5hut_attrib_f +!! See \ref H5ReadStepAttribString +!! \return 0 on success or error code +!< +INTEGER*8 FUNCTION h5_readstepattrib_string (filehandle, attrib_name, attrib_value) + INTEGER*8, INTENT(IN) :: filehandle !< file handle + CHARACTER(LEN=*), INTENT(IN) :: attrib_name !< name of the attribute to read + CHARACTER(LEN=*), INTENT(IN) :: attrib_value!< attribute data will be read into this array +END FUNCTION + +! _ _ _ _ _ _ +! ___| |_ ___ _ __ __ _| |_| |_ _ __(_) |__ _ _| |_ ___ ___ +! / __| __/ _ \ '_ \ / _` | __| __| '__| | '_ \| | | | __/ _ \/ __| +! \__ \ || __/ |_) | | (_| | |_| |_| | | | |_) | |_| | || __/\__ \ +! |___/\__\___| .__/ \__,_|\__|\__|_| |_|_.__/ \__,_|\__\___||___/ +! |_| +! _ __ _ +! (_) / /__ _ __ ___ __ _| | +! | | / / _ \ | '__/ _ \/ _` | | +! | |/ / (_) | | | | __/ (_| | | +! |_/_/ \___/ |_| \___|\__,_|_| + +!> +!! \ingroup h5hut_attrib_f +!! See \ref H5WriteStepAttribFloat64 +!! \return 0 on success or error code +!< +INTEGER*8 FUNCTION h5_writestepattrib_r8 (filehandle, attrib_name, attrib_value, attrib_nelem) + INTEGER*8,INTENT(IN) :: filehandle !< file handle + CHARACTER(LEN=*), INTENT(IN) :: attrib_name !< name of attribute to read + REAL*8, INTENT(OUT):: attrib_value(*) !< attribute data to be written + INTEGER*8, INTENT(IN) :: attrib_nelem !< number of elements in data array +END FUNCTION + +!> +!! \ingroup h5hut_attrib_f +!! See \ref H5ReadStepAttribFloat64 +!! \return 0 on success or error code +!< +INTEGER*8 FUNCTION h5_readstepattrib_r8 (filehandle, attrib_name, attrib_value) + INTEGER*8,INTENT(IN) :: filehandle !< file handle + CHARACTER(LEN=*), INTENT(IN) :: attrib_name !< name of attribute to read + REAL*8, INTENT(OUT):: attrib_value(*) !< attribute data will be read into this array +END FUNCTION + +!> +!! \ingroup h5hut_attrib_f +!! See \ref H5WriteStepAttribFloat32 +!! \return 0 on success or error code +!< +INTEGER*8 FUNCTION h5_writestepattrib_r4 (filehandle, attrib_name, attrib_value, attrib_nelem) + INTEGER*8,INTENT(IN) :: filehandle !< file handle + CHARACTER(LEN=*), INTENT(IN) :: attrib_name !< name of attribute to read + REAL*4, INTENT(OUT):: attrib_value(*) !< attribute data to be written + INTEGER*8, INTENT(IN) :: attrib_nelem !< number of elements in data array +END FUNCTION + +!> +!! \ingroup h5hut_attrib_f +!! See \ref H5ReadStepAttribFloat32 +!! \return 0 on success or error code +!< +INTEGER*8 FUNCTION h5_readstepattrib_r4 ( filehandle, attrib_name, attrib_value ) + INTEGER*8,INTENT(IN) :: filehandle !< file handle + CHARACTER(LEN=*), INTENT(IN) :: attrib_name !< name of attribute to read + REAL*4, INTENT(OUT):: attrib_value(*) !< attribute data will be read into this array +END FUNCTION + +! _ _ _ _ _ _ +! ___| |_ ___ _ __ __ _| |_| |_ _ __(_) |__ _ _| |_ ___ ___ +! / __| __/ _ \ '_ \ / _` | __| __| '__| | '_ \| | | | __/ _ \/ __| +! \__ \ || __/ |_) | | (_| | |_| |_| | | | |_) | |_| | || __/\__ \ +! |___/\__\___| .__/ \__,_|\__|\__|_| |_|_.__/ \__,_|\__\___||___/ +! |_| +! _ __ _ _ +! (_) / /__ (_)_ __ | |_ ___ __ _ ___ _ __ +! | | / / _ \ | | '_ \| __/ _ \/ _` |/ _ \ '__| +! | |/ / (_) | | | | | | || __/ (_| | __/ | +! |_/_/ \___/ |_|_| |_|\__\___|\__, |\___|_| +! |___/ + +!> +!! \ingroup h5hut_attrib_f +!! See \ref H5WriteStepAttribInt64 +!! \return 0 on success or error code +!< +INTEGER*8 FUNCTION h5_writestepattrib_i8 (filehandle, attrib_name, attrib_value, attrib_nelem) + INTEGER*8,INTENT(IN) :: filehandle !< file handle + CHARACTER(LEN=*), INTENT(IN) :: attrib_name !< name of attribute to write + INTEGER*8,INTENT(OUT):: attrib_value(*) !< attribute data to be written + INTEGER*8, INTENT(IN) :: attrib_nelem !< number of elements in data array +END FUNCTION + +!> +!! \ingroup h5hut_attrib_f +!! See \ref H5ReadStepAttribInt64 +!! \return 0 on success or error code +!< +INTEGER*8 FUNCTION h5_readstepattrib_i8 (filehandle, attrib_name, attrib_value) + INTEGER*8,INTENT(IN) :: filehandle !< file handle + CHARACTER(LEN=*), INTENT(IN) :: attrib_name !< name of attribute to read + INTEGER*8,INTENT(OUT):: attrib_value(*) !< attribute data will be read into this array +END FUNCTION + +!> +!! \ingroup h5hut_attrib_f +!! See \ref H5WriteStepAttribInt32 +!! \return 0 on success or error code +!< +INTEGER*8 FUNCTION h5_writestepattrib_i4 (filehandle, attrib_name, attrib_value, attrib_nelem) + INTEGER*8,INTENT(IN) :: filehandle !< file handle + CHARACTER(LEN=*), INTENT(IN) :: attrib_name !< name of attribute to write + INTEGER*4,INTENT(OUT):: attrib_value(*) !< attribute data to be written + INTEGER*8, INTENT(IN) :: attrib_nelem !< number of elements in data array +END FUNCTION + +!> +!! \ingroup h5hut_attrib_f +!! See \ref H5ReadStepAttribInt32 +!! \return 0 on success or error code +!< +INTEGER*8 FUNCTION h5_readstepattrib_i4 (filehandle, attrib_name, attrib_value) + INTEGER*8,INTENT(IN) :: filehandle !< file handle + CHARACTER(LEN=*), INTENT(IN) :: attrib_name !< name of attribute to read + INTEGER*4,INTENT(OUT):: attrib_value(*) !< attribute data will be read into this array +END FUNCTION diff --git a/src/Fortran/H5_attribs_F.c b/src/Fortran/H5_attribs_F.c new file mode 100644 index 0000000..5a58fd7 --- /dev/null +++ b/src/Fortran/H5_attribs_F.c @@ -0,0 +1,561 @@ + +#include +#include + +#include "h5core/h5_core.h" +#include "Underscore.h" + +#if defined(F77_SINGLE_UNDERSCORE) +#define F77NAME(a,b) a +#elif defined(F77_CRAY_UNDERSCORE) +#define F77NAME(a,b) b +#elif defined(F77_NO_UNDERSCORE) +#else +#error Error, no way to determine how to construct fortran bindings +#endif + +#if !defined(F77_NO_UNDERSCORE) + +#define h5_writefileattrib_string F77NAME ( h5_writefileattrib_string_, H5_writefileattrib_string ) +#define h5_writestepattrib_string F77NAME ( h5_writestepattrib_string_, H5_WRITESTEPATTRIB_STRING ) +#define h5_readstepattrib_string F77NAME ( h5_readstepattrib_string_, h5_READSTEPATTRIB_STRING ) +#define h5_readfileattrib_string F77NAME ( h5_readfileattrib_string_, h5_READFILEATTRIB_STRING ) + +#endif + +h5_err_t +h5_writefileattrib_string ( + h5_int64_t *const f, + const char *name, + const char *buffer, + const int l_name, + const int l_buffer + ) { + + h5_file_t *fh = h5_filehandlefor2c(f); + char *name2 = h5_strdupfor2c ( name, l_name ); + char *buffer2 = h5_strdupfor2c ( buffer, l_buffer ); + H5_API_ENTER (h5_err_t, + "f=%p, name='%s', buffer='%s', l_name=%d, l_buffer=%d", + fh, name2, buffer2, l_name, l_buffer); + + h5_err_t herr = h5_write_file_attrib ( + fh, name2, H5_STRING_T, buffer2, strlen(buffer2)+1 ); + + free ( name2 ); + free ( buffer2 ); + H5_API_RETURN(herr); +} + +h5_err_t +h5_writestepattrib_string ( + h5_int64_t *const f, + const char *name, + const char *buffer, + const int l_name, + const int l_buffer + ) { + + h5_file_t *fh = h5_filehandlefor2c(f); + char *name2 = h5_strdupfor2c ( name, l_name ); + char *buffer2 = h5_strdupfor2c ( buffer, l_buffer ); + H5_API_ENTER (h5_err_t, + "f=%p, name='%s', buffer='%s', l_name=%d, l_buffer=%d", + fh, name2, buffer2, l_name, l_buffer); + + h5_err_t herr = h5_write_step_attrib ( + fh, name2, H5_STRING_T, buffer2, strlen(buffer2)+1 ); + + free ( name2 ); + free ( buffer2 ); + H5_API_RETURN(herr); +} + +h5_err_t +h5_readfileattrib_string ( + h5_int64_t *const f, + const char *name, + char *buffer, + const int l_name, + const int l_buffer + ) { + + h5_file_t *fh = h5_filehandlefor2c(f); + char * name2 = h5_strdupfor2c ( name, l_name ); + H5_API_ENTER (h5_err_t, + "f=%p, name='%s', buffer=%p, l_name=%d, l_buffer=%d", + fh, name2, buffer, l_name, l_buffer); + + h5_err_t herr = h5_read_attrib ( + fh, fh->root_gid, name2, H5_STRING_T, buffer ); + + h5_strc2for ( buffer, l_buffer ); + + free ( name2 ); + H5_API_RETURN(herr); +} + +h5_err_t +h5_readstepeattrib_string ( + h5_int64_t *const f, + const char *name, + char *buffer, + const int l_name, + const int l_buffer + ) { + + h5_file_t *fh = h5_filehandlefor2c(f); + char * name2 = h5_strdupfor2c ( name, l_name ); + H5_API_ENTER (h5_err_t, + "f=%p, name='%s', buffer=%p, l_name=%d, l_buffer=%d", + fh, name2, buffer, l_name, l_buffer); + + h5_err_t herr = h5_read_step_attrib ( + fh, name2, H5_STRING_T, buffer ); + + h5_strc2for ( buffer, l_buffer ); + + free ( name2 ); + H5_API_RETURN(herr); +} + +#if !defined(F77_NO_UNDERSCORE) +#define h5_writefileattrib_r8 F77NAME ( \ + h5_writefileattrib_r8_, \ + H5_WRITEFILEATTRIB_R8 ) +#endif + +h5_err_t +h5_writefileattrib_r8 ( + h5_int64_t *const f, + const char *name, + const h5_float64_t *buffer, + const h5_int64_t *nelem, + const int l_name + ) { + + h5_file_t *fh = h5_filehandlefor2c(f); + char *name2 = h5_strdupfor2c ( name, l_name ); + H5_API_ENTER (h5_err_t, + "f=%p, name='%s', buffer=%p, nelem=%lld, l_name=%d", + fh, name2, buffer, (long long)*nelem, l_name); + + h5_err_t herr = h5_write_file_attrib( + fh, name2, H5_FLOAT64_T, buffer, (hsize_t)*nelem); + + free ( name2 ); + H5_API_RETURN(herr); +} + +#if !defined(F77_NO_UNDERSCORE) +#define h5_readfileattrib_r8 F77NAME ( \ + h5_readfileattrib_r8_, \ + H5_READFILEATTRIB_R8 ) +#endif + +h5_err_t +h5bl_readfileattrib_r8 ( + h5_int64_t *const f, + const char *name, + h5_float64_t *buffer, + const int l_name + ) { + + h5_file_t *fh = h5_filehandlefor2c(f); + char *name2 = h5_strdupfor2c ( name, l_name ); + H5_API_ENTER (h5_err_t, + "f=%p, name='%s', buffer=%p, l_name=%d", + fh, name2, buffer, l_name); + + h5_err_t herr = h5_read_attrib( + fh, fh->root_gid, name2, H5_FLOAT64_T, buffer); + + free ( name2 ); + H5_API_RETURN(herr); +} + +#if !defined(F77_NO_UNDERSCORE) +#define h5_writefileattrib_r4 F77NAME ( \ + h5_writefileattrib_r4_, \ + H5_WRITEFILEATTRIB_R4 ) +#endif + +h5_err_t +h5_writefileattrib_r4 ( + h5_int64_t *const f, + const char *name, + const h5_float32_t *buffer, + const h5_int64_t *nelem, + const int l_name + ) { + + h5_file_t *fh = h5_filehandlefor2c(f); + char *name2 = h5_strdupfor2c ( name, l_name ); + H5_API_ENTER (h5_err_t, + "f=%p, name='%s', buffer=%p, nelem=%lld, l_name=%d", + fh, name2, buffer, (long long)*nelem, l_name); + + h5_err_t herr = h5_write_file_attrib( + fh, name2, + H5_FLOAT32_T, buffer, (hsize_t)*nelem); + + free ( name2 ); + H5_API_RETURN(herr); +} + +#if !defined(F77_NO_UNDERSCORE) +#define h5_readfileattrib_r4 F77NAME ( \ + h5_readfileattrib_r4_, \ + H5_READFILEATTRIB_R4 ) +#endif + +h5_err_t +h5bl_readfileattrib_r4 ( + h5_int64_t *const f, + const char *name, + h5_float64_t *buffer, + const int l_name + ) { + + h5_file_t *fh = h5_filehandlefor2c(f); + char *name2 = h5_strdupfor2c ( name, l_name ); + H5_API_ENTER (h5_err_t, + "f=%p, name='%s', buffer=%p, l_name=%d", + fh, name2, buffer, l_name); + + h5_err_t herr = h5_read_attrib( + fh, fh->root_gid, name2, H5_FLOAT32_T, buffer); + + free ( name2 ); + H5_API_RETURN(herr); +} + +#if !defined(F77_NO_UNDERSCORE) +#define h5_writefileattrib_i8 F77NAME ( \ + h5_writefileattrib_i8_, \ + H5_WRITEFILEATTRIB_I8 ) +#endif + +h5_err_t +h5_writefileattrib_i8 ( + h5_int64_t *const f, + const char *name, + const h5_int64_t *buffer, + const h5_int64_t *nelem, + const int l_name + ) { + + h5_file_t *fh = h5_filehandlefor2c(f); + char *name2 = h5_strdupfor2c ( name, l_name ); + H5_API_ENTER (h5_err_t, + "f=%p, name='%s', buffer=%p, nelem=%lld, l_name=%d", + fh, name2, buffer, (long long)*nelem, l_name); + + h5_err_t herr = h5_write_file_attrib( + fh, name2, H5_INT64_T, buffer, (hsize_t)*nelem); + + free ( name2 ); + H5_API_RETURN(herr); +} + +#if !defined(F77_NO_UNDERSCORE) +#define h5_readfileattrib_i8 F77NAME ( \ + h5_readfileattrib_i8_, \ + H5_READFILEATTRIB_I8 ) +#endif + +h5_err_t +h5bl_readfileattrib_i8 ( + h5_int64_t *const f, + const char *name, + h5_float64_t *buffer, + const int l_name + ) { + + h5_file_t *fh = h5_filehandlefor2c(f); + char *name2 = h5_strdupfor2c ( name, l_name ); + H5_API_ENTER (h5_err_t, + "f=%p, name='%s', buffer=%p, l_name=%d", + fh, name2, buffer, l_name); + + h5_err_t herr = h5_read_attrib( + fh, fh->root_gid, name2, H5_INT64_T, buffer); + + free ( name2 ); + H5_API_RETURN(herr); +} + +#if !defined(F77_NO_UNDERSCORE) +#define h5_writefileattrib_i4 F77NAME ( \ + h5_writefileattrib_i4_, \ + H5_WRITEFILEATTRIB_I4 ) +#endif + +h5_err_t +h5_writefileattrib_i4 ( + h5_int64_t *const f, + const char *name, + const h5_int32_t *buffer, + const h5_int64_t *nelem, + const int l_name + ) { + + h5_file_t *fh = h5_filehandlefor2c(f); + char *name2 = h5_strdupfor2c ( name, l_name ); + H5_API_ENTER (h5_err_t, + "f=%p, name='%s', buffer=%p, nelem=%lld, l_name=%d", + fh, name2, buffer, (long long)*nelem, l_name); + + h5_err_t herr = h5_write_file_attrib( + fh, name2, H5_INT32_T, buffer, (hsize_t)*nelem); + + free ( name2 ); + H5_API_RETURN(herr); +} + +#if !defined(F77_NO_UNDERSCORE) +#define h5_readfileattrib_i4 F77NAME ( \ + h5_readfileattrib_i4_, \ + H5_READFILEATTRIB_I4 ) +#endif + +h5_err_t +h5bl_readfileattrib_i4 ( + h5_int64_t *const f, + const char *name, + h5_float64_t *buffer, + const int l_name + ) { + + h5_file_t *fh = h5_filehandlefor2c(f); + char *name2 = h5_strdupfor2c ( name, l_name ); + H5_API_ENTER (h5_err_t, + "f=%p, name='%s', buffer=%p, l_name=%d", + fh, name2, buffer, l_name); + + h5_err_t herr = h5_read_attrib( + fh, fh->root_gid, name2, H5_INT32_T, buffer); + + free ( name2 ); + H5_API_RETURN(herr); +} + +#if !defined(F77_NO_UNDERSCORE) +#define h5_writestepattrib_r8 F77NAME ( \ + h5_writestepattrib_r8_, \ + H5_WRITESTEPATTRIB_R8 ) +#endif + +h5_err_t +h5_writestepattrib_r8 ( + h5_int64_t *const f, + const char *name, + const h5_float64_t *buffer, + const h5_int64_t *nelem, + const int l_name + ) { + + h5_file_t *fh = h5_filehandlefor2c(f); + char *name2 = h5_strdupfor2c ( name, l_name ); + H5_API_ENTER (h5_err_t, + "f=%p, name='%s', buffer=%p, nelem=%lld, l_name=%d", + fh, name2, buffer, (long long)*nelem, l_name); + + h5_err_t herr = h5_write_step_attrib( + fh, name2, H5_FLOAT64_T, buffer, (hsize_t)*nelem); + + free ( name2 ); + H5_API_RETURN(herr); +} + +#if !defined(F77_NO_UNDERSCORE) +#define h5_readstepattrib_r8 F77NAME ( \ + h5_readstepattrib_r8_, \ + H5_READSTEPATTRIB_R8 ) +#endif + +h5_err_t +h5bl_readstepattrib_r8 ( + h5_int64_t *const f, + const char *name, + h5_float64_t *buffer, + const int l_name + ) { + + h5_file_t *fh = h5_filehandlefor2c(f); + char *name2 = h5_strdupfor2c ( name, l_name ); + H5_API_ENTER (h5_err_t, + "f=%p, name='%s', buffer=%p, l_name=%d", + fh, name2, buffer, l_name); + + h5_err_t herr = h5_read_step_attrib( + fh, name2, H5_FLOAT64_T, buffer); + + free ( name2 ); + H5_API_RETURN(herr); +} + +#if !defined(F77_NO_UNDERSCORE) +#define h5_writestepattrib_r4 F77NAME ( \ + h5_writestepattrib_r4_, \ + H5_WRITESTEPATTRIB_R4 ) +#endif + +h5_err_t +h5_writestepattrib_r4 ( + h5_int64_t *const f, + const char *name, + const h5_float32_t *buffer, + const h5_int64_t *nelem, + const int l_name + ) { + + h5_file_t *fh = h5_filehandlefor2c(f); + char *name2 = h5_strdupfor2c ( name, l_name ); + H5_API_ENTER (h5_err_t, + "f=%p, name='%s', buffer=%p, nelem=%lld, l_name=%d", + fh, name2, buffer, (long long)*nelem, l_name); + + h5_err_t herr = h5_write_step_attrib( + fh, name2, H5_FLOAT32_T, buffer, (hsize_t)*nelem); + + free ( name2 ); + H5_API_RETURN(herr); +} + +#if !defined(F77_NO_UNDERSCORE) +#define h5_readstepattrib_r4 F77NAME ( \ + h5_readstepattrib_r4_, \ + H5_READSTEPATTRIB_R4 ) +#endif + +h5_err_t +h5bl_readstepattrib_r4 ( + h5_int64_t *const f, + const char *name, + h5_float64_t *buffer, + const int l_name + ) { + + h5_file_t *fh = h5_filehandlefor2c(f); + char *name2 = h5_strdupfor2c ( name, l_name ); + H5_API_ENTER (h5_err_t, + "f=%p, name='%s', buffer=%p, l_name=%d", + fh, name2, buffer, l_name); + + h5_err_t herr = h5_read_step_attrib( + fh, name2, H5_FLOAT32_T, buffer); + + free ( name2 ); + H5_API_RETURN(herr); +} + +#if !defined(F77_NO_UNDERSCORE) +#define h5_writestepattrib_i8 F77NAME ( \ + h5_writestepattrib_i8_, \ + H5_WRITESTEPATTRIB_I8 ) +#endif + +h5_err_t +h5_writestepattrib_i8 ( + h5_int64_t *const f, + const char *name, + const h5_int64_t *buffer, + const h5_int64_t *nelem, + const int l_name + ) { + + h5_file_t *fh = h5_filehandlefor2c(f); + char *name2 = h5_strdupfor2c ( name, l_name ); + H5_API_ENTER (h5_err_t, + "f=%p, name='%s', buffer=%p, nelem=%lld, l_name=%d", + fh, name2, buffer, (long long)*nelem, l_name); + + h5_err_t herr = h5_write_step_attrib( + fh, name2, H5_INT64_T, buffer, (hsize_t)*nelem); + + free ( name2 ); + H5_API_RETURN(herr); +} + +#if !defined(F77_NO_UNDERSCORE) +#define h5_readstepattrib_i8 F77NAME ( \ + h5_readstepattrib_i8_, \ + H5_READSTEPATTRIB_I8 ) +#endif + +h5_err_t +h5bl_readstepattrib_i8 ( + h5_int64_t *const f, + const char *name, + h5_float64_t *buffer, + const int l_name + ) { + + h5_file_t *fh = h5_filehandlefor2c(f); + char *name2 = h5_strdupfor2c ( name, l_name ); + H5_API_ENTER (h5_err_t, + "f=%p, name='%s', buffer=%p, l_name=%d", + fh, name2, buffer, l_name); + + h5_err_t herr = h5_read_step_attrib( + fh, name2, H5_INT64_T, buffer); + + free ( name2 ); + H5_API_RETURN(herr); +} + +#if !defined(F77_NO_UNDERSCORE) +#define h5_writestepattrib_i4 F77NAME ( \ + h5_writestepattrib_i4_, \ + H5_WRITESTEPATTRIB_I4 ) +#endif + +h5_err_t +h5_writestepattrib_i4 ( + h5_int64_t *const f, + const char *name, + const h5_int32_t *buffer, + const h5_int64_t *nelem, + const int l_name + ) { + + h5_file_t *fh = h5_filehandlefor2c(f); + char *name2 = h5_strdupfor2c ( name, l_name ); + H5_API_ENTER (h5_err_t, + "f=%p, name='%s', buffer=%p, nelem=%lld, l_name=%d", + fh, name2, buffer, (long long)*nelem, l_name); + + h5_err_t herr = h5_write_step_attrib( + fh, name2, H5_INT32_T, buffer, (hsize_t)*nelem); + + free ( name2 ); + H5_API_RETURN(herr); +} + +#if !defined(F77_NO_UNDERSCORE) +#define h5_readstepattrib_i4 F77NAME ( \ + h5_readstepattrib_i4_, \ + H5_READSTEPATTRIB_I4 ) +#endif + +h5_err_t +h5bl_readstepattrib_i4 ( + h5_int64_t *const f, + const char *name, + h5_float64_t *buffer, + const int l_name + ) { + + h5_file_t *fh = h5_filehandlefor2c(f); + char *name2 = h5_strdupfor2c ( name, l_name ); + H5_API_ENTER (h5_err_t, + "f=%p, name='%s', buffer=%p, l_name=%d", + fh, name2, buffer, l_name); + + h5_err_t herr = h5_read_step_attrib( + fh, name2, H5_INT32_T, buffer); + + free ( name2 ); + H5_API_RETURN(herr); +} diff --git a/src/Fortran/H5_constF.f90 b/src/Fortran/H5_constF.f90 new file mode 100644 index 0000000..5ccf48a --- /dev/null +++ b/src/Fortran/H5_constF.f90 @@ -0,0 +1,61 @@ + +INTEGER*8 :: H5_STRING_T +INTEGER*8 :: H5_INT16_T +INTEGER*8 :: H5_INT32_T +INTEGER*8 :: H5_INT64_t +INTEGER*8 :: H5_FLOAT32_T +INTEGER*8 :: H5_FLOAT64_T + +PARAMETER (H5_STRING_T = 1) +PARAMETER (H5_INT16_T = 2) +PARAMETER (H5_INT32_T = 3) +PARAMETER (H5_INT64_T = 4) +PARAMETER (H5_FLOAT32_T = 5) +PARAMETER (H5_FLOAT64_T = 6) + +INTEGER*8 :: H5_MAX_NAME_LEN +PARAMETER (H5_MAX_NAME_LEN = 64) + +INTEGER*8 :: H5_SUCCESS +INTEGER*8 :: H5_OK +INTEGER*8 :: H5_NOK +INTEGER*8 :: H5_FAILURE +INTEGER*8 :: H5_ERR_BADF +INTEGER*8 :: H5_ERR_NOMEM +INTEGER*8 :: H5_ERR_INVAL +INTEGER*8 :: H5_ERR_BADFD + +INTEGER*8 :: H5_ERR_LAYOUT +INTEGER*8 :: H5_ERR_NOENTRY + +INTEGER*8 :: H5_ERR_MPI +INTEGER*8 :: H5_ERR_HDF5 +INTEGER*8 :: H5_ERR_H5 +INTEGER*8 :: H5_ERR_H5PART +INTEGER*8 :: H5_ERR_H5BLOCK +INTEGER*8 :: H5_ERR_H5FED + +INTEGER*8 :: H5_ERR_INTERNAL +INTEGER*8 :: H5_ERR_NOT_IMPLEMENTED + +PARAMETER (H5_SUCCESS = 0) +PARAMETER (H5_OK = H5_SUCCESS) +PARAMETER (H5_NOK = -1) +PARAMETER (H5_FAILURE = -2) +PARAMETER (H5_ERR_BADF = -9) +PARAMETER (H5_ERR_NOMEM = -12) +PARAMETER (H5_ERR_INVAL = -22) +PARAMETER (H5_ERR_BADFD = -77) + +PARAMETER (H5_ERR_LAYOUT = -100) +PARAMETER (H5_ERR_NOENTRY = -101) + +PARAMETER (H5_ERR_MPI = -201) +PARAMETER (H5_ERR_HDF5 = -202) +PARAMETER (H5_ERR_H5 = -203) +PARAMETER (H5_ERR_H5PART = -204) +PARAMETER (H5_ERR_H5BLOCK = -205) +PARAMETER (H5_ERR_H5FED = -206) + +PARAMETER (H5_ERR_INTERNAL = -253) +PARAMETER (H5_ERR_NOT_IMPLEMENTED = -254) diff --git a/src/Fortran/Makefile.am b/src/Fortran/Makefile.am new file mode 100644 index 0000000..a18059d --- /dev/null +++ b/src/Fortran/Makefile.am @@ -0,0 +1,59 @@ +# src/Fortran level Makefile.am + +OBJEXT=o + +AM_CPPFLAGS = -I../include @AM_CPPFLAGS@ + +F90_FILES = H5F.f90 \ + H5_constF.f90 \ + H5_attribsF.f90 \ + H5PartF.f90 \ + H5Part_ioF.f90 \ + H5BlockF.f90 \ + H5Block_attribsF.f90 \ + H5Block_ioF.f90 + +EXTRA_HEADERS = + +# Extra files that I wish to include in the dist tar ball. +EXTRA_DIST = TestUnderscoreC.c \ + TestUnderscore.f \ + $(F90_FILES) + +# Files that I don't want to include in the dist tar ball +nodist_include_HEADERS = ../include/H5hutF.h + +# What to build... Will be determined by configure script. +lib_LTLIBRARIES = @LIB_FORTRAN@ + +# Listing of all possible targets that I may build. +EXTRA_LTLIBRARIES = libH5hutF.la + +include_HEADERS = \ + ../include/H5hutF.h + +libH5hutF_la_SOURCES = \ + H5.c \ + H5_attribs.c \ + H5Part.c \ + H5Part_io.c \ + H5Block.c \ + H5Block_attribs.c \ + H5Block_io.c + +libH5hutF_la_DEPENDENCIES = + +libH5hutF_la_LDFLAGS = -version-info 2:0:0 -rpath '$(libdir)' + +../include/H5hutF.h: $(F90_FILES) + awk '/INTEGER\*8 :: /{print "\t" $$0}' $^ >$@ + awk '/PARAMETER /{print "\t" $$0}' $^ >> $@ + awk '/INTEGER\*8 FUNCTION/{print "\t" $$1 " " $$3}' $^ >>$@ + +all-local: ../include/H5hutF.h + $(INSTALL) -m644 .libs/libH5hutF.a ../lib + +clean: clean-am + +clean-local: + $(RM) -f *~ diff --git a/src/Fortran/TestUnderscore.f b/src/Fortran/TestUnderscore.f new file mode 100755 index 0000000..4de2c6e --- /dev/null +++ b/src/Fortran/TestUnderscore.f @@ -0,0 +1,12 @@ +c ============== +c +c Simple Fortran program works in conjunction with C program +c to determine how many underscores are generated +c by the fortran compiler +c +c ============== + + program TestUnderscoreF + implicit none + call FindUnderscores + end diff --git a/src/Fortran/TestUnderscoreC.c b/src/Fortran/TestUnderscoreC.c new file mode 100755 index 0000000..8f38296 --- /dev/null +++ b/src/Fortran/TestUnderscoreC.c @@ -0,0 +1,36 @@ +#include + +void findunderscores(void){ + printf("#ifndef F77_NO_UNDERSCORE\n"); + printf("#define F77_NO_UNDERSCORE\n"); + printf("#endif\n"); + printf("#ifndef F77_NO_CAPS\n"); + printf("#define F77_NO_CAPS\n"); + printf("#endif\n"); +} + +void FindUnderscores(void){ + printf("#ifndef F77_NO_UNDERSCORE\n"); + printf("#define F77_NO_UNDERSCORE\n"); + printf("#endif\n"); +} + +void FindUnderscores_(void){ + printf("#ifndef F77_SINGLE_UNDERSCORE\n"); + printf("#define F77_SINGLE_UNDERSCORE\n"); + printf("#endif\n"); +} + +void findunderscores_(void){ + printf("#ifndef F77_SINGLE_UNDERSCORE\n"); + printf("#define F77_SINGLE_UNDERSCORE\n"); + printf("#endif\n"); + printf("#ifndef F77_NO_CAPS\n"); + printf("#define F77_NO_CAPS\n"); + printf("#endif\n"); +} +void FINDUNDERSCORES(void){ + printf("#ifndef F77_CRAY_UNDERSCORE\n"); + printf("#define F77_CRAY_UNDERSCORE\n"); + printf("#endif\n"); +} diff --git a/src/Fortran/h5_private.h b/src/Fortran/h5_private.h new file mode 100644 index 0000000..cab385a --- /dev/null +++ b/src/Fortran/h5_private.h @@ -0,0 +1,83 @@ +/* + Copyright (c) 2006-2012, The Regents of the University of California, + through Lawrence Berkeley National Laboratory (subject to receipt of any + required approvals from the U.S. Dept. of Energy) and the Paul Scherrer + Institut (Switzerland). All rights reserved. + + License: see file COPYING in top level of source distribution. +*/ + +#ifndef __FORTRAN_H5_PRIVATE_H +#define __FORTRAN_H5_PRIVATE_H + +#include +#include + +#include "h5core/h5.h" + +#include "Underscore.h" + +#if defined(F77_NO_UNDERSCORE) +#define F77_NAME(a,b,c) a +#elif defined(F77_SINGLE_UNDERSCORE) +#define F77_NAME(a,b,c) b +#elif defined(F77_CRAY_UNDERSCORE) +#define F77_NAME(a,b,c) c +#else +#error Error, no way to determine how to construct fortran bindings +#endif + +#define convert_type2for(type) \ + if (*type == H5_STRING_T) { \ + *type = 1; \ + } else if (*type == H5_INT16_T) { \ + *type = 2; \ + } else if (*type == H5_INT32_T) { \ + *type = 3; \ + } else if (*type == H5_INT64_T) { \ + *type = 4; \ + } else if (*type == H5_FLOAT32_T) { \ + *type = 5; \ + } else if (*type == H5_FLOAT64_T) { \ + *type = 6; \ + } else { \ + H5_API_LEAVE ( \ + h5_error ( \ + H5_ERR_H5, \ + "Unknown attribute type")); \ + } + +static inline char* +h5_strdupfor2c ( + const char* s, + const ssize_t len + ) { + // :FIXME: error handling + char* dup = (char*)malloc (len + 1); + strncpy (dup, s, len); + dup[len] = '\0'; + for (int i = len-1; i >= 0; i--) { + if (dup[i] == ' ') dup[i] = '\0'; + else break; + } + return dup; +} + +static inline char* +h5_strc2for ( + char* const str, + const ssize_t l_str + ) { + size_t len = strlen (str); + memset (str+len, ' ', l_str-len); + + return str; +} + +static inline h5_file_t +h5_filehandlefor2c ( + const h5_int64_t* ptr + ) { + return (h5_file_t)*ptr; +} +#endif diff --git a/src/Makefile.am b/src/Makefile.am new file mode 100644 index 0000000..043e75d --- /dev/null +++ b/src/Makefile.am @@ -0,0 +1,4 @@ +# test level Makefile.am + +SUBDIRS = h5core @BINDINGS@ + diff --git a/src/h5core/Makefile.am b/src/h5core/Makefile.am new file mode 100644 index 0000000..e07c081 --- /dev/null +++ b/src/h5core/Makefile.am @@ -0,0 +1,114 @@ +# src level Makefile.am + +OBJEXT=o + +AM_CPPFLAGS = -I../include @AM_CPPFLAGS@ + +EXTRA_HEADERS = \ + h5_attribs_private.h \ + h5_debug_private.h \ + h5_errorhandling_private.h \ + h5_fcmp_private.h \ + h5_hdf5_private.h \ + h5_hsearch_private.h \ + h5_lustre_private.h \ + h5_maps_private.h \ + h5_model_private.h \ + h5_mpi_private.h \ + h5_private.h \ + h5_qsort_private.h \ + h5_readwrite_private.h \ + h5_syscall_private.h \ + h5_types_private.h \ + h5_va_macros.h \ + h5b_model_private.h \ + h5b_readwrite_private.h \ + h5b_types_private.h \ + h5t_access_private.h \ + h5t_adjacencies_private.h \ + h5t_core_private.h \ + h5t_errorhandling_private.h \ + h5t_map_private.h \ + h5t_model_private.h \ + h5t_octree_private.h \ + h5t_readwrite_private.h \ + h5t_ref_elements_private.h \ + h5t_retrieve_private.h \ + h5t_store_private.h \ + h5t_tags_private.h \ + h5t_types_private.h \ + h5u_readwrite_private.h \ + h5u_types_private.h + +# Extra files that I wish to include in the dist tar ball. +EXTRA_DIST = $(EXTRA_HEADERS) + +# What to build... Will be determined by configure script. +lib_LTLIBRARIES = libH5hut.la + +# Listing of sources +libH5hut_la_SOURCES = \ + h5_attach.c \ + h5_attribs.c \ + h5_errorhandling.c \ + h5_fcmp.c \ + h5_init.c \ + h5_hdf5.c \ + h5_hsearch.c \ + h5_maps.c \ + h5_model.c \ + h5_mpi.c \ + h5_openclose.c \ + h5_qsort.c \ + h5_qsort_r.c \ + h5_readwrite.c \ + h5_syscall.c \ + h5_lustre.c \ + h5u_readwrite.c \ + h5b_readwrite.c \ + h5u_model.c \ + h5b_model.c \ + h5b_attribs.c + +if ENABLE_EXPERIMENTAL +libH5hut_la_SOURCES += \ + h5t_access_tetm.c \ + h5t_access_trim.c \ + h5t_adjacencies.c \ + h5t_adjacencies_tetm.c \ + h5t_adjacencies_trim.c \ + h5t_core.c \ + h5t_core_trim.c \ + h5t_core_tetm.c \ + h5t_map.c \ + h5t_model.c \ + h5t_model_tetm.c \ + h5t_model_trim.c \ + h5t_octree.c \ + h5t_readwrite.c \ + h5t_readwrite_trim.c \ + h5t_readwrite_tetm.c \ + h5t_ref_elements.c \ + h5t_retrieve.c \ + h5t_retrieve_tetm.c \ + h5t_retrieve_trim.c \ + h5t_store.c \ + h5t_store_tetm.c \ + h5t_store_trim.c \ + h5t_tags.c +endif + +libH5hut_la_DEPENDENCIES = $(EXTRA_HEADERS) + +libH5hut_la_LDFLAGS = -version-info 2:0:0 + +all-local: + $(INSTALL) -m644 .libs/libH5hut.a ../lib + +install-exec-local: + @$(INSTALL) -d $(DESTDIR)$(includedir)/h5core + @$(INSTALL) -m644 ../include/h5core/*.h $(DESTDIR)$(includedir)/h5core/ + +clean-local: + $(RM) -f ../lib/libH5hut.* + $(RM) -f *~ diff --git a/src/h5core/h5_attach.c b/src/h5core/h5_attach.c new file mode 100644 index 0000000..486075c --- /dev/null +++ b/src/h5core/h5_attach.c @@ -0,0 +1,336 @@ +/* + Copyright (c) 2006-2013, The Regents of the University of California, + through Lawrence Berkeley National Laboratory (subject to receipt of any + required approvals from the U.S. Dept. of Energy) and the Paul Scherrer + Institut (Switzerland). All rights reserved. + + License: see file COPYING in top level of source distribution. +*/ + +#include "h5core/h5.h" +#include "h5_types_private.h" + +#include "h5_errorhandling_private.h" +#include "h5_hdf5_private.h" +#include "h5_model_private.h" +#include "h5core/h5_syscall.h" +#include "h5_va_macros.h" + +#include +#include +#include +#include +#include + +h5_err_t +h5_add_attachment ( + const h5_file_t f_, + const char* const fname + ) { + h5_file_p f = (h5_file_p)f_; + H5_CORE_API_ENTER (h5_err_t, "f=%p, fname='%s'", f, fname); + // allowed file modes: O_RDWR, O_WRONLY; O_APPEND + if (f->props->mode == H5_O_RDONLY) { + H5_PRIV_FUNC_LEAVE ( + h5priv_handle_file_mode_error (f->props->mode)); + } + + struct stat st; + if (stat (fname, &st) < 0) { + H5_CORE_API_LEAVE ( + h5_error ( + H5_ERR_HDF5, + "Cannot stat file '%s'", + fname)); + } + hsize_t fsize = st.st_size; + hsize_t write_length; + char* buf = NULL; + if (f->myproc == 0) { + TRY (buf = h5_calloc (1, fsize)); + write_length = fsize; + int fd; + if ((fd = open (fname, O_RDONLY)) < 0) { + H5_CORE_API_LEAVE ( + h5_error ( + H5_ERR_HDF5, + "Cannot open file '%s' for reading", + fname)); + } + again: + if (read (fd, buf, fsize) < 0) { + if (errno == EINTR) { + goto again; + } else { + H5_CORE_API_LEAVE ( + h5_error ( + H5_ERR_HDF5, + "Cannot read file '%s'", + fname)); + } + } + if (close (fd) < 0) { + H5_CORE_API_LEAVE ( + h5_error ( + H5_ERR_HDF5, + "Cannot close file '%s'", + fname)); + } + + } else { + TRY (buf = h5_calloc (1, 1)); + write_length = 0; + } + + hid_t loc_id; + TRY (loc_id = h5priv_open_group (1, f->file, H5_ATTACHMENT)); + h5_err_t exists; + TRY (exists = hdf5_link_exists (loc_id, fname)); + if (exists && (f->props->mode == H5_O_RDWR || f->props->mode == H5_O_WRONLY)) { + // remove + } else if (exists && f->props->mode == H5_O_APPEND) { + H5_PRIV_FUNC_LEAVE ( + h5priv_handle_file_mode_error (f->props->mode)); + } + hid_t diskspace_id; + TRY (diskspace_id = hdf5_create_dataspace (1, &fsize, &fsize)); + hid_t dataset_id; + TRY (dataset_id = hdf5_create_dataset (loc_id, + fname, + H5T_NATIVE_CHAR, + diskspace_id, + H5P_DEFAULT)); + hsize_t start = 0; + TRY (hdf5_select_hyperslab_of_dataspace ( + diskspace_id, + H5S_SELECT_SET, + &start, + NULL, + &write_length, + NULL)); + + hid_t memspace_id; + hsize_t max = H5S_UNLIMITED; + TRY (memspace_id = hdf5_create_dataspace (1, &write_length, &max)); + TRY (hdf5_write_dataset (dataset_id, + H5T_NATIVE_CHAR, + memspace_id, + diskspace_id, + f->props->xfer_prop, + buf)); + + TRY (hdf5_close_dataspace (diskspace_id)); + TRY (hdf5_close_dataspace (memspace_id)); + TRY (hdf5_close_dataset (dataset_id)); + TRY (hdf5_close_group (loc_id)); + + TRY (h5_free (buf)); + + H5_CORE_API_RETURN (H5_SUCCESS); +} + + + +static inline hid_t +open_attachments ( + const h5_file_p f + ) { + h5_err_t exists = hdf5_link_exists (f->file, H5_ATTACHMENT); + if (exists > 0) { + return hdf5_open_group (f->file, H5_ATTACHMENT); + } else if (exists == 0) { + return h5_warn ("No attachment group in file"); + } + return exists; +} + +h5_ssize_t +h5_get_num_attachments ( + const h5_file_t f_ + ) { + h5_file_p f = (h5_file_p)f_; + H5_CORE_API_ENTER (h5_ssize_t, "f=%p", f); + h5_ssize_t num = 0; + hid_t group_id; + TRY (group_id = open_attachments (f)); + if (group_id < 0) { + H5_CORE_API_LEAVE (0); + } + TRY (num = hdf5_get_num_datasets (group_id)); + TRY (hdf5_close_group (group_id)); + H5_CORE_API_RETURN (num); +} + +h5_err_t +h5_get_attachment_info_by_idx ( + const h5_file_t f_, + const h5_size_t idx, // IN + char* const fname, // OUT + h5_size_t len_fname, // IN + h5_size_t* const fsize // OUT + ) { + h5_file_p f = (h5_file_p)f_; + H5_CORE_API_ENTER (h5_err_t, + "f=%p, idx=%llu, fname=%s, len_fname=%llu, fsize=%p", + f, (unsigned long long)idx, fname, (unsigned long long)len_fname, + fsize); + hid_t loc_id; + TRY (loc_id = open_attachments (f)); + if (loc_id < 0) { // no attachment group in file + H5_CORE_API_LEAVE (0); + } + TRY (hdf5_get_name_of_dataset_by_idx ( + loc_id, + idx, + fname, len_fname)); + + if (fsize) { + // get number of elements, do not change value on error + h5_ssize_t ssize; + TRY (ssize = hdf5_get_npoints_of_dataset_by_name (loc_id, fname)); + *fsize = ssize; + } + TRY (hdf5_close_group (loc_id)); + H5_CORE_API_RETURN (H5_SUCCESS); +} + +h5_err_t +h5_get_attachment_info_by_name ( + const h5_file_t f_, + const char* const fname, // IN + h5_size_t* const fsize // OUT + ) { + h5_file_p f = (h5_file_p)f_; + H5_CORE_API_ENTER (h5_err_t, "f=%p, fname='%s', fsize=%p", f, fname, fsize); + + hid_t loc_id; + TRY (loc_id = open_attachments (f)); + if (loc_id < 0) { + H5_CORE_API_LEAVE (H5_NOK); + } + if (fsize) { + // get number of elements, do not change value on error + h5_ssize_t ssize; + TRY (ssize = hdf5_get_npoints_of_dataset_by_name (loc_id, fname)); + *fsize = ssize; + } + TRY (hdf5_close_group (loc_id)); + H5_CORE_API_RETURN (H5_SUCCESS); +} + +h5_err_t +h5_get_attachment ( + const h5_file_t f_, + const char* const fname + ) { + h5_file_p f = (h5_file_p)f_; + H5_CORE_API_ENTER (h5_err_t, "f=%p, fname='%s'", f, fname); + // allowed modes: O_RDWR, O_RDONLY; O_APPEND + // forbidden modes: O_WRONLY + if (f->props->mode == H5_O_WRONLY) { + H5_PRIV_FUNC_LEAVE ( + h5priv_handle_file_mode_error (f->props->mode)); + } + + hid_t loc_id; + TRY (loc_id = hdf5_open_group (f->file, H5_ATTACHMENT)); + h5_err_t exists; + TRY (exists = hdf5_link_exists (loc_id, fname)); + if (f->props->mode == H5_O_WRONLY) { + H5_PRIV_FUNC_LEAVE ( + h5priv_handle_file_mode_error (f->props->mode)); + } else if (!exists) { + H5_PRIV_FUNC_LEAVE ( + h5_error ( + H5_ERR_H5, + "Attachment '%s' doesn't exist", fname)); + } + + // read dataset + hid_t dataset_id, diskspace_id; + h5_ssize_t fsize; + TRY (dataset_id = hdf5_open_dataset (loc_id, fname)); + TRY (diskspace_id = hdf5_get_dataset_space (dataset_id)); + TRY (fsize = hdf5_get_npoints_of_dataspace (diskspace_id)); + + hsize_t read_length; + char* buf = NULL; + if (f->myproc == 0) { + buf = malloc (fsize); + read_length = fsize; + + } else { + buf = malloc (1); + read_length = 0; + } + + hsize_t start = 0; + TRY (hdf5_select_hyperslab_of_dataspace ( + diskspace_id, + H5S_SELECT_SET, + &start, + NULL, + &read_length, + NULL)); + + hid_t memspace_id; + hsize_t max = H5S_UNLIMITED; + TRY (memspace_id = hdf5_create_dataspace (1, &read_length, &max)); + TRY (hdf5_read_dataset (dataset_id, + H5T_NATIVE_CHAR, + memspace_id, + diskspace_id, + f->props->xfer_prop, + buf)); + + TRY (hdf5_close_dataspace (diskspace_id)); + TRY (hdf5_close_dataspace (memspace_id)); + TRY (hdf5_close_dataset (dataset_id)); + TRY (hdf5_close_group (loc_id)); + + // write file + if (f->myproc == 0) { + int fd; + if ((fd = open (fname, O_WRONLY|O_CREAT|O_TRUNC, 0600)) < 0) { + H5_CORE_API_LEAVE ( + h5_error ( + H5_ERR_H5, + "Error opening file '%s': %s", + fname, strerror(errno))); + } + if (write (fd, buf, fsize) != fsize) { + H5_CORE_API_LEAVE ( + h5_error ( + H5_ERR_H5, + "Error writing to file '%s': %s", + fname, strerror(errno))); + } + if (close (fd) < 0) { + H5_CORE_API_LEAVE ( + h5_error ( + H5_ERR_H5, + "Error closing file '%s': %s", + fname, strerror(errno))); + } + } + TRY (h5_free (buf)); + + H5_CORE_API_RETURN (H5_SUCCESS); +} + +h5_err_t +h5_delete_attachment ( + const h5_file_t f_, + const char* const fname + ) { + h5_file_p f = (h5_file_p)f_; + H5_CORE_API_ENTER (h5_err_t, "f=%p, fname='%s'", f, fname); + hid_t group_id; + TRY (group_id = open_attachments (f)); + if (group_id < 0) { + H5_CORE_API_LEAVE (H5_NOK); + } + TRY (hdf5_delete_link (group_id, fname, H5P_DEFAULT)); + TRY (hdf5_close_group (group_id)); + H5_CORE_API_RETURN (H5_SUCCESS); +} diff --git a/src/h5core/h5_attribs.c b/src/h5core/h5_attribs.c new file mode 100644 index 0000000..37a961a --- /dev/null +++ b/src/h5core/h5_attribs.c @@ -0,0 +1,351 @@ +/* + Copyright (c) 2006-2013, The Regents of the University of California, + through Lawrence Berkeley National Laboratory (subject to receipt of any + required approvals from the U.S. Dept. of Energy) and the Paul Scherrer + Institut (Switzerland). All rights reserved. + + License: see file COPYING in top level of source distribution. +*/ + +#include "h5core/h5.h" +#include "h5_types_private.h" + +#include "h5_private.h" +#include "h5_readwrite_private.h" +#include "h5_hdf5_private.h" + +h5_err_t +h5priv_read_attrib ( + const hid_t id, /*!< HDF5 object ID */ + const char* attrib_name, /*!< name of HDF5 attribute to read */ + const hid_t attrib_type, /*!< HDF5 type of attribute */ + void* const attrib_value /*!< OUT: attribute value */ + ) { + H5_PRIV_API_ENTER (h5_err_t, + "id=%d, attrib_name='%s', attrib_type=%d, attrib_value=%p", + id, + attrib_name, + attrib_type, + attrib_value); + hid_t attrib_id; + hid_t type_id; + hid_t space_id; + TRY (attrib_id = hdf5_open_attribute (id, attrib_name)); + TRY (type_id = hdf5_get_attribute_type (attrib_id)); + + hid_t h5type_id; + TRY (h5type_id = h5priv_normalize_h5_type (type_id)); + if (h5type_id != attrib_type) + H5_PRIV_API_LEAVE ( + h5_error ( + H5_ERR_HDF5, + "Attribute '%s' has type '%s' but was requested as '%s'.", + attrib_name, + hdf5_get_type_name (h5type_id), + hdf5_get_type_name (attrib_type))); + + TRY (space_id = hdf5_get_attribute_dataspace (attrib_id)); + TRY (hdf5_read_attribute (attrib_id, type_id, attrib_value)); + TRY (hdf5_close_dataspace(space_id)); + TRY (hdf5_close_type (type_id)); + TRY (hdf5_close_attribute (attrib_id)); + H5_PRIV_API_RETURN (H5_SUCCESS); +} + +h5_err_t +h5_read_file_attrib ( + const h5_file_t f_, + const char *attrib_name, + const hid_t attrib_type, + void *attrib_value + ) { + h5_file_p f = (h5_file_p)f_; + H5_CORE_API_ENTER (h5_err_t, + "f=%p, attrib_name='%s', attrib_type=%d, " + "attrib_value=%p", + f, + attrib_name, + attrib_type, + attrib_value); + CHECK_FILEHANDLE (f); + H5_CORE_API_RETURN (h5priv_read_attrib ( + f->root_gid, + attrib_name, + attrib_type, + attrib_value)); +} + +h5_err_t +h5_read_step_attrib ( + const h5_file_t f_, + const char *attrib_name, + const hid_t attrib_type, + void *attrib_value + ) { + h5_file_p f = (h5_file_p)f_; + H5_CORE_API_ENTER (h5_err_t, + "f=%p, attrib_name='%s', attrib_type=%d, " + "attrib_value=%p", + f, + attrib_name, + attrib_type, + attrib_value); + CHECK_FILEHANDLE (f); + CHECK_TIMEGROUP (f); + H5_CORE_API_RETURN (h5priv_read_attrib ( + f->step_gid, + attrib_name, + attrib_type, + attrib_value)); +} + +h5_err_t +h5priv_write_attrib ( + const hid_t id, /*!< HDF5 object ID */ + const char* attrib_name, /*!< name of HDF5 attribute to write */ + const hid_t attrib_type, /*!< HDF5 type of attribute */ + const void* attrib_value, /*!< value of attribute */ + const hsize_t attrib_nelem, /*!< number of elements (dimension) */ + const int overwrite + ) { + H5_PRIV_API_ENTER (h5_err_t, + "id=%d, attrib_name='%s', attrib_type=%d, " + "attrib_value=%p, attrib_nelem=%llu, overwrite=%d", + id, + attrib_name, + attrib_type, + attrib_value, + attrib_nelem, + overwrite); + hid_t space_id; + hid_t attrib_id; + hid_t type_id; + if ( attrib_type == H5T_NATIVE_CHAR ) { + TRY (type_id = hdf5_create_string_type (attrib_nelem)); + TRY (space_id = hdf5_create_dataspace_scalar ()); + } else { + type_id = attrib_type; + TRY (space_id = hdf5_create_dataspace (1, &attrib_nelem, NULL)); + } + h5_err_t exists; + TRY (exists = hdf5_attribute_exists (id, attrib_name)); + if (exists) { + if (overwrite) { + TRY (hdf5_delete_attribute (id, attrib_name)); + } else { + H5_PRIV_API_LEAVE ( + h5_error (H5_ERR_H5, "Cannot overwrite attribute %s/%s", + hdf5_get_objname (id), attrib_name)); + } + } + TRY (attrib_id = hdf5_create_attribute ( + id, + attrib_name, + type_id, + space_id, + H5P_DEFAULT, H5P_DEFAULT)); + + TRY (hdf5_write_attribute (attrib_id, type_id, attrib_value)); + TRY (hdf5_close_attribute (attrib_id)); + TRY (hdf5_close_dataspace (space_id)); + + if (attrib_type == H5T_NATIVE_CHAR) + TRY (hdf5_close_type (type_id)); + + H5_PRIV_API_RETURN (H5_SUCCESS); +} + +h5_err_t +h5_write_file_attrib ( + const h5_file_t f_, + const char *attrib_name, + const hid_t attrib_type, + const void *attrib_value, + const hsize_t attrib_nelem + ) { + h5_file_p f = (h5_file_p)f_; + H5_CORE_API_ENTER (h5_err_t, + "f=%p, attrib_name='%s', attrib_type=%d, " + "attrib_value=%p, attrib_nelem=%llu", + f, + attrib_name, + attrib_type, + attrib_value, + attrib_nelem); + CHECK_FILEHANDLE (f); + CHECK_WRITABLE_MODE (f); + H5_CORE_API_RETURN (h5priv_write_attrib ( + f->root_gid, + attrib_name, + attrib_type, + attrib_value, + attrib_nelem, + 1)); +} + +h5_err_t +h5_write_step_attrib ( + const h5_file_t f_, + const char *attrib_name, + const hid_t attrib_type, + const void *attrib_value, + const hsize_t attrib_nelem + ) { + h5_file_p f = (h5_file_p)f_; + H5_CORE_API_ENTER (h5_err_t, + "f=%p, attrib_name='%s', attrib_type=%d, " + "attrib_value=%p, attrib_nelem=%llu", + f, + attrib_name, + attrib_type, + attrib_value, + attrib_nelem); + CHECK_FILEHANDLE (f); + CHECK_TIMEGROUP (f); + CHECK_WRITABLE_MODE (f); + H5_CORE_API_RETURN (h5priv_write_attrib ( + f->step_gid, + attrib_name, + attrib_type, + attrib_value, + attrib_nelem, + 1)); +} + +h5_err_t +h5priv_get_attrib_info ( + const hid_t id, /*!< HDF5 object ID */ + const h5_size_t attrib_idx, /*!< index of attribute */ + char* attrib_name, /*!< OUT: name of attribute */ + const h5_size_t len_attrib_name,/*!< buffer length */ + h5_int64_t* attrib_type, /*!< OUT: H5 type of attribute */ + h5_size_t* attrib_nelem /*!< OUT: number of elements */ + ) { + H5_PRIV_API_ENTER (h5_err_t, + "id=%d, " + "attrib_idx=%llu, " + "attrib_name=%p, len_attrib_name=%llu, " + "attrib_type=%p, attrib_nelem=%p", + id, + (long long unsigned)attrib_idx, + attrib_name, + (long long unsigned)len_attrib_name, + attrib_type, + attrib_nelem); + hid_t attrib_id; + hid_t mytype; + hid_t space_id; + TRY (attrib_id = hdf5_open_attribute_idx ( + id, + (unsigned int)attrib_idx)); + + if (attrib_nelem) { + TRY (space_id = hdf5_get_attribute_dataspace (attrib_id)); + TRY (*attrib_nelem = hdf5_get_npoints_of_dataspace (space_id)); + TRY (hdf5_close_dataspace (space_id)); + } + if (attrib_name) { + TRY (hdf5_get_attribute_name ( + attrib_id, + (size_t)len_attrib_name, + attrib_name)); + } + if (attrib_type) { + TRY (mytype = hdf5_get_attribute_type (attrib_id)); + TRY (*attrib_type = h5priv_normalize_h5_type (mytype)); + TRY (hdf5_close_type (mytype)); + } + TRY (hdf5_close_attribute (attrib_id)); + H5_PRIV_API_RETURN (H5_SUCCESS); +} + +/*! + \ingroup h5_core_attrib + + Get information about an attribute of a HDF5 object. + + \return \c H5_SUCCESS or error code. +*/ +h5_err_t +h5_get_file_attrib_info ( + const h5_file_t f_, /*!< handle to open file */ + const h5_size_t attrib_idx, /*!< index of attribute */ + char* attrib_name, /*!< OUT: name of attribute */ + const h5_size_t len_attrib_name, /*!< buffer length */ + h5_int64_t* attrib_type, /*!< OUT: H5 type of attribute */ + h5_size_t* attrib_nelem /*!< OUT: number of elements */ + ) { + h5_file_p f = (h5_file_p)f_; + H5_CORE_API_ENTER (h5_err_t, + "f=%p, " + "attrib_idx=%llu, attrib_name=%p, len_attrib_name=%llu, " + "attrib_type=%p, attrib_nelem=%p", + f, + (long long unsigned)attrib_idx, + attrib_name, + (long long unsigned)len_attrib_name, + attrib_type, + attrib_nelem); + CHECK_FILEHANDLE (f); + TRY (h5priv_get_attrib_info ( + f->root_gid, attrib_idx, attrib_name, len_attrib_name, + attrib_type, attrib_nelem)); + H5_CORE_API_RETURN (H5_SUCCESS); +} + +h5_err_t +h5_get_step_attrib_info ( + const h5_file_t f_, /*!< handle to open file */ + const h5_size_t attrib_idx, /*!< index of attribute */ + char* attrib_name, /*!< OUT: name of attribute */ + const h5_size_t len_attrib_name, /*!< buffer length */ + h5_int64_t* attrib_type, /*!< OUT: H5 type of attribute */ + h5_size_t* attrib_nelem /*!< OUT: number of elements */ + ) { + h5_file_p f = (h5_file_p)f_; + H5_CORE_API_ENTER (h5_err_t, + "f=%p, " + "attrib_idx=%llu, attrib_name=%p, len_attrib_name=%llu, " + "attrib_type=%p, attrib_nelem=%p", + f, + (long long unsigned)attrib_idx, + attrib_name, + (long long unsigned)len_attrib_name, + attrib_type, + attrib_nelem); + CHECK_FILEHANDLE (f); + CHECK_TIMEGROUP (f); + TRY (h5priv_get_attrib_info ( + f->step_gid, attrib_idx, attrib_name, len_attrib_name, + attrib_type, attrib_nelem)); + H5_CORE_API_RETURN (H5_SUCCESS); +} + +/*! + \ingroup h5_core_attrib + + Get number of attributes of a HDF5 object. + + \return number of attributes or error code. +*/ +h5_ssize_t +h5_get_num_file_attribs ( + const h5_file_t f_ /*!< handle to open file */ + ) { + h5_file_p f = (h5_file_p)f_; + H5_CORE_API_ENTER (h5_ssize_t, "f=%p", f); + CHECK_FILEHANDLE (f); + H5_CORE_API_RETURN (hdf5_get_num_attribute (f->root_gid)); +} + +h5_ssize_t +h5_get_num_step_attribs ( + const h5_file_t f_ /*!< handle to open file */ + ) { + h5_file_p f = (h5_file_p)f_; + H5_CORE_API_ENTER (h5_ssize_t, "f=%p", f); + CHECK_FILEHANDLE (f); + CHECK_TIMEGROUP (f); + H5_CORE_API_RETURN (hdf5_get_num_attribute (f->step_gid)); +} + diff --git a/src/h5core/h5_attribs_private.h b/src/h5core/h5_attribs_private.h new file mode 100644 index 0000000..b990fb5 --- /dev/null +++ b/src/h5core/h5_attribs_private.h @@ -0,0 +1,42 @@ +/* + Copyright (c) 2006-2013, The Regents of the University of California, + through Lawrence Berkeley National Laboratory (subject to receipt of any + required approvals from the U.S. Dept. of Energy) and the Paul Scherrer + Institut (Switzerland). All rights reserved. + + License: see file COPYING in top level of source distribution. +*/ + +#ifndef __H5_ATTRIBS_PRIVATE_H +#define __H5_ATTRIBS_PRIVATE_H + +#include "h5_types_private.h" + +h5_err_t +h5priv_read_attrib ( + const hid_t id, + const char* attrib_name, + const hid_t attrib_type, + void* const attrib_value + ); + +h5_err_t +h5priv_write_attrib ( + const hid_t id, + const char* attrib_name, + const hid_t attrib_type, + const void* attrib_value, + const hsize_t attrib_nelem, + const int overwrite + ); + +h5_err_t +h5priv_get_attrib_info ( + const hid_t id, + const h5_size_t attrib_idx, + char* attrib_name, + const h5_size_t len_attrib_name, + h5_int64_t* attrib_type, + h5_size_t* attrib_nelem + ); +#endif diff --git a/src/h5core/h5_debug_private.h b/src/h5core/h5_debug_private.h new file mode 100644 index 0000000..96df636 --- /dev/null +++ b/src/h5core/h5_debug_private.h @@ -0,0 +1,48 @@ +/* + Copyright (c) 2006-2013, The Regents of the University of California, + through Lawrence Berkeley National Laboratory (subject to receipt of any + required approvals from the U.S. Dept. of Energy) and the Paul Scherrer + Institut (Switzerland). All rights reserved. + + License: see file COPYING in top level of source distribution. +*/ + +#ifndef __H5_DEBUG_PRIVATE_H +#define __H5_DEBUG_PRIVATE_H + +#include "h5core/h5_debug.h" + +#define H5_CORE_API_ENTER(type, fmt, ...) \ + __FUNC_ENTER(type, H5_DEBUG_CORE_API, fmt, __VA_ARGS__) +#define H5_CORE_API_LEAVE(value) __FUNC_LEAVE(value) +#define H5_CORE_API_RETURN(value) __FUNC_RETURN(value, H5_DEBUG_CORE_API) + + +#define H5_PRIV_API_ENTER(type, fmt, ...) \ + __FUNC_ENTER(type, H5_DEBUG_PRIV_API, fmt, __VA_ARGS__) +#define H5_PRIV_API_LEAVE(value) __FUNC_LEAVE(value) +#define H5_PRIV_API_RETURN(value) __FUNC_RETURN(value, H5_DEBUG_PRIV_API) + + +#define H5_PRIV_FUNC_ENTER(type, fmt, ...) \ + __FUNC_ENTER(type, H5_DEBUG_PRIV_FUNC, fmt, __VA_ARGS__ ) +#define H5_PRIV_FUNC_LEAVE(value) __FUNC_LEAVE(value) +#define H5_PRIV_FUNC_RETURN(value) __FUNC_RETURN(value, H5_DEBUG_PRIV_FUNC) + + +#define HDF5_WRAPPER_ENTER(type, fmt, ...) \ + __FUNC_ENTER(type, H5_DEBUG_HDF5, fmt, __VA_ARGS__ ) +#define HDF5_WRAPPER_LEAVE(value) __FUNC_LEAVE(value) +#define HDF5_WRAPPER_RETURN(value) __FUNC_RETURN(value, H5_DEBUG_HDF5) + + +#define MPI_WRAPPER_ENTER(type, fmt, ...) \ + __FUNC_ENTER(type, H5_DEBUG_MPI, fmt, __VA_ARGS__ ) +#define MPI_WRAPPER_LEAVE(value) __FUNC_LEAVE(value) +#define MPI_WRAPPER_RETURN(value) __FUNC_RETURN(value, H5_DEBUG_MPI) + +#define H5_INLINE_FUNC_ENTER(type) type ret_value = (type)H5_ERR; +#define H5_INLINE_FUNC_LEAVE(expr) __FUNC_LEAVE(expr) +#define H5_INLINE_FUNC_RETURN(expr) __FUNC_RETURN(expr, 0) + +#endif diff --git a/src/h5core/h5_errorhandling.c b/src/h5core/h5_errorhandling.c new file mode 100644 index 0000000..5001d7a --- /dev/null +++ b/src/h5core/h5_errorhandling.c @@ -0,0 +1,243 @@ +/* + Copyright (c) 2006-2012, The Regents of the University of California, + through Lawrence Berkeley National Laboratory (subject to receipt of any + required approvals from the U.S. Dept. of Energy) and the Paul Scherrer + Institut (Switzerland). All rights reserved. + + License: see file COPYING in top level of source distribution. +*/ + +#include "h5core/h5.h" +#include "h5_init_private.h" + +static h5_errorhandler_t h5_errhandler = h5_report_errorhandler; +h5_err_t h5_errno; +h5_int32_t h5_debug_level = 1; +struct call_stack h5_call_stack; + +char *h5_rfmts[] = { + [e_int] "%d", + [e_ssize_t] "%ld", + [e_char_p] "%s", + [e_void_p] "%p", + [e_h5_err_t] "%lld", + [e_h5_int64_t] "%lld", + [e_h5_id_t] "%lld", + [e_h5_ssize_t] "%lld", + [e_h5_errorhandler_t] "%p", + [e_h5_file_p] "%p", + [e_h5_file_t] "0x%08x", + [e_h5_lvl_idx_t] "%d", + [e_h5t_iterator_p] "%p", + [e_h5_loc_id_t] "%ld", + [e_h5_loc_idx_t] "%ld", + [e_hid_t] "%ld", + [e_H5O_type_t] "%ld", + [e_h5_glb_elem_p] "%p", + [e_h5_prop_p] "%p", + [e_h5_prop_t] "0x%08x", + [e_h5_prop_file_p] "%p", + [e_h5_prop_file_t] "0x%08x", + [e_herr_t] "%ld" +}; + +/*! + \ingroup h5_core + \defgroup h5_core_errorhandling + */ +const char* const H5_O_MODES[] = { + "H5_O_RDWR", + "H5_O_RDONLY", + "H5_O_WRONLY", + "H5_O_APPEND" +}; + +/*! + \ingroup h5_core_errorhandling + + Set debug/verbosity level. On level 0 all output will be supressed (even + error messages). On level 1 error messages, on level 2 warning messages + and on level 3 informational messages will be printed. On level 4 debug + messages will be printed. + + Values less than 0 are equivalent to 0. Values greater than 4 are equivalent + to 4. + + \return \c H5_SUCCESS on success. + \return \c H5_ERR_INVAL if debug level is invalid. + */ +h5_err_t +h5_set_debuglevel ( + const h5_id_t level /*!< debug level */ + ) { + if (level < 0) + h5_debug_level = (1 << 20) - 1; + else + h5_debug_level = level; + return H5_SUCCESS; +} + +/*! + \ingroup h5_core_errorhandling + + Get current debug/verbosity level. + + \return current debug level + */ +h5_err_t +h5_get_debuglevel ( + void + ) { + return h5_debug_level; +} + +/*! + \ingroup h5_core_errorhandling + + Set own error handler. + + \return \c H5_SUCCESS + */ +h5_err_t +h5_set_errorhandler ( + const h5_errorhandler_t handler + ) { + h5_errhandler = handler; + return H5_SUCCESS; +} + +/*! + \ingroup h5_core_errorhandling + + Return pointer to current error handler. + + \return \c H5_SUCCESS + */ +h5_errorhandler_t +h5_get_errorhandler ( + void + ) { + return h5_errhandler; +} + +/*! + \ingroup h5_core_errorhandling + + Get current error number. + + \return \c H5_SUCCESS + */ +h5_err_t +h5_get_errno ( + void + ) { + return h5_errno; +} + +/*! + \ingroup h5_core_errorhandling + + Set error number. + + \return \c H5_SUCCESS + */ +void +h5_set_errno ( + const h5_err_t errno + ) { + h5_errno = errno; +} + + +/*! + \ingroup h5_core_errorhandling + + This is the H5 default error handler. If an error occures, the + error message will be printed, if debug level is greater than 0. + + \return \c f->__errno + */ +h5_err_t +h5_report_errorhandler ( + const char* fmt, + va_list ap + ) { + if (h5_debug_level > 0) { + h5_verror (fmt, ap); + } + return h5_errno; +} + +/*! + \ingroup h5_core_errorhandling + + If an error occures, the error message will be printed and the + program exists with the error code given in \c f->__errno. + */ +h5_err_t +h5_abort_errorhandler ( + const char* fmt, + va_list ap + ) { + if (h5_debug_level > 0) { + h5_verror (fmt, ap); + } +#ifdef PARALLEL_IO + MPI_Abort(MPI_COMM_WORLD, -(int)h5_errno); +#else + exit (-(int)h5_errno); +#endif + return -(int)h5_errno; // never executed, just to supress a warning +} + +void +h5priv_vprintf ( + FILE* f, + const char* prefix, + const char* __funcname, + const char* fmt, + va_list ap + ) { + char fmt2[2048]; + snprintf (fmt2, sizeof(fmt2), "[proc %d] %s: %s: %s\n", h5_myproc, prefix, + __funcname, fmt); + vfprintf (f, fmt2, ap); +} + +/*! + \ingroup h5_core_errorhandling + + Print error message via error handler. + + \return \c f->__errno + */ +h5_err_t +h5_error ( + const h5_err_t errno_, + const char* fmt, + ... + ) { + h5_errno = errno_; + va_list ap; + va_start (ap, fmt); + + (*h5_errhandler)(fmt, ap); + + va_end (ap); + return h5_errno; +} + +/*! + \ingroup h5_core_errorhandling + + Print error message to \c stderr. For use in error handlers only. + */ +void +h5_verror ( + const char* fmt, + va_list ap + ) { + + if (h5_debug_level < 1) return; + h5priv_vprintf (stderr, "E", h5_call_stack.entry[0].name, fmt, ap); +} diff --git a/src/h5core/h5_errorhandling_private.h b/src/h5core/h5_errorhandling_private.h new file mode 100644 index 0000000..9e8f050 --- /dev/null +++ b/src/h5core/h5_errorhandling_private.h @@ -0,0 +1,29 @@ +#ifndef __H5_ERRORHANDLING_PRIVATE_H +#define __H5_ERRORHANDLING_PRIVATE_H + +#include "h5core/h5_errorhandling.h" + +#define h5priv_handle_file_mode_error( mode_id ) \ + h5_error( \ + H5_ERR_BADF, \ + "Operation not permitted in mode '%s'", \ + H5_O_MODES[mode_id] ); + +#define HANDLE_H5_OVERFLOW_ERR( max ) \ + h5_error( \ + H5_ERR_INVAL, \ + "Cannot store more than %lld items", (long long)max ); + +#define HANDLE_H5_PARENT_ID_ERR( parent_id ) \ + h5_error( \ + H5_ERR_INVAL, \ + "Wrong parent_id %lld.", \ + (long long)parent_id ); + +#define HANDLE_H5_OUT_OF_RANGE_ERR( otype, oid ) \ + h5_error( \ + H5_ERR_INVAL, \ + "%s id %lld out of range", \ + otype, (long long)oid ); + +#endif diff --git a/src/h5core/h5_fcmp.c b/src/h5core/h5_fcmp.c new file mode 100644 index 0000000..785c208 --- /dev/null +++ b/src/h5core/h5_fcmp.c @@ -0,0 +1,44 @@ +/* + Copyright (c) 2006-2013, The Regents of the University of California, + through Lawrence Berkeley National Laboratory (subject to receipt of any + required approvals from the U.S. Dept. of Energy) and the Paul Scherrer + Institut (Switzerland). All rights reserved. + + License: see file COPYING in top level of source distribution. +*/ + +#include +#include + +#include "h5core/h5_types.h" + +/*! + Compare two floating point numbers using integers. See + http://www.cygnus-software.com/papers/comparingfloats/comparingfloats.htm + for a detailed explanation. + */ +h5_int64_t +h5priv_fcmp ( + h5_float64_t A, + h5_float64_t B, + h5_int32_t maxUlps ) { + + // Make sure maxUlps is non-negative and small enough that the + // default NAN won't compare as equal to anything. + assert (maxUlps > 0 && maxUlps < 4 * 1024 * 1024); + assert (sizeof (long long) == sizeof (h5_int64_t) ); + + // Make [ab]Int lexicographically ordered as a twos-complement int + h5_int64_t aInt = *(h5_int64_t*)&A; + if (aInt < 0) + aInt = 0x8000000000000000LL - aInt; + + h5_int64_t bInt = *(h5_int64_t*)&B; + if (bInt < 0) + bInt = 0x8000000000000000LL - bInt; + + h5_int64_t intDiff = aInt - bInt; + if (llabs(intDiff) <= maxUlps) + return 0; + return intDiff; +} diff --git a/src/h5core/h5_fcmp_private.h b/src/h5core/h5_fcmp_private.h new file mode 100644 index 0000000..882fbbf --- /dev/null +++ b/src/h5core/h5_fcmp_private.h @@ -0,0 +1,21 @@ +/* + Copyright (c) 2006-2013, The Regents of the University of California, + through Lawrence Berkeley National Laboratory (subject to receipt of any + required approvals from the U.S. Dept. of Energy) and the Paul Scherrer + Institut (Switzerland). All rights reserved. + + License: see file COPYING in top level of source distribution. +*/ + +#ifndef __H5_FCMP_H +#define __H5_FCMP_H + +#include "h5core/h5_types.h" + +h5_int64_t +h5priv_fcmp ( + h5_float64_t A, + h5_float64_t B, + h5_int32_t maxUlps ); + +#endif diff --git a/src/h5core/h5_hdf5.c b/src/h5core/h5_hdf5.c new file mode 100644 index 0000000..91e8ebe --- /dev/null +++ b/src/h5core/h5_hdf5.c @@ -0,0 +1,385 @@ +/* + Copyright (c) 2006-2013, The Regents of the University of California, + through Lawrence Berkeley National Laboratory (subject to receipt of any + required approvals from the U.S. Dept. of Energy) and the Paul Scherrer + Institut (Switzerland). All rights reserved. + + License: see file COPYING in top level of source distribution. +*/ + +#include +#include + +#include "h5_hdf5_private.h" + +#include "h5core/h5_types.h" +#include "h5core/h5_syscall.h" + +/* + Test whether given path exists. + */ +h5_err_t +h5priv_link_exists_ ( + const hid_t loc_id, + const char const* path[], + size_t size + ) { + H5_PRIV_FUNC_ENTER (h5_err_t, "loc_id=%d, (%s), path=%s, ...", + loc_id, hdf5_get_objname (loc_id), path[0]); + // for the time being we limit the concatenated path to 1024 bytes + char name[1024]; + char* s = name; + char* end = name+sizeof (name); + name[0] = '\0'; + + for (size_t i = 0; i < size; i++) { + if (i) { // do not *prepend* a slash! + *s++ = '/'; + *s = '\0'; + } + if (s+strlen(path[i])+1 >= end) H5_PRIV_API_LEAVE ( + h5_error ( + H5_ERR_HDF5, + "path %s... to long", name)); + s = stpcpy (s, path[i]); // return ptr to end!!! + h5_err_t exists; + TRY (exists = hdf5_link_exists (loc_id, name)); + if (!exists) H5_PRIV_FUNC_LEAVE (0); + } + H5_PRIV_FUNC_RETURN (1); +} + +h5_err_t +h5priv_open_group_ ( + int create_intermediate, + const hid_t loc_id, + const char const* path[], + size_t size + ) { + H5_PRIV_FUNC_ENTER (h5_err_t, + "create_intermediate=%d, loc_id=%d, (%s), path=%s, ...", + create_intermediate, loc_id, hdf5_get_objname (loc_id), + path[0]); + hid_t hid = loc_id; + hid_t hid2 = 0; + h5_err_t exists; + for (size_t i=0; i < size; i++) { + TRY (exists = hdf5_link_exists (hid, path[i])); + if (exists) { + TRY (hid2 = hdf5_open_group (hid, path[i])); + } else if (create_intermediate) { + TRY (hid2 = hdf5_create_group (hid, path[i])); + } else { + H5_PRIV_FUNC_LEAVE ( + h5_error ( + H5_ERR_HDF5, + "No such group '%s/%s'.", + hdf5_get_objname (hid), + path[i])); + + } + if (hid != loc_id) { + TRY (hdf5_close_group (hid)); + } + hid = hid2; + } + H5_PRIV_FUNC_RETURN (hid); +} + +typedef struct op_data { + int queried_idx; + int cnt; + H5O_type_t type; + char *name; + size_t len; + char *prefix; +} op_data_t; + +static H5O_type_t +iter_op_get_obj_type ( + const hid_t g_id, + const char* name, + const H5L_info_t* info + ) { + herr_t herr; + H5O_info_t objinfo; + + if (info->type == H5L_TYPE_EXTERNAL) { + char* buf = h5_calloc (1, info->u.val_size); + if ((ptrdiff_t)buf == (ptrdiff_t)H5_ERR) { + return H5O_TYPE_UNKNOWN; + } + herr = H5Lget_val(g_id, name, buf, + info->u.val_size, H5P_DEFAULT); + if (herr < 0) { + h5_error ( + H5_ERR_HDF5, + "Can't get external link for object '%s'!", + name); + return H5O_TYPE_UNKNOWN; + } + const char *filename; + const char *objname; + herr = H5Lunpack_elink_val(buf, info->u.val_size, 0, + &filename, &objname); + if (herr < 0) { + h5_error( + H5_ERR_HDF5, + "Can't unpack external link for object '%s'!", + name); + return H5O_TYPE_UNKNOWN; + } + h5_debug( + "Followed external link to file '%s' / object '%s'.", + filename, objname); + + h5_free (buf); + + hid_t obj_id = H5Oopen(g_id, name, H5P_DEFAULT); + if (obj_id < 0) { + h5_error( + H5_ERR_HDF5, + "Can't open external link for object '%s'!", + name); + return H5O_TYPE_UNKNOWN; + } + herr = H5Oget_info(obj_id, &objinfo); + } + else { // H5L_TYPE_HARD + herr = H5Oget_info_by_name(g_id, name, &objinfo, H5P_DEFAULT); + } + + if (herr < 0) { + h5_error( + H5_ERR_HDF5, + "Can't query object with name '%s'!", name); + return H5O_TYPE_UNKNOWN; + } + return objinfo.type; +} + +static herr_t +iter_op_count ( + hid_t g_id, + const char* name, + const H5L_info_t* info, + void* _op_data + ) { + op_data_t* op_data = (op_data_t*)_op_data; + H5O_type_t type = iter_op_get_obj_type (g_id, name, info); + if (type == H5O_TYPE_UNKNOWN) + return -1; + if (type == op_data->type) + op_data->cnt++; + return 0; +} + +static herr_t +iter_op_idx ( + hid_t g_id, + const char* name, + const H5L_info_t* info, + void* _op_data + ) { + op_data_t* op_data = (op_data_t*)_op_data; + H5O_type_t type = iter_op_get_obj_type (g_id, name, info); + if (type == H5O_TYPE_UNKNOWN) + return -1; + if (type != op_data->type) + return 0; // ignore on wrong type + op_data->cnt++; + /* stop iterating if index is equal cnt */ + if (op_data->queried_idx == op_data->cnt) { + memset (op_data->name, 0, op_data->len); + strncpy (op_data->name, name, op_data->len-1); + return 1; + } + return 0; +} + +static herr_t +iter_op_count_match ( + hid_t g_id, + const char* name, + const H5L_info_t* info, + void* _op_data + ) { + H5_PRIV_FUNC_ENTER (herr_t, + "g_id=%d, name='%s', info=%p, _op_data=%p", + g_id, name, info, _op_data); + op_data_t* op_data = (op_data_t*)_op_data; + H5O_type_t type; + TRY (type = iter_op_get_obj_type (g_id, name, info)); + if (type != op_data->type) + H5_PRIV_FUNC_LEAVE (0); + /* count if prefix matches */ + if (strncmp (name, op_data->prefix, strlen(op_data->prefix)) == 0) { + op_data->cnt++; + } + H5_PRIV_FUNC_RETURN (0); +} + +ssize_t +hdf5_get_num_groups ( + const hid_t loc_id + ) { + HDF5_WRAPPER_ENTER (ssize_t, "loc_id=%d (%s)", loc_id, hdf5_get_objname (loc_id)); + op_data_t op_data; + memset (&op_data, 0, sizeof (op_data)); + op_data.type = H5O_TYPE_GROUP; + hsize_t start_idx = 0; + herr_t herr = H5Literate (loc_id, H5_INDEX_NAME, H5_ITER_INC, + &start_idx, + iter_op_count, &op_data); + if (herr < 0) { + HDF5_WRAPPER_LEAVE ( + h5_error ( + H5_ERR_HDF5, + "Cannot get number of groups in '%s'.", + hdf5_get_objname (loc_id))); + } + HDF5_WRAPPER_RETURN (op_data.cnt); +} + +ssize_t +hdf5_get_num_groups_matching_prefix ( + const hid_t loc_id, + char* prefix + ) { + HDF5_WRAPPER_ENTER (ssize_t, + "loc_id=%d (%s), prefix='%s'", + loc_id, hdf5_get_objname (loc_id), prefix); + op_data_t op_data; + memset (&op_data, 0, sizeof (op_data)); + op_data.type = H5O_TYPE_GROUP; + op_data.prefix = prefix; + hsize_t start_idx = 0; + herr_t herr = H5Literate (loc_id, H5_INDEX_NAME, H5_ITER_INC, + &start_idx, + iter_op_count_match, &op_data); + if (herr < 0) { + HDF5_WRAPPER_LEAVE ( + h5_error ( + H5_ERR_HDF5, + "Cannot get number of groups with prefix" + " '%s' in '%s'.", + prefix, hdf5_get_objname (loc_id))); + } + HDF5_WRAPPER_RETURN (op_data.cnt); +} + +h5_err_t +hdf5_get_name_of_group_by_idx ( + hid_t loc_id, + hsize_t idx, + char *name, + size_t len + ) { + HDF5_WRAPPER_ENTER (h5_err_t, + "loc_id=%d (%s), idx=%llu, name=%p, len=%llu", + loc_id, hdf5_get_objname (loc_id), + idx, name, (unsigned long long)len); + op_data_t op_data; + memset (&op_data, 0, sizeof (op_data)); + op_data.type = H5O_TYPE_GROUP; + op_data.cnt = -1; + op_data.queried_idx = idx; + op_data.name = name; + op_data.len = len; + hsize_t start_idx = 0; + herr_t herr = H5Literate (loc_id, H5_INDEX_NAME, H5_ITER_INC, + &start_idx, + iter_op_idx, &op_data); + if (herr < 0) { + HDF5_WRAPPER_LEAVE ( + h5_error ( + H5_ERR_HDF5, + "Cannot get name of group with index" + " '%lu' in '%s'.", + (long unsigned int)idx, + hdf5_get_objname (loc_id))); + } + HDF5_WRAPPER_RETURN (H5_SUCCESS); +} + +ssize_t +hdf5_get_num_datasets ( + const hid_t loc_id + ) { + HDF5_WRAPPER_ENTER (ssize_t, + "loc_id=%d (%s)", loc_id, hdf5_get_objname (loc_id)); + op_data_t op_data; + memset (&op_data, 0, sizeof (op_data)); + op_data.type = H5O_TYPE_DATASET; + hsize_t start_idx = 0; + herr_t herr = H5Literate (loc_id, H5_INDEX_NAME, H5_ITER_INC, + &start_idx, + iter_op_count, &op_data); + if (herr < 0) { + HDF5_WRAPPER_LEAVE ( + h5_error ( + H5_ERR_HDF5, + "Cannot get number of datasets in '%s'.", + hdf5_get_objname (loc_id))); + } + HDF5_WRAPPER_RETURN (op_data.cnt); +} + +/* + Get name of the \c idx th dataset in group \c loc_id. + */ +h5_err_t +hdf5_get_name_of_dataset_by_idx ( + hid_t loc_id, + hsize_t idx, + char *name, + size_t len + ) { + HDF5_WRAPPER_ENTER (h5_err_t, + "loc_id=%d (%s), idx=%llu, name=%p, len=%llu", + loc_id, hdf5_get_objname (loc_id), + idx, name, (unsigned long long)len); + op_data_t op_data; + memset (&op_data, 0, sizeof (op_data)); + op_data.type = H5O_TYPE_DATASET; + op_data.cnt = -1; + op_data.queried_idx = idx; + op_data.name = name; + op_data.len = len; + hsize_t start_idx = 0; + herr_t herr = H5Literate (loc_id, H5_INDEX_NAME, H5_ITER_INC, + &start_idx, + iter_op_idx, &op_data); + if (herr < 0) { + HDF5_WRAPPER_LEAVE ( + h5_error ( + H5_ERR_HDF5, + "Cannot get name of dataset with index" + " '%lu' in '%s'.", + (long unsigned int)idx, + hdf5_get_objname (loc_id))); + } + HDF5_WRAPPER_RETURN (H5_SUCCESS); +} + +/****** I d e n t i f i e r **************************************************/ + +const char * +hdf5_get_objname ( + hid_t id + ) { + static char objname[256]; + + // memset ( objname, 0, sizeof(objname) ); + if (id == -1) { + strcpy ( objname, "[none]" ); + } else { + ssize_t size = H5Iget_name ( id, objname, sizeof(objname) ); + if ( size < 0 ) { + strcpy ( objname, "[error getting object name]" ); + } else if ( size == 0 ) { + strcpy ( objname, "[no name associated with identifier]" ); + } + } + return objname; +} diff --git a/src/h5core/h5_hdf5_private.h b/src/h5core/h5_hdf5_private.h new file mode 100644 index 0000000..f50aab0 --- /dev/null +++ b/src/h5core/h5_hdf5_private.h @@ -0,0 +1,1453 @@ +/* + Copyright (c) 2006-2013, The Regents of the University of California, + through Lawrence Berkeley National Laboratory (subject to receipt of any + required approvals from the U.S. Dept. of Energy) and the Paul Scherrer + Institut (Switzerland). All rights reserved. + + License: see file COPYING in top level of source distribution. +*/ + +#ifndef __H5_HDF5_PRIVATE_H +#define __H5_HDF5_PRIVATE_H + +#include + +#include "h5core/h5_types.h" +#include "h5core/h5_errorhandling.h" +#include "h5_debug_private.h" + +ssize_t +hdf5_get_num_groups ( + const hid_t loc_id + ); + +ssize_t +hdf5_get_num_groups_matching_prefix ( + const hid_t loc_id, + char* prefix + ); + +h5_err_t +hdf5_get_name_of_group_by_idx ( + hid_t loc_id, + hsize_t idx, + char *name, + size_t len + ); + +ssize_t +hdf5_get_num_datasets ( + const hid_t loc_id + ); + +h5_err_t +hdf5_get_name_of_dataset_by_idx ( + hid_t loc_id, + hsize_t idx, + char *name, + size_t len + ); + +const char * +hdf5_get_objname ( + hid_t id + ); + + +/****** L i n k **************************************************************/ + +/* + Determine whether a link with the specified name exists in a group. + + Result: + 1 if link exists + 0 if link doesn't exist + error else +*/ +static inline h5_err_t +hdf5_link_exists ( + const hid_t loc_id, + const char* name + ) { + HDF5_WRAPPER_ENTER (h5_err_t, + "loc_id=%d (%s), name='%s'", + loc_id, hdf5_get_objname (loc_id), name); + /* Save old error handler */ + H5E_auto2_t old_func; + void *old_client_data; + + H5Eget_auto2(H5E_DEFAULT, &old_func, &old_client_data); + + /* Turn off error handling */ + H5Eset_auto(H5E_DEFAULT, NULL, NULL); + + /* Probe. Likely to fail, but that’s okay */ + htri_t exists = H5Lexists ( loc_id, name, H5P_DEFAULT ); + + /* Restore previous error handler */ + H5Eset_auto(H5E_DEFAULT, old_func, old_client_data); + + if (exists < 0 ) + HDF5_WRAPPER_LEAVE ( + h5_error ( + H5_ERR_HDF5, + "Cannot query link %s/%s.", + hdf5_get_objname (loc_id), name)); + HDF5_WRAPPER_RETURN (exists); +} + +static inline h5_err_t +hdf5_delete_link ( + hid_t loc_id, + const char* name, + hid_t lapl_id + ) { + HDF5_WRAPPER_ENTER (h5_err_t, + "loc_id=%d (%s), name='%s', lapl_id=%d", + loc_id, hdf5_get_objname (loc_id), name, lapl_id); + if (H5Ldelete (loc_id, name, lapl_id) < 0) + HDF5_WRAPPER_LEAVE ( + h5_error ( + H5_ERR_HDF5, + "Cannot delete link %s/%s.", + hdf5_get_objname (loc_id), name)); + + HDF5_WRAPPER_RETURN (H5_SUCCESS); +} + +/****** G r o u p ************************************************************/ + +static inline hid_t +hdf5_open_group ( + const hid_t loc_id, + const char* const group_name + ) { + HDF5_WRAPPER_ENTER (hid_t, + "loc_id=%d (%s), group_name='%s'", + loc_id, + hdf5_get_objname (loc_id), + group_name); + hid_t group_id = H5Gopen (loc_id, group_name, H5P_DEFAULT); + if (group_id < 0) + HDF5_WRAPPER_LEAVE ( + h5_error ( + H5_ERR_HDF5, + "Cannot open group '%s/%s'.", + hdf5_get_objname (loc_id), + group_name)); + HDF5_WRAPPER_RETURN (group_id); +} + +static inline hid_t +hdf5_create_group ( + const hid_t loc_id, + const char* const group_name + ) { + HDF5_WRAPPER_ENTER (hid_t, + "loc_id=%d (%s), group_name='%s'", + loc_id, + hdf5_get_objname (loc_id), + group_name); + hid_t group_id = H5Gcreate ( + loc_id, group_name, H5P_DEFAULT, H5P_DEFAULT, H5P_DEFAULT); + if (group_id < 0) + HDF5_WRAPPER_LEAVE ( + h5_error ( + H5_ERR_HDF5, + "Cannot create group '%s/%s'.", + hdf5_get_objname (loc_id), + group_name)); + HDF5_WRAPPER_RETURN (group_id); +} + +h5_err_t +h5priv_open_group_ (int, hid_t, const char const*[], size_t); + +#define h5priv_open_group(create_intermediate, loc_id, ...) \ + (h5priv_open_group_ (create_intermediate, \ + loc_id, \ + (const char const*[]) {__VA_ARGS__}, \ + PP_NARG(__VA_ARGS__))) + +h5_err_t +h5priv_link_exists_ ( + const hid_t loc_id, + const char const* path[], + size_t size + ); +#define h5priv_link_exists(loc_id, ...) \ + (h5priv_link_exists_ (loc_id, (const char const*[]){__VA_ARGS__}, PP_NARG(__VA_ARGS__))) + + +/*! + Close group. + + \param[in] f file handle + \param[in] group_id id of group to close + */ +static inline h5_err_t +hdf5_close_group ( + const hid_t group_id + ) { + HDF5_WRAPPER_ENTER (h5_err_t, + "group_id=%d (%s)", + group_id, + hdf5_get_objname (group_id)); + + if (group_id == 0 || group_id == -1) + HDF5_WRAPPER_LEAVE (H5_SUCCESS); + if (H5Gclose (group_id) < 0 ) { + HDF5_WRAPPER_LEAVE ( + h5_error ( + H5_ERR_HDF5, + "Cannot terminate access to group '%s').", + hdf5_get_objname (group_id))); + } + HDF5_WRAPPER_RETURN (H5_SUCCESS); +} + +static inline h5_ssize_t +hdf5_get_num_objs_in_group ( + const hid_t group_id + ) { + HDF5_WRAPPER_ENTER (h5_ssize_t, + "group_id=%d (%s)", + group_id, + hdf5_get_objname (group_id)); + H5G_info_t group_info; + if (H5Gget_info (group_id, &group_info) < 0) { + HDF5_WRAPPER_LEAVE ( + h5_error ( + H5_ERR_HDF5, + "Cannot get number of objects in group '%s'.", + hdf5_get_objname(group_id))); + } + HDF5_WRAPPER_RETURN ((h5_ssize_t)group_info.nlinks); +} + + +/* + Get name of object given by index \c idx in group \c loc_id. If name is \c NULL, + return size of name. + */ +static inline h5_ssize_t +hdf5_get_objname_by_idx ( + hid_t loc_id, + hsize_t idx, + char *name, + size_t size + ) { + HDF5_WRAPPER_ENTER (h5_ssize_t, + "loc_id=%d (%s), idx=%lld", + loc_id, + hdf5_get_objname (loc_id), + (long long)idx); + + if (name == NULL) { + size = 0; + } + ssize_t len = H5Lget_name_by_idx (loc_id, ".", + H5_INDEX_NAME, H5_ITER_INC, + idx, + name, size, + H5P_DEFAULT); + if (len < 0) + HDF5_WRAPPER_LEAVE ( + h5_error ( + H5_ERR_HDF5, + "Cannot get name of object %llu in group '%s'.", + (unsigned long long)idx, + hdf5_get_objname (loc_id))); + HDF5_WRAPPER_RETURN (len); +} + +/****** D a t a s p a c e ****************************************************/ +/*! + Create dataspace for dataset. H5Screate_simple wrapper. + + \param[in] rank rank of dataspace + \param[in] dims dimensions of dataspace + \param[in] maxdims maximum dimensions of dataspace + + */ +static inline hid_t +hdf5_create_dataspace ( + const int rank, + const hsize_t* dims, + const hsize_t* maxdims + ) { + HDF5_WRAPPER_ENTER (hid_t, + "rank=%d", + rank); + hid_t dataspace_id = H5Screate_simple (rank, dims, maxdims); + if (dataspace_id < 0) + HDF5_WRAPPER_LEAVE ( + h5_error ( + H5_ERR_HDF5, + "Cannot create dataspace with rank %d.", + rank)); + HDF5_WRAPPER_RETURN (dataspace_id); +} + +static inline hid_t +hdf5_create_dataspace_scalar ( + void + ) { + HDF5_WRAPPER_ENTER (hid_t, "%s", "void"); + hid_t dataspace_id = H5Screate (H5S_SCALAR); + if (dataspace_id < 0) + HDF5_WRAPPER_LEAVE ( + h5_error ( + H5_ERR_HDF5, + "Cannot create scalar dataspace.")); + HDF5_WRAPPER_RETURN (dataspace_id); +} + +static inline h5_err_t +hdf5_select_hyperslab_of_dataspace ( + hid_t space_id, + H5S_seloper_t op, + const hsize_t* start, + const hsize_t* stride, + const hsize_t* count, + const hsize_t* block + ) { + HDF5_WRAPPER_ENTER (h5_err_t, "%d", space_id); + herr_t herr = H5Sselect_hyperslab ( + space_id, + op, + start, + stride, + count, + block); + if (herr < 0) + HDF5_WRAPPER_LEAVE ( + h5_error ( + H5_ERR_HDF5, + "Cannot set select hyperslap region or add the " + "specified region")); + HDF5_WRAPPER_RETURN (H5_SUCCESS); +} + +static inline h5_err_t +hdf5_select_elements_of_dataspace ( + hid_t space_id, + H5S_seloper_t op, + hsize_t nelems, + const hsize_t* indices + ) { + HDF5_WRAPPER_ENTER (h5_err_t, "%d", space_id); + herr_t herr; + if ( nelems > 0 ) { + herr = H5Sselect_elements ( + space_id, + op, + (size_t)nelems, + indices); + } else { + herr = H5Sselect_none ( space_id ); + } + if (herr < 0) + HDF5_WRAPPER_LEAVE ( + h5_error ( + H5_ERR_HDF5, + "Cannot set select hyperslap region or add the " + "specified region")); + HDF5_WRAPPER_RETURN (H5_SUCCESS); +} + +static inline h5_err_t +hdf5_select_none ( + hid_t space_id + ) { + HDF5_WRAPPER_ENTER (h5_err_t, + "%d", + space_id); + herr_t herr = H5Sselect_none (space_id); + if (herr < 0) { + HDF5_WRAPPER_LEAVE ( + h5_error ( + H5_ERR_HDF5, + "Selection for writing zero-length data failed")); + } + HDF5_WRAPPER_RETURN (H5_SUCCESS); +} + +static inline h5_ssize_t +hdf5_get_selected_npoints_of_dataspace ( + hid_t space_id + ) { + HDF5_WRAPPER_ENTER (h5_ssize_t, "%d", space_id); + hssize_t size = H5Sget_select_npoints (space_id); + if (size < 0) + HDF5_WRAPPER_LEAVE ( + h5_error( + H5_ERR_HDF5, + "Cannot determine number of " + "selected elements in dataspace.")); + HDF5_WRAPPER_RETURN (size); +} + +static inline h5_ssize_t +hdf5_get_npoints_of_dataspace ( + hid_t space_id + ) { + HDF5_WRAPPER_ENTER (h5_ssize_t, "%d", space_id); + hssize_t size = H5Sget_simple_extent_npoints (space_id); + if (size < 0) + HDF5_WRAPPER_LEAVE ( + h5_error( + H5_ERR_HDF5, + "Cannot determine number of" + "elements in dataspace.")); + HDF5_WRAPPER_RETURN (size); +} + +static inline int +hdf5_get_dims_of_dataspace ( + hid_t space_id, + hsize_t* dims, + hsize_t* maxdims + ) { + HDF5_WRAPPER_ENTER (int, "%d", space_id); + int rank = H5Sget_simple_extent_dims (space_id, dims, maxdims); + if (rank < 0) + HDF5_WRAPPER_LEAVE ( + h5_error ( + H5_ERR_HDF5, + "Cannot determine rank of dataspace.")); + HDF5_WRAPPER_RETURN (rank); +} + + +/*! + Close space. + + \param[in] f file handle + \param[in] dataspace_id id of space to close + */ +static inline h5_err_t +hdf5_close_dataspace ( + const hid_t dataspace_id + ) { + HDF5_WRAPPER_ENTER (h5_err_t, "dataspace=%d", dataspace_id); + if (dataspace_id <= 0 || dataspace_id == H5S_ALL) + HDF5_WRAPPER_LEAVE (H5_SUCCESS); + + herr_t herr = H5Sclose (dataspace_id); + if (herr < 0) + HDF5_WRAPPER_LEAVE ( + h5_error( + H5_ERR_HDF5, + "Cannot terminate access to dataspace!")); + + HDF5_WRAPPER_RETURN (H5_SUCCESS); +} + +/****** D a t a s e t ********************************************************/ +/*! + Open dataset. H5Dopen wrapper. + + \param[in] f file handle + \param[in] loc_id location id + \param[in] dataset_name name of dataset to open + */ +static inline hid_t +hdf5_open_dataset ( + const hid_t loc_id, + const char* const dataset_name + ) { + HDF5_WRAPPER_ENTER (hid_t, + "loc_id=%d (%s), dataset_name='%s'", + loc_id, + hdf5_get_objname (loc_id), + dataset_name); + hid_t dataset_id = H5Dopen ( + loc_id, + dataset_name, + H5P_DEFAULT); + if (dataset_id < 0) + HDF5_WRAPPER_LEAVE ( + h5_error ( + H5_ERR_HDF5, + "Cannot open dataset '%s/%s'.", + hdf5_get_objname (loc_id), + dataset_name)); + HDF5_WRAPPER_RETURN (dataset_id); +} + +/*! + Create new dataset + + \param[in] f file handle + \param[in] loc_id id of group or file + \param[in] dataset_name name of dataset + \param[in] type_id type used in dataset + \param[in] dataspace_id dataspace of dataset + \param[in] create_prop property list for dataset creation + + */ +static inline hid_t +hdf5_create_dataset ( + hid_t loc_id, + const char* dataset_name, + const hid_t type_id, + const hid_t dataspace_id, + const hid_t create_proplist + ) { + HDF5_WRAPPER_ENTER (hid_t, + "loc_id=%d (%s), dataset_name='%s'", + loc_id, + hdf5_get_objname (loc_id), + dataset_name); + hid_t dataset_id = H5Dcreate ( + loc_id, + dataset_name, + type_id, + dataspace_id, + H5P_DEFAULT, + create_proplist, + H5P_DEFAULT); + if (dataset_id < 0) + HDF5_WRAPPER_LEAVE ( + h5_error( + H5_ERR_HDF5, + "Cannot create dataset '%s/%s'", + hdf5_get_objname (loc_id), + dataset_name)); + HDF5_WRAPPER_RETURN (dataset_id); +} + +/*! + Close dataset. + + \param[in] f file handle + \param[in] dataset_id id of dataset to close + */ +static inline h5_err_t +hdf5_close_dataset ( + const hid_t dataset_id + ) { + HDF5_WRAPPER_ENTER (h5_err_t, + "dataset_id=%d (%s)", + dataset_id, + hdf5_get_objname (dataset_id)); + if (dataset_id < 0) + HDF5_WRAPPER_LEAVE (H5_SUCCESS); + + if (H5Dclose (dataset_id) < 0) { + HDF5_WRAPPER_LEAVE ( + h5_error( + H5_ERR_HDF5, + "Close of dataset '%s' failed.", + hdf5_get_objname (dataset_id))); + } + HDF5_WRAPPER_RETURN (H5_SUCCESS); +} + +/*! + Get dataspace of existing dataset + + \param[in] f file handle + \param[in] dataset_id id of dataset + + */ +static inline hid_t +hdf5_get_dataset_space ( + const hid_t dataset_id + ) { + HDF5_WRAPPER_ENTER (hid_t, + "dataset_id=%d (%s)", + dataset_id, + hdf5_get_objname(dataset_id)); + hid_t dataspace_id = H5Dget_space (dataset_id); + if (dataspace_id < 0) + HDF5_WRAPPER_LEAVE ( + h5_error ( + H5_ERR_HDF5, + "Cannot get dataspace for dataset '%s'.", + hdf5_get_objname (dataset_id))); + HDF5_WRAPPER_RETURN (dataspace_id); +} + +/*! + Wrapper for H5Dwrite. + + \param[in] f file handle + \param[in] dataset_id id of dataset + \param[in] type_id type used in dataset + \param[in] memspace_id id of memory space + \param[in] diskspace_id id of disk space + \param[in] xfer_prop transfer property list + \param[in] buf buffer with date to write + + */ +static inline h5_err_t +hdf5_write_dataset ( + const hid_t dataset_id, + const hid_t type_id, + const hid_t memspace_id, + const hid_t diskspace_id, + const hid_t xfer_prop, + const void* buf + ) { + HDF5_WRAPPER_ENTER (h5_err_t, + "dataset_id=%d (%s) type_id=%d", + dataset_id, + hdf5_get_objname(dataset_id), + type_id); + + herr_t herr = H5Dwrite ( + dataset_id, + type_id, + memspace_id, + diskspace_id, + xfer_prop, + buf); + if (herr < 0) + HDF5_WRAPPER_LEAVE ( + h5_error ( + H5_ERR_HDF5, + "Write to dataset '%s' failed.", \ + hdf5_get_objname (dataset_id))); + + HDF5_WRAPPER_RETURN (H5_SUCCESS); +} + +/* + Wrapper for H5Dread + */ +static inline h5_err_t +hdf5_read_dataset ( + const hid_t dataset_id, + const hid_t type_id, + const hid_t memspace_id, + const hid_t diskspace_id, + const hid_t xfer_prop, + void* const buf ) { + HDF5_WRAPPER_ENTER (h5_err_t, + "dataset_id=%d (%s) type_id=%d", + dataset_id, + hdf5_get_objname(dataset_id), + type_id); + herr_t herr = H5Dread ( + dataset_id, + type_id, + memspace_id, + diskspace_id, + xfer_prop, + buf); + if (herr < 0) + HDF5_WRAPPER_LEAVE ( + h5_error( + H5_ERR_HDF5, + "Error reading dataset '%s'.", + hdf5_get_objname (dataset_id))); + + HDF5_WRAPPER_RETURN (H5_SUCCESS); +} + +static inline hid_t +hdf5_get_dataset_type ( + const hid_t dataset_id + ) { + HDF5_WRAPPER_ENTER (h5_err_t, + "dataset_id=%d (%s)", + dataset_id, + hdf5_get_objname(dataset_id)); + hid_t datatype_id = H5Dget_type (dataset_id); + if (datatype_id < 0) + HDF5_WRAPPER_LEAVE ( + h5_error( + H5_ERR_HDF5, + "Cannot determine dataset type.")); + + HDF5_WRAPPER_RETURN (datatype_id); +} + +static inline h5_err_t +hdf5_set_dataset_extent ( + hid_t dataset_id, + const hsize_t* size + ) { + HDF5_WRAPPER_ENTER (h5_err_t, + "dataset_id=%d (%s), size=%llu", + dataset_id, + hdf5_get_objname(dataset_id), + *size); + if (H5Dset_extent(dataset_id, size) < 0) { + HDF5_WRAPPER_LEAVE ( + h5_error( + H5_ERR_HDF5, + "Changing size of dataset '%s' dimensions failed.", + hdf5_get_objname (dataset_id))); + } + HDF5_WRAPPER_RETURN (H5_SUCCESS); +} + +static inline h5_ssize_t +hdf5_get_npoints_of_dataset ( + hid_t dataset_id + ) { + HDF5_WRAPPER_ENTER (h5_ssize_t, + "dataset_id=%d (%s)", + dataset_id, + hdf5_get_objname(dataset_id)); + hid_t dspace_id; + hsize_t size; + TRY (dspace_id = hdf5_get_dataset_space (dataset_id)); + TRY (size = hdf5_get_npoints_of_dataspace (dspace_id)); + TRY (hdf5_close_dataspace (dspace_id)); + HDF5_WRAPPER_RETURN (size); +} + +static inline h5_ssize_t +hdf5_get_npoints_of_dataset_by_name ( + const hid_t loc_id, + const char* const name + ) { + HDF5_WRAPPER_ENTER (h5_ssize_t, + "loc_id=%d (%s), name='%s'", + loc_id, + hdf5_get_objname(loc_id), + name); + hid_t dset_id; + hsize_t size; + TRY (dset_id = hdf5_open_dataset (loc_id, name)); + TRY (size = hdf5_get_npoints_of_dataset (dset_id)); + TRY (hdf5_close_dataset (dset_id)); + HDF5_WRAPPER_RETURN (size); +} + +/****** D a t a t y p e ******************************************************/ +/*! + Create array type. Wrapper for "H5Tarray_create". + + \param[in] f file handle + \param[in] base_type_id base type + \param[in] rank rank of array + \param[in] dims dimensions + */ +static inline char_p +hdf5_get_type_name ( + hid_t type_id + ) { + if (type_id == H5_INT32_T) + return "H5_INT32_T"; + if (type_id == H5_INT64_T) + return "H5_INT64_T"; + if (type_id == H5_FLOAT32_T) + return "H5_FLOAT32_T"; + if (type_id == H5_FLOAT64_T) + return "H5_FLOAT64_T"; + if (type_id == H5_STRING_T) + return "H5_STRING_T"; + + h5_warn ("Unknown type id %d", type_id); + return "[unknown]"; +} + +static inline const char* +get_class_type_name ( + const hid_t class_id + ) { + const char* const map[] = { + [H5T_INTEGER] "H5T_INTEGER", + [H5T_FLOAT] "H5T_FLOAT", + [H5T_TIME] "H5T_TIME", + [H5T_STRING] "H5T_STRING", + [H5T_BITFIELD] "H5T_BITFIELD", + [H5T_OPAQUE] "H5T_OPAQUE", + [H5T_COMPOUND] "H5T_COMPOUND", + [H5T_REFERENCE] "H5T_REFERENCE", + [H5T_ENUM] "H5T_ENUM", + [H5T_VLEN] "H5T_VLEN", + [H5T_ARRAY] "H5T_ARRAY" + }; + if (class_id < 0 || class_id >= H5T_NCLASSES) { + return ("[unknown]"); + } + return map[class_id]; +} + +static inline hid_t +hdf5_create_array_type ( + const hid_t base_type_id, + const int rank, + const hsize_t* dims + ) { + HDF5_WRAPPER_ENTER (hid_t, + "base_type_id=%d (%s), rank=%d", + base_type_id, + hdf5_get_type_name (base_type_id), + rank); + hid_t type_id = H5Tarray_create (base_type_id, rank, dims); + if (type_id < 0) { + HDF5_WRAPPER_LEAVE ( + h5_error ( + H5_ERR_HDF5, + "Can't create array datatype object with base " + "type %s and rank %d", + hdf5_get_type_name (base_type_id), + rank)); + } + HDF5_WRAPPER_RETURN (type_id); +} + +static inline hid_t +hdf5_create_type ( + H5T_class_t class, + const size_t size + ) { + HDF5_WRAPPER_ENTER (hid_t, + "class=%d (%s)", + class, + get_class_type_name (class)); + hid_t type_id = H5Tcreate (class, size); + if (type_id < 0) { + HDF5_WRAPPER_LEAVE ( + h5_error ( + H5_ERR_HDF5, + "Can't create datatype object of class %s.", + get_class_type_name (class))); + } + HDF5_WRAPPER_RETURN (type_id); +} + +static inline hid_t +hdf5_create_string_type( + const hsize_t len + ) { + HDF5_WRAPPER_ENTER (hid_t, "len = %llu", len); + hid_t type_id = H5Tcopy ( H5T_C_S1 ); + if (type_id < 0) + HDF5_WRAPPER_LEAVE ( + h5_error( + H5_ERR_HDF5, + "Can't duplicate C string type.")); + + herr_t herr = H5Tset_size ( type_id, len ); + if (herr < 0) + HDF5_WRAPPER_LEAVE ( + h5_error( + H5_ERR_HDF5, + "Can't set length of C string type.")); + HDF5_WRAPPER_RETURN (type_id); +} + +static inline h5_err_t +hdf5_insert_type ( + hid_t type_id, + const char* name, + size_t offset, + hid_t field_id + ) { + HDF5_WRAPPER_ENTER (h5_err_t, "type_id=%d, name='%s'", type_id, name); + herr_t herr = H5Tinsert (type_id, name, offset, field_id); + if (herr < 0) + HDF5_WRAPPER_LEAVE ( + h5_error( + H5_ERR_HDF5, + "Can't insert field %s to compound datatype.", + name)); + HDF5_WRAPPER_RETURN (H5_SUCCESS); +} + +static inline h5_err_t +hdf5_close_type ( + hid_t dtype_id + ) { + HDF5_WRAPPER_ENTER (h5_err_t, "dtype_id=%d", dtype_id); + herr_t herr = H5Tclose (dtype_id); + if (herr < 0) + HDF5_WRAPPER_LEAVE ( + h5_error ( + H5_ERR_HDF5, + "Cannot release datatype.")); + HDF5_WRAPPER_RETURN (H5_SUCCESS); +} + +/****** P r o p e r t y ******************************************************/ + +static inline hid_t +hdf5_create_property ( + hid_t cls_id + ) { + HDF5_WRAPPER_ENTER (hid_t, "cls_id=%d", cls_id); + hid_t prop_id = H5Pcreate (cls_id); + if (prop_id < 0) + HDF5_WRAPPER_LEAVE ( + h5_error ( + H5_ERR_HDF5, + "Cannot create property list.")); + HDF5_WRAPPER_RETURN (prop_id); +} + +/*! + Get create properties of existing dataset + + \param[in] f file handle + \param[in] dataset_id id of dataset + + */ +static inline hid_t +hdf5_get_dataset_create_plist ( + const hid_t dataset_id + ) { + HDF5_WRAPPER_ENTER (hid_t, "dataset_id=%d (%s)", + dataset_id, + hdf5_get_objname (dataset_id)); + hid_t plist_id = H5Dget_create_plist (dataset_id); + if (plist_id < 0) + HDF5_WRAPPER_LEAVE ( + h5_error ( + H5_ERR_HDF5, + "Cannot get create properties for dataset '%s'.", + hdf5_get_objname (dataset_id))); + HDF5_WRAPPER_RETURN (plist_id); +} + +static inline h5_err_t +hdf5_set_chunk_property ( + hid_t plist, + int rank, + hsize_t* dims + ) { + HDF5_WRAPPER_ENTER (h5_err_t, + "plist=%d, rank=%d, dims[0]=%llu ...", + plist, rank, dims[0]); + if (H5Pset_chunk (plist, rank, dims) < 0) + HDF5_WRAPPER_LEAVE ( + h5_error ( + H5_ERR_HDF5, + "Cannot add chunking property to list.")); + + HDF5_WRAPPER_RETURN (H5_SUCCESS); +} + +static inline h5_err_t +hdf5_get_chunk_property ( + hid_t plist, + int rank, + hsize_t* dims + ) { + HDF5_WRAPPER_ENTER (h5_err_t, "plist=%d, rank=%d", plist, rank); + if (H5Pget_chunk (plist, rank, dims) < 0) + HDF5_WRAPPER_LEAVE ( + h5_error ( + H5_ERR_HDF5, + "Cannot get chunking property from list.")); + + HDF5_WRAPPER_RETURN (H5_SUCCESS); +} + +static inline h5_err_t +hdf5_set_layout_property ( + hid_t plist, + H5D_layout_t layout + ) { + HDF5_WRAPPER_ENTER (h5_err_t, "plist=%d", plist); + if (H5Pset_layout (plist, layout) < 0) + HDF5_WRAPPER_LEAVE ( + h5_error ( + H5_ERR_HDF5, + "Cannot add layout property to list.")); + + HDF5_WRAPPER_RETURN (H5_SUCCESS); +} + +#ifdef PARALLEL_IO +static inline h5_err_t +hdf5_set_fapl_mpio_property ( + hid_t fapl_id, + MPI_Comm comm, + MPI_Info info + ) { + HDF5_WRAPPER_ENTER (h5_err_t, + "fapl_id=%d, comm=..., info=...", + fapl_id); + if (H5Pset_fapl_mpio (fapl_id, comm, info) < 0) + HDF5_WRAPPER_LEAVE ( + h5_error ( + H5_ERR_HDF5, + "Cannot store IO communicator information to the " + "file access property list.")); + HDF5_WRAPPER_RETURN (H5_SUCCESS); +} + +static inline h5_err_t +hdf5_set_fapl_mpiposix_property ( + hid_t fapl_id, + MPI_Comm comm, + hbool_t use_gpfs + ) { + HDF5_WRAPPER_ENTER (h5_err_t, + "fapl_id=%d, comm=..., use_gpfs=%d", + fapl_id, (int)use_gpfs); + if ( H5Pset_fapl_mpiposix (fapl_id, comm, use_gpfs) < 0) + HDF5_WRAPPER_LEAVE ( + h5_error ( + H5_ERR_HDF5, + "Cannot store IO communicator information to" + " the file access property list.")); + HDF5_WRAPPER_RETURN (H5_SUCCESS); +} + +static inline h5_err_t +hdf5_set_dxpl_mpio_property ( + hid_t dxpl_id, + H5FD_mpio_xfer_t mode + ) { + HDF5_WRAPPER_ENTER (h5_err_t, "dxpl_id=%d, mode=%d",dxpl_id,(int)mode); + if (H5Pset_dxpl_mpio (dxpl_id, mode) < 0) + HDF5_WRAPPER_LEAVE ( + h5_error ( + H5_ERR_HDF5, + "Cannot store IO communicator information to" + " the dataset transfer property list.")); + HDF5_WRAPPER_RETURN (H5_SUCCESS); +} +#endif + +static inline h5_err_t +hdf5_set_mdc_property ( + hid_t fapl_id, + H5AC_cache_config_t *config + ) { + HDF5_WRAPPER_ENTER (h5_err_t, "fapl_id=%d, config=%p",fapl_id,config); + if (H5Pset_mdc_config (fapl_id, config) < 0) + HDF5_WRAPPER_LEAVE ( + h5_error ( + H5_ERR_HDF5, + "Cannot store metadata cache configuration in" + " the file access property list.")); + HDF5_WRAPPER_RETURN (H5_SUCCESS); +} + +static inline h5_err_t +hdf5_get_mdc_property ( + hid_t fapl_id, + H5AC_cache_config_t *config + ) { + HDF5_WRAPPER_ENTER (h5_err_t, "fapl_id=%d, config=%p",fapl_id,config); + if (H5Pget_mdc_config (fapl_id, config) < 0) + HDF5_WRAPPER_LEAVE ( + h5_error ( + H5_ERR_HDF5, + "Cannot get metadata cache configuration in" + " the file access property list.")); + HDF5_WRAPPER_RETURN (H5_SUCCESS); +} + +static inline h5_err_t +hdf5_set_btree_ik_property ( + const hid_t fcpl_id, + const hsize_t btree_ik + ) { + HDF5_WRAPPER_ENTER (h5_err_t, + "fapl_id=%d, btree_ik=%llu", + fcpl_id, btree_ik); + if (H5Pset_istore_k (fcpl_id, btree_ik) < 0) + HDF5_WRAPPER_LEAVE ( + h5_error ( + H5_ERR_HDF5, + "Cannot set btree size in the " + "file access property list.")); + HDF5_WRAPPER_RETURN (H5_SUCCESS); +} + +static inline h5_err_t +hdf5_set_alignment_property ( + hid_t plist, + hsize_t threshold, + hsize_t alignment + ) { + HDF5_WRAPPER_ENTER (h5_err_t, + "plist=%d, threshold=%llu, alignment=%llu", + plist, threshold, alignment); + if (H5Pset_alignment (plist, threshold, alignment) < 0) + HDF5_WRAPPER_LEAVE ( + h5_error ( + H5_ERR_HDF5, + "Cannot set alignment property to %llu and threshold %llu", + alignment, threshold)); + HDF5_WRAPPER_RETURN (H5_SUCCESS); +} + +static inline h5_err_t +hdf5_set_meta_block_size ( + hid_t fapl_id, + hsize_t size + ) { + HDF5_WRAPPER_ENTER (h5_err_t, + "fapl_id=%d, size=%llu", + fapl_id, size); + if (H5Pset_meta_block_size (fapl_id, size) < 0) + HDF5_WRAPPER_LEAVE ( + h5_error ( + H5_ERR_HDF5, + "Cannot set meta block size property to %llu", + size)); + HDF5_WRAPPER_RETURN (H5_SUCCESS); +} + +static inline h5_err_t +hdf5_set_fapl_core ( + hid_t fapl_id, + size_t increment, + hbool_t backing_store + ) { + HDF5_WRAPPER_ENTER (h5_err_t, + "fapl_id=%d, size=%zu, backing_store=%d", + fapl_id, increment, backing_store); + if (H5Pset_fapl_core (fapl_id, increment, backing_store)) + HDF5_WRAPPER_LEAVE ( + h5_error ( + H5_ERR_HDF5, + "Cannot set property to use the H5FD_CORE driver.")); + HDF5_WRAPPER_RETURN (H5_SUCCESS); +} + +static inline h5_err_t +hdf5_close_property ( + hid_t prop + ) { + HDF5_WRAPPER_ENTER (h5_err_t, "prop=%d", prop); + if (H5Pclose (prop) < 0) + HDF5_WRAPPER_LEAVE ( + h5_error ( + H5_ERR_HDF5, + "Cannot close property.")); + HDF5_WRAPPER_RETURN (H5_SUCCESS); +} + +/****** F i l e **************************************************************/ + +static inline h5_err_t +hdf5_close_file ( + hid_t file_id + ) { + HDF5_WRAPPER_ENTER (h5_err_t, "file_id=%d (%s)", + file_id, hdf5_get_objname (file_id)); + if (H5Fclose (file_id) < 0) + HDF5_WRAPPER_LEAVE ( + h5_error ( + H5_ERR_HDF5, + "Cannot close file '%s'.", + hdf5_get_objname (file_id))); + HDF5_WRAPPER_RETURN (H5_SUCCESS); +} + +static inline h5_err_t +hdf5_close ( + void + ) { + HDF5_WRAPPER_ENTER (h5_err_t, "%s", "void"); + if (H5close () < 0) + HDF5_WRAPPER_LEAVE ( + h5_error ( + H5_ERR_HDF5, + "Cannot close HDF5 library.")); + HDF5_WRAPPER_RETURN (H5_SUCCESS); +} + +static inline h5_err_t +hdf5_flush ( + hid_t obj_id, + H5F_scope_t scope + ) { + HDF5_WRAPPER_ENTER (h5_err_t, + "obj_id=%d (%s)", + obj_id, + hdf5_get_objname (obj_id)); + if (H5Fflush (obj_id, scope) < 0) + HDF5_WRAPPER_LEAVE ( + h5_error ( + H5_ERR_HDF5, + "Cannot flush data \"%s\".", + hdf5_get_objname (obj_id))); + HDF5_WRAPPER_RETURN (H5_SUCCESS); +} + +/****** E r r o r h a n d l i n g ********************************************/ + +static inline h5_err_t +hdf5_set_errorhandler ( + hid_t estack_id, + H5E_auto_t func, + void* client_data + ) { + HDF5_WRAPPER_ENTER (h5_err_t, + "estack_id=%d, func=%p, client_data=%p", + estack_id, func, client_data); + if (H5Eset_auto (estack_id, func, client_data) < 0) + HDF5_WRAPPER_LEAVE ( + h5_error ( + H5_ERR_HDF5, + "Cannot initialize H5.")); + HDF5_WRAPPER_RETURN (H5_SUCCESS); +} + +/****** A t t r i b u t e ****************************************************/ +static inline hid_t +hdf5_attribute_exists ( + hid_t loc_id, + const char* attrib_name + ) { + HDF5_WRAPPER_ENTER (hid_t, + "loc_id=%d (%s), attr_name='%s'", + loc_id, hdf5_get_objname (loc_id), attrib_name); + htri_t exists = H5Aexists (loc_id, attrib_name); + if (exists < 0) + HDF5_WRAPPER_LEAVE ( + h5_error ( + H5_ERR_HDF5, + "Cannot query attribute '%s' of '%s'.", + attrib_name, + hdf5_get_objname (loc_id))); + HDF5_WRAPPER_RETURN (exists); +} + +static inline hid_t +hdf5_open_attribute ( + hid_t loc_id, + const char* attrib_name + ) { + HDF5_WRAPPER_ENTER (hid_t, + "loc_id=%d (%s), attr_name='%s'", + loc_id, hdf5_get_objname (loc_id), attrib_name); + hid_t attrib_id = H5Aopen (loc_id, attrib_name, H5P_DEFAULT); + if (attrib_id < 0) + HDF5_WRAPPER_LEAVE ( + h5_error ( + H5_ERR_HDF5, + "Cannot open attribute '%s' of '%s'.", + attrib_name, + hdf5_get_objname (loc_id))); + HDF5_WRAPPER_RETURN (attrib_id); +} + +static inline hid_t +hdf5_open_attribute_idx ( + hid_t loc_id, + unsigned int idx + ) { + HDF5_WRAPPER_ENTER (hid_t, + "loc_id=%d (%s), idx=%u", + loc_id, hdf5_get_objname (loc_id), idx); + hid_t attr_id = H5Aopen_idx (loc_id, idx); + if (attr_id < 0) + HDF5_WRAPPER_LEAVE ( + h5_error ( + H5_ERR_HDF5, + "Cannot open attribute '%u' of '%s'.", + idx, + hdf5_get_objname (loc_id))); + HDF5_WRAPPER_RETURN (attr_id); +} + +static inline hid_t +hdf5_open_attribute_by_name ( + hid_t loc_id, + const char* obj_name, + const char* attr_name + ) { + HDF5_WRAPPER_ENTER (hid_t, + "loc_id=%d (%s), obj_name='%s', attr_name='%s'", + loc_id, hdf5_get_objname (loc_id), + obj_name, attr_name); + hid_t attr_id = H5Aopen_by_name ( + loc_id, + obj_name, + attr_name, + H5P_DEFAULT, + H5P_DEFAULT); + if (attr_id < 0) + HDF5_WRAPPER_LEAVE ( + h5_error ( + H5_ERR_HDF5, + "Cannot open attribute '%s' of '%s'.", + attr_name, + obj_name)); + HDF5_WRAPPER_RETURN (attr_id); +} + +static inline hid_t +hdf5_create_attribute ( + hid_t loc_id, + const char* attr_name, + hid_t type_id, + hid_t space_id, + hid_t acpl_id, + hid_t aapl_id + ) { + HDF5_WRAPPER_ENTER (hid_t, + "loc_id=%d (%s), attr_name='%s', type_id=%d", + loc_id, hdf5_get_objname (loc_id), + attr_name, type_id); + hid_t attr_id = H5Acreate ( + loc_id, + attr_name, + type_id, + space_id, + acpl_id, + aapl_id); + if (attr_id < 0) + HDF5_WRAPPER_LEAVE ( + h5_error ( + H5_ERR_HDF5, + "Cannot create attribute '%s' for '%s'.", + attr_name, + hdf5_get_objname (loc_id))); + HDF5_WRAPPER_RETURN (attr_id); +} + +static inline h5_err_t +hdf5_read_attribute ( + hid_t attr_id, + hid_t mem_type_id, + void* buf + ) { + HDF5_WRAPPER_ENTER (h5_err_t, + "attr_id=%d (%s), mem_type_id=%d, buf=%p", + attr_id, hdf5_get_objname (attr_id), + mem_type_id, buf); + if (H5Aread (attr_id, mem_type_id, buf) < 0) + HDF5_WRAPPER_LEAVE ( + h5_error ( + H5_ERR_HDF5, + "Cannot read attribute '%s'.", + hdf5_get_objname (attr_id))); + HDF5_WRAPPER_RETURN (H5_SUCCESS); +} + +/* + Wrapper for H5Awrite. + */ +static inline h5_err_t +hdf5_write_attribute ( + hid_t attr_id, + hid_t mem_type_id, + const void* buf + ) { + HDF5_WRAPPER_ENTER (h5_err_t, + "attr_id=%d (%s), mem_type_id=%d, buf=%p", + attr_id, hdf5_get_objname (attr_id), + mem_type_id, buf); + if (H5Awrite (attr_id, mem_type_id, buf) < 0) + HDF5_WRAPPER_LEAVE ( + h5_error ( + H5_ERR_HDF5, + "Cannot write attribute '%s'.", + hdf5_get_objname (attr_id))); + + HDF5_WRAPPER_RETURN (H5_SUCCESS); +} + +static inline h5_ssize_t +hdf5_get_attribute_name ( + hid_t attr_id, + size_t buf_size, + char *buf + ) { + HDF5_WRAPPER_ENTER (h5_ssize_t, + "attr_id=%d (%s), buf_size=%llu, buf=%p", + attr_id, hdf5_get_objname (attr_id), + (unsigned long long)buf_size, buf); + ssize_t size = H5Aget_name ( attr_id, buf_size, buf ); + if (size < 0) + HDF5_WRAPPER_LEAVE ( + h5_error ( + H5_ERR_HDF5, + "Cannot get attribute name." )); + HDF5_WRAPPER_RETURN ((h5_size_t)size); +} + +static inline hid_t +hdf5_get_attribute_type ( + hid_t attr_id + ) { + HDF5_WRAPPER_ENTER (hid_t, + "attr_id=%d (%s)", + attr_id, hdf5_get_objname (attr_id)); + hid_t datatype_id = H5Aget_type (attr_id); + if (datatype_id < 0) + HDF5_WRAPPER_LEAVE ( + h5_error ( + H5_ERR_HDF5, + "Cannot get type of attribute '%s'.", + hdf5_get_objname (attr_id))); + HDF5_WRAPPER_RETURN (datatype_id); +} + +static inline hid_t +hdf5_get_attribute_dataspace ( + hid_t attr_id + ) { + HDF5_WRAPPER_ENTER (hid_t, + "attr_id=%d (%s)", + attr_id, hdf5_get_objname (attr_id)); + hid_t space_id = H5Aget_space (attr_id); + if (space_id < 0) + HDF5_WRAPPER_LEAVE ( + h5_error ( + H5_ERR_HDF5, + "Cannot get dataspace of attribute '%s'.", + hdf5_get_objname (attr_id))); + HDF5_WRAPPER_RETURN (space_id); +} + +static inline int +hdf5_get_num_attribute ( + hid_t loc_id + ) { + HDF5_WRAPPER_ENTER (int, + "loc_id=%d (%s)", + loc_id, hdf5_get_objname (loc_id)); + int num = H5Aget_num_attrs (loc_id); + if (num < 0) + HDF5_WRAPPER_LEAVE ( + h5_error ( + H5_ERR_HDF5, + "Cannot get number of attributes of '%s'.", + hdf5_get_objname (loc_id))); + HDF5_WRAPPER_RETURN (num); +} + +static inline herr_t +hdf5_delete_attribute ( + hid_t loc_id, + const char* attrib_name + ) { + HDF5_WRAPPER_ENTER (herr_t, + "loc_id=%d (%s), attr_name='%s'", + loc_id, hdf5_get_objname (loc_id), attrib_name); + herr_t herr = H5Adelete (loc_id, attrib_name); + if (herr < 0) + HDF5_WRAPPER_LEAVE ( + h5_error ( + H5_ERR_HDF5, + "Cannot delete attribute '%s' of '%s'.", + attrib_name, + hdf5_get_objname (loc_id))); + HDF5_WRAPPER_RETURN (herr); +} + +static inline h5_err_t +hdf5_close_attribute ( + hid_t attr_id + ) { + HDF5_WRAPPER_ENTER (h5_err_t, + "attr_id=%d (%s)", + attr_id, hdf5_get_objname (attr_id)); + if (H5Aclose (attr_id)) + HDF5_WRAPPER_LEAVE ( + h5_error ( + H5_ERR_HDF5, + "Cannot close attribute '%s'.", + hdf5_get_objname (attr_id))); + + HDF5_WRAPPER_RETURN (H5_SUCCESS); +} + +#endif diff --git a/src/h5core/h5_hsearch.c b/src/h5core/h5_hsearch.c new file mode 100644 index 0000000..ad7c26b --- /dev/null +++ b/src/h5core/h5_hsearch.c @@ -0,0 +1,380 @@ +/* Copyright (C) 1993,1995-1997,2002,2005,2007,2008 + Free Software Foundation, Inc. + This file is part of the GNU C Library. + Contributed by Ulrich Drepper , 1993. + + The GNU C Library is free software; you can redistribute it and/or + modify it under the terms of the GNU Lesser General Public + License as published by the Free Software Foundation; either + version 2.1 of the License, or (at your option) any later version. + + The GNU C Library is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + Lesser General Public License for more details. + + You should have received a copy of the GNU Lesser General Public + License along with the GNU C Library; if not, write to the Free + Software Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA + 02111-1307 USA. */ + +/* + Copyright (c) 2006-2013, The Regents of the University of California, + through Lawrence Berkeley National Laboratory (subject to receipt of any + required approvals from the U.S. Dept. of Energy) and the Paul Scherrer + Institut (Switzerland). All rights reserved. + + License: see file COPYING in top level of source distribution. +*/ + +#include +#include +#include +#include + +#include "h5_debug_private.h" +#include "h5_hsearch_private.h" + +#include "h5core/h5_types.h" +#include "h5core/h5_syscall.h" + + +/* [Aho,Sethi,Ullman] Compilers: Principles, Techniques and Tools, 1986 + [Knuth] The Art of Computer Programming, part 3 (6.4) */ + + +/* The reentrant version has no static variables to maintain the state. + Instead the interface of all functions is extended to take an argument + which describes the current status. */ +typedef struct _ENTRY { + unsigned int used; + void* entry; +} _ENTRY; + + +/* For the used double hash method the table size has to be a prime. To + correct the user given table size we need a prime test. This trivial + algorithm is adequate because + a) the code is (most probably) called a few times per program run and + b) the number is small because the table must fit in the core */ +static int +isprime (const unsigned int number) { + /* no even number will be passed */ + unsigned int div = 3; + + while (div * div < number && number % div != 0) + div += 2; + + return number % div != 0; +} + +/* Before using the hash table we must allocate memory for it. + Test for an existing table are done. We allocate one element + more as the found prime number says. This is done for more effective + indexing as explained in the comment for the hsearch function. + The contents of the table is zeroed, especially the field used + becomes zero. */ +h5_err_t +h5priv_hcreate ( + size_t nel, + h5_hashtable_t* htab, + int (*compare)(const void*, const void*), + unsigned int (*compute_hash)(const void*), + h5_err_t (*free_entry)(const void*) + ) { + H5_PRIV_API_ENTER (h5_err_t, + "nel=%llu, htab=%p, compare=%p, " + "compute_hash=%p, free_entry=%p", + (long long unsigned)nel, + htab, compare, compute_hash, free_entry); + + /* Test for correct arguments. */ + if (htab == NULL) { + H5_PRIV_API_LEAVE (h5_error_internal ()); + } + /* Change nel to the first prime number not smaller as nel. */ + nel |= 1; /* make odd */ + while (!isprime (nel)) + nel += 2; + + htab->size = nel; + htab->filled = 0; + htab->compare = compare; + htab->compute_hash = compute_hash; + htab->free_entry = free_entry; + + /* allocate memory and zero out */ + TRY (htab->table = (_ENTRY *) h5_calloc ( + htab->size + 1, sizeof (_ENTRY))); + + /* everything went alright */ + H5_PRIV_API_RETURN (H5_SUCCESS); +} + +/* + Resize hash table. Actually we create a new hash table with the specified + size and copy the old data. + */ +h5_err_t +h5priv_hgrow ( + size_t nel, // number of entries to grow + h5_hashtable_t* htab // hash table to resize + ) { + H5_PRIV_API_ENTER (h5_err_t, + "nel=%llu, htab=%p", + (long long unsigned)nel, htab); + if (htab == NULL) { + h5_error_internal (); + } + nel += htab->size; // new size + + // create new hash table + h5_hashtable_t __htab; + memset (&__htab, 0, sizeof (__htab)); + h5_debug ("Resize hash table from %zu to %zu elements.", htab->size, nel); + TRY (h5priv_hcreate (nel, &__htab, htab->compare, + htab->compute_hash, htab->free_entry)); + if (htab->table != NULL) { + h5_debug ("New hash table created, filling ..."); + + // add all entries to new hash table + unsigned int idx; + for (idx = 1; idx <= htab->size; idx++) { + if (htab->table[idx].used) { + void* ventry; + TRY (h5priv_hsearch ( + htab->table[idx].entry, + H5_ENTER, + &ventry, + &__htab)); + if (idx % 1000000 == 0) { + h5_debug ("."); + } + } + } + /* Free used memory. */ + TRY (h5_free (htab->table)); + h5_debug ("Old hash table removed"); + } + *htab = __htab; + H5_PRIV_API_RETURN (H5_SUCCESS); +} + +static inline h5_err_t +hwalk ( + struct hsearch_data* htab, + h5_err_t (*visit)(const void *item) + ) { + H5_PRIV_FUNC_ENTER (h5_err_t, "htab=%p, visit=%p", htab, visit); + unsigned int idx = 1; + for (idx = 1; idx < htab->size; idx++) { + if (htab->table[idx].used) { + TRY ((*visit)(&htab->table[idx].entry)); + } + } + H5_PRIV_FUNC_RETURN (H5_SUCCESS); +} + +void* +h5priv_htraverse ( + struct hsearch_data* htab, + unsigned int* idx + ) { + assert (*idx > 0); + for (; *idx < htab->size; (*idx)++) { + if (htab->table[*idx].used) { + void* result = htab->table[*idx].entry; + (*idx)++; + return result; + } + } + return NULL; +} + + +/* After using the hash table it has to be destroyed. The used memory can + be freed and the local static variable can be marked as not used. */ +h5_err_t +h5priv_hdestroy ( + struct hsearch_data* htab + ) { + H5_PRIV_API_ENTER (h5_err_t, "htab=%p", htab); + /* Test for correct arguments. */ + if (htab == NULL) { + H5_PRIV_API_LEAVE (h5_error_internal ()); + } + /* Free used memory. */ + if (htab->free_entry) { + TRY (hwalk (htab, htab->free_entry)); + } + TRY (h5_free (htab->table)); + + /* the sign for an existing table is an value != NULL in htable */ + htab->table = NULL; + H5_PRIV_API_RETURN (H5_SUCCESS); +} + + + +/* This is the search function. It uses double hashing with open addressing. + The argument item.key has to be a pointer to an zero terminated, most + probably strings of chars. The function for generating a number of the + strings is simple but fast. It can be replaced by a more complex function + like ajw (see [Aho,Sethi,Ullman]) if the needs are shown. + + We use an trick to speed up the lookup. The table is created by hcreate + with one more element available. This enables us to use the index zero + special. This index will never be used because we store the first hash + index in the field used where zero means not used. Every other value + means used. The used field can be used as a first fast comparison for + equality of the stored and the parameter value. This helps to prevent + unnecessary expensive calls of strcmp. */ +h5_err_t +h5priv_hsearch ( + void* item, + const h5_action_t action, + void** retval, + struct hsearch_data* htab + ) { + H5_PRIV_API_ENTER (h5_err_t, + "item=%p, action=%d, retval=%p, htab=%p", + item, (int)action, retval, htab); + unsigned int hval; + unsigned int idx; + + /* Compute an value for the given key. Perhaps use a better method. */ + hval = htab->compute_hash(item); + + /* First hash function: simply take the modul but prevent zero. */ + idx = hval % htab->size + 1; + + if (htab->table[idx].used) { + /* Further action might be required according to the action + value. */ + if (htab->table[idx].used == hval + && (htab->compare (item, htab->table[idx].entry) == 0) ) { + if (retval) { + *retval = htab->table[idx].entry; + } + H5_PRIV_API_LEAVE (H5_SUCCESS); + } + + /* Second hash function, as suggested in [Knuth] */ + unsigned int hval2 = 1 + hval % (htab->size - 2); + unsigned int first_idx = idx; + + do { + /* Because SIZE is prime this guarantees to step + through all available indices. */ + if (idx <= hval2) + idx = htab->size + idx - hval2; + else + idx -= hval2; + + /* If we visited all entries leave the loop + unsuccessfully. */ + if (idx == first_idx) + break; + + /* If entry is found use it. */ + if (htab->table[idx].used == hval + && (htab->compare ( + item, htab->table[idx].entry) == 0) ) { + if (retval) { + *retval = htab->table[idx].entry; + } + H5_PRIV_API_LEAVE (H5_SUCCESS); + } + } while (htab->table[idx].used); + } + + /* An empty bucket has been found. */ + if (action == H5_ENTER) { + /* If table is full and another entry should be entered return + with error. */ + if (htab->filled == htab->size) { + if (retval) { + *retval = NULL; + } + H5_PRIV_API_LEAVE (h5_error_internal ()); + } + + htab->table[idx].used = hval; + htab->table[idx].entry = item; + + ++htab->filled; + + if (retval) { + *retval = htab->table[idx].entry; + } + H5_PRIV_API_LEAVE (H5_SUCCESS); + } else if (action == H5_REMOVE) { + htab->table[idx].used = 0; /* mark as unused, but */ + *retval = htab->table[idx].entry; /* return ptr to entry */ + H5_PRIV_API_LEAVE (H5_SUCCESS); + } + if (retval) *retval = NULL; + h5_debug ("Key not found in hash table."); + H5_PRIV_API_RETURN (H5_NOK); +} + +typedef struct { + char* key; +} h5_hitem_string_keyed_t; + +static int +cmp_string_keyed ( + const void* __a, + const void* __b + ) { + h5_hitem_string_keyed_t *a = (h5_hitem_string_keyed_t*) __a; + h5_hitem_string_keyed_t *b = (h5_hitem_string_keyed_t*) __b; + return strcmp (a->key, b->key); +} + +static unsigned int +compute_string_keyed ( + const void* __entry + ) { + h5_hitem_string_keyed_t* entry = (h5_hitem_string_keyed_t*) __entry; + unsigned int len = strlen (entry->key); + unsigned int hval = len; + unsigned int count = len; + while (count-- > 0) { + hval <<= 4; + hval += entry->key[count]; + } + return hval; +} + +static h5_err_t +free_string_keyed ( + const void* __entry + ) { + H5_PRIV_FUNC_ENTER (h5_err_t, "__entry=%p", __entry); + h5_hitem_string_keyed_t* entry = (h5_hitem_string_keyed_t*) __entry; + TRY (h5_free (entry->key)); + TRY (h5_free (entry)); + H5_PRIV_FUNC_RETURN (H5_SUCCESS); +} + +h5_err_t +h5priv_hcreate_string_keyed ( + size_t nel, + h5_hashtable_t* htab, + h5_err_t (*free_entry)(const void*) + ) { + H5_PRIV_API_ENTER (h5_err_t, "htab=%p, free_entry=%p", htab, free_entry); + if (free_entry == NULL) { + TRY (h5priv_hcreate (nel, htab, + cmp_string_keyed, + compute_string_keyed, + free_string_keyed)); + } else { + TRY (h5priv_hcreate (nel, htab, + cmp_string_keyed, + compute_string_keyed, + free_entry)); + } + H5_PRIV_API_RETURN (H5_SUCCESS); +} diff --git a/src/h5core/h5_hsearch_private.h b/src/h5core/h5_hsearch_private.h new file mode 100644 index 0000000..a45f970 --- /dev/null +++ b/src/h5core/h5_hsearch_private.h @@ -0,0 +1,77 @@ +/* + Copyright (c) 2006-2013, The Regents of the University of California, + through Lawrence Berkeley National Laboratory (subject to receipt of any + required approvals from the U.S. Dept. of Energy) and the Paul Scherrer + Institut (Switzerland). All rights reserved. + + License: see file COPYING in top level of source distribution. +*/ + +#ifndef __H5_HSEARCH_PRIVATE_H +#define __H5_HSEARCH_PRIVATE_H + +#include "h5core/h5_types.h" + +typedef struct hsearch_data { + struct _ENTRY *table; + size_t size; + size_t filled; + int (*compare)(const void*, const void*); + unsigned int (*compute_hash)(const void*); + h5_err_t (*free_entry)(const void*); +} h5_hashtable_t; + +/* Action which shall be performed in the call to hsearch. */ +typedef enum { + H5_FIND, + H5_ENTER, + H5_REMOVE +} h5_action_t; + +typedef struct h5_entry { + void* dta; +} h5_entry_t; + +/* Reentrant versions which can handle multiple hashing tables at the + same time. */ +extern h5_err_t +h5priv_hsearch ( + void* item, + const h5_action_t action, + void** retval, + h5_hashtable_t* htab + ); + +extern h5_err_t +h5priv_hcreate ( + size_t __nel, + h5_hashtable_t* __htab, + int (*compare)(const void*, const void*), + unsigned int (*compute_hash)(const void*), + h5_err_t (*free_entry)(const void*) + ); + +extern h5_err_t +h5priv_hgrow ( + size_t nel, + h5_hashtable_t* htab + ); + +extern h5_err_t +h5priv_hdestroy ( + h5_hashtable_t* __htab + ); + +extern h5_err_t +h5priv_hcreate_string_keyed ( + size_t nel, + h5_hashtable_t* htab, + h5_err_t (*free_entry)(const void*) + ); + +extern void* +h5priv_htraverse ( + struct hsearch_data* htab, + unsigned int* idx + ); +#endif diff --git a/src/h5core/h5_init.c b/src/h5core/h5_init.c new file mode 100644 index 0000000..17992ab --- /dev/null +++ b/src/h5core/h5_init.c @@ -0,0 +1,689 @@ +#include +#include /* va_arg - System dependent ?! */ +#include +#include + +#include "h5core/h5.h" +#include "h5_hdf5_private.h" + +#include "h5_mpi_private.h" +#include "h5t_types_private.h" +#include "h5t_tags_private.h" + + + +int h5_initialized = 0; +h5_dta_types_t h5_dta_types; // type ids' for base & compound data types +int h5_myproc = 0; // proc id + +/* + create several HDF5 types + */ +static inline h5_err_t +create_array_types ( + void + ) { + H5_PRIV_FUNC_ENTER (h5_err_t, "%s", "void"); + + hsize_t dims[1] = { 3 }; + TRY( + h5_dta_types.h5_coord3d_t = hdf5_create_array_type ( + H5_FLOAT64_T, + 1, + dims) + ); + TRY( + h5_dta_types.h5_3glb_idx_t = hdf5_create_array_type ( + H5_ID_T, + 1, + dims) + ); + dims[0] = 4; + TRY( + h5_dta_types.h5_4glb_idx_t = hdf5_create_array_type ( + H5_ID_T, + 1, + dims) + ); + TRY( + h5_dta_types.h5_4chk_idx_t = hdf5_create_array_type ( + H5_INT32_T, + 1, + dims) + ); + dims[0] = 6; + TRY( + h5_dta_types.h5_coord6d_t = hdf5_create_array_type ( + H5_FLOAT64_T, + 1, + dims) + ); + H5_PRIV_FUNC_RETURN (H5_SUCCESS); +} + +static inline h5_err_t +create_vertex_type ( + void + ) { + H5_PRIV_FUNC_ENTER (h5_err_t, "%s", "void"); + + TRY( + h5_dta_types.h5_vertex_t = hdf5_create_type ( + H5_COMPOUND_T, + sizeof (h5_glb_vertex_t)) ); + TRY( + hdf5_insert_type ( + h5_dta_types.h5_vertex_t, + "idx", + HOFFSET (h5_glb_vertex_t, idx), + H5_ID_T) ); + TRY( + hdf5_insert_type ( + h5_dta_types.h5_vertex_t, + "P", + HOFFSET (h5_glb_vertex_t, P), + h5_dta_types.h5_coord3d_t) ); + + H5_PRIV_FUNC_RETURN (H5_SUCCESS); +} + +static inline h5_err_t +create_triangle_type ( + void + ) { + H5_PRIV_FUNC_ENTER (h5_err_t, "%s", "void"); + + TRY( + h5_dta_types.h5_triangle_t = hdf5_create_type ( + H5_COMPOUND_T, + sizeof (h5_glb_tri_t)) ); + TRY( + hdf5_insert_type ( + h5_dta_types.h5_triangle_t, + "idx", + HOFFSET (h5_glb_tri_t, idx), + H5_ID_T) ); + TRY( + hdf5_insert_type ( + h5_dta_types.h5_triangle_t, + "parent_idx", + HOFFSET (h5_glb_tri_t, parent_idx), + H5_ID_T) ); + TRY( + hdf5_insert_type ( + h5_dta_types.h5_triangle_t, + "child_idx", + HOFFSET(h5_glb_tri_t, child_idx), + H5_ID_T) ); + TRY( + hdf5_insert_type ( + h5_dta_types.h5_triangle_t, + "level_idx", + HOFFSET(h5_glb_tri_t, level_idx), + H5_INT16_T) ); + TRY( + hdf5_insert_type ( + h5_dta_types.h5_triangle_t, + "refinement", + HOFFSET(h5_glb_tri_t, refinement), + H5_INT16_T) ); + TRY( + hdf5_insert_type ( + h5_dta_types.h5_triangle_t, + "flags", + HOFFSET(h5_glb_tri_t, flags), + H5_INT32_T) ); + TRY( + hdf5_insert_type ( + h5_dta_types.h5_triangle_t, + "vertex_indices", + HOFFSET (h5_glb_tri_t, vertex_indices), + h5_dta_types.h5_3glb_idx_t) ); + TRY( + hdf5_insert_type ( + h5_dta_types.h5_triangle_t, + "neighbor_indices", + HOFFSET(h5_glb_tri_t, neighbor_indices), + h5_dta_types.h5_3glb_idx_t) ); + + H5_PRIV_FUNC_RETURN (H5_SUCCESS); +} + +static inline h5_err_t +create_tag_types ( + void + ) { + H5_PRIV_FUNC_ENTER (h5_err_t, "%s", "void"); + + TRY ( + h5_dta_types.h5t_glb_tag_idx_t = hdf5_create_type ( + H5_COMPOUND_T, + sizeof (h5t_glb_tag_idx_t)) ); + TRY ( + hdf5_insert_type ( + h5_dta_types.h5t_glb_tag_idx_t, + "eid", + HOFFSET (h5t_glb_tag_idx_t, eid), + H5_ID_T) ); + TRY ( + hdf5_insert_type ( + h5_dta_types.h5t_glb_tag_idx_t, + "idx", + HOFFSET (h5t_glb_tag_idx_t, idx), + H5_ID_T) ); + + H5_PRIV_FUNC_RETURN (H5_SUCCESS); +} + +static inline h5_err_t +create_tet_type ( + void + ) { + H5_PRIV_FUNC_ENTER (h5_err_t, "%s", "void"); + + TRY( + h5_dta_types.h5_tet_t = hdf5_create_type ( + H5_COMPOUND_T, + sizeof (h5_glb_tet_t)) ); + TRY( + hdf5_insert_type ( + h5_dta_types.h5_tet_t, + "idx", + HOFFSET (h5_glb_tet_t, idx), + H5_ID_T) ); + TRY( + hdf5_insert_type ( + h5_dta_types.h5_tet_t, + "parent_idx", + HOFFSET (h5_glb_tet_t, parent_idx), + H5_ID_T) ); + TRY( + hdf5_insert_type ( + h5_dta_types.h5_tet_t, + "child_idx", + HOFFSET (h5_glb_tet_t, child_idx), + H5T_NATIVE_INT32) ); + TRY( + hdf5_insert_type ( + h5_dta_types.h5_tet_t, + "level_idx", + HOFFSET(h5_glb_tet_t, level_idx), + H5_INT16_T) ); + TRY( + hdf5_insert_type ( + h5_dta_types.h5_tet_t, + "refinement", + HOFFSET(h5_glb_tet_t, refinement), + H5_INT16_T) ); + TRY( + hdf5_insert_type ( + h5_dta_types.h5_tet_t, + "flags", + HOFFSET(h5_glb_tet_t, flags), + H5_INT32_T) ); + TRY( + hdf5_insert_type ( + h5_dta_types.h5_tet_t, + "vertex_indices", + HOFFSET (h5_glb_tet_t, vertex_indices), + h5_dta_types.h5_4glb_idx_t) ); + TRY( + hdf5_insert_type ( + h5_dta_types.h5_tet_t, + "neighbor_indices", + HOFFSET (h5_glb_tet_t, neighbor_indices), + h5_dta_types.h5_4glb_idx_t) ); + + H5_PRIV_FUNC_RETURN (H5_SUCCESS); +} + +static inline h5_err_t +create_chunk_type ( + void + ) { + H5_PRIV_FUNC_ENTER (h5_err_t, "%s", "void"); + TRY( + h5_dta_types.h5_chunk_t = hdf5_create_type ( + H5_COMPOUND_T, + sizeof (h5t_chunk_t)) ); + TRY( + hdf5_insert_type ( + h5_dta_types.h5_chunk_t, + "idx", + HOFFSET (h5t_chunk_t, idx), + H5_INT32_T) ); + TRY( + hdf5_insert_type ( + h5_dta_types.h5_chunk_t, + "oct_idx", + HOFFSET (h5t_chunk_t, oct_idx), + H5_INT32_T) ); + TRY( + hdf5_insert_type ( + h5_dta_types.h5_chunk_t, + "elem", + HOFFSET (h5t_chunk_t, elem), + H5_ID_T) ); + TRY( + hdf5_insert_type ( + h5_dta_types.h5_chunk_t, + "weight", + HOFFSET (h5t_chunk_t, weight), + H5_ID_T) ); + TRY( + hdf5_insert_type ( + h5_dta_types.h5_chunk_t, + "num_elems", + HOFFSET (h5t_chunk_t, num_elems), + H5_UINT16_T) ); +// TRY( +// hdf5_insert_type ( +// h5_dta_types.h5_chunk_t, +// "vtx", +// HOFFSET (h5t_chunk_t, vtx), +// H5_INT64_T) ); +// TRY( +// hdf5_insert_type ( +// h5_dta_types.h5_chunk_t, +// "num_vtx", +// HOFFSET (h5t_chunk_t, num_vtx), +// H5_INT64_T) ); + H5_PRIV_FUNC_RETURN (H5_SUCCESS); +} + +static inline h5_err_t +create_octree_type ( + void + ) { + H5_PRIV_FUNC_ENTER (h5_err_t, "%s", "void"); + TRY( + h5_dta_types.h5_octree_t = hdf5_create_type ( + H5_COMPOUND_T, + sizeof (h5t_octant_t)) ); + TRY( + hdf5_insert_type ( + h5_dta_types.h5_octree_t, + "idx", + HOFFSET (h5t_octant_t, idx), + H5_INT32_T) ); + TRY( + hdf5_insert_type ( + h5_dta_types.h5_octree_t, + "parent_idx", + HOFFSET (h5t_octant_t, parent_idx), + H5_INT32_T) ); + TRY( + hdf5_insert_type ( + h5_dta_types.h5_octree_t, + "child_idx", + HOFFSET (h5t_octant_t, child_idx), + H5_INT32_T) ); + TRY( + hdf5_insert_type ( + h5_dta_types.h5_octree_t, + "level_idx", + HOFFSET (h5t_octant_t, level_idx), + H5_INT16_T) ); +// TRY( +// hdf5_insert_type ( +// h5_dta_types.h5_octree_t, +// "bounding_box", +// HOFFSET (h5t_octant_t, bounding_box), +// h5_dta_types.h5_coord6d_t) ); + TRY( + hdf5_insert_type ( + h5_dta_types.h5_octree_t, + "userlevels", + HOFFSET (h5t_octant_t, userlevels), + H5_INT32_T) ); + + H5_PRIV_FUNC_RETURN (H5_SUCCESS); +} +static inline h5_err_t +create_userdata_type ( + void + ) { + H5_PRIV_FUNC_ENTER (h5_err_t, "%s", "void"); + TRY( + h5_dta_types.h5_userdata_t = hdf5_create_type ( + H5_COMPOUND_T, + sizeof (h5t_oct_userdata_t)) ); + TRY( + hdf5_insert_type ( + h5_dta_types.h5_userdata_t, + "idx", + HOFFSET (h5t_oct_userdata_t, idx), + h5_dta_types.h5_4chk_idx_t) ); + + H5_PRIV_FUNC_RETURN (H5_SUCCESS); +} +#if defined(PARALLEL_IO) +static inline h5_err_t +create_mpi_type_glb_tet ( + void + ) { + h5_glb_tet_t glb_elem; + H5_PRIV_FUNC_ENTER (h5_err_t, "%s", "void"); + int i = 0; + const int count = 8; + int blocklens[count]; + MPI_Aint indices[count]; + MPI_Datatype old_types[count]; + MPI_Aint base; + MPI_Aint addr; + TRY (mpi_get_address (&glb_elem, &base)); + + // idx + blocklens[i] = 1; + TRY (mpi_get_address (&glb_elem.idx, &addr)); + indices[i] = addr - base; + old_types[i++] = MPI_LONG_LONG; + + // parent_idx + blocklens[i] = 1; + TRY (mpi_get_address (&glb_elem.parent_idx, &addr)); + indices[i] = addr - base; + old_types[i++] = MPI_LONG_LONG; + + // child_idx + blocklens[i] = 1; + TRY (mpi_get_address (&glb_elem.child_idx, &addr)); + indices[i] = addr - base; + old_types[i++] = MPI_LONG_LONG; + + // level_idx + blocklens[i] = 1; + TRY (mpi_get_address (&glb_elem.level_idx, &addr)); + indices[i] = addr - base; + old_types[i++] = MPI_SHORT; + + // refinement + blocklens[i] = 1; + TRY (mpi_get_address (&glb_elem.refinement, &addr)); + indices[i] = addr - base; + old_types[i++] = MPI_SHORT; + + // flags + blocklens[i] = 1; + TRY (mpi_get_address (&glb_elem.flags, &addr)); + indices[i] = addr - base; + old_types[i++] = MPI_UNSIGNED; + + // vertex_indices + blocklens[i] = 4; + TRY (mpi_get_address (&glb_elem.vertex_indices, &addr)); + indices[i] = addr - base; + old_types[i++] = MPI_LONG_LONG; + + // neighbor_indices + blocklens[i] = 4; + TRY (mpi_get_address (&glb_elem.neighbor_indices, &addr)); + indices[i] = addr - base; + old_types[i++] = MPI_LONG_LONG; + + // create new type + assert (i==count); + TRY (mpi_create_type_struct (count, blocklens, indices, old_types, + &h5_dta_types.mpi_glb_tet)); + // commit new type + TRY (h5priv_mpi_type_commit (&h5_dta_types.mpi_glb_tet)); + + H5_PRIV_FUNC_RETURN (H5_SUCCESS); +} + +static inline h5_err_t +create_mpi_type_glb_tri ( + void + ) { + h5_glb_tri_t glb_elem; + H5_PRIV_FUNC_ENTER (h5_err_t, "%s", "void"); + int i = 0; + const int count = 8; + int blocklens[count]; + MPI_Aint indices[count]; + MPI_Datatype old_types[count]; + MPI_Aint base; + MPI_Aint addr; + TRY (mpi_get_address (&glb_elem, &base)); + + // idx + blocklens[i] = 1; + TRY (mpi_get_address (&glb_elem.idx, &addr)); + indices[i] = addr - base; + old_types[i++] = MPI_LONG_LONG; + + // parent_idx + blocklens[i] = 1; + TRY (mpi_get_address (&glb_elem.parent_idx, &addr)); + indices[i] = addr - base; + old_types[i++] = MPI_LONG_LONG; + + // child_idx + blocklens[i] = 1; + TRY (mpi_get_address (&glb_elem.child_idx, &addr)); + indices[i] = addr - base; + old_types[i++] = MPI_LONG_LONG; + + // level_idx + blocklens[i] = 1; + TRY (mpi_get_address (&glb_elem.level_idx, &addr)); + indices[i] = addr - base; + old_types[i++] = MPI_SHORT; + + // refinement + blocklens[i] = 1; + TRY (mpi_get_address (&glb_elem.refinement, &addr)); + indices[i] = addr - base; + old_types[i++] = MPI_SHORT; + + // flags + blocklens[i] = 1; + TRY (mpi_get_address (&glb_elem.flags, &addr)); + indices[i] = addr - base; + old_types[i++] = MPI_UNSIGNED; + + // vertex_indices + blocklens[i] = 3; + TRY (mpi_get_address (&glb_elem.vertex_indices, &addr)); + indices[i] = addr - base; + old_types[i++] = MPI_LONG_LONG; + + // neighbor_indices + blocklens[i] = 3; + TRY (mpi_get_address (&glb_elem.neighbor_indices, &addr)); + indices[i] = addr - base; + old_types[i++] = MPI_LONG_LONG; + + // create new type + assert (i==count); + TRY (mpi_create_type_struct (count, blocklens, indices, old_types, + &h5_dta_types.mpi_glb_triangle)); + // commit new type + TRY (h5priv_mpi_type_commit (&h5_dta_types.mpi_glb_triangle)); + + H5_PRIV_FUNC_RETURN (H5_SUCCESS); +} +static inline h5_err_t +create_mpi_type_glb_vtx ( + void + ) { + h5_glb_vertex_t glb_vtx; + H5_PRIV_FUNC_ENTER (h5_err_t, "%s", "void"); + int i = 0; + const int count = 2; + int blocklens[count]; + MPI_Aint indices[count]; + MPI_Datatype old_types[count]; + MPI_Aint base; + MPI_Aint addr; + TRY (mpi_get_address (&glb_vtx, &base)); + + // idx + blocklens[i] = 1; + TRY (mpi_get_address (&glb_vtx.idx, &addr)); + indices[i] = addr - base; + old_types[i++] = MPI_LONG_LONG; + + // P + blocklens[i] = 3; + TRY (mpi_get_address (&glb_vtx.P, &addr)); + indices[i] = addr - base; + old_types[i++] = MPI_DOUBLE; + + // create new type + assert (i==count); + TRY (mpi_create_type_struct (count, blocklens, indices, old_types, + &h5_dta_types.mpi_glb_vtx)); + // commit new type + TRY (h5priv_mpi_type_commit (&h5_dta_types.mpi_glb_vtx)); + + H5_PRIV_FUNC_RETURN (H5_SUCCESS); +} + +static inline h5_err_t +create_mpi_type_edge_list_elem ( + void + ) { + h5t_edge_list_elem_t elem; + H5_PRIV_FUNC_ENTER (h5_err_t, "%s", "void"); + int i = 0; + const int count = 4; + int blocklens[count]; + MPI_Aint indices[count]; + MPI_Datatype old_types[count]; + MPI_Aint base; + MPI_Aint addr; + TRY (mpi_get_address (&elem, &base)); + + // vtx1 + blocklens[i] = 1; + TRY (mpi_get_address (&elem.vtx1, &addr)); + indices[i] = addr - base; + old_types[i++] = MPI_LONG_LONG; + + // vtx2 + blocklens[i] = 1; + TRY (mpi_get_address (&elem.vtx2, &addr)); + indices[i] = addr - base; + old_types[i++] = MPI_LONG_LONG; + + // new_vtx + blocklens[i] = 1; + TRY (mpi_get_address (&elem.new_vtx, &addr)); + indices[i] = addr - base; + old_types[i++] = MPI_LONG_LONG; + + // proc + blocklens[i] = 1; + TRY (mpi_get_address (&elem.proc, &addr)); + indices[i] = addr - base; + old_types[i++] = MPI_INT; + + // create new type + assert (i==count); + TRY (mpi_create_type_struct (count, blocklens, indices, old_types, + &h5_dta_types.mpi_edge_list_elem)); + // commit new type + TRY (h5priv_mpi_type_commit (&h5_dta_types.mpi_edge_list_elem)); + + H5_PRIV_FUNC_RETURN (H5_SUCCESS); +} +static inline h5_err_t +create_mpi_type_chunk ( + void + ) { + h5t_chunk_t chunk; + H5_PRIV_FUNC_ENTER (h5_err_t, "%s", "void"); + int i = 0; + const int count = 5; + int blocklens[count]; + MPI_Aint indices[count]; + MPI_Datatype old_types[count]; + MPI_Aint base; + MPI_Aint addr; + TRY (mpi_get_address (&chunk, &base)); + + // idx + blocklens[i] = 1; + TRY (mpi_get_address (&chunk.idx, &addr)); + indices[i] = addr - base; + old_types[i++] = MPI_INT; + + // oct_idx + blocklens[i] = 1; + TRY (mpi_get_address (&chunk.oct_idx, &addr)); + indices[i] = addr - base; + old_types[i++] = MPI_INT; + + // elem_idx + blocklens[i] = 1; + TRY (mpi_get_address (&chunk.elem, &addr)); + indices[i] = addr - base; + old_types[i++] = MPI_LONG_LONG; + + // chk_weight + blocklens[i] = 1; + TRY (mpi_get_address (&chunk.weight, &addr)); + indices[i] = addr - base; + old_types[i++] = MPI_LONG_LONG; + + // num_elems + blocklens[i] = 1; + TRY (mpi_get_address (&chunk.num_elems, &addr)); + indices[i] = addr - base; + old_types[i++] = MPI_SHORT; + + + // create new type + assert (i == count); + TRY (mpi_create_type_struct (count, blocklens, indices, old_types, + &h5_dta_types.mpi_chunk)); + // commit new type + TRY (h5priv_mpi_type_commit (&h5_dta_types.mpi_chunk)); + + H5_PRIV_FUNC_RETURN (H5_SUCCESS); +} +#endif + +h5_err_t +_h5_exit (int status) { + exit (status); + return H5_ERR; +} + +h5_err_t +h5_initialize ( + void + ) { + h5_initialized = 1; + memset (&h5_call_stack, 0, sizeof (h5_call_stack)); + H5_CORE_API_ENTER (h5_err_t, "%s", "void"); + ret_value = H5_SUCCESS; +#ifdef PARALLEL_IO + if (h5priv_mpi_comm_rank (MPI_COMM_WORLD, &h5_myproc) < 0) { + exit (42); + } +#endif + h5_dta_types.h5_glb_idx_t = H5_INT64_T; + h5_dta_types.h5_int64_t = H5_INT64_T; + h5_dta_types.h5_float64_t = H5_FLOAT64_T; + h5_dta_types.h5_int32_t = H5_INT32_T; + + TRY (create_array_types ()); + TRY (create_vertex_type ()); + TRY (create_triangle_type ()); + TRY (create_tet_type ()); + TRY (create_tag_types ()); + TRY (create_chunk_type ()); + TRY (create_octree_type ()); + TRY (create_userdata_type ()); + +#if defined(PARALLEL_IO) + TRY (create_mpi_type_glb_tri ()); + TRY (create_mpi_type_glb_tet ()); + TRY (create_mpi_type_glb_vtx ()); + TRY (create_mpi_type_chunk ()); + TRY (create_mpi_type_edge_list_elem()); +#endif + H5_CORE_API_RETURN ((ret_value != H5_SUCCESS) ? _h5_exit (42) : H5_SUCCESS); +} diff --git a/src/h5core/h5_init_private.h b/src/h5core/h5_init_private.h new file mode 100644 index 0000000..d42b039 --- /dev/null +++ b/src/h5core/h5_init_private.h @@ -0,0 +1,29 @@ +/* + Copyright (c) 2006-2013, The Regents of the University of California, + through Lawrence Berkeley National Laboratory (subject to receipt of any + required approvals from the U.S. Dept. of Energy) and the Paul Scherrer + Institut (Switzerland). All rights reserved. + + License: see file COPYING in top level of source distribution. +*/ + +#ifndef __H5_INIT_PRIVATE_H +#define __H5_INIT_PRIVATE_H + +#include "h5core/h5_types.h" +#include "h5t_types_private.h" + +#ifdef __cplusplus +extern "C" { +#endif + +extern h5_dta_types_t h5_dta_types; +extern int h5_myproc; + + +#ifdef __cplusplus +} +#endif + + +#endif diff --git a/src/h5core/h5_lustre.c b/src/h5core/h5_lustre.c new file mode 100644 index 0000000..3712d07 --- /dev/null +++ b/src/h5core/h5_lustre.c @@ -0,0 +1,170 @@ +/* + Copyright (c) 2006-2012, The Regents of the University of California, + through Lawrence Berkeley National Laboratory (subject to receipt of any + required approvals from the U.S. Dept. of Energy) and the Paul Scherrer + Institut (Switzerland). All rights reserved. + + License: see file COPYING in top level of source distribution. +*/ + +#include "h5core/h5.h" + +#ifdef H5_USE_LUSTRE + +#include +#include +#include +#include +#include +#define __USE_GNU +#include +#undef __USE_GNU +#include +#include + + +#define MSG_HEADER "optimize for lustre: " + +static void +_print_stripe_info(struct lov_user_md *lum) +{ + fprintf (stderr, "lmm_magic: %u\n", (unsigned)lum->lmm_magic); + fprintf (stderr, "lmm_pattern: %u\n", (unsigned)lum->lmm_pattern); + fprintf (stderr, "lmm_object_id: %lu\n", (unsigned long)lum->lmm_object_id); + fprintf (stderr, "lmm_object_gr: %lu\n", (unsigned long)lum->lmm_object_gr); + fprintf (stderr, "lmm_stripe_size: %u\n", (unsigned)lum->lmm_stripe_size); + fprintf (stderr, "lmm_stripe_count: %u\n", (unsigned)lum->lmm_stripe_count); + fprintf (stderr, "lmm_stripe_offset: %u\n", (unsigned)lum->lmm_stripe_offset); +} + +static ssize_t +_get_lustre_stripe_size(h5_file_t *const f, const char *path ) +{ + size_t nbytes = sizeof(struct lov_user_md) + + INIT_ALLOC_NUM_OSTS * sizeof(struct lov_user_ost_data); + struct lov_user_md *lum = h5_calloc(1, nbytes); + if (!lum) { + h5_error(H5_ERR_INTERNAL, MSG_HEADER + "cannot allocate lustre struct"); + return -1; + } + lum->lmm_magic = LOV_USER_MAGIC; + + int fd = open(path, O_RDONLY); + if (fd < 0) { + extern int errno; + if (errno == EINVAL) + h5_error(H5_ERR_INTERNAL, MSG_HEADER + "open: a flag is invalid!"); + else if (errno == EACCES) + h5_error(H5_ERR_INTERNAL, MSG_HEADER + "open: access denied or file does not exist!"); + else if (errno == ENAMETOOLONG) + h5_error(H5_ERR_INTERNAL, MSG_HEADER + "open: path is too long!"); + else + h5_error(H5_ERR_INTERNAL, MSG_HEADER + "open: unspecific error!"); + return -1; + } + + int ret = ioctl(fd, LL_IOC_LOV_GETSTRIPE, lum); + if (ret == -1) { + extern int errno; + if (errno == EBADF) + h5_error(H5_ERR_INTERNAL, MSG_HEADER + "ioctl: bad file handle!"); + else if (errno == EINVAL) + h5_error(H5_ERR_INTERNAL, MSG_HEADER + "ioctl: invalid argument!"); + else if (errno == EIO) + h5_error(H5_ERR_INTERNAL, MSG_HEADER + "ioctl: physical I/O problem!"); + else if (errno == ENOTTY) + h5_error(H5_ERR_INTERNAL, MSG_HEADER + "ioctl: file handle does not accept control functions!"); + else if (errno == ENODEV) + h5_error(H5_ERR_INTERNAL, MSG_HEADER + "ioctl: driver doesn't support control functions!"); + else + h5_error(H5_ERR_INTERNAL, MSG_HEADER + "ioctl: unspecific error!"); + return -1; + } + + close(fd); + + if ( f->myproc == 0 && h5_get_debuglevel() >= 5 ) + _print_stripe_info(lum); + + ssize_t stripe_size = (ssize_t)lum->lmm_stripe_size; + h5_free(lum); + + return stripe_size; +} + +h5_err_t +h5_optimize_for_lustre ( + h5_file_t *const f, + const char *filename + ) { + + H5_CORE_API_ENTER (h5_err_t, "f=%p, filename='%s'", f, filename); + ssize_t stripe_size; + if ( f->myproc == 0 ) + { + char *path = h5_calloc (1, strlen(filename)+4); + strcpy(path, filename); + /* check for existing file */ + FILE *test = fopen(path, "r"); + if (!test) { + /* use directory as path */ + int i = strlen(path)-1; + while (i >= 0) { + if (path[i] != '/') path[i] = '\0'; + else break; + i--; + } + if (strlen(path) == 0) sprintf(path, "."); + } + else fclose(test); + + stripe_size = _get_lustre_stripe_size(f, path); + + h5_free(path); + } + + TRY( h5priv_mpi_bcast(&stripe_size, 1, MPI_LONG_LONG, 0, f->comm) ); + h5_info(MSG_HEADER + "Found lustre stripe size of %lld bytes", + (long long)stripe_size); + + hsize_t btree_ik = (stripe_size - 4096) / 96; + hsize_t btree_bytes = 64 + 96*btree_ik; + h5_info(MSG_HEADER + "Setting HDF5 btree ik to %lld (= %lld bytes at rank 3)", + (long long)btree_ik, (long long)btree_bytes); + TRY( hdf5_set_btree_ik_property(f->create_prop, btree_ik) ); + + /* set alignment to lustre stripe size */ + TRY( hdf5_set_alignment_property( + f->access_prop, 0, stripe_size) ); + + h5_info(MSG_HEADER "Disabling metadata cache flushes."); + /* disable metadata cache flushes */ + /* defer metadata writes */ + H5AC_cache_config_t config; + config.version = H5AC__CURR_CACHE_CONFIG_VERSION; + TRY( H5Pget_mdc_config( f->access_prop, &config ) ); + config.set_initial_size = 1; + config.initial_size = 16 * 1024 * 1024; + config.evictions_enabled = 0; + config.incr_mode = H5C_incr__off; + config.decr_mode = H5C_decr__off; + config.flash_incr_mode = H5C_flash_incr__off; + TRY( H5Pset_mdc_config( f->access_prop, &config ) ); + + H5_CORE_API_RETURN (H5_SUCCESS); +} + +#endif // H5_USE_LUSTRE diff --git a/src/h5core/h5_lustre_private.h b/src/h5core/h5_lustre_private.h new file mode 100644 index 0000000..8743021 --- /dev/null +++ b/src/h5core/h5_lustre_private.h @@ -0,0 +1,19 @@ +/* + Copyright (c) 2006-2013, The Regents of the University of California, + through Lawrence Berkeley National Laboratory (subject to receipt of any + required approvals from the U.S. Dept. of Energy) and the Paul Scherrer + Institut (Switzerland). All rights reserved. + + License: see file COPYING in top level of source distribution. +*/ + +#ifndef __H5_LUSTRE_PRIVATE_H +#define __H5_LUSTRE_PRIVATE_H + +#include "h5core/h5_types.h" + +h5_err_t +h5_optimize_for_lustre ( + const h5_file_t, const char*); + +#endif diff --git a/src/h5core/h5_maps.c b/src/h5core/h5_maps.c new file mode 100644 index 0000000..5b8871b --- /dev/null +++ b/src/h5core/h5_maps.c @@ -0,0 +1,271 @@ +/* + Copyright (c) 2006-2012, The Regents of the University of California, + through Lawrence Berkeley National Laboratory (subject to receipt of any + required approvals from the U.S. Dept. of Energy) and the Paul Scherrer + Institut (Switzerland). All rights reserved. + + License: see file COPYING in top level of source distribution. +*/ + +#include "h5core/h5.h" + +#include "h5_errorhandling_private.h" +#include "h5_maps_private.h" + +/* + Allocate new/empty string-list + */ +h5_err_t +h5priv_alloc_strlist ( + h5_strlist_t** list, + const h5_size_t size + ) { + H5_PRIV_API_ENTER (h5_err_t, + "list=%p, size=%llu", + list, (long long unsigned)size); + TRY (*list = h5_calloc ( + 1, sizeof (**list)+size*sizeof ((*list)->items[0]))); + (*list)->size = size; + H5_PRIV_API_RETURN (H5_SUCCESS); +} + +h5_err_t +h5priv_free_strlist ( + h5_strlist_t** list + ) { + H5_PRIV_API_ENTER (h5_err_t, "list=%p", list); + if (list == NULL || *list == NULL) H5_PRIV_API_LEAVE (H5_SUCCESS); + h5_strlist_t* l = *list; + for (size_t i = 0; i < l->size; i++) { + TRY (h5_free(l->items[i])); + } + TRY (h5_free (l)); + l = NULL; + H5_PRIV_API_RETURN (H5_SUCCESS); +} + +static inline h5_err_t +grow_strlist ( + h5_strlist_t** list, + size_t new_size + ) { + H5_PRIV_API_ENTER (h5_err_t, "list=%p, new_size=%zu", list, new_size); + size_t num_bytes = sizeof (**list) + (new_size-1)*sizeof((*list)->items[0]); + TRY (*list = h5_alloc (*list, num_bytes)); + (*list)->size = new_size; + H5_PRIV_FUNC_RETURN (H5_SUCCESS); +} + +/* + Add item to list at position given by \c idx. + */ +ssize_t +h5priv_insert_strlist ( + h5_strlist_t** list, + const char const* item, + size_t idx + ) { + H5_PRIV_API_ENTER (ssize_t, + "list=%p, item=%s, idx=%llu", + list, item, (long long unsigned)idx); + if (*list == NULL) { + TRY (h5priv_alloc_strlist (list, 2)); + } else if ((*list)->num_items == (*list)->size) { + h5_size_t size = (*list)->size; + if (size == 0) { + size = 16; + } else { + size *= 2; + } + TRY (grow_strlist (list, size)); + } + h5_strlist_t* l = *list; + if (idx == -1) { + idx = l->num_items; + } else { + memmove ( + &l->items[idx+1], + &l->items[idx], + (l->num_items - idx) * sizeof (l->items[0])); + } + TRY (l->items[idx] = h5_strdup(item)); + l->num_items++; + H5_PRIV_API_RETURN (idx); +} + +/* + Find ID in sorted list + */ +ssize_t +h5priv_find_strlist ( + h5_strlist_t* list, + const char* const item + ) { + H5_PRIV_API_ENTER (ssize_t, "list=%p, item=%s", list, item); + if (!list) { + H5_PRIV_API_LEAVE (-1); + } + register h5_loc_idx_t low = 0; + register h5_loc_idx_t high = list->num_items - 1; + register h5_loc_id_t diff; + register h5_loc_id_t mid; + while (low <= high) { + mid = (low + high) / 2; + diff = strcmp (list->items[mid], item); + if ( diff > 0 ) + high = mid - 1; + else if ( diff < 0 ) + low = mid + 1; + else + H5_PRIV_API_LEAVE (mid); // found + } + H5_PRIV_API_RETURN (-(low+1)); // not found +} + +/* + Search in sorted list. If item is not in list, add it. + */ +ssize_t +h5priv_search_strlist ( + h5_strlist_t** list, + const char* const item + ) { + H5_PRIV_API_ENTER (h5_err_t, "list=%p, item=%s", list, item); + h5_loc_idx_t idx = h5priv_find_strlist (*list, item); + if (idx < 0) { + idx = -(idx+1); + TRY (idx = h5priv_insert_strlist (list, item, idx)); + } + H5_PRIV_API_RETURN (idx); +} + +h5_err_t +h5priv_remove_strlist ( + h5_strlist_t* list, + const char* const item + ) { + H5_PRIV_API_ENTER (h5_err_t, "list=%p, item=%s", list, item); + ssize_t idx = h5priv_find_strlist (list, item); + if (idx < 0) H5_PRIV_API_LEAVE (-1); + + list->num_items--; + memmove ( + &list->items[idx], + &list->items[idx+1], + (list->num_items - idx) * sizeof (list->items[0])); + H5_PRIV_API_RETURN (idx); +} + + +/////////////////////////////////////////////////////////////////////////////// + +h5_err_t +h5priv_new_idxmap ( + h5_idxmap_t* map, + const h5_size_t size + ) { + H5_PRIV_API_ENTER (h5_err_t, + "map=%p, size=%llu", + map, (long long unsigned)size); + TRY (map->items = h5_calloc (size, sizeof (map->items[0]))); + map->size = size; + map->num_items = 0; + H5_PRIV_API_RETURN (H5_SUCCESS); +} + +h5_err_t +h5priv_insert_idxmap ( + h5_idxmap_t* map, + h5_glb_idx_t glb_idx, + h5_loc_idx_t loc_idx + ) { + H5_PRIV_API_ENTER (h5_err_t, + "map=%p, glb_idx=%llu, loc_idx=%llu", + map, + (long long unsigned)glb_idx, + (long long unsigned)loc_idx); + if (map->num_items == map->size) + H5_PRIV_API_LEAVE ( + HANDLE_H5_OVERFLOW_ERR ( + (long long)map->size)); + + h5_loc_idx_t i = h5priv_search_idxmap (map, glb_idx); + if (i >= 0) /* global id already in use ? */ + H5_PRIV_API_LEAVE (-1); + + i = -(i+1); + + memmove ( + &map->items[i+1], + &map->items[i], + (map->num_items - i) * sizeof(map->items[0])); + map->items[i].glb_idx = glb_idx; + map->items[i].loc_idx = loc_idx; + map->num_items++; + + H5_PRIV_API_RETURN (H5_SUCCESS); +} + +/*! + + \ingroup h5_core + + binary search in id map. + + \return index in array if found, othwise \c -(result+1) is the index + where \c value must be inserted. + + */ +h5_loc_idx_t +h5priv_search_idxmap ( + h5_idxmap_t* map, + h5_glb_idx_t value + ) { + H5_PRIV_API_ENTER (h5_err_t, + "map=%p, value=%lld", + map, (long long)value); + register h5_loc_idx_t low = 0; + register h5_loc_idx_t high = map->num_items - 1; + while (low <= high) { + register h5_loc_idx_t mid = (low + high) / 2; + register h5_glb_idx_t diff = map->items[mid].glb_idx - value; + if ( diff > 0 ) + high = mid - 1; + else if ( diff < 0 ) + low = mid + 1; + else + H5_PRIV_API_LEAVE (mid); // found + } + H5_PRIV_API_RETURN (-(low+1)); // not found +} + +//static int +//cmp_idxmap_items ( +// const void* _item1, +// const void* _item2 +// ) { +// h5_idxmap_el_t* item1 = (h5_idxmap_el_t*)_item1; +// h5_idxmap_el_t* item2 = (h5_idxmap_el_t*)_item2; +// +// if (item1->glb_idx < item2->glb_idx) return -1; +// if (item1->glb_idx > item2->glb_idx) return 1; +// +// return 0; +//} +static inline int //faster version +cmp_idxmap_items ( + const void* _item1, + const void* _item2 + ) { + return ((h5_idxmap_el_t*)_item1)->glb_idx - ((h5_idxmap_el_t*)_item2)->glb_idx; +} + +h5_err_t +h5priv_sort_idxmap ( + h5_idxmap_t* map + ) { + H5_PRIV_API_ENTER (h5_err_t, "map=%p", map); + qsort ( map->items, map->num_items, sizeof (map->items[0]), + cmp_idxmap_items); + H5_PRIV_API_RETURN (H5_SUCCESS); +} diff --git a/src/h5core/h5_maps_private.h b/src/h5core/h5_maps_private.h new file mode 100644 index 0000000..2b3802a --- /dev/null +++ b/src/h5core/h5_maps_private.h @@ -0,0 +1,213 @@ +/* + Copyright (c) 2006-2013, The Regents of the University of California, + through Lawrence Berkeley National Laboratory (subject to receipt of any + required approvals from the U.S. Dept. of Energy) and the Paul Scherrer + Institut (Switzerland). All rights reserved. + + License: see file COPYING in top level of source distribution. +*/ + +#ifndef __H5_MAPS_PRIVATE_H +#define __H5_MAPS_PRIVATE_H + +#include "h5_types_private.h" +#include "h5core/h5_debug.h" +#include "h5core/h5_errorhandling.h" +#include "h5core/h5_syscall.h" +#include "h5_debug_private.h" + +typedef struct { + size_t size; + size_t num_items; + char* items[1]; +} h5_strlist_t; + + +// Allocate new list +#define h5priv_alloc_xlist( type ) \ + static inline h5_err_t \ + h5priv_alloc_ ## type ## list ( \ + h5_ ## type ## list_t**list, \ + const int32_t size \ + ) { \ + H5_PRIV_API_ENTER (h5_err_t, "list=%p, size=%d", list, size); \ + TRY (*list = h5_calloc ( \ + 1, sizeof (**list)+size*sizeof ((*list)->items[0]))); \ + (*list)->size = size; \ + H5_PRIV_API_RETURN (H5_SUCCESS); \ + } +// Free list +#define h5priv_free_xlist( type ) \ + static inline h5_err_t \ + h5priv_free_ ## type ## list ( \ + h5_ ## type ## list_t**list \ + ) { \ + H5_PRIV_API_ENTER (h5_err_t, "list=%p", list); \ + if (*list == NULL) H5_PRIV_API_LEAVE (H5_SUCCESS); \ + TRY (h5_free (*list)); \ + *list = NULL; \ + H5_PRIV_API_RETURN (H5_SUCCESS); \ + } + +// Insert item +#define h5priv_insert_into_xlist( type ) \ + static inline h5_loc_idx_t \ + h5priv_insert_into_ ## type ## list ( \ + h5_ ## type ## list_t**list, \ + h5_ ## type ## _t id, \ + h5_loc_idx_t idx \ + ) { \ + H5_PRIV_API_ENTER (h5_err_t, \ + "list=%p, id=%llu, idx=%llu", \ + list, \ + (long long unsigned)id, \ + (long long unsigned)idx); \ + if (*list == NULL) { \ + TRY (h5priv_alloc_ ## type ## list (list, 2)); \ + } else if ((*list)->num_items == (*list)->size) { \ + h5_size_t size = (*list)->size; \ + if (size == 0) { \ + size = 2; \ + } else { \ + size *= 2; \ + } \ + size_t num_bytes = sizeof (**list) + (size-1)*sizeof((*list)->items[0]); \ + TRY (*list = h5_alloc (*list, num_bytes)); \ + (*list)->size = size; \ + } \ + h5_ ## type ## list_t* l = *list; \ + if (idx == -1) { \ + idx = l->num_items; \ + } else { \ + memmove ( \ + &l->items[idx+1], \ + &l->items[idx], \ + (l->num_items - idx) * sizeof (l->items[0])); \ + } \ + l->items[idx] = id; \ + l->num_items++; \ + H5_PRIV_API_RETURN (idx); \ + } + +// Find ID in sorted list +#define h5priv_find_in_xlist(type) \ + static inline h5_loc_idx_t \ + h5priv_find_in_ ## type ## list ( \ + h5_ ## type ## list_t* list, \ + const h5_ ## type ## _t item \ + ) { \ + H5_PRIV_API_ENTER (h5_err_t, \ + "list=%p, item=%llu", \ + list, (long long unsigned)item); \ + if (!list) { \ + H5_PRIV_API_LEAVE (-1); \ + } \ + register ssize_t low = 0; \ + register ssize_t mid; \ + register ssize_t high = list->num_items - 1; \ + while (low <= high) { \ + mid = (low + high) / 2; \ + if (list->items[mid] > item) \ + high = mid - 1; \ + else if (list->items[mid] < item) \ + low = mid + 1; \ + else \ + H5_PRIV_API_LEAVE (mid); \ + } \ + H5_PRIV_API_RETURN (-(low+1)); \ + } + + +// Search in sorted list. If item is not in list, add it. +#define h5priv_search_in_xlist( type ) \ + static inline h5_loc_idx_t \ + h5priv_search_in_ ## type ## list ( \ + h5_ ## type ## list_t**list, \ + h5_ ## type ## _t item \ + ) { \ + H5_PRIV_API_ENTER (h5_err_t, \ + "list=%p, item=%llu", \ + list, (long long unsigned)item); \ + h5_loc_idx_t idx = h5priv_find_in_ ## type ## list (*list, item); \ + if (idx < 0) { \ + idx = -(idx+1); \ + TRY (idx = h5priv_insert_into_ ## type ## list (list, item, idx)); \ + } \ + H5_PRIV_API_RETURN (idx); \ + } + + +h5priv_alloc_xlist (loc_idx) +h5priv_free_xlist (loc_idx) +h5priv_insert_into_xlist (loc_idx) +h5priv_find_in_xlist (loc_idx) +h5priv_search_in_xlist (loc_idx) + +h5priv_alloc_xlist (glb_idx) +h5priv_free_xlist (glb_idx) +h5priv_insert_into_xlist (glb_idx) +h5priv_find_in_xlist (glb_idx) +h5priv_search_in_xlist (glb_idx) + + +h5_err_t +h5priv_alloc_strlist (h5_strlist_t**, const h5_size_t); + +h5_err_t +h5priv_free_strlist (h5_strlist_t**); + +ssize_t +h5priv_insert_strlist (h5_strlist_t**, const char const*, size_t); + +ssize_t +h5priv_find_strlist (h5_strlist_t*, const char* const item); + +ssize_t +h5priv_search_strlist (h5_strlist_t**, const char* const); + +h5_err_t +h5priv_remove_strlist (h5_strlist_t*, const char* const); + +h5_err_t +h5priv_new_idxmap ( + h5_idxmap_t *map, + const h5_size_t size + ); + +static inline h5_err_t +h5priv_grow_idxmap ( + h5_idxmap_t* map, + const size_t size // grow to this size + ) { + H5_PRIV_API_ENTER (h5_err_t, + "map=%p, size=%llu", + map, (long long unsigned)size); + if (map->num_items >= size) + H5_PRIV_API_LEAVE (H5_SUCCESS); + int new = (map->items == NULL); + size_t size_in_bytes = size * sizeof (map->items[0]); + TRY (map->items = h5_alloc (map->items, size_in_bytes)); + map->size = size; + if (new) map->num_items = 0; + H5_PRIV_API_RETURN (H5_SUCCESS); +} + +h5_err_t +h5priv_insert_idxmap ( + h5_idxmap_t *map, + h5_glb_idx_t glb_idx, + h5_loc_idx_t loc_idx + ); + +h5_loc_idx_t +h5priv_search_idxmap ( + h5_idxmap_t *map, + h5_glb_idx_t value + ); + +h5_err_t +h5priv_sort_idxmap ( + h5_idxmap_t *map + ); + +#endif diff --git a/src/h5core/h5_model.c b/src/h5core/h5_model.c new file mode 100644 index 0000000..ad8cd1b --- /dev/null +++ b/src/h5core/h5_model.c @@ -0,0 +1,224 @@ +/* + Copyright (c) 2006-2012, The Regents of the University of California, + through Lawrence Berkeley National Laboratory (subject to receipt of any + required approvals from the U.S. Dept. of Energy) and the Paul Scherrer + Institut (Switzerland). All rights reserved. + + License: see file COPYING in top level of source distribution. +*/ + +#include + +#include "h5core/h5.h" +#include "h5_types_private.h" +#include "h5_hdf5_private.h" +#include "h5_model_private.h" +#include "h5_mpi_private.h" +#include "h5_readwrite_private.h" +#include "h5_va_macros.h" + +h5_err_t +h5priv_close_step ( + const h5_file_p f + ) { + H5_PRIV_API_ENTER (h5_err_t, "f=%p", f); + if (f->step_gid <= 0) + H5_PRIV_API_LEAVE (H5_SUCCESS); + TRY (hdf5_close_group (f->step_gid)); + + f->step_gid = -1; + + H5_PRIV_API_RETURN (H5_SUCCESS); +} + +h5_err_t +h5_set_step ( + const h5_file_t f_, /*!< [in] Handle to open file */ + const h5_id_t step_idx /*!< [in] Step to set. */ + ) { + h5_file_p f = (h5_file_p)f_; + H5_CORE_API_ENTER (h5_err_t, + "f=%p, step_idx=%lld", + f, (long long)step_idx); + TRY (h5priv_close_step (f)); + f->step_idx = step_idx; + + sprintf ( + f->step_name, + "%s#%0*lld", + f->props->prefix_step_name, f->props->width_step_idx, + (long long) f->step_idx); + h5_info ( + "Open step #%lld for file %lld", + (long long)f->step_idx, + (long long)(size_t) f); + + TRY (f->step_gid = h5priv_open_group (is_writable(f), + f->file, + f->step_name)); + H5_CORE_API_RETURN (H5_SUCCESS); +} + +/*! + Normalize HDF5 type +*/ +h5_int64_t +h5priv_normalize_h5_type ( + hid_t type + ) { + H5_CORE_API_ENTER (h5_int64_t, "type=%d", type); + H5T_class_t tclass; + int size; + TRY (tclass = H5Tget_class (type)); + TRY (size = H5Tget_size (type)); + + switch (tclass){ + case H5T_INTEGER: + if (size==8) { + H5_CORE_API_LEAVE (H5_INT64_T); + } else if (size==4) { + H5_CORE_API_LEAVE (H5_INT32_T); + } else if (size==2) { + H5_CORE_API_LEAVE (H5_INT16_T); + } + break; + case H5T_FLOAT: + if ( size==8 ) { + H5_CORE_API_LEAVE (H5_FLOAT64_T); + } + else if ( size==4 ) { + H5_CORE_API_LEAVE (H5_FLOAT32_T); + } + break; + case H5T_STRING: + H5_CORE_API_LEAVE (H5_STRING_T); + default: + ; /* NOP */ + } + H5_CORE_API_RETURN (h5_warn ("Unknown type %d", (int)type)); +} + +h5_int64_t +h5priv_get_dataset_type( + const hid_t group_id, + const char* dset_name + ) { + H5_CORE_API_ENTER (h5_int64_t, + "group_id=%d, dset_name='%s'", + group_id, dset_name); + hid_t dset_id; + hid_t hdf5_type; + h5_int64_t type; + TRY (dset_id = hdf5_open_dataset (group_id, dset_name)); + TRY (hdf5_type = hdf5_get_dataset_type (dset_id)); + TRY (type = h5priv_normalize_h5_type (hdf5_type)); + TRY (hdf5_close_type (hdf5_type)); + TRY (hdf5_close_dataset (dset_id)); + + H5_CORE_API_RETURN (type); +} + +h5_err_t +h5_has_step ( + const h5_file_t f_, /*!< [in] Handle to open file */ + const h5_id_t step_idx /*!< [in] Step number to query */ + ) { + h5_file_p f = (h5_file_p)f_; + H5_CORE_API_ENTER (h5_err_t, "f=%p, step_idx=%lld", f, (long long)step_idx); + char name[2*H5_STEPNAME_LEN]; + sprintf (name, + "%s#%0*lld", + f->props->prefix_step_name, f->props->width_step_idx, (long long)step_idx); + H5_CORE_API_RETURN (hdf5_link_exists(f->file, name)); +} + +h5_err_t +h5priv_normalize_dataset_name ( + const char *name, + char *name2 + ) { + H5_CORE_API_ENTER (h5_err_t, "name='%s', name2='%p'", name, name2); + if ( strlen(name) > H5_DATANAME_LEN-1 ) { + strncpy ( name2, name, H5_DATANAME_LEN-1 ); + name2[H5_DATANAME_LEN-1] = '\0'; + h5_warn ("Truncated name '%s' to '%s'.", name, name2); + } else { + strcpy ( name2, name ); + } + + if ( strcmp( name2, H5BLOCK_GROUPNAME_BLOCK ) == 0 ) { + H5_CORE_API_LEAVE ( + h5_error ( + H5_ERR_INVAL, + "Can't create dataset or field with name '%s'" + " because it is reserved by H5Block.", + H5BLOCK_GROUPNAME_BLOCK)); + } + H5_CORE_API_RETURN (H5_SUCCESS); +} + +#ifdef PARALLEL_IO +h5_err_t +h5_set_throttle ( + const h5_file_t f_, + const int factor + ) { + h5_file_p f = (h5_file_p)f_; + H5_CORE_API_ENTER (h5_err_t, "f=%p, factor=%d", f, factor); + if ( (f->props->mode & H5_VFD_MPIIO_IND) || (f->props->mode & H5_VFD_MPIPOSIX) ) { + f->props->throttle = factor; + h5_info ("Throttling enabled with factor = %lld", f->props->throttle ); + } else { + h5_warn ("Throttling is only permitted with the MPI-POSIX " + "or MPI-IO Independent VFD." ); + } + + H5_CORE_API_RETURN (H5_SUCCESS); +} + +h5_err_t +h5priv_start_throttle ( + const h5_file_p f + ) { + H5_CORE_API_ENTER (h5_err_t, "f=%p", f); + if (f->props->throttle > 0) { + int token = 1; + h5_info ("Throttling with factor = %lld", f->props->throttle); + if (f->myproc / f->props->throttle > 0) { + h5_debug ("throttle: waiting on token from %lld", + f->myproc - f->props->throttle); + // wait to receive token before continuing with read + TRY( h5priv_mpi_recv( + &token, 1, MPI_INT, + f->myproc - f->props->throttle, // receive from previous proc + f->myproc, // use this proc id as message tag + f->props->comm + ) ); + } + h5_debug ("throttle: received token"); + } + H5_CORE_API_RETURN (H5_SUCCESS); +} + +h5_err_t +h5priv_end_throttle ( + const h5_file_p f + ) { + H5_PRIV_API_ENTER (h5_err_t, "f=%p", f); + if (f->props->throttle > 0) { + int token; + if (f->myproc + f->props->throttle < f->nprocs) { + // pass token to next proc + h5_debug ("throttle: passing token to %lld", + f->myproc + f->props->throttle); + TRY (h5priv_mpi_send( + &token, 1, MPI_INT, + f->myproc + f->props->throttle, // send to next proc + f->myproc + f->props->throttle, // use the id of the target as tag + f->props->comm + )); + } + } + H5_PRIV_API_RETURN (H5_SUCCESS); +} +#endif // PARALLEL_IO diff --git a/src/h5core/h5_model_private.h b/src/h5core/h5_model_private.h new file mode 100644 index 0000000..e3aecb2 --- /dev/null +++ b/src/h5core/h5_model_private.h @@ -0,0 +1,45 @@ +/* + Copyright (c) 2006-2012, The Regents of the University of California, + through Lawrence Berkeley National Laboratory (subject to receipt of any + required approvals from the U.S. Dept. of Energy) and the Paul Scherrer + Institut (Switzerland). All rights reserved. + + License: see file COPYING in top level of source distribution. +*/ + +#ifndef __H5_MODEL_PRIVATE_H +#define __H5_MODEL_PRIVATE_H + + +/* WARNING! Changing these values will alter the data model and introduce + * file incompatibilities with previous versions. */ + +#define H5_MAX_NAME_LEN 64 +#define H5_DATANAME_LEN H5_MAX_NAME_LEN +#define H5_STEPNAME_LEN H5_MAX_NAME_LEN +#define H5_STEPNAME "Step" +#define H5_STEPWIDTH 1 +#define H5BLOCK_GROUPNAME_BLOCK "Block" +#define H5_BLOCKNAME_X "0" +#define H5_BLOCKNAME_Y "1" +#define H5_BLOCKNAME_Z "2" +#define H5_ATTACHMENT "Attachment" + +#include "h5core/h5_types.h" +#include "h5core/h5_model.h" + + +h5_err_t +h5priv_start_throttle ( + const h5_file_p); + +h5_err_t +h5priv_end_throttle ( + const h5_file_p); + +h5_err_t +h5priv_close_step ( + const h5_file_p f + ); + +#endif diff --git a/src/h5core/h5_mpi.c b/src/h5core/h5_mpi.c new file mode 100644 index 0000000..dd18c5a --- /dev/null +++ b/src/h5core/h5_mpi.c @@ -0,0 +1,246 @@ +/* + Copyright (c) 2006-2012, The Regents of the University of California, + through Lawrence Berkeley National Laboratory (subject to receipt of any + required approvals from the U.S. Dept. of Energy) and the Paul Scherrer + Institut (Switzerland). All rights reserved. + + License: see file COPYING in top level of source distribution. +*/ + +#include "h5core/h5.h" +#include "h5core/h5_types.h" +#include "h5_debug_private.h" + +#ifdef PARALLEL_IO + +// barrier +h5_err_t +h5priv_mpi_barrier ( + const MPI_Comm comm + ) { + MPI_WRAPPER_ENTER (h5_err_t, "comm=%p",&comm); + int err = MPI_Barrier(comm); + if (err != MPI_SUCCESS) + MPI_WRAPPER_LEAVE ( + h5_error ( + H5_ERR_MPI, + "MPI Barrier was not successful")); + MPI_WRAPPER_RETURN (H5_SUCCESS); +} + +// communication routines +h5_err_t +h5priv_mpi_recv( + void* buf, + const int count, + const MPI_Datatype type, + const int from, + const int tag, + const MPI_Comm comm + ) { + MPI_WRAPPER_ENTER (h5_err_t, + "buf=%p, count=%d, type=?, from=%d, tag=%d, comm=?", + buf, count, from, tag); + int err = MPI_Recv( + buf, + count, + type, + from, + tag, + comm, + MPI_STATUS_IGNORE + ); + if (err != MPI_SUCCESS) + MPI_WRAPPER_LEAVE (h5_error (H5_ERR_MPI, "Cannot receive data")); + MPI_WRAPPER_RETURN (H5_SUCCESS); +} + +h5_err_t +h5priv_mpi_send( + void* buf, + const int count, + const MPI_Datatype type, + const int to, + const int tag, + const MPI_Comm comm + ) { + MPI_WRAPPER_ENTER (h5_err_t, + "buf=%p, count=%d, type=?, to=%d, tag=%d, comm=?", + buf, count, to, tag); + int err = MPI_Send( + buf, + count, + type, + to, + tag, + comm + ); + if (err != MPI_SUCCESS) + MPI_WRAPPER_LEAVE (h5_error (H5_ERR_MPI, "Cannot send data")); + MPI_WRAPPER_RETURN (H5_SUCCESS); +} + +h5_err_t +h5priv_mpi_bcast ( + void* buf, + const int count, + const MPI_Datatype type, + const int root, + const MPI_Comm comm + ) { + MPI_WRAPPER_ENTER (h5_err_t, + "buf=%p, count=%d, type=?, root=%d, comm=?", + buf, count, root); + int err = MPI_Bcast( + buf, + count, + type, + root, + comm + ); + if (err != MPI_SUCCESS) + MPI_WRAPPER_LEAVE (h5_error (H5_ERR_MPI, "Cannot perform broadcast")); + MPI_WRAPPER_RETURN (H5_SUCCESS); +} + + + +h5_err_t +h5priv_mpi_sum ( + void* sendbuf, + void* recvbuf, + const int count, + const MPI_Datatype type, + const MPI_Comm comm + ) { + MPI_WRAPPER_ENTER (h5_err_t, + "sendbuf=%p, recvbuf=%p, count=%d, type=?, comm=?", + sendbuf, recvbuf, count); + int err = MPI_Allreduce( + sendbuf, + recvbuf, + count, + type, + MPI_SUM, + comm + ); + if (err != MPI_SUCCESS) + MPI_WRAPPER_LEAVE (h5_error (H5_ERR_MPI, "Cannot perform sum reduction")); + MPI_WRAPPER_RETURN (H5_SUCCESS); +} + +h5_err_t +h5priv_mpi_prefix_sum ( + void* sendbuf, + void* recvbuf, + const int count, + const MPI_Datatype type, + const MPI_Comm comm + ) { + MPI_WRAPPER_ENTER (h5_err_t, + "sendbuf=%p, recvbuf=%p, count=%d, type=?, comm=?", + sendbuf, recvbuf, count); + int err = MPI_Scan( + sendbuf, + recvbuf, + count, + type, + MPI_SUM, + comm + ); + if (err != MPI_SUCCESS) + MPI_WRAPPER_LEAVE (h5_error (H5_ERR_MPI, "Cannot perform prefix sum")); + MPI_WRAPPER_RETURN (H5_SUCCESS); +} + + +// +h5_err_t +h5priv_mpi_comm_size ( + MPI_Comm comm, + int* size + ) { + MPI_WRAPPER_ENTER (h5_err_t, "comm=?, size=%p", size); + int err = MPI_Comm_size (comm, size); + if (err != MPI_SUCCESS) + MPI_WRAPPER_LEAVE (h5_error (H5_ERR_MPI, "Cannot get communicator size")); + MPI_WRAPPER_RETURN (H5_SUCCESS); +} + + +h5_err_t +h5priv_mpi_comm_rank ( + MPI_Comm comm, + int* rank + ) { + MPI_WRAPPER_ENTER (h5_err_t, "comm=?, rank=%p", rank); + int err = MPI_Comm_rank (comm, rank); + if (err != MPI_SUCCESS) + MPI_WRAPPER_LEAVE (h5_error (H5_ERR_MPI, "Cannot get this task's rank")); + MPI_WRAPPER_RETURN (H5_SUCCESS); +} + +h5_err_t +h5priv_mpi_type_contiguous ( + const size_t nelems, + const MPI_Datatype oldtype, + MPI_Datatype *const newtype + ) { + MPI_WRAPPER_ENTER (h5_err_t, "nelems=%lu, oldtype=?, newtype=?", (long unsigned)nelems); + int err; + err = MPI_Type_contiguous ( nelems, oldtype, newtype ); + if (err != MPI_SUCCESS) + MPI_WRAPPER_LEAVE (h5_error (H5_ERR_MPI, "Cannot create new MPI type")); + err = MPI_Type_commit ( newtype ); + if (err != MPI_SUCCESS) + MPI_WRAPPER_LEAVE (h5_error (H5_ERR_MPI, "Cannot commit new MPI type")); + MPI_WRAPPER_RETURN (H5_SUCCESS); +} + +h5_err_t +h5priv_mpi_type_free ( + MPI_Datatype *type + ) { + MPI_WRAPPER_ENTER (h5_err_t, "type=%p", type); + int err = MPI_Type_free( type ); + if (err != MPI_SUCCESS) + MPI_WRAPPER_LEAVE (h5_error(H5_ERR_MPI, "Cannot free MPI type")); + MPI_WRAPPER_RETURN (H5_SUCCESS); +} + +h5_err_t +h5priv_mpi_cart_create ( + MPI_Comm old_comm, + int ndims, + int *dims, + int *period, + int reorder, + MPI_Comm *new_comm + ) { + MPI_WRAPPER_ENTER (h5_err_t, "old_comm=?, ndims=%d, dims=%p, period=%p, " + "reorder=%d, new_comm=%p", + ndims, dims, period, reorder, new_comm); + int err = MPI_Cart_create( + old_comm, ndims, dims, period, reorder, new_comm); + if (err != MPI_SUCCESS) + MPI_WRAPPER_LEAVE (h5_error(H5_ERR_MPI, "Cannot create cartesian grid")); + MPI_WRAPPER_RETURN (H5_SUCCESS); +} + +h5_err_t +h5priv_mpi_cart_coords ( + MPI_Comm comm, + int rank, + int maxdim, + int *coords + ) { + MPI_WRAPPER_ENTER (h5_err_t, "comm=?, rank=%d, maxdim=%d, coords=%p", + rank, maxdim, coords); + int err = MPI_Cart_coords( comm, rank, maxdim, coords ); + if (err != MPI_SUCCESS) + MPI_WRAPPER_LEAVE (h5_error(H5_ERR_MPI, "Cannot create cartesian grid")); + MPI_WRAPPER_RETURN (H5_SUCCESS); +} + +#endif // PARALLEL_IO + diff --git a/src/h5core/h5_mpi_private.h b/src/h5core/h5_mpi_private.h new file mode 100644 index 0000000..bbb7782 --- /dev/null +++ b/src/h5core/h5_mpi_private.h @@ -0,0 +1,299 @@ +/* + Copyright (c) 2006-2013, The Regents of the University of California, + through Lawrence Berkeley National Laboratory (subject to receipt of any + required approvals from the U.S. Dept. of Energy) and the Paul Scherrer + Institut (Switzerland). All rights reserved. + + License: see file COPYING in top level of source distribution. +*/ + +#ifndef __H5_MPI_PRIVATE_H +#define __H5_MPI_PRIVATE_H + +#ifdef PARALLEL_IO + +#include "h5core/h5_types.h" +#include "h5core/h5_errorhandling.h" +#include "h5_debug_private.h" + +static inline h5_err_t +h5priv_mpi_alltoall ( + void* sendbuf, + const int sendcount, + const MPI_Datatype sendtype, + void* recvbuf, + const int recvcount, + const MPI_Datatype recvtype, + const MPI_Comm comm + ) { + MPI_WRAPPER_ENTER (h5_err_t, + "sendbuf=%p, sendcount=%d, sendtype=?, recvbuf=%p, " + "recvcount=%d, recvtype=?, comm=?", + sendbuf, sendcount, recvbuf, recvcount); + int err = MPI_Alltoall ( + sendbuf, + sendcount, + sendtype, + recvbuf, + recvcount, + recvtype, + comm); + if (err != MPI_SUCCESS) + MPI_WRAPPER_LEAVE ( + h5_error ( + H5_ERR_MPI, + "Cannot perform all to all communication")); + MPI_WRAPPER_RETURN (H5_SUCCESS); +} + +static inline h5_err_t +h5priv_mpi_alltoallv ( + void* sendbuf, + int* sendcounts, + int* senddispls, + const MPI_Datatype sendtype, + void* recvbuf, + int* recvcounts, + int* recvdispls, + const MPI_Datatype recvtype, + const MPI_Comm comm + ) { + MPI_WRAPPER_ENTER (h5_err_t, + "sendbuf=%p, sendcounts=%p, senddispls=%p, sendtype=?, " + "recvbuf=%p, recvcounts=%p, recvdispls=%p, recvtype=?, " + "comm=?", + sendbuf, sendcounts, senddispls, + recvbuf, recvcounts, recvdispls); + int err = MPI_Alltoallv ( + sendbuf, + sendcounts, + senddispls, + sendtype, + recvbuf, + recvcounts, + recvdispls, + recvtype, + comm); + if (err != MPI_SUCCESS) + MPI_WRAPPER_LEAVE ( + h5_error ( + H5_ERR_MPI, + "Cannot perform all to all communication")); + MPI_WRAPPER_RETURN (H5_SUCCESS); +} + + +h5_err_t +h5priv_mpi_barrier ( + const MPI_Comm comm + ); + + +h5_err_t +h5priv_mpi_recv( + void* buf, + const int count, + const MPI_Datatype type, + const int from, + const int tag, + const MPI_Comm comm + ); + +h5_err_t +h5priv_mpi_send( + void* buf, + const int count, + const MPI_Datatype type, + const int to, + const int tag, + const MPI_Comm comm + ); + +h5_err_t +h5priv_mpi_bcast ( + void* buf, + const int count, + const MPI_Datatype type, + const int root, + const MPI_Comm comm + ); + +h5_err_t +h5priv_mpi_sum ( + void* sendbuf, + void* recvbuf, + const int count, + const MPI_Datatype type, + const MPI_Comm comm + ); + +h5_err_t +h5priv_mpi_prefix_sum ( + void* sendbuf, + void* recvbuf, + const int count, + const MPI_Datatype type, + const MPI_Comm comm + ); + +#define h5priv_mpi_allgather mpi_allgather +static inline h5_err_t +mpi_allgather ( + void* sendbuf, + const int sendcount, + const MPI_Datatype sendtype, + void* recvbuf, + const int recvcount, + const MPI_Datatype recvtype, + const MPI_Comm comm + ) { + MPI_WRAPPER_ENTER (h5_err_t, + "sendbuf=%p, sendcount=%d, sendtype=?, recvbuf=%p, " + "recvcount=%d, recvtype=?, comm=?", + sendbuf, sendcount, recvbuf, recvcount); + int err = MPI_Allgather ( + sendbuf, + sendcount, + sendtype, + recvbuf, + recvcount, + recvtype, + comm); + if (err != MPI_SUCCESS) + MPI_WRAPPER_LEAVE (h5_error (H5_ERR_MPI, "Cannot gather data")); + MPI_WRAPPER_RETURN (H5_SUCCESS); +} +#define h5priv_mpi_allgatherv mpi_allgatherv +static inline h5_err_t +mpi_allgatherv ( + void* sendbuf, + const int sendcount, + const MPI_Datatype sendtype, + void* recvbuf, + int* recvcounts, + int* recvdispls, + const MPI_Datatype recvtype, + const MPI_Comm comm + ) { + MPI_WRAPPER_ENTER (h5_err_t, + "sendbuf=%p, sendcount=%d, sendtype=?, " + "recvbuf=%p, recvcounts=%p, recvtype=?, recvdispls=%p, " + "&comm=%p", + sendbuf, sendcount, recvbuf, recvcounts, recvdispls, &comm); + int err = MPI_Allgatherv ( + sendbuf, + sendcount, + sendtype, + recvbuf, + recvcounts, + recvdispls, + recvtype, + comm); + if (err != MPI_SUCCESS) + MPI_WRAPPER_LEAVE (h5_error (H5_ERR_MPI, "Cannot gather data")); + MPI_WRAPPER_RETURN (H5_SUCCESS); +} + +/// +h5_err_t +h5priv_mpi_comm_size ( + MPI_Comm comm, + int* size + ); + +h5_err_t +h5priv_mpi_comm_rank ( + MPI_Comm comm, + int* rank + ); + +// MPI type wrappers +h5_err_t +h5priv_mpi_type_contiguous ( + const size_t nelems, + const MPI_Datatype oldtype, + MPI_Datatype *newtype + ); + +#define h5priv_mpi_get_address mpi_get_address +static inline h5_err_t +mpi_get_address ( + void* location, + MPI_Aint* address + ) { + MPI_WRAPPER_ENTER (h5_err_t, "location=%p, address=%p", location, address); + int err = MPI_Get_address (location, address); + if (err != MPI_SUCCESS) { + MPI_WRAPPER_LEAVE ( + h5_error ( + H5_ERR_MPI, + "Cannot get MPI address of location=%p", location)); + } + MPI_WRAPPER_RETURN (H5_SUCCESS); +} + +#define h5priv_mpi_create_type_struct mpi_create_type_struct +static inline h5_err_t +mpi_create_type_struct ( + int count, + int blocklens[], + MPI_Aint indices[], + MPI_Datatype old_types[], + MPI_Datatype* new_type + ) { + MPI_WRAPPER_ENTER (h5_err_t, + "count=%d, blocklens=%p, indices=%p, old_types=%p, new_type=%p", + count, blocklens, indices, old_types, new_type); + int err = MPI_Type_create_struct (count, blocklens, indices, old_types, new_type); + if (err != MPI_SUCCESS) { + MPI_WRAPPER_LEAVE ( + h5_error ( + H5_ERR_MPI, + "Cannot create new MPI struct")); + } + MPI_WRAPPER_RETURN (H5_SUCCESS); +} + +static inline h5_err_t +h5priv_mpi_type_commit ( + MPI_Datatype* type + ) { + MPI_WRAPPER_ENTER (h5_err_t, "type=%p", type); + int err = MPI_Type_commit (type); + if (err != MPI_SUCCESS) { + MPI_WRAPPER_LEAVE ( + h5_error ( + H5_ERR_MPI, + "Cannot commit MPI datatype")); + } + MPI_WRAPPER_RETURN (H5_SUCCESS); +} + +h5_err_t +h5priv_mpi_type_free ( + MPI_Datatype *type + ); + + +// +h5_err_t +h5priv_mpi_cart_create ( + MPI_Comm old_comm, + int ndims, + int *dims, + int *period, + int reorder, + MPI_Comm *new_comm + ); + +h5_err_t +h5priv_mpi_cart_coords ( + MPI_Comm comm, + int rank, + int maxdim, + int *coords + ); + + +#endif +#endif diff --git a/src/h5core/h5_openclose.c b/src/h5core/h5_openclose.c new file mode 100644 index 0000000..c7dc041 --- /dev/null +++ b/src/h5core/h5_openclose.c @@ -0,0 +1,634 @@ +/* + Copyright (c) 2006-2013, The Regents of the University of California, + through Lawrence Berkeley National Laboratory (subject to receipt of any + required approvals from the U.S. Dept. of Energy) and the Paul Scherrer + Institut (Switzerland). All rights reserved. + + License: see file COPYING in top level of source distribution. +*/ + +#include +#include +#include + +#include "h5core/h5.h" + +#include "h5_private.h" +#include "h5_hdf5_private.h" + +#include "h5_model_private.h" +#include "h5_mpi_private.h" +#include "h5u_readwrite_private.h" +#include "h5b_readwrite_private.h" + +#include "h5core/h5_errorhandling.h" +#include "h5core/h5_syscall.h" + +/*! + \ingroup h5_core + \defgroup h5_core_filehandling +*/ + +/*! + \ingroup h5_core_filehandling + + Check whether \c f points to a valid file handle. + + \return H5_SUCCESS or error code +*/ +h5_err_t +h5_check_filehandle ( + const h5_file_t f_ /*!< filehandle to check validity of */ + ) { + h5_file_p f = (h5_file_p)f_; + if (f == NULL || f_ == H5_FAILURE || f->file < 0 || f->u == NULL || f->b == NULL) { + return h5_error ( + H5_ERR_BADF, + "Called with bad filehandle."); + } + return H5_SUCCESS; +} + +/*! + Initialize H5Part +*/ +static herr_t +hdf5_error_handler ( + hid_t estack_id, + void* __f + ) { + UNUSED_ARGUMENT (__f); + if (h5_get_debuglevel() >= 5) { + H5Eprint (estack_id, stderr); + } + return 0; +} + +static inline h5_err_t +mpi_init ( + const h5_file_p f + ) { + H5_INLINE_FUNC_ENTER (h5_err_t); +#ifdef PARALLEL_IO + TRY (h5priv_mpi_comm_size (f->props->comm, &f->nprocs)); + TRY (h5priv_mpi_comm_rank (f->props->comm, &f->myproc)); + + /* xfer_prop: also used for parallel I/O, during actual writes + rather than the access_prop which is for file creation. */ + TRY (f->props->xfer_prop = hdf5_create_property(H5P_DATASET_XFER)); + TRY (f->props->access_prop = hdf5_create_property(H5P_FILE_ACCESS)); + + /* select the HDF5 VFD */ + if (f->props->mode & H5_VFD_MPIPOSIX) { + h5_info("Selecting MPI-POSIX VFD"); + hbool_t use_gpfs = 0; // TODO autodetect GPFS? + TRY (hdf5_set_fapl_mpiposix_property (f->props->access_prop, + f->props->comm, use_gpfs)); + + } else if (f->props->mode & H5_VFD_CORE) { + h5_info("Selecting CORE VFD"); + TRY (hdf5_set_fapl_core (f->props->access_prop, + f->props->align, 1)); + } else { + h5_info("Selecting MPI-IO VFD"); + TRY (hdf5_set_fapl_mpio_property (f->props->access_prop, + f->props->comm, MPI_INFO_NULL)); + if (f->props->mode & H5_VFD_MPIIO_IND) { + h5_info("MPI-IO: Using independent mode"); + } else { + h5_info("MPI-IO: Using collective mode"); + TRY (hdf5_set_dxpl_mpio_property (f->props->xfer_prop, + H5FD_MPIO_COLLECTIVE) ); + } + } +#ifdef H5_USE_LUSTRE + if (f->flags & H5_FS_LUSTRE) { + TRY (h5_optimize_for_lustre(f, filename)); + } +#endif +#endif /* PARALLEL_IO */ + H5_INLINE_FUNC_RETURN (H5_SUCCESS); +} + +static inline h5_err_t +set_alignment ( + const h5_file_p f + ) { + H5_INLINE_FUNC_ENTER (h5_err_t); + if ( f->props->align != 0 ) { + h5_info ("Setting HDF5 alignment to %llu bytes " + "with threshold at half that many bytes.", + f->props->align); + TRY (hdf5_set_alignment_property ( + f->props->access_prop, + f->props->align / 2, + f->props->align)); + h5_info ("Setting HDF5 meta block to %llu bytes", f->props->align); + TRY (H5Pset_meta_block_size (f->props->access_prop, f->props->align)); + } + H5_INLINE_FUNC_RETURN (H5_SUCCESS); +} + +static inline h5_err_t +set_default_file_props ( + h5_prop_file_t* props + ) { + H5_INLINE_FUNC_ENTER (h5_err_t); + h5_prop_file_t* file_props = (h5_prop_file_t*)props; + bzero (file_props, sizeof (file_props)); + file_props->class = H5_PROP_FILE; + TRY (file_props->prefix_step_name = h5_calloc (1, H5_STEPNAME_LEN)); + strncpy ( + file_props->prefix_step_name, + H5_STEPNAME, + H5_STEPNAME_LEN - 1); + file_props->width_step_idx = H5_STEPWIDTH; + H5_INLINE_FUNC_RETURN (H5_SUCCESS); +} + +h5_err_t +h5_set_prop_file_mpio ( + h5_prop_t _prop, + MPI_Comm* comm + ) { + h5_prop_p prop = (h5_prop_p)_prop; + H5_CORE_API_ENTER (h5_err_t, "prop=%p, comm=%p", prop, comm); + + if (prop->class != H5_PROP_FILE) { + H5_INLINE_FUNC_LEAVE ( + h5_error ( + H5_ERR_INVAL, + "Invalid property class: %lld", prop->class)); + } + h5_prop_file_t* file_prop = (h5_prop_file_t*)prop; + file_prop->comm = *comm; + H5_CORE_API_RETURN (H5_SUCCESS); +} + +h5_err_t +h5_set_prop_file_align ( + h5_prop_t _prop, + h5_int64_t align + ) { + h5_prop_p prop = (h5_prop_p)_prop; + H5_CORE_API_ENTER (h5_err_t, "prop=%p, align=%lld", prop, align); + if (prop->class != H5_PROP_FILE) { + H5_INLINE_FUNC_LEAVE ( + h5_error ( + H5_ERR_INVAL, + "Invalid property class: %lld", prop->class)); + } + h5_prop_file_t* file_prop = (h5_prop_file_t*)prop; + file_prop->align = align; + H5_CORE_API_RETURN (H5_SUCCESS); +} + +h5_err_t +h5_set_prop_file_throttle ( + h5_prop_t _prop, + h5_int64_t throttle + ) { + h5_prop_p prop = (h5_prop_p)_prop; + H5_CORE_API_ENTER (h5_err_t, "prop=%p, throttle=%lld", prop, throttle); + if (prop->class != H5_PROP_FILE) { + H5_INLINE_FUNC_LEAVE ( + h5_error ( + H5_ERR_INVAL, + "Invalid property class: %lld", prop->class)); + } + h5_prop_file_t* file_prop = (h5_prop_file_t*)prop; + file_prop->throttle = throttle; + H5_CORE_API_RETURN (H5_SUCCESS); +} + + +h5_prop_t +h5_create_prop ( + h5_int64_t class + ) { + H5_CORE_API_ENTER (h5_prop_t, + "class=%lld", class); + h5_prop_t* prop; + switch (class) { + case H5_PROP_FILE: + TRY (prop = h5_calloc (1, sizeof (h5_prop_file_t))); + set_default_file_props ((h5_prop_file_t*)prop); + break; + default: + H5_CORE_API_LEAVE ( + h5_error ( + H5_ERR_INVAL, + "Invalid property class: %lld", class)); + } + H5_CORE_API_RETURN ((h5_prop_t)prop); +} + +h5_err_t +h5_close_prop ( + h5_prop_t _prop + ) { + h5_prop_p prop = (h5_prop_p)_prop; + H5_CORE_API_ENTER (h5_err_t, "prop=%p", prop); + switch (prop->class) { + case H5_PROP_FILE: { + h5_prop_file_t* file_prop = (h5_prop_file_t*)prop; + TRY (h5_free (file_prop->prefix_step_name)); + break; + } + default: + H5_CORE_API_LEAVE ( + h5_error ( + H5_ERR_INVAL, + "Invalid property class: %lld", prop->class)); + } + H5_CORE_API_RETURN (h5_free (prop)); +} + +static inline h5_err_t +open_file ( + const h5_file_p f, + const char* const filename, + h5_int32_t mode + ) { + H5_INLINE_FUNC_ENTER (h5_err_t); + h5_info ("Opening file %s.", filename); + + f->props->mode = mode; + + f->nprocs = 1; // queried later + f->myproc = 0; // queried later + f->step_gid = -1; + + TRY (f->step_name = h5_calloc (2, H5_STEPNAME_LEN)); + sprintf ( + f->step_name, + "%s#%0*lld", + f->props->prefix_step_name, + f->props->width_step_idx, (long long)f->step_idx); + + TRY (hdf5_set_errorhandler (H5E_DEFAULT, hdf5_error_handler, NULL)); + + f->props->xfer_prop = f->props->access_prop = H5P_DEFAULT; + TRY (f->props->create_prop = hdf5_create_property (H5P_FILE_CREATE)); + TRY (mpi_init (f)); // noop if serial + TRY (set_alignment (f)); + + if (f->props->mode & H5_O_RDONLY) { + f->file = H5Fopen (filename, H5F_ACC_RDONLY, f->props->access_prop); + } + else if (f->props->mode & H5_O_WRONLY){ + f->file = H5Fcreate (filename, H5F_ACC_TRUNC, f->props->create_prop, + f->props->access_prop); + f->empty = 1; + } + else if (f->props->mode & H5_O_APPEND || f->props->mode & H5_O_RDWR) { + int fd = open (filename, O_RDONLY, 0); + if ((fd == -1) && (errno == ENOENT)) { + f->file = H5Fcreate (filename, H5F_ACC_TRUNC, + f->props->create_prop, f->props->access_prop); + f->empty = 1; + } + else if (fd != -1) { + close (fd); + f->file = H5Fopen (filename, H5F_ACC_RDWR, + f->props->access_prop); + } + } + else { + H5_PRIV_FUNC_LEAVE ( + h5_error ( + H5_ERR_INVAL, + "Invalid file access mode '%lld'.", f->props->mode)); + } + + if (f->file < 0) + H5_PRIV_FUNC_LEAVE ( + h5_error ( + H5_ERR_HDF5, + "Cannot open file '%s' with mode '%lld'", + filename, f->props->mode)); + TRY (f->root_gid = hdf5_open_group (f->file, "/" )); + + TRY (h5upriv_open_file (f)); + TRY (h5bpriv_open_file (f)); + + H5_INLINE_FUNC_RETURN (H5_SUCCESS); +} + +h5_file_t +h5_open_file2 ( + const char* filename, + h5_int32_t mode, + h5_prop_t props_ + ) { + h5_prop_file_t* props = (h5_prop_file_t*)props_; + H5_CORE_API_ENTER (h5_file_t, + "filename='%s', mode=%d, props=%p", + filename, mode, props); + + h5_file_p f = NULL; + TRY (f = h5_calloc (1, sizeof (*f))); + + TRY (f->props = (h5_prop_file_t*)h5_create_prop (H5_PROP_FILE)); + TRY (set_default_file_props (f->props)); + TRY (h5_set_stepname_fmt ((uintptr_t)f, H5_STEPNAME, H5_STEPWIDTH)); + + if (props != H5_PROP_DEFAULT) { + if (props->class != H5_PROP_FILE) { + H5_CORE_API_LEAVE ( + h5_error ( + H5_ERR_INVAL, + "Invalid property class: %lld.", + props->class)); + } + f->props->comm = props->comm; + f->props->mode |= props->mode; + f->props->throttle = props->throttle; + f->props->align = props->align; + + strncpy ( + f->props->prefix_step_name, + props->prefix_step_name, + H5_STEPNAME_LEN - 1); + f->props->width_step_idx = props->width_step_idx; + } + + TRY (open_file (f, filename, mode)); + + H5_CORE_API_RETURN ((h5_file_t)f); +} + +/*! + \ingroup h5_core_filehandling + + Open file with name \c filename. This function is available in the paralell + and serial version. In the serial case \c comm may have any value. + + \param[in] filename The name of the data file to open. + \param[in] flags The access mode for the file. + \param[in] comm MPI communicator + \param[in] align Number of bytes for setting alignment, + metadata block size, etc. Set to 0 to disable. + + \return File handle. + \return H5_ERR on error. +*/ + +h5_file_t +h5_open_file ( + const char* filename, + h5_int32_t mode, + MPI_Comm comm, + h5_size_t align + ) { + H5_CORE_API_ENTER (h5_file_t, + "filename='%s', mode=%d, comm=?, align=%llu", + filename, mode, align); + h5_prop_file_t* props; + h5_file_t f; + TRY (props = (h5_prop_file_t*)h5_create_prop (H5_PROP_FILE)); + TRY (h5_set_prop_file_mpio ((h5_prop_t)props, &comm)); + TRY (h5_set_prop_file_align ((h5_prop_t)props, align)); + TRY (f = h5_open_file2 (filename, mode, (h5_prop_t)props)); + TRY (h5_close_prop ((h5_prop_t)props)); + H5_CORE_API_RETURN (f); + +} +#if 0 +h5_file_t +h5_open_file ( + const char* filename, + h5_int32_t mode, + MPI_Comm comm, + h5_size_t align + ) { + H5_CORE_API_ENTER (h5_file_t, + "filename='%s', mode=%d, comm=?, align=%llu", + filename, mode, align); + h5_prop_file_t* props; + TRY (props = (h5_prop_file_t*)h5_create_prop (H5_PROP_FILE)); + TRY (set_default_file_props (props)); + + TRY (h5_set_prop_file_mpio ((h5_prop_t)props, &comm)); + TRY (h5_set_prop_file_align ((h5_prop_t)props, align)); + + h5_file_p f = NULL; + TRY (f = h5_calloc (1, sizeof (*f))); + f->props = props; + TRY (open_file (f, filename, mode)); + + H5_CORE_API_RETURN ((h5_file_t)f); +} +#endif + +/*! + \ingroup h5_core_filehandling + + The h5_close_file() call writes all buffered data to disk, releases + all previously allocated memory and terminates access to the associated + HDF5 file. + + \return H5_SUCCESS or error code +*/ +h5_err_t +h5_close_file ( + const h5_file_t f_ /*!< file handle */ + ) { + h5_file_p f = (h5_file_p)f_; + H5_CORE_API_ENTER (h5_err_t, "f=%p", f); + h5_errno = H5_SUCCESS; + + CHECK_FILEHANDLE (f); + + TRY (h5priv_close_step (f)); + TRY (h5upriv_close_file (f)); + TRY (h5bpriv_close_file (f)); + TRY (hdf5_close_property (f->props->xfer_prop)); + TRY (hdf5_close_property (f->props->access_prop)); + TRY (hdf5_close_property (f->props->create_prop)); + TRY (hdf5_close_group (f->root_gid)); + TRY (hdf5_flush (f->file, H5F_SCOPE_GLOBAL)); + TRY (h5_close_prop ((h5_prop_t)f->props)); + TRY (hdf5_close_file (f->file)); + TRY (h5_free (f->step_name)); + TRY (h5_free (f)); + H5_CORE_API_RETURN (H5_SUCCESS); +} + +h5_err_t +h5_close_hdf5 ( + void + ) { + H5_CORE_API_ENTER (h5_err_t, "%s", ""); + H5_CORE_API_RETURN (hdf5_close ()); +} + +h5_err_t +h5_flush_step ( + const h5_file_t f_ + ) { + h5_file_p f = (h5_file_p)f_; + H5_CORE_API_ENTER (h5_err_t, "f=%p", f); + H5_CORE_API_RETURN (hdf5_flush (f->step_gid, H5F_SCOPE_LOCAL)); +} + +h5_err_t +h5_flush_file ( + const h5_file_t f_ + ) { + h5_file_p f = (h5_file_p)f_; + H5_CORE_API_ENTER (h5_err_t, "f=%p", f); + H5_CORE_API_RETURN (hdf5_flush (f->file, H5F_SCOPE_GLOBAL)); +} + + +/*! + \ingroup h5_core_filehandling + + Define format of the step names. + + Example: ==H5FedDefineStepNameFormat( f, "Step", 6 )== defines step names + like ==Step#000042==. + + \return \c H5_SUCCESS or error code +*/ +h5_err_t +h5_set_stepname_fmt ( + const h5_file_t f_, + const char* name, + int width + ) { + h5_file_p f = (h5_file_p)f_; + H5_CORE_API_ENTER (h5_err_t, + "f=%p, name='%s', width=%d", + f, name, width); + if (width < 0) width = 0; + else if (width > H5_STEPNAME_LEN - 1) width = H5_STEPNAME_LEN - 1; + strncpy ( + f->props->prefix_step_name, + name, + H5_STEPNAME_LEN - 1); + f->props->width_step_idx = width; + + H5_CORE_API_RETURN (H5_SUCCESS); +} + +/*! + \ingroup h5_core_filehandling + + Get format of the step names. + + \return \c H5_SUCCESS or error code +*/ +h5_err_t +h5_get_stepname_fmt ( + const h5_file_t f_, /*!< Handle to file */ + char* name, /*!< OUT: Prefix */ + int l_name, /*!< length of buffer name */ + int* width /*!< OUT: Width of the number */ + ) { + h5_file_p f = (h5_file_p)f_; + UNUSED_ARGUMENT (f); + UNUSED_ARGUMENT (name); + UNUSED_ARGUMENT (l_name); + UNUSED_ARGUMENT (width); + return h5_error_not_implemented (); +} + +/*! + \ingroup h5_core_filehandling + + Get current step number. + + \return Current step number or error code +*/ +h5_id_t +h5_get_step ( + const h5_file_t f_ /*!< file handle */ + ) { + h5_file_p f = (h5_file_p)f_; + H5_CORE_API_ENTER (h5_id_t, "f=%p", f); + H5_CORE_API_RETURN (f->step_idx); +} + +/*! + \ingroup h5_core_filehandling + + Get number of processes. + + \return Number of processes or error code +*/ +int +h5_get_num_procs ( + const h5_file_t f_ /*!< file handle */ + ) { + h5_file_p f = (h5_file_p)f_; + H5_CORE_API_ENTER (int, "f=%p", f); + H5_CORE_API_RETURN (f->nprocs); +} + +/*! + \ingroup h5_core_filehandling + + Provides access to the underlying HDF5 file handle. + + \return Number of steps or error code +*/ +hid_t +h5_get_hdf5_file( + const h5_file_t f_ /*!< file handle */ + ) { + h5_file_p f = (h5_file_p)f_; + H5_CORE_API_ENTER (hid_t, "f=%p", f); + H5_CORE_API_RETURN (f->file); +} + +/*! + \ingroup h5_core_filehandling + + Get number of steps. + + \return Number of steps or error code +*/ +h5_ssize_t +h5_get_num_steps( + const h5_file_t f_ /*!< file handle */ + ) { + h5_file_p f = (h5_file_p)f_; + H5_CORE_API_ENTER (int, "f=%p", f); + H5_CORE_API_RETURN (hdf5_get_num_groups_matching_prefix ( + f->root_gid, + f->props->prefix_step_name)); +} + +/*! + \ingroup h5_core_filehandling + + Start traversing steps. + + \return \c H5_SUCCESS or error code +*/ +h5_err_t +h5_start_traverse_steps ( + const h5_file_t f_ /*!< file handle */ + ) { + h5_file_p f = (h5_file_p)f_; + UNUSED_ARGUMENT (f); + return h5_error_not_implemented (); +} + +/*! + \ingroup h5_core_filehandling + + Go to next step. + + \return \c H5_SUCCESS or error code +*/ +h5_err_t +h5_traverse_steps ( + const h5_file_t f_ /*!< file handle */ + ) { + h5_file_p f = (h5_file_p)f_; + UNUSED_ARGUMENT (f); + return h5_error_not_implemented (); +} diff --git a/src/h5core/h5_private.h b/src/h5core/h5_private.h new file mode 100644 index 0000000..4910050 --- /dev/null +++ b/src/h5core/h5_private.h @@ -0,0 +1,22 @@ +#ifndef __H5_PRIVATE_H +#define __H5_PRIVATE_H + +#include "h5_types_private.h" +#include "h5_errorhandling_private.h" + +static inline h5_err_t +check_filehandle ( + const h5_file_p f + ) { + if (f == NULL || f->file < 0 || f->u == NULL || f->b == NULL) { + return h5_error ( + H5_ERR_BADF, + "Called with bad filehandle."); + } + return H5_SUCCESS; +} + +#define CHECK_FILEHANDLE(f) \ + TRY (check_filehandle (f)); + +#endif diff --git a/src/h5core/h5_qsort.c b/src/h5core/h5_qsort.c new file mode 100644 index 0000000..965686b --- /dev/null +++ b/src/h5core/h5_qsort.c @@ -0,0 +1,197 @@ +/*- + * Copyright (c) 1992, 1993 + * The Regents of the University of California. All rights reserved. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions + * are met: + * 1. Redistributions of source code must retain the above copyright + * notice, this list of conditions and the following disclaimer. + * 2. Redistributions in binary form must reproduce the above copyright + * notice, this list of conditions and the following disclaimer in the + * documentation and/or other materials provided with the distribution. + * 3. All advertising materials mentioning features or use of this software + * must display the following acknowledgement: + * This product includes software developed by the University of + * California, Berkeley and its contributors. + * 4. Neither the name of the University nor the names of its contributors + * may be used to endorse or promote products derived from this software + * without specific prior written permission. + * + * THIS SOFTWARE IS PROVIDED BY THE REGENTS AND CONTRIBUTORS ``AS IS'' AND + * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE + * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE + * ARE DISCLAIMED. IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE + * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL + * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS + * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) + * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT + * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY + * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF + * SUCH DAMAGE. + */ + +#if defined(LIBC_SCCS) && !defined(lint) +static char sccsid[] = "@(#)qsort.c 8.1 (Berkeley) 6/4/93"; +#endif /* LIBC_SCCS and not lint */ +#include + +#include + +#include "h5_qsort_private.h" + +#ifdef I_AM_QSORT_R +typedef int cmp_t (void *, const void *, const void *); +#else +typedef int cmp_t (const void *, const void *); +#endif +static inline char *med3(char *, char *, char *, cmp_t *, void *); +static inline void swapfunc(char *, char *, int, int); + +#define min(a, b) (a) < (b) ? a : b + +/* + * Qsort routine from Bentley & McIlroy's "Engineering a Sort Function". + */ +#define swapcode(TYPE, parmi, parmj, n) { \ + long i = (n) / sizeof (TYPE); \ + TYPE *pi = (TYPE *) (parmi); \ + TYPE *pj = (TYPE *) (parmj); \ + do { \ + TYPE t = *pi; \ + *pi++ = *pj; \ + *pj++ = t; \ + } while (--i > 0); \ +} + +#define SWAPINIT(a, es) swaptype = ((char *)a - (char *)0) % sizeof(long) || \ + es % sizeof(long) ? 2 : es == sizeof(long) ? 0 : 1; + +static inline void +swapfunc(char* a, char* b, int n, int swaptype) { + if(swaptype <= 1) + swapcode(long, a, b, n) + else + swapcode(char, a, b, n) + } + +#define swap(a, b) \ + if (swaptype == 0) { \ + long t = *(long *)(a); \ + *(long *)(a) = *(long *)(b); \ + *(long *)(b) = t; \ + } else \ + swapfunc(a, b, es, swaptype) + +#define vecswap(a, b, n) if ((n) > 0) swapfunc(a, b, n, swaptype) + +#ifdef I_AM_QSORT_R +#define CMP(t, x, y) (cmp((t), (x), (y))) +#else +#define CMP(t, x, y) (cmp((x), (y))) +#endif + + static inline char * + med3(char *a, char *b, char *c, cmp_t *cmp, void *thunk +#ifndef I_AM_QSORT_R +#if __GNUC__ + __attribute__((unused)) +#endif +#endif + ) + { + return CMP(thunk, a, b) < 0 ? + (CMP(thunk, b, c) < 0 ? b : (CMP(thunk, a, c) < 0 ? c : a )) + : (CMP(thunk, b, c) > 0 ? b : (CMP(thunk, a, c) < 0 ? a : c )); + } + +#ifdef I_AM_QSORT_R + void + h5priv_qsort_r (void* a, size_t n, size_t es, void* thunk, cmp_t* cmp) +#else +#define thunk NULL + void + h5priv_qsort (void* a, size_t n, size_t es, cmp_t* cmp) +#endif + { + char *pa, *pb, *pc, *pd, *pl, *pm, *pn; + int d, r, swaptype, swap_cnt; + +loop: SWAPINIT(a, es); + swap_cnt = 0; + if (n < 7) { + for (pm = (char *)a + es; pm < (char *)a + n * es; pm += es) + for (pl = pm; + pl > (char *)a && CMP(thunk, pl - es, pl) > 0; + pl -= es) + swap(pl, pl - es); + return; + } + pm = (char *)a + (n / 2) * es; + if (n > 7) { + pl = a; + pn = (char *)a + (n - 1) * es; + if (n > 40) { + d = (n / 8) * es; + pl = med3(pl, pl + d, pl + 2 * d, cmp, thunk); + pm = med3(pm - d, pm, pm + d, cmp, thunk); + pn = med3(pn - 2 * d, pn - d, pn, cmp, thunk); + } + pm = med3(pl, pm, pn, cmp, thunk); + } + swap(a, pm); + pa = pb = (char *)a + es; + + pc = pd = (char *)a + (n - 1) * es; + for (;; ) { + while (pb <= pc && (r = CMP(thunk, pb, a)) <= 0) { + if (r == 0) { + swap_cnt = 1; + swap(pa, pb); + pa += es; + } + pb += es; + } + while (pb <= pc && (r = CMP(thunk, pc, a)) >= 0) { + if (r == 0) { + swap_cnt = 1; + swap(pc, pd); + pd -= es; + } + pc -= es; + } + if (pb > pc) + break; + swap(pb, pc); + swap_cnt = 1; + pb += es; + pc -= es; + } + if (swap_cnt == 0) { /* Switch to insertion sort */ + for (pm = (char *)a + es; pm < (char *)a + n * es; pm += es) + for (pl = pm; + pl > (char *)a && CMP(thunk, pl - es, pl) > 0; + pl -= es) + swap(pl, pl - es); + return; + } + + pn = (char *)a + n * es; + r = min(pa - (char *)a, pb - pa); + vecswap(a, pb - r, r); + r = min(pd - pc, pn - pd - es); + vecswap(pb, pn - r, r); + if ((r = pb - pa) > es) +#ifdef I_AM_QSORT_R + h5priv_qsort_r(a, r / es, es, thunk, cmp); +#else + h5priv_qsort(a, r / es, es, cmp); +#endif + if ((r = pd - pc) > es) { + /* Iterate rather than recurse to save stack space */ + a = pn - r; + n = r / es; + goto loop; + } +/* qsort(pn - r, r / es, es, cmp);*/ + } diff --git a/src/h5core/h5_qsort_private.h b/src/h5core/h5_qsort_private.h new file mode 100644 index 0000000..fa42a6a --- /dev/null +++ b/src/h5core/h5_qsort_private.h @@ -0,0 +1,31 @@ +/* + Copyright (c) 2006-2013, The Regents of the University of California, + through Lawrence Berkeley National Laboratory (subject to receipt of any + required approvals from the U.S. Dept. of Energy) and the Paul Scherrer + Institut (Switzerland). All rights reserved. + + License: see file COPYING in top level of source distribution. +*/ + +#ifndef __H5_QSORT_PRIVATE_H +#define __H5_QSORT_PRIVATE_H + +#include "h5core/h5_types.h" +void +h5priv_qsort_r ( + void *a, + size_t n, + size_t es, + void *thunk, + int (*compar)(void *, const void *, const void *) + ); + +void +h5priv_qsort ( + void *a, + size_t n, + size_t es, + int (*compar)(const void *, const void *) + ); + +#endif diff --git a/src/h5core/h5_qsort_r.c b/src/h5core/h5_qsort_r.c new file mode 100644 index 0000000..704a7a2 --- /dev/null +++ b/src/h5core/h5_qsort_r.c @@ -0,0 +1,8 @@ +/* + * This file is in the public domain. Originally written by Garrett + * A. Wollman. + * + * $FreeBSD: src/lib/libc/stdlib/qsort_r.c,v 1.1 2002/09/10 02:04:49 wollman Exp $ + */ +#define I_AM_QSORT_R +#include "h5_qsort.c" diff --git a/src/h5core/h5_readwrite.c b/src/h5core/h5_readwrite.c new file mode 100644 index 0000000..1738e8d --- /dev/null +++ b/src/h5core/h5_readwrite.c @@ -0,0 +1,157 @@ +/* + Copyright (c) 2006-2012, The Regents of the University of California, + through Lawrence Berkeley National Laboratory (subject to receipt of any + required approvals from the U.S. Dept. of Energy) and the Paul Scherrer + Institut (Switzerland). All rights reserved. + + License: see file COPYING in top level of source distribution. +*/ + +#include "h5core/h5.h" +#include "h5_types_private.h" + +#include "h5_errorhandling_private.h" +#include "h5_hdf5_private.h" +#include "h5_model_private.h" +#include "h5_readwrite_private.h" + +/*! + Write data to dataset. + + - Open/Create dataset + - set hyperslabs for disk and memory via callback functions + - Write data + - Close dataset + */ +h5_err_t +h5priv_write_dataset_by_name ( + h5t_mesh_t* const m, + const h5_file_p f, + const hid_t loc_id, + h5_dsinfo_t* dsinfo, + hid_t (*set_memspace)(h5t_mesh_t*,hid_t), + hid_t (*set_diskspace)(h5t_mesh_t*,hid_t), + const void* const data + ) { + H5_PRIV_API_ENTER (h5_err_t, + "m=%p, f=%p, loc_id=%d (%s), dsinfo=%p, set_memspace=%p, " + "set_diskspace=%p, data=%p", + m, f, loc_id, hdf5_get_objname(loc_id), + dsinfo, + set_memspace, set_diskspace, data); + h5_info ("Writing dataset %s/%s.", + hdf5_get_objname (loc_id), dsinfo->name); + + h5_err_t exists; + TRY (exists = hdf5_link_exists (loc_id, dsinfo->name)); + if ((exists > 0) && ((f->props->mode==H5_O_WRONLY) || (f->props->mode==H5_O_APPEND))) { + h5_warn ("Dataset %s/%s already exist.", + hdf5_get_objname (loc_id), dsinfo->name); + H5_PRIV_API_LEAVE (h5priv_handle_file_mode_error(f->props->mode)); + } + + /* + open/create dataset + */ + + hid_t dset_id; + hid_t dataspace_id; + hid_t diskspace_id; + hid_t memspace_id; + + if (exists) { + /* overwrite dataset */ + TRY (dset_id = hdf5_open_dataset (loc_id, dsinfo->name)); + TRY (dataspace_id = hdf5_get_dataset_space (dset_id)); + TRY (hdf5_set_dataset_extent (dset_id, dsinfo->dims)); + /* exten dataset? */ + } else { + /* create dataset */ + TRY (dataspace_id = hdf5_create_dataspace ( + dsinfo->rank, + dsinfo->dims, + dsinfo->max_dims)); + TRY (dset_id = hdf5_create_dataset ( + loc_id, + dsinfo->name, + dsinfo->type_id, + dataspace_id, + dsinfo->create_prop)); + } + TRY (memspace_id = (*set_memspace)(m, 0)); + TRY (diskspace_id = (*set_diskspace)(m, dataspace_id)); +#ifdef PARALLEL_IO + TRY (h5priv_start_throttle (f)); +#endif + TRY (hdf5_write_dataset ( + dset_id, + dsinfo->type_id, + memspace_id, + diskspace_id, + f->props->xfer_prop, + data)); +#ifdef PARALLEL_IO + TRY (h5priv_end_throttle (f)); +#endif + TRY (hdf5_close_dataspace (diskspace_id)); + TRY (hdf5_close_dataspace (memspace_id)); + TRY (hdf5_close_dataset (dset_id)); + f->empty = 0; + + H5_PRIV_API_RETURN (H5_SUCCESS); +} + + + +/*! + Write data to dataset. + + - Check existance dataset + - Write data + is needed if dset, mspace, dspace can't be set by the callback functions above + */ +h5_err_t +h5priv_write_dataset_by_name_id ( + const h5_file_p f, + const hid_t loc_id, + h5_dsinfo_t* dsinfo, + hid_t dset_id, + hid_t memspace_id, + hid_t diskspace_id, + const void* const data + ) { + H5_PRIV_API_ENTER (h5_err_t, + "f=%p, loc_id=%d (%s), dsinfo=%p, dset_id=%d, memspace_id=%d, " + "diskspace_id=%d, data=%p", + f, loc_id, hdf5_get_objname(loc_id), + dsinfo, + dset_id, + memspace_id, diskspace_id, data); + h5_info ("Writing dataset %s/%s.", + hdf5_get_objname (loc_id), dsinfo->name); + + h5_err_t exists; + TRY (exists = hdf5_link_exists (loc_id, dsinfo->name)); + if ((exists > 0) && ((f->props->mode==H5_O_WRONLY) || (f->props->mode==H5_O_APPEND))) { + h5_warn ("Dataset %s/%s already exist.", + hdf5_get_objname (loc_id), dsinfo->name); + H5_PRIV_API_LEAVE (h5priv_handle_file_mode_error(f->props->mode)); + } + +#ifdef PARALLEL_IO + TRY (h5priv_start_throttle (f)); +#endif + TRY (hdf5_write_dataset ( + dset_id, + dsinfo->type_id, + memspace_id, + diskspace_id, + f->props->xfer_prop, + data)); +#ifdef PARALLEL_IO + TRY (h5priv_end_throttle (f)); +#endif + + + H5_PRIV_API_RETURN (H5_SUCCESS); +} diff --git a/src/h5core/h5_readwrite_private.h b/src/h5core/h5_readwrite_private.h new file mode 100644 index 0000000..eb10e70 --- /dev/null +++ b/src/h5core/h5_readwrite_private.h @@ -0,0 +1,96 @@ +/* + Copyright (c) 2006-2013, The Regents of the University of California, + through Lawrence Berkeley National Laboratory (subject to receipt of any + required approvals from the U.S. Dept. of Energy) and the Paul Scherrer + Institut (Switzerland). All rights reserved. + + License: see file COPYING in top level of source distribution. +*/ + +#ifndef __H5_READWRITE_PRIVATE_H +#define __H5_READWRITE_PRIVATE_H + +#include "h5core/h5_types.h" + + +#define is_writable(f) (f->props->mode != H5_O_RDONLY) +#define is_readonly(f) (f->props->mode == H5_O_RDONLY) + +#define CHECK_WRITABLE_MODE(f) \ + TRY (is_writable (f) ? H5_SUCCESS : h5_error ( \ + H5_ERR_INVAL, \ + "Attempting to write to read-only file")); + +#define CHECK_READONLY_MODE(f) \ + TRY (is_readonly (f) ? H5_SUCCESS : h5_error ( \ + H5_ERR_INVAL, \ + "Operation is not allowed on writable files.")); + +#define CHECK_TIMEGROUP(f) \ + TRY ((f->step_gid > 0) ? H5_SUCCESS : h5_error ( \ + H5_ERR_INVAL, \ + "Time step is invalid! Have you set the time step?")); + + +/* + information about HDF5 dataset + */ +typedef struct h5_dataset_info { + char name[256]; + int rank; + hsize_t dims[4]; + hsize_t max_dims[4]; + hsize_t chunk_dims[4]; + hid_t type_id; + hid_t create_prop; + hid_t access_prop; +} h5_dsinfo_t; + +h5_err_t +h5priv_write_dataset_by_name ( + h5t_mesh_t* const m, + const h5_file_p f, + hid_t loc_id, + h5_dsinfo_t* ds_info, + hid_t (*set_memspace)(h5t_mesh_t*,hid_t), + hid_t (*set_diskspace)(h5t_mesh_t*,hid_t), + const void* const data + ); + +h5_err_t +h5priv_write_dataset_by_name_id ( + const h5_file_p f, + const hid_t loc_id, + h5_dsinfo_t* dsinfo, + hid_t dset_id, + hid_t memspace_id, + hid_t diskspace_id, + const void* const data + ); + +h5_err_t +h5priv_read_dataset ( + const h5_file_p, + const hid_t, h5_dsinfo_t*, + hid_t (*)(h5t_mesh_t* const, const hid_t), + hid_t (*)(h5t_mesh_t* const, const hid_t), + void* const); + +h5_int64_t +h5priv_normalize_h5_type ( + hid_t type + ); + +h5_int64_t +h5priv_get_dataset_type( + const hid_t group_id, + const char *dataset_name + ); + +h5_err_t +h5priv_normalize_dataset_name ( + const char *name, + char *name2 + ); + +#endif diff --git a/src/h5core/h5_syscall.c b/src/h5core/h5_syscall.c new file mode 100644 index 0000000..2a9554a --- /dev/null +++ b/src/h5core/h5_syscall.c @@ -0,0 +1,42 @@ +/* + Copyright (c) 2006-2013, The Regents of the University of California, + through Lawrence Berkeley National Laboratory (subject to receipt of any + required approvals from the U.S. Dept. of Energy) and the Paul Scherrer + Institut (Switzerland). All rights reserved. + + License: see file COPYING in top level of source distribution. +*/ + +#include + +#include "h5core/h5_types.h" +#include "h5core/h5_errorhandling.h" + +void* +h5priv_tsearch ( + const void* key, + void** rootp, + int (*compar)(const void* key1, const void* key2) + ) { + void* ptr = tsearch (key, rootp, compar); + if (ptr == NULL) { + h5_error (H5_ERR_NOMEM, "Out of memory."); + return (void*)(H5_ERR); + } + return ptr; +} + +void* +h5priv_tfind ( + const void* key, + void* const* rootp, + int (*compar)(const void* key1, const void* key2) + ) { + void* ptr = tfind (key, rootp, compar); + if (ptr == NULL) { + return (void*)(H5_ERR); + } + return ptr; +} + + diff --git a/src/h5core/h5_syscall_private.h b/src/h5core/h5_syscall_private.h new file mode 100644 index 0000000..9da33b4 --- /dev/null +++ b/src/h5core/h5_syscall_private.h @@ -0,0 +1,28 @@ +/* + Copyright (c) 2006-2013, The Regents of the University of California, + through Lawrence Berkeley National Laboratory (subject to receipt of any + required approvals from the U.S. Dept. of Energy) and the Paul Scherrer + Institut (Switzerland). All rights reserved. + + License: see file COPYING in top level of source distribution. +*/ + +#ifndef __H5_SYSCALL_PRIVATE_H +#define __H5_SYSCALL_PRIVATE_H + +#include "h5core/h5_types.h" + +void* +h5priv_tsearch ( + const void* key, + void** rootp, + int (*compar)(const void* key1, const void* key2) + ); + +void* +h5priv_tfind ( + const void* key, + void *const* rootp, + int (*compar)(const void* key1, const void* key2) + ); +#endif diff --git a/src/h5core/h5_types_private.h b/src/h5core/h5_types_private.h new file mode 100644 index 0000000..827b63e --- /dev/null +++ b/src/h5core/h5_types_private.h @@ -0,0 +1,77 @@ +/* + Copyright (c) 2006-2013, The Regents of the University of California, + through Lawrence Berkeley National Laboratory (subject to receipt of any + required approvals from the U.S. Dept. of Energy) and the Paul Scherrer + Institut (Switzerland). All rights reserved. + + License: see file COPYING in top level of source distribution. +*/ + +#ifndef __H5_TYPES_PRIVATE_H +#define __H5_TYPES_PRIVATE_H + +#include +#include "h5core/h5_types.h" + +struct h5_prop { // generic property class + h5_int64_t class; // property class + char pad[248]; // sizeof (struct h5_prop) == 256 +}; + +typedef struct { // file property + h5_int64_t class; // property class == H5_PROP_FILE + h5_int64_t mode; + h5_int64_t flags; + h5_int64_t align; + h5_int64_t throttle; + MPI_Comm comm; + hid_t xfer_prop; // dataset transfer properties + hid_t access_prop; // file access properties + hid_t create_prop; // file create properties + char* prefix_step_name; // Prefix of step name + int width_step_idx; // pad step index with 0 up to this +} h5_prop_file_t; + + +/** + \struct h5_file + + This is an essentially opaque datastructure that + acts as a filehandle and is defined as type \c h5_file_t. + It is created by \ref H5OpenFile and destroyed by + \ref H5CloseFile. +*/ +struct h5_file { + hid_t file; // HDF5 file id + h5_prop_file_t* props; // file properties + char empty; // flag (should be int?!) + + /* MPI */ + int nprocs; // number of processors + int myproc; // index of my processor + + /* HDF5 */ + hid_t root_gid; // HDF5 group id of root + hid_t step_gid; // HDF5 group id of current step + + /* step internal data */ + char* step_name; // full current step name + h5_int64_t step_idx; // current step index + int is_new_step; // :FIXME: ? + + struct h5u_fdata *u; // pointer to unstructured data + struct h5b_fdata *b; // pointer to block data +}; + +struct h5_idxmap_el { + h5_glb_idx_t glb_idx; + h5_loc_idx_t loc_idx; +}; +typedef struct h5_idxmap_el h5_idxmap_el_t; + +struct h5_idxmap { + h5_size_t size; /* allocated space in number of items */ + h5_size_t num_items; /* stored items */ + h5_idxmap_el_t* items; +}; +#endif diff --git a/src/h5core/h5_va_macros.h b/src/h5core/h5_va_macros.h new file mode 100644 index 0000000..66cd7c7 --- /dev/null +++ b/src/h5core/h5_va_macros.h @@ -0,0 +1,25 @@ +#ifndef __H5_VA_MACROS_H +#define __H5_VA_MACROS_H + +#define PP_NARG(...) \ + PP_NARG_(__VA_ARGS__,PP_RSEQ_N()) +#define PP_NARG_(...) \ + PP_ARG_N(__VA_ARGS__) +#define PP_ARG_N( \ + _1, _2, _3, _4, _5, _6, _7, _8, _9,_10, \ + _11,_12,_13,_14,_15,_16,_17,_18,_19,_20, \ + _21,_22,_23,_24,_25,_26,_27,_28,_29,_30, \ + _31,_32,_33,_34,_35,_36,_37,_38,_39,_40, \ + _41,_42,_43,_44,_45,_46,_47,_48,_49,_50, \ + _51,_52,_53,_54,_55,_56,_57,_58,_59,_60, \ + _61,_62,_63,N,...) N +#define PP_RSEQ_N() \ + 63,62,61,60, \ + 59,58,57,56,55,54,53,52,51,50, \ + 49,48,47,46,45,44,43,42,41,40, \ + 39,38,37,36,35,34,33,32,31,30, \ + 29,28,27,26,25,24,23,22,21,20, \ + 19,18,17,16,15,14,13,12,11,10, \ + 9,8,7,6,5,4,3,2,1,0 + +#endif diff --git a/src/h5core/h5b_attribs.c b/src/h5core/h5b_attribs.c new file mode 100644 index 0000000..d4a1243 --- /dev/null +++ b/src/h5core/h5b_attribs.c @@ -0,0 +1,252 @@ +/* + Copyright (c) 2006-2012, The Regents of the University of California, + through Lawrence Berkeley National Laboratory (subject to receipt of any + required approvals from the U.S. Dept. of Energy) and the Paul Scherrer + Institut (Switzerland). All rights reserved. + + License: see file COPYING in top level of source distribution. +*/ +#include "h5core/h5.h" + +#include "h5_debug_private.h" +#include "h5_va_macros.h" + +#include "h5_private.h" +#include "h5_hdf5_private.h" + +#include "h5_attribs_private.h" +#include "h5_readwrite_private.h" +#include "h5b_types_private.h" +#include "h5b_model_private.h" +h5_err_t +h5b_write_field_attrib ( + const h5_file_t fh, /*!< IN: file handle */ + const char *field_name, /*!< IN: field name */ + const char *attrib_name, /*!< IN: attribute name */ + const hid_t attrib_type, /*!< IN: attribute type */ + const void *attrib_value, /*!< IN: attribute value */ + const h5_int64_t attrib_nelem /*!< IN: number of elements */ + ) { + h5_file_p f = (h5_file_p)fh; + H5_CORE_API_ENTER (h5_err_t, + "f=%p, field_name='%s', " + "attrib_name='%s', attrib_type=%d, " + "attrib_value=%p, attrib_nelem=%lld", + f, + field_name, + attrib_name, + attrib_type, + attrib_value, + (long long)attrib_nelem); + CHECK_FILEHANDLE (f); + CHECK_WRITABLE_MODE (f); + CHECK_TIMEGROUP (f); + + TRY( h5bpriv_create_field_group(f, field_name) ); + + TRY( h5priv_write_attrib ( + f->b->field_gid, + attrib_name, + attrib_type, + attrib_value, + attrib_nelem, + 1) ); + + H5_CORE_API_RETURN (H5_SUCCESS); +} + +h5_err_t +h5b_read_field_attrib ( + const h5_file_t fh, /*!< IN: file handle */ + const char *field_name, /*!< IN: field name */ + const char *attrib_name, /*!< IN: attribute name */ + const h5_int64_t attrib_type, /*!< IN: attribute type */ + void *buffer /*!< OUT: attribute value */ + ) { + h5_file_p f = (h5_file_p)fh; + H5_CORE_API_ENTER (h5_err_t, + "f=%p, field_name='%s', " + "attrib_name='%s', attrib_type=%lld, " + "attrib_value=%p", + f, + field_name, + attrib_name, + (long long)attrib_type, + buffer); + CHECK_FILEHANDLE (f); + CHECK_TIMEGROUP (f); + + TRY( h5bpriv_open_field_group(f, field_name) ); + + TRY( h5priv_read_attrib ( + f->b->field_gid, + attrib_name, + attrib_type, + buffer) ); + + H5_CORE_API_RETURN (H5_SUCCESS); +} + +h5_ssize_t +h5b_get_num_field_attribs ( + const h5_file_t fh, /*b->field_gid)); +} + +h5_err_t +h5b_get_field_attrib_info ( + const h5_file_t fh, /*!< IN: file handle */ + const char *field_name, /*!< IN: field name */ + const h5_size_t attrib_idx, /*!< IN: attribute index */ + char *attrib_name, /*!< OUT: attribute name */ + const h5_size_t len_attrib_name, /*!< IN: buffer size */ + h5_int64_t *attrib_type, /*!< OUT: attribute type */ + h5_size_t *attrib_nelem /*!< OUT: number of elements */ + ) { + h5_file_p f = (h5_file_p)fh; + H5_CORE_API_ENTER (h5_err_t, + "f=%p, " + "field_name='%s', " + "attrib_idx=%llu, " + "attrib_name=%p, len_attrib_name=%llu, " + "attrib_type=%p, " + "attrib_nelem=%p", + f, + field_name, + (long long unsigned)attrib_idx, + attrib_name, (long long unsigned)len_attrib_name, + attrib_type, + attrib_nelem); + CHECK_FILEHANDLE (f); + CHECK_TIMEGROUP (f); + + TRY (h5bpriv_open_field_group(f, field_name)); + + H5_CORE_API_RETURN ( + h5priv_get_attrib_info ( + f->b->field_gid, + attrib_idx, + attrib_name, + len_attrib_name, + attrib_type, + attrib_nelem)); +} + +static inline h5_err_t +check_coords ( + const h5_file_p f, + int rank, + const h5_int64_t n_coords + ) { + h5b_fdata_t *b = f->b; + switch (rank) { + case 0: { + if (n_coords != b->i_max + 1) + h5_warn ("Coordinate array length (%lld) " + "does not match X dimension (%lld)", + (long long)n_coords, + (long long)b->i_max + 1); + break; + } + + case 1: + if (n_coords != b->j_max + 1) + h5_warn ("Coordinate array length (%lld) " + "does not match Y dimension (%lld)", + (long long)n_coords, + (long long)b->j_max + 1); + break; + case 2: + if (n_coords != b->k_max + 1) + h5_warn ("Coordinate array length (%lld) " + "does not match Z dimension (%lld)", + (long long)n_coords, + (long long)b->k_max + 1); + break; + default: + return h5_error_internal (); + } + return H5_SUCCESS; +} + +h5_err_t +h5b_set_3d_field_coords ( + const h5_file_t fh, + int rank, + const char* field_name, + const char* attrib_name, + const h5_float64_t* coords, + const h5_int64_t n_coords + ) { + h5_file_p f = (h5_file_p)fh; + H5_CORE_API_ENTER (h5_err_t, + "f=%p, " + "rank=%d, " + "field_name='%s', " + "attrib_name='%s', " + "coords=%p, n_coords=%llu", + f, + rank, + field_name, + attrib_name, + coords, (long long unsigned)n_coords); + CHECK_FILEHANDLE (f); + CHECK_TIMEGROUP (f); + + TRY (check_coords (f, rank, n_coords)); + TRY (h5b_write_field_attrib ( + (h5_file_t)f, + field_name, + attrib_name, + H5_FLOAT64_T, + coords, + n_coords)); + + H5_CORE_API_RETURN (H5_SUCCESS); +} + +h5_err_t +h5b_get_3d_field_coords ( + const h5_file_t fh, + int rank, + const char* const field_name, + const char* const attrib_name, + h5_float64_t* const coords, + const h5_int64_t n_coords + ) { + h5_file_p f = (h5_file_p)fh; + H5_CORE_API_ENTER (h5_err_t, + "f=%p, " + "rank=%d, " + "field_name='%s', " + "attrib_name='%s', " + "coords=%p, n_coords=%llu", + f, + rank, + field_name, + attrib_name, + coords, (long long unsigned)n_coords); + CHECK_FILEHANDLE (f); + CHECK_TIMEGROUP (f); + + TRY (check_coords (f, rank, n_coords)); + TRY (h5b_read_field_attrib ( + (h5_file_t)f, + field_name, + attrib_name, + H5_FLOAT64_T, + coords)); + + H5_CORE_API_RETURN (H5_SUCCESS); +} + + diff --git a/src/h5core/h5b_model.c b/src/h5core/h5b_model.c new file mode 100644 index 0000000..577e7e5 --- /dev/null +++ b/src/h5core/h5b_model.c @@ -0,0 +1,1021 @@ +/* + Copyright (c) 2006-2013, The Regents of the University of California, + through Lawrence Berkeley National Laboratory (subject to receipt of any + required approvals from the U.S. Dept. of Energy) and the Paul Scherrer + Institut (Switzerland). All rights reserved. + + License: see file COPYING in top level of source distribution. +*/ + +#include +#include + +#include "h5_private.h" +#include "h5_hdf5_private.h" + +#include "h5_model_private.h" +#include "h5_mpi_private.h" +#include "h5_readwrite_private.h" +#include "h5b_types_private.h" +#include "h5core/h5_syscall.h" + +#define MIN( x, y ) ( (x) <= (y) ? (x) : (y) ) +#define MAX( x, y ) ( (x) >= (y) ? (x) : (y) ) + +/*! + \note + A partition must not be part of another partition. + + A partition must not divide another partition into two pieces. + + After handling the ghost zones, the partition must not be empty + + We must track the overall size somewhere. This is a good place to do it. (?) + */ +h5_err_t +h5b_has_field_data ( + const h5_file_t fh + ) { + h5_file_p f = (h5_file_p)fh; + H5_CORE_API_ENTER (h5_err_t, "f=%p", f); + CHECK_FILEHANDLE (f); + h5_err_t exists; + h5_err_t result = H5_NOK; + TRY (exists = hdf5_link_exists (f->step_gid, H5BLOCK_GROUPNAME_BLOCK)); + if (exists) + result = H5_SUCCESS; + H5_CORE_API_RETURN (result); +} + +static void +_normalize_partition ( + h5b_partition_t *const p /*!< IN/OUT: partition */ + ) { + h5_size_t tmp; + + p->i_start = MAX(0, p->i_start); + p->j_start = MAX(0, p->j_start); + p->k_start = MAX(0, p->k_start); + + if ( p->i_start > p->i_end ) { + tmp = p->i_start; + p->i_start = p->i_end; + p->i_end = tmp; + } + if ( p->j_start > p->j_end ) { + tmp = p->j_start; + p->j_start = p->j_end; + p->j_end = tmp; + } + if ( p->k_start > p->k_end ) { + tmp = p->k_start; + p->k_start = p->k_end; + p->k_end = tmp; + } +} + +#ifdef PARALLEL_IO +/* MLH: this could be improved with an MPI_Reduce and MAX operator... + * but the user_layout array-of-structs would need to be a struct-of-arrays */ +static void +_get_max_dimensions ( + const h5_file_p f, + h5b_partition_t *const user_layout + ) { + int proc; + h5b_fdata_t *b = f->b; + h5b_partition_t *p = user_layout; + + b->i_max = 0; + b->j_max = 0; + b->k_max = 0; + + for ( proc = 0; proc < f->nprocs; proc++, p++ ) { + if ( p->i_end > b->i_max ) b->i_max = p->i_end; + if ( p->j_end > b->j_max ) b->j_max = p->j_end; + if ( p->k_end > b->k_max ) b->k_max = p->k_end; + } +} + +#define _NO_GHOSTZONE(p,q) ( (p->i_end < q->i_start) \ + || (p->j_end < q->j_start) \ + || (p->k_end < q->k_start) ) + + + +/*! + \ingroup h5block_private + + \internal + + Check whether two partitions have a common ghost-zone. + + \return value != \c 0 if yes otherwise \c 0 + */ +static inline int +have_ghostzone ( + const h5b_partition_t *const p, /*!< IN: partition \c p */ + const h5b_partition_t *const q /*!< IN: partition \c q */ + ) { + return ( !( _NO_GHOSTZONE ( p, q ) || _NO_GHOSTZONE ( q, p ) ) ); +} + +/*! + \ingroup h5block_private + + \internal + + Calculate volume of partition. + + \return volume + */ +static inline h5_int64_t +volume_of_partition ( + const h5b_partition_t *const p /*!< IN: partition */ + ) { + return (p->i_end - p->i_start) + * (p->j_end - p->j_start) + * (p->k_end - p->k_start); + +} + +/*! + \ingroup h5block_private + + \internal + + Calc volume of ghost-zone. + + \return volume + */ +static inline h5_int64_t +volume_of_ghostzone ( + const h5b_partition_t *const p, /*!< IN: ptr to first partition */ + const h5b_partition_t *const q /*!< IN: ptr to second partition */ + ) { + + h5_int64_t dx = MIN ( p->i_end, q->i_end ) + - MAX ( p->i_start, q->i_start ) + 1; + h5_int64_t dy = MIN ( p->j_end, q->j_end ) + - MAX ( p->j_start, q->j_start ) + 1; + h5_int64_t dz = MIN ( p->k_end, q->k_end ) + - MAX ( p->k_start, q->k_start ) + 1; + + return dx * dy * dz; +} + +/*! + \ingroup h5block_private + + \internal + + Dissolve ghost-zone by moving the X coordinates. Nothing will be changed + if \c { p->i_start <= q->i_end <= p->i_end }. In this case \c -1 will be + returned. + + \return H5_SUCCESS or -1 + */ +static h5_int64_t +_dissolve_X_ghostzone ( + h5b_partition_t *const p, /*!< IN/OUT: ptr to first partition */ + h5b_partition_t *const q /*!< IN/OUT: ptr to second partition */ + ) { + + if ( p->i_start > q->i_start ) + return _dissolve_X_ghostzone( q, p ); + + if ( q->i_end <= p->i_end ) /* no dissolving */ + return -1; + + p->i_end = ( p->i_end + q->i_start ) >> 1; + q->i_start = p->i_end + 1; + return 0; +} + +/*! + \ingroup h5block_private + + \internal + + Dissolve ghost-zone by moving the Y coordinates. Nothing will be changed + if \c { p->j_start <= q->j_end <= p->j_end }. In this case \c -1 will be + returned. + + \return H5_SUCCESS or -1 + */ +static h5_int64_t +_dissolve_Y_ghostzone ( + h5b_partition_t *const p, /*!< IN/OUT: ptr to first partition */ + h5b_partition_t *const q /*!< IN/OUT: ptr to second partition */ + ) { + + if ( p->j_start > q->j_start ) + return _dissolve_Y_ghostzone( q, p ); + + if ( q->j_end <= p->j_end ) /* no dissolving */ + return -1; + + p->j_end = ( p->j_end + q->j_start ) >> 1; + q->j_start = p->j_end + 1; + return 0; +} + +/*! + \ingroup h5block_private + + \internal + + Dissolve ghost-zone by moving the Z coordinates. Nothing will be changed + if \c { p->k_start <= q->k_end <= p->k_end }. In this case \c -1 will be + returned. + + \return H5_SUCCESS or -1 + */ +static h5_int64_t +_dissolve_Z_ghostzone ( + h5b_partition_t *const p, /*!< IN/OUT: ptr to first partition */ + h5b_partition_t *const q /*!< IN/OUT: ptr to second partition */ + ) { + + if ( p->k_start > q->k_start ) + return _dissolve_Z_ghostzone( q, p ); + + if ( q->k_end <= p->k_end ) /* no dissolving */ + return -1; + + p->k_end = ( p->k_end + q->k_start ) >> 1; + q->k_start = p->k_end + 1; + return 0; +} + +/*! + \ingroup h5block_private + + \internal + + Dissolve ghost-zone for partitions \p and \q. + + Dissolving is done by moving either the X, Y or Z plane. We never move + more than one plane per partition. Thus we always have three possibilities + to dissolve the ghost-zone. The "best" is the one with the largest + remaining volume of the partitions. + + \return H5_SUCCESS or error code. + */ +static h5_err_t +_dissolve_ghostzone ( + h5b_partition_t *const p, /*!< IN/OUT: ptr to first partition */ + h5b_partition_t *const q /*!< IN/OUT: ptr to second partition */ + ) { + h5b_partition_t p_; + h5b_partition_t q_; + h5b_partition_t p_best; + h5b_partition_t q_best; + h5_int64_t vol; + h5_int64_t max_vol = 0; + + p_ = *p; + q_ = *q; + if ( _dissolve_X_ghostzone ( &p_, &q_ ) == 0 ) { + vol = volume_of_partition ( &p_ ) + + volume_of_partition ( &q_ ); + if ( vol > max_vol ) { + max_vol = vol; + p_best = p_; + q_best = q_; + } + } + + p_ = *p; + q_ = *q; + if ( _dissolve_Y_ghostzone ( &p_, &q_ ) == 0 ) { + vol = volume_of_partition ( &p_ ) + + volume_of_partition ( &q_ ); + if ( vol > max_vol ) { + max_vol = vol; + p_best = p_; + q_best = q_; + } + } + p_ = *p; + q_ = *q; + + if ( _dissolve_Z_ghostzone ( &p_, &q_ ) == 0 ) { + vol = volume_of_partition ( &p_ ) + + volume_of_partition ( &q_ ); + if ( vol > max_vol ) { + max_vol = vol; + p_best = p_; + q_best = q_; + } + } + if ( max_vol <= 0 ) { + return h5_error ( + H5_ERR_VIEW, + "Cannot dissolve ghostzones in specified layout!" ); + } + *p = p_best; + *q = q_best; + + return H5_SUCCESS; +} + +/*! + \ingroup h5block_private + + \internal + + Dissolve all ghost-zones. + + Ghost-zone are dissolved in the order of their magnitude, largest first. + + \note + Dissolving ghost-zones automaticaly is not trivial! The implemented + algorithmn garanties, that there are no ghost-zones left and that we + have the same result on all processors. + But there may be zones which are not assigned to a partition any more. + May be we should check this and return an error in this case. Then + the user have to decide to continue or to abort. + + \b {Error Codes} + \b H5PART_NOMEM_ERR + + \return H5_SUCCESS or error code. + */ +static inline h5_err_t +_dissolve_ghostzones ( + const h5_file_p f, + const h5b_partition_t *const user_layout, + h5b_partition_t *const write_layout + ) { + H5_PRIV_FUNC_ENTER (h5_err_t, + "f=%p, user_layout=%p, write_layout=%p", + f, user_layout, write_layout); + h5b_partition_t *p; + h5b_partition_t *q; + int proc_p, proc_q; + + struct list { + struct list *prev; + struct list *next; + h5b_partition_t *p; + h5b_partition_t *q; + h5_int64_t vol; + } *p_begin, *p_el, *p_max, *p_end, *p_save; + + memcpy( write_layout, user_layout, f->nprocs*sizeof(h5b_partition_t) ); + + TRY( p_begin = (struct list*)h5_calloc (1, sizeof(*p_begin)) ); + p_max = p_end = p_begin; + + memset( p_begin, 0, sizeof ( *p_begin ) ); + + for ( proc_p = 0, p = write_layout; + proc_p < f->nprocs-1; + proc_p++, p++ ) { + for ( proc_q = proc_p+1, q = &write_layout[proc_q]; + proc_q < f->nprocs; + proc_q++, q++ ) { + + if ( have_ghostzone ( p, q ) ) { + TRY( p_el = (struct list*)h5_calloc (1, sizeof(*p_el)) ); + + p_el->p = p; + p_el->q = q; + p_el->vol = volume_of_ghostzone ( p, q ); + p_el->prev = p_end; + p_el->next = NULL; + + if ( p_el->vol > p_max->vol ) + p_max = p_el; + + p_end->next = p_el; + p_end = p_el; + } + } + } + while ( p_begin->next ) { + if ( p_max->next ) p_max->next->prev = p_max->prev; + p_max->prev->next = p_max->next; + + _dissolve_ghostzone (p_max->p, p_max->q); + + h5_free (p_max); + p_el = p_max = p_begin->next; + + while ( p_el ) { + if ( have_ghostzone ( p_el->p, p_el->q ) ) { + p_el->vol = volume_of_ghostzone ( p_el->p, p_el->q ); + if ( p_el->vol > p_max->vol ) + p_max = p_el; + p_el = p_el->next; + } else { + if ( p_el->next ) + p_el->next->prev = p_el->prev; + p_el->prev->next = p_el->next; + p_save = p_el->next; + h5_free (p_el); + p_el = p_save; + } + } + + } + h5_free (p_begin); + H5_PRIV_FUNC_RETURN (H5_SUCCESS); +} +#endif + +h5_err_t +h5bpriv_release_hyperslab ( + const h5_file_p f /*!< IN: file handle */ + ) { + H5_PRIV_API_ENTER (h5_err_t, "f=%p", f); + if (f->b->shape > 0) { + TRY (hdf5_close_dataspace (f->b->shape)); + f->b->shape = -1; + } + if (f->b->diskshape > 0) { + TRY (hdf5_close_dataspace(f->b->diskshape)); + f->b->diskshape = -1; + } + if (f->b->memshape > 0) { + TRY (hdf5_close_dataspace(f->b->memshape)); + f->b->memshape = -1; + } + H5_PRIV_API_RETURN (H5_SUCCESS); +} + +h5_err_t +h5bpriv_open_block_group ( + const h5_file_p f /*!< IN: file handle */ + ) { + H5_PRIV_API_ENTER (h5_err_t, "f=%p", f); + h5b_fdata_t *b = f->b; + + TRY (hdf5_close_group (b->block_gid)); + b->block_gid = hdf5_open_group (f->step_gid, H5BLOCK_GROUPNAME_BLOCK); + if (f->b->block_gid < 0) + H5_PRIV_API_LEAVE (h5_error( + H5_ERR_INVAL, + "Time step does not contain H5Block data!")); + + H5_PRIV_API_RETURN (H5_SUCCESS); +} + +static h5_err_t +_create_block_group ( + const h5_file_p f /*!< IN: file handle */ + ) { + H5_PRIV_FUNC_ENTER (h5_err_t, "f=%p", f); + h5_err_t exists; + TRY (exists = hdf5_link_exists (f->step_gid, H5BLOCK_GROUPNAME_BLOCK)); + + if (exists > 0) { + TRY (h5bpriv_open_block_group(f)); + } else { + TRY (hdf5_close_group(f->b->block_gid) ); + TRY (f->b->block_gid = hdf5_create_group( + f->step_gid, H5BLOCK_GROUPNAME_BLOCK) ); + } + H5_PRIV_FUNC_RETURN (H5_SUCCESS); +} + +h5_err_t +h5bpriv_have_field_group ( + const h5_file_p f, /*!< IN: file handle */ + const char *name + ) { + H5_PRIV_API_ENTER (h5_err_t, "f=%p, name='%s'", f, name); + char name2[H5_DATANAME_LEN]; + h5priv_normalize_dataset_name (name, name2); + + TRY( h5bpriv_open_block_group(f) ); + H5_PRIV_API_RETURN (hdf5_link_exists(f->b->block_gid, name2)); +} + +h5_err_t +h5bpriv_open_field_group ( + const h5_file_p f, /*!< IN: file handle */ + const char *name + ) { + H5_PRIV_API_ENTER (h5_err_t, "f=%p, name='%s'", f, name); + char name2[H5_DATANAME_LEN]; + h5priv_normalize_dataset_name (name, name2); + + TRY (hdf5_close_group (f->b->field_gid)); + TRY (h5bpriv_open_block_group (f)); + f->b->field_gid = hdf5_open_group (f->b->block_gid, name2); + if (f->b->field_gid < 0) + return h5_error( + H5_ERR_INVAL, + "Field '%s' does not exist!", name2); + + H5_PRIV_API_RETURN (H5_SUCCESS); +} + +h5_err_t +h5bpriv_create_field_group ( + const h5_file_p f, /*!< IN: file handle */ + const char *name /*!< IN: name of field group to create */ + ) { + H5_PRIV_API_ENTER (h5_err_t, "f=%p, name='%s'", f, name); + h5b_fdata_t *b = f->b; + + TRY( _create_block_group(f) ); + + char name2[H5_DATANAME_LEN]; + h5priv_normalize_dataset_name (name, name2); + + h5_err_t exists; + TRY (exists = hdf5_link_exists ( b->block_gid, name2)); + + if (exists > 0) { + TRY (h5bpriv_open_field_group (f, name2)); + } else { + TRY (hdf5_close_group (f->b->field_gid) ); + TRY (b->field_gid = hdf5_create_group (b->block_gid, name2)); + } + + H5_CORE_API_RETURN (H5_SUCCESS); +} + +h5_int64_t +h5b_3d_has_view ( + const h5_file_t fh /*!< IN: File handle */ + ) { + return ((h5_file_p)fh)->b->have_layout; +} + +h5_err_t +h5b_3d_set_view ( + const h5_file_t fh, /*!< IN: File handle */ + const h5_size_t i_start, /*!< IN: start index of \c i */ + const h5_size_t i_end, /*!< IN: end index of \c i */ + const h5_size_t j_start, /*!< IN: start index of \c j */ + const h5_size_t j_end, /*!< IN: end index of \c j */ + const h5_size_t k_start, /*!< IN: start index of \c k */ + const h5_size_t k_end /*!< IN: end index of \c k */ + ) { + h5_file_p f = (h5_file_p)fh; + h5b_fdata_t *b = f->b; + H5_CORE_API_ENTER (h5_err_t, + "f=%p, " + "i_start=%llu, i_end=%llu, " + "j_start=%llu, j_end=%llu, " + "k_start=%llu, k_end=%llu", + f, + (long long unsigned)i_start, (long long unsigned)i_end, + (long long unsigned)j_start, (long long unsigned)j_end, + (long long unsigned)k_start, (long long unsigned)k_end); + b->user_layout[0].i_start = i_start; + b->user_layout[0].i_end = i_end; + b->user_layout[0].j_start = j_start; + b->user_layout[0].j_end = j_end; + b->user_layout[0].k_start = k_start; + b->user_layout[0].k_end = k_end; + _normalize_partition(&b->user_layout[0]); + +#ifdef PARALLEL_IO + h5b_partition_t *user_layout; + h5b_partition_t *write_layout; + + TRY (user_layout = h5_calloc (f->nprocs, sizeof (*user_layout))); + TRY (write_layout = h5_calloc (f->nprocs, sizeof (*write_layout))); + + user_layout[f->myproc] = b->user_layout[0]; + + TRY (h5priv_mpi_allgather( + MPI_IN_PLACE, 0, MPI_DATATYPE_NULL, + user_layout, 1, f->b->partition_mpi_t, f->props->comm)); + + _get_max_dimensions(f, user_layout); + + TRY (_dissolve_ghostzones (f, user_layout, write_layout)); + b->user_layout[0] = user_layout[f->myproc]; + b->write_layout[0] = write_layout[f->myproc]; + b->have_layout = 1; + + h5_debug ( + "User layout: %lld:%lld, %lld:%lld, %lld:%lld", + (long long)b->user_layout[0].i_start, + (long long)b->user_layout[0].i_end, + (long long)b->user_layout[0].j_start, + (long long)b->user_layout[0].j_end, + (long long)b->user_layout[0].k_start, + (long long)b->user_layout[0].k_end ); + + h5_debug ( + "Ghost-zone layout: %lld:%lld, %lld:%lld, %lld:%lld", + (long long)b->write_layout[0].i_start, + (long long)b->write_layout[0].i_end, + (long long)b->write_layout[0].j_start, + (long long)b->write_layout[0].j_end, + (long long)b->write_layout[0].k_start, + (long long)b->write_layout[0].k_end ); + + h5_free(user_layout); + h5_free(write_layout); + + TRY( h5bpriv_release_hyperslab(f) ); +#endif + + H5_CORE_API_RETURN (H5_SUCCESS); +} + +h5_err_t +h5b_3d_get_view ( + const h5_file_t fh, /*!< IN: File handle */ + h5_size_t *const i_start, /*!< OUT: start index of \c i */ + h5_size_t *const i_end, /*!< OUT: end index of \c i */ + h5_size_t *const j_start, /*!< OUT: start index of \c j */ + h5_size_t *const j_end, /*!< OUT: end index of \c j */ + h5_size_t *const k_start, /*!< OUT: start index of \c k */ + h5_size_t *const k_end /*!< OUT: end index of \c k */ + ) { + h5_file_p f = (h5_file_p)fh; + H5_CORE_API_ENTER (h5_err_t, + "f=%p, " + "i_start=%p, i_end=%p, " + "j_start=%p, j_end=%p, " + "k_start=%p, k_end=%p", + f, + i_start, i_end, + j_start, j_end, + k_start, k_end); + h5b_partition_t *p = f->b->user_layout; + + *i_start = p->i_start; + *i_end = p->i_end; + *j_start = p->j_start; + *j_end = p->j_end; + *k_start = p->k_start; + *k_end = p->k_end; + + H5_CORE_API_RETURN (H5_SUCCESS); +} + +h5_err_t +h5b_3d_get_reduced_view ( + const h5_file_t fh, /*!< IN: File handle */ + h5_size_t *const i_start, /*!< OUT: start index of \c i */ + h5_size_t *const i_end, /*!< OUT: end index of \c i */ + h5_size_t *const j_start, /*!< OUT: start index of \c j */ + h5_size_t *const j_end, /*!< OUT: end index of \c j */ + h5_size_t *const k_start, /*!< OUT: start index of \c k */ + h5_size_t *const k_end /*!< OUT: end index of \c k */ + ) { + h5_file_p f = (h5_file_p)fh; + H5_CORE_API_ENTER (h5_err_t, + "f=%p, " + "i_start=%p, i_end=%p, " + "j_start=%p, j_end=%p, " + "k_start=%p, k_end=%p", + f, + i_start, i_end, + j_start, j_end, + k_start, k_end); + h5b_partition_t *p = f->b->write_layout; + + *i_start = p->i_start; + *i_end = p->i_end; + *j_start = p->j_start; + *j_end = p->j_end; + *k_start = p->k_start; + *k_end = p->k_end; + + H5_CORE_API_RETURN (H5_SUCCESS); +} + +h5_err_t +h5b_3d_set_chunk ( + const h5_file_t fh, /*!< IN: File handle */ + const h5_size_t i, /*!< IN: size of \c i */ + const h5_size_t j, /*!< IN: size of \c j */ + const h5_size_t k /*!< IN: size of \c k */ + ) { + h5_file_p f = (h5_file_p)fh; + H5_CORE_API_ENTER (h5_err_t, + "f=%p, i=%llu, j=%llu, k=%llu", + f, + (long long unsigned)i, + (long long unsigned)j, + (long long unsigned)k); + if ( i == 0 || j == 0 || k == 0 ) + { + h5_info ("Disabling chunking" ); + TRY (hdf5_set_layout_property(f->b->dcreate_prop, H5D_CONTIGUOUS)); + } else + { + h5_info ("Setting chunk to (%lld,%lld,%lld)", + (long long)i, (long long)j, (long long)k); + hsize_t dims[3] = { k, j, i }; + TRY (hdf5_set_chunk_property (f->b->dcreate_prop, 1, dims)); + } + + H5_CORE_API_RETURN (H5_SUCCESS); +} + +h5_err_t +h5b_3d_get_chunk ( + const h5_file_t fh, /*!< IN: File handle */ + const char *field_name, /*!< IN: name of dataset */ + h5_size_t *const i, /*!< OUT: size of \c i */ + h5_size_t *const j, /*!< OUT: size of \c j */ + h5_size_t *const k /*!< OUT: size of \c k */ + ) { + h5_file_p f = (h5_file_p)fh; + H5_CORE_API_ENTER (h5_err_t, + "f=%p, i=%p, j=%p, k=%p", + f, i, j, k); + CHECK_TIMEGROUP ( f ); + + h5b_fdata_t *b = f->b; + + TRY( h5bpriv_open_field_group ( f, field_name ) ); + + hid_t dataset_id; + hid_t plist_id; + hsize_t hdims[3]; + + TRY (dataset_id = hdf5_open_dataset (b->field_gid, H5_BLOCKNAME_X)); + TRY (plist_id = hdf5_get_dataset_create_plist (dataset_id)); + TRY (hdf5_get_chunk_property (plist_id, 3, hdims)); + TRY (hdf5_close_property (plist_id)); + TRY (hdf5_close_dataset (dataset_id)); + + *i = hdims[2]; + *j = hdims[1]; + *k = hdims[0]; + + h5_info("Found chunk dimensions (%lld,%lld,%lld)", + (long long)hdims[0], + (long long)hdims[1], + (long long)hdims[2] ); + + H5_CORE_API_RETURN (H5_SUCCESS); +} + +#ifdef PARALLEL_IO +h5_err_t +h5b_3d_set_grid ( + const h5_file_t fh, /*!< IN: File handle */ + const h5_size_t i, /*!< IN: dimension in \c i */ + const h5_size_t j, /*!< IN: dimension in \c j */ + const h5_size_t k /*!< IN: dimension in \c k */ + ) { + h5_file_p f = (h5_file_p)fh; + H5_CORE_API_ENTER (h5_err_t, + "f=%p, i=%llu, j=%llu, k=%llu", + f, + (long long unsigned)i, + (long long unsigned)j, + (long long unsigned)k); + if (i*j*k != f->nprocs) { + H5_CORE_API_LEAVE ( + h5_error(H5_ERR_INVAL, + "Grid dimensions (%lld,%lld,%lld) do not multiply " + "out to %d MPI processors!", + (long long)i, + (long long)j, + (long long)k, + f->nprocs)); + } + + f->b->k_grid = i; + f->b->j_grid = j; + f->b->i_grid = k; + + int dims[3] = { k, j, i }; + int period[3] = { 0, 0, 0 }; + TRY( h5priv_mpi_cart_create( + f->props->comm, 3, dims, period, 0, &f->b->cart_comm) ); + + f->b->have_grid = 1; + + H5_CORE_API_RETURN (H5_SUCCESS); +} + +h5_err_t +h5b_3d_get_grid_coords ( + const h5_file_t fh, /*!< IN: File handle */ + const int proc, /*!< IN: MPI processor */ + h5_int64_t *i, /*!< OUT: index in \c i */ + h5_int64_t *j, /*!< OUT: index in \c j */ + h5_int64_t *k /*!< OUT: index in \c k */ + ) { + h5_file_p f = (h5_file_p)fh; + H5_CORE_API_ENTER (h5_err_t, + "f=%p, proc=%d, i=%p, j=%p, k=%p", + f, proc, i, j, k); + if ( !f->b->have_grid ) + H5_CORE_API_LEAVE ( + h5_error(H5_ERR_INVAL, + "Grid dimensions have not been set!")); + + int coords[3]; + TRY( h5priv_mpi_cart_coords(f->b->cart_comm, proc, 3, coords) ); + *k = coords[0]; + *j = coords[1]; + *i = coords[2]; + H5_CORE_API_RETURN (H5_SUCCESS); +} + +h5_err_t +h5b_3d_set_dims ( + const h5_file_t fh, /*!< IN: File handle */ + const h5_size_t i, /*!< IN: dimension in \c i */ + const h5_size_t j, /*!< IN: dimension in \c j */ + const h5_size_t k /*!< IN: dimension in \c k */ + ) { + h5_file_p f = (h5_file_p)fh; + H5_CORE_API_ENTER (h5_err_t, + "f=%p, i=%llu, j=%llu, k=%llu", + f, + (long long unsigned)i, + (long long unsigned)j, + (long long unsigned)k); + if ( !f->b->have_grid ) + H5_CORE_API_LEAVE ( + h5_error(H5_ERR_INVAL, + "Grid dimensions have not been set!")); + + h5_size_t dims[3] = { k, j, i }; + h5_size_t check_dims[3] = { k, j, i }; + + TRY( h5priv_mpi_bcast( + check_dims, 3, MPI_LONG_LONG, 0, f->props->comm) ); + + if ( dims[0] != check_dims[0] || + dims[1] != check_dims[1] || + dims[2] != check_dims[2] + ) { + H5_CORE_API_LEAVE ( + h5_error(H5_ERR_INVAL, + "[%d] Block dimensions do not agree: " + "(%lld,%lld,%lld) != (%lld,%lld,%lld)!", + f->myproc, + (long long)dims[0], + (long long)dims[1], + (long long)dims[2], + (long long)check_dims[0], + (long long)check_dims[1], + (long long)check_dims[2])); + } + h5_int64_t coords[3]; + TRY( h5b_3d_get_grid_coords((h5_file_t)f, + f->myproc, coords+0, coords+1, coords+2) ); + + h5b_fdata_t *b = f->b; + + b->user_layout->i_start = coords[2]*dims[2]; + b->user_layout->i_end = (coords[2]+1)*dims[2] - 1; + b->user_layout->j_start = coords[1]*dims[1]; + b->user_layout->j_end = (coords[1]+1)*dims[1] - 1; + b->user_layout->k_start = coords[0]*dims[0]; + b->user_layout->k_end = (coords[0]+1)*dims[0] - 1; + + b->write_layout[0] = b->user_layout[0]; + + b->i_max = b->i_grid * dims[2] - 1; + b->j_max = b->j_grid * dims[1] - 1; + b->k_max = b->k_grid * dims[0] - 1; + + b->have_layout = 1; + + H5_CORE_API_RETURN (H5_SUCCESS); +} +#endif + +h5_err_t +h5b_3d_set_halo ( + const h5_file_t fh, /*!< IN: File handle */ + const h5_size_t i, /*!< IN: radius in \c i */ + const h5_size_t j, /*!< IN: radius in \c j */ + const h5_size_t k /*!< IN: radius in \c k */ + ) { + h5_file_p f = (h5_file_p)fh; + H5_CORE_API_ENTER (h5_err_t, + "f=%p, i=%llu, j=%llu, k=%llu", + f, + (long long unsigned)i, + (long long unsigned)j, + (long long unsigned)k); + + if ( !f->b->have_grid ) { + H5_CORE_API_LEAVE ( + h5_error(H5_ERR_INVAL, + "Grid dimensions have not been set!")); + } else if ( !f->b->have_layout ) { + H5_CORE_API_LEAVE ( + h5_error(H5_ERR_INVAL, + "Block dimensions for grid have not been set!")); + } + h5b_fdata_t *b = f->b; + + b->user_layout->i_start -= i; + b->user_layout->i_end += i; + b->user_layout->j_start -= j; + b->user_layout->j_end += j; + b->user_layout->k_start -= k; + b->user_layout->k_end += k; + + H5_CORE_API_RETURN (H5_SUCCESS); +} + +h5_ssize_t +h5b_get_num_fields ( + const h5_file_t fh /*!< IN: File handle */ + ) { + h5_file_p f = (h5_file_p)fh; + H5_CORE_API_ENTER (h5_ssize_t, "f=%p", f); + CHECK_TIMEGROUP( f ); + + TRY (h5bpriv_open_block_group(f)); + H5_CORE_API_RETURN (hdf5_get_num_objs_in_group (f->b->block_gid)); +} + +h5_err_t +h5b_get_field_info_by_name ( + const h5_file_t fh, /*!< IN: file handle */ + const char *name, /*!< OUT: field name */ + h5_size_t *field_rank, /*!< OUT: field rank */ + h5_size_t *field_dims, /*!< OUT: field dimensions */ + h5_size_t *elem_rank, /*!< OUT: element rank */ + h5_int64_t *type /*!< OUT: datatype */ + ) { + h5_file_p f = (h5_file_p)fh; + H5_CORE_API_ENTER (h5_err_t, + "f=%p, name='%s', " + "field_rank=%p, field_dims=%p, elem_rank=%p, type=%p", + f, name, field_rank, field_dims, elem_rank, type); + CHECK_TIMEGROUP( f ); + + hsize_t dims[16]; /* give it plenty of space even though we don't expect rank > 3 */ + hsize_t _field_rank, _elem_rank; + h5_size_t i, j; + + TRY( h5bpriv_open_field_group(f, name) ); + + hid_t dataset_id; + hid_t dataspace_id; + + TRY (dataset_id = hdf5_open_dataset (f->b->field_gid, H5_BLOCKNAME_X)); + TRY (dataspace_id = hdf5_get_dataset_space (dataset_id) ); + + TRY (_field_rank = hdf5_get_dims_of_dataspace (dataspace_id, dims, NULL)); + if (field_rank) *field_rank = (h5_size_t) _field_rank; + + if (field_dims) { + for ( i = 0, j = _field_rank-1; i < _field_rank; i++, j-- ) + field_dims[i] = (h5_size_t)dims[j]; + } + + TRY (_elem_rank = hdf5_get_num_objs_in_group (f->b->field_gid)); + if (elem_rank) *elem_rank = (h5_size_t) _elem_rank; + + hid_t h5type; + TRY (h5type = hdf5_get_dataset_type (dataset_id)); + + if ( type ) + TRY( *type = h5priv_normalize_h5_type(h5type) ); + + TRY (hdf5_close_dataspace (dataspace_id)); + TRY (hdf5_close_dataset (dataset_id)); + + H5_CORE_API_RETURN (H5_SUCCESS); +} + +h5_err_t +h5b_get_field_info ( + const h5_file_t fh, /*!< IN: file handle */ + const h5_size_t idx, /*!< IN: index of field */ + char *name, /*!< OUT: field name */ + const h5_size_t len_name, /*!< IN: buffer size */ + h5_size_t *field_rank, /*!< OUT: field rank */ + h5_size_t *field_dims, /*!< OUT: field dimensions */ + h5_size_t *elem_rank, /*!< OUT: element rank */ + h5_int64_t *type /*!< OUT: datatype */ + ) { + h5_file_p f = (h5_file_p)fh; + H5_CORE_API_ENTER (h5_err_t, + "f=%p, idx=%llu, " + "name=%p, len_name=%llu, " + "field_rank=%p, field_dims=%p, elem_rank=%p, type=%p", + f, + (long long unsigned)idx, + name, (long long unsigned)len_name, + field_rank, field_dims, elem_rank, type); + CHECK_TIMEGROUP( f ); + + TRY (h5bpriv_open_block_group(f)); + TRY (hdf5_get_objname_by_idx( + f->b->block_gid, + (hsize_t)idx, + name, + (size_t)len_name) ); + + H5_CORE_API_RETURN (h5b_get_field_info_by_name ( + (h5_file_t)f, + name, field_rank, field_dims, elem_rank, type)); +} + diff --git a/src/h5core/h5b_model_private.h b/src/h5core/h5b_model_private.h new file mode 100644 index 0000000..c115365 --- /dev/null +++ b/src/h5core/h5b_model_private.h @@ -0,0 +1,48 @@ +/* + Copyright (c) 2006-2013, The Regents of the University of California, + through Lawrence Berkeley National Laboratory (subject to receipt of any + required approvals from the U.S. Dept. of Energy) and the Paul Scherrer + Institut (Switzerland). All rights reserved. + + License: see file COPYING in top level of source distribution. +*/ + +#ifndef __H5B_MODEL_PRIVATE_H +#define __H5B_MODEL_PRIVATE_H + +#include "h5core/h5_types.h" + +#define CHECK_LAYOUT(f) \ + TRY (f->b->have_layout ? H5_SUCCESS : h5_error ( \ + H5_ERR_VIEW, \ + "No view has been defined!")); + +h5_err_t +h5bpriv_have_field_group ( + const h5_file_p f, /*!< IN: file handle */ + const char *name + ); + +h5_err_t +h5bpriv_open_field_group ( + const h5_file_p f, /*!< IN: file handle */ + const char *name + ); + +h5_err_t +h5bpriv_create_field_group ( + const h5_file_p f, /*!< IN: file handle */ + const char *name /*!< IN: name of field group to create */ + ); + +h5_err_t +h5bpriv_open_block_group ( + const h5_file_p f /*!< IN: file handle */ + ); + +h5_err_t +h5bpriv_release_hyperslab ( + const h5_file_p f /*!< IN: file handle */ + ); + +#endif diff --git a/src/h5core/h5b_readwrite.c b/src/h5core/h5b_readwrite.c new file mode 100644 index 0000000..66299a0 --- /dev/null +++ b/src/h5core/h5b_readwrite.c @@ -0,0 +1,458 @@ +/* + Copyright (c) 2006-2012, The Regents of the University of California, + through Lawrence Berkeley National Laboratory (subject to receipt of any + required approvals from the U.S. Dept. of Energy) and the Paul Scherrer + Institut (Switzerland). All rights reserved. + + License: see file COPYING in top level of source distribution. +*/ + +#include "h5_types_private.h" +#include "h5_hdf5_private.h" + +#include "h5_model_private.h" +#include "h5_mpi_private.h" +#include "h5_readwrite_private.h" +#include "h5b_types_private.h" +#include "h5b_model_private.h" + +#include "h5core/h5_syscall.h" + +/*! + \ingroup h5_private + + \internal + + Initialize H5Block internal structure. + + TODO: Move to file "h5b_openclose.c" + + \return H5_SUCCESS or error code +*/ +h5_err_t +h5bpriv_open_file ( + const h5_file_p f /*!< IN: file handle */ + ) { + H5_PRIV_API_ENTER (h5_err_t, "f=%p", f); + h5b_fdata_t* b; + + if (f->b) + H5_PRIV_API_LEAVE (H5_SUCCESS); + + TRY (f->b = (h5b_fdata_t*)h5_calloc (1, sizeof (*f->b))); + + b = f->b; + memset (b, 0, sizeof (*b)); + +#if defined(PARALLEL_IO) + size_t n = sizeof (struct h5b_partition) / sizeof (h5_int64_t); + TRY (h5priv_mpi_type_contiguous(n, MPI_LONG_LONG, &b->partition_mpi_t)); +#endif + memset (b->user_layout, 0, sizeof(*b->user_layout)); + memset (b->write_layout, 0, sizeof(*b->write_layout)); + + b->shape = -1; + b->diskshape = -1; + b->memshape = -1; + b->block_gid = -1; + b->field_gid = -1; + b->have_layout = 0; + + TRY (b->dcreate_prop = hdf5_create_property (H5P_DATASET_CREATE)); + + H5_PRIV_API_RETURN (H5_SUCCESS); +} + +/*! + \ingroup h5block_private + + \internal + + De-initialize H5Block internal structure. Open HDF5 objects are + closed and allocated memory freed. + + \return H5_SUCCESS or error code +*/ +h5_err_t +h5bpriv_close_file ( + const h5_file_p f /*!< IN: file handle */ + ) { + H5_PRIV_API_ENTER (h5_err_t, "f=%p", f); + struct h5b_fdata* b = f->b; + TRY (hdf5_close_group (b->block_gid)); + TRY (hdf5_close_group (b->field_gid)); + TRY (hdf5_close_dataspace (b->shape)); + TRY (hdf5_close_dataspace (b->diskshape)); + TRY (hdf5_close_dataspace (b->memshape)); + TRY (hdf5_close_property (b->dcreate_prop)); +#if defined(PARALLEL_IO) + TRY (h5priv_mpi_type_free (&b->partition_mpi_t)); +#endif + TRY (h5_free (f->b)); + f->b = NULL; + + H5_PRIV_API_RETURN (H5_SUCCESS); +} + +static h5_err_t +_select_hyperslab_for_writing ( + const h5_file_p f /*!< IN: file handle */ + ) { + H5_PRIV_FUNC_ENTER (h5_err_t, "f=%p", f); + /* + re-use existing hyperslab + */ + if ( f->b->shape >= 0 ) return H5_SUCCESS; + + h5b_fdata_t *b = f->b; + h5b_partition_t *p = b->write_layout; + h5b_partition_t *q = b->user_layout; + + int rank = 3; + + hsize_t field_dims[3] = { + b->k_max+1, + b->j_max+1, + b->i_max+1 + }; + + hsize_t start[3] = { + p->k_start, + p->j_start, + p->i_start + }; + hsize_t stride[3] = { 1, 1, 1 }; + hsize_t part_dims[3] = { + p->k_end - p->k_start + 1, + p->j_end - p->j_start + 1, + p->i_end - p->i_start + 1 + }; + + + TRY (b->shape = hdf5_create_dataspace(rank, field_dims, NULL)); + TRY (b->diskshape = hdf5_create_dataspace(rank,field_dims,NULL)); + h5_debug ( + "Select hyperslab on diskshape: " + "start=(%lld,%lld,%lld), " + "stride=(%lld,%lld,%lld), " + "dims=(%lld,%lld,%lld)", + (long long)start[2], + (long long)start[1], + (long long)start[0], + (long long)stride[2], + (long long)stride[1], + (long long)stride[0], + (long long)part_dims[2], + (long long)part_dims[1], + (long long)part_dims[0] ); + + TRY( hdf5_select_hyperslab_of_dataspace( + b->diskshape, + H5S_SELECT_SET, + start, + stride, + part_dims, + NULL) ); + + field_dims[0] = q->k_end - q->k_start + 1; + field_dims[1] = q->j_end - q->j_start + 1; + field_dims[2] = q->i_end - q->i_start + 1; + + TRY (b->memshape = hdf5_create_dataspace(rank,field_dims,NULL)); + + start[0] = p->k_start - q->k_start; + start[1] = p->j_start - q->j_start; + start[2] = p->i_start - q->i_start; + + h5_debug ( + "Select hyperslab on memshape:" + "start=(%lld,%lld,%lld), " + "stride=(%lld,%lld,%lld), " + "dims=(%lld,%lld,%lld)", + (long long)start[2], + (long long)start[1], + (long long)start[0], + (long long)stride[2], + (long long)stride[1], + (long long)stride[0], + (long long)part_dims[2], + (long long)part_dims[1], + (long long)part_dims[0] ); + + TRY (hdf5_select_hyperslab_of_dataspace( + b->memshape, + H5S_SELECT_SET, + start, + stride, + part_dims, + NULL)); + + H5_PRIV_FUNC_RETURN (H5_SUCCESS); +} + +static h5_err_t +_write_data ( + const h5_file_p f, /*!< IN: file handle */ + const char *field_name, /*!< IN: name of field */ + const char *data_name, /*!< IN: name of dataset */ + const void *data, /*!< IN: data to write */ + const hid_t type /*!< IN: data type */ + ) { + H5_PRIV_FUNC_ENTER (h5_err_t, + "f=%p, field_name=%s, data_name=%s, data=%p type=%d", + f, field_name, data_name, data, type); + hid_t dataset; + h5b_fdata_t *b = f->b; + + h5_err_t exists; + TRY (exists = hdf5_link_exists (b->field_gid, data_name)); + if ( exists > 0 ) { + TRY (dataset = hdf5_open_dataset (b->field_gid, data_name)); + hid_t type_file; + TRY( type_file = hdf5_get_dataset_type (dataset) ); + if ( type != type_file ) { + H5_PRIV_FUNC_LEAVE (h5_error( + H5_ERR_HDF5, + "Field '%s' already has type '%s' " + "but was written as '%s'.", + field_name, + hdf5_get_type_name (type_file), + hdf5_get_type_name (type))); + } + } else { + TRY (dataset = hdf5_create_dataset( + b->field_gid, + data_name, + type, + b->shape, + b->dcreate_prop)); + } +#ifdef PARALLEL_IO + TRY (h5priv_start_throttle (f)); +#endif + TRY (hdf5_write_dataset( + dataset, + type, + b->memshape, + b->diskshape, + f->props->xfer_prop, + data)); +#ifdef PARALLEL_IO + TRY (h5priv_end_throttle (f)); +#endif + TRY (hdf5_close_dataset (dataset)); + + H5_PRIV_FUNC_RETURN (H5_SUCCESS); +} + +h5_err_t +h5b_write_scalar_data ( + const h5_file_t fh, /*!< IN: file handle */ + const char *field_name, /*!< IN: name of field */ + const void *data, /*!< IN: data to write */ + const hid_t type /*!< IN: data type */ + ) { + h5_file_p f = (h5_file_p)fh; + H5_CORE_API_ENTER (h5_err_t, + "f=%p, field_name='%s', data=%p, type=%d", + f, field_name, data, type); + CHECK_TIMEGROUP (f); + CHECK_WRITABLE_MODE (f); + CHECK_LAYOUT (f); + + TRY( h5bpriv_create_field_group(f, field_name) ); + TRY( _select_hyperslab_for_writing(f) ); + TRY( _write_data(f, field_name, H5_BLOCKNAME_X, data, type) ); + + H5_CORE_API_RETURN (H5_SUCCESS); +} + +h5_err_t +h5b_write_vector3d_data ( + const h5_file_t fh, /*!< IN: file handle */ + const char *field_name, /*!< IN: name of field */ + const void *xdata, /*!< IN: x data to write */ + const void *ydata, /*!< IN: y data to write */ + const void *zdata, /*!< IN: z data to write */ + const hid_t type /*!< IN: data type */ + ) { + h5_file_p f = (h5_file_p)fh; + H5_CORE_API_ENTER (h5_err_t, + "f=%p, field_name='%s', " + "xdata=%p, " + "ydata=%p, " + "zdata=%p, " + "type=%d", + f, field_name, xdata, ydata, zdata, type); + CHECK_TIMEGROUP( f ); + CHECK_WRITABLE_MODE( f ); + CHECK_LAYOUT( f ); + + TRY( h5bpriv_create_field_group(f, field_name) ); + TRY( _select_hyperslab_for_writing(f) ); + TRY( _write_data(f, field_name, H5_BLOCKNAME_X, xdata, type) ); + TRY( _write_data(f, field_name, H5_BLOCKNAME_Y, ydata, type) ); + TRY( _write_data(f, field_name, H5_BLOCKNAME_Z, zdata, type) ); + + H5_CORE_API_RETURN (H5_SUCCESS); +} + +static h5_err_t +_select_hyperslab_for_reading ( + const h5_file_p f, /*!< IN: file handle */ + const hid_t dataset + ) { + H5_PRIV_FUNC_ENTER (h5_err_t, "f=%p, dataset=%d", f, dataset); + h5b_fdata_t *b = f->b; + h5b_partition_t *p = b->user_layout; + int rank; + hsize_t field_dims[3]; + hsize_t start[3] = { + p->k_start, + p->j_start, + p->i_start + }; + hsize_t stride[3] = { 1, 1, 1 }; + hsize_t part_dims[3] = { + p->k_end - p->k_start + 1, + p->j_end - p->j_start + 1, + p->i_end - p->i_start + 1 + }; + + TRY( h5bpriv_release_hyperslab(f) ); + + TRY (b->diskshape = hdf5_get_dataset_space (dataset)); + + TRY (rank = hdf5_get_dims_of_dataspace(b->diskshape, field_dims, NULL)); + if (rank != 3) + H5_PRIV_FUNC_LEAVE ( + h5_error( + H5_ERR_INVAL, + "H5Block dataset has bad rank '%d' instead" + " of rank 3! Is the file corrupt?", + rank)); + + if ( (field_dims[0] < (hsize_t)b->k_max) || + (field_dims[1] < (hsize_t)b->j_max) || + (field_dims[2] < (hsize_t)b->i_max) ) + H5_PRIV_FUNC_LEAVE ( + h5_error( + H5_ERR_VIEW, + "H5Block dataset has invalid view. " + "Is the file corrupt?")); + + h5_debug ( + "field_dims: (%lld,%lld,%lld)", + (long long)field_dims[2], + (long long)field_dims[1], + (long long)field_dims[0] ); + + TRY (b->memshape = hdf5_create_dataspace (rank, part_dims, NULL)); + + TRY (hdf5_select_hyperslab_of_dataspace( + b->diskshape, + H5S_SELECT_SET, + start, + stride, + part_dims, + NULL)); + + h5_debug ( + "Select hyperslab: " + "start=(%lld,%lld,%lld), " + "stride=(%lld,%lld,%lld), " + "dims=(%lld,%lld,%lld)", + (long long)start[2], + (long long)start[1], + (long long)start[0], + (long long)stride[2], + (long long)stride[1], + (long long)stride[0], + (long long)part_dims[2], + (long long)part_dims[1], + (long long)part_dims[0] ); + + H5_PRIV_FUNC_RETURN (H5_SUCCESS); +} + +static h5_err_t +read_data ( + const h5_file_p f, /*!< IN: file handle */ + const char *dataset_name, /*!< IN: name of dataset */ + void *data, /*!< OUT: ptr to read buffer */ + const hid_t type /*!< IN: data type */ + ) { + H5_PRIV_FUNC_ENTER (h5_err_t, + "f=%p, dataset_name=%s, data=%p, type=%d", + f, dataset_name, data, type); + hid_t dataset; + h5b_fdata_t *b = f->b; + + TRY (dataset = hdf5_open_dataset (b->field_gid, dataset_name)); + TRY (_select_hyperslab_for_reading (f, dataset) ); +#ifdef PARALLEL_IO + TRY (h5priv_start_throttle (f)); +#endif + TRY (hdf5_read_dataset( + dataset, + type, + f->b->memshape, + f->b->diskshape, + f->props->xfer_prop, + data)); +#ifdef PARALLEL_IO + TRY (h5priv_end_throttle (f)); +#endif + TRY (hdf5_close_dataset(dataset)); + + H5_PRIV_FUNC_RETURN (H5_SUCCESS); +} + +h5_err_t +h5b_read_scalar_data ( + const h5_file_p fh, /*!< IN: file handle */ + const char *field_name, /*!< IN: name of field */ + void *data, /*!< OUT: read bufer */ + const hid_t type /*!< IN: data type */ + ) { + h5_file_p f = (h5_file_p)fh; + H5_CORE_API_ENTER (h5_err_t, + "f=%p, field_name='%s', data=%p, type=%d", + f, field_name, data, type); + CHECK_TIMEGROUP( f ); + CHECK_LAYOUT( f ); + + TRY( h5bpriv_open_field_group(f, field_name) ); + TRY( read_data(f, H5_BLOCKNAME_X, data, type) ); + + H5_CORE_API_RETURN (H5_SUCCESS); +} + +h5_err_t +h5b_read_vector3d_data ( + const h5_file_p fh, /*!< IN: file handle */ + const char *field_name, /*!< IN: name of field */ + void *xdata, /*!< IN: x data to write */ + void *ydata, /*!< IN: y data to write */ + void *zdata, /*!< IN: z data to write */ + const hid_t type /*!< IN: data type */ + ) { + h5_file_p f = (h5_file_p)fh; + H5_CORE_API_ENTER (h5_err_t, + "f=%p, field_name='%s', " + "xdata=%p, " + "ydata=%p, " + "zdata=%p, " + "type=%d", + f, field_name, xdata, ydata, zdata, type); + CHECK_TIMEGROUP( f ); + CHECK_LAYOUT( f ); + + TRY( h5bpriv_open_field_group(f, field_name) ); + TRY( read_data(f, H5_BLOCKNAME_X, xdata, type) ); + TRY( read_data(f, H5_BLOCKNAME_Y, ydata, type) ); + TRY( read_data(f, H5_BLOCKNAME_Z, zdata, type) ); + + H5_CORE_API_RETURN (H5_SUCCESS); +} + diff --git a/src/h5core/h5b_readwrite_private.h b/src/h5core/h5b_readwrite_private.h new file mode 100644 index 0000000..215ce20 --- /dev/null +++ b/src/h5core/h5b_readwrite_private.h @@ -0,0 +1,24 @@ +/* + Copyright (c) 2006-2013, The Regents of the University of California, + through Lawrence Berkeley National Laboratory (subject to receipt of any + required approvals from the U.S. Dept. of Energy) and the Paul Scherrer + Institut (Switzerland). All rights reserved. + + License: see file COPYING in top level of source distribution. +*/ + +#ifndef __H5B_READWRITE_PRIVATE_H +#define __H5B_READWRITE_PRIVATE_H + +#include "h5core/h5_types.h" + +h5_err_t +h5bpriv_open_file ( + const h5_file_p f + ); + +h5_err_t +h5bpriv_close_file ( + const h5_file_p f + ); +#endif diff --git a/src/h5core/h5b_types_private.h b/src/h5core/h5b_types_private.h new file mode 100644 index 0000000..837363b --- /dev/null +++ b/src/h5core/h5b_types_private.h @@ -0,0 +1,39 @@ +#ifndef __H5B_TYPES_PRIVATE_H +#define __H5B_TYPES_PRIVATE_H + +struct h5b_partition { + h5_int64_t i_start; + h5_int64_t i_end; + h5_int64_t j_start; + h5_int64_t j_end; + h5_int64_t k_start; + h5_int64_t k_end; +}; + +struct h5b_fdata { + h5_id_t step_idx; + h5_size_t i_max; + h5_size_t j_max; + h5_size_t k_max; + struct h5b_partition user_layout[1]; + struct h5b_partition write_layout[1]; + int have_layout; + + MPI_Comm cart_comm; + h5_size_t i_grid; + h5_size_t j_grid; + h5_size_t k_grid; + int have_grid; + + hid_t shape; + hid_t memshape; + hid_t diskshape; + hid_t block_gid; + hid_t field_gid; + hid_t dcreate_prop; + + MPI_Datatype partition_mpi_t; +}; +typedef struct h5b_fdata h5b_fdata_t; +typedef struct h5b_partition h5b_partition_t; +#endif diff --git a/src/h5core/h5t_access_private.h b/src/h5core/h5t_access_private.h new file mode 100644 index 0000000..38dd439 --- /dev/null +++ b/src/h5core/h5t_access_private.h @@ -0,0 +1,352 @@ +/* + Copyright (c) 2006-2013, The Regents of the University of California, + through Lawrence Berkeley National Laboratory (subject to receipt of any + required approvals from the U.S. Dept. of Energy) and the Paul Scherrer + Institut (Switzerland). All rights reserved. + + License: see file COPYING in top level of source distribution. +*/ + +#ifndef __H5T_ACCESS_PRIVATE_H +#define __H5T_ACCESS_PRIVATE_H + +#include "h5core/h5_types.h" +#include "h5t_types_private.h" + +struct h5t_access_methods { +#if defined(PARALLEL_IO) + MPI_Datatype (*get_mpi_type_of_glb_elem)( + h5t_mesh_t* const m); +#endif + h5_loc_elem_t* (*get_loc_elem)( + h5t_mesh_t* const, const h5_loc_idx_t); + h5_glb_idx_t (*get_loc_elem_glb_idx)( + h5t_mesh_t* const, const h5_loc_idx_t); + h5_glb_idx_t (*set_loc_elem_glb_idx)( + h5t_mesh_t* const, const h5_loc_idx_t, const h5_glb_idx_t); + h5_loc_idx_t (*get_loc_elem_parent_idx)( + h5t_mesh_t* const, const h5_loc_idx_t); + h5_loc_idx_t (*set_loc_elem_parent_idx)( + h5t_mesh_t* const, const h5_loc_idx_t, const h5_loc_idx_t); + h5_loc_id_t (*get_loc_elem_child_idx)( + h5t_mesh_t* const, const h5_loc_idx_t); + h5_loc_id_t (*set_loc_elem_child_idx)( + h5t_mesh_t* const, const h5_loc_idx_t, const h5_loc_idx_t); + h5_lvl_idx_t (*get_loc_elem_level_idx)( + h5t_mesh_t* const, const h5_loc_idx_t); + h5_lvl_idx_t (*set_loc_elem_level_idx)( + h5t_mesh_t* const, const h5_loc_idx_t, const h5_lvl_idx_t); + h5_loc_idx_t* (*get_loc_elem_vertex_indices)( + h5t_mesh_t* const, const h5_loc_idx_t); + h5_loc_idx_t* (*get_loc_elem_vertex_indices_of_array)( + h5t_mesh_t* const, const h5_loc_idx_t, const h5_loc_elem_t* loc_elems); + h5_loc_idx_t (*get_loc_elem_vertex_idx)( + h5t_mesh_t* const, const h5_loc_idx_t, const h5_loc_idx_t); + h5_loc_idx_t (*set_loc_elem_vertex_idx)( + h5t_mesh_t* const, const h5_loc_idx_t, const h5_loc_idx_t, const h5_loc_idx_t); + h5_loc_idx_t* (*get_loc_elem_neighbor_indices)( + h5t_mesh_t* const, const h5_loc_idx_t); + h5_loc_idx_t (*get_loc_elem_neighbor_idx)( + h5t_mesh_t* const, const h5_loc_idx_t, const h5_loc_idx_t); + h5_loc_idx_t (*set_loc_elem_neighbor_idx)( + h5t_mesh_t* const, const h5_loc_idx_t, const h5_loc_idx_t, const h5_loc_idx_t); + h5_loc_id_t (*get_loc_entity_parent)( + h5t_mesh_t* const, h5_loc_id_t); + h5_err_t (*get_loc_entity_children)( + h5t_mesh_t* const, const h5_loc_id_t, h5_loc_id_t*); + + h5_glb_elem_t* (*alloc_glb_elems)(h5t_mesh_t* const, const size_t); + h5_glb_elem_t* (*get_glb_elem)(h5_glb_elem_t*, const h5_loc_idx_t); + h5_glb_elem_t* (*copy_glb_elems)(h5_glb_elem_t*, h5_loc_idx_t, + h5_glb_elem_t*, h5_loc_idx_t, + size_t); + h5_err_t (*sort_glb_elems)(h5_glb_elem_t*, size_t); + h5_glb_idx_t (*get_glb_elem_idx)(h5_glb_elem_t* const, const h5_loc_idx_t); + h5_lvl_idx_t (*get_glb_elem_level)(h5_glb_elem_t* const, const h5_loc_idx_t); + h5_glb_idx_t* (*get_glb_elem_vertices)(h5_glb_elem_t* const, const h5_loc_idx_t); + h5_glb_idx_t* (*get_glb_elem_neighbors)(h5_glb_elem_t* const, const h5_loc_idx_t); + + h5_err_t (*set_geom_boundary_elem_flag)(h5t_mesh_t* const, const h5_loc_idx_t); + int (*is_geom_boundary_elem)(h5t_mesh_t* const, const h5_loc_idx_t); + int (*is_boundary_facet)(h5t_mesh_t* const, const h5_loc_idx_t, const h5_loc_idx_t); + int (*is_boundary_face)(h5t_mesh_t* const, const int, const h5_loc_idx_t, const h5_loc_idx_t); +}; + +extern struct h5t_access_methods h5tpriv_access_trim_methods; +extern struct h5t_access_methods h5tpriv_access_tetm_methods; + +#if defined(PARALLEL_IO) +static inline MPI_Datatype +h5tpriv_get_mpi_type_of_glb_elem ( + h5t_mesh_t* const m + ) { + return m->methods->access->get_mpi_type_of_glb_elem (m); +} +#endif + +static inline h5_loc_elem_t* +h5tpriv_get_loc_elem ( + h5t_mesh_t* const m, + const h5_loc_idx_t elem_idx + ) { + return m->methods->access->get_loc_elem(m, elem_idx); +} + +static inline h5_glb_idx_t +h5tpriv_set_loc_elem_glb_idx ( + h5t_mesh_t* const m, + h5_loc_idx_t loc_elem_idx, + h5_glb_idx_t glb_elem_idx + ) { + return m->methods->access->set_loc_elem_glb_idx(m, loc_elem_idx, glb_elem_idx); +} + +static inline h5_glb_idx_t +h5tpriv_get_loc_elem_glb_idx ( + h5t_mesh_t* const m, + h5_loc_idx_t loc_elem_idx + ) { + return m->methods->access->get_loc_elem_glb_idx(m, loc_elem_idx); +} + +static inline h5_loc_idx_t +h5tpriv_get_loc_elem_parent_idx ( + h5t_mesh_t* const m, + const h5_loc_idx_t elem_idx + ) { + return m->methods->access->get_loc_elem_parent_idx(m, elem_idx); +} + +static inline h5_loc_idx_t +h5tpriv_set_loc_elem_parent_idx ( + h5t_mesh_t* const m, + const h5_loc_idx_t elem_idx, + const h5_loc_idx_t parent_idx + ) { + return m->methods->access->set_loc_elem_parent_idx(m, elem_idx, parent_idx); +} + +static inline h5_loc_idx_t +h5tpriv_get_loc_elem_child_idx ( + h5t_mesh_t* const m, + const h5_loc_idx_t elem_idx + ) { + return m->methods->access->get_loc_elem_child_idx(m, elem_idx); +} + +static inline h5_loc_idx_t +h5tpriv_set_loc_elem_child_idx ( + h5t_mesh_t* const m, + h5_loc_idx_t elem_idx, + h5_loc_idx_t child_idx) { + return m->methods->access->set_loc_elem_child_idx (m, elem_idx, child_idx); +} + +static inline h5_lvl_idx_t +h5tpriv_get_loc_elem_level_idx ( + h5t_mesh_t* const m, + h5_loc_idx_t elem_idx + ) { + return m->methods->access->get_loc_elem_level_idx (m, elem_idx); +} + +static inline h5_lvl_idx_t +h5tpriv_set_loc_elem_level_idx ( + h5t_mesh_t* const m, + h5_loc_idx_t elem_idx, + h5_lvl_idx_t lvl_idx + ) { + return m->methods->access->set_loc_elem_level_idx (m, elem_idx, lvl_idx); +} + +static inline h5_loc_idx_t* +h5tpriv_get_loc_elem_vertex_indices ( + h5t_mesh_t* const m, + h5_loc_idx_t elem_idx + ) { + return m->methods->access->get_loc_elem_vertex_indices (m, elem_idx); +} + +static inline h5_loc_idx_t* +h5tpriv_get_loc_elem_vertex_indices_of_array ( + h5t_mesh_t* const m, + h5_loc_idx_t elem_idx, + h5_loc_elem_t* loc_elems + ) { + return m->methods->access->get_loc_elem_vertex_indices_of_array (m, elem_idx, loc_elems); +} + +static inline h5_loc_idx_t +h5tpriv_get_loc_elem_vertex_idx ( + h5t_mesh_t* const m, + h5_loc_idx_t elem_idx, + h5_loc_idx_t face_idx + ) { + return m->methods->access->get_loc_elem_vertex_idx(m, elem_idx, face_idx); +} + +static inline h5_loc_idx_t +h5tpriv_set_loc_elem_vertex_idx ( + h5t_mesh_t* const m, + h5_loc_idx_t elem_idx, + h5_loc_idx_t face_idx, + h5_loc_idx_t vertex_idx + ) { + return m->methods->access->set_loc_elem_vertex_idx(m, elem_idx, face_idx, vertex_idx); +} + +static inline h5_loc_idx_t* +h5tpriv_get_loc_elem_neighbor_indices ( + h5t_mesh_t* const m, + h5_loc_idx_t elem_idx + ) { + return m->methods->access->get_loc_elem_neighbor_indices(m, elem_idx); +} + +static inline h5_loc_idx_t +h5tpriv_get_loc_elem_neighbor_idx ( + h5t_mesh_t* const m, + h5_loc_idx_t elem_idx, + h5_loc_idx_t face_idx + ) { + return m->methods->access->get_loc_elem_neighbor_idx(m, elem_idx, face_idx); +} + +static inline h5_loc_idx_t +h5tpriv_set_loc_elem_neighbor_idx ( + h5t_mesh_t* const m, + h5_loc_idx_t elem_idx, + h5_loc_idx_t face_idx, + h5_loc_idx_t idx + ) { + return m->methods->access->set_loc_elem_neighbor_idx(m, elem_idx, face_idx, idx); +} + +static inline h5_loc_id_t +h5tpriv_get_loc_entity_parent ( + h5t_mesh_t* const m, + h5_loc_id_t entity_id + ) { + return m->methods->access->get_loc_entity_parent (m, entity_id); +} + +static inline h5_err_t +h5tpriv_get_loc_entity_children ( + h5t_mesh_t* const m, + const h5_loc_id_t elem_id, + h5_loc_id_t* const children + ) { + return m->methods->access->get_loc_entity_children (m, elem_id, children); +} + +static inline h5_glb_elem_t* +h5tpriv_alloc_glb_elems ( + h5t_mesh_t* const m, const size_t n + ) { + return m->methods->access->alloc_glb_elems(m, n); +} + +static inline h5_glb_elem_t* +h5tpriv_get_glb_elem ( + h5t_mesh_t* m, + h5_glb_elem_t* const elems, + h5_loc_idx_t idx + ) { + return m->methods->access->get_glb_elem (elems, idx); +} + +static inline h5_glb_elem_t* +h5tpriv_copy_glb_elems ( + h5t_mesh_t* const m, + h5_glb_elem_t* dstbuf, + h5_loc_idx_t dstidx, + h5_glb_elem_t* srcbuf, + h5_loc_idx_t srcidx, + size_t count + ) { + return m->methods->access->copy_glb_elems (dstbuf, dstidx, srcbuf, srcidx, count); +} + +static inline h5_err_t +h5tpriv_sort_glb_elems ( + h5t_mesh_t* const m, + h5_glb_elem_t* elems, + size_t count + ) { + return m->methods->access->sort_glb_elems (elems, count); +} + +static inline h5_glb_idx_t +h5tpriv_get_glb_elem_idx ( + h5t_mesh_t* const m, + h5_glb_elem_t* const elems, + const h5_loc_idx_t idx + ) { + return m->methods->access->get_glb_elem_idx (elems, idx); +} + +static inline h5_lvl_idx_t +h5tpriv_get_glb_elem_level( + h5t_mesh_t* const m, + h5_glb_elem_t* const elems, + h5_loc_idx_t elem_idx + ) { + return m->methods->access->get_glb_elem_level (elems, elem_idx); +} + +static inline h5_glb_idx_t* +h5tpriv_get_glb_elem_vertices( + h5t_mesh_t* const m, + h5_glb_elem_t* const elems, + h5_loc_idx_t elem_idx + ) { + return m->methods->access->get_glb_elem_vertices (elems, elem_idx); +} + +static inline h5_glb_idx_t* +h5tpriv_get_glb_elem_neighbors( + h5t_mesh_t* const m, + h5_glb_elem_t* const elems, + h5_loc_idx_t elem_idx + ) { + return m->methods->access->get_glb_elem_neighbors (elems, elem_idx); +} + + +static inline h5_err_t +h5tpriv_set_geom_boundary_elem_flag ( + h5t_mesh_t* const m, + h5_loc_idx_t elem_idx + ) { + return m->methods->access->set_geom_boundary_elem_flag (m, elem_idx); +} + +static inline int +h5tpriv_is_geom_boundary_elem ( + h5t_mesh_t* const m, + h5_loc_idx_t elem_idx + ) { + return m->methods->access->is_geom_boundary_elem (m, elem_idx); +} + +static inline int +h5tpriv_is_boundary_facet ( + h5t_mesh_t* const m, + h5_loc_idx_t elem_idx, + h5_loc_idx_t facet_idx + ) { + return m->methods->access->is_boundary_facet (m, elem_idx, facet_idx); +} + +static inline int +h5tpriv_is_boundary_face ( + h5t_mesh_t* const m, + const int dim, + const h5_loc_idx_t elem_idx, + const h5_loc_idx_t facet_idx + ) { + return m->methods->access->is_boundary_face (m, dim, elem_idx, facet_idx); +} + + +#endif diff --git a/src/h5core/h5t_access_tetm.c b/src/h5core/h5t_access_tetm.c new file mode 100644 index 0000000..771470b --- /dev/null +++ b/src/h5core/h5t_access_tetm.c @@ -0,0 +1,721 @@ +/* + Copyright (c) 2006-2013, The Regents of the University of California, + through Lawrence Berkeley National Laboratory (subject to receipt of any + required approvals from the U.S. Dept. of Energy) and the Paul Scherrer + Institut (Switzerland). All rights reserved. + + License: see file COPYING in top level of source distribution. +*/ + +#include "h5core/h5.h" +#include "h5_types_private.h" +#include "h5_init_private.h" +#include "h5t_types_private.h" +#include "h5t_model_private.h" +#include "h5t_access_private.h" + +/*** op's on local elements ***/ + +#if defined(PARALLEL_IO) +static MPI_Datatype +get_mpi_type_of_glb_elem ( + h5t_mesh_t* const m + ) { + return h5_dta_types.mpi_glb_tet; +} +#endif + +/*** op's on local elements ***/ +static h5_loc_elem_t* +get_loc_elem ( + h5t_mesh_t* const m, + const h5_loc_idx_t elem_idx + ) { + return (h5_loc_elem_t*)(((h5_loc_tet_t*)m->loc_elems) + elem_idx); +} + +static h5_glb_idx_t +get_loc_elem_glb_idx ( + h5t_mesh_t* const m, + const h5_loc_idx_t elem_idx + ) { + return ((h5_loc_tet_t*)m->loc_elems)[elem_idx].glb_idx; +} + +static h5_glb_idx_t +set_loc_elem_glb_idx ( + h5t_mesh_t* const m, + const h5_loc_idx_t elem_idx, + const h5_glb_idx_t glb_idx + ) { + ((h5_loc_tet_t*)m->loc_elems)[elem_idx].glb_idx = glb_idx; + return glb_idx; +} + +static h5_loc_idx_t +get_loc_elem_parent_idx ( + h5t_mesh_t* const m, + const h5_loc_idx_t elem_idx + ) { + return ((h5_loc_tet_t*)m->loc_elems)[elem_idx].parent_idx; +} + +static h5_loc_idx_t +set_loc_elem_parent_idx ( + h5t_mesh_t* const m, + const h5_loc_idx_t elem_idx, + const h5_loc_idx_t parent_idx + ) { + ((h5_loc_tet_t*)m->loc_elems)[elem_idx].parent_idx = parent_idx; + return parent_idx; +} + +static h5_loc_idx_t +get_loc_elem_child_idx ( + h5t_mesh_t* const m, + const h5_loc_idx_t elem_idx + ) { + return ((h5_loc_tet_t*)m->loc_elems)[elem_idx].child_idx; +} + +static h5_loc_idx_t +set_loc_elem_child_idx ( + h5t_mesh_t* const m, + const h5_loc_idx_t elem_idx, + const h5_loc_idx_t child_idx + ) { + ((h5_loc_tet_t*)m->loc_elems)[elem_idx].child_idx = child_idx; + return child_idx; +} + +static h5_lvl_idx_t +get_loc_elem_level_idx ( + h5t_mesh_t* const m, + const h5_loc_idx_t elem_idx + ) { + return ((h5_loc_tet_t*)m->loc_elems)[elem_idx].level_idx; +} + +static h5_lvl_idx_t +set_loc_elem_level_idx ( + h5t_mesh_t* const m, + const h5_loc_idx_t elem_idx, + const h5_lvl_idx_t level_idx + ) { + ((h5_loc_tet_t*)m->loc_elems)[elem_idx].level_idx = level_idx; + return level_idx; +} + +static h5_loc_idx_t* +get_loc_elem_vertex_indices ( + h5t_mesh_t* const m, + const h5_loc_idx_t elem_idx + ) { + return ((h5_loc_tet_t*)m->loc_elems)[elem_idx].vertex_indices; +} + +static h5_loc_idx_t* +get_loc_elem_vertex_indices_of_array ( + h5t_mesh_t* const m, + const h5_loc_idx_t elem_idx, + const h5_loc_elem_t* loc_elems + ) { + return ((h5_loc_tet_t*)loc_elems)[elem_idx].vertex_indices; +} + +static h5_loc_idx_t +get_loc_elem_vertex_idx ( + h5t_mesh_t* const m, + const h5_loc_idx_t elem_idx, + const h5_loc_idx_t face_idx + ) { + return ((h5_loc_tet_t*)m->loc_elems)[elem_idx].vertex_indices[face_idx]; +} + +static h5_loc_idx_t +set_loc_elem_vertex_idx ( + h5t_mesh_t* const m, + const h5_loc_idx_t elem_idx, + const h5_loc_idx_t face_idx, + const h5_loc_idx_t vertex_idx + ) { + ((h5_loc_tet_t*)m->loc_elems)[elem_idx].vertex_indices[face_idx] = vertex_idx; + return vertex_idx; +} + +static h5_loc_idx_t* +get_loc_elem_neighbor_indices ( + h5t_mesh_t* const m, + const h5_loc_idx_t elem_idx + ) { + return ((h5_loc_tet_t*)m->loc_elems)[elem_idx].neighbor_indices; +} + +static h5_loc_idx_t +get_loc_elem_neighbor_idx ( + h5t_mesh_t* const m, + const h5_loc_idx_t elem_idx, + const h5_loc_idx_t face_idx + ) { + return ((h5_loc_tet_t*)m->loc_elems)[elem_idx].neighbor_indices[face_idx]; +} + +static h5_loc_idx_t +set_loc_elem_neighbor_idx ( + h5t_mesh_t* const m, + const h5_loc_idx_t elem_idx, + const h5_loc_idx_t face_idx, + const h5_loc_idx_t neighbor_idx + ) { + ((h5_loc_tet_t*)m->loc_elems)[elem_idx].neighbor_indices[face_idx] = neighbor_idx; + return neighbor_idx; +} + +/*** op's on global elements ***/ +static h5_glb_elem_t* +alloc_glb_elems ( + h5t_mesh_t* const m, const size_t size + ) { + H5_PRIV_FUNC_ENTER (h5_glb_elem_p, "m=%p, size=%zu", m, size); + h5_glb_elem_p buf; + TRY (buf = h5_calloc (size, sizeof(h5_glb_tet_t))); + H5_PRIV_FUNC_RETURN (buf); +} + +static h5_glb_elem_t* +get_glb_elem ( + h5_glb_elem_t* __elems, + const h5_loc_idx_t idx + ) { + h5_glb_tet_t* elems = (h5_glb_tet_t*)__elems; + return (h5_glb_elem_t*)(elems+idx); +} + +static h5_glb_elem_t* +copy_glb_elems ( + h5_glb_elem_t* dstbuf, + h5_loc_idx_t dstidx, + h5_glb_elem_t* srcbuf, + h5_loc_idx_t srcidx, + size_t count + ) { + h5_glb_tet_t* dst = (h5_glb_tet_t*)dstbuf + dstidx; + h5_glb_tet_t* src = (h5_glb_tet_t*)srcbuf + srcidx; + memcpy (dst, src, count*sizeof(*src)); + return (h5_glb_elem_t*)dst; +} + +int compare_glb_elems(const void *p_a, const void *p_b) { + return ((h5_glb_tet_t*) p_a)->idx - ((h5_glb_tet_t*) p_b)->idx; +} + + +static h5_err_t +sort_glb_elems ( + h5_glb_elem_t* elems, + size_t count + ) { + qsort(elems,(int) count, sizeof (h5_glb_tet_t), compare_glb_elems); + return H5_SUCCESS; +} + + +static h5_glb_idx_t +get_glb_elem_idx ( + h5_glb_elem_t* const elems, + const h5_loc_idx_t elem_idx + ) { + return ((h5_glb_tet_t*)elems)[elem_idx].idx; +} + +static h5_lvl_idx_t +get_glb_elem_level ( + h5_glb_elem_t* const elems, + const h5_loc_idx_t elem_idx + ) { + return ((h5_glb_tet_t*)elems)[elem_idx].level_idx; +} + +static h5_glb_idx_t* +get_glb_elem_vertices ( + h5_glb_elem_t* const elems, + const h5_loc_idx_t elem_idx + ) { + return ((h5_glb_tet_t*)elems)[elem_idx].vertex_indices; +} + +static h5_glb_idx_t* +get_glb_elem_neighbors ( + h5_glb_elem_t* const elems, + const h5_loc_idx_t elem_idx + ) { + return ((h5_glb_tet_t*)elems)[elem_idx].neighbor_indices; +} + +static h5_err_t +set_geom_boundary_elem_flag ( + h5t_mesh_t* const m, + h5_loc_idx_t elem_idx + ) { + ((h5_loc_tet_t*)m->loc_elems)[elem_idx].flags |= H5_GEOBORDER_ENTITY; + return H5_SUCCESS; +} + +static int +is_geom_boundary_elem ( + h5t_mesh_t* const m, + const h5_loc_idx_t elem_idx + ) { + return (((h5_loc_tet_t*)m->loc_elems)[elem_idx].flags & H5_GEOBORDER_ENTITY) ? 1 : 0; +} + +static int +is_boundary_facet ( + h5t_mesh_t* const m, + const h5_loc_idx_t elem_idx, + const h5_loc_idx_t facet_idx + ) { + return (((h5_loc_tet_t*)m->loc_elems)[elem_idx].neighbor_indices[facet_idx] == -1); +} + +static int +is_boundary_face ( + h5t_mesh_t* const m, + const int dim, + const h5_loc_idx_t elem_idx, + const h5_loc_idx_t facet_idx + ) { + UNUSED_ARGUMENT (m); + UNUSED_ARGUMENT (dim); + UNUSED_ARGUMENT (elem_idx); + UNUSED_ARGUMENT (facet_idx); + + return h5_error_internal (); +} + +/* + From time to time we need the parent entity of a given entity. This is + simple for cells but requires some knowledge about the mesh refinement + method for all other entities. Of course not all entities have a parent + anyway. + + Just as an reminder: New vertices in a refined tetrahedron P: + + 3 + ** + ** * + * * * + * * * + * * * + * 9 * + * * * + 7 * 8 + * * * + * 2 * + * * * * * + * * * * + * 5 6 * + * * * * + ** ** + 0 * * * * * * * 4 * * * * * * *1 + + The new cells (with n_P: number of children): + + n_P vertices + 0 0,4,5,7 + 1 4,1,6,8 + 2 5,6,2,9 + 3 7,8,9,3 + 4 4,5,6,8 + 5 4,5,7,8 + 6 5,6,8,9 + 7 5,7,8,9 + + Given an entity E we know: + + * C: the cell E belongs to, + * e_C: the id of E in C and E = [e_C,C] + * P: the parent of C, if any + * n_P: the number of child C + + */ + +/* + Parent of tetrahedron + --------------------- + This is the simplest case: each children knows his parent. + + + Parent of triangle + ------------------ + Given an triangle E, we want to know the parent triangle of E. + + Refining a tetrahedron gives 4*4 new triangles on the surface of the + tetrahedron. We don't care about the inner triangles. + + The new triangles on the surface of P are: + + n_P vertices triangles + 0 0,4,5,7 (0,4,5)* (0,4,7)* (0,5,7)* (4,5,7) + 1 4,1,6,8 (4,1,6)* (4,1,8)* (4,6,8) (1,6,8)* + 2 5,6,2,9 (5,6,2)* (5,6,9) (5,2,9)* (6,2,9)* + 3 7,8,9,3 (7,8,9) (7,8,3)* (7,9,3)* (8,9,3)* + 4 4,5,6,8 (4,5,6)* (4,5,8) (4,6,8) (5,6,8) + 5 4,5,7,8 (4,5,7) (4,5,8) (4,7,8)* (5,7,8) + 6 5,6,8,9 (5,6,8) (5,6,9) (5,8,9) (6,8,9)* + 7 5,7,8,9 (5,7,8) (5,7,9)* (5,8,9) (7,8,9) + + Now let's have a look on triangle id's. We want to map an triangle id e_C + of cell C to the triangle id e_P of its parent P. As we can see in above + table, the triangle (0,4,5) has id 0 and belongs to child 0. The parent + triangle of (0,4,5) is (0,1,2) also with id 0. It is simple to prove, that + the triangle id of child and parent are identical in all cases. + + triangle tetrahedron triangle id parent triangle id + (0,4,5) (0,4,5,7) 0 0 + (0,4,7) (0,4,5,7) 1 1 + (0,5,7) (0,4,5,7) 2 2 + (4,1,6) (4,1,6,8) 0 0 + (4,1,8) (4,1,6,8) 1 1 + (1,6,8) (4,1,6,8) 3 3 + (5,6,2) (5,6,2,9) 0 0 + (5,2,9) (5,6,2,9) 2 2 + (6,2,9) (5,6,2,9) 3 3 + (7,8,3) (7,8,9,3) 1 1 + (7,9,3) (7,8,9,3) 2 2 + (8,9,3) (7,8,9,3) 3 3 + (4,5,6) (4,5,6,8) 0 0 + (4,7,8) (4,5,7,8) 2 1 + (6,8,9) (5,6,8,9) 3 3 + (5,7,9) (5,7,8,9) 1 2 + + This gives us the following matrix: + + t r i a n g l e i d + 0 1 2 3 + + c 0 0 1 2 -1 + h 1 0 1 -1 3 + i 2 0 -1 2 3 + l 3 -1 1 2 3 + d 4 0 -1 -1 -1 + 5 -1 -1 1 -1 + n 6 -1 -1 -1 3 + o 7 -1 2 -1 -1 + + */ +int map_tri_to_parent_face[8][4] = { + { 0, 1, 2,-1}, // 0 + { 0, 1,-1, 3}, // 1 + { 0,-1, 2, 3}, // 2 + {-1, 1, 2, 3}, // 3 + { 0,-1,-1,-1}, // 4 + {-1,-1, 1,-1}, // 5 + {-1,-1,-1, 3}, // 6 + {-1, 2,-1,-1} // 7 +}; + +/* + Parent of edge + -------------- + Given an edge E, we want to know the parent edge of E. + + Refining P we get 25 new edges. But only 12 edges are intersecting with + edges of P. Only for these 12 edges we have a parent edges in P. So, + we don't have to care about the 13 other edges. It is obvious, that only + the first for children of P have edges intersecting with edges of P. + These edges are marked in the following table. + + Edges of the first four childern of P: + + n_P vertices edges + 0 0,4,5,7 (0,4)* (0,5)* (4,5) (0,7)* (4,7) (5,7) + 1 4,1,6,8 (4,1)* (4,6) (1,6)* (4,8) (1,8)* (6,8) + 2 5,6,2,9 (5,6) (5,2)* (6,2)* (5,9) (6,9) (2,9)* + 3 7,8,9,3 (7,8) (7,9) (8,9) (7,3)* (8,3)* (9,3)* + + Now let's have a look on edge id's. We want to map an edge id e_C of cell + C to the edge id e_P of its parent P. As we can see in above table, the + edge (0,4) has id 0 and belongs to child 0. The parent edge of (0,4) is + (0,1) also with id 0. It is simple to prove, that the edge id in child + and parent are identical in all cases. This gives us the following matrix: + + e d g e i d + 0 1 2 3 4 5 + + c 0 0 1 -1 3 -1 -1 + h 1 0 -1 2 -1 4 -1 + i 2 -1 1 2 -1 -1 5 + l 3 -1 -1 -1 3 4 5 + d 4 -1 -1 -1 -1 -1 -1 + 5 -1 -1 -1 -1 -1 -1 + n 6 -1 -1 -1 -1 -1 -1 + o 7 -1 -1 -1 -1 -1 -1 + + How to read it? Given an entity E, we know the element/cell C + entity E is belonging to and the edge number e_C. We know the parent P of + C and we know which number of child C is, let this be n_P. + + The matrix maps child number and edge id of E to the corresponding edge + id of the parent. + + f (n_P, e_C) -> e_P + + If the result is -1, no parent edge exists. Otherwise the parent edge is + [e_P,P] + + */ +int map_edge_to_parent_face[8][6] = { + { 0, 1,-1, 3,-1,-1}, + { 0,-1, 2,-1, 4,-1}, + {-1, 1, 2,-1,-1, 5}, + {-1,-1,-1, 3, 4, 5}, + {-1,-1,-1,-1,-1,-1}, + {-1,-1,-1,-1,-1,-1}, + {-1,-1,-1,-1,-1,-1}, + {-1,-1,-1,-1,-1,-1}, +}; +/* + Parent of vertex + ---------------- + This case is trivial. + */ +int map_vertex_to_parent_face[8][4] = { + { 0,-1,-1,-1}, + {-1, 1,-1,-1}, + {-1,-1, 2,-1}, + {-1,-1,-1, 3}, + {-1,-1,-1,-1}, + {-1,-1,-1,-1}, + {-1,-1,-1,-1}, + {-1,-1,-1,-1}, +}; + +static h5_loc_id_t +get_loc_entity_parent ( + h5t_mesh_t* const m, + h5_loc_id_t entity_id + ) { + // extract type ID and face index + h5_loc_id_t type_id = h5tpriv_get_entity_type (entity_id); + h5_loc_idx_t face_idx = h5tpriv_get_face_idx (entity_id); + h5_loc_idx_t elem_idx = h5tpriv_get_elem_idx (entity_id); + + // # of children + h5_loc_idx_t parent_idx = get_loc_elem_parent_idx (m, elem_idx); + if (parent_idx < 0) + return H5_NOK; + h5_loc_idx_t firstborn_idx = get_loc_elem_child_idx (m, parent_idx); + h5_loc_idx_t num_child = elem_idx - firstborn_idx; + + switch (type_id) { + case H5T_TYPE_VERTEX: { + face_idx = map_vertex_to_parent_face[num_child][face_idx]; + break; + } + case H5T_TYPE_EDGE: { + face_idx = map_edge_to_parent_face[num_child][face_idx]; + break; + } + case H5T_TYPE_TRIANGLE: { + face_idx = map_edge_to_parent_face[num_child][face_idx]; + break; + } + case H5T_TYPE_TET: { + break; + } + default: + h5_error_internal (); + } + return (face_idx != -1) ? + h5tpriv_build_entity_id (type_id, face_idx, parent_idx) : -1; +} + +static h5_err_t +get_children_of_loc_elem ( + h5t_mesh_t* const m, + h5_loc_idx_t face_idx, // in + h5_loc_idx_t elem_idx, // in + h5_loc_id_t* children // out + ) { + if (face_idx != 0) { + return h5_error_internal (); + } + h5_loc_idx_t idx = ((h5_loc_tet_t*)m->loc_elems)[elem_idx].child_idx; + children[0] = h5tpriv_build_tet_id ((h5_loc_idx_t)0, idx++); + children[1] = h5tpriv_build_tet_id ((h5_loc_idx_t)0, idx++); + children[2] = h5tpriv_build_tet_id ((h5_loc_idx_t)0, idx++); + children[3] = h5tpriv_build_tet_id ((h5_loc_idx_t)0, idx++); + children[4] = h5tpriv_build_tet_id ((h5_loc_idx_t)0, idx++); + children[5] = h5tpriv_build_tet_id ((h5_loc_idx_t)0, idx++); + children[6] = h5tpriv_build_tet_id ((h5_loc_idx_t)0, idx++); + children[7] = h5tpriv_build_tet_id ((h5_loc_idx_t)0, idx); + + return H5_SUCCESS; +} +/* + Compute direct children of a triangle. + + Face 0 Face 1 Face 2 Face 3 + 1 1 2 1 + + + + + + |\ |\ |\ |\ + | \ | \ | \ | \ + | \ | \ | \ | \ + | \ | \ | \ | \ + 4+----+6 4+----+8 5+----+9 6+----+8 + |\ |\ |\ |\ |\ |\ |\ |\ + | \ | \ | \ | \ | \ | \ | \ | \ + | \ | \ | \ | \ | \ | \ | \ | \ + | \| \ | \| \ | \| \ | \| \ + |+----+----+ +----+----+ +----+----+ +----+----+ + 0 5 2 0 7 3 0 7 3 2 9 3 + + z ^ z ^ y ^ z ^ + | | | | + |+--> +--> +--> +--> + y x x x + + Triangle: face idx, #child + + [0,4,5]: 0, 0 [0,4,7]: 1, 0 [0,5,7]: 2, 0 [1,6,8]: 3, 1 + [1,4,6]: 0, 1 [1,4,8]: 1, 1 [2,5,9]: 2, 2 [2,6,9]: 3, 2 + [2,5,6]: 0, 2 [3,7,8]: 1, 3 [3,7,9]: 2, 3 [3,8,9]: 3, 3 + [4,5,6]: 0, 4 [4,7,8]: 2, 5 [5,7,9]: 1, 7 [6,8,9]: 3, 6 + + */ +static inline h5_err_t +get_children_of_loc_triangle ( + h5t_mesh_t* const m, + h5_loc_idx_t face_idx, // in + h5_loc_idx_t elem_idx, // in + h5_loc_id_t* children // out + ) { + h5_loc_idx_t map[4][4][2] = { + {{0,0},{0,1},{0,2},{0,4}}, // face 0 + {{1,0},{1,1},{1,3},{2,5}}, // face 1 + {{2,0},{2,2},{2,3},{1,7}}, // face 2 + {{3,1},{3,2},{3,3},{3,6}} // face 3 + }; + int num_faces = h5tpriv_ref_elem_get_num_facets (m); + if ((face_idx < 0) || (face_idx >= num_faces)) { + return h5_error_internal (); + } + h5_loc_idx_t idx = ((h5_loc_tet_t*)m->loc_elems)[elem_idx].child_idx; + children[0] = h5tpriv_build_triangle_id ( + map[face_idx][0][0], idx+map[face_idx][0][1]); + children[1] = h5tpriv_build_triangle_id ( + map[face_idx][1][0], idx+map[face_idx][1][1]); + children[2] = h5tpriv_build_triangle_id ( + map[face_idx][2][0], idx+map[face_idx][2][1]); + children[3] = h5tpriv_build_triangle_id ( + map[face_idx][3][0], idx+map[face_idx][3][1]); + return H5_SUCCESS; +} + +/* + Return the two direct children of the edge given by face and + element index of first child. + */ +static h5_err_t +get_children_of_loc_edge ( + h5t_mesh_t* const m, + h5_loc_idx_t face_idx, + h5_loc_idx_t elem_idx, + h5_loc_id_t* children + ) { + /* + Please read the note about the offsets in the corresponding file + for triangle meshes. + */ + int offs[6][2] = { {0,1}, // edge 0 + {0,2}, // edge 1 + {1,2}, // edge 2 + {0,3}, // edge 3 + {1,3}, // edge 4 + {2,3} // edge 5 + }; + h5_loc_idx_t num_faces = h5tpriv_ref_elem_get_num_edges (m); + if ((face_idx < 0) || (face_idx >= num_faces)) { + return h5_error_internal (); + } + h5_loc_idx_t idx = ((h5_loc_tet_t*)m->loc_elems)[elem_idx].child_idx; + children[0] = h5tpriv_build_edge_id (face_idx, idx+offs[face_idx][0]); + children[1] = h5tpriv_build_edge_id (face_idx, idx+offs[face_idx][1]); + return H5_SUCCESS; +} + +static h5_err_t +get_loc_entity_children ( + h5t_mesh_t* const m, + const h5_loc_id_t entity_id, + h5_loc_id_t* const children + ) { + H5_PRIV_FUNC_ENTER (h5_err_t, + "m=%p, entity_id=%llx, children=%p", + m, (long long)entity_id, children); + + const h5_loc_id_t type_id = h5tpriv_get_entity_type (entity_id); + const h5_loc_idx_t face_idx = h5tpriv_get_face_idx (entity_id); + const h5_loc_idx_t elem_idx = h5tpriv_get_elem_idx (entity_id); + + if (h5tpriv_is_leaf_elem (m, &((h5_loc_tet_t*)m->loc_elems)[elem_idx])) { + H5_PRIV_FUNC_LEAVE (H5_NOK); // not refined + } + switch (type_id) { + case H5T_TYPE_TET: { + H5_PRIV_FUNC_LEAVE ( + get_children_of_loc_elem (m, face_idx, elem_idx, children)); + break; + } + case H5T_TYPE_TRIANGLE: { + H5_PRIV_FUNC_LEAVE ( + get_children_of_loc_triangle (m, face_idx, elem_idx, children)); + break; + } + case H5T_TYPE_EDGE: { + H5_PRIV_FUNC_LEAVE ( + get_children_of_loc_edge (m, face_idx, elem_idx, children)); + } + default: + H5_PRIV_FUNC_LEAVE (h5_error_internal ()); + } + H5_PRIV_FUNC_RETURN (H5_SUCCESS); +} + +struct h5t_access_methods h5tpriv_access_tetm_methods = { +#if defined(PARALLEL_IO) + get_mpi_type_of_glb_elem, +#endif + get_loc_elem, + get_loc_elem_glb_idx, + set_loc_elem_glb_idx, + get_loc_elem_parent_idx, + set_loc_elem_parent_idx, + get_loc_elem_child_idx, + set_loc_elem_child_idx, + get_loc_elem_level_idx, + set_loc_elem_level_idx, + get_loc_elem_vertex_indices, + get_loc_elem_vertex_indices_of_array, + get_loc_elem_vertex_idx, + set_loc_elem_vertex_idx, + get_loc_elem_neighbor_indices, + get_loc_elem_neighbor_idx, + set_loc_elem_neighbor_idx, + get_loc_entity_parent, + get_loc_entity_children, + alloc_glb_elems, + get_glb_elem, + copy_glb_elems, + sort_glb_elems, + get_glb_elem_idx, + get_glb_elem_level, + get_glb_elem_vertices, + get_glb_elem_neighbors, + set_geom_boundary_elem_flag, + is_geom_boundary_elem, + is_boundary_facet, + is_boundary_face, +}; + diff --git a/src/h5core/h5t_access_trim.c b/src/h5core/h5t_access_trim.c new file mode 100644 index 0000000..b452969 --- /dev/null +++ b/src/h5core/h5t_access_trim.c @@ -0,0 +1,420 @@ +/* + Copyright (c) 2006-2012, The Regents of the University of California, + through Lawrence Berkeley National Laboratory (subject to receipt of any + required approvals from the U.S. Dept. of Energy) and the Paul Scherrer + Institut (Switzerland). All rights reserved. + + License: see file COPYING in top level of source distribution. +*/ + +#include "h5core/h5.h" +#include "h5_init_private.h" +#include "h5t_types_private.h" +#include "h5t_model_private.h" +#include "h5t_access_private.h" + +#if defined(PARALLEL_IO) +static MPI_Datatype +get_mpi_type_of_glb_elem ( + h5t_mesh_t* const m + ) { + return h5_dta_types.mpi_glb_triangle; +} +#endif + +/*** op's on local elements ***/ +static h5_loc_elem_t* +get_loc_elem ( + h5t_mesh_t* const m, + const h5_loc_idx_t elem_idx + ) { + return (h5_loc_elem_t*)(((h5_loc_tri_t*)m->loc_elems) + elem_idx); +} + +static h5_glb_idx_t +get_loc_elem_glb_idx ( + h5t_mesh_t* const m, + const h5_loc_idx_t elem_idx + ) { + return ((h5_loc_tri_t*)m->loc_elems)[elem_idx].glb_idx; +} + +static h5_glb_idx_t +set_loc_elem_glb_idx ( + h5t_mesh_t* const m, + const h5_loc_idx_t elem_idx, + const h5_glb_idx_t glb_idx + ) { + ((h5_loc_tri_t*)m->loc_elems)[elem_idx].glb_idx = glb_idx; + return glb_idx; +} + +static h5_loc_idx_t +get_loc_elem_parent_idx ( + h5t_mesh_t* const m, + const h5_loc_idx_t elem_idx + ) { + return ((h5_loc_tri_t*)m->loc_elems)[elem_idx].parent_idx; +} + +static h5_loc_idx_t +set_loc_elem_parent_idx ( + h5t_mesh_t* const m, + const h5_loc_idx_t elem_idx, + const h5_loc_idx_t parent_idx + ) { + ((h5_loc_tri_t*)m->loc_elems)[elem_idx].parent_idx = parent_idx; + return parent_idx; +} + +static h5_loc_idx_t +get_loc_elem_child_idx ( + h5t_mesh_t* const m, + const h5_loc_idx_t elem_idx + ) { + return ((h5_loc_tri_t*)m->loc_elems)[elem_idx].child_idx; +} + +static h5_loc_idx_t +set_loc_elem_child_idx ( + h5t_mesh_t* const m, + const h5_loc_idx_t elem_idx, + const h5_loc_idx_t child_idx + ) { + ((h5_loc_tri_t*)m->loc_elems)[elem_idx].child_idx = child_idx; + return child_idx; +} + +static h5_lvl_idx_t +get_loc_elem_level_idx ( + h5t_mesh_t* const m, + const h5_loc_idx_t elem_idx + ) { + return ((h5_loc_tri_t*)m->loc_elems)[elem_idx].level_idx; +} + +static h5_lvl_idx_t +set_loc_elem_level_idx ( + h5t_mesh_t* const m, + const h5_loc_idx_t elem_idx, + const h5_lvl_idx_t level_idx + ) { + ((h5_loc_tri_t*)m->loc_elems)[elem_idx].level_idx = level_idx; + return level_idx; +} + +static h5_loc_idx_t* +get_loc_elem_vertex_indices ( + h5t_mesh_t* const m, + const h5_loc_idx_t elem_idx + ) { + return ((h5_loc_tri_t*)m->loc_elems)[elem_idx].vertex_indices; +} + +static h5_loc_idx_t* +get_loc_elem_vertex_indices_of_array ( + h5t_mesh_t* const m, + const h5_loc_idx_t elem_idx, + const h5_loc_elem_t* loc_elems + ) { + return ((h5_loc_tri_t*)loc_elems)[elem_idx].vertex_indices; +} + +static h5_loc_idx_t +get_loc_elem_vertex_idx ( + h5t_mesh_t* const m, + const h5_loc_idx_t elem_idx, + const h5_loc_idx_t face_idx + ) { + return ((h5_loc_tri_t*)m->loc_elems)[elem_idx].vertex_indices[face_idx]; +} + +static h5_loc_idx_t +set_loc_elem_vertex_idx ( + h5t_mesh_t* const m, + const h5_loc_idx_t elem_idx, + const h5_loc_idx_t face_idx, + const h5_loc_idx_t vertex_idx + ) { + ((h5_loc_tri_t*)m->loc_elems)[elem_idx].vertex_indices[face_idx] = vertex_idx; + return vertex_idx; +} + +static h5_loc_idx_t* +get_loc_elem_neighbor_indices ( + h5t_mesh_t* const m, + const h5_loc_idx_t elem_idx + ) { + return ((h5_loc_tri_t*)m->loc_elems)[elem_idx].neighbor_indices; +} + +static h5_loc_idx_t +get_loc_elem_neighbor_idx ( + h5t_mesh_t* const m, + const h5_loc_idx_t elem_idx, + const h5_loc_idx_t face_idx + ) { + return ((h5_loc_tri_t*)m->loc_elems)[elem_idx].neighbor_indices[face_idx]; +} + +static h5_loc_idx_t +set_loc_elem_neighbor_idx ( + h5t_mesh_t* const m, + const h5_loc_idx_t elem_idx, + const h5_loc_idx_t face_idx, + const h5_loc_idx_t neighbor_idx + ) { + ((h5_loc_tri_t*)m->loc_elems)[elem_idx].neighbor_indices[face_idx] = neighbor_idx; + return neighbor_idx; +} + + +/*** op's on global elements ***/ +static h5_glb_elem_t* +alloc_glb_elems ( + h5t_mesh_t* const m, const size_t size + ) { + H5_PRIV_FUNC_ENTER (h5_glb_elem_p, "m=%p, size=%zu", m, size); + h5_glb_elem_p buf; + TRY (buf = h5_calloc (size, sizeof(h5_glb_tri_t))); + H5_PRIV_FUNC_RETURN (buf); +} + +static h5_glb_elem_t* +get_glb_elem ( + h5_glb_elem_t* __elems, + const h5_loc_idx_t idx + ) { + h5_glb_tri_t* elems = (h5_glb_tri_t*)__elems; + return (h5_glb_elem_t*)(elems+idx); +} + +static h5_glb_elem_t* +copy_glb_elems ( + h5_glb_elem_t* dstbuf, + h5_loc_idx_t dstidx, + h5_glb_elem_t* srcbuf, + h5_loc_idx_t srcidx, + size_t count + ) { + h5_glb_tri_t* dst = (h5_glb_tri_t*)dstbuf + dstidx; + h5_glb_tri_t* src = (h5_glb_tri_t*)srcbuf + srcidx; + memcpy (dst, src, count*sizeof(*src)); + return (h5_glb_elem_t*)dst; +} + +int compare_glb_elems(const void *p_a, const void *p_b) { + return ((h5_glb_tri_t*) p_a)->idx - ((h5_glb_tri_t*) p_b)->idx; +} + + +static h5_err_t +sort_glb_elems ( + h5_glb_elem_t* elems, + size_t count + ) { + h5_glb_tri_t* tri = (h5_glb_tri_t*) elems; + qsort(tri, count, sizeof (*tri), compare_glb_elems); + return H5_SUCCESS; +} + +static h5_glb_idx_t +get_glb_elem_idx ( + h5_glb_elem_t* const elems, + const h5_loc_idx_t elem_idx + ) { + h5_glb_tri_t* tris = (h5_glb_tri_t*)elems; + return tris[elem_idx].idx; +} + +static h5_lvl_idx_t +get_glb_elem_level ( + h5_glb_elem_t* const elems, + const h5_loc_idx_t elem_idx + ) { + return ((h5_glb_tri_t*)elems)[elem_idx].level_idx; +} + +static h5_glb_idx_t* +get_glb_elem_vertices ( + h5_glb_elem_t* const elems, + const h5_loc_idx_t elem_idx + ) { + return ((h5_glb_tri_t*)elems)[elem_idx].vertex_indices; +} + +static h5_glb_idx_t* +get_glb_elem_neighbors ( + h5_glb_elem_t* const elems, + const h5_loc_idx_t elem_idx + ) { + return ((h5_glb_tri_t*)elems)[elem_idx].neighbor_indices; +} + +static h5_err_t +set_geom_boundary_elem_flag ( + h5t_mesh_t* const m, + h5_loc_idx_t elem_idx + ) { + ((h5_loc_tri_t*)m->loc_elems)[elem_idx].flags |= H5_GEOBORDER_ENTITY; + return H5_SUCCESS; +} + +static int +is_geom_boundary_elem ( + h5t_mesh_t* const m, + const h5_loc_idx_t elem_idx + ) { + return (((h5_loc_tri_t*)m->loc_elems)[elem_idx].flags & H5_GEOBORDER_ENTITY) ? 1 : 0; +} + +static int +is_boundary_facet ( + h5t_mesh_t* const m, + const h5_loc_idx_t elem_idx, + const h5_loc_idx_t facet_idx + ) { + return (((h5_loc_tri_t*)m->loc_elems)[elem_idx].neighbor_indices[facet_idx] == -1); +} + +static int +is_boundary_face ( + h5t_mesh_t* const m, + const int dim, + const h5_loc_idx_t elem_idx, + const h5_loc_idx_t facet_idx + ) { + UNUSED_ARGUMENT (m); + UNUSED_ARGUMENT (dim); + UNUSED_ARGUMENT (elem_idx); + UNUSED_ARGUMENT (facet_idx); + return h5_error_internal (); +} + +static h5_loc_id_t +get_loc_entity_parent ( + h5t_mesh_t* const m, + h5_loc_id_t entity_id + ) { + // TODO + return h5_error_not_implemented (); +} + +static h5_err_t +get_children_of_loc_elem ( + h5t_mesh_t* const m, + h5_loc_idx_t face_idx, // in + h5_loc_idx_t elem_idx, // in + h5_loc_id_t* children // out + ) { + if (face_idx != 0) { + return h5_error_internal (); + } + h5_loc_idx_t idx = ((h5_loc_tri_t*)m->loc_elems)[elem_idx].child_idx; + children[0] = h5tpriv_build_tet_id ((h5_loc_idx_t)0, idx++); + children[1] = h5tpriv_build_tet_id ((h5_loc_idx_t)0, idx++); + children[2] = h5tpriv_build_tet_id ((h5_loc_idx_t)0, idx++); + children[3] = h5tpriv_build_tet_id ((h5_loc_idx_t)0, idx++); + + return H5_SUCCESS; +} + + +static h5_err_t +get_children_of_loc_edge ( + h5t_mesh_t* const m, + const h5_loc_idx_t face_idx, + const h5_loc_idx_t elem_idx, + h5_loc_id_t* children + ) { + /* + Please note: The face index of the children and the father is + always the same. The only think we have to know, is the offset + to the element index of the first child. This is either 0, 1 or + 2. The third child is an "inner" child which doesn't superpose edges + of the parent. + + The direct children of edge 0 of an element are edge 0 of the + first child and edge 0 of the second child, giving the offset 0 + and 1 for this edge. + */ + int off[3][2] = { {0,1}, // edge 0 + {0,2}, // edge 1 + {1,2} // edge 2 + }; + h5_loc_idx_t num_faces = h5tpriv_ref_elem_get_num_edges (m); + if ((face_idx < 0) || (face_idx >= num_faces)) { + return h5_error_internal (); + } + h5_loc_idx_t idx = ((h5_loc_tri_t*)m->loc_elems)[elem_idx].child_idx; + children[0] = h5tpriv_build_edge_id (face_idx, idx+off[face_idx][0]); + children[1] = h5tpriv_build_edge_id (face_idx, idx+off[face_idx][1]); + return H5_SUCCESS; +} + +static h5_err_t +get_loc_entity_children ( + h5t_mesh_t* const m, + const h5_loc_id_t entity_id, + h5_loc_id_t* const children + ) { + H5_PRIV_FUNC_ENTER (h5_err_t, + "m=%p, entity_id=%llx, children=%p", + m, (long long)entity_id, children); + + const h5_loc_id_t type_id = h5tpriv_get_entity_type (entity_id); + const h5_loc_idx_t face_idx = h5tpriv_get_face_idx (entity_id); + const h5_loc_idx_t elem_idx = h5tpriv_get_elem_idx (entity_id); + + if (h5tpriv_is_leaf_elem (m, &((h5_loc_tri_t*)m->loc_elems)[elem_idx])) { + H5_PRIV_FUNC_LEAVE (H5_NOK); // not refined + } + switch (type_id) { + case H5T_TYPE_TRIANGLE: { + H5_PRIV_FUNC_LEAVE ( + get_children_of_loc_elem (m, face_idx, elem_idx, children)); + break; + } + case H5T_TYPE_EDGE: { + H5_PRIV_FUNC_LEAVE ( + get_children_of_loc_edge (m, face_idx, elem_idx, children)); + } + } + H5_PRIV_FUNC_RETURN (h5_error_internal ()); +} + +struct h5t_access_methods h5tpriv_access_trim_methods = { +#if defined(PARALLEL_IO) + get_mpi_type_of_glb_elem, +#endif + get_loc_elem, + get_loc_elem_glb_idx, + set_loc_elem_glb_idx, + get_loc_elem_parent_idx, + set_loc_elem_parent_idx, + get_loc_elem_child_idx, + set_loc_elem_child_idx, + get_loc_elem_level_idx, + set_loc_elem_level_idx, + get_loc_elem_vertex_indices, + get_loc_elem_vertex_indices_of_array, + get_loc_elem_vertex_idx, + set_loc_elem_vertex_idx, + get_loc_elem_neighbor_indices, + get_loc_elem_neighbor_idx, + set_loc_elem_neighbor_idx, + get_loc_entity_parent, + get_loc_entity_children, + alloc_glb_elems, + get_glb_elem, + copy_glb_elems, + sort_glb_elems, + get_glb_elem_idx, + get_glb_elem_level, + get_glb_elem_vertices, + get_glb_elem_neighbors, + set_geom_boundary_elem_flag, + is_geom_boundary_elem, + is_boundary_facet, + is_boundary_face, +}; diff --git a/src/h5core/h5t_adjacencies.c b/src/h5core/h5t_adjacencies.c new file mode 100644 index 0000000..ae414c7 --- /dev/null +++ b/src/h5core/h5t_adjacencies.c @@ -0,0 +1,56 @@ +/* + Copyright (c) 2006-2012, The Regents of the University of California, + through Lawrence Berkeley National Laboratory (subject to receipt of any + required approvals from the U.S. Dept. of Energy) and the Paul Scherrer + Institut (Switzerland). All rights reserved. + + License: see file COPYING in top level of source distribution. +*/ + +#include "h5core/h5.h" + +#include "h5t_types_private.h" +#include "h5t_adjacencies_private.h" +#include "h5t_map_private.h" +#include "h5t_core_private.h" + +#include + +h5_err_t +h5t_get_adjacencies ( + h5t_mesh_t* const m, + const h5_loc_id_t entity_id, + const h5_int32_t dim, + h5_loc_idlist_t** list + ) { + H5_CORE_API_ENTER (h5_err_t, + "m=%p, entity_id=%llu, dim=%d, list=%p", + m, (long long unsigned)entity_id, dim, list); + H5_CORE_API_RETURN (h5tpriv_get_adjacencies (m, entity_id, dim, list)); +} + +h5_err_t +h5t_release_list_of_adjacencies ( + h5t_mesh_t* const m, + h5_loc_idlist_t** list + ) { + H5_CORE_API_ENTER (h5_err_t, "m=%p, list=%p", m, list); + UNUSED_ARGUMENT (m); + H5_CORE_API_RETURN (h5priv_free_loc_idlist (list)); +} + +h5_err_t +h5t_find_te2 ( + h5t_mesh_t* const m, + h5_loc_idx_t face_idx, + h5_loc_idx_t elem_idx, + h5_loc_idlist_t** retval + ) { + H5_CORE_API_ENTER (h5_err_t, + "m=%p, face_idx=%lld, elem_idx=%lld, retval=%p", + m, + (long long)face_idx, + (long long)elem_idx, + retval); + H5_CORE_API_RETURN (h5tpriv_find_te2 (m,face_idx,elem_idx,retval)); +} diff --git a/src/h5core/h5t_adjacencies_private.h b/src/h5core/h5t_adjacencies_private.h new file mode 100644 index 0000000..51f6fb9 --- /dev/null +++ b/src/h5core/h5t_adjacencies_private.h @@ -0,0 +1,44 @@ +/* + Copyright (c) 2006-2013, The Regents of the University of California, + through Lawrence Berkeley National Laboratory (subject to receipt of any + required approvals from the U.S. Dept. of Energy) and the Paul Scherrer + Institut (Switzerland). All rights reserved. + + License: see file COPYING in top level of source distribution. +*/ + +#ifndef __H5T_ADJACENCIES_PRIVATE_H +#define __H5T_ADJACENCIES_PRIVATE_H + +#include "h5core/h5_types.h" +#include "h5t_types_private.h" +#include "h5_debug_private.h" + +struct h5t_adjacency_methods { + h5_err_t (*get_adjacencies)( + h5t_mesh_t* const, + const h5_loc_id_t, const h5_int32_t, h5_loc_idlist_t**); +}; + +extern struct h5t_adjacency_methods h5tpriv_trim_adjacency_methods; +extern struct h5t_adjacency_methods h5tpriv_tetm_adjacency_methods; + +static inline h5_err_t +h5tpriv_get_adjacencies ( + h5t_mesh_t* const m, + const h5_loc_id_t entity_id, + const h5_int32_t dim, + h5_loc_idlist_t** list + ) { + H5_PRIV_API_ENTER (h5_err_t, + "m=%p, entity_id=%lld, dim=%d, list=%p", + m, (long long)entity_id, dim, list); + if (m->methods->adjacency == NULL) { + H5_PRIV_API_LEAVE (h5_error_internal ()); + } + H5_PRIV_API_RETURN (m->methods->adjacency->get_adjacencies( + m, entity_id, dim, list)); +} + + +#endif diff --git a/src/h5core/h5t_adjacencies_tetm.c b/src/h5core/h5t_adjacencies_tetm.c new file mode 100644 index 0000000..3675cef --- /dev/null +++ b/src/h5core/h5t_adjacencies_tetm.c @@ -0,0 +1,802 @@ +/* + Copyright (c) 2006-2012, The Regents of the University of California, + through Lawrence Berkeley National Laboratory (subject to receipt of any + required approvals from the U.S. Dept. of Energy) and the Paul Scherrer + Institut (Switzerland). All rights reserved. + + License: see file COPYING in top level of source distribution. +*/ + +#include "h5_maps_private.h" +#include "h5t_core_private.h" +#include "h5t_types_private.h" +#include "h5t_model_private.h" +#include "h5t_map_private.h" +#include "h5t_access_private.h" +#include "h5t_adjacencies_private.h" + +#include + +#define H5_LOC_ELEM_T h5_loc_tet_t + + +/* + For the computation of some adjacency relations we need to know either + the descendant or the sections of a triangle or an edge. We use the term + "descendant" for the set of all grandchildren and "sections" for the + descendant of the entity which has been refined most. The following + example helps to show the difference: + + We want to know the descendant and sections of the edge (0,1). Let (0,1) + be an edge of the tetrahedra T_i and T_j. Let the edge (0,1) in T_i be + + 0---3---2-------1 + + and in T_j: + + 0---3-4-2-------1 + + We have the following descendants: + (0,3), (3,2), (2,1), (3,4), (4,2) + + and the sections: + (0,3), (3,4), (4,2), (2,1) + + Note: (3,2) is *not* a section of (0,1) + */ +static inline h5_err_t +get_descendant_of_edge ( + h5t_mesh_t* const m, + h5_loc_id_t entity_id, + h5_loc_idlist_t** children + ) { + H5_PRIV_FUNC_ENTER (h5_err_t, + "m=%p, entity_id=%llu, children=%p", + m, + (long long unsigned)entity_id, + children); + h5_loc_idlist_t* te = NULL; + TRY( h5tpriv_find_te (m, entity_id, &te ) ); + h5_loc_id_t* edge_idp = te->items; + h5_loc_id_t* end = te->items+te->num_items; + do { + h5_loc_id_t edge_ids[2] = {-1,-1}; + TRY (h5tpriv_get_loc_entity_children (m, *edge_idp, edge_ids)); + if (edge_ids[0] == -1) { + TRY( h5priv_insert_into_loc_idlist (children, *edge_idp, -1) ); + } else { + TRY( get_descendant_of_edge (m, edge_ids[0], children) ); + TRY( get_descendant_of_edge (m, edge_ids[1], children) ); + } + } while (++edge_idp < end); + H5_PRIV_FUNC_RETURN (H5_SUCCESS); +} + +static inline h5_err_t +get_sections_of_edge ( + h5t_mesh_t* const m, + h5_loc_id_t entity_id, + h5_loc_idlist_t** children + ) { + H5_PRIV_FUNC_ENTER (h5_err_t, + "m=%p, entity_id=%llu, children=%p", + m, + (long long unsigned)entity_id, + children); + h5_loc_idlist_t* te = NULL; + TRY( h5tpriv_find_te (m, entity_id, &te) ); + h5_loc_id_t* edge_idp = te->items; + h5_loc_id_t* end = te->items+te->num_items; + int refined = 0; + do { + h5_loc_id_t edge_ids[2] = {-1,-1}; + TRY (h5tpriv_get_loc_entity_children (m, *edge_idp, edge_ids)); + if (edge_ids[0] >= 0) { + refined = 1; + TRY (get_sections_of_edge (m, edge_ids[0], children)); + TRY (get_sections_of_edge (m, edge_ids[1], children)); + } + } while (++edge_idp < end); + if (!refined) { + TRY( h5priv_insert_into_loc_idlist (children, te->items[0], -1) ); + } + H5_PRIV_FUNC_RETURN (H5_SUCCESS); +} + +static inline h5_err_t +get_descendant_of_triangle ( + h5t_mesh_t* const m, + h5_loc_id_t entity_id, + h5_loc_idlist_t** children + ) { + H5_PRIV_FUNC_ENTER (h5_err_t, + "m=%p, entity_id=%llu, children=%p", + m, + (long long unsigned)entity_id, + children); + h5_loc_idlist_t* td; + TRY( h5tpriv_find_td (m, entity_id, &td) ); + h5_loc_id_t* triangle_idp = td->items; + h5_loc_id_t* end = td->items+td->num_items; + do { + h5_loc_id_t triangle_ids[4] = {-1,-1,-1,-1}; + TRY (h5tpriv_get_loc_entity_children (m, *triangle_idp, triangle_ids)); + + if (triangle_ids[0] == -1) { + TRY (h5priv_insert_into_loc_idlist (children, *triangle_idp, -1) ); + } else { + TRY (get_descendant_of_triangle (m, triangle_ids[0], children)); + TRY (get_descendant_of_triangle (m, triangle_ids[1], children)); + TRY (get_descendant_of_triangle (m, triangle_ids[2], children)); + TRY (get_descendant_of_triangle (m, triangle_ids[3], children)); + } + } while (++triangle_idp < end); + H5_PRIV_FUNC_RETURN (H5_SUCCESS); +} + +static inline h5_err_t +get_sections_of_triangle ( + h5t_mesh_t* const m, + h5_loc_id_t entity_id, + h5_loc_idlist_t** children + ) { + H5_PRIV_FUNC_ENTER (h5_err_t, + "m=%p, entity_id=%llu, children=%p", + m, + (long long unsigned)entity_id, + children); + h5_loc_idlist_t* td; + TRY (h5tpriv_find_td (m, entity_id, &td)); + h5_loc_id_t* triangle_idp = td->items; + h5_loc_id_t* end = td->items+td->num_items; + int refined = 0; + do { + h5_loc_id_t triangle_ids[4] = {-1,-1,-1,-1}; + TRY (h5tpriv_get_loc_entity_children (m, *triangle_idp, triangle_ids)); + if (triangle_ids[0] >= 0) { + refined = 1; + TRY (get_sections_of_triangle (m, triangle_ids[0], children)); + TRY (get_sections_of_triangle (m, triangle_ids[1], children)); + TRY (get_sections_of_triangle (m, triangle_ids[2], children)); + TRY (get_sections_of_triangle (m, triangle_ids[3], children)); + } + } while (++triangle_idp < end); + if (!refined) { + TRY( h5priv_insert_into_loc_idlist (children, td->items[0], -1) ); + } + H5_PRIV_FUNC_RETURN (H5_SUCCESS); +} + +/* + Add unique ID of vertex given by face and element index to list. + */ +static inline h5_err_t +add_vertex2 ( + h5t_mesh_t* const m, // in + h5_loc_idlist_t** list, // out + h5_loc_idx_t face_idx, // in + h5_loc_idx_t elem_idx // in + ) { + H5_PRIV_FUNC_ENTER (h5_err_t, + "m=%p, list=%p, face_idx=%llu, elem_idx=%llu", + m, list, + (long long unsigned)face_idx, + (long long unsigned)elem_idx); + h5_loc_idlist_t* tv; + TRY( h5tpriv_find_tv2 (m, face_idx, elem_idx, &tv) ); + TRY( h5priv_search_in_loc_idlist (list, tv->items[0]) ); + H5_PRIV_FUNC_RETURN (H5_SUCCESS); +} + +/* + Add unique ID of edge given by ID or face and element index. + */ +static inline h5_err_t +add_edge ( + h5t_mesh_t* const m, // in + h5_loc_idlist_t** list, // out + h5_loc_id_t entity_id // in + ) { + H5_PRIV_FUNC_ENTER (h5_err_t, + "m=%p, list=%p, entity_id=%llu", + m, list, + (long long unsigned)entity_id); + h5_loc_idlist_t* te = NULL; + TRY( h5tpriv_find_te (m, entity_id, &te) ); + TRY( h5priv_search_in_loc_idlist (list, te->items[0]) ); + H5_PRIV_FUNC_RETURN (H5_SUCCESS); +} + +static inline h5_err_t +add_edge2 ( + h5t_mesh_t* const m, // in + h5_loc_idlist_t** list, // out + h5_loc_idx_t face_idx, // in + h5_loc_idx_t elem_idx // in + ) { + H5_PRIV_FUNC_ENTER (h5_err_t, + "m=%p, list=%p, face_idx=%llu, elem_idx=%llu", + m, list, + (long long unsigned)face_idx, + (long long unsigned)elem_idx); + h5_loc_idlist_t* te; + TRY( h5tpriv_find_te2 (m, face_idx, elem_idx, &te) ); + TRY( h5priv_search_in_loc_idlist (list, te->items[0]) ); + H5_PRIV_FUNC_RETURN (H5_SUCCESS); +} + +/* + Add unique ID of triangle given by ID or face and element index. + */ +static inline h5_err_t +add_triangle ( + h5t_mesh_t* const m, // in + h5_loc_idlist_t** list, // out + h5_loc_idx_t entity_id // in + ) { + H5_PRIV_FUNC_ENTER (h5_err_t, + "m=%p, list=%p, entity_id=%llu", + m, list, + (long long unsigned)entity_id); + h5_loc_idlist_t* td; + TRY( h5tpriv_find_td (m, entity_id, &td) ); + TRY( h5priv_search_in_loc_idlist (list, td->items[0]) ); + + H5_PRIV_FUNC_RETURN (H5_SUCCESS); +} + +static inline h5_err_t +add_triangle2 ( + h5t_mesh_t* const m, // in + h5_loc_idlist_t** list, // out + h5_loc_idx_t face_idx, // in + h5_loc_idx_t elem_idx // in + ) { + H5_PRIV_FUNC_ENTER (h5_err_t, + "m=%p, list=%p, face_idx=%llu, elem_idx=%llu", + m, list, + (long long unsigned)face_idx, + (long long unsigned)elem_idx); + h5_loc_idlist_t* td; + TRY( h5tpriv_find_td2 (m, face_idx, elem_idx, &td) ); + TRY( h5priv_search_in_loc_idlist (list, td->items[0]) ); + + H5_PRIV_FUNC_RETURN (H5_SUCCESS); +} + +static inline h5_err_t +add_elem2 ( + h5_loc_idlist_t** list, // out + h5_loc_idx_t elem_idx // in + ) { + H5_PRIV_FUNC_ENTER (h5_err_t, + "list=%p, elem_idx=%llu", + list, + (long long unsigned)elem_idx); + h5_loc_id_t elem_id = h5tpriv_build_tet_id ((h5_loc_idx_t)0, elem_idx); + TRY( h5priv_search_in_loc_idlist (list, elem_id) ); + + H5_PRIV_FUNC_RETURN (H5_SUCCESS); +} + +/* + Get upward adjacent edges to vertex given by ID. + */ +static inline h5_err_t +get_edges_uadj_to_vertex ( + h5t_mesh_t* const m, + const h5_loc_id_t entity_id, + h5_loc_idlist_t** list + ) { + H5_PRIV_FUNC_ENTER (h5_err_t, + "m=%p, entity_id=%llu, list=%p", + m, (long long unsigned)entity_id, list); + h5_loc_idx_t vertex_idx; + TRY( h5tpriv_get_vertex_index_of_vertex (m, entity_id, &vertex_idx) ); + h5_loc_idlist_t* tv = m->adjacencies.tv.v[vertex_idx]; + + TRY( h5priv_alloc_loc_idlist (list, 8) ); + h5_loc_id_t* vertex_idp = tv->items; + h5_loc_id_t* end = vertex_idp + tv->num_items; + do { + h5_loc_idx_t elem_idx = h5tpriv_get_elem_idx (*vertex_idp); + h5_loc_idx_t face_idx = h5tpriv_get_face_idx (*vertex_idp); + H5_LOC_ELEM_T* elem = ((H5_LOC_ELEM_T*)m->loc_elems)+elem_idx; + + if (!h5tpriv_is_leaf_elem (m, elem)) { + continue; + } + TRY( add_edge2 (m, list, + h5tpriv_ref_elem_get_edge_idx ( + m, 0, face_idx, 0), + elem_idx) ); + TRY( add_edge2 (m, list, + h5tpriv_ref_elem_get_edge_idx ( + m, 0, face_idx, 1), + elem_idx) ); + TRY( add_edge2 (m, list, + h5tpriv_ref_elem_get_edge_idx ( + m, 0, face_idx, 2), + elem_idx) ); + } while (++vertex_idp < end); + H5_PRIV_FUNC_RETURN (H5_SUCCESS); +} + +static inline h5_err_t +get_triangles_uadj_to_vertex ( + h5t_mesh_t* const m, + const h5_loc_id_t entity_id, + h5_loc_idlist_t** list + ) { + H5_PRIV_FUNC_ENTER (h5_err_t, + "m=%p, entity_id=%llu, list=%p", + m, (long long unsigned)entity_id, list); + /* get list of all tetrahedra connected to given vertex + Note: this list may include tetrahedra which are not in + the (current) leaf grid */ + h5_loc_idx_t vertex_idx; + TRY( h5tpriv_get_vertex_index_of_vertex (m, entity_id, &vertex_idx) ); + h5_loc_idlist_t* tv = m->adjacencies.tv.v[vertex_idx]; + + // build list of upward adjacent triangles + TRY( h5priv_alloc_loc_idlist (list, 8) ); + h5_loc_id_t* vertex_idp = tv->items; + h5_loc_id_t* end = vertex_idp + tv->num_items; + do { + h5_loc_idx_t elem_idx = h5tpriv_get_elem_idx (*vertex_idp); + h5_loc_idx_t face_idx = h5tpriv_get_face_idx (*vertex_idp); + H5_LOC_ELEM_T* elem = ((H5_LOC_ELEM_T*)m->loc_elems) + elem_idx; + if (!h5tpriv_is_leaf_elem (m, elem)) { + continue; + } + TRY( add_triangle2 (m, list, + h5tpriv_ref_elem_get_triangle_idx ( + m, 0, face_idx, 0), + elem_idx) ); + TRY( add_triangle2 (m, list, + h5tpriv_ref_elem_get_triangle_idx ( + m, 0, face_idx, 1), + elem_idx) ); + TRY( add_triangle2 (m, list, + h5tpriv_ref_elem_get_triangle_idx ( + m, 0, face_idx, 2), + elem_idx) ); + } while (++vertex_idp < end); + H5_PRIV_FUNC_RETURN (H5_SUCCESS); +} + +static inline h5_err_t +get_tets_uadj_to_vertex ( + h5t_mesh_t* const m, + const h5_loc_id_t entity_id, + h5_loc_idlist_t** list + ) { + H5_PRIV_FUNC_ENTER (h5_err_t, + "m=%p, entity_id=%llu, list=%p", + m, (long long unsigned)entity_id, list); + h5_loc_idx_t vertex_idx; + TRY( h5tpriv_get_vertex_index_of_vertex (m, entity_id, &vertex_idx) ); + h5_loc_idlist_t* tv = m->adjacencies.tv.v[vertex_idx]; + + TRY( h5priv_alloc_loc_idlist (list, 8) ); + h5_loc_id_t* vertex_idp = tv->items; + h5_loc_id_t* end = vertex_idp + tv->num_items; + do { + h5_loc_idx_t elem_idx = h5tpriv_get_elem_idx (*vertex_idp); + H5_LOC_ELEM_T* elem = ((H5_LOC_ELEM_T*)m->loc_elems) + elem_idx; + if (!h5tpriv_is_leaf_elem (m, elem)) { + continue; + } + TRY( add_elem2 (list, elem_idx) ); + } while (++vertex_idp < end); + H5_PRIV_FUNC_RETURN (H5_SUCCESS); +} + +static inline h5_err_t +get_triangles_uadj_to_edge ( + h5t_mesh_t* const m, + const h5_loc_id_t entity_id, + h5_loc_idlist_t** list + ) { + H5_PRIV_FUNC_ENTER (h5_err_t, + "m=%p, entity_id=%llu, list=%p", + m, (long long unsigned)entity_id, list); + h5_loc_idlist_t* children; + TRY( h5priv_alloc_loc_idlist (&children, 8) ); + TRY( get_descendant_of_edge (m, entity_id, &children) ); + TRY( h5priv_alloc_loc_idlist (list, 8) ); + h5_loc_id_t* edge_idp = children->items; + h5_loc_id_t* end = children->items+children->num_items; + do { + h5_loc_idx_t elem_idx = h5tpriv_get_elem_idx (*edge_idp); + h5_loc_idx_t face_idx = h5tpriv_get_face_idx (*edge_idp); + TRY( add_triangle2 (m, list, + h5tpriv_ref_elem_get_triangle_idx ( + m, 1, face_idx, 0), + elem_idx) ); + TRY( add_triangle2 (m, list, + h5tpriv_ref_elem_get_triangle_idx ( + m, 1, face_idx, 1), + elem_idx) ); + } while (++edge_idp < end); + TRY (h5priv_free_loc_idlist (&children)); + + H5_PRIV_FUNC_RETURN (H5_SUCCESS); +} + +static inline h5_err_t +get_tets_uadj_to_edge ( + h5t_mesh_t* const m, + const h5_loc_id_t entity_id, + h5_loc_idlist_t** list + ) { + H5_PRIV_FUNC_ENTER (h5_err_t, + "m=%p, entity_id=%llu, list=%p", + m, (long long unsigned)entity_id, list); + h5_loc_idlist_t* children; + TRY( h5priv_alloc_loc_idlist (&children, 8) ); + TRY( get_descendant_of_edge (m, entity_id, &children) ); + TRY( h5priv_alloc_loc_idlist (list, 8) ); + h5_loc_id_t* edge_idp = children->items; + h5_loc_id_t* end = children->items+children->num_items; + do { + TRY( add_elem2 (list, h5tpriv_get_elem_idx (*edge_idp)) ); + } while (++edge_idp < end); + TRY( h5priv_free_loc_idlist (&children) ); + H5_PRIV_FUNC_RETURN (H5_SUCCESS); +} + +static inline h5_err_t +get_tets_uadj_to_triangle ( + h5t_mesh_t* const m, + const h5_loc_id_t entity_id, + h5_loc_idlist_t** list + ) { + H5_PRIV_FUNC_ENTER (h5_err_t, + "m=%p, entity_id=%llu, list=%p", + m, (long long unsigned)entity_id, list); + h5_loc_idlist_t* children; + TRY( h5priv_alloc_loc_idlist (&children, 8) ); + TRY( get_descendant_of_triangle (m, entity_id, &children) ); + TRY( h5priv_alloc_loc_idlist (list, 8) ); + h5_loc_id_t* triangle_idp = children->items; + h5_loc_id_t* end = triangle_idp + children->num_items; + do { + TRY( add_elem2 (list, h5tpriv_get_elem_idx (*triangle_idp)) ); + } while (++triangle_idp < end); + TRY( h5priv_free_loc_idlist (&children) ); + H5_PRIV_FUNC_RETURN (H5_SUCCESS); +} + +static inline h5_err_t +get_vertices_dadj_to_edge ( + h5t_mesh_t* const m, + const h5_loc_id_t entity_id, + h5_loc_idlist_t** list + ) { + H5_PRIV_FUNC_ENTER (h5_err_t, + "m=%p, entity_id=%llu, list=%p", + m, (long long unsigned)entity_id, list); + h5_loc_idlist_t* children; + TRY( h5priv_alloc_loc_idlist (&children, 8) ); + TRY( get_sections_of_edge (m, entity_id, &children) ); + // build list of unique vertex IDs + TRY( h5priv_alloc_loc_idlist (list, 8) ); + h5_loc_id_t* edge_idp = children->items; + h5_loc_id_t* end = edge_idp + children->num_items; + do { + h5_loc_idx_t elem_idx = h5tpriv_get_elem_idx (*edge_idp); + h5_loc_idx_t face_idx = h5tpriv_get_face_idx (*edge_idp); + + TRY( add_vertex2 (m, list, + h5tpriv_ref_elem_get_vertex_idx ( + m, 1, face_idx, 0), + elem_idx) ); + TRY( add_vertex2 (m, list, + h5tpriv_ref_elem_get_vertex_idx ( + m, 1, face_idx, 1), + elem_idx) ); + } while (++edge_idp < end); + TRY( h5priv_free_loc_idlist(&children) ); + H5_PRIV_FUNC_RETURN (H5_SUCCESS); +} + +/* + Compute downward adjacent vertices of all edges of triangle. + */ +static inline h5_err_t +get_vertices_dadj_to_triangle ( + h5t_mesh_t* const m, + const h5_loc_id_t entity_id, + h5_loc_idlist_t** list + ) { + H5_PRIV_FUNC_ENTER (h5_err_t, + "m=%p, entity_id=%llu, list=%p", + m, (long long unsigned)entity_id, list); + h5_loc_idlist_t* children; + TRY( h5priv_alloc_loc_idlist (&children, 8) ); + h5_loc_idx_t elem_idx = h5tpriv_get_elem_idx (entity_id); + h5_loc_idx_t face_idx = h5tpriv_get_face_idx (entity_id); + h5_loc_idx_t edge_idx; + int i; + // loop over all vertices of given triangle + for (i = 0; i < 3; i++) { + edge_idx = h5tpriv_ref_elem_get_edge_idx (m, 2, face_idx, i); + TRY( get_sections_of_edge ( + m, + h5tpriv_build_edge_id (edge_idx, elem_idx), + &children) ); + } + // build list of unique vertex IDs + TRY( h5priv_alloc_loc_idlist (list, 8) ); + h5_loc_id_t* edge_idp = children->items; + h5_loc_id_t* end = edge_idp + children->num_items; + do { + elem_idx = h5tpriv_get_elem_idx (*edge_idp); + edge_idx = h5tpriv_get_face_idx (*edge_idp); + + TRY( add_vertex2 (m, list, + h5tpriv_ref_elem_get_vertex_idx ( + m, 1, edge_idx, 0), + elem_idx) ); + TRY( add_vertex2 (m, list, + h5tpriv_ref_elem_get_vertex_idx ( + m, 1, edge_idx, 1), + elem_idx) ); + } while (++edge_idp < end ); + TRY( h5priv_free_loc_idlist(&children) ); + H5_PRIV_FUNC_RETURN (H5_SUCCESS); +} + +/* + Compute downward adjacent vertices to tetrahedron given by ID. + */ +static inline h5_err_t +get_vertices_dadj_to_tet ( + h5t_mesh_t* const m, + const h5_loc_id_t entity_id, + h5_loc_idlist_t** list + ) { + H5_PRIV_FUNC_ENTER (h5_err_t, + "m=%p, entity_id=%llu, list=%p", + m, (long long unsigned)entity_id, list); + h5_loc_idlist_t* children; + h5_loc_idx_t elem_idx = h5tpriv_get_elem_idx (entity_id); + TRY( h5priv_alloc_loc_idlist (&children, 8) ); + // loop over all edges of tetrahedron + h5_loc_idx_t edge_idx = h5tpriv_ref_elem_get_num_edges(m); + while (--edge_idx >= 0) { + TRY( get_sections_of_edge ( + m, + h5tpriv_build_edge_id ( edge_idx, elem_idx ), + &children) ); + } + // build list of unique vertex IDs + TRY( h5priv_alloc_loc_idlist (list, 8) ); + h5_loc_id_t* edge_idp = children->items; + h5_loc_id_t* end = edge_idp + children->num_items; + do { + elem_idx = h5tpriv_get_elem_idx (*edge_idp); + edge_idx = h5tpriv_get_face_idx (*edge_idp); + + TRY( add_vertex2 (m, list, + h5tpriv_ref_elem_get_vertex_idx ( + m, 1, edge_idx, 0), + elem_idx) ); + TRY( add_vertex2 (m, list, + h5tpriv_ref_elem_get_vertex_idx ( + m, 1, edge_idx, 1), + elem_idx) ); + } while (++edge_idp < end); + TRY( h5priv_free_loc_idlist(&children) ); + H5_PRIV_FUNC_RETURN (H5_SUCCESS); +} + +static inline h5_err_t +get_edges_dadj_to_triangle ( + h5t_mesh_t* const m, + const h5_loc_id_t entity_id, + h5_loc_idlist_t** list + ) { + H5_PRIV_FUNC_ENTER (h5_err_t, + "m=%p, entity_id=%llu, list=%p", + m, (long long unsigned)entity_id, list); + h5_loc_idlist_t* children; + TRY( h5priv_alloc_loc_idlist (&children, 8) ); + h5_loc_idx_t face_idx = h5tpriv_get_face_idx (entity_id); + h5_loc_idx_t elem_idx = h5tpriv_get_elem_idx (entity_id); + // loop over all three edges of triangle + h5_loc_idx_t i; + for (i = 0; i < 3; i++) { + TRY( get_sections_of_edge ( + m, + h5tpriv_build_edge_id ( + h5tpriv_ref_elem_get_edge_idx ( + m, 2, face_idx, i), + elem_idx ), + &children) ); + } + // build list of unique edge IDs + TRY( h5priv_alloc_loc_idlist (list, 8) ); + h5_loc_id_t* edge_idp = children->items; + h5_loc_id_t* end = edge_idp + children->num_items; + do { + TRY( add_edge (m, list, *edge_idp) ); + } while (++edge_idp < end); + TRY( h5priv_free_loc_idlist (&children) ); + H5_PRIV_FUNC_RETURN (H5_SUCCESS); +} + +static inline h5_err_t +get_edges_dadj_to_tet ( + h5t_mesh_t* const m, + const h5_loc_id_t elem_id, + h5_loc_idlist_t** list + ) { + H5_PRIV_FUNC_ENTER (h5_err_t, + "m=%p, elem_id=%llu, list=%p", + m, (long long unsigned)elem_id, list); + h5_loc_idlist_t* children; + TRY( h5priv_alloc_loc_idlist (&children, 8) ); + h5_loc_idx_t elem_idx = h5tpriv_get_elem_idx (elem_id); + + // loop over all edges of tet + h5_loc_idx_t edge_idx = h5tpriv_ref_elem_get_num_edges(m); + while (--edge_idx >= 0) { + TRY( get_sections_of_edge ( + m, + h5tpriv_build_edge_id (edge_idx, elem_idx), + &children) ); + } + // build list of unique edge IDs + TRY( h5priv_alloc_loc_idlist (list, 8) ); + h5_loc_id_t* edge_idp = children->items; + h5_loc_id_t* end = edge_idp + children->num_items; + do { + TRY( add_edge (m, list, *edge_idp) ); + } while (++edge_idp < end); + TRY( h5priv_free_loc_idlist (&children) ); + H5_PRIV_FUNC_RETURN (H5_SUCCESS); +} + +static inline h5_err_t +get_triangles_dadj_to_tet ( + h5t_mesh_t* const m, + const h5_loc_id_t entity_id, + h5_loc_idlist_t** list + ) { + H5_PRIV_FUNC_ENTER (h5_err_t, + "m=%p, entity_id=%llu, list=%p", + m, (long long unsigned)entity_id, list); + h5_loc_idlist_t* children; + TRY( h5priv_alloc_loc_idlist (&children, 8) ); + h5_loc_idx_t elem_idx = h5tpriv_get_elem_idx (entity_id); + // loop over all triangle of element + h5_loc_idx_t triangle_idx = h5tpriv_ref_elem_get_num_facets(m); + while (--triangle_idx >= 0) { + TRY( get_sections_of_triangle ( + m, + h5tpriv_build_edge_id (triangle_idx, elem_idx), + &children) ); + } + TRY( h5priv_alloc_loc_idlist (list, 8) ); + h5_loc_id_t* triangle_idp = children->items; + h5_loc_id_t* end = triangle_idp + children->num_items; + do { + TRY( add_triangle (m, list, *triangle_idp) ); + } while (++triangle_idp < end); + TRY( h5priv_free_loc_idlist (&children) ); + H5_PRIV_FUNC_RETURN (H5_SUCCESS); +} + +static inline h5_err_t +dim_error( + const h5_int32_t dim + ) { + return h5_error ( + H5_ERR_INVAL, + "Illegal dimension %ld", (long)dim); +} + +static inline h5_err_t +get_adjacencies_to_vertex ( + h5t_mesh_t* const m, + const h5_loc_id_t entity_id, + const h5_int32_t dim, + h5_loc_idlist_t** list + ) { + switch (dim) { + case 1: + return get_edges_uadj_to_vertex(m, entity_id, list); + case 2: + return get_triangles_uadj_to_vertex(m, entity_id, list); + case 3: + return get_tets_uadj_to_vertex(m, entity_id, list); + default: + return dim_error (dim); + } +} + +static inline h5_err_t +get_adjacencies_to_edge ( + h5t_mesh_t* const m, + const h5_loc_id_t entity_id, + const h5_int32_t dim, + h5_loc_idlist_t** list + ) { + switch (dim) { + case 0: + return get_vertices_dadj_to_edge(m, entity_id, list); + case 2: + return get_triangles_uadj_to_edge(m, entity_id, list); + case 3: + return get_tets_uadj_to_edge(m, entity_id, list); + default: + return dim_error (dim); + } +} + +static inline h5_err_t +get_adjacencies_to_triangle ( + h5t_mesh_t* const m, + const h5_loc_id_t entity_id, + const h5_int32_t dim, + h5_loc_idlist_t** list + ) { + switch (dim) { + case 0: + return get_vertices_dadj_to_triangle(m, entity_id, list); + case 1: + return get_edges_dadj_to_triangle(m, entity_id, list); + case 3: + return get_tets_uadj_to_triangle(m, entity_id, list); + default: + return dim_error (dim); + } +} + +static inline h5_err_t +get_adjacencies_to_tet ( + h5t_mesh_t* const m, + const h5_loc_id_t entity_id, + const h5_int32_t dim, + h5_loc_idlist_t** list + ) { + switch (dim) { + case 0: + return get_vertices_dadj_to_tet(m, entity_id, list); + case 1: + return get_edges_dadj_to_tet(m, entity_id, list); + case 2: + return get_triangles_dadj_to_tet(m, entity_id, list); + default: + return dim_error (dim); + } +} + +static h5_err_t +get_adjacencies ( + h5t_mesh_t* const m, + const h5_loc_id_t entity_id, + const h5_int32_t dim, + h5_loc_idlist_t** list + ) { + h5_loc_id_t entity_type = h5tpriv_get_entity_type (entity_id); + switch (entity_type) { + case H5T_TYPE_VERTEX: + return get_adjacencies_to_vertex (m, entity_id, dim, list); + case H5T_TYPE_EDGE: + return get_adjacencies_to_edge (m, entity_id, dim, list); + case H5T_TYPE_TRIANGLE: + return get_adjacencies_to_triangle (m, entity_id, dim, list); + case H5T_TYPE_TET: + return get_adjacencies_to_tet (m, entity_id, dim, list); + default: + break; + } + return h5_error_internal (); +} +struct h5t_adjacency_methods h5tpriv_tetm_adjacency_methods = { + get_adjacencies, +}; + diff --git a/src/h5core/h5t_adjacencies_trim.c b/src/h5core/h5t_adjacencies_trim.c new file mode 100644 index 0000000..8c3df0a --- /dev/null +++ b/src/h5core/h5t_adjacencies_trim.c @@ -0,0 +1,466 @@ +/* + Copyright (c) 2006-2012, The Regents of the University of California, + through Lawrence Berkeley National Laboratory (subject to receipt of any + required approvals from the U.S. Dept. of Energy) and the Paul Scherrer + Institut (Switzerland). All rights reserved. + + License: see file COPYING in top level of source distribution. +*/ + +#include "h5t_types_private.h" +#include "h5t_model_private.h" +#include "h5t_map_private.h" +#include "h5t_access_private.h" +#include "h5t_adjacencies_private.h" +#include "h5t_core_private.h" + +#include + +#define H5_LOC_ELEM_T h5_loc_tri_t + +/* + Please read the note about "descendants" and "sections" in the + corresponding file for tetrahedral meshes. + */ +static inline h5_err_t +get_descendant_of_edge ( + h5t_mesh_t* const m, + h5_loc_id_t entity_id, + h5_loc_idlist_t** children + ) { + H5_PRIV_FUNC_ENTER (h5_err_t, + "m=%p, entity_id=%llu, children=%p", + m, + (long long unsigned)entity_id, + children); + h5_loc_idlist_t* te; + TRY( h5tpriv_find_te (m, entity_id, &te ) ); + h5_loc_id_t* edge_idp = te->items; + h5_loc_id_t* end = te->items + te->num_items; + do { + h5_loc_id_t edge_ids[2] = {-1,-1}; + TRY (h5tpriv_get_loc_entity_children (m, *edge_idp, edge_ids)); + if (edge_ids[0] == -1) { + TRY( h5priv_insert_into_loc_idlist (children, *edge_idp, -1) ); + } else { + TRY( get_descendant_of_edge (m, edge_ids[0], children) ); + TRY( get_descendant_of_edge (m, edge_ids[1], children) ); + } + } while (++edge_idp < end); + + H5_PRIV_FUNC_RETURN (H5_SUCCESS); +} + +static inline h5_err_t +get_sections_of_edge ( + h5t_mesh_t* const m, + h5_loc_id_t entity_id, + h5_loc_idlist_t** children + ) { + H5_PRIV_FUNC_ENTER (h5_err_t, + "m=%p, entity_id=%llu, children=%p", + m, + (long long unsigned)entity_id, + children); + h5_loc_idlist_t* te; + TRY (h5tpriv_find_te (m, entity_id, &te)); + h5_loc_id_t* edge_idp = te->items; + h5_loc_id_t *end = te->items+te->num_items; + int refined = 0; + do { + h5_loc_id_t edge_ids[2] = {-1,-1}; + TRY (h5tpriv_get_loc_entity_children (m, *edge_idp, edge_ids)); + if (edge_ids[0] >= 0) { + refined = 1; + TRY (get_sections_of_edge (m, edge_ids[0], children)); + TRY (get_sections_of_edge (m, edge_ids[1], children)); + } + } while (++edge_idp < end); + if (!refined) { + TRY (h5priv_insert_into_loc_idlist (children, te->items[0], -1)); + } + H5_PRIV_FUNC_RETURN (H5_SUCCESS); +} + +/* + Add unique ID of vertex given by face and element index to list. + */ +static inline h5_err_t +add_vertex2 ( + h5t_mesh_t* const m, // in + h5_loc_idlist_t** list, // out + h5_loc_idx_t face_idx, // in + h5_loc_idx_t elem_idx // in + ) { + H5_PRIV_FUNC_ENTER (h5_err_t, + "m=%p, list=%p, face_idx=%llu, elem_idx=%llu", + m, list, + (long long unsigned)face_idx, + (long long unsigned)elem_idx); + h5_loc_idlist_t* tv; + TRY( h5tpriv_find_tv2 (m, face_idx, elem_idx, &tv) ); + TRY( h5priv_search_in_loc_idlist (list, tv->items[0]) ); + H5_PRIV_FUNC_RETURN (H5_SUCCESS); +} + +/* + Add unique ID of edge given by ID or face and element index. + */ +static inline h5_err_t +add_edge ( + h5t_mesh_t* const m, // in + h5_loc_idlist_t** list, // out + h5_loc_id_t entity_id // in + ) { + H5_PRIV_FUNC_ENTER (h5_err_t, + "m=%p, list=%p, entity_id=%llu", + m, list, + (long long unsigned)entity_id); + h5_loc_idlist_t* te; + TRY( h5tpriv_find_te (m, entity_id, &te) ); + TRY( h5priv_search_in_loc_idlist (list, te->items[0]) ); + H5_PRIV_FUNC_RETURN (H5_SUCCESS); +} + +static inline h5_err_t +add_edge2 ( + h5t_mesh_t* const m, + h5_loc_idlist_t** list, + h5_loc_idx_t face_idx, + h5_loc_idx_t elem_idx + ) { + H5_PRIV_FUNC_ENTER (h5_err_t, + "m=%p, list=%p, face_idx=%llu, elem_idx=%llu", + m, list, + (long long unsigned)face_idx, + (long long unsigned)elem_idx); + h5_loc_idlist_t *te; + TRY( h5tpriv_find_te2 (m, face_idx, elem_idx, &te) ); + TRY( h5priv_search_in_loc_idlist (list, te->items[0]) ); + H5_PRIV_FUNC_RETURN (H5_SUCCESS); +} + +static inline h5_err_t +add_elem2 ( + h5_loc_idlist_t** list, // out + h5_loc_idx_t elem_idx // in + ) { + H5_PRIV_FUNC_ENTER (h5_err_t, + "list=%p, elem_idx=%llu", + list, + (long long unsigned)elem_idx); + h5_loc_id_t elem_id = h5tpriv_build_triangle_id ((h5_loc_idx_t)0, elem_idx); + TRY( h5priv_search_in_loc_idlist (list, elem_id) ); + + H5_PRIV_FUNC_RETURN (H5_SUCCESS); +} + +/* + Get upward adjacent edges to vertex given by ID + */ +static inline h5_err_t +get_edges_uadj_to_vertex ( + h5t_mesh_t* const m, + const h5_loc_id_t entity_id, + h5_loc_idlist_t** list + ) { + H5_PRIV_FUNC_ENTER (h5_err_t, + "m=%p, entity_id=%llu, list=%p", + m, (long long unsigned)entity_id, list); + h5_loc_idx_t vertex_idx; + TRY( h5tpriv_get_vertex_index_of_vertex (m, entity_id, &vertex_idx) ); + h5_loc_idlist_t* tv = m->adjacencies.tv.v[vertex_idx]; + + TRY( h5priv_alloc_loc_idlist (list, 8) ); + h5_loc_id_t* vertex_idp = tv->items; + h5_loc_id_t* end = vertex_idp + tv->num_items; + do { + h5_loc_idx_t elem_idx = h5tpriv_get_elem_idx (*vertex_idp); + h5_loc_idx_t face_idx = h5tpriv_get_face_idx (*vertex_idp); + H5_LOC_ELEM_T* elem= ((H5_LOC_ELEM_T*)m->loc_elems) + elem_idx; + + if (!h5tpriv_is_leaf_elem (m, elem)) { + continue; + } + TRY( add_edge2 (m, list, + h5tpriv_ref_elem_get_edge_idx ( + m, 0, face_idx, 0), + elem_idx) ); + TRY( add_edge2 (m, list, + h5tpriv_ref_elem_get_edge_idx ( + m, 0, face_idx, 1), + elem_idx) ); + } while (++vertex_idp < end); + H5_PRIV_FUNC_RETURN (H5_SUCCESS); +} + +static inline h5_err_t +get_triangles_uadj_to_vertex ( + h5t_mesh_t* const m, + const h5_loc_id_t entity_id, + h5_loc_idlist_t** list + ) { + H5_PRIV_FUNC_ENTER (h5_err_t, + "m=%p, entity_id=%llu, list=%p", + m, (long long unsigned)entity_id, list); + h5_loc_idx_t vertex_idx; + TRY( h5tpriv_get_vertex_index_of_vertex (m, entity_id, &vertex_idx) ); + h5_loc_idlist_t* tv = m->adjacencies.tv.v[vertex_idx]; + + TRY ( h5priv_alloc_loc_idlist (list, 8) ); + h5_loc_id_t *vertex_idp = tv->items; + h5_loc_id_t* end = vertex_idp + tv->num_items; + do { + h5_loc_idx_t elem_idx = h5tpriv_get_elem_idx (*vertex_idp); + H5_LOC_ELEM_T* elem = ((H5_LOC_ELEM_T*)m->loc_elems) + elem_idx; + + if (!h5tpriv_is_leaf_elem (m, elem)) { + continue; + } + TRY (add_elem2 (list, elem_idx)); + } while (++vertex_idp < end); + H5_PRIV_FUNC_RETURN (H5_SUCCESS); +} + +static inline h5_err_t +get_triangles_uadj_to_edge ( + h5t_mesh_t* const m, + const h5_loc_id_t entity_id, + h5_loc_idlist_t** list + ) { + H5_PRIV_FUNC_ENTER (h5_err_t, + "m=%p, entity_id=%llu, list=%p", + m, (long long unsigned)entity_id, list); + h5_loc_idlist_t* children; + TRY( h5priv_alloc_loc_idlist (&children, 8) ); + TRY( get_descendant_of_edge (m, entity_id, &children) ); + TRY( h5priv_alloc_loc_idlist (list, 8) ); + h5_loc_id_t *edge_idp = children->items; + h5_loc_id_t *end = children->items+children->num_items; + do { + h5_loc_idx_t elem_idx = h5tpriv_get_elem_idx (*edge_idp); + TRY (add_elem2 (list, elem_idx)); + } while (++edge_idp < end); + TRY( h5priv_free_loc_idlist (&children) ); + + H5_PRIV_FUNC_RETURN (H5_SUCCESS); +} + +static inline h5_err_t +get_edges_adj_to_edge ( + h5t_mesh_t* const m, + const h5_loc_id_t entity_id, + h5_loc_idlist_t** list + ) { + H5_PRIV_FUNC_ENTER (h5_err_t, + "m=%p, entity_id=%llu, list=%p", + m, (long long unsigned)entity_id, list); + + TRY( h5priv_alloc_loc_idlist (list, 8) ); + h5_loc_idlist_t* children; + TRY( h5priv_alloc_loc_idlist (&children, 8) ); + TRY( get_sections_of_edge (m, entity_id, &children) ); + TRY( h5priv_alloc_loc_idlist (list, 8) ); + h5_loc_id_t* edge_idp = children->items; + h5_loc_id_t* end = children->items+children->num_items; + do { + TRY( add_edge (m, list, *edge_idp) ); + } while (++edge_idp < end); + TRY( h5priv_free_loc_idlist(&children) ); + H5_PRIV_FUNC_RETURN (H5_SUCCESS); +} + +static inline h5_err_t +get_vertices_dadj_to_edge ( + h5t_mesh_t* const m, + const h5_loc_id_t entity_id, + h5_loc_idlist_t** list + ) { + H5_PRIV_FUNC_ENTER (h5_err_t, + "m=%p, entity_id=%llu, list=%p", + m, (long long unsigned)entity_id, list); + h5_loc_idlist_t* children; + TRY( h5priv_alloc_loc_idlist (&children, 8) ); + TRY( get_sections_of_edge (m, entity_id, &children) ); + TRY( h5priv_alloc_loc_idlist (list, 8) ); + h5_loc_id_t* edge_idp = children->items; + h5_loc_id_t* end = edge_idp + children->num_items; + do { + h5_loc_idx_t elem_idx = h5tpriv_get_elem_idx (*edge_idp); + h5_loc_idx_t face_idx = h5tpriv_get_face_idx (*edge_idp); + + TRY( add_vertex2 (m, list, + h5tpriv_ref_elem_get_vertex_idx ( + m, 1, face_idx, 0), + elem_idx) ); + TRY( add_vertex2 (m, list, + h5tpriv_ref_elem_get_vertex_idx ( + m, 1, face_idx, 1), + elem_idx) ); + } while (++edge_idp < end); + TRY( h5priv_free_loc_idlist (&children) ); + H5_PRIV_FUNC_RETURN (H5_SUCCESS); +} + +/* + Compute downward adjacent vertices of all edges of triangle. + */ +static inline h5_err_t +get_vertices_dadj_to_triangle ( + h5t_mesh_t* const m, + const h5_loc_id_t entity_id, + h5_loc_idlist_t** list + ) { + H5_PRIV_FUNC_ENTER (h5_err_t, + "m=%p, entity_id=%llu, list=%p", + m, (long long unsigned)entity_id, list); + h5_loc_idlist_t* children; + TRY (h5priv_alloc_loc_idlist (&children, 8)); + + h5_loc_idx_t elem_idx = h5tpriv_get_elem_idx ( entity_id ); + // loop over all edges of triangle + h5_loc_idx_t face_idx; + h5_loc_idx_t num_faces = h5tpriv_ref_elem_get_num_edges (m); + for (face_idx = 0; face_idx < num_faces; face_idx++) { + TRY( get_sections_of_edge ( + m, + h5tpriv_build_edge_id (face_idx, elem_idx), + &children) ); + } + TRY (h5priv_alloc_loc_idlist (list, 8)); + h5_loc_id_t *edge_idp = children->items; + h5_loc_id_t *end = edge_idp + children->num_items; + do { + elem_idx = h5tpriv_get_elem_idx (*edge_idp); + face_idx = h5tpriv_get_face_idx (*edge_idp); + + TRY( add_vertex2 (m, list, + h5tpriv_ref_elem_get_vertex_idx ( + m, 1, face_idx, 0), + elem_idx) ); + TRY( add_vertex2 (m, list, + h5tpriv_ref_elem_get_vertex_idx ( + m, 1, face_idx, 1), + elem_idx) ); + } while (++edge_idp < end); + TRY (h5priv_free_loc_idlist(&children)); + H5_PRIV_FUNC_RETURN (H5_SUCCESS); +} + +static inline h5_err_t +get_edges_dadj_to_triangle ( + h5t_mesh_t* const m, + const h5_loc_id_t entity_id, + h5_loc_idlist_t** list + ) { + H5_PRIV_FUNC_ENTER (h5_err_t, + "m=%p, entity_id=%llu, list=%p", + m, (long long unsigned)entity_id, list); + h5_loc_idlist_t* children; + TRY (h5priv_alloc_loc_idlist (&children, 8)); + h5_loc_idx_t elem_idx = h5tpriv_get_elem_idx (entity_id); + // loop over all edges of triangle + h5_loc_idx_t edge_idx = h5tpriv_ref_elem_get_num_edges (m); + while (--edge_idx >= 0) { + TRY( get_sections_of_edge ( + m, + h5tpriv_build_edge_id (edge_idx, elem_idx), + &children) ); + } + TRY (h5priv_alloc_loc_idlist (list, 8)); + h5_loc_id_t* edge_idp = children->items; + h5_loc_id_t* end = edge_idp + children->num_items; + do { + TRY( add_edge (m, list, *edge_idp) ); + } while (++edge_idp < end); + TRY (h5priv_free_loc_idlist(&children)); + H5_PRIV_FUNC_RETURN (H5_SUCCESS); +} + +static inline h5_err_t +dim_error( + const h5_int32_t dim + ) { + return h5_error ( + H5_ERR_INVAL, + "Illegal dimension %ld", (long)dim); +} + +static inline h5_err_t +get_adjacencies_to_vertex ( + h5t_mesh_t* const m, + const h5_loc_id_t entity_id, + const h5_int32_t dim, + h5_loc_idlist_t** list + ) { + switch (dim) { + case 1: + return get_edges_uadj_to_vertex(m, entity_id, list); + case 2: + return get_triangles_uadj_to_vertex(m, entity_id, list); + default: + return dim_error (dim); + } +} + +static inline h5_err_t +get_adjacencies_to_edge ( + h5t_mesh_t* const m, + const h5_loc_id_t entity_id, + const h5_int32_t dim, + h5_loc_idlist_t** list + ) { + switch (dim) { + case 0: + return get_vertices_dadj_to_edge(m, entity_id, list); + case 1: + return get_edges_adj_to_edge(m, entity_id, list); + case 2: + return get_triangles_uadj_to_edge(m, entity_id, list); + default: + return dim_error (dim); + } +} + +static inline h5_err_t +get_adjacencies_to_triangle ( + h5t_mesh_t* const m, + const h5_loc_id_t entity_id, + const h5_int32_t dim, + h5_loc_idlist_t** list + ) { + switch (dim) { + case 0: + return get_vertices_dadj_to_triangle(m, entity_id, list); + case 1: + return get_edges_dadj_to_triangle(m, entity_id, list); + default: + return dim_error (dim); + } +} + +static h5_err_t +get_adjacencies ( + h5t_mesh_t* const m, + const h5_loc_id_t entity_id, + const h5_int32_t dim, + h5_loc_idlist_t** list + ) { + h5_loc_id_t entity_type = h5tpriv_get_entity_type (entity_id); + switch (entity_type) { + case H5T_TYPE_VERTEX: + return get_adjacencies_to_vertex (m, entity_id, dim, list); + case H5T_TYPE_EDGE: + return get_adjacencies_to_edge (m, entity_id, dim, list); + case H5T_TYPE_TRIANGLE: + return get_adjacencies_to_triangle (m, entity_id, dim, list); + default: + break; + } + return h5_error_internal (); +} + +struct h5t_adjacency_methods h5tpriv_trim_adjacency_methods = { + get_adjacencies +}; + diff --git a/src/h5core/h5t_core.c b/src/h5core/h5t_core.c new file mode 100644 index 0000000..afe6e36 --- /dev/null +++ b/src/h5core/h5t_core.c @@ -0,0 +1,431 @@ +#include + +#include "h5t_types_private.h" +#include "h5core/h5t_map.h" + +#include "h5t_map_private.h" +#include "h5t_core_private.h" +#include "h5t_access_private.h" +#include "h5t_errorhandling_private.h" + +h5_err_t +h5tpriv_grow_te_htab ( + h5t_mesh_t* const m, + size_t nel + ); + +h5_err_t +h5tpriv_grow_td_htab ( + h5t_mesh_t* const m, + size_t nel + ) ; + +h5_err_t +h5tpriv_enter_tv2 ( + h5t_mesh_t* const m, + h5_loc_idx_t face_idx, // in + h5_loc_idx_t elem_idx, // in + h5_loc_idlist_t** idlist // out + ) { + H5_PRIV_API_ENTER (h5_err_t, + "m=%p, face_idx=%lld, elem_idx=%lld, idlist=%p", + m, (long long)face_idx, (long long)elem_idx, idlist); + + h5_loc_idx_t vertex_idx; + TRY (h5t_get_loc_vertex_index_of_vertex2 ( + m, + face_idx, elem_idx, + &vertex_idx)); + + TRY (h5priv_search_in_loc_idlist ( + &m->adjacencies.tv.v[vertex_idx], + h5tpriv_build_vertex_id (face_idx, elem_idx))); + + // set return value + if (idlist) { + *idlist = m->adjacencies.tv.v[vertex_idx]; + } + + H5_PRIV_API_RETURN (H5_SUCCESS); +} + +h5_err_t +h5tpriv_enter_te2 ( + h5t_mesh_t* const m, + h5_loc_idx_t face_idx, + h5_loc_idx_t elem_idx, + h5_loc_idlist_t** idlist + ) { + H5_PRIV_API_ENTER (h5_err_t, + "m=%p, face_idx=%lld, elem_idx=%lld, idlist=%p", + m, (long long)face_idx, (long long)elem_idx, idlist); + h5t_adjacencies_t* a = &m->adjacencies; + void* __retval; + static h5t_te_entry_t* entry = NULL; + + if (entry == NULL) { + TRY (entry = h5_calloc (1, sizeof (*entry))); + } + TRY (h5t_get_loc_vertex_indices_of_edge2 ( + m, face_idx, elem_idx, entry->key.vids)); + /* + resize hash table if more than 4/5 filled + */ + if ((a->te_hash.size*4) <= (a->te_hash.filled*5)) { + h5_debug ("Resize te-structure"); + h5_loc_idx_t num_interior_elems = m->num_interior_elems[m->num_leaf_levels-1]; + TRY (h5tpriv_grow_te_htab (m, 2*(num_interior_elems - elem_idx)+8192)); + } + TRY (h5priv_hsearch ( + entry, + H5_ENTER, + &__retval, + &a->te_hash)); + h5t_te_entry_t* te_entry = (h5t_te_entry_t *)__retval; + if (entry == te_entry) { // if used, + entry = NULL; // force allocation of new entry + } + TRY (h5priv_search_in_loc_idlist ( + &te_entry->value, + h5tpriv_build_edge_id (face_idx, elem_idx))); + + if (idlist) { + *idlist = te_entry->value; + } + H5_PRIV_API_RETURN (H5_SUCCESS); +} + +h5_err_t +h5tpriv_enter_td2 ( + h5t_mesh_t* const m, + h5_loc_idx_t face_idx, + h5_loc_idx_t elem_idx, + h5_loc_idlist_t** idlist // out + ) { + H5_PRIV_API_ENTER (h5_err_t, + "m=%p, face_idx=%lld, elem_idx=%lld, idlist=%p", + m, (long long)face_idx, (long long)elem_idx, idlist); + h5t_adjacencies_t* a = &m->adjacencies; + void* __retval; + static h5t_td_entry_t* entry = NULL; + + if (entry == NULL) { + TRY (entry = h5_calloc (1, sizeof(*entry)) ); + } + TRY (h5t_get_loc_vertex_indices_of_triangle2 ( + m, face_idx, elem_idx, entry->key.vids) ); + /* resize hash table if more than 80% filled */ + if ((a->td_hash.size*4) <= (a->td_hash.filled*5)) { + h5_debug ("Resize td-structure"); + h5_loc_idx_t num_interior_elems = m->num_interior_elems[m->num_leaf_levels-1]; + TRY (h5tpriv_grow_td_htab (m, 3*(num_interior_elems-elem_idx))); + } + /* search in hash, add if entry doesn't already exists */ + TRY (h5priv_hsearch ( + entry, + H5_ENTER, + &__retval, + &a->td_hash)); + h5t_td_entry_t *td_entry = (h5t_td_entry_t *)__retval; + if (entry == td_entry) { // if used: + entry = NULL; // force allocation of new + } + + /* search ID in list of IDs for given triangle */ + TRY (h5priv_search_in_loc_idlist ( + &td_entry->value, + h5tpriv_build_triangle_id (face_idx, elem_idx))); + if (idlist) { + *idlist = td_entry->value; + } + H5_PRIV_API_RETURN (H5_SUCCESS); +} + +static int +cmp_te_entries ( + const void* __a, + const void* __b + ) { + h5t_te_entry_t* a = (h5t_te_entry_t*)__a; + h5t_te_entry_t* b = (h5t_te_entry_t*)__b; + return memcmp (a->key.vids, b->key.vids, sizeof (a->key.vids)); +} + +static unsigned int +compute_te_hashval ( + const void* __item + ) { + h5t_te_entry_t* item = (h5t_te_entry_t*)__item; + uint16_t* key = (uint16_t*)item->key.vids; + unsigned int count = 2*sizeof (item->key.vids[0]) / sizeof (uint16_t); + unsigned int hval = count; + while (count--) { + if (*key) { + hval <<= 6; + hval += *key; + } + key++; + } + return hval; +} + +static h5_err_t +release_te_entry ( + const void* __entry + ) { + H5_PRIV_FUNC_ENTER (h5_err_t, "__entry=%p", __entry); + struct h5_te_entry* entry = *(struct h5_te_entry**)__entry; + h5_loc_idlist_t* list = entry->value; + TRY (h5priv_free_loc_idlist (&list)); + TRY (h5_free (entry)); + H5_PRIV_FUNC_RETURN (H5_SUCCESS); +} + +h5_err_t +h5tpriv_grow_te_htab ( + h5t_mesh_t* const m, + size_t nel + ) { + H5_PRIV_API_ENTER (h5_err_t, "m=%p, nel=%zu", m, nel); + h5_debug ("Resize te-structure by %zu", nel); + h5t_adjacencies_t* a = &m->adjacencies; + if ( a->te_hash.size == 0 ) { + TRY (h5priv_hcreate ( + nel, + &a->te_hash, + cmp_te_entries, + compute_te_hashval, + release_te_entry)); + } else { + TRY (h5priv_hgrow (nel, &a->te_hash)); + } + H5_PRIV_API_RETURN (H5_SUCCESS); +} + +/* + Find item in the T(E) hash table. + + Passing item with type entry type. + */ +static inline h5_err_t +find_te ( + h5t_mesh_t* const m, + h5t_te_entry_t* item, // in: item to find + h5_loc_idlist_t** idlist // out: + ) { + H5_PRIV_FUNC_ENTER (h5_err_t, "m=%p, item=%p, idlist=%p", + m, item, idlist); + void* __entry; + TRY (h5priv_hsearch ( + item, + H5_FIND, + &__entry, + &m->adjacencies.te_hash)); + h5t_te_entry_t* entry = (h5t_te_entry_t*)__entry; + if (entry == NULL) { + H5_PRIV_FUNC_LEAVE (H5_NOK); // not found + } + if (idlist) { + *idlist = entry->value; + } + H5_PRIV_FUNC_RETURN (H5_SUCCESS); +} + +/* + Find item in the T(E) hash table. + + Passing item with face and local element ID. + */ +h5_err_t +h5tpriv_find_te ( + h5t_mesh_t* const m, + h5_loc_idx_t edge_id, // in + h5_loc_idlist_t** idlist // out + ) { + H5_PRIV_API_ENTER (h5_err_t, + "m=%p, edge_id=%lld, idlist=%p", + m, (long long)edge_id, idlist); + h5t_te_entry_t item; + TRY (h5t_get_loc_vertex_indices_of_edge ( + m, + edge_id, + item.key.vids)); + + TRY (find_te (m, &item, idlist)); + H5_PRIV_API_RETURN (H5_SUCCESS); +} + +h5_err_t +h5tpriv_find_te2 ( + h5t_mesh_t* const m, + h5_loc_idx_t face_idx, // in + h5_loc_idx_t elem_idx, // in + h5_loc_idlist_t** idlist // out + ) { + H5_PRIV_API_ENTER (h5_err_t, + "m=%p, face_idx=%lld, elem_idx=%lld, idlist=%p", + m, (long long)face_idx, (long long)elem_idx, idlist); + h5t_te_entry_t item; + TRY (h5t_get_loc_vertex_indices_of_edge2 ( + m, + face_idx, + elem_idx, + item.key.vids)); + TRY (find_te (m, &item, idlist)); + H5_PRIV_API_RETURN (H5_SUCCESS); +} + +static int +cmp_td_entries ( + const void* __a, + const void* __b + ) { + h5t_td_entry_t* a = (h5t_td_entry_t*)__a; + h5t_td_entry_t* b = (h5t_td_entry_t*)__b; + return memcmp (a->key.vids, b->key.vids, sizeof(a->key.vids)); +} + +static unsigned int +compute_td_hashval ( + const void* __item + ) { + h5t_td_entry_t* item = (h5t_td_entry_t*)__item; + uint16_t* key = (uint16_t*)item->key.vids; + unsigned int count = 3 * sizeof (item->key.vids[0]) / sizeof (uint16_t); + unsigned int hval = count; + while (count--) { + if (*key) { + hval <<= 6; + hval += *key; + } + key++; + } + return hval; +} + +static h5_err_t +release_td_entry ( + const void* __entry + ) { + H5_PRIV_FUNC_ENTER (h5_err_t, "__entry=%p", __entry); + struct h5_td_entry* entry = *(struct h5_td_entry**)__entry; + h5_loc_idlist_t* list = entry->value; + TRY (h5priv_free_loc_idlist (&list)); + TRY (h5_free (entry)); + H5_PRIV_FUNC_RETURN (H5_SUCCESS); +} + + +h5_err_t +h5tpriv_grow_td_htab ( + h5t_mesh_t* const m, + size_t nel + ) { + H5_PRIV_API_ENTER (h5_err_t, "m=%p, nel=%lld", m, (long long)nel); + h5_debug ("Resize td-structure"); + h5t_adjacencies_t* a = &m->adjacencies; + if (a->td_hash.size == 0) { + TRY (h5priv_hcreate ( + nel, + &a->td_hash, + cmp_td_entries, + compute_td_hashval, + release_td_entry)); + } else { + TRY (h5priv_hgrow (nel, &a->td_hash)); + } + H5_PRIV_API_RETURN (H5_SUCCESS); +} + +static inline h5_err_t +find_td ( + h5t_mesh_t* const m, + h5t_td_entry_t* item, + h5_loc_idlist_t** idlist // out + ) { + void* __entry; + h5priv_hsearch ( + item, + H5_FIND, + &__entry, + &m->adjacencies.td_hash); + if (__entry == NULL) { + return h5tpriv_error_local_triangle_nexist (item->key.vids); + } + h5t_td_entry_t* entry = (h5t_td_entry_t*)__entry; + *idlist = entry->value; + return H5_SUCCESS; +} + +h5_err_t +h5tpriv_find_td ( + h5t_mesh_t* const m, + h5_loc_idx_t triangle_id, + h5_loc_idlist_t** idlist + ) { + H5_PRIV_API_ENTER (h5_err_t, + "m=%p, triangle_id=%lld, idlist=%p", + m, (long long)triangle_id, idlist); + h5t_td_entry_t item; + TRY (h5t_get_loc_vertex_indices_of_triangle ( + m, + triangle_id, + item.key.vids)); + TRY (find_td (m, &item, idlist)); + H5_PRIV_API_RETURN (H5_SUCCESS); +} + +h5_err_t +h5tpriv_find_td2 ( + h5t_mesh_t* const m, + h5_loc_idx_t face_idx, + h5_loc_idx_t elem_idx, + h5_loc_idlist_t** idlist + ) { + H5_PRIV_API_ENTER (h5_err_t, + "m=%p, face_idx=%lld, elem_idx=%lld, idlist=%p", + m, (long long)face_idx, (long long)elem_idx, idlist); + h5t_td_entry_t item; + TRY (h5t_get_loc_vertex_indices_of_triangle2 ( + m, + face_idx, + elem_idx, + item.key.vids)); + TRY (find_td (m, &item, idlist)); + H5_PRIV_API_RETURN (H5_SUCCESS); +} + +/* + Return list of elements sharing the same vertex. + */ +h5_err_t +h5tpriv_find_tv2 ( + h5t_mesh_t* const m, + h5_loc_idx_t face_idx, + h5_loc_idx_t elem_idx, + h5_loc_idlist_t** idlist + ) { + H5_PRIV_API_ENTER (h5_err_t, + "m=%p, face_idx=%lld, elem_idx=%lld, idlist=%p", + m, (long long)face_idx, (long long)elem_idx, idlist); + h5_loc_idx_t idx; + TRY (idx = h5tpriv_get_loc_elem_vertex_idx (m, elem_idx, face_idx)); + *idlist = m->adjacencies.tv.v[idx]; + H5_PRIV_API_RETURN (H5_SUCCESS); +} + +/* + Return list of elements sharing the same vertex. + */ +h5_err_t +h5tpriv_find_tv3 ( + h5t_mesh_t* const m, + h5_loc_idx_t vtx_idx, + h5_loc_idlist_t** idlist + ) { + H5_PRIV_FUNC_ENTER (h5_err_t, + "m=%p, vtx_idx=%lld, idlist=%p", + m, (long long)vtx_idx, idlist); + *idlist = m->adjacencies.tv.v[vtx_idx]; + H5_PRIV_FUNC_RETURN (H5_SUCCESS); +} diff --git a/src/h5core/h5t_core_private.h b/src/h5core/h5t_core_private.h new file mode 100644 index 0000000..ca297b1 --- /dev/null +++ b/src/h5core/h5t_core_private.h @@ -0,0 +1,204 @@ +#ifndef __H5T_CORE_PRIVATE_H +#define __H5T_CORE_PRIVATE_H + + +#define MAX_CHUNKS_PER_OCTANT 4 // WARNING there are probably places where the makro isn't used +// also it's not simply changeable since types ect. have to be adjusted! +#define NUM_OCTANTS 8 + +#define UPDATE_WEIGHTS 1 // if 1 it is split, if 2 they are copied. checkout h5t_store.c update_weight_children() + +#define MAX_NUM_ELEMS_TO_REFINE_LOCALLY 2048 // used define instead of having number in code + + +#include "h5t_tags_private.h" + +#include "h5t_types_private.h" + +#include "h5t_access_private.h" +#include "h5t_adjacencies_private.h" +#include "h5t_map_private.h" +#include "h5t_model_private.h" +#include "h5t_ref_elements_private.h" +#include "h5t_readwrite_private.h" +#include "h5t_retrieve_private.h" +#include "h5t_store_private.h" + +#include "h5t_errorhandling_private.h" + +#include "h5t_octree_private.h" + +#include + + +typedef struct h5t_te_entry_key { + h5_loc_idx_t vids[2]; +} h5t_te_entry_key_t; + +typedef struct h5t_td_entry_key { + h5_loc_idx_t vids[3]; +} h5t_td_entry_key_t; + +/* + List of all upward adjacent elements of same coarsness of a specific face. + The face is specified by its local vertex IDs. + */ +typedef struct h5_te_entry { + h5t_te_entry_key_t key; + h5_loc_idlist_t* value; +} h5t_te_entry_t; + +typedef struct h5_td_entry { + h5t_td_entry_key_t key; + h5_loc_idlist_t* value; +} h5t_td_entry_t; + +h5_err_t +h5tpriv_enter_tv2 ( + h5t_mesh_t* const m, + h5_loc_idx_t face_idx, // in + h5_loc_idx_t elem_idx, // in + h5_loc_idlist_t** idlist // out + ); + +h5_err_t +h5tpriv_enter_te2 ( + h5t_mesh_t* const m, + h5_loc_idx_t face_idx, + h5_loc_idx_t elem_idx, + h5_loc_idlist_t** idlist + ); + +h5_err_t +h5tpriv_enter_td2 ( + h5t_mesh_t* const m, + h5_loc_idx_t face_idx, + h5_loc_idx_t elem_idx, + h5_loc_idlist_t** idlist // out + ); + +h5_err_t +h5tpriv_find_tv2 ( + h5t_mesh_t* const m, + h5_loc_idx_t face_idx, + h5_loc_idx_t elem_idx, + h5_loc_idlist_t** idlist + ); + +h5_err_t +h5tpriv_find_tv3 ( + h5t_mesh_t* const m, + h5_loc_idx_t vtx_idx, + h5_loc_idlist_t** idlist + ); + +h5_err_t +h5tpriv_find_te ( + h5t_mesh_t* const m, + h5_loc_idx_t edge_id, // in + h5_loc_idlist_t** idlist // out + ); + +h5_err_t +h5tpriv_find_te2 ( + h5t_mesh_t* const m, + h5_loc_idx_t face_idx, // in + h5_loc_idx_t elem_idx, // in + h5_loc_idlist_t** idlist // out + ); + +h5_err_t +h5tpriv_find_td ( + h5t_mesh_t* const m, + h5_loc_idx_t triangle_id, + h5_loc_idlist_t** idlist + ); + +h5_err_t +h5tpriv_find_td2 ( + h5t_mesh_t* const m, + h5_loc_idx_t face_idx, + h5_loc_idx_t elem_idx, + h5_loc_idlist_t** idlist + ); + +static inline h5_loc_idlist_t* +h5tpriv_traverse_tv ( + h5t_mesh_t* const m, + unsigned int* i + ) { + assert (i != NULL); + if (*i < 0) i = 0; + if (*i >= m->num_loc_vertices[m->num_loaded_levels-1]) { + return NULL; + } + h5_loc_idlist_t* result = m->adjacencies.tv.v[*i]; + (*i)++; + return result; +} + +static inline h5_loc_idlist_t* +h5tpriv_traverse_te ( + h5t_mesh_t* const m, + unsigned int* i + ) { + assert (i != NULL); + if (*i < 1) *i = 1; + h5t_te_entry_t* entry = h5priv_htraverse (&m->adjacencies.te_hash, i); + h5_loc_idlist_t* result = NULL; + if (entry) { + result = entry->value; + } + return result; +} + +static inline h5_loc_idlist_t* +h5tpriv_traverse_td ( + h5t_mesh_t* const m, + unsigned int* i + ) { + assert (i != NULL); + if (*i < 0) i = 0; + h5t_td_entry_t* entry = h5priv_htraverse (&m->adjacencies.td_hash, i); + h5_loc_idlist_t* result = NULL; + if (entry) { + result = entry->value; + } + return result; +} + +struct h5t_core_methods { + h5_err_t (*update_internal_structs)( + h5t_mesh_t* const, + h5_lvl_idx_t); + h5_err_t (*release_internal_structs)( + h5t_mesh_t* const); +}; + +extern struct h5t_core_methods h5tpriv_trim_core_methods; +extern struct h5t_core_methods h5tpriv_tetm_core_methods; + +static inline h5_err_t +h5tpriv_release_adjacency_structs ( + h5t_mesh_t* const m + ) { + H5_PRIV_API_ENTER (h5_err_t, "m=%p", m); + if (m->methods->adjacency == NULL) { + H5_PRIV_API_LEAVE (H5_OK); + } + H5_PRIV_API_RETURN (m->methods->core->release_internal_structs(m)); +} + +static inline h5_err_t +h5tpriv_update_internal_structs ( + h5t_mesh_t* const m, + const h5_lvl_idx_t level_id + ) { + H5_PRIV_API_ENTER (h5_err_t, "m=%p, level_id=%d", m, level_id); + if (m->methods->adjacency == NULL) { + H5_PRIV_API_LEAVE (H5_OK); + } + H5_PRIV_API_RETURN (m->methods->core->update_internal_structs(m, level_id)); +} + +#endif diff --git a/src/h5core/h5t_core_tetm.c b/src/h5core/h5t_core_tetm.c new file mode 100644 index 0000000..0a1eaf8 --- /dev/null +++ b/src/h5core/h5t_core_tetm.c @@ -0,0 +1,289 @@ +/* + Copyright 2006-2010 + Paul Scherrer Institut, Villigen, Switzerland; + Achim Gsell + All rights reserved. + + Authors + Achim Gsell + + Warning + This code is under development. + */ + +#include + +#include + + +#include "h5_maps_private.h" +#include "h5t_model_private.h" +#include "h5t_types_private.h" +#include "h5t_core_private.h" +#include "h5t_retrieve_private.h" + + +#define H5_LOC_ELEM_T h5_loc_tet_t + + +static inline void +set_vertex_flags ( + h5t_mesh_t* const m, + h5_loc_idx_t face_idx, // in + h5_loc_idx_t elem_idx, // in + h5_int32_t* flags // in/out + ) { + H5_LOC_ELEM_T* elems = (H5_LOC_ELEM_T*)m->loc_elems; + H5_LOC_ELEM_T* elem = elems + elem_idx; + + if (!h5tpriv_is_leaf_elem (m, elem)) { + return; // skip non-leaf cells + } + if (elem->flags & H5_GHOST_ENTITY) { + if (!(*flags & H5_BORDER_ENTITY)) { + // vertex is either border- or front-vertex + // if it is border-vertex, this flag will be reset later + *flags |= H5_FRONT_ENTITY; + } + return; + } + + // vertex is either interior- or border-vertex + if (!(*flags & H5_BORDER_ENTITY)) { + *flags |= H5_INTERIOR_ENTITY; + } + if (elem->flags & H5_BORDER_ENTITY) { + // cell is border-cell: vertex is either boder- or interior-vertex + // loop over all facets connected to given vertex + int num_facets = h5tpriv_ref_elem_get_num_facets_to_vertex (m, face_idx); + for (int i = 0; i < num_facets; i++) { + int j = h5tpriv_ref_elem_get_facet_to_vertex (m, face_idx, i); + // if neighbor is ghost-cell: vertex is border-vertex + h5_loc_idx_t neighbor_idx = elem->neighbor_indices[j]; + if (neighbor_idx >= 0 && + elems[neighbor_idx].flags & H5_GHOST_ENTITY) { + *flags |= H5_BORDER_ENTITY; + *flags &= ~(H5_INTERIOR_ENTITY|H5_FRONT_ENTITY); + } + } + } +} + +/* + edges are either interior-, border or front-entities + */ +static inline void +set_edge_flags ( + h5t_mesh_t* const m, + h5_loc_idx_t face_idx, // in + h5_loc_idx_t elem_idx, // in + h5_int32_t* flags // in/out + ) { + H5_LOC_ELEM_T* elems = (H5_LOC_ELEM_T*)m->loc_elems; + H5_LOC_ELEM_T* elem = elems + elem_idx; + + if (!h5tpriv_is_leaf_elem (m, elem)) { + return; // skip non-leaf cells + } + + if (elem->flags & H5_GHOST_ENTITY) { + if (!(*flags & H5_BORDER_ENTITY)) { + // entity is either border- or front-entity + // if it is border-entity, this flag will be reset later + *flags |= H5_FRONT_ENTITY; + } + return; + } + + // entity is either interior- or border-entity + if (!(*flags & H5_BORDER_ENTITY)) { + *flags |= H5_INTERIOR_ENTITY; + } + if (elem->flags & H5_BORDER_ENTITY) { + // cell is border-cell: vertex is either boder- or interior-vertex + // loop over all facets connected to given vertex + int num_facets = h5tpriv_ref_elem_get_num_facets_to_edge (m, face_idx); + for (int i = 0; i < num_facets; i++) { + int j = h5tpriv_ref_elem_get_facet_to_edge (m, face_idx, i); + // if neighbor is ghost-cell: vertex is border-vertex + h5_loc_idx_t neighbor_idx = elem->neighbor_indices[j]; + if (neighbor_idx >= 0 && + elems[neighbor_idx].flags & H5_GHOST_ENTITY) { + *flags |= H5_BORDER_ENTITY; + *flags &= ~(H5_INTERIOR_ENTITY|H5_FRONT_ENTITY); + } + } + } +} + + +/* + triangle are either interior-, border or front-entities + */ +static inline void +set_triangle_flags ( + h5t_mesh_t* const m, + h5_loc_idx_t face_idx, // in + h5_loc_idx_t elem_idx, // in + h5_int32_t* flags // in/out + ) { + H5_LOC_ELEM_T* elems = (H5_LOC_ELEM_T*)m->loc_elems; + H5_LOC_ELEM_T* elem = elems + elem_idx; + + if (!h5tpriv_is_leaf_elem (m, elem)) { + return; // skip non-leaf cells + } + + if (elem->flags & H5_GHOST_ENTITY) { + if (!(*flags & H5_BORDER_ENTITY)) { + // entity is either border- or front-entity + // if it is border-entity, this flag will be reset later + *flags |= H5_FRONT_ENTITY; + } + return; + } + + // entity is either interior- or border-entity + if (!(*flags & H5_BORDER_ENTITY)) { + *flags |= H5_INTERIOR_ENTITY; + } + if (elem->flags & H5_BORDER_ENTITY) { + // cell is border-cell: vertex is either boder- or interior-vertex + // if neighbor is ghost-cell: vertex is border-vertex + h5_loc_idx_t neighbor_idx = elem->neighbor_indices[face_idx]; + if (neighbor_idx >= 0 && + elems[neighbor_idx].flags & H5_GHOST_ENTITY) { + *flags |= H5_BORDER_ENTITY; + *flags &= ~(H5_INTERIOR_ENTITY|H5_FRONT_ENTITY); + } + } +} + +/* + Allocate structure keeping the upward adjacent elements for each vertex. + */ +static inline h5_err_t +alloc_tv ( + h5t_mesh_t* const m, + const h5_lvl_idx_t from_lvl + ) { + H5_PRIV_FUNC_ENTER (h5_err_t, + "m=%p, from_lvl=%u", + m, (unsigned)from_lvl); + h5_loc_idx_t num_loc_vertices = m->num_loc_vertices[m->num_loaded_levels-1]; + + h5t_adjacencies_t* adj = &m->adjacencies; + // allocate ptr to ID-list per vertex + TRY( adj->tv.v = h5_alloc (adj->tv.v, num_loc_vertices*sizeof(*adj->tv.v)) ); + + size_t i = from_lvl <= 0 ? 0 : m->num_loc_vertices[from_lvl-1]; + memset (adj->tv.v+i, 0, (num_loc_vertices-i)*sizeof(*adj->tv.v)); + + H5_PRIV_FUNC_RETURN (H5_SUCCESS); +} + +static inline h5_err_t +reset_flags ( + h5t_mesh_t* const m + ) { + // traverse all entries in tv + unsigned int i = 0; + h5_loc_idlist_t* entry; + while ((entry = h5tpriv_traverse_tv (m, &i))) { + entry->flags = 0; + } + + // traverse all entries in te + i = 0; + while ((entry = h5tpriv_traverse_te (m, &i))) { + entry->flags = 0; + } + + // traverse all entries in td + i = 0; + while ((entry = h5tpriv_traverse_td (m, &i))) { + entry->flags = 0; + } + + return H5_SUCCESS; +} + +static h5_err_t +update_internal_structs ( + h5t_mesh_t* const m, + const h5_lvl_idx_t from_lvl + ) { + H5_PRIV_FUNC_ENTER (h5_err_t, + "m=%p, from_lvl=%u", + m, (unsigned)from_lvl); + h5_lvl_idx_t to_lvl = m->num_loaded_levels - 1; + assert (to_lvl >= 0); + + /* expand structure */ + TRY (alloc_tv (m, from_lvl)); + + int num_vertices_of_elem = h5tpriv_ref_elem_get_num_vertices(m); + int num_edges_of_elem = h5tpriv_ref_elem_get_num_edges(m); + int num_facets_of_elem = h5tpriv_ref_elem_get_num_facets (m); + + /* loop over all elements starting at from_lvl up to the last loaded level + including all ghost elements */ + h5_loc_idx_t elem_idx = (from_lvl <= 0) ? 0 : m->num_interior_elems[from_lvl-1]; + h5_loc_idx_t last = m->num_interior_elems[to_lvl] + m->num_ghost_elems[to_lvl]; + + for (; elem_idx < last; elem_idx++) { + int face_idx; + // Compute upward adjacent elements for each vertex. + for (face_idx = 0; face_idx < num_vertices_of_elem; face_idx++) { + TRY (h5tpriv_enter_tv2 (m, face_idx, elem_idx, NULL)); + } + // Compute upward adjacent elements for each edge. + for (face_idx = 0; face_idx < num_edges_of_elem; face_idx++) { + TRY (h5tpriv_enter_te2 (m, face_idx, elem_idx, NULL)); + } + // Compute upward adjacent elements for each triangle. + for (face_idx = 0; face_idx < num_facets_of_elem; face_idx++) { + TRY (h5tpriv_enter_td2 (m, face_idx, elem_idx, NULL)); + } + } + H5_PRIV_FUNC_RETURN (H5_SUCCESS); +} + +/* + Release structure keeping the upward adjacent elements for each vertex. + */ +static inline h5_err_t +release_tv ( + h5t_mesh_t* const m + ) { + H5_PRIV_FUNC_ENTER (h5_err_t, "m=%p", m); + h5t_adjacencies_t* adj = &m->adjacencies; + if (adj->tv.v == NULL) + H5_PRIV_FUNC_LEAVE (H5_SUCCESS); + + h5_loc_idx_t vertex_idx = 0; + h5_loc_idx_t last = m->num_loc_vertices[m->num_loaded_levels-1]; + for (; vertex_idx < last; vertex_idx++) { + TRY( h5priv_free_loc_idlist (&adj->tv.v[vertex_idx]) ); + } + TRY( h5_free (adj->tv.v) ); + adj->tv.v = NULL; + H5_PRIV_FUNC_RETURN (H5_SUCCESS); +} + +static h5_err_t +release_internal_structs ( + h5t_mesh_t* const m + ) { + H5_PRIV_FUNC_ENTER (h5_err_t, "m=%p", m); + TRY( release_tv (m) ); + TRY( h5priv_hdestroy (&m->adjacencies.te_hash) ); + TRY( h5priv_hdestroy (&m->adjacencies.td_hash) ); + memset (&m->adjacencies, 0, sizeof (m->adjacencies)); + H5_PRIV_FUNC_RETURN (H5_SUCCESS); +} + +struct h5t_core_methods h5tpriv_tetm_core_methods = { + update_internal_structs, + release_internal_structs, +}; diff --git a/src/h5core/h5t_core_trim.c b/src/h5core/h5t_core_trim.c new file mode 100644 index 0000000..d0264a7 --- /dev/null +++ b/src/h5core/h5t_core_trim.c @@ -0,0 +1,276 @@ +/* + Copyright 2006-2011 + Paul Scherrer Institut, Villigen, Switzerland; + Achim Gsell + All rights reserved. + + Authors + Achim Gsell + + Warning + This code is under development. + */ + +#include +#include +#include + +#include "h5t_types_private.h" +#include "h5t_model_private.h" +#include "h5t_core_private.h" +#include "h5t_core_private.h" + +#define H5_LOC_ELEM_T h5_loc_tri_t + +/* + loop over all connected cells: flags |= cell->flags + + if result is: + H5_GHOST_ENTITY==0 && H5_BORDER_ENTITY==0 && H5_INTERIOR_ENTITY==0: illegal + H5_GHOST_ENTITY==0 && H5_BORDER_ENTITY==0 && H5_INTERIOR_ENTITY==1: interior + H5_GHOST_ENTITY==0 && H5_BORDER_ENTITY==1 && H5_INTERIOR_ENTITY==0: illegal(?) + H5_GHOST_ENTITY==0 && H5_BORDER_ENTITY==1 && H5_INTERIOR_ENTITY==1: interior + H5_GHOST_ENTITY==1 && H5_BORDER_ENTITY==0 && H5_INTERIOR_ENTITY==0: front + H5_GHOST_ENTITY==1 && H5_BORDER_ENTITY==0 && H5_INTERIOR_ENTITY==1: illegal + H5_GHOST_ENTITY==1 && H5_BORDER_ENTITY==1 && H5_INTERIOR_ENTITY==0: border + H5_GHOST_ENTITY==1 && H5_BORDER_ENTITY==1 && H5_INTERIOR_ENTITY==1: border + + */ +static inline void +set_vertex_flags ( + h5t_mesh_t* const m, + h5_loc_idlist_t* list, // in: all upward adj cell of vertex + h5_loc_idx_t* num_all_partition // in/out: increment for each vertex + ) { + H5_LOC_ELEM_T* cell; + h5_loc_idx_t cell_idx; + list->flags = 0; + for (size_t i = 0; i < list->num_items; i++) { + cell_idx = h5tpriv_get_elem_idx (list->items[i]); + cell = (H5_LOC_ELEM_T*)m->loc_elems + cell_idx; + list->flags |= cell->flags; + } + int32_t flags = list->flags & (H5_INTERIOR_ENTITY|H5_BORDER_ENTITY|H5_GHOST_ENTITY); + if ((flags & ~H5_BORDER_ENTITY) == H5_INTERIOR_ENTITY) { + // interior flag set, border doesn't matter + flags = H5_INTERIOR_ENTITY; + + } else if (flags == H5_GHOST_ENTITY) { + // only ghost flag set + flags = H5_FRONT_ENTITY; + + } else if ((flags & ~H5_INTERIOR_ENTITY) == (H5_BORDER_ENTITY|H5_GHOST_ENTITY)) { + // ghost and border flag is set, interior doesn't matter + flags = H5_BORDER_ENTITY; + + } else { + // entity not on current level + } + if (list->flags & H5_GEOBORDER_ENTITY) { + for (size_t i = 0; i < list->num_items; i++) { + h5_loc_idx_t face_idx = h5tpriv_get_face_idx (list->items[i]); + cell_idx = h5tpriv_get_elem_idx (list->items[i]); + cell = (H5_LOC_ELEM_T*)m->loc_elems + cell_idx; + int num_facets = h5tpriv_ref_elem_get_num_facets_to_vertex (m, face_idx); + for (int i = 0; i < num_facets; i++) { + int j = h5tpriv_ref_elem_get_facet_to_vertex (m, face_idx, i); + if (cell->neighbor_indices[j] == -1) { + flags |= H5_GEOBORDER_ENTITY; + } + } + } + } + list->flags = flags; +} + +/* + edges are either interior-, border or front-entities + */ +static inline void +set_edge_flags ( + h5t_mesh_t* const m, + h5_loc_idlist_t* list, // in + h5_loc_idx_t* num_all_partition // in/out + ) { + H5_LOC_ELEM_T* cell; + h5_loc_idx_t cell_idx; + list->flags = 0; + for (size_t i = 0; i < list->num_items; i++) { + cell_idx = h5tpriv_get_elem_idx (list->items[i]); + cell = (H5_LOC_ELEM_T*)m->loc_elems + cell_idx; + list->flags |= cell->flags; + } + int32_t flags = list->flags & (H5_INTERIOR_ENTITY|H5_BORDER_ENTITY|H5_GHOST_ENTITY); + if ((flags & ~H5_BORDER_ENTITY) == H5_INTERIOR_ENTITY) { + // interior flag set, border doesn't matter + flags = H5_INTERIOR_ENTITY; + + } else if (flags == H5_GHOST_ENTITY) { + // only ghost flag set + flags = H5_FRONT_ENTITY; + + } else if ((flags & ~H5_INTERIOR_ENTITY) == (H5_BORDER_ENTITY|H5_GHOST_ENTITY)) { + // ghost and border flag is set, interior doesn't matter + flags = H5_BORDER_ENTITY; + + } else { + // entity not on current level + } + if (list->flags & H5_GEOBORDER_ENTITY) { + if (list->num_items == 1) { + flags |= H5_GEOBORDER_ENTITY; + } + } + list->flags = flags; +} + + +static inline h5_err_t +alloc_tv ( + h5t_mesh_t* const m, + const h5_lvl_idx_t from_lvl + ) { + H5_PRIV_FUNC_ENTER (h5_err_t, + "m=%p, from_lvl=%u", + m, (unsigned)from_lvl); + h5_loc_idx_t num_loc_vertices = m->num_loc_vertices[m->num_loaded_levels-1]; + + h5t_adjacencies_t* adj = &m->adjacencies; + // allocate ptr to ID-list per vertex + TRY( adj->tv.v = h5_alloc (adj->tv.v, num_loc_vertices*sizeof(*adj->tv.v)) ); + + size_t i = from_lvl <= 0 ? 0 : m->num_loc_vertices[from_lvl-1]; + memset (adj->tv.v+i, 0, (num_loc_vertices-i)*sizeof(*adj->tv.v)); + + H5_PRIV_FUNC_RETURN (H5_SUCCESS); +} + +/* + add new entities + set flags for all entities and count entities in all-partition + create index sets + */ +static inline h5_err_t +update_internal_structs ( + h5t_mesh_t* const m, + const h5_lvl_idx_t from_lvl + ) { + H5_PRIV_FUNC_ENTER (h5_err_t, + "m=%p, from_lvl=%u", + m, (unsigned)from_lvl); + + ////// + // add new entities + h5_lvl_idx_t to_lvl = m->num_loaded_levels - 1; + assert (to_lvl >= 0); + + /* expand structure */ + TRY( alloc_tv (m, from_lvl) ); + + int num_vertices_of_elem = h5tpriv_ref_elem_get_num_vertices(m); + int num_edges_of_elem = h5tpriv_ref_elem_get_num_edges(m); + + /* loop over all elements starting at from_lvl up to the last loaded level + including all ghost elements */ + h5_loc_idx_t elem_idx = (from_lvl <= 0) ? 0 : m->num_interior_elems[from_lvl-1]; + h5_loc_idx_t last = m->num_interior_elems[to_lvl] + m->num_ghost_elems[to_lvl]; + + for (; elem_idx < last; elem_idx++) { + int face_idx; + // Compute upward adjacent elements for each vertex. + for (face_idx = 0; face_idx < num_vertices_of_elem; face_idx++) { + TRY (h5tpriv_enter_tv2 (m, face_idx, elem_idx, NULL)); + } + // Compute upward adjacent elements for each edge. + for (face_idx = 0; face_idx < num_edges_of_elem; face_idx++) { + h5_loc_idlist_t* idlist; + TRY (h5tpriv_enter_te2 (m, face_idx, elem_idx, &idlist)); +#if (!NDEBUG) + if (idlist->num_items > 2) { + h5_debug ("Error %d edge neighbors %d %d %d", + idlist->num_items, idlist->items[0], + idlist->items[1], idlist->items[2]); + } + + +#endif + } + } + + ////// + // set flags for all entities + + // traverse all entries in tv + unsigned int i = 0; + h5_loc_idlist_t* entry; + h5_loc_idx_t num_vertices_all_partition = 0; + while ((entry = h5tpriv_traverse_tv (m, &i))) { + set_vertex_flags (m, entry, &num_vertices_all_partition); + } + + // traverse all entries in te + i = 0; + h5_loc_idx_t num_edges_all_partition = 0; + while ((entry = h5tpriv_traverse_te (m, &i))) { + set_edge_flags (m, entry, &num_edges_all_partition); + } + + ////// + // create index sets + + +#if (!defined(NDEBUG) && (h5_debug_level & (1<<5))) + if (!m->is_chunked) { + h5t_adjacencies_t* adj = &m->adjacencies; + h5_loc_idx_t idx = 0; + h5_loc_idx_t num_loc_vertices = m->num_loc_vertices[m->num_loaded_levels-1]; + for (; idx < num_loc_vertices; idx++) { + h5_debug ("vertex idx: %llu, flags: %llu", + (long long unsigned)idx, (long long unsigned)adj->tv.v[idx]->flags); + } + + h5_loc_idlist_t* list; + i = 1; + while ((list = h5tpriv_traverse_te (m, &i))) { + h5_debug ("edge id: %llx, flags: %llu", + (long long unsigned)list->items[0], (long long unsigned)list->flags); + } + } +#endif + H5_PRIV_FUNC_RETURN (H5_SUCCESS); +} + +static inline h5_err_t +release_tv ( + h5t_mesh_t* const m + ) { + H5_PRIV_FUNC_ENTER (h5_err_t, "m=%p", m); + h5t_adjacencies_t* adj = &m->adjacencies; + if (adj->tv.v == NULL) + H5_PRIV_FUNC_LEAVE (H5_SUCCESS); + + h5_loc_idx_t vertex_idx = 0; + h5_loc_idx_t last = m->num_loc_vertices[m->num_loaded_levels-1]; + for (; vertex_idx < last; vertex_idx++) { + TRY( h5priv_free_loc_idlist (&adj->tv.v[vertex_idx]) ); + } + TRY( h5_free (adj->tv.v) ); + adj->tv.v = NULL; + H5_PRIV_FUNC_RETURN (H5_SUCCESS); +} + +static inline h5_err_t +release_internal_structs ( + h5t_mesh_t* const m + ) { + H5_PRIV_FUNC_ENTER (h5_err_t, "m=%p", m); + TRY( release_tv (m) ); + TRY( h5priv_hdestroy (&m->adjacencies.te_hash) ); + memset (&m->adjacencies, 0, sizeof (m->adjacencies)); + H5_PRIV_FUNC_RETURN (H5_SUCCESS); +} + +struct h5t_core_methods h5tpriv_trim_core_methods = { + update_internal_structs, + release_internal_structs, +}; diff --git a/src/h5core/h5t_errorhandling_private.h b/src/h5core/h5t_errorhandling_private.h new file mode 100644 index 0000000..e710ef9 --- /dev/null +++ b/src/h5core/h5t_errorhandling_private.h @@ -0,0 +1,53 @@ +/* + Copyright (c) 2006-2013, The Regents of the University of California, + through Lawrence Berkeley National Laboratory (subject to receipt of any + required approvals from the U.S. Dept. of Energy) and the Paul Scherrer + Institut (Switzerland). All rights reserved. + + License: see file COPYING in top level of source distribution. +*/ + +#ifndef __H5T_ERRORHANDLING_PRIVATE_H +#define __H5T_ERRORHANDLING_PRIVATE_H + +#include "h5core/h5_types.h" +#include "h5core/h5_errorhandling.h" +#include "h5_debug_private.h" + +#define ERR_ELEM_NEXIST "Element with local vertex IDs (%s) doesn't exist!" + +static inline h5_err_t +h5tpriv_inval_codim ( + int codim, + int min_codim, + int max_codim + ) { + return h5_error (H5_ERR_INVAL, + "Co-dimension %d requested, " + "but must be between %d and %d", + codim, min_codim, max_codim); +} + +#define h5tpriv_error_undef_mesh() \ + h5_error( \ + H5_ERR_INVAL, \ + "Mesh not yet defined." ); + +#define h5tpriv_error_undef_level() \ + h5_error( \ + H5_ERR_INVAL, \ + "Level not defined." ); + + +#define h5tpriv_error_nexist_level( level_id ) \ + h5_error( \ + H5_ERR_INVAL, \ + "Level %lld doesn't exist.", (long long)level_id ); + +#define h5tpriv_error_local_triangle_nexist( indices ) \ + h5_error( \ + H5_ERR_NOENTRY, \ + "Triangle with local vertex IDs (%lld,%lld,%lld) doesn't exist!", \ + (long long)indices[0], (long long)indices[1], (long long)indices[2] ); + +#endif diff --git a/src/h5core/h5t_map.c b/src/h5core/h5t_map.c new file mode 100644 index 0000000..14f41c3 --- /dev/null +++ b/src/h5core/h5t_map.c @@ -0,0 +1,571 @@ +/* + Copyright (c) 2006-2012, The Regents of the University of California, + through Lawrence Berkeley National Laboratory (subject to receipt of any + required approvals from the U.S. Dept. of Energy) and the Paul Scherrer + Institut (Switzerland). All rights reserved. + + License: see file COPYING in top level of source distribution. +*/ + +#include "h5_fcmp_private.h" +#include "h5_hdf5_private.h" + +#include "h5t_types_private.h" +#include "h5t_access_private.h" +#include "h5t_map_private.h" +#include "h5core/h5t_map.h" +#include "h5t_model_private.h" +#include "h5_mpi_private.h" + +/* + Mapping of global to local id's: + + Before adding a new level or closing the mesh, we must define global id's + for the vertices and elements. This we have to do only for the last stored + level. + */ + + +/*! + Compare to vertices given by their 3-dimensional coordinates + */ +static int +cmp_vertices ( + h5_float64_t P0[3], + h5_float64_t P1[3] + ) { + int i; + for (i = 0; i < 3; i++) { + h5_int64_t diff = h5priv_fcmp (P0[i], P1[i], 10); + if (diff < 0) return -1; + else if (diff > 0) return 1; + } + return 0; +} + +/*! + Sort (small) array of local vertex indices geometrically. + */ +h5_err_t +h5tpriv_sort_local_vertex_indices ( + h5t_mesh_t* const m, + h5_loc_idx_t* const indices, /* IN/OUT: local vertex indices */ + const h5_size_t size /* size of array */ + ) { + H5_PRIV_API_ENTER (h5_err_t, + "m=%p, indices=%p, size=%llu", + m, indices, (long long unsigned)size); + + h5_size_t i; + for (i = 1; i < size; ++i) { + h5_loc_idx_t idx = indices[i]; + + h5_size_t j = i; + while ((j >= 1 ) && cmp_vertices ( + m->vertices[idx].P, + m->vertices[indices[j-1]].P + ) < 0 ) { + indices[j] = indices[j-1]; + --j; + } + indices[j] = idx; + } + H5_PRIV_API_RETURN (H5_SUCCESS); +} + +/*! + find if there is an entry with glb_idx in the map and return position + if not in map return the position last_position +1 + */ +#define h5tpriv_error_global_id_nexist( name, id ) \ + h5_error( \ + H5_ERR_NOENTRY, \ + "%s with global id %lld does not exist!", \ + name, (long long)id ); + +h5_loc_idx_t +h5tpriv_find_glb_idx_in_map ( + h5_idxmap_t* map, + const h5_glb_idx_t glb_idx + ) { + H5_CORE_API_ENTER (h5_loc_idx_t, "m=%p, glb_idx=%lld", map, (long long)glb_idx); + if (glb_idx < 0) return -1; + + h5_loc_idx_t loc_idx = h5priv_search_idxmap (map, glb_idx); // loc_idx is position in map + if (loc_idx < 0) { // set to next position + loc_idx = map->num_items; + } + H5_CORE_API_RETURN (loc_idx); +} + +/*! + Map a global vertex index to corresponding local index. + */ +h5_loc_idx_t +h5t_map_global_vertex_idx2local ( + h5t_mesh_t* const m, + const h5_glb_idx_t glb_idx + ) { + H5_CORE_API_ENTER (h5_loc_idx_t, "m=%p, glb_idx=%lld", m, (long long)glb_idx); + if (glb_idx < 0) return -1; + + h5_loc_idx_t loc_idx = h5priv_search_idxmap (&m->map_vertex_g2l, glb_idx); // loc_idx is position in map + if (loc_idx < 0) { + H5_CORE_API_LEAVE (h5tpriv_error_global_id_nexist ("vertex", glb_idx)); + } + H5_CORE_API_RETURN (m->map_vertex_g2l.items[loc_idx].loc_idx); // loc_idx is position in m->vertices! +} + +h5_err_t +h5t_map_global_vertex_indices2local ( + h5t_mesh_t* const m, + const h5_glb_idx_t* const glb_indices, + const h5_size_t size, + h5_loc_idx_t* const loc_indices + ) { + H5_CORE_API_ENTER (h5_err_t, + "m=%p, glb_indices=%p, size=%llu, loc_indices=%p", + m, glb_indices, (long long unsigned)size, loc_indices); + h5_size_t i; + for (i = 0; i < size; i++) { + TRY (loc_indices[i] = + h5t_map_global_vertex_idx2local (m, glb_indices[i])); + } + H5_CORE_API_RETURN (H5_SUCCESS); +} + +/*! + Get local element idx of element given by its global idx. + + \param[in] f File handle + \param[in] glb_idx Global element index + + \return Local element index + or -1, if \c glb_idx is -1 + or \c -glb_idx-2, if cell is on another proc + */ +h5_loc_idx_t +h5t_map_glb_elem_idx2loc ( + h5t_mesh_t* const m, + const h5_glb_idx_t glb_idx + ) { + H5_CORE_API_ENTER (h5_loc_idx_t, + "m=%p, glb_idx=%lld", + m, (long long)glb_idx); + + // global index is -1, if the cell is at the geometric border + if (glb_idx < 0) H5_CORE_API_LEAVE (-1); + + h5_loc_idx_t i = h5priv_search_idxmap (&m->map_elem_g2l, glb_idx); + // global index >= 0 && negative result means: element is on other proc + if (i < 0) H5_CORE_API_LEAVE (-glb_idx-2); + + H5_CORE_API_RETURN (m->map_elem_g2l.items[i].loc_idx); +} + + +h5_err_t +h5t_map_glb_elem_indices2loc ( + h5t_mesh_t* const m, + const h5_glb_idx_t* glb_indices, + const h5_size_t size, + h5_loc_idx_t* loc_indices + ) { + H5_CORE_API_ENTER (h5_err_t, + "m=%p, glb_indices=%p, size=%llu, loc_indices=%p", + m, glb_indices, (long long unsigned)size, loc_indices); + const h5_glb_idx_t* end = glb_indices+size; + + while (glb_indices < end) { + *loc_indices = h5t_map_glb_elem_idx2loc (m, *glb_indices); + loc_indices++; + glb_indices++; + } + H5_CORE_API_RETURN (H5_SUCCESS); +} + + +/* + rebuild mapping of global vertex indices to their local indices + */ +h5_err_t +h5tpriv_rebuild_map_vertex_g2l ( + h5t_mesh_t* const m, + h5_lvl_idx_t from_lvl, // from level + h5_lvl_idx_t to_lvl // up to and including this level + ) { + H5_CORE_API_ENTER (h5_loc_idx_t, "m=%p, from_lvl=%d, to_lvl=%d", + m, from_lvl, to_lvl); + + h5_loc_idx_t loc_idx = from_lvl > 0 ? m->num_loc_vertices[from_lvl-1] : 0; + h5_loc_idx_t num_loc_vertices = m->num_loc_vertices[to_lvl]; + h5_idxmap_el_t *item = &m->map_vertex_g2l.items[loc_idx]; + + for (; loc_idx < num_loc_vertices; loc_idx++, item++) { + item->glb_idx = m->vertices[loc_idx].idx; + item->loc_idx = loc_idx; + m->map_vertex_g2l.num_items++; + } + h5priv_sort_idxmap (&m->map_vertex_g2l); + H5_PRIV_API_RETURN (H5_SUCCESS); +} +/* + rebuild mapping of global vertex indices to their local indices + */ +h5_err_t +h5tpriv_rebuild_map_vertex_g2l_partial ( + h5t_mesh_t* const m + ) { + H5_CORE_API_ENTER (h5_loc_idx_t, "m=%p", + m); + + h5_loc_idx_t loc_idx = m->last_stored_vid_before_ref + 1; + h5_loc_idx_t start = loc_idx; + h5_loc_idx_t num_loc_vertices = m->last_stored_vid - m->last_stored_vid_before_ref; + h5_idxmap_el_t *item = &m->map_vertex_g2l.items[loc_idx]; + + for (; loc_idx < start + num_loc_vertices; loc_idx++, item++) { + item->glb_idx = m->vertices[loc_idx].idx; + item->loc_idx = loc_idx; + m->map_vertex_g2l.num_items++; + } + h5priv_sort_idxmap (&m->map_vertex_g2l); + H5_PRIV_API_RETURN (H5_SUCCESS); +} +/* + Get local vertex indices of entity given by it's local ID. + */ +h5_err_t +h5t_get_loc_vertex_indices_of_entity ( + h5t_mesh_t* const m, // in + const h5_loc_id_t entity_id, // in + h5_loc_idx_t* vertex_indices // out + ) { + H5_CORE_API_ENTER (h5_err_t, + "m=%p, entity_id=%llu, vertex_indices=%p", + m, + (long long unsigned)entity_id, + vertex_indices); + h5_loc_idx_t type = h5tpriv_get_entity_type (entity_id); + h5_loc_idx_t face_idx = h5tpriv_get_face_idx (entity_id); + h5_loc_idx_t elem_idx = h5tpriv_get_elem_idx (entity_id); + int dim = 0; + switch (type) { + case H5T_TYPE_VERTEX: dim = 0; break; + case H5T_TYPE_EDGE: dim = 1; break; + case H5T_TYPE_TRIANGLE: dim = 2; break; + case H5T_TYPE_TET: dim = 3; break; + default: + H5_CORE_API_LEAVE (h5_error_internal ()); + } + h5_loc_idx_t* indices = h5tpriv_get_loc_elem_vertex_indices (m, elem_idx); + const h5t_ref_elem_t* ref_elem = m->ref_elem; + int num_vertices = ref_elem->num_vertices_of_face[dim][face_idx]; + for (int i = 0; i < num_vertices; i++) { + int idx = h5tpriv_ref_elem_get_vertex_idx(m, dim, face_idx, i); + vertex_indices[i] = indices[idx]; + } + H5_CORE_API_RETURN (H5_SUCCESS); +} + +h5_err_t +h5t_get_glb_vertex_indices_of_entity ( + h5t_mesh_t* const m, // in + const h5_loc_id_t entity_id, // in + h5_glb_idx_t* vertex_indices // out + ) { + H5_CORE_API_ENTER (h5_err_t, + "m=%p, entity_id=%llu, vertex_indices=%p", + m, + (long long unsigned)entity_id, + vertex_indices); + h5_loc_idx_t type = h5tpriv_get_entity_type (entity_id); + h5_loc_idx_t face_idx = h5tpriv_get_face_idx (entity_id); + h5_loc_idx_t elem_idx = h5tpriv_get_elem_idx (entity_id); + int dim = 0; + switch (type) { + case H5T_TYPE_VERTEX: dim = 0; break; + case H5T_TYPE_EDGE: dim = 1; break; + case H5T_TYPE_TRIANGLE: dim = 2; break; + case H5T_TYPE_TET: dim = 3; break; + default: + H5_CORE_API_LEAVE (h5_error_internal ()); + } + h5_loc_idx_t* indices = h5tpriv_get_loc_elem_vertex_indices (m, elem_idx); + const h5t_ref_elem_t* ref_elem = m->ref_elem; + int num_vertices = ref_elem->num_vertices_of_face[dim][face_idx]; + for (int i = 0; i < num_vertices; i++) { + int idx = h5tpriv_ref_elem_get_vertex_idx(m, dim, face_idx, i); + h5_loc_idx_t loc_idx = indices[idx]; + vertex_indices[i] = m->vertices[loc_idx].idx; + } + H5_CORE_API_RETURN (H5_SUCCESS); +} + +h5_err_t +h5tpriv_get_vertex_index_of_vertex ( + h5t_mesh_t* const m, + const h5_loc_id_t entity_id, + h5_loc_idx_t* vertex_index + ) { + H5_CORE_API_ENTER (h5_loc_idx_t, + "m=%p, entity_id=%llu, vertex_index=%llu", + m, + (long long unsigned)entity_id, + (long long unsigned)*vertex_index); + h5_loc_idx_t face_idx = h5tpriv_get_face_idx (entity_id); + h5_loc_idx_t elem_idx = h5tpriv_get_elem_idx (entity_id); + H5_CORE_API_RETURN (h5tpriv_get_vertex_index_of_vertex2 ( + m, face_idx, elem_idx, vertex_index)); +} + +h5_err_t +h5tpriv_get_vertex_index_of_vertex2 ( + h5t_mesh_t* const m, + const h5_loc_idx_t face_idx, // vertex index according ref. element + const h5_loc_idx_t elem_idx, // local element index + h5_loc_idx_t* vertex_indices // OUT: vertex ID's + ) { + H5_CORE_API_ENTER (h5_err_t, + "m=%p, face_idx=%llu, elem_idx=%llu, vertex_indices=%p", + m, + (long long unsigned)face_idx, + (long long unsigned)elem_idx, + vertex_indices); + vertex_indices[0] = h5tpriv_get_loc_elem_vertex_idx (m, elem_idx, face_idx); + H5_CORE_API_RETURN (H5_SUCCESS); +} + +/* + Get the local ID of the vertices of an elemet. + */ +h5_err_t +h5t_get_loc_vertex_indices_of_edge ( + h5t_mesh_t* const m, + const h5_loc_id_t entity_id, + h5_loc_idx_t* vertex_indices + ) { + H5_CORE_API_ENTER (h5_loc_idx_t, + "m=%p, entity_id=%llu, vertex_indices=%p", + m, + (long long unsigned)entity_id, + vertex_indices); + h5_loc_idx_t face_idx = h5tpriv_get_face_idx (entity_id); + h5_loc_idx_t elem_idx = h5tpriv_get_elem_idx (entity_id); + H5_CORE_API_RETURN (h5t_get_loc_vertex_indices_of_edge2 ( + m, face_idx, elem_idx, vertex_indices)); +} + +/*! + Get local vertex indices of an edge. The edge is specified by the local + element index and the face number of the edge according the reference + element. + + This function can be used with tetrahedral and triangle meshes. + */ +h5_err_t +h5t_get_loc_vertex_indices_of_edge2 ( + h5t_mesh_t* const m, + const h5_loc_idx_t face_idx, // edge index according ref. element + const h5_loc_idx_t elem_idx, // local element index + h5_loc_idx_t* vertex_indices // OUT: vertex indices + ) { + H5_CORE_API_ENTER (h5_err_t, + "m=%p, face_idx=%llu, elem_idx=%llu, vertex_indices=%p", + m, + (long long unsigned)face_idx, + (long long unsigned)elem_idx, + vertex_indices); + const h5_loc_idx_t* indices = h5tpriv_get_loc_elem_vertex_indices (m, elem_idx); + + h5_loc_idx_t idx; + idx = h5tpriv_ref_elem_get_vertex_idx (m, 1, face_idx, 0); + vertex_indices[0] = indices[idx]; + idx = h5tpriv_ref_elem_get_vertex_idx (m, 1, face_idx, 1); + vertex_indices[1] = indices[idx]; + H5_CORE_API_RETURN (H5_SUCCESS); +} + +h5_err_t +h5t_get_loc_vertex_indices_of_triangle ( + h5t_mesh_t* const m, + const h5_loc_id_t entity_id, + h5_loc_idx_t* vertex_indices + ) { + H5_CORE_API_ENTER (h5_loc_idx_t, + "m=%p, entity_id=%llu, vertex_indices=%p", + m, + (long long unsigned)entity_id, + vertex_indices); + h5_loc_idx_t face_idx = h5tpriv_get_face_idx (entity_id); + h5_loc_idx_t elem_idx = h5tpriv_get_elem_idx (entity_id); + H5_CORE_API_RETURN (h5t_get_loc_vertex_indices_of_triangle2 ( + m, face_idx, elem_idx, vertex_indices)); +} + +h5_err_t +h5t_get_loc_vertex_indices_of_triangle2 ( + h5t_mesh_t* const m, + const h5_loc_idx_t face_idx, + const h5_loc_idx_t elem_idx, + h5_loc_idx_t* vertex_indices + ) { + H5_CORE_API_ENTER (h5_err_t, + "m=%p, face_idx=%llu, elem_idx=%llu, vertex_indices=%p", + m, + (long long unsigned)face_idx, + (long long unsigned)elem_idx, + vertex_indices); + const h5_loc_idx_t* indices = h5tpriv_get_loc_elem_vertex_indices (m, elem_idx); + + h5_loc_idx_t idx; + idx = h5tpriv_ref_elem_get_vertex_idx (m, 2, face_idx, 0); + vertex_indices[0] = indices[idx]; + idx = h5tpriv_ref_elem_get_vertex_idx (m, 2, face_idx, 1); + vertex_indices[1] = indices[idx]; + idx = h5tpriv_ref_elem_get_vertex_idx (m, 2, face_idx, 2); + vertex_indices[2] = indices[idx]; + H5_CORE_API_RETURN (H5_SUCCESS); +} + +h5_err_t +h5t_get_loc_vertex_indices_of_tet ( + h5t_mesh_t* const m, + const h5_loc_id_t entity_id, + h5_loc_idx_t* vertex_indices + ) { + H5_CORE_API_ENTER (h5_loc_idx_t, + "m=%p, entity_id=%llu, vertex_indices=%p", + m, + (long long unsigned)entity_id, + vertex_indices); + + const h5_loc_idx_t elem_idx = h5tpriv_get_elem_idx (entity_id); + const h5_loc_idx_t* indices = h5tpriv_get_loc_elem_vertex_indices ( + m, elem_idx); + + h5_loc_idx_t idx; + idx = h5tpriv_ref_elem_get_vertex_idx (m, 3, 0, 0); + vertex_indices[0] = indices[idx]; + idx = h5tpriv_ref_elem_get_vertex_idx (m, 3, 0, 1); + vertex_indices[1] = indices[idx]; + idx = h5tpriv_ref_elem_get_vertex_idx (m, 3, 0, 2); + vertex_indices[2] = indices[idx]; + idx = h5tpriv_ref_elem_get_vertex_idx (m, 3, 0, 3); + vertex_indices[3] = indices[idx]; + H5_CORE_API_RETURN (H5_SUCCESS); +} + +#ifdef PARALLEL_IO +int +compare_glb_idx_oct (const void * p_a,const void* p_b) { + return *(h5_glb_idx_t*) p_a - *(h5_glb_idx_t*) p_b; +} + +/* + * takes all local element idx from m->marked_entities gets their glb_idx + * and exchanges them with all proc and adds them to the glb_list + */ +h5_err_t +h5priv_exchange_loc_list_to_glb ( + h5t_mesh_t* const m, + h5_glb_idxlist_t** glb_list + ) { + H5_PRIV_FUNC_ENTER (h5_err_t, "m=%p, glb_list=%p", m, glb_list); + int* num_elems = NULL; + TRY (num_elems = h5_calloc (m->f->nprocs, sizeof (*num_elems))); + + // exchange size of marked_entities + TRY (h5priv_mpi_allgather ( + &m->marked_entities->num_items, + 1, + MPI_INT, + num_elems, + 1, + MPI_INT, + m->f->props->comm)); + // calc sendbuf + h5_glb_idx_t* sendbuf; + TRY (sendbuf = h5_calloc (m->marked_entities->num_items, sizeof (*sendbuf))); + // loc -> glb + for (int i = 0; i < m->marked_entities->num_items; i++) { + if (m->marked_entities->items[i] > m->last_stored_eid) { + H5_PRIV_FUNC_LEAVE (h5_error ( + H5_ERR_INVAL, + "Element chosen to be refined is %d but there are only %d elements", + m->marked_entities->items[i], + m->last_stored_eid + 1 )); + } + + sendbuf[i] = h5tpriv_get_loc_elem_glb_idx (m, m->marked_entities->items[i]); + + } + + + int* recvdispls = NULL; + TRY (recvdispls = h5_calloc (m->f->nprocs, sizeof (*recvdispls))); + int num_tot_elems = num_elems[0]; + for (int i = 1; i < m->f->nprocs; i++) { + recvdispls[i] = recvdispls[i-1] + num_elems[i-1]; + num_tot_elems += num_elems[i]; + } + TRY (h5priv_alloc_glb_idxlist (glb_list, num_tot_elems)); + (*glb_list)->num_items = num_tot_elems; + // exchange + TRY (mpi_allgatherv ( + sendbuf, + m->marked_entities->num_items, + MPI_LONG_LONG, + (*glb_list)->items, + num_elems, + recvdispls, + MPI_LONG_LONG, + m->f->props->comm + )) + + + qsort ((*glb_list)->items, num_tot_elems, sizeof (*(*glb_list)->items), compare_glb_idx_oct); + TRY (h5_free (num_elems)); + TRY (h5_free (sendbuf)); + TRY (h5_free (recvdispls)); + H5_PRIV_FUNC_RETURN (H5_SUCCESS); +} +#endif + +/* + Find ID in sorted list +*/ +h5_loc_id_t +h5priv_find_idlist ( + h5_loc_idlist_t* list, + const h5_loc_id_t item + ) { + H5_PRIV_API_ENTER (h5_err_t, + "list=%p, item=%llu", + list, (long long unsigned)item); + if (!list) { + H5_PRIV_API_LEAVE (-1); + } + register size_t low = 0; + register size_t mid; + register size_t high = list->num_items - 1; + register h5_loc_idx_t diff; + const h5_loc_id_t face_id = h5tpriv_get_face_id(item); + const h5_loc_idx_t elem_idx = h5tpriv_get_elem_idx(item); + while (low <= high) { + mid = (low + high) / 2; + diff = h5tpriv_get_elem_idx(list->items[mid]) - elem_idx; + // if element indices are equal, we decide on the face indices + if (diff == 0) { + diff = h5tpriv_get_face_id (list->items[mid]) - face_id; + } + if ( diff > 0 ) + high = mid - 1; + else if ( diff < 0 ) + low = mid + 1; + else + H5_PRIV_API_LEAVE (mid); // found + } + H5_PRIV_API_RETURN (-(low+1)); // not found +} + diff --git a/src/h5core/h5t_map_private.h b/src/h5core/h5t_map_private.h new file mode 100644 index 0000000..c937e4b --- /dev/null +++ b/src/h5core/h5t_map_private.h @@ -0,0 +1,120 @@ +/* + Copyright (c) 2006-2013, The Regents of the University of California, + through Lawrence Berkeley National Laboratory (subject to receipt of any + required approvals from the U.S. Dept. of Energy) and the Paul Scherrer + Institut (Switzerland). All rights reserved. + + License: see file COPYING in top level of source distribution. +*/ + +#ifndef __H5T_MAP_PRIVATE_H +#define __H5T_MAP_PRIVATE_H + +#include "h5_types_private.h" +#include "h5core/h5_debug.h" +#include "h5core/h5_errorhandling.h" +#include "h5core/h5_syscall.h" +#include "h5_debug_private.h" +#include "h5t_model_private.h" + +/* + Find ID in sorted list + Special version of macro h5priv_find_in_xlist() for local and global entity IDs +*/ +#define h5priv_find_in_idlist(type) \ + static inline h5_loc_idx_t \ + h5priv_find_in_ ## type ## list ( \ + h5_ ## type ## list_t* list, \ + const h5_ ## type ## _t item \ + ) { \ + H5_PRIV_API_ENTER (h5_err_t, \ + "list=%p, item=%llu", \ + list, (long long unsigned)item); \ + if (!list) { \ + H5_PRIV_API_LEAVE (-1); \ + } \ + register size_t low = 0; \ + register size_t mid; \ + register size_t high = list->num_items - 1; \ + register h5_ ## type ## x_t diff; \ + const h5_ ## type ## _t face_id = h5tpriv_get_face_id(item); \ + const h5_ ## type ## x_t elem_idx = h5tpriv_get_elem_idx(item); \ + while (low <= high) { \ + mid = (low + high) / 2; \ + diff = h5tpriv_get_elem_idx(list->items[mid]) - elem_idx; \ + if (diff == 0) { \ + diff = h5tpriv_get_face_id (list->items[mid]) - face_id; \ + } \ + if ( diff > 0 ) \ + high = mid - 1; \ + else if ( diff < 0 ) \ + low = mid + 1; \ + else \ + H5_PRIV_API_LEAVE (mid); \ + } \ + H5_PRIV_API_RETURN (-(low+1)); \ + } + + +h5priv_alloc_xlist (loc_id) +h5priv_free_xlist (loc_id) +h5priv_insert_into_xlist (loc_id) +h5priv_find_in_idlist (loc_id) +h5priv_search_in_xlist (loc_id) + +h5priv_alloc_xlist (glb_id) +h5priv_free_xlist (glb_id) +h5priv_insert_into_xlist (glb_id) +h5priv_find_in_idlist (glb_id) +h5priv_search_in_xlist (glb_id) + +h5_err_t +h5tpriv_get_vertex_index_of_vertex ( + h5t_mesh_t* const m, + const h5_loc_id_t entity_id, + h5_loc_idx_t* vertex_index + ); + +h5_err_t +h5tpriv_get_vertex_index_of_vertex2 ( + h5t_mesh_t* const m, + const h5_loc_idx_t face_idx, + const h5_loc_idx_t elem_idx, + h5_loc_idx_t* vertex_indices + ); + +h5_err_t +h5tpriv_sort_local_vertex_indices ( + h5t_mesh_t* const m, + h5_loc_idx_t * const indices, + const h5_size_t size + ); + +h5_loc_idx_t +h5tpriv_get_local_vid ( + h5t_mesh_t* const m, + h5_float64_t P[3] + ); + +h5_err_t +h5tpriv_rebuild_map_vertex_g2l ( + h5t_mesh_t* const m, + h5_lvl_idx_t from_lvl, + h5_lvl_idx_t to_lvl + ); +h5_err_t +h5tpriv_rebuild_map_vertex_g2l_partial ( + h5t_mesh_t* const m + ); +h5_err_t +h5priv_exchange_loc_list_to_glb ( + h5t_mesh_t* const m, + h5_glb_idxlist_t** glb_list + ); + +h5_loc_idx_t +h5tpriv_find_glb_idx_in_map ( + h5_idxmap_t* map, + const h5_glb_idx_t glb_idx + ); +#endif diff --git a/src/h5core/h5t_model.c b/src/h5core/h5t_model.c new file mode 100644 index 0000000..c0cb97a --- /dev/null +++ b/src/h5core/h5t_model.c @@ -0,0 +1,598 @@ +/* + Copyright (c) 2006-2012, The Regents of the University of California, + through Lawrence Berkeley National Laboratory (subject to receipt of any + required approvals from the U.S. Dept. of Energy) and the Paul Scherrer + Institut (Switzerland). All rights reserved. + + License: see file COPYING in top level of source distribution. +*/ + +#include "h5core/h5.h" +#include "h5_mpi_private.h" +#include "h5_errorhandling_private.h" + +#include "h5_attribs_private.h" +#include "h5_hdf5_private.h" + +#include "h5t_types_private.h" +#include "h5t_errorhandling_private.h" +#include "h5t_model_private.h" +#include "h5t_adjacencies_private.h" +#include "h5t_readwrite_private.h" +#include "h5t_tags_private.h" + +#include "h5_init_private.h" + +#include "h5core/h5_model.h" +#include "h5t_core_private.h" +#include "h5t_store_private.h" + +#include +#include + + +/*! + \ingroup h5_private + + \internal + + Initialize topo internal structure. The structure has already be initialized + with zero's. + + \return H5_SUCCESS or error code + */ +h5_err_t +h5tpriv_init_mesh ( + h5t_mesh_t* const m, + const h5_file_p f, + const char* name, + const hid_t mesh_hid, + const hid_t elem_type, + const h5t_ref_elem_t* ref_elem, + h5t_methods_t* methods, + const int create_mesh + ) { + H5_PRIV_API_ENTER (h5_err_t, "m=%p", m); + + m->f = f; + strncpy (m->mesh_name, name, sizeof (m->mesh_name)-1); + m->mesh_name[sizeof(m->mesh_name)-1] = '\0'; + m->mesh_gid = mesh_hid; + m->ref_elem = ref_elem; + m->methods = methods; + + m->mesh_changed = 0; + m->num_leaf_levels = -1; + m->leaf_level = 0; + m->last_stored_vid = -1; + m->last_stored_eid = -1; + m->last_stored_vid_before_ref = -1; + m->last_stored_eid_before_ref = -1; + m->timing.num_timing = NUM_TIMING; + m->timing.next_time = 0; + m->timing.f = NULL; + m->is_chunked = 0; + + /* initialize pointers */ + m->octree = NULL; + m->chunks = NULL; + m->loc_elems = NULL; + m->num_interior_elems = NULL; + m->num_glb_elems = NULL; + m->num_interior_leaf_elems = NULL; + m->num_glb_leaf_elems = NULL; + m->map_elem_g2l.items = NULL; + m->vertices = NULL; + m->num_loc_vertices = NULL; + m->map_vertex_g2l.items = NULL; + m->num_b_vtx = NULL; + m->first_b_vtx = NULL; +// m->weights = NULL; + + /* chunks */ + strcpy (m->dsinfo_chunks.name, "Chunks"); + m->dsinfo_chunks.rank = 1; + m->dsinfo_chunks.dims[0] = 0; + m->dsinfo_chunks.max_dims[0] = H5S_UNLIMITED; + m->dsinfo_chunks.chunk_dims[0] = 4096; + m->dsinfo_chunks.type_id = h5_dta_types.h5_chunk_t; + TRY (m->dsinfo_chunks.create_prop = hdf5_create_property ( + H5P_DATASET_CREATE) ); + TRY (hdf5_set_chunk_property ( + m->dsinfo_chunks.create_prop, + m->dsinfo_chunks.rank, + m->dsinfo_chunks.chunk_dims) ); + m->dsinfo_chunks.access_prop = H5P_DEFAULT; + + /* octree */ + strcpy (m->dsinfo_octree.name, "Octants"); + m->dsinfo_octree.rank = 1; + m->dsinfo_octree.dims[0] = 0; + m->dsinfo_octree.max_dims[0] = H5S_UNLIMITED; + m->dsinfo_octree.chunk_dims[0] = 4096; + m->dsinfo_octree.type_id = h5_dta_types.h5_octree_t; + TRY (m->dsinfo_octree.create_prop = hdf5_create_property ( + H5P_DATASET_CREATE) ); + TRY (hdf5_set_chunk_property ( + m->dsinfo_octree.create_prop, + m->dsinfo_octree.rank, + m->dsinfo_octree.chunk_dims) ); + m->dsinfo_octree.access_prop = H5P_DEFAULT; + + /* octree userdata */ + strcpy (m->dsinfo_userdata.name, "Oct_userdata"); + m->dsinfo_userdata.rank = 1; + m->dsinfo_userdata.dims[0] = 0; + m->dsinfo_userdata.max_dims[0] = H5S_UNLIMITED; + m->dsinfo_userdata.chunk_dims[0] = 4096; + m->dsinfo_userdata.type_id = h5_dta_types.h5_userdata_t; + TRY (m->dsinfo_userdata.create_prop = hdf5_create_property ( + H5P_DATASET_CREATE) ); + TRY (hdf5_set_chunk_property ( + m->dsinfo_userdata.create_prop, + m->dsinfo_userdata.rank, + m->dsinfo_userdata.chunk_dims) ); + m->dsinfo_userdata.access_prop = H5P_DEFAULT; + + /* vertices */ + strcpy (m->dsinfo_vertices.name, "Vertices"); + m->dsinfo_vertices.rank = 1; + m->dsinfo_vertices.dims[0] = 0; + m->dsinfo_vertices.max_dims[0] = H5S_UNLIMITED; + m->dsinfo_vertices.chunk_dims[0] = 4096; + m->dsinfo_vertices.type_id = h5_dta_types.h5_vertex_t; + TRY (m->dsinfo_vertices.create_prop = hdf5_create_property ( + H5P_DATASET_CREATE) ); + TRY (hdf5_set_chunk_property ( + m->dsinfo_vertices.create_prop, + m->dsinfo_vertices.rank, + m->dsinfo_vertices.chunk_dims) ); + m->dsinfo_vertices.access_prop = H5P_DEFAULT; + + /* Elems */ + strcpy (m->dsinfo_elems.name, "Elems"); + m->dsinfo_elems.rank = 1; + m->dsinfo_elems.dims[0] = 0; + m->dsinfo_elems.max_dims[0] = H5S_UNLIMITED; + m->dsinfo_elems.chunk_dims[0] = 4096; + m->dsinfo_elems.type_id = elem_type; + TRY (m->dsinfo_elems.create_prop = hdf5_create_property ( + H5P_DATASET_CREATE) ); + TRY (hdf5_set_chunk_property ( + m->dsinfo_elems.create_prop, + m->dsinfo_elems.rank, + m->dsinfo_elems.chunk_dims) ); + m->dsinfo_elems.access_prop = H5P_DEFAULT; + + /* Weights */ + strcpy (m->dsinfo_weights.name, "weights"); + m->dsinfo_weights.rank = 1; +// m->dsinfo_weights.rank = 2; + m->dsinfo_weights.dims[0] = 0; +// m->dsinfo_weights.dims[1] = 0; + m->dsinfo_weights.max_dims[0] = H5S_UNLIMITED; +// m->dsinfo_weights.max_dims[1] = H5S_UNLIMITED; + m->dsinfo_weights.chunk_dims[0] = 4096; +// m->dsinfo_weights.chunk_dims[0] = 4096; + m->dsinfo_weights.type_id = h5_dta_types.h5_int32_t; + TRY (m->dsinfo_weights.create_prop = hdf5_create_property ( + H5P_DATASET_CREATE) ); + TRY (hdf5_set_chunk_property ( + m->dsinfo_weights.create_prop, + m->dsinfo_weights.rank, + m->dsinfo_weights.chunk_dims) ); + m->dsinfo_weights.access_prop = H5P_DEFAULT; + + if (create_mesh) { + m->num_leaf_levels = 0; + } else { + TRY (h5priv_read_attrib ( + m->mesh_gid, + "__num_leaf_levels__", + H5T_NATIVE_INT16, + &m->num_leaf_levels)); + m->leaf_level = m->num_leaf_levels-1; //seems not to be set otherwise but for reading vtx it should be... + TRY (m->num_glb_elems = h5_calloc (m->num_leaf_levels, sizeof(*m->num_glb_elems))); + TRY (m->num_glb_leaf_elems = h5_calloc (m->num_leaf_levels, sizeof(*m->num_glb_leaf_elems))); + TRY (m->num_glb_vertices = h5_calloc (m->num_leaf_levels, sizeof (*m->num_glb_vertices))); + + TRY (m->num_b_vtx = h5_alloc (m->num_b_vtx, m->num_leaf_levels*sizeof (*m->num_b_vtx))); + TRY (m->first_b_vtx = h5_alloc (m->first_b_vtx, m->num_leaf_levels*sizeof (*m->first_b_vtx))); + + TRY (m->num_interior_elems = h5_calloc (m->num_leaf_levels, sizeof(*m->num_interior_elems))); + TRY (m->num_interior_leaf_elems = h5_calloc (m->num_leaf_levels, sizeof(*m->num_interior_leaf_elems))); + TRY (m->num_ghost_elems = h5_calloc (m->num_leaf_levels, sizeof(*m->num_ghost_elems))); + TRY (m->num_loc_vertices = h5_calloc (m->num_leaf_levels, sizeof (*m->num_loc_vertices))); + + TRY (h5priv_read_attrib ( + m->mesh_gid, + "__num_elems__", + H5T_NATIVE_INT64, + m->num_glb_elems)); + + TRY (h5priv_read_attrib ( + m->mesh_gid, + "__num_leaf_elems__", + H5T_NATIVE_INT64, + m->num_glb_leaf_elems)); + + TRY (h5priv_read_attrib ( + m->mesh_gid, + "__num_vertices__", + H5T_NATIVE_INT64, + m->num_glb_vertices)); + // if the file version is lower the following attributes are missing: + hid_t exists; + TRY (exists = hdf5_attribute_exists ( + m->mesh_gid, + "__is_chunked__")); + if (exists) { + + TRY (h5priv_read_attrib ( + m->mesh_gid, + "__num_b_vertices__", + H5T_NATIVE_INT64, + m->num_b_vtx)); + TRY (h5priv_read_attrib ( + m->mesh_gid, + "__first_b_vertices__", + H5T_NATIVE_INT64, + m->first_b_vtx)); + TRY (h5priv_read_attrib ( + m->mesh_gid, + "__is_chunked__", + H5T_NATIVE_INT16, + &m->is_chunked)); + TRY (h5priv_read_attrib ( + m->mesh_gid, + "__num_weights__", + H5T_NATIVE_INT32, + &m->num_weights)); + } else { + memset (m->num_b_vtx, -1, m->num_leaf_levels * sizeof (m->num_b_vtx)); + memset (m->first_b_vtx, -1, m->num_leaf_levels * sizeof (m->first_b_vtx)); + m->is_chunked = 0; + m->num_weights = 0; + } + + + } + H5_PRIV_FUNC_RETURN (H5_SUCCESS); +} + + +/* + Open HDF5 group with specific mesh + */ +static h5_err_t +release_elems ( + h5t_mesh_t* const m + ) { + H5_PRIV_FUNC_ENTER (h5_err_t, "m=%p", m); + TRY (h5_free (m->loc_elems)); m->loc_elems = NULL; + TRY (h5_free (m->num_glb_elems)); m->num_glb_elems = NULL; + TRY (h5_free (m->num_glb_leaf_elems)); m->num_glb_leaf_elems = NULL; + TRY (h5_free (m->num_interior_elems)); m->num_interior_elems = NULL; + TRY (h5_free (m->num_interior_leaf_elems)); m->num_interior_leaf_elems = NULL; + TRY (h5_free (m->num_ghost_elems)); m->num_ghost_elems = NULL; + TRY (h5_free (m->map_elem_g2l.items)); m->map_elem_g2l.items = NULL; + H5_PRIV_FUNC_RETURN (H5_SUCCESS); +} + +static h5_err_t +release_vertices ( + h5t_mesh_t* const m + ) { + H5_PRIV_FUNC_ENTER (h5_err_t, "m=%p", m); + TRY (h5_free (m->vertices)); m->vertices = NULL; + TRY (h5_free (m->num_glb_vertices)); m->num_glb_vertices = NULL; + TRY (h5_free (m->num_loc_vertices)); m->num_loc_vertices = NULL; + TRY (h5_free (m->map_vertex_g2l.items)); m->map_vertex_g2l.items = NULL; + TRY (h5_free (m->first_b_vtx)); m->first_b_vtx = NULL; + TRY (h5_free (m->num_b_vtx)); m->num_b_vtx = NULL; + H5_PRIV_FUNC_RETURN (H5_SUCCESS); +} + +static h5_err_t +release_memory ( + h5t_mesh_t* const m + ) { + H5_PRIV_FUNC_ENTER (h5_err_t, "m=%p", m); + TRY (h5tpriv_release_adjacency_structs (m)); + TRY (release_elems (m)); + TRY (release_vertices (m)); +#ifdef PARALLEL_IO + if (m->is_chunked) { + TRY (h5tpriv_free_chunks (m)); + TRY (H5t_free_octree (m->octree)); + TRY (h5_free (m->weights)); + } +#endif + TRY (h5_free (m)); + H5_PRIV_FUNC_RETURN (H5_SUCCESS); +} + +h5_err_t +write_timing ( + h5t_mesh_t* const m +) { + H5_CORE_API_ENTER (h5_err_t, "m=%p", m); + if (m->f->myproc == 0 && m->timing.f != NULL) { + FILE* file = fopen (m->timing.f,"a"); + h5_time_t tmp =m->timing.measure[m->timing.num_timing-1]- m->timing.measure[0]; + fprintf (file,"#writing timing \n " + " nprocs max_chunks num_elems tot_time init_mesh " + " reading_octree reading_chunks reading_weights " + " distributing_chunks reading_elems reading_vtx " + " internal_update ref pre_ref ref boundary weights " + " init_glb_elems init_glb_vtx exchange_glb_structs " + " store_glb_struct post_ref close " + " write_weights write_chunks write_octree " + " calc_vtx_map vtx_hyperslap write_vertices write_elems " + "\n" + " %d %d %lld %4.4f", + m->f->nprocs, max_num_elems_p_chunk, + (long long int) m->num_glb_elems[m->num_leaf_levels-1], + tmp >=0 ? tmp: 0); + + for (int i = 1; i < m->timing.num_timing; i++) { + tmp = m->timing.measure[i]- m->timing.measure[i-1] ; + fprintf (file," %4.4f ", tmp >=0 ? tmp: 0 ); + } + fprintf (file,"\n"); + fprintf (file, "# nprocs reading_octree_chunks distribute_chunks reading_elems" + " reading_vtx refinement postrefinement write_oct_chunks " + " vtx_hyperslaps write_vtx write_elems\n"); + fprintf (file,"# %d %4.4f %4.4f %4.4f %4.4f %4.4f %4.4f %4.4f %4.4f %4.4f %4.4f \n\n", + m->f->nprocs, + m->timing.measure[4] - m->timing.measure[0], + m->timing.measure[5] - m->timing.measure[4], + m->timing.measure[6] - m->timing.measure[5], + m->timing.measure[8] - m->timing.measure[6], + m->timing.measure[11] - m->timing.measure[8], + m->timing.measure[18] - m->timing.measure[11], + m->timing.measure[22] - m->timing.measure[18], + m->timing.measure[24] - m->timing.measure[22], + m->timing.measure[25] - m->timing.measure[24], + m->timing.measure[26] - m->timing.measure[25]); + fclose (file); + } + H5_CORE_API_RETURN (H5_SUCCESS); +} +h5_err_t +set_timing_file ( + h5t_mesh_t* const m, + char* time_f + ) { + H5_CORE_API_ENTER (h5_err_t, "m=%p", m); + m->timing.f = time_f; + H5_CORE_API_RETURN (H5_SUCCESS); +} +h5_err_t +h5t_close_mesh ( + h5t_mesh_t* const m + ) { + H5_CORE_API_ENTER (h5_err_t, "m=%p", m); +#ifdef PARALLEL_IO + TRY (h5priv_mpi_barrier (m->f->props->comm)); + m->timing.measure[m->timing.next_time++] = MPI_Wtime(); +#endif + // check if tagsets are still open + if (m->mtagsets && m->mtagsets->num_items > 0) + H5_CORE_API_LEAVE ( + h5_error ( + H5_ERR_H5FED, + "Mesh cannot be closed: Mesh is referenced by open tagsets")); + + if (!(m->f->props->mode & H5_O_RDONLY)) { + TRY (h5tpriv_write_mesh (m)); + } + TRY (hdf5_close_group (m->mesh_gid)); + + TRY (write_timing (m)); + + TRY (release_memory (m)); + H5_CORE_API_RETURN (H5_SUCCESS); +} + +h5_err_t +h5t_set_level ( + h5t_mesh_t* const m, + const h5_lvl_idx_t level_id + ) { + H5_CORE_API_ENTER (h5_err_t, "m=%p, level_id=%d", m, level_id); + + if ((level_id < 0) || (level_id >= m->num_leaf_levels)) + H5_CORE_API_LEAVE (HANDLE_H5_OUT_OF_RANGE_ERR ("Level", level_id)); + + h5_lvl_idx_t prev_level = m->leaf_level; + m->leaf_level = level_id; + + if (level_id >= m->num_loaded_levels) { + TRY (h5tpriv_update_internal_structs (m, ++prev_level)); + } + H5_CORE_API_RETURN (H5_SUCCESS); +} + +h5_err_t +h5t_set_mesh_changed ( + h5t_mesh_t* const m + ) { + H5_CORE_API_ENTER (h5_err_t, "m=%p",m); + m->mesh_changed = 1; + H5_CORE_API_RETURN (H5_SUCCESS); +} + +/* + Allocate \c num additional vertices. + */ +h5_err_t +h5tpriv_alloc_loc_vertices ( + h5t_mesh_t* const m, + const h5_size_t num + ) { + H5_PRIV_FUNC_ENTER (h5_err_t, + "m=%p, num=%llu", + m, + (long long unsigned)num); + ssize_t size = num * sizeof (m->vertices[0]); + TRY (m->vertices = h5_alloc (m->vertices, size)); + TRY (h5priv_grow_idxmap (&m->map_vertex_g2l, num)); + H5_PRIV_API_RETURN (H5_SUCCESS); +} + + +/*! + Get number of meshes of given type. + + \param[in] f File handle + \param[in] type_id Type of mesh we want the number of. + + \return Number of meshes of type \c type_id or error code. + */ +static inline h5_ssize_t +get_num_meshes ( + const h5_file_t fh, + const char* grpname + ) { + h5_file_p f = (h5_file_p)fh; + H5_PRIV_FUNC_ENTER (h5_ssize_t, "f=%p, grpname=%s", f, grpname); + hid_t topo_gid = -1; + hid_t meshes_gid = -1; + + h5_err_t exists; + TRY (exists = hdf5_link_exists (f->root_gid, H5T_CONTAINER_GRPNAME)); + if (!exists) H5_CORE_API_LEAVE (0); + + TRY (topo_gid = hdf5_open_group (f->root_gid, H5T_CONTAINER_GRPNAME)); + + TRY (exists = hdf5_link_exists (topo_gid, grpname)); + if (!exists) H5_CORE_API_LEAVE (0); + + TRY (meshes_gid = hdf5_open_group (topo_gid, grpname)); + h5_ssize_t num_meshes; + TRY (num_meshes = hdf5_get_num_groups (meshes_gid)); + TRY (hdf5_close_group (meshes_gid) ); + TRY (hdf5_close_group (topo_gid) ); + + H5_CORE_API_RETURN (num_meshes); +} + +h5_ssize_t +h5t_get_num_tetmeshes ( + const h5_file_t fh + ) { + H5_CORE_API_ENTER (h5_ssize_t, "f=%p", (h5_file_p)fh); + H5_CORE_API_RETURN (get_num_meshes (fh, TETRAHEDRAL_MESHES_GRPNAME)); +} + +h5_ssize_t +h5t_get_num_trimeshes ( + const h5_file_t fh + ) { + H5_CORE_API_ENTER (h5_ssize_t, "f=%p", (h5_file_p)fh); + H5_CORE_API_RETURN (get_num_meshes (fh, TRIANGLE_MESHES_GRPNAME)); +} + +/*! + Get the number of hierarchical mesh levels for the current mesh. + + \param[in] f File handle + + \return Number of hierarchical mesh levels or error code. + */ +h5_ssize_t +h5t_get_num_leaf_levels ( + h5t_mesh_t* const m + ) { + H5_CORE_API_ENTER (h5_ssize_t, "m=%p", m); + H5_CORE_API_RETURN (m->num_leaf_levels); +} + +/*! + Get current level. + + \param[in] f File handle. + + \return Current level ID. +*/ +h5_lvl_idx_t +h5t_get_level ( + h5t_mesh_t* const m + ) { + H5_CORE_API_ENTER (h5_lvl_idx_t, "m=%p", m); + H5_CORE_API_RETURN (m->leaf_level); +} + +/*! + Return number of elems on compute node \c cnode_id on + current level. If \cnode_id is equal \c -1 return the + number of elements in the entire mesh. + + \remark + Refined elems are *not* counted. + + \param[in] f File handle. + \param[in] cnode Compute node + + \return Number of elements or error code. + */ + +h5_ssize_t +h5t_get_num_leaf_elems ( + h5t_mesh_t* const m, + const h5_id_t cnode + ) { + H5_CORE_API_ENTER (h5_ssize_t, "m=%p, cnode=%llu", + m, (long long unsigned)cnode); + UNUSED_ARGUMENT (cnode); + + if (m->leaf_level < 0) { + H5_CORE_API_LEAVE (h5tpriv_error_undef_level ()); + } + H5_CORE_API_RETURN (m->num_interior_elems[m->leaf_level]); +} +/*! + Return number of vertices on compute node \c cnode_id + on current level. If \cnode_id is equal \c -1 return the + number of vertices in the entire mesh. + + \remark + There is nothing like "refined vertices". + + \param[in] f File handle. + \param[in] cnode Compute node + + \return Number of vertices or error code. + */ +h5_ssize_t +h5t_get_num_vertices ( + h5t_mesh_t* const m, + h5_id_t cnode + ) { + H5_CORE_API_ENTER (h5_ssize_t, + "m=%p, cnode=%llu", + m, (long long unsigned)cnode); + UNUSED_ARGUMENT (cnode); + + if (m->leaf_level < 0) { + H5_CORE_API_LEAVE (h5tpriv_error_undef_level ()); + } + H5_CORE_API_RETURN (m->num_loc_vertices[m->leaf_level]); +} + +/*! + Return if mesh is chunked + + \param[in] f File handle. + + \return 0 if not chunked + */ +h5_lvl_idx_t +h5t_is_chunked ( + h5t_mesh_t* const m + ) { + H5_CORE_API_ENTER (h5_lvl_idx_t, "m=%p", m); + H5_CORE_API_RETURN (m->is_chunked); +} + diff --git a/src/h5core/h5t_model_private.h b/src/h5core/h5t_model_private.h new file mode 100644 index 0000000..3ffe884 --- /dev/null +++ b/src/h5core/h5t_model_private.h @@ -0,0 +1,128 @@ +/* + Copyright (c) 2006-2012, The Regents of the University of California, + through Lawrence Berkeley National Laboratory (subject to receipt of any + required approvals from the U.S. Dept. of Energy) and the Paul Scherrer + Institut (Switzerland). All rights reserved. + + License: see file COPYING in top level of source distribution. +*/ +#ifndef __H5T_MODEL_PRIVATE_H +#define __H5T_MODEL_PRIVATE_H + +#include "h5core/h5_types.h" +#include "h5core/h5t_model.h" +#include "h5t_types_private.h" + +#define H5T_CONTAINER_GRPNAME "Topo" +#define TETRAHEDRAL_MESHES_GRPNAME "TetMeshes" +#define TRIANGLE_MESHES_GRPNAME "TriangleMeshes" + +#if !(defined(ULLONG_MAX)) +#define ULLONG_MAX (LLONG_MAX * 2ULL + 1ULL) +#endif + +/* + ID's: 64bit + + Vertices: + 000100vv tttttttt tttttttt tttttttt tttttttt tttttttt tttttttt tttttttt + 3V TT TT TT TT TT TT + + Edges: + 00100eee tttttttt tttttttt tttttttt tttttttt tttttttt tttttttt tttttttt + 2E TT TT TT TT TT TT + + Trinagles: + 001100dd tttttttt tttttttt tttttttt tttttttt tttttttt tttttttt tttttttt + 1D TT TT TT TT TT TT + + Tets: + 01000000 tttttttt tttttttt tttttttt tttttttt tttttttt tttttttt tttttttt + 00 TT TT TT TT TT TT + +*/ + +#define BITS_OF(x) (sizeof(x)*CHAR_BIT) + +#define H5T_TYPE_VERTEX (1<<4) +#define H5T_TYPE_EDGE (2<<4) +#define H5T_TYPE_TRIANGLE (3<<4) +#define H5T_TYPE_TET (4<<4) + +#define H5T_FACE_MASK (0x0f) +#define H5T_TYPE_MASK (0x70) + +#if 0 +enum elem_types { + vertex = 1, // 1 vertex + edge, // 2 vertices + triangle, // 3 vertices + quadrangle, // 4 vertices + tetrahedron, // 4 vertices + pyramid, // 5 vertices + prism, // 6 vertices + hexahedron // 8 vertices +}; +#endif + +#define h5tpriv_build_entity_id( type, face_idx, elem_idx ) \ + (((type) | (face_idx)) << (BITS_OF(elem_idx)-8) | (elem_idx)) + +#define h5tpriv_build_vertex_id( face_idx, elem_idx ) \ + (h5tpriv_build_entity_id (H5T_TYPE_VERTEX, face_idx, elem_idx)) + +#define h5tpriv_build_edge_id( face_idx, elem_idx ) \ + (h5tpriv_build_entity_id (H5T_TYPE_EDGE, face_idx, elem_idx)) + +#define h5tpriv_build_triangle_id( face_idx, elem_idx ) \ + (h5tpriv_build_entity_id (H5T_TYPE_TRIANGLE, face_idx, elem_idx)) + +#define h5tpriv_build_tet_id( face_idx, elem_idx ) \ + (h5tpriv_build_entity_id (H5T_TYPE_TET, face_idx, elem_idx)) + +#define h5tpriv_get_entity_type( entity_id ) \ + ((entity_id >> (BITS_OF(entity_id)-8)) & H5T_TYPE_MASK) + +#define h5tpriv_get_face_idx( entity_id ) \ + (((entity_id) >> (BITS_OF(entity_id)-8)) & H5T_FACE_MASK) + +#define h5tpriv_get_face_id( entity_id ) \ + (((entity_id) >> (BITS_OF(entity_id)-8)) & (H5T_TYPE_MASK|H5T_FACE_MASK)) + +#define h5tpriv_get_elem_idx( entity_id ) \ + (((entity_id) << 8) >> 8) + + +/* + Test whether given element is on current level. This is the case, if + - the level_id of the element is <= the current level + - and, if any, the direct children is on a level > the current level +*/ +#define h5tpriv_is_leaf_elem(m, el) \ + ( ((el)->level_idx <= m->leaf_level) && \ + ((el)->child_idx < 0 || (el)->child_idx >= m->num_interior_elems[m->leaf_level]) ) + + +#define H5T_BOUNDARY_ELEM_FLAG 1 +#define H5T_BOUNDARY_FACET_FLAG 2 + +h5_err_t h5tpriv_alloc_loc_vertices (h5t_mesh_t* const, const h5_size_t); + +h5_err_t +h5tpriv_init_mesh ( + h5t_mesh_t* const m, + const h5_file_p f, + const char* name, + const hid_t mesh_hid, + const hid_t elem_type, + const h5t_ref_elem_t* ref_elem, + h5t_methods_t* methods, + const int create_mesh + ); + +h5_err_t +h5tpriv_alloc_num_vertices ( + h5t_mesh_t* const m, + const h5_size_t num + ); +#endif diff --git a/src/h5core/h5t_model_tetm.c b/src/h5core/h5t_model_tetm.c new file mode 100644 index 0000000..2bf4f2c --- /dev/null +++ b/src/h5core/h5t_model_tetm.c @@ -0,0 +1,240 @@ +/* + Copyright (c) 2006-2012, The Regents of the University of California, + through Lawrence Berkeley National Laboratory (subject to receipt of any + required approvals from the U.S. Dept. of Energy) and the Paul Scherrer + Institut (Switzerland). All rights reserved. + + License: see file COPYING in top level of source distribution. +*/ + +#include "h5t_types_private.h" + +#include "h5_hdf5_private.h" +#include "h5_va_macros.h" + + +#include "h5t_model_private.h" +#include "h5t_access_private.h" +#include "h5t_adjacencies_private.h" +#include "h5t_readwrite_private.h" +#include "h5t_retrieve_private.h" +#include "h5t_store_private.h" + +#include "h5_init_private.h" +#include "h5t_core_private.h" + +static struct h5t_methods tet_funcs = { + &h5tpriv_read_tetm_methods, + &h5tpriv_tetm_store_methods, + &h5tpriv_tetm_retrieve_methods, + &h5tpriv_access_tetm_methods, + &h5tpriv_tetm_adjacency_methods, + &h5tpriv_tetm_core_methods +}; + +/* + open tetrahedral mesh + */ +h5_err_t +h5t_open_tetrahedral_mesh_by_idx ( + const h5_file_t fh, + const h5_id_t idx, + h5t_mesh_t** mesh + ) { + h5_file_p f = (h5_file_p)fh; + H5_CORE_API_ENTER (h5_err_t, "f=%p, idx=%lld, mesh=%p", f, (long long)idx, mesh); + hid_t ctn_hid; + char name[1024]; + + TRY (ctn_hid = h5priv_open_group ( + 0, + f->root_gid, + H5T_CONTAINER_GRPNAME, + TETRAHEDRAL_MESHES_GRPNAME)); + TRY (hdf5_get_name_of_group_by_idx (ctn_hid, idx, name, sizeof (name))); + TRY (hdf5_close_group (ctn_hid)); + + H5_CORE_API_RETURN (h5t_open_tetrahedral_mesh ((h5_file_t)f, name, mesh)); +} + +h5_err_t +h5t_open_tetrahedral_mesh ( + const h5_file_t fh, + const char* name, + h5t_mesh_t** mesh + ) { + h5_file_p f = (h5_file_p)fh; + H5_CORE_API_ENTER (h5_err_t, "f=%p, name=%s, mesh=%p", f, name, mesh); + hid_t mesh_hid; + + TRY (mesh_hid = h5priv_open_group ( + 0, // do not create intermediate groups + f->root_gid, + H5T_CONTAINER_GRPNAME, + TETRAHEDRAL_MESHES_GRPNAME, + name)); + + TRY (*mesh = h5_calloc (1, sizeof(**mesh))); + h5t_mesh_t* m = *mesh; + TRY (h5tpriv_init_mesh ( + m, + f, + name, + mesh_hid, + h5_dta_types.h5_tet_t, + &h5t_tet_ref_elem, + &tet_funcs, + 0)); +#ifdef PARALLEL_IO // reason: even if we have a chunked mesh, if h5hut is not parallel + // it does not support reading chunked meshes + TRY (m->is_chunked ? h5tpriv_read_chunked_mesh (m) :h5tpriv_read_mesh (m)); +#else + TRY (h5tpriv_read_mesh (m)); +#endif + H5_CORE_API_RETURN (H5_SUCCESS); +} + +h5_err_t +h5t_open_tetrahedral_mesh_part ( + const h5_file_p f, + const char* name, + h5t_mesh_t** mesh, + h5_glb_idx_t* elem_indices, + h5_glb_idx_t dim + ) { + H5_CORE_API_ENTER (h5_err_t, "f=%p, name=%s, mesh=%p", f, name, mesh); + hid_t mesh_hid; + + TRY (mesh_hid = h5priv_open_group ( + 0, + f->root_gid, + H5T_CONTAINER_GRPNAME, + TRIANGLE_MESHES_GRPNAME, + name)); + + TRY (*mesh = h5_calloc (1, sizeof(**mesh))); + h5t_mesh_t* m = *mesh; + TRY (h5tpriv_init_mesh ( + m, + f, + name, + mesh_hid, + h5_dta_types.h5_tet_t, + &h5t_tet_ref_elem, + &tet_funcs, + 0)); + TRY (h5tpriv_read_mesh_part (m, elem_indices, dim)); + + H5_CORE_API_RETURN (H5_SUCCESS); +} + +/*! + Add new mesh + + \return mesh id + */ +h5_err_t +h5t_add_tetrahedral_mesh ( + const h5_file_t fh, + const char* name, + h5t_mesh_t** mesh + ) { + h5_file_p f = (h5_file_p)fh; + H5_CORE_API_ENTER (h5_err_t, "f=%p, name=%s, mesh=%p", f, name, mesh); + CHECK_WRITABLE_MODE (f); + h5_err_t exists; + TRY (exists = h5priv_link_exists ( + f->root_gid, + H5T_CONTAINER_GRPNAME, + TETRAHEDRAL_MESHES_GRPNAME, + name)); + if (exists) { + H5_CORE_API_LEAVE ( + h5_error ( + H5_ERR, + "Tetrahedral mesh '%s' already exists!", + name)); + } + hid_t mesh_hid; + TRY (mesh_hid = h5priv_open_group ( + 1, // create intermediate groups in path + f->root_gid, + H5T_CONTAINER_GRPNAME, + TETRAHEDRAL_MESHES_GRPNAME, + name)); + + TRY (*mesh = h5_calloc (1, sizeof(**mesh))); + h5t_mesh_t* m = *mesh; + TRY (h5tpriv_init_mesh ( + m, + f, + name, + mesh_hid, + h5_dta_types.h5_tet_t, + &h5t_tet_ref_elem, + &tet_funcs, + 1)); + + m->leaf_level = 0; + m->num_leaf_levels = 0; + TRY (h5tpriv_add_level (m)); + m->mesh_changed = 1; + + H5_CORE_API_RETURN (H5_SUCCESS); +} +/*! + Add new mesh + + \return mesh id + */ +h5_err_t +h5t_add_chunked_tetrahedral_mesh ( + const h5_file_t fh, + const char* name, + h5t_mesh_t** mesh + ) { + h5_file_p f = (h5_file_p)fh; + H5_CORE_API_ENTER (h5_err_t, "f=%p, name=%s, mesh=%p", f, name, mesh); +#ifdef PARALLEL_IO + CHECK_WRITABLE_MODE (f); + h5_err_t exists; + TRY (exists = h5priv_link_exists ( + f->root_gid, + H5T_CONTAINER_GRPNAME, + TETRAHEDRAL_MESHES_GRPNAME, + name)); + if (exists) { + H5_CORE_API_LEAVE ( + h5_error ( + H5_ERR, + "Tetrahedral mesh '%s' already exists!", + name)); + } + hid_t mesh_hid; + TRY (mesh_hid = h5priv_open_group ( + 1, // create intermediate groups in path + f->root_gid, + H5T_CONTAINER_GRPNAME, + TETRAHEDRAL_MESHES_GRPNAME, + name)); + + TRY (*mesh = h5_calloc (1, sizeof(**mesh))); + h5t_mesh_t* m = *mesh; + TRY (h5tpriv_init_mesh ( + m, + f, + name, + mesh_hid, + h5_dta_types.h5_tet_t, + &h5t_tet_ref_elem, + &tet_funcs, + 1)); + m->is_chunked = 1; + TRY (H5t_init_octree(&m->octree, sizeof (h5t_oct_userdata_t), NULL, -1, m->f->props->comm)); + m->leaf_level = 0; + m->num_leaf_levels = 0; + TRY (h5tpriv_add_level (m)); + m->mesh_changed = 1; +#endif + H5_CORE_API_RETURN (H5_SUCCESS); +} diff --git a/src/h5core/h5t_model_trim.c b/src/h5core/h5t_model_trim.c new file mode 100644 index 0000000..2de40ad --- /dev/null +++ b/src/h5core/h5t_model_trim.c @@ -0,0 +1,266 @@ +/* + Copyright (c) 2006-2012, The Regents of the University of California, + through Lawrence Berkeley National Laboratory (subject to receipt of any + required approvals from the U.S. Dept. of Energy) and the Paul Scherrer + Institut (Switzerland). All rights reserved. + + License: see file COPYING in top level of source distribution. +*/ +#include "h5t_types_private.h" + +#include "h5_hdf5_private.h" +#include "h5_mpi_private.h" +#include "h5_va_macros.h" + +#include "h5t_model_private.h" +#include "h5t_access_private.h" +#include "h5t_adjacencies_private.h" +#include "h5t_readwrite_private.h" +#include "h5t_retrieve_private.h" +#include "h5t_store_private.h" + +#include "h5_init_private.h" +#include "h5t_core_private.h" + +static struct h5t_methods tri_funcs = { + &h5tpriv_read_trim_methods, + &h5tpriv_trim_store_methods, + &h5tpriv_trim_retrieve_methods, + &h5tpriv_access_trim_methods, + &h5tpriv_trim_adjacency_methods, + &h5tpriv_trim_core_methods +}; + +/* + open tetrahedral mesh + */ +h5_err_t +h5t_open_triangle_mesh_by_idx ( + const h5_file_t fh, + const h5_id_t idx, + h5t_mesh_t** mesh + ) { + h5_file_p f = (h5_file_p)fh; + H5_CORE_API_ENTER (h5_err_t, "f=%p, idx=%lld, mesh=%p", f, (long long)idx, mesh); + hid_t ctn_hid; + char name[1024]; + + TRY (ctn_hid = h5priv_open_group ( + 0, + f->root_gid, + H5T_CONTAINER_GRPNAME, + TRIANGLE_MESHES_GRPNAME)); + TRY (hdf5_get_name_of_group_by_idx (ctn_hid, idx, name, sizeof (name))); + TRY (hdf5_close_group (ctn_hid)); + + H5_CORE_API_RETURN (h5t_open_triangle_mesh ((h5_file_t)f, name, mesh)); +} + +h5_err_t +h5t_open_triangle_mesh ( + const h5_file_t fh, + const char* name, + h5t_mesh_t** mesh + ) { + h5_file_p f = (h5_file_p)fh; + H5_CORE_API_ENTER (h5_err_t, "f=%p, name=%s, mesh=%p", f, name, mesh); +#ifdef PARALLEL_IO + MPI_Barrier (f->props->comm); + double start = MPI_Wtime(); +#endif + hid_t mesh_hid; + TRY (mesh_hid = h5priv_open_group ( + 0, + f->root_gid, + H5T_CONTAINER_GRPNAME, + TRIANGLE_MESHES_GRPNAME, + name)); + + TRY (*mesh = h5_calloc (1, sizeof(**mesh))); + h5t_mesh_t* m = *mesh; + TRY (h5tpriv_init_mesh ( + m, + f, + name, + mesh_hid, + h5_dta_types.h5_triangle_t, + &h5t_tri_ref_elem, + &tri_funcs, + 0)); +#ifdef PARALLEL_IO // reason: even if we have a chunked mesh, if h5hut is not parallel + MPI_Barrier (m->f->props->comm); + m->timing.measure[m->timing.next_time++] = start; + m->timing.measure[m->timing.next_time++] = MPI_Wtime(); + // it does not support reading chunked meshes + TRY (m->is_chunked && m->f->nprocs > 1? h5tpriv_read_chunked_mesh (m) :h5tpriv_read_mesh (m)); +#else + TRY (h5tpriv_read_mesh (m)); +#endif + H5_CORE_API_RETURN (H5_SUCCESS); +} + + +h5_err_t +h5t_open_triangle_mesh_part ( + const h5_file_t fh, + const char* name, + h5t_mesh_t** mesh, + h5_glb_idx_t* elem_indices, + h5_glb_idx_t dim + ) { + h5_file_p f = (h5_file_p)fh; + H5_CORE_API_ENTER (h5_err_t, "f=%p, name=%s, mesh=%p", f, name, mesh); + hid_t mesh_hid; +#ifdef PARALLEL_IO + MPI_Barrier (f->props->comm); + double start = MPI_Wtime(); +#endif + TRY (mesh_hid = h5priv_open_group ( + 0, + f->root_gid, + H5T_CONTAINER_GRPNAME, + TRIANGLE_MESHES_GRPNAME, + name)); + + TRY (*mesh = h5_calloc (1, sizeof(**mesh))); + h5t_mesh_t* m = *mesh; + TRY (h5tpriv_init_mesh ( + m, + f, + name, + mesh_hid, + h5_dta_types.h5_triangle_t, + &h5t_tri_ref_elem, + &tri_funcs, + 0)); +#ifdef PARALLEL_IO // reason: even if we have a chunked mesh, if h5hut is not parallel + MPI_Barrier (m->f->props->comm); + m->timing.measure[m->timing.next_time++] = start; + m->timing.measure[m->timing.next_time++] = MPI_Wtime(); +#endif + + TRY (h5tpriv_read_mesh_part (m, elem_indices, dim)); + + H5_CORE_API_RETURN (H5_SUCCESS); +} + +/*! + Add new mesh + + \return mesh id + */ +h5_err_t +h5t_add_triangle_mesh ( + const h5_file_t fh, + const char* name, + h5t_mesh_t** mesh + ) { + h5_file_p f = (h5_file_p)fh; + H5_CORE_API_ENTER (h5_err_t, "f=%p, name=%s, mesh=%p", f, name, mesh); + CHECK_WRITABLE_MODE (f); + h5_err_t exists; + TRY (exists = h5priv_link_exists ( + f->root_gid, + H5T_CONTAINER_GRPNAME, + TRIANGLE_MESHES_GRPNAME, + name)); + if (exists) { + H5_CORE_API_LEAVE ( + h5_error ( + H5_ERR, + "Tetrahedral mesh '%s' already exists!", + name)); + } + hid_t mesh_hid; + TRY (mesh_hid = h5priv_open_group ( + 1, // create intermediate groups in path + f->root_gid, + H5T_CONTAINER_GRPNAME, + TRIANGLE_MESHES_GRPNAME, + name)); + + TRY (*mesh = h5_calloc (1, sizeof(**mesh))); + h5t_mesh_t* m = *mesh; + TRY (h5tpriv_init_mesh ( + m, + f, + name, + mesh_hid, + h5_dta_types.h5_triangle_t, + &h5t_tri_ref_elem, + &tri_funcs, + 1)); + + m->leaf_level = 0; + m->num_leaf_levels = 0; + TRY (h5tpriv_add_level (m)); + m->mesh_changed = 1; + + H5_CORE_API_RETURN (H5_SUCCESS); +} +/*! + Add new chunked mesh + + \return mesh id + */ +h5_err_t +h5t_add_chunked_triangle_mesh( + const h5_file_t fh, + const char* name, + h5t_mesh_t** mesh + ) { + h5_file_p f = (h5_file_p)fh; + H5_CORE_API_ENTER (h5_err_t, "f=%p, name=%s, mesh=%p", f, name, mesh); +#ifdef PARALLEL_IO + int size = -1; + TRY (h5priv_mpi_comm_size (f->props->comm, &size)); + if (size != 1) { + H5_CORE_API_LEAVE ( + h5_error ( + H5_ERR, + "Trying to create a chunked mesh with '%d' procs instead of 1!", + size)); + } + + CHECK_WRITABLE_MODE (f); + h5_err_t exists; + TRY (exists = h5priv_link_exists ( + f->root_gid, + H5T_CONTAINER_GRPNAME, + TRIANGLE_MESHES_GRPNAME, + name)); + if (exists) { + H5_CORE_API_LEAVE ( + h5_error ( + H5_ERR, + "Triangle mesh '%s' already exists!", + name)); + } + hid_t mesh_hid; + TRY (mesh_hid = h5priv_open_group ( + 1, // create intermediate groups in path + f->root_gid, + H5T_CONTAINER_GRPNAME, + TRIANGLE_MESHES_GRPNAME, + name)); + + TRY (*mesh = h5_calloc (1, sizeof(**mesh))); + h5t_mesh_t* m = *mesh; + TRY (h5tpriv_init_mesh ( + m, + f, + name, + mesh_hid, + h5_dta_types.h5_triangle_t, + &h5t_tri_ref_elem, + &tri_funcs, + 1)); + m->is_chunked = 1; + TRY (H5t_init_octree(&m->octree, sizeof (h5t_oct_userdata_t), NULL, -1, m->f->props->comm)); + m->leaf_level = 0; + m->num_leaf_levels = 0; + TRY (h5tpriv_add_level (m)); + m->mesh_changed = 1; +#endif + H5_CORE_API_RETURN (H5_SUCCESS); +} diff --git a/src/h5core/h5t_octree.c b/src/h5core/h5t_octree.c new file mode 100644 index 0000000..0ae228c --- /dev/null +++ b/src/h5core/h5t_octree.c @@ -0,0 +1,3251 @@ +#include "h5t_octree_private.h" +#include "h5t_core_private.h" + +#ifdef PARALLEL_IO + +#include +#include +#include + +#include "h5_mpi_private.h" + +static h5_err_t +get_bounding_box_of_octant ( + h5t_octree_t* const octree, + h5_oct_idx_t oct_idx, + h5_float64_t* bounding_box + ); + +#if 0 + +/*** code copied from http://stackoverflow.com/questions/111928/is-there-a-printf-converter-to-print-in-binary-format + * author http://stackoverflow.com/users/429544/techplexengineer + */ +static int printf_arginfo_M(const struct printf_info *info, size_t n, int *argtypes, int *avoidwarning) { + /* "%M" always takes one argument, a pointer to uint8_t[6]. */ + if (n > 0) { + argtypes[0] = PA_POINTER; + } + return 1; +} /* printf_arginfo_M */ + +static int printf_output_M(FILE *stream, const struct printf_info *info, const void *const *args) { + int value = 0; + int len; + value = *(int *) (args[0]); +// value = *(int **) (args[0]); + //Begin My Code ------------------------------------------------------------ + char buffer [2] = ""; //Is this bad? + char buffer2 [40] = ""; //Is this bad? + int bits = 32; //info->width; +// if (bits <= 0) +// bits = 8; //Default to 8 bits + int counter = 1; + uint mask = 1 << (bits-1); + while (mask > 0) { + sprintf(buffer, "%s", (((value & mask) > 0) ? "1" : "0")); + strcat(buffer2, buffer); + if (counter %8 == 0) { + sprintf(buffer, " "); + strcat(buffer2, buffer); + } + mask >>= 1; + counter++; + } + strcat(buffer2, "\n"); + //End my code -------------------------------------------------------------- + len = fprintf(stream, "%s", buffer2); + return len; +} /* printf_output_M */ +static int +printf_output_B(FILE* stream, + const struct printf_info* info, + const void* const* args + ) { + int value = 0; + int length = 0; + value = *(int *) (args[0]); + char buffer [2] = ""; + char buffer2 [40] = ""; + int bits = 32; + int counter = 1; + uint mask = 1 << (bits-1); + while (mask > 0) { + sprintf(buffer, "%s", (((value & mask) > 0) ? "1" : "0")); + strcat(buffer2, buffer); + if (counter %8 == 0) { + sprintf(buffer, " "); + strcat(buffer2, buffer); + } + mask >>= 1; + counter++; + } + strcat(buffer2, "\n"); + length = fprintf(stream, "%s", buffer2); + return length; +} + +static int +printf_arginfo_B (const struct printf_info* info, + size_t n, + int* argtypes, + int* args + ) { + if (n > 0) { + argtypes[0] = PA_POINTER; + } + return 1; +} +#endif + +static inline h5_err_t +create_mpi_type_octant ( + void + ) { + h5t_octant_t octant; + H5_PRIV_FUNC_ENTER (h5_err_t, "%s", "void"); + int i = 0; + const int count = 6; + int blocklens[count]; + MPI_Aint indices[count]; + MPI_Datatype old_types[count]; + MPI_Aint base; + MPI_Aint addr; + TRY (mpi_get_address (&octant, &base)); + + // idx + blocklens[i] = 1; + TRY (mpi_get_address (&octant.idx, &addr)); + indices[i] = addr - base; + old_types[i++] = MPI_INT; + + // parent_idx + blocklens[i] = 1; + TRY (mpi_get_address (&octant.parent_idx, &addr)); + indices[i] = addr - base; + old_types[i++] = MPI_INT; + + // child_idx + blocklens[i] = 1; + TRY (mpi_get_address (&octant.child_idx, &addr)); + indices[i] = addr - base; + old_types[i++] = MPI_INT; + + // level_idx + blocklens[i] = 1; + TRY (mpi_get_address (&octant.level_idx, &addr)); + indices[i] = addr - base; + old_types[i++] = MPI_SHORT; + +// // bounding_box +// blocklens[i] = 6; +// TRY (mpi_get_address (&octant.bounding_box, &addr)); +// indices[i] = addr - base; +// old_types[i++] = MPI_DOUBLE; + + // processor + blocklens[i] = 1; + TRY (mpi_get_address (&octant.processor, &addr)); + indices[i] = addr - base; + old_types[i++] = MPI_INT; + + // userlevels + blocklens[i] = 1; + TRY (mpi_get_address (&octant.userlevels, &addr)); + indices[i] = addr - base; + old_types[i++] = MPI_INT; + + + // create new type + assert (i == count); + TRY (mpi_create_type_struct (count, blocklens, indices, old_types, + &h5_oct_dta_types.mpi_octant)); + // commit new type + TRY (h5priv_mpi_type_commit (&h5_oct_dta_types.mpi_octant)); + + H5_PRIV_FUNC_RETURN (H5_SUCCESS); +} +h5_err_t H5t_create_mpi_type_octant (void) { + return create_mpi_type_octant (); +} +/* + * Get parent index of octant + */ +static h5_oct_idx_t +get_parent ( + h5t_octree_t* const octree, + const h5_oct_idx_t oct_idx + ) { + if (oct_idx <= 0) { + return -1; + } + return (octree->octants[oct_idx].parent_idx); +}; +h5_oct_idx_t +H5t_get_parent (h5t_octree_t* const octree, const h5_oct_idx_t oct_idx) { + return get_parent (octree, oct_idx); +}; + +static int +get_maxpoints ( + h5t_octree_t* const octree + ) { + H5_PRIV_FUNC_ENTER (h5_err_t, "octree=%p,", octree); + H5_PRIV_FUNC_RETURN (octree->maxpoints); +} +int H5t_get_maxpoints (h5t_octree_t* const octree) { + return get_maxpoints (octree); +} + +static h5_err_t +set_maxpoints ( + h5t_octree_t* const octree, + int maxpoints + ) { + H5_PRIV_FUNC_ENTER (h5_err_t, "octree=%p, maxpoints=%d", octree, maxpoints); + assert (maxpoints > 0); + octree->maxpoints = maxpoints; + H5_PRIV_FUNC_RETURN (H5_SUCCESS); +} + +h5_err_t H5t_set_maxpoints (h5t_octree_t* const octree, int maxpoints) { + return set_maxpoints (octree, maxpoints); +} + +/* + * Check if octant is on level + * return value is 0 if it is NOT on level + */ +h5_oct_level_t +oct_has_level ( + h5t_octree_t* octree, + h5_oct_idx_t oct_idx, + h5_oct_level_t level + ) { + return octree->octants[oct_idx].userlevels & 1 << level; +} +h5_oct_level_t H5t_oct_has_level (h5t_octree_t* octree, h5_oct_idx_t oct_idx, h5_oct_level_t level) { + return oct_has_level (octree, oct_idx, level); +} +/* + * set internal data changed + */ +static h5_err_t +set_intdata_chg ( + h5t_octree_t* octree, + h5_oct_idx_t oct_idx + ) { + H5_PRIV_FUNC_ENTER (h5_err_t, "octree=%p, oct_idx=%d", octree, oct_idx); + + octree->octants[oct_idx].level_idx |= ( 1 << OCT_CHG_INTERNAL); + + H5_PRIV_FUNC_RETURN (H5_SUCCESS); +} +/* + * get new proc + */ +static h5_int32_t +get_proc ( + h5t_octree_t* octree, + h5_oct_idx_t oct_idx + ) { + return octree->octants[oct_idx].processor; + +} +h5_int32_t +H5t_get_proc (h5t_octree_t* octree, h5_oct_idx_t oct_idx) { + return get_proc (octree, oct_idx); +} +/* + * set new proc + */ +static h5_err_t +set_proc ( + h5t_octree_t* octree, + h5_oct_idx_t oct_idx, + h5_int32_t proc + ) { + H5_PRIV_FUNC_ENTER (h5_err_t, "octree=%p, oct_idx=%d proc=%d", octree, oct_idx, proc); + + if (octree->octants[oct_idx].processor != proc) { // to avoid unnecessary internal updates + octree->octants[oct_idx].processor = proc; + TRY (set_intdata_chg (octree, oct_idx)); + } + H5_PRIV_FUNC_RETURN (H5_SUCCESS); +} +h5_err_t +H5t_set_proc (h5t_octree_t* octree, h5_oct_idx_t oct_idx, h5_int32_t proc) { + return set_proc (octree, oct_idx, proc); +} +/* + * set new proc without triggering update + * WARNING if not all proc do the same the state gets inconsistent! + */ +static h5_err_t +set_proc_int ( + h5t_octree_t* octree, + h5_oct_idx_t oct_idx, + h5_int32_t proc + ) { + H5_PRIV_FUNC_ENTER (h5_err_t, "octree=%p, oct_idx=%d proc=%d", octree, oct_idx, proc); + + octree->octants[oct_idx].processor = proc; + + H5_PRIV_FUNC_RETURN (H5_SUCCESS); +} +h5_err_t +H5t_set_proc_int (h5t_octree_t* octree, h5_oct_idx_t oct_idx, h5_int32_t proc) { + return set_proc_int (octree, oct_idx, proc); +} + +/* + * set userlevel + */ +static h5_err_t +set_userlevel ( + h5t_octree_t* octree, + h5_oct_idx_t oct_idx, + h5_oct_level_t level + ) { + H5_PRIV_FUNC_ENTER (h5_err_t, "octree=%p, oct_idx=%d level=%d", octree, oct_idx, level); + + octree->octants[oct_idx].userlevels |= ( 1 << level); + + TRY (set_intdata_chg (octree, oct_idx)); + + H5_PRIV_FUNC_RETURN (H5_SUCCESS); +} +h5_err_t H5t_set_userlevel (h5t_octree_t* octree, h5_oct_idx_t oct_idx, h5_oct_level_t level) { + return set_userlevel (octree, oct_idx, level); +} +/* + * get userlevel + */ +static h5_oct_level_t +get_userlevel ( + h5t_octree_t* octree, + h5_oct_idx_t oct_idx + ) { + H5_PRIV_FUNC_ENTER (h5_err_t, "octree=%p, oct_idx=%d", octree, oct_idx); + h5_oct_level_t level; + level = octree->octants[oct_idx].userlevels ; + level = ((level | 1 << (OCT_USERLEV_LENGTH - 1)) ^ (1 << (OCT_USERLEV_LENGTH - 1))); // remove leave level bit + + H5_PRIV_FUNC_RETURN (level); +} +h5_oct_level_t H5t_get_userlevel (h5t_octree_t* octree, h5_oct_idx_t oct_idx) { + return get_userlevel (octree, oct_idx); +} + +/* + * set userlevel + */ +static h5_err_t +set_userlevel_int ( + h5t_octree_t* octree, + h5_oct_idx_t oct_idx, + h5_oct_level_t level + ) { + H5_PRIV_FUNC_ENTER (h5_err_t, "octree=%p, oct_idx=%d level=%d", octree, oct_idx, level); + + octree->octants[oct_idx].userlevels |= ( 1 << level); + + H5_PRIV_FUNC_RETURN (H5_SUCCESS); +} +// is an internal function - maybe if there is a usecase one could make it API but is dangerous +// to use since it could create a missmatch in level definitions an different procs +//h5_err_t H5t_set_userlevel_int (h5t_octree_t* octree, h5_oct_idx_t oct_idx, h5_oct_level_t level) { +// return set_userlevel_int (octree, oct_idx, level); +//} + +#if 0 +/* + * remove userlevel + */ +static h5_err_t +remove_userlevel ( + h5t_octree_t* octree, + h5_oct_idx_t oct_idx, + h5_oct_level_t level + ) { + H5_PRIV_FUNC_ENTER (h5_err_t, "octree=%p, oct_idx=%d level=%d", octree, oct_idx, level); + if (oct_has_level (octree,oct_idx,level)){ + octree->octants[oct_idx].userlevels ^= ( 1 << level); + TRY (set_intdata_chg (octree, oct_idx)); + } + H5_PRIV_FUNC_RETURN (H5_SUCCESS); +} +#endif + +static h5_err_t +remove_userlevel_int ( + h5t_octree_t* octree, + h5_oct_idx_t oct_idx, + h5_oct_level_t level + ) { + H5_PRIV_FUNC_ENTER (h5_err_t, "octree=%p, oct_idx=%d level=%d", octree, oct_idx, level); + if (oct_has_level (octree,oct_idx,level)){ + octree->octants[oct_idx].userlevels ^= ( 1 << level); + + } + H5_PRIV_FUNC_RETURN (H5_SUCCESS); +} +/* + * set leave level + */ +static h5_err_t +set_leave_level ( + h5t_octree_t* octree + ) { + H5_PRIV_FUNC_ENTER (h5_err_t, "octree=%p", octree); + + for (int i = 0; i <= octree->current_oct_idx; i++) { + // check if leave level bit needs to be changed + if (((octree->octants[i].child_idx == -1) && + ((octree->octants[i].userlevels & 1 << (OCT_USERLEV_LENGTH - 1)) != 1 << (OCT_USERLEV_LENGTH - 1) )) || + ((octree->octants[i].child_idx != -1) && + ((octree->octants[i].userlevels & 1 << (OCT_USERLEV_LENGTH - 1)) == 1 << (OCT_USERLEV_LENGTH - 1) ))) { + octree->octants[i].userlevels ^= 1 << (OCT_USERLEV_LENGTH - 1); + //TRY (set_intdata_chg (octree, i)); + } + } + + H5_PRIV_FUNC_RETURN (H5_SUCCESS); +} + +#if 0 +/* + * Clear all levels + */ +static h5_err_t +clear_all_levels ( + h5t_octree_t* octree + ) { + H5_PRIV_FUNC_ENTER (h5_err_t, "octree=%p", octree); + + for (int i = 0; i <= octree->current_oct_idx; i++) { + octree->octants[i].userlevels = 0; + //TRY (set_intdata_chg (octree, i)); + } + set_leave_level (octree); + + H5_PRIV_FUNC_RETURN (H5_SUCCESS); +} +#endif + +static h5_err_t +clear_level_internal ( + h5t_octree_t* octree + ) { + H5_PRIV_FUNC_ENTER (h5_err_t, "octree=%p", octree); + for (int i = 0; i <= octree->current_oct_idx; i++) { + if ((octree->octants[i].level_idx & (1 << OCT_CHG_INTERNAL)) == (1 << OCT_CHG_INTERNAL) ) { + octree->octants[i].level_idx ^= (1 << OCT_CHG_INTERNAL); + } + } + H5_PRIV_FUNC_RETURN (H5_SUCCESS); +} + + +/* + * get orientation of octant + */ +static h5_oct_orient_t +get_orient ( + h5t_octree_t* octree, + h5_oct_idx_t oct_idx + ) { + if (oct_idx != 0) { + // WARNING Right shift may not work as expected (c standart is not clear) + // implementation now without right shift + h5_oct_orient_t orient = 0; + if ((octree->octants[oct_idx].level_idx & (1 << OCT_X)) != 0) { + orient += 1; + } + if ((octree->octants[oct_idx].level_idx & (1 << OCT_Y)) != 0) { + orient += 2; + } + if ((octree->octants[oct_idx].level_idx & (1 << OCT_Z)) != 0) { + orient += 4; + } + return orient ; + } else { + return -1; + } + +} +/* + * get orientation of octant + */ +static h5_lvl_idx_t +get_oct_level ( + h5t_octree_t* octree, + h5_oct_idx_t oct_idx + ) { + assert (oct_idx > -1); + if (oct_idx != 0) { + // WARNING Right shift may not work as expected (c standart is not clear) + // implementation now without right shift + h5_oct_orient_t orient = 0; + if ((octree->octants[oct_idx].level_idx & (1 << OCT_CHG_INTERNAL)) != 0) { + orient |= 1 << OCT_CHG_INTERNAL; + } + if ((octree->octants[oct_idx].level_idx & (1 << OCT_CHG_USERDATA)) != 0) { + orient |= 1 << OCT_CHG_USERDATA; + } + if ((octree->octants[oct_idx].level_idx & (1 << OCT_X)) != 0) { + orient |= 1 << OCT_X; + } + if ((octree->octants[oct_idx].level_idx & (1 << OCT_Y)) != 0) { + orient |= 1 << OCT_Y; + } + if ((octree->octants[oct_idx].level_idx & (1 << OCT_Z)) != 0) { + orient |= 1 << OCT_Z; + } + return octree->octants[oct_idx].level_idx ^ orient ; + } else { + return 0; + } + +} + + +#if 0 +/* + * Get total number of octants + */ +static h5_oct_idx_t +get_nbr_octants ( + h5t_octree_t* const octree + ) { + return (octree->current_oct_idx) +1; +}; + +/* + * Make global update because user data changed + */ +#endif + +static h5_err_t +update_userdata ( + h5t_octree_t* const octree + ) { + H5_PRIV_FUNC_ENTER (h5_err_t, "octree=%p", octree); + h5_oct_idx_t* oct_idx; + TRY (oct_idx = h5_calloc (octree->current_oct_idx + 1, sizeof (*oct_idx))); + h5_oct_idx_t nbr_loc_oct_changed = 0; + for (int i = 0; i <= octree->current_oct_idx; i++) { + if ((octree->octants[i].level_idx & (1 << OCT_CHG_USERDATA)) == (1 << OCT_CHG_USERDATA)) { + oct_idx[nbr_loc_oct_changed] = i; + nbr_loc_oct_changed++; + } + } + + // exchange the number of changed octants + int size; + TRY (h5priv_mpi_comm_size (octree->comm, &size)); + h5_int32_t* nbr_oct_changed; + TRY (nbr_oct_changed = h5_calloc (size, sizeof (*nbr_oct_changed))); + + TRY (h5priv_mpi_allgather (&nbr_loc_oct_changed, + 1, + MPI_INT, + nbr_oct_changed, + 1, + MPI_INT, + octree->comm)); + + + // exchange the changed octant_id's + h5_oct_idx_t* changed_oct_idx; + h5_oct_idx_t* recv_displs; + h5_oct_idx_t* recv_counts = nbr_oct_changed; // just for simpler naming + h5_oct_idx_t nbr_glb_oct_changed = nbr_oct_changed[0]; + + TRY (recv_displs = h5_calloc(size,sizeof(*recv_displs))); + + recv_displs[0] = 0; + + for (int i = 1; i < size; i++) { + recv_displs[i] = recv_displs[i-1] + nbr_oct_changed[i-1]; + nbr_glb_oct_changed += nbr_oct_changed[i]; + }; + TRY (changed_oct_idx = h5_calloc (nbr_glb_oct_changed, sizeof (*changed_oct_idx))); + TRY (mpi_allgatherv (oct_idx, + nbr_loc_oct_changed, + MPI_INT, + changed_oct_idx, + recv_counts, + recv_displs, + MPI_INT, + octree->comm + )); + + // check if an octant has been changed on multiple procs + h5_oct_idx_t oct_idx_to_check; + for (int i = 0; i < nbr_glb_oct_changed - 1; i++) { + oct_idx_to_check = changed_oct_idx[i]; + for (int j = i + 1; j < nbr_glb_oct_changed; j++) { + if (oct_idx_to_check == changed_oct_idx[j]) { + /*** an octant was changed twice! ***/ + H5_PRIV_FUNC_LEAVE( h5_error ( + H5_ERR_INVAL, + "Multiple cores tried to update the same userdata with idx: %d", + oct_idx_to_check)); + }; + }; + }; + /*** exchange changed userdata ***/ + // new mpi datatype for userdata + MPI_Datatype userdata_type; + + TRY (h5priv_mpi_type_contiguous (octree->size_userdata, MPI_BYTE, &userdata_type)); + TRY (h5priv_mpi_type_commit (&userdata_type)); + + void* sendbuf; + void* recvbuf; + TRY (sendbuf = h5_calloc (nbr_loc_oct_changed, octree->size_userdata)); + TRY (recvbuf = h5_calloc (nbr_glb_oct_changed, octree->size_userdata)); + +// recv_counts[0] *= octree->size_userdata; +// for (int i = 1; i < size; i++) { +// recv_displs[i] *= octree->size_userdata; +// recv_counts[i] *= octree->size_userdata; +// }; + char* charp_to = (char*) sendbuf; + char* charp_from = (char*) octree->userdata; + // memcpy to send buffer + for (int i = 0; i < nbr_loc_oct_changed; i++) { + memcpy( &(charp_to[i*octree->size_userdata]), + &(charp_from[oct_idx[i]*octree->size_userdata]), + octree->size_userdata); + }; + + TRY (mpi_allgatherv ( + sendbuf, + nbr_loc_oct_changed, + userdata_type, + recvbuf, + recv_counts, + recv_displs, + userdata_type, + octree->comm + )); + // copy user data to local memory location + charp_to = octree->userdata; + charp_from = recvbuf; + //TODO could be improved by not copying the already local updated octants + for (int i = 0; i < nbr_glb_oct_changed; i++) { + memcpy( &(charp_to[changed_oct_idx[i] * octree->size_userdata]), + &(charp_from[i * octree->size_userdata]), + octree->size_userdata); + } + // set changed user data to 0 + for (int i = 0; i <= octree->current_oct_idx; i++) { + if (i == octree->nbr_alloc_oct) { h5_debug ("THIS shoul not happen");} + octree->octants[i].level_idx &= ~(1 << OCT_CHG_USERDATA); + } + // free memory + + TRY (h5_free (oct_idx)); + TRY (h5_free (nbr_oct_changed)); + TRY (h5_free (sendbuf)); + TRY (h5_free (recvbuf)); + TRY (h5_free (recv_displs)); + TRY (h5_free (changed_oct_idx)); + //MPI_Type_free(&userdata_type); + + H5_PRIV_FUNC_RETURN (H5_SUCCESS); +}; +h5_err_t +H5t_update_userdata (h5t_octree_t* const octree) { + return update_userdata (octree); +} + +/* + * Make global update because internal data changed + */ + +static h5_err_t +update_internal ( + h5t_octree_t* const octree + ) { + H5_PRIV_FUNC_ENTER (h5_err_t, "octree=%p", octree); + int nprocs =-1; + h5priv_mpi_comm_size (octree->comm, &nprocs); + if (nprocs == 1 ) { + // set changed internal data to 0 + clear_level_internal (octree); + set_leave_level (octree); + } + + h5_oct_idx_t* oct_idx; + TRY (oct_idx = h5_calloc (octree->current_oct_idx + 1, sizeof (*oct_idx))); + h5_oct_idx_t nbr_loc_oct_changed = 0; + for (int i = 0; i <= octree->current_oct_idx; i++) { + if ((octree->octants[i].level_idx & (1 << OCT_CHG_INTERNAL)) == (1 << OCT_CHG_INTERNAL)) { + oct_idx[nbr_loc_oct_changed] = i; + nbr_loc_oct_changed++; + } + } + + // exchange the number of changed octants + int size; + TRY (h5priv_mpi_comm_size (octree->comm, &size)); + h5_int32_t* nbr_oct_changed; + TRY (nbr_oct_changed = h5_calloc (size, sizeof (*nbr_oct_changed))); + + TRY (h5priv_mpi_allgather (&nbr_loc_oct_changed, + 1, + MPI_INT, + nbr_oct_changed, + 1, + MPI_INT, + octree->comm)); + + // exchange the changed octant_id's + h5_oct_idx_t* changed_oct_idx; + h5_oct_idx_t* recv_displs; + h5_oct_idx_t* recv_counts = nbr_oct_changed; // just for simpler naming + h5_oct_idx_t nbr_glb_oct_changed = nbr_oct_changed[0]; + + TRY (recv_displs = h5_calloc(size,sizeof(*recv_displs))); + + recv_displs[0] = 0; + + for (int i = 1; i < size; i++) { + recv_displs[i] = recv_displs[i-1] + nbr_oct_changed[i-1]; + nbr_glb_oct_changed += nbr_oct_changed[i]; + }; + if (nbr_glb_oct_changed == 0) { + // set changed internal data to 0 + clear_level_internal (octree); + // free memory + + TRY (h5_free (oct_idx)); + TRY (h5_free (nbr_oct_changed)); + TRY (h5_free (recv_displs)); + H5_PRIV_FUNC_LEAVE (H5_SUCCESS); + } + TRY (changed_oct_idx = h5_calloc (nbr_glb_oct_changed, sizeof (*changed_oct_idx))); + TRY (mpi_allgatherv (oct_idx, + nbr_loc_oct_changed, + MPI_INT, + changed_oct_idx, + recv_counts, + recv_displs, + MPI_INT, + octree->comm + )); + + // check if an octant has been changed on multiple procs + h5_oct_idx_t oct_idx_to_check; + for (int i = 0; i < nbr_glb_oct_changed - 1; i++) { + oct_idx_to_check = changed_oct_idx[i]; + for (int j = i + 1; j < nbr_glb_oct_changed; j++) { + if (oct_idx_to_check == changed_oct_idx[j]) { + /*** an octant was changed twice! ***/ + H5_PRIV_FUNC_LEAVE(H5_ERR_INVAL) + }; + }; + }; + /*** exchange changed octants ***/ + // new mpi datatype for userdata + + + void* sendbuf; + void* recvbuf; + TRY (sendbuf = h5_calloc (nbr_loc_oct_changed, sizeof (*(octree->octants)))); + TRY (recvbuf = h5_calloc (nbr_glb_oct_changed, sizeof (*(octree->octants)))); + + h5t_octant_t* charp_to = (h5t_octant_t*) sendbuf; + h5t_octant_t* charp_from = octree->octants; + // memcpy to send buffer + for (int i = 0; i < nbr_loc_oct_changed; i++) { + memcpy( &(charp_to[i]), + &(charp_from[oct_idx[i]]), + sizeof (*octree->octants)); + }; + + TRY (mpi_allgatherv ( + sendbuf, + nbr_loc_oct_changed, + h5_oct_dta_types.mpi_octant, + recvbuf, + recv_counts, + recv_displs, + h5_oct_dta_types.mpi_octant, + octree->comm + )); + // copy user data to local memory location + charp_to = octree->octants; + charp_from = recvbuf; + //TODO could be improved by not copying the already local updated octants + for (int i = 0; i < nbr_glb_oct_changed; i++) { + memcpy( &(charp_to[changed_oct_idx[i]]), + &(charp_from[i]), + sizeof (*octree->octants)); + } + // set changed internal data to 0 + clear_level_internal (octree); + set_leave_level (octree); + // free memory + + TRY (h5_free (oct_idx)); + TRY (h5_free (nbr_oct_changed)); + TRY (h5_free (sendbuf)); + TRY (h5_free (recvbuf)); + TRY (h5_free (recv_displs)); + TRY (h5_free (changed_oct_idx)); + + + H5_PRIV_FUNC_RETURN (H5_SUCCESS); +}; +h5_err_t +H5t_update_internal (h5t_octree_t* const octree) { + return update_internal (octree); +} + +/* + * Get first children index of octant + */ +static h5_oct_idx_t +get_children ( + h5t_octree_t* const octree, + const h5_oct_idx_t oct_idx + ) { + return octree->octants[oct_idx].child_idx; +}; +h5_oct_idx_t +H5t_get_children (h5t_octree_t* const octree, const h5_oct_idx_t oct_idx) { + return get_children (octree, oct_idx); +}; +/* + * Get pointer to userdata of octant for reading + * This Pointer is only valid till the next call of the Library! + */ +static h5_err_t +get_userdata_r ( + h5t_octree_t* octree, + h5_oct_idx_t oct_idx, + void** userdata + ) { + H5_PRIV_FUNC_ENTER (h5_err_t, "octree=%p, oct_idx=%d, userdata=%p", octree, oct_idx, userdata); + + char* userdata_int = (char*) octree->userdata; + *userdata = &userdata_int[oct_idx * octree->size_userdata]; + + H5_PRIV_FUNC_RETURN (H5_SUCCESS); +} +h5_err_t +H5t_get_userdata_r (h5t_octree_t* octree, h5_oct_idx_t oct_idx, void** userdata) { + return get_userdata_r (octree, oct_idx, userdata); +} + +/* + * Get pointer to userdata of octant for reading/writing + * This Pointer is only valid till the next call of the Library! + * To make the write visible to all procs call update_userdata(h5t_octree_t* octree); + */ +static h5_err_t +get_userdata_rw ( + h5t_octree_t* octree, + h5_oct_idx_t oct_idx, + void** userdata + ) { + H5_PRIV_FUNC_ENTER (h5_err_t, "octree=%p, oct_idx=%d, userdata=%p", octree, oct_idx, userdata); + + octree->octants[oct_idx].level_idx |= (1 << OCT_CHG_USERDATA); + char* userdata_int; + userdata_int = octree->userdata; + *userdata = &userdata_int[oct_idx * octree->size_userdata]; + + H5_PRIV_FUNC_RETURN (H5_SUCCESS); +} +h5_err_t +H5t_get_userdata_rw (h5t_octree_t* octree, h5_oct_idx_t oct_idx, void** userdata) { + return get_userdata_rw (octree, oct_idx, userdata); +} + + +/* + * grow data structure of octree + */ +static h5_err_t +grow_octree ( + h5t_octree_t* octree, + h5_int32_t additional_size + ) { + H5_PRIV_FUNC_ENTER (h5_err_t, "octree=%p, additional_size=%d", octree, additional_size); + + if (additional_size == -1) { + additional_size = octree->nbr_alloc_oct; + } + if (additional_size < 8 ) { + additional_size = 8; + } + // check if data structures already exist + if (octree->octants == NULL) { + // allocate data structures + TRY (octree->octants = h5_calloc (additional_size, sizeof (*(octree->octants)))); + if (octree->size_userdata > 0) { + TRY (octree->userdata = h5_calloc (additional_size, octree->size_userdata)); + memset (octree->userdata, -1, additional_size * octree->size_userdata); + } + octree->nbr_alloc_oct = additional_size; + } else { + // grow data structure + TRY (octree->octants = h5_alloc (octree->octants, (octree->nbr_alloc_oct + additional_size) * sizeof (*(octree->octants)))); + if (octree->size_userdata > 0) { + TRY (octree->userdata = h5_alloc (octree->userdata, (octree->nbr_alloc_oct+additional_size) * octree->size_userdata)); + memset (((char*)octree->userdata) + octree->nbr_alloc_oct * octree->size_userdata , -1, additional_size * octree->size_userdata); + } + octree->nbr_alloc_oct += additional_size; + } + H5_PRIV_FUNC_RETURN (H5_SUCCESS); + +} + +#if 0 +/* + * Reset user data + */ +static h5_err_t +reset_userdata ( + h5t_octree_t* octree, + h5_int32_t size_userdata + ) { + H5_PRIV_FUNC_ENTER (h5_err_t, "octree=%p, size_userdata=%d", octree, size_userdata); + + // make sure all procs call the function + TRY (h5priv_mpi_barrier (octree->comm)); + + // delete userdata + TRY (h5_free(octree->userdata)); + + // allocate new userdata + if (size_userdata > 0) { + octree->size_userdata = size_userdata; + TRY (octree->userdata = h5_calloc (octree->nbr_alloc_oct, octree->size_userdata)); + } else { + octree->size_userdata = -1; + } + // set changed user data to 0 + for (int i = 0; i <= octree->current_oct_idx; i++) { + octree->octants[i].level_idx &= ~(1 << OCT_CHG_USERDATA); + } + + H5_PRIV_FUNC_RETURN (H5_SUCCESS); +} +#endif +/* + * Create octant + */ +static h5_err_t +create_octant ( + h5t_octree_t* octree, + h5_oct_idx_t parent_idx + ) { + H5_PRIV_FUNC_ENTER (h5_err_t, + "octree=%p, parent_idx=%d", + octree, + parent_idx); + + octree->current_oct_idx +=1; + + // check if there is enough space to insert one octant more. + if (octree->current_oct_idx >= octree->nbr_alloc_oct) { + TRY (grow_octree (octree,-1)); + } + // set parameters + h5t_octant_t* current_octant = &(octree->octants[octree->current_oct_idx]); + current_octant->idx = octree->current_oct_idx; + current_octant->parent_idx = parent_idx; + current_octant->child_idx = -1; + if (parent_idx >= 0) { + + current_octant->level_idx = ((octree->current_oct_idx - octree->octants[parent_idx].child_idx) << OCT_X) + + get_oct_level (octree, parent_idx) + 1; + + + } + + if (parent_idx != -1) { + current_octant->processor = octree->octants[parent_idx].processor; + } else { + current_octant->processor = 0; + } + current_octant->userlevels = 0; + H5_PRIV_FUNC_RETURN (H5_SUCCESS); +}; + +/* + * Create root octant + */ +static h5_err_t +create_root_octant ( + h5t_octree_t* octree + ) { + H5_PRIV_FUNC_ENTER (h5_err_t, "octree=%p", octree); + if (octree->octants == NULL || octree->nbr_alloc_oct < 1) { + H5_PRIV_FUNC_LEAVE (H5_ERR_INTERNAL); + } + TRY (create_octant (octree,-1)); + octree->octants[0].level_idx = 0; + TRY (set_leave_level(octree)); + H5_PRIV_FUNC_RETURN (H5_SUCCESS); +}; +/* + * Initialize an octree + */ +static h5_err_t +init_octree ( + h5t_octree_t** octree, + h5_int32_t size_userdata, + h5_float64_t* const bounding_box, + h5_int32_t maxpoints, + const MPI_Comm comm + ) { + H5_PRIV_FUNC_ENTER (h5_err_t, + "octree=%p, size_userdata=%d, " + "bounding_box=%p, " + "maxpoints=%d, comm=?", + octree, + size_userdata, + bounding_box, + maxpoints); + + TRY (h5priv_mpi_barrier (comm)); + + /*** assert of input data ***/ + //TODO maybe there is a more thorough check needed that input data is valid (i.e. the same on all proc) + if (bounding_box != NULL && (bounding_box[0] >= bounding_box[3] || + bounding_box[1] >= bounding_box[4] || + bounding_box[2] >= bounding_box[5])) { + H5_PRIV_FUNC_LEAVE (H5_ERR_INVAL); + }; + + /*** allocate octree ***/ + TRY (*octree = h5_calloc (1, sizeof (**octree))); + + (*octree)->comm = comm; + (*octree)->size_userdata = size_userdata; + TRY (create_mpi_type_octant ()); + (*octree)->octants = NULL; + (*octree)->userdata = NULL; + (*octree)->maxpoints = maxpoints; + + /*** allocate datastructures***/ + TRY (grow_octree (*octree,9)); + + (*octree)->nbr_alloc_oct = 9; + (*octree)->ref_oct_idx = -1; + (*octree)->current_oct_idx = -1; + TRY (create_root_octant (*octree)); + + if (bounding_box != NULL) { + TRY (H5t_set_bounding_box (*octree, bounding_box)); + } + + + H5_PRIV_FUNC_RETURN (H5_SUCCESS); +}; + +h5_err_t H5t_init_octree (h5t_octree_t** octree, h5_int32_t size_userdata, h5_float64_t* const bounding_box, h5_int32_t maxpoints, const MPI_Comm comm) { + return init_octree (octree, size_userdata, bounding_box, maxpoints, comm); +} + +static h5_err_t +read_octree ( + h5t_octree_t** octree, + h5_oct_idx_t current_oct_idx, + h5_int32_t size_userdata, + h5_int32_t maxpoints, + h5t_octant_t** octants, + void** userdata, + const MPI_Comm comm + ) { + H5_PRIV_FUNC_ENTER (h5_err_t, + "octree=%p, current_oct_idx=%d, size_userdata=%d, " + "maxpoints=%d, octants=%p, userdata=%p, comm=?", + octree, + current_oct_idx, + size_userdata, + maxpoints, + octants, + userdata); + + TRY (h5priv_mpi_barrier (comm)); // delete for speed up? + + /*** allocate octree ***/ + TRY (*octree = h5_calloc (1, sizeof (**octree))); + (*octree)->comm = comm; + (*octree)->size_userdata = size_userdata; + TRY (create_mpi_type_octant ()); + (*octree)->octants = NULL; + (*octree)->userdata = NULL; + (*octree)->maxpoints = maxpoints; + + /*** allocate datastructures***/ + TRY (grow_octree (*octree,current_oct_idx + 1)); + + (*octree)->nbr_alloc_oct = current_oct_idx + 1; + (*octree)->ref_oct_idx = -1; + (*octree)->current_oct_idx = current_oct_idx; + (*octants) = (*octree)->octants; + (*userdata) = (*octree)->userdata; + H5_PRIV_FUNC_RETURN (H5_SUCCESS); +} +h5_err_t H5t_read_octree (h5t_octree_t** octree, h5_oct_idx_t current_oct_idx, h5_int32_t size_userdata, h5_int32_t maxpoints, h5t_octant_t** octants, void** userdata, const MPI_Comm comm) { + return read_octree (octree, current_oct_idx, size_userdata, maxpoints, octants, userdata, comm); +} +/* + * free octree + */ +static h5_err_t +free_oct ( + h5t_octree_t* octree) { + H5_PRIV_FUNC_ENTER (h5_err_t, "octree=%p", octree); + if (octree != NULL) { + if (octree->userdata != NULL) { + TRY (h5_free (octree->userdata)); + } + MPI_Type_free(&h5_oct_dta_types.mpi_octant); + TRY (h5_free (octree->octants)); + TRY (h5_free (octree)); + octree = NULL; + } + H5_PRIV_FUNC_RETURN (H5_SUCCESS); +} +h5_err_t H5t_free_octree (h5t_octree_t* octree) { + return free_oct (octree); +} +static h5_err_t +write_octree ( + h5t_mesh_t* const m + ) { + H5_PRIV_FUNC_ENTER (h5_err_t, "m=%p", m); + + + H5_PRIV_FUNC_RETURN (h5_error_not_implemented ()); +} +h5_err_t H5t_write_octree ( h5t_mesh_t* const m) { + return write_octree (m); +} + +#if 0 +/* + * Print octree in human readable form + */ +static h5_err_t +print_octree_dbg ( + h5t_octree_t* octree + ) { + H5_PRIV_FUNC_ENTER (h5_err_t,"octree=%p", octree); + int rank; + TRY (h5priv_mpi_comm_rank (octree->comm, &rank)); + h5_debug ("\nproc %d: Octree\n" + "proc %d: current_oct_idx: %d \n" + "proc %d: nbr_alloc_oct: %d \n\n", + rank, + rank, + octree->current_oct_idx, + rank, + octree->nbr_alloc_oct); + H5_PRIV_FUNC_RETURN (H5_SUCCESS); +} +/* + * Print octree in human readable form + */ +static h5_err_t +print_octree ( + h5t_octree_t* octree + ) { + H5_PRIV_FUNC_ENTER (h5_err_t,"octree=%p", octree); + int rank; + TRY (h5priv_mpi_comm_rank (octree->comm, &rank)); + printf ("\nproc %d: Octree\n" + "proc %d: current_oct_idx: %d \n" + "proc %d: nbr_alloc_oct: %d \n\n", + rank, + rank, + octree->current_oct_idx, + rank, + octree->nbr_alloc_oct); + H5_PRIV_FUNC_RETURN (H5_SUCCESS); +} +/* + * Traverse through octants and print them in human readable form + */ +static h5_err_t +print_octants ( + h5t_octree_t* octree + ) { + H5_PRIV_FUNC_ENTER (h5_err_t, "octree=%p", octree); +#if 0 + register_printf_specifier ('B', printf_output_M, printf_arginfo_M); + int rank; + TRY (h5priv_mpi_comm_rank (octree->comm, &rank)); + for (int i = 0; i <= octree->current_oct_idx; i++) { + printf ("\n" +// h5_debug ("\n" + " Octant\n idx: %d \n" + " parent_idx: %d \n" + " child_idx: %d \n" +// " bounding_box: %4.4f, %4.4f, %4.4f \n" +// " %4.4f, %4.4f, %4.4f \n" + " processor: %d \n" + " level_idx: %B \n" + " userlevels: %B \n\n", + octree->octants[i].idx, + octree->octants[i].parent_idx, + octree->octants[i].child_idx, +// octree->octants[i].bounding_box[0], +// octree->octants[i].bounding_box[1], +// octree->octants[i].bounding_box[2], +// octree->octants[i].bounding_box[3], +// octree->octants[i].bounding_box[4], +// octree->octants[i].bounding_box[5], + octree->octants[i].processor, + octree->octants[i].level_idx, + octree->octants[i].userlevels); + + } +#endif + H5_PRIV_FUNC_RETURN (H5_SUCCESS); +} +#endif + +#if 0 +static h5_err_t +print_octants_arr ( + h5t_octant_t* octants, + h5_int32_t nbr_oct, + h5_int32_t rank + ) { + H5_PRIV_FUNC_ENTER (h5_err_t, "octree=%p", octants); +#if 0 + register_printf_specifier ('B', printf_output_M, printf_arginfo_M); + + for (int i = 0; i < nbr_oct; i++) { + h5_debug ("\n" + " Octant\n idx: %d \n" + " parent_idx: %d \n" + " child_idx: %d \n" +// " bounding_box: %4.4f, %4.4f, %4.4f \n" +// " %4.4f, %4.4f, %4.4f \n" + " processor: %d \n" + " level_idx: %B \n" + " userlevels: %B \n\n", + octants[i].idx, + octants[i].parent_idx, + octants[i].child_idx, +// octants[i].bounding_box[0], +// octants[i].bounding_box[1], +// octants[i].bounding_box[2], +// octants[i].bounding_box[3], +// octants[i].bounding_box[4], +// octants[i].bounding_box[5], + octants[i].processor, + octants[i].level_idx, + octants[i].userlevels); + + } +#endif + H5_PRIV_FUNC_RETURN (H5_SUCCESS); +} +#endif +///* +// * Traverse through octants and plot the for gnuplot +// */ + +int print_octant_for_gnuplot ( + h5_oct_idx_t oct_idx, + h5_float64_t* bounding_box + ) { +#if 0 + printf ( "# Octant idx: %d \n" + " %4.4f, %4.4f, %4.4f \n" + " %4.4f, %4.4f, %4.4f \n" + " %4.4f, %4.4f, %4.4f \n" + " %4.4f, %4.4f, %4.4f \n" + " %4.4f, %4.4f, %4.4f \n\n", + oct_idx, + bounding_box[0], bounding_box[1], bounding_box[2], + bounding_box[3], bounding_box[1], bounding_box[2], + bounding_box[3], bounding_box[4], bounding_box[2], + bounding_box[0], bounding_box[4], bounding_box[2], + bounding_box[0], bounding_box[1], bounding_box[2]); + printf ( + " %4.4f, %4.4f, %4.4f \n" + " %4.4f, %4.4f, %4.4f \n" + " %4.4f, %4.4f, %4.4f \n" + " %4.4f, %4.4f, %4.4f \n" + " %4.4f, %4.4f, %4.4f \n\n", + bounding_box[0], bounding_box[1], bounding_box[5], + bounding_box[3], bounding_box[1], bounding_box[5], + bounding_box[3], bounding_box[4], bounding_box[5], + bounding_box[0], bounding_box[4], bounding_box[5], + bounding_box[0], bounding_box[1], bounding_box[5]); + printf ( + " %4.4f, %4.4f, %4.4f \n" + " %4.4f, %4.4f, %4.4f \n\n" + + " %4.4f, %4.4f, %4.4f \n" + " %4.4f, %4.4f, %4.4f \n\n" + + " %4.4f, %4.4f, %4.4f \n" + " %4.4f, %4.4f, %4.4f \n\n" + + " %4.4f, %4.4f, %4.4f \n" + " %4.4f, %4.4f, %4.4f \n\n", + bounding_box[0], bounding_box[1], bounding_box[2], + bounding_box[0], bounding_box[1], bounding_box[5], + + bounding_box[3], bounding_box[1], bounding_box[2], + bounding_box[3], bounding_box[1], bounding_box[5], + + bounding_box[3], bounding_box[4], bounding_box[2], + bounding_box[3], bounding_box[4], bounding_box[5], + + bounding_box[0], bounding_box[4], bounding_box[2], + bounding_box[0], bounding_box[4], bounding_box[5]); +#endif + return 0; +} + +h5_err_t +plot_octants ( + h5t_octree_t* octree + ) { + H5_PRIV_FUNC_ENTER (h5_err_t, "octree=%p", octree); +// h5_debug ("# start plot octants",""); + h5_float64_t bounding_box[6]; + int i; + for (i = 0; i <= octree->current_oct_idx; i++) { +// h5_debug ( + TRY (get_bounding_box_of_octant (octree, i, bounding_box)); + print_octant_for_gnuplot (i, bounding_box); + } + for (i = 0; i <= octree->current_oct_idx; i++) { + TRY (get_bounding_box_of_octant (octree, i, bounding_box)); + printf ( + "set label \" %d \" at first %4.4f, first %4.4f font \"Helvetica,7\"\n",octree->octants[i].idx, bounding_box[0] + 0.02 + 0.6 * bounding_box[1], bounding_box[2] + 0.02 + 0.4 * bounding_box[1]); + } +// h5_debug ("# end plot octants",""); + H5_PRIV_FUNC_RETURN (H5_SUCCESS); +} + +static h5_err_t +get_siblings( + h5t_octree_t* octree, + h5_oct_idx_t oct_idx, + h5_oct_idx_t* siblings_idx + ); + +h5_err_t +plot_octant_anc ( + h5t_octree_t* octree, + h5_oct_idx_t oct_idx + ) { + H5_PRIV_FUNC_ENTER (h5_err_t, "octree=%p", octree); +// h5_debug ("# start plot octants",""); + h5_float64_t bounding_box[6]; + do { + TRY (get_siblings(octree, oct_idx, &oct_idx)); + for (int i = 0; i < NUM_OCTANTS; i++) { + TRY (get_bounding_box_of_octant (octree, oct_idx + i, bounding_box)); + print_octant_for_gnuplot (oct_idx + i, bounding_box); + + printf ( + "set label \" %d \" at first %4.4f, first %4.4f font \"Helvetica,7\"\n",octree->octants[oct_idx+i].idx, bounding_box[0] + 0.02 + 0.6 * bounding_box[1], bounding_box[2] + 0.02 + 0.4 * bounding_box[1]); + } + } while ((oct_idx = get_parent(octree, oct_idx)) != -1); + + H5_PRIV_FUNC_RETURN (H5_SUCCESS); +} +h5_err_t +plot_leaf_octants ( + h5t_octree_t* octree + ) { + H5_PRIV_FUNC_ENTER (h5_err_t, "octree=%p", octree); + + h5_float64_t bounding_box[6]; + h5t_oct_iterator_t* iter; + TRY (H5t_init_leafoct_iterator (octree, &iter)); + h5_oct_idx_t oct_idx = -1; + while ((oct_idx = H5t_iterate_oct(iter)) != -1) { + + TRY (get_bounding_box_of_octant (octree, oct_idx, bounding_box)); + print_octant_for_gnuplot (oct_idx, bounding_box); + } + printf ("\n #real oct labels \n"); + TRY (H5t_init_leafoct_iterator (octree, &iter)); + while ((oct_idx = H5t_iterate_oct(iter)) != -1) { + TRY (get_bounding_box_of_octant (octree, oct_idx, bounding_box)); + printf ( + "set label \" %d \" at first %4.4f, first %4.4f font \"Helvetica,7\"\n", + octree->octants[oct_idx].idx, bounding_box[0] + 0.02 + 0.6 * bounding_box[1], bounding_box[2] + 0.02 + 0.4 * bounding_box[1]); + } + printf ("\n #leaf oct labels \n"); + TRY (H5t_init_leafoct_iterator (octree, &iter)); + int counter = 0; + while ((oct_idx = H5t_iterate_oct(iter)) != -1) { + TRY (get_bounding_box_of_octant (octree, oct_idx, bounding_box)); + printf ( + "set label \" %d \" at first %4.4f, first %4.4f font \"Helvetica,7\"\n", + counter++, bounding_box[0] + 0.02 + 0.6 * bounding_box[1], bounding_box[2] + 0.02 + 0.4 * bounding_box[1]); + } + TRY (H5t_end_iterate_oct(iter)); + H5_PRIV_FUNC_RETURN (H5_SUCCESS); +} + +void print_array ( + h5_int32_t* neigh, + h5_oct_idx_t nbr_neigh, + int rank + ) { + printf ("proc %d: array \n",rank); + for (int i = 0; i < nbr_neigh; i++) { + printf (" %d, ", neigh[i]); + } + + printf ("\n"); + } + + +/* + * begin refine octants + */ +static h5_err_t +begin_refine_octants( + h5t_octree_t* octree + ) { + H5_PRIV_FUNC_ENTER (h5_err_t, "octree=%p", octree); + + TRY (h5priv_mpi_barrier (octree->comm)); + update_internal (octree); + octree->ref_oct_idx = octree->current_oct_idx; + H5_PRIV_FUNC_RETURN (H5_SUCCESS); +} +/* + * Refine an octant + */ +static h5_err_t +refine_octant( + h5t_octree_t* octree, + h5_oct_idx_t oct_idx + ) { + H5_PRIV_FUNC_ENTER (h5_err_t, "octree=%p, oct_idx=%d", octree, oct_idx); + int rank; + MPI_Comm_rank (octree->comm, &rank); + + if (octree->octants[oct_idx].processor != rank ) { + h5_debug ("Trying to refine an octant that doesn't belong to proc"); + H5_PRIV_FUNC_LEAVE (H5_ERR_INVAL); + } + + if (octree->octants[oct_idx].child_idx != -1 || octree->ref_oct_idx == -1) { + h5_debug ("Either octant is already refined or begin_refine_octants() was not invoked"); + H5_PRIV_FUNC_LEAVE (H5_ERR_INVAL); + } + if( octree->current_oct_idx + 1 + 8 >= octree->nbr_alloc_oct) { + /*** need to allocate more memory for octants ***/ + TRY (grow_octree (octree, -1)); + } + + + octree->octants[oct_idx].child_idx = octree->current_oct_idx + 1; + TRY (create_octant (octree, oct_idx)); + + TRY (create_octant (octree, oct_idx)); + + TRY (create_octant (octree, oct_idx)); + + TRY (create_octant (octree, oct_idx)); + + TRY (create_octant (octree, oct_idx)); + + TRY (create_octant (octree, oct_idx)); + + TRY (create_octant (octree, oct_idx)); + + TRY (create_octant (octree, oct_idx)); + + set_leave_level (octree); + + H5_PRIV_FUNC_RETURN (H5_SUCCESS); +} +/* + * end refine octants + */ +static h5_err_t +end_refine_octants( + h5t_octree_t* octree, + h5_oct_point_t* midpoints, + int num_midpoints + ) { + H5_PRIV_FUNC_ENTER (h5_err_t, "octree=%p", octree); + if (octree->ref_oct_idx == -1) { + H5_PRIV_FUNC_LEAVE (H5_ERR_INVAL); + } + + // exchange how many new octants per proc where created + int size,rank; + TRY (h5priv_mpi_comm_size (octree->comm, &size)); + TRY (h5priv_mpi_comm_rank (octree->comm, &rank)); + h5_int32_t* nbr_oct_new; + TRY (nbr_oct_new = h5_calloc (size,sizeof (*nbr_oct_new))); + h5_int32_t total_oct_new = 0; + h5_oct_idx_t loc_oct_new = octree->current_oct_idx - octree->ref_oct_idx; + TRY (h5priv_mpi_allgather (&loc_oct_new, + 1, + MPI_INT, + nbr_oct_new, + 1, + MPI_INT, + octree->comm)); + + // calculate own range (i.e. offset) + h5_oct_idx_t* offset; + TRY (offset = h5_calloc (size,sizeof(*offset))); + total_oct_new = nbr_oct_new[0]; + for (int i = 1; i < size; i++ ) { + total_oct_new += nbr_oct_new[i]; + offset[i] = nbr_oct_new[i-1] + offset[i-1]; + } + // allocate enough memory for all new octants + if (octree->ref_oct_idx + 1 + total_oct_new >= octree->nbr_alloc_oct) { + TRY (grow_octree (octree, total_oct_new )); + } + + // update octants with offset + if (offset[rank] > 0) { + for (int i = octree->ref_oct_idx+1; i <= octree->current_oct_idx; i++) { + if (octree->octants[i].idx > octree->ref_oct_idx) { + octree->octants[i].idx += offset[rank]; + } + if (octree->octants[i].parent_idx > octree->ref_oct_idx) { + octree->octants[i].parent_idx += offset[rank]; + } + if (octree->octants[i].child_idx > octree->ref_oct_idx) { + octree->octants[i].child_idx += offset[rank]; + } + } + // update midpoints list with offset + if (num_midpoints > 0) { + for (int i = 0; i < num_midpoints; i++) { + if (midpoints[i].oct > octree->ref_oct_idx) { + midpoints[i].oct += offset[rank]; + } + } + } + + } + void* sendbuf; + void* recvbuf; + if ((loc_oct_new) > 0) { + TRY (sendbuf = h5_calloc (loc_oct_new ,sizeof (h5t_octant_t))); + } else { + sendbuf = NULL; + } + TRY (recvbuf = h5_calloc (total_oct_new ,sizeof (h5t_octant_t))); + // copy new octants to send buffer + memmove (sendbuf, + &(octree->octants[octree->ref_oct_idx + 1]), + loc_oct_new * sizeof (h5t_octant_t)); + octree->current_oct_idx = octree->ref_oct_idx + total_oct_new; + // commit new type + +// TRY (h5priv_mpi_type_commit (&h5_oct_dta_types.mpi_octant)); + + TRY (mpi_allgatherv ( + sendbuf, + nbr_oct_new[rank], + h5_oct_dta_types.mpi_octant, + recvbuf, + nbr_oct_new, + offset, + h5_oct_dta_types.mpi_octant, + octree->comm + )); + + memcpy (&(octree->octants[octree->ref_oct_idx + 1]), recvbuf, total_oct_new * sizeof (h5t_octant_t)); + + // update parents child_idx + //TODO could be more efficient + for (int i = octree->current_oct_idx; i > octree->ref_oct_idx ; i--) { + h5_oct_idx_t parent_idx = get_parent (octree, i); + if (parent_idx < 0 || parent_idx > octree->current_oct_idx) { + H5_PRIV_FUNC_LEAVE (H5_ERR_INTERNAL); + } + octree->octants[parent_idx].child_idx = i; + + } + + octree->ref_oct_idx = -1; + + TRY (h5_free (nbr_oct_new)); + if (sendbuf != NULL) { + TRY (h5_free (sendbuf)); + } + TRY (h5_free (recvbuf)); + TRY (h5_free (offset)); + update_userdata (octree); + clear_level_internal (octree); + update_internal (octree); // maybe update leave level would be enough + H5_PRIV_FUNC_RETURN (H5_SUCCESS); +} + +/* + * compare func for qsort bsearch + */ +int compare_points_x(const void *p_a, const void *p_b) +{ +return ((*(h5_oct_point_t*)p_a).x - (*(h5_oct_point_t*)p_b).x) >= 0 ? 1 : 0; +} +int compare_points_y(const void *p_a, const void *p_b) +{ +return ((*(h5_oct_point_t*)p_a).y - (*(h5_oct_point_t*)p_b).y) >= 0 ? 1 : 0; +} +int compare_points_z(const void *p_a, const void *p_b) +{ +return ((*(h5_oct_point_t*)p_a).z - (*(h5_oct_point_t*)p_b).z) >= 0 ? 1 : 0; +} +int sort_points_x(const void *p_a, const void *p_b) +{ + + if (((*(h5_oct_point_t*)p_a).x - (*(h5_oct_point_t*)p_b).x) < 0 ) + return -1 ; + if (((*(h5_oct_point_t*)p_a).x - (*(h5_oct_point_t*)p_b).x) == 0 ) + return 0; + if (((*(h5_oct_point_t*)p_a).x - (*(h5_oct_point_t*)p_b).x) > 0 ) + return 1 ; + return -1; // will never be executed +} +int sort_points_y(const void *p_a, const void *p_b) +{ + if (((*(h5_oct_point_t*)p_a).y - (*(h5_oct_point_t*)p_b).y) < 0 ) + return -1 ; + if (((*(h5_oct_point_t*)p_a).y - (*(h5_oct_point_t*)p_b).y) == 0 ) + return 0; + if (((*(h5_oct_point_t*)p_a).y - (*(h5_oct_point_t*)p_b).y) > 0 ) + return 1 ; + return -1; // will never be executed +} +int sort_points_z(const void *p_a, const void *p_b) +{ + if (((*(h5_oct_point_t*)p_a).z - (*(h5_oct_point_t*)p_b).z) < 0 ) + return -1 ; + if (((*(h5_oct_point_t*)p_a).z - (*(h5_oct_point_t*)p_b).z) == 0 ) + return 0; + if (((*(h5_oct_point_t*)p_a).z - (*(h5_oct_point_t*)p_b).z) > 0 ) + return 1 ; + return -1; // will never be executed +} + + +/* + * multidimensional sort of array of points + */ +static h5_err_t +sort_array ( + h5_oct_point_t* key, + h5_oct_point_t* points, + h5_int32_t nbr_points, + h5_oct_point_t** split, + h5_int32_t* nbr_in_split + ) { + H5_PRIV_FUNC_ENTER (h5_err_t, "key=%p, points=%p, nbr_points=%d, split=%p, nbr_in_split=%p", + key, points, nbr_points, split, nbr_in_split); + + // sort in z + comparison_fn_t compare; + compare.compare = compare_points_z; + split[0] = points; + qsort (points, nbr_points, sizeof (*points), sort_points_z); + split[4] = linsearch (key, points, nbr_points, sizeof (*points), compare); + if (split[4] == NULL) { + nbr_in_split[0] = nbr_points; + } else { + nbr_in_split[0] = split[4] - split[0]; + } + nbr_in_split[4] = nbr_points - nbr_in_split[0]; + + + // sort in y + compare.compare = compare_points_y; + qsort (split[0], nbr_in_split[0], sizeof (*points), sort_points_y); + qsort (split[4], nbr_in_split[4], sizeof (*points), sort_points_y); + split[2] = linsearch (key, split[0], nbr_in_split[0], sizeof (*points), compare); + split[6] = linsearch (key, split[4], nbr_in_split[4], sizeof (*points), compare); + if (split[2] == NULL) { + nbr_in_split[2] = 0; + } else { + nbr_in_split[2] = nbr_in_split[0] - (split[2] - split[0]); + } + nbr_in_split[0] -= nbr_in_split[2]; + + if (split[6] == NULL) { + nbr_in_split[6] = 0; + } else { + nbr_in_split[6] = nbr_in_split[4] - (split[6] - split[4]); + } + nbr_in_split[4] -= nbr_in_split[6]; + + // sort in x + compare.compare = compare_points_x; + qsort (split[0], nbr_in_split[0], sizeof (*points), sort_points_x); + qsort (split[2], nbr_in_split[2], sizeof (*points), sort_points_x); + qsort (split[4], nbr_in_split[4], sizeof (*points), sort_points_x); + qsort (split[6], nbr_in_split[6], sizeof (*points), sort_points_x); + split[1] = linsearch (key, split[0], nbr_in_split[0], sizeof (*points), compare); + split[3] = linsearch (key, split[2], nbr_in_split[2], sizeof (*points), compare); + split[5] = linsearch (key, split[4], nbr_in_split[4], sizeof (*points), compare); + split[7] = linsearch (key, split[6], nbr_in_split[6], sizeof (*points), compare); + + if (split[1] == NULL) { + nbr_in_split[1] = 0; + } else { + nbr_in_split[1] = nbr_in_split[0] - (split[1] - split[0]); + } + nbr_in_split[0] -= nbr_in_split[1]; + + if (split[3] == NULL) { + nbr_in_split[3] = 0; + } else { + nbr_in_split[3] = nbr_in_split[2] - (split[3] - split[2]); + } + nbr_in_split[2] -= nbr_in_split[3]; + + if (split[5] == NULL) { + nbr_in_split[5] = 0; + } else { + nbr_in_split[5] = nbr_in_split[4] - (split[5] - split[4]); + } + nbr_in_split[4] -= nbr_in_split[5]; + + if (split[7] == NULL) { + nbr_in_split[7] = 0; + } else { + nbr_in_split[7] = nbr_in_split[6] - (split[7] - split[6]); + } + nbr_in_split[6] -= nbr_in_split[7]; + + H5_PRIV_FUNC_RETURN (H5_SUCCESS); +} +/* + * get_midpoint + */ +static h5_err_t +get_midpoint ( + h5_oct_point_t* midpoint, + h5_float64_t* bounding_box + ) { + H5_PRIV_FUNC_ENTER (h5_err_t, "midpoint=%p, bounding_box=%p", midpoint, bounding_box); + midpoint->x = (bounding_box[3] + bounding_box[0]) / 2.0; + midpoint->y = (bounding_box[4] + bounding_box[1]) / 2.0; + midpoint->z = (bounding_box[5] + bounding_box[2]) / 2.0; + H5_PRIV_FUNC_RETURN (H5_SUCCESS); +} +/* + * function to calculate bounding box of child with orientation orient + */ + +static h5_err_t +get_new_bounding_box ( + h5_float64_t* bb, + h5_float64_t* new_bb, + h5_oct_orient_t orient + ) { + H5_PRIV_FUNC_ENTER (h5_err_t, "midpoint=%p, bounding_box=%p, orient=%d", bb, new_bb, orient); + h5_float64_t xmin, xmid, xmax, ymin, ymid, ymax, zmin, zmid, zmax; + + // store all values such that bb and new_bb can be the same + xmin = bb[0]; + xmax = bb[3]; + xmid = (xmin + xmax) / 2; + + ymin = bb[1]; + ymax = bb[4]; + ymid = (ymin + ymax) / 2; + + zmin = bb[2]; + zmax = bb[5]; + zmid = (zmin + zmax) / 2; + + // x direction + if ((orient & 1) == 1) { + new_bb[0] = xmid; + new_bb[3] = xmax; + } else { + new_bb[0] = xmin; + new_bb[3] = xmid; + } + // y direction + if ((orient & 2) == 2) { + new_bb[1] = ymid; + new_bb[4] = ymax; + } else { + new_bb[1] = ymin; + new_bb[4] = ymid; + } + // z direction + if ((orient & 4) == 4) { + new_bb[2] = zmid; + new_bb[5] = zmax; + } else { + new_bb[2] = zmin; + new_bb[5] = zmid; + } + H5_PRIV_FUNC_RETURN (H5_SUCCESS); +} +void print_array_p ( + h5_oct_point_t* neigh, + h5_oct_idx_t nbr_neigh, + int rank + ) { + printf ("proc %d: array \n",rank); + for (int i = 0; i < nbr_neigh; i++) { + printf (" %4.4f, %4.4f, %4.4f / %d, %lld --", neigh[i].x, neigh[i].y, neigh[i].z, neigh[i].oct, (long long) neigh[i].elem); + } + + printf ("\n"); + } +/* + * recursive refine oct w points + */ +static h5_err_t +recursive_ref_points ( + h5t_octree_t* octree, + h5_oct_idx_t oct_idx, + h5_float64_t* bounding_box, + h5_oct_point_t* points, + h5_int32_t nbr_points, + h5_int32_t max_points + ) { + H5_PRIV_FUNC_ENTER (h5_err_t, + "octree=%p, oct_idx=%d points=%p, bounding_box=%p, nbr_points=%d, max_points=%d", + octree, + oct_idx, + bounding_box, + points, + nbr_points, + max_points); + + h5_oct_point_t midpoint; + TRY (get_midpoint (&midpoint, bounding_box)); + if (octree->octants[oct_idx].child_idx == -1) { + // octant needs to be refined + TRY (refine_octant (octree, oct_idx)); + } + h5_oct_point_t* split_arr[8]; + h5_oct_point_t** split = split_arr; + h5_int32_t nbr_in_split_arr[8]; + h5_int32_t* nbr_in_split = nbr_in_split_arr; + TRY (sort_array (&midpoint, points, nbr_points, split, nbr_in_split)); + + for (int i = 0; i < 8; i++) { + if (nbr_in_split[i] > max_points || + (h5tpriv_octant_is_full (octree, octree->octants[oct_idx].child_idx + i) + && nbr_in_split[i] > 0) + ) { + h5_float64_t new_bounding_box[6]; + TRY (get_new_bounding_box (bounding_box, new_bounding_box, i)); + // call itself with points belonging to childrens octants + TRY (recursive_ref_points (octree, octree->octants[oct_idx].child_idx + i, new_bounding_box, split[i], nbr_in_split[i], max_points)); + + } else { + // assign oct_idx to points + // print_array_p (points,nbr_points,32); + for (int j = 0; j < nbr_in_split[i]; j++) { + (split[i] + j)->oct = octree->octants[oct_idx].child_idx + i; + + } + //print_array_p (points,nbr_points,32); + } + } + + H5_PRIV_FUNC_RETURN (H5_SUCCESS); +} + +/* + * refine with points + */ +static h5_err_t +refine_w_points ( + h5t_octree_t* octree, + h5_oct_point_t* points, + h5_int32_t nbr_points, + h5_int32_t max_points + ) { + H5_PRIV_FUNC_ENTER (h5_err_t, "octree=%p, points=%p, nbr_points=%d, max_points=%d", octree, points, nbr_points, max_points); + if (nbr_points < 1) { + TRY (begin_refine_octants (octree)); + TRY (end_refine_octants (octree, points, nbr_points)); + H5_PRIV_FUNC_LEAVE (H5_SUCCESS); + } + + TRY (begin_refine_octants (octree)); + + if (points[0].oct == -1) { // adding points for the first time + if (nbr_points > max_points || h5tpriv_octant_is_full (octree, 0)) { + TRY (recursive_ref_points (octree, 0, octree->bounding_box, points, nbr_points, max_points)); + } else { + for (int j = 0; j < nbr_points; j++) { + points[j].oct = 0; + } + } + } else { // midpoints from refining elements + int counter = 0; + h5_float64_t bounding_box[6]; + while (counter < nbr_points) { + // find all points that are together in a leaf oct at the moment + h5_oct_idx_t oct_idx = points[counter].oct; + int first_point = counter++; + assert ( oct_has_level (octree, oct_idx, OCT_USERLEV_LENGTH -1)); + while (counter < nbr_points && oct_idx == points[counter].oct) { + counter++; + } + // check if refinement of octree is necessary (either octant is full or more than maxpoints are in leaf octant) + if (counter - first_point > max_points || h5tpriv_octant_is_full (octree, points[first_point].oct)) { + + TRY (get_bounding_box_of_octant(octree, points[first_point].oct, bounding_box)); + TRY (recursive_ref_points ( + octree, + points[first_point].oct, + bounding_box, + &points[first_point], + counter - first_point, + max_points)); + } + + } + } + TRY (end_refine_octants (octree, points, nbr_points)); + + H5_PRIV_FUNC_RETURN (H5_SUCCESS); +} +h5_err_t H5t_refine_w_points (h5t_octree_t* octree, h5_oct_point_t* points, h5_int32_t nbr_points, h5_int32_t max_points) { + return refine_w_points (octree, points, nbr_points, max_points); +} +static int +bounding_box_contains_point ( + h5_float64_t* bounding_box, + h5_oct_point_t* point + ) { + H5_PRIV_FUNC_ENTER (h5_err_t, "bounding_box=%p, point=%p", bounding_box, point); + if ( bounding_box[0] <= point->x && + bounding_box[3] > point->x && + bounding_box[1] <= point->y && + bounding_box[4] > point->y && + bounding_box[2] <= point->z && + bounding_box[5] > point->z + ) { + H5_PRIV_FUNC_LEAVE (1); + } else { + H5_PRIV_FUNC_LEAVE (0); + } + H5_PRIV_FUNC_RETURN (H5_ERR); +} +static h5_err_t +get_bounding_box_of_octant ( + h5t_octree_t* const octree, + h5_oct_idx_t oct_idx, + h5_float64_t* bounding_box + ) { + H5_PRIV_FUNC_ENTER (h5_err_t, "octree=%p, oct_idx=%d, bounding_box=%p", octree, oct_idx, bounding_box); + + // get level and allocate memory to store all ancestors + h5_lvl_idx_t level = get_oct_level (octree, oct_idx); + h5_oct_idx_t* ancestors = NULL; + TRY (ancestors = h5_calloc (level + 1, sizeof (*ancestors))); + + // retrieve all ancestors + int i = 0; + ancestors[i++] = oct_idx; + h5_oct_idx_t parent = get_parent (octree, oct_idx); + + while (parent >= 0) { + ancestors[i++] = parent; + parent = get_parent (octree, parent); + } + // get bounding box of octree + memcpy (bounding_box, octree->bounding_box, 6 * sizeof (*bounding_box)); + + // calculate recursively the bounding box of oct_idx + h5_oct_orient_t direction = 0; + while (--i > 0) { + direction = ancestors[i-1] - get_children(octree, ancestors[i]); + TRY (get_new_bounding_box(bounding_box, bounding_box, direction)); + } + TRY (h5_free (ancestors)); + H5_PRIV_FUNC_RETURN (H5_SUCCESS); +} +h5_err_t +H5t_get_bounding_box_of_octant (h5t_octree_t* const octree, h5_oct_idx_t oct_idx, h5_float64_t* bounding_box) { + return get_bounding_box_of_octant (octree, oct_idx, bounding_box); +} + +static h5_oct_idx_t +find_leafoctant_of_point ( + h5t_octree_t* octree, + h5_oct_idx_t oct_idx, + h5_float64_t* bounding_box, + h5_oct_point_t* point + ) { + H5_PRIV_FUNC_ENTER (h5_err_t, "octree=%p, oct_idx=%d, point=%p", octree, oct_idx, point); + + // if point is not contained in octree return error + if (!bounding_box_contains_point (bounding_box, point)) { + H5_PRIV_FUNC_LEAVE (H5_ERR_INVAL); + } + h5_oct_idx_t ret_oct_idx = oct_idx; + // if octant has children find the child that contains it and search -> recursively + if (octree->octants[oct_idx].child_idx != -1) { + oct_idx = octree->octants[oct_idx].child_idx; + h5_float64_t new_bb[6]; + for (int i = 0; i < 8; i++) { + TRY (get_new_bounding_box(bounding_box, new_bb, i)); + if (bounding_box_contains_point (new_bb, point)) { + TRY (ret_oct_idx = find_leafoctant_of_point (octree, oct_idx + i, new_bb, point)); + break; + } + } + } + + H5_PRIV_FUNC_RETURN (ret_oct_idx); +} +h5_oct_idx_t +H5t_find_leafoctant_of_point (h5t_octree_t* octree, h5_oct_idx_t oct_idx, h5_float64_t* bounding_box, h5_oct_point_t* point) { + return find_leafoctant_of_point (octree, oct_idx, bounding_box, point); +} + + +/* + * if points are assigned to octants which have children, points get assigned to leaf level octants + */ +static h5_err_t +add_points_to_leaf ( + h5t_octree_t* octree, + h5_oct_point_t* points, + h5_int32_t nbr_points) { + H5_PRIV_FUNC_ENTER (h5_err_t, "octree=%p, points=%p, nbr_points=%d", octree, points, nbr_points); + h5_float64_t bounding_box[6]; + for (int i = 0; i < nbr_points; i++) { + TRY (get_bounding_box_of_octant (octree, points[i].oct, bounding_box)); + TRY (points[i].oct = find_leafoctant_of_point (octree, points[i].oct, bounding_box, &points[i])); + } + + H5_PRIV_FUNC_RETURN (H5_SUCCESS); +} + +h5_err_t H5t_add_points_to_leaf (h5t_octree_t* octree, h5_oct_point_t* points, h5_int32_t nbr_points) { + return add_points_to_leaf (octree, points, nbr_points); +} +/* + * Get siblings + */ +static h5_err_t +get_siblings( + h5t_octree_t* octree, + h5_oct_idx_t oct_idx, + h5_oct_idx_t* siblings_idx + ) { + H5_PRIV_FUNC_ENTER (h5_err_t, "octree=%p, oct_idx=%d, siblings_idx=%p", octree, oct_idx, siblings_idx); + + + if (oct_idx == 0) { + /*** root node has no siblings***/ + H5_PRIV_FUNC_LEAVE (H5_ERR_INVAL); + } else { + h5_oct_idx_t parent_idx = octree->octants[oct_idx].parent_idx; + *siblings_idx = octree->octants[parent_idx].child_idx; + } + + H5_PRIV_FUNC_RETURN (H5_SUCCESS); +} + +/* + * Get sibling + */ +static h5_oct_idx_t +get_sibling( + h5t_octree_t* octree, + h5_oct_idx_t oct_idx + ) { + H5_PRIV_FUNC_ENTER (h5_err_t, "octree=%p, oct_idx=%d", octree, oct_idx); + assert (oct_idx >0); + H5_PRIV_FUNC_RETURN (octree->octants[octree->octants[oct_idx].parent_idx].child_idx); +} +h5_oct_idx_t H5t_get_sibling(h5t_octree_t* octree, h5_oct_idx_t oct_idx) { + return get_sibling(octree, oct_idx); +} + +#if 0 +/* + * returns memory usage per processor + */ +static h5_err_t +mem_usage ( + h5t_octree_t* octree, + h5_int32_t* mem_use + ) { + H5_PRIV_FUNC_ENTER (h5_err_t, "octree=%p, mem_use=%p", octree, mem_use); + *mem_use = sizeof (*octree) + (sizeof (*(octree->octants)) + octree->size_userdata) * octree->nbr_alloc_oct; + H5_PRIV_FUNC_RETURN (H5_SUCCESS); +} +#endif + +#if 0 +/* + * free neigh memory + */ +static h5_err_t +free_neigh ( + h5_oct_idx_t* neighbors, + h5_oct_idx_t* ancestor_of_neigh + ) { + H5_PRIV_FUNC_ENTER (h5_err_t, "neighbors=%p, ancestor_of_neigh=%p", neighbors, ancestor_of_neigh); + TRY (h5_free (neighbors)); + TRY (h5_free (ancestor_of_neigh)); + H5_PRIV_FUNC_RETURN (H5_SUCCESS); +} +#endif + +/* + * compare func for qsort bsearch + */ +int compare_oct_idx(const void *p_a, const void *p_b) +{ +return *(h5_oct_idx_t*)p_a - *(h5_oct_idx_t*)p_b; +} +/* + * add oct_idx to array if it doesn't exists yet (without sorting) + */ +static h5_err_t +add_neigh ( + h5t_octree_t* octree, + h5_oct_idx_t oct_idx, + h5_oct_idx_t* neigh, + h5_oct_idx_t* num_neigh + ) { + H5_PRIV_FUNC_ENTER (h5_err_t, + "octree=%p, oct_idx=%d, ancestor_of_neigh=%p, nbr_anc_of_neigh=%d", + octree, oct_idx, + neigh, *num_neigh); + int i = 0; + for (; i < *num_neigh; i++) { + if (oct_idx == neigh[i]) { + H5_PRIV_FUNC_LEAVE (H5_SUCCESS); + } + } + + neigh[*num_neigh] = oct_idx; + (*num_neigh)++; + + H5_PRIV_FUNC_RETURN (H5_SUCCESS); +} +/* + * add ancestor to array if it doesn't exists yet (sort ancestors) + */ +static h5_err_t +add_ancestor ( + h5t_octree_t* octree, + h5_oct_idx_t oct_idx, + h5_oct_idx_t* ancestor_of_neigh, + h5_oct_idx_t* nbr_anc_of_neigh + ) { + H5_PRIV_FUNC_ENTER (h5_err_t, + "octree=%p, oct_idx=%d, ancestor_of_neigh=%p, nbr_anc_of_neigh=%d", + octree, oct_idx, + ancestor_of_neigh, *nbr_anc_of_neigh); + + + if ( bsearch (&oct_idx, ancestor_of_neigh, (size_t) *nbr_anc_of_neigh, sizeof (*nbr_anc_of_neigh), compare_oct_idx) == NULL) { + ancestor_of_neigh[*nbr_anc_of_neigh] = oct_idx; + (*nbr_anc_of_neigh)++; + qsort(ancestor_of_neigh, (size_t) *nbr_anc_of_neigh, sizeof (*nbr_anc_of_neigh), compare_oct_idx); + } + H5_PRIV_FUNC_RETURN (H5_SUCCESS); +} +/* + * get ancestors of octant + */ +static h5_err_t +get_ancestors ( + h5t_octree_t* octree, + h5_oct_idx_t oct_idx, + h5_oct_idx_t* ancestor_of_neigh, + h5_oct_idx_t* nbr_anc_of_neigh + ) { + H5_PRIV_FUNC_ENTER (h5_err_t, + "octree=%p, oct_idx=%d, ancestor_of_neigh=%p, nbr_anc_of_neigh=%d", + octree, oct_idx, + ancestor_of_neigh, *nbr_anc_of_neigh); + h5_oct_idx_t parent_idx = oct_idx; + while ((parent_idx = get_parent (octree, parent_idx)) != -1 ) { + TRY (add_ancestor (octree, parent_idx, ancestor_of_neigh, nbr_anc_of_neigh)); + } + H5_PRIV_FUNC_RETURN (H5_SUCCESS); +} +/* + * get children with given orientation on certain level + */ +static h5_err_t +get_kids_with_orient ( + h5t_octree_t* octree, + h5_oct_idx_t oct_idx, + h5_oct_idx_t* neighbors, + h5_oct_idx_t* nbr_neigh, + h5_oct_idx_t* ancestor_of_neigh, + h5_oct_idx_t* nbr_anc_of_neigh, + h5_oct_level_t userlevel, + h5_int32_t orient, + h5_int32_t direction, + h5_int32_t ifsibling + ); + +static h5_err_t +get_kids_with_orient ( + h5t_octree_t* octree, + h5_oct_idx_t oct_idx, + h5_oct_idx_t* neighbors, + h5_oct_idx_t* nbr_neigh, + h5_oct_idx_t* ancestor_of_neigh, + h5_oct_idx_t* nbr_anc_of_neigh, + h5_oct_level_t userlevel, + h5_int32_t orient, + h5_int32_t direction, + h5_int32_t ifsibling + ) { + H5_PRIV_FUNC_ENTER (h5_err_t, + "octree=%p, oct_idx=%d, neighbors=%p, nbr_neigh=%d," + " ancestor_of_neigh=%p, nbr_anc_of_neigh=%d," + " userlevel=%d, orient=%d, direction=%d", + octree, oct_idx, neighbors, *nbr_neigh, + ancestor_of_neigh, *nbr_anc_of_neigh, + userlevel, orient, direction); + assert (*nbr_neigh > -1); + assert (*nbr_neigh < OCT_MAX_NEIGHBORS); + assert (*nbr_anc_of_neigh > -1); + assert (*nbr_anc_of_neigh < OCT_MAX_NEIGHBORS); + assert (oct_idx > 0); + + if (oct_has_level (octree, oct_idx, userlevel)) { + // octant is neighbor on correct level + neighbors[*nbr_neigh] = oct_idx; + (*nbr_neigh)++; + TRY (get_ancestors (octree, oct_idx, ancestor_of_neigh, nbr_anc_of_neigh)); + + } else { + + // add octant as ancestor and go to children + h5_oct_idx_t children_oct_idx = get_children (octree, oct_idx); + if (children_oct_idx == -1) { + H5_PRIV_FUNC_LEAVE (H5_ERR_INTERNAL); + } + for (int i = 0; i < 8; i++) { + if ( (ifsibling && (i & direction) == (orient & direction)) || + (!ifsibling && (i & direction) != (orient & direction))) { + // check chlidrens children + TRY (get_kids_with_orient (octree, + children_oct_idx + i, + neighbors, + nbr_neigh, + ancestor_of_neigh, + nbr_anc_of_neigh, + userlevel, + orient, + direction, + ifsibling)); + } + + + } + } + + + H5_PRIV_FUNC_RETURN (H5_SUCCESS); +} + + +/* + * get nearest common ancestor + * returns -1 on geom boundary + */ +static h5_err_t +get_nca ( + h5t_octree_t* octree, + h5_oct_idx_t oct_idx, + h5_oct_dir_t direction, + h5_oct_orient_t* orient_child_nca, + h5_oct_idx_t* nca + ) { + H5_PRIV_FUNC_ENTER (h5_err_t, "octree=%p, oct_idx=%d, direction=%d, orient_child_nca=%p nca=%p", + octree, oct_idx, direction, orient_child_nca, nca); + // TODO maybe check that siblings don't fullfill requirement + h5_oct_idx_t parent_idx = get_parent (octree, oct_idx); + assert (parent_idx > -1); + h5_oct_orient_t orient = get_orient (octree, oct_idx); + h5_oct_orient_t parent_orient = get_orient (octree, parent_idx); + memcpy (&orient_child_nca[0],&orient, sizeof (orient)); + *nca = -1; + int counter = 1; + while (octree->octants[parent_idx].parent_idx != -1) { + parent_orient = get_orient (octree, parent_idx); + memcpy (&orient_child_nca[counter++],&parent_orient, sizeof (parent_orient)); + if ((orient & direction) != (parent_orient & direction)) { + // oct_idx is sibling of neighbors + *nca = get_parent (octree, parent_idx); + parent_orient = get_orient (octree, *nca); + memcpy (&orient_child_nca[counter++],&parent_orient, sizeof (parent_orient)); + break; + } + parent_idx = get_parent (octree, parent_idx); + } + + H5_PRIV_FUNC_RETURN (H5_SUCCESS); +} +/* + * get the child with given orientation, return -1 if no children + */ + +static h5_oct_idx_t +get_child_with_orient ( + h5t_octree_t* octree, + h5_oct_idx_t oct_idx, + h5_oct_orient_t orient + ) { + if (octree->octants[oct_idx].child_idx == -1) { + return -1; + } else { + return octree->octants[oct_idx].child_idx + orient; + } +} + + +/* + * get the smallest possible neighbor up to the same octree level & userlevel + */ +static h5_err_t +get_equal_sized_neigh ( + h5t_octree_t* octree, + h5_oct_idx_t oct_idx, + h5_oct_dir_t direction, + h5_oct_orient_t* sibling_orient, + h5_oct_idx_t nca, + h5_oct_idx_t* neigh, + h5_oct_level_t userlevel + ) { + H5_PRIV_FUNC_ENTER (h5_err_t, "octree=%p, oct_idx=%d, direction=%d, sibling_orient=%p" + ", nca=%d, neigh=%p, userlevel=%d", + octree, + oct_idx, + direction, + sibling_orient, + nca, + neigh, + userlevel); + int orient_idx = get_oct_level (octree, oct_idx) - get_oct_level (octree, nca) -1; + h5_oct_idx_t child = get_child_with_orient (octree, nca, sibling_orient[orient_idx--] ^ direction); + h5_oct_orient_t child_orient= 0; + + while ((get_oct_level (octree, oct_idx) > get_oct_level (octree, child)) // neighbor is still coarser + && (oct_has_level (octree, child, userlevel ) == 0) ) { // userlevel not reached + + child_orient = sibling_orient[orient_idx--] ^ direction; + if ( (child = get_child_with_orient (octree, child, child_orient)) == -1 ) { + H5_PRIV_FUNC_LEAVE (H5_ERR_INVAL); + } + } + *neigh = child; + + H5_PRIV_FUNC_RETURN (H5_SUCCESS); +} +static h5_err_t +check_neigh_cand ( + h5t_octree_t* octree, + h5_oct_idx_t oct_idx, + h5_oct_idx_t* neig, + h5_oct_idx_t* num_neigh + ) { + H5_PRIV_FUNC_ENTER (h5_err_t, "octree=%p, oct_idx=%d, neig=%p, num_neigh=%p, ", + octree, oct_idx, neig, num_neigh); + int if_check_fails_is_int_error = 0; + if (*num_neigh > 1) { + if_check_fails_is_int_error = 1; + } + h5_float64_t bb[6]; + get_bounding_box_of_octant(octree, oct_idx, bb); + + for (int i = 0; i < *num_neigh; i++) { + h5_float64_t n_bb[6]; + get_bounding_box_of_octant(octree, neig[i], n_bb); + if (bb[0] > n_bb[3] || bb[3] < n_bb[0] || + bb[1] > n_bb[4] || bb[4] < n_bb[1] || + bb[2] > n_bb[5] || bb[5] < n_bb[2] ) { + // should be deleted + if (if_check_fails_is_int_error) { + H5_PRIV_FUNC_LEAVE (H5_ERR_INTERNAL); + } else { + *num_neigh = 0; + } + } + + } + + + H5_PRIV_FUNC_RETURN (H5_SUCCESS); +} + + +static h5_err_t +add_common_neigh ( + h5t_octree_t* octree, + h5_oct_idx_t oct_idx, + h5_oct_idx_t* neigh, + h5_oct_idx_t* num_neigh, + h5_oct_idx_t* x_neigh, + h5_oct_idx_t num_x_neigh, + h5_oct_idx_t* y_neigh, + h5_oct_idx_t num_y_neigh + ) { + H5_PRIV_FUNC_ENTER (h5_err_t, "octree=%p, oct_idx=%d, neig=%p, num_neigh=%p, ", + octree, oct_idx, neigh, num_neigh); + h5_oct_idx_t num_cand = 0; + for (int i = 0; i < num_x_neigh; i++) { + h5_oct_idx_t neigh_idx = x_neigh[i]; + for (int j = 0; j < num_y_neigh; j++) { + if (neigh_idx == y_neigh[j] && neigh_idx != oct_idx) { + // edge neighbor candidate is found + num_cand = 1; + TRY (check_neigh_cand (octree, oct_idx, &neigh_idx, &num_cand)); + if (num_cand == 1) { + // add to neigh + TRY (add_neigh (octree,neigh_idx, neigh, num_neigh)); + break; + } + } + } + } + H5_PRIV_FUNC_RETURN (H5_SUCCESS); +} +// // TODO put in separate function +// h5_oct_idx_t num_cand = 0; + // find entries that are contained in x, y and z + + + + +h5_err_t +get_tmp_dir_neigh ( + h5t_octree_t* octree, + h5_oct_idx_t size, + h5_oct_idx_t* oct_idxs, + h5_oct_idx_t** neigh, + h5_oct_idx_t* num_neigh, + h5_oct_idx_t** anc, + h5_oct_idx_t* num_anc, + h5_oct_idx_t* num_alloc, + h5_oct_level_t userlevel + ); + +h5_err_t +get_edge_dir_neigh ( + h5t_octree_t* octree, + h5_oct_idx_t oct_idx, + h5_oct_idx_t tmp_oct_idx, + h5_oct_dir_t tmp_dir, + h5_oct_idx_t* neighbors, + h5_oct_idx_t* num_neigh, + h5_oct_idx_t* anc, + h5_oct_idx_t* num_anc, + h5_oct_level_t userlevel + ); + +/* + * get face neighbors of octant + */ +static h5_err_t +get_neighbors ( + h5t_octree_t* octree, + h5_oct_idx_t oct_idx, + h5_oct_idx_t** neighbors, + h5_oct_idx_t* nbr_neigh, + h5_oct_idx_t** ancestor_of_neigh, + h5_oct_idx_t* nbr_anc_of_neigh, + h5_oct_idx_t kind_of_neigh, // subdim of neighborhood 1 face neigh, 2 edge neigh, 3 vertex neigh WARNING 2 may also return some vertex edges + h5_oct_level_t userlevel + ) { + + H5_PRIV_FUNC_ENTER (h5_err_t, "octree=%p, oct_idx=%d, neighbors=%p, nbr_neigh=%d, " + "ancestor_of_neigh=%p, nbr_anc_of_neigh=%d, userlevel=%d", + octree, oct_idx, neighbors, *nbr_neigh, + ancestor_of_neigh, *nbr_anc_of_neigh, userlevel); + + assert (kind_of_neigh > 0); + assert (kind_of_neigh < 4); + // check if oct_idx has userlevel + if (oct_has_level (octree, oct_idx, userlevel) == 0 ) { + H5_PRIV_FUNC_LEAVE (H5_ERR_INVAL); + } + + h5_oct_orient_t orient = get_orient (octree, oct_idx); +// h5_oct_idx_t parent_oct_idx = octree->octants[oct_idx].parent_idx; + h5_oct_idx_t siblings; + + h5_oct_orient_t* orient_child_nca = NULL; + TRY (orient_child_nca = h5_calloc (get_oct_level(octree, oct_idx) + 1, sizeof (*orient_child_nca))); + + TRY (get_siblings (octree, oct_idx, &siblings)); + TRY (*neighbors = h5_alloc (*neighbors, OCT_MAX_NEIGHBORS * sizeof (**neighbors))); + memset (*neighbors, 0, OCT_MAX_NEIGHBORS * sizeof (**neighbors) ); + TRY (*ancestor_of_neigh = h5_alloc (*ancestor_of_neigh, OCT_MAX_NEIGHBORS * sizeof (**neighbors))); + memset (*ancestor_of_neigh, 0, OCT_MAX_NEIGHBORS * sizeof (**neighbors) ); + *nbr_neigh = 0; + *nbr_anc_of_neigh = 0; + h5_oct_idx_t tmp_oct_idx, nearest_common_anc; + h5_oct_dir_t tmp_dir; + h5_oct_idx_t old_num_neigh = 0; + h5_oct_idx_t num_neigh_per_dir[6]; + h5_int32_t ifsibling = -1; + // handle siblings + + //sibling in X + tmp_oct_idx = siblings + (orient ^ 1); + tmp_dir = 1; + ifsibling = 1; + TRY (get_kids_with_orient (octree, + tmp_oct_idx, + *neighbors, + nbr_neigh, + *ancestor_of_neigh, + nbr_anc_of_neigh, + userlevel, + orient, + tmp_dir, + ifsibling)); + +// //get other neighbors in X + TRY (get_nca (octree, oct_idx, tmp_dir, orient_child_nca, &nearest_common_anc)); + if (nearest_common_anc != -1) { + + TRY (get_equal_sized_neigh (octree, oct_idx, tmp_dir, orient_child_nca, nearest_common_anc, &tmp_oct_idx, userlevel)); + if (get_sibling (octree, tmp_oct_idx) == get_sibling (octree, oct_idx)) { + ifsibling = 1; + } else { + ifsibling = 0; + } + + TRY (get_kids_with_orient (octree, + tmp_oct_idx, + *neighbors, + nbr_neigh, + *ancestor_of_neigh, + nbr_anc_of_neigh, + userlevel, + orient, + tmp_dir, + ifsibling)); + } + num_neigh_per_dir[0] = *nbr_neigh; + memset (orient_child_nca, 0, (get_oct_level(octree, oct_idx) + 1) * sizeof (*orient_child_nca)); + + //sibling in Y + tmp_oct_idx = siblings + (orient ^ 2); + tmp_dir = 2; + ifsibling = 1; + old_num_neigh = *nbr_neigh; + TRY (get_kids_with_orient (octree, + tmp_oct_idx, + *neighbors, + nbr_neigh, + *ancestor_of_neigh, + nbr_anc_of_neigh, + userlevel, + orient, + tmp_dir, + ifsibling)); + +// //get other neighbors in Y + + TRY (get_nca (octree, oct_idx, tmp_dir, orient_child_nca, &nearest_common_anc)); + + if (nearest_common_anc != -1) { + TRY (get_equal_sized_neigh (octree, oct_idx, tmp_dir, orient_child_nca, nearest_common_anc, &tmp_oct_idx, userlevel)); + if (get_sibling (octree, tmp_oct_idx) == get_sibling (octree, oct_idx)) { + ifsibling = 1; + } else { + ifsibling = 0; + } + TRY (get_kids_with_orient (octree, + tmp_oct_idx, + *neighbors, + nbr_neigh, + *ancestor_of_neigh, + nbr_anc_of_neigh, + userlevel, + orient, + tmp_dir, + ifsibling)); + } + num_neigh_per_dir[1] = *nbr_neigh - old_num_neigh; + memset (orient_child_nca, 0, (get_oct_level(octree, oct_idx) + 1) * sizeof (*orient_child_nca)); + + //sibling in Z + tmp_oct_idx = siblings + (orient ^ 4); + tmp_dir = 4; + ifsibling = 1; + old_num_neigh = *nbr_neigh; + TRY (get_kids_with_orient (octree, + tmp_oct_idx, + *neighbors, + nbr_neigh, + *ancestor_of_neigh, + nbr_anc_of_neigh, + userlevel, + orient, + tmp_dir, + ifsibling)); + +// //get other neighbors in Z + TRY (get_nca (octree, oct_idx, tmp_dir, orient_child_nca, &nearest_common_anc)); + if (nearest_common_anc != -1) { + TRY (get_equal_sized_neigh (octree, oct_idx, tmp_dir, orient_child_nca, nearest_common_anc, &tmp_oct_idx, userlevel)); + if (get_sibling (octree, tmp_oct_idx) == get_sibling (octree, oct_idx)) { + ifsibling = 1; + } else { + ifsibling = 0; + } + TRY (get_kids_with_orient (octree, + tmp_oct_idx, + *neighbors, + nbr_neigh, + *ancestor_of_neigh, + nbr_anc_of_neigh, + userlevel, + orient, + tmp_dir, + ifsibling)); + } + num_neigh_per_dir[2] = *nbr_neigh - old_num_neigh; + TRY (h5_free (orient_child_nca)); + + // get ancestors of siblings + TRY (get_ancestors (octree, oct_idx, *ancestor_of_neigh, nbr_anc_of_neigh)); + + if (kind_of_neigh > 1) { + // edge neighbors + h5_oct_idx_t* x_neigh = NULL; + h5_oct_idx_t* y_neigh = NULL; + h5_oct_idx_t* z_neigh = NULL; + + h5_oct_idx_t* x_anc = NULL; + h5_oct_idx_t* y_anc = NULL; + h5_oct_idx_t* z_anc = NULL; + + h5_oct_idx_t num_x_neigh = 0; + h5_oct_idx_t num_y_neigh = 0; + h5_oct_idx_t num_z_neigh = 0; + + h5_oct_idx_t num_x_anc = 0; + h5_oct_idx_t num_y_anc = 0; + h5_oct_idx_t num_z_anc = 0; + + h5_oct_idx_t num_x_alloc = 0; + h5_oct_idx_t num_y_alloc = 0; + h5_oct_idx_t num_z_alloc = 0; + + TRY (get_tmp_dir_neigh (octree, + num_neigh_per_dir[0], + &(*neighbors)[0], + &x_neigh, &num_x_neigh, + &x_anc, &num_x_anc, + &num_x_alloc, + userlevel + )); + + + TRY (get_tmp_dir_neigh (octree, + num_neigh_per_dir[1], + &(*neighbors)[num_neigh_per_dir[0]], + &y_neigh, &num_y_neigh, + &y_anc, &num_y_anc, + &num_y_alloc, + userlevel + )); + + TRY (get_tmp_dir_neigh (octree, + num_neigh_per_dir[2], + &(*neighbors)[num_neigh_per_dir[0]+ num_neigh_per_dir[1]], + &z_neigh, &num_z_neigh, + &z_anc, &num_z_anc, + &num_z_alloc, + userlevel + )); + + old_num_neigh = *nbr_neigh; + TRY (add_common_neigh (octree,oct_idx, *neighbors, nbr_neigh, x_neigh, num_x_neigh, y_neigh, num_y_neigh)); + num_neigh_per_dir[3] = *nbr_neigh - old_num_neigh; + old_num_neigh = *nbr_neigh; + TRY (add_common_neigh (octree,oct_idx, *neighbors, nbr_neigh, x_neigh, num_x_neigh, z_neigh, num_z_neigh)); + num_neigh_per_dir[4] = *nbr_neigh - old_num_neigh; + old_num_neigh = *nbr_neigh; + TRY (add_common_neigh (octree,oct_idx, *neighbors, nbr_neigh, z_neigh, num_z_neigh, y_neigh, num_y_neigh)); + num_neigh_per_dir[5] = *nbr_neigh - old_num_neigh; + // check that all anc have been added + for (int i = 0; i < *nbr_neigh; i++) { + TRY (get_ancestors (octree, (*neighbors)[i], *ancestor_of_neigh, nbr_anc_of_neigh)); + } + TRY (h5_free (x_neigh)); + TRY (h5_free (y_neigh)); + TRY (h5_free (z_neigh)); + + TRY (h5_free (x_anc)); + TRY (h5_free (y_anc)); + TRY (h5_free (z_anc)); + } + + if (kind_of_neigh > 2) { + // idea + // get all neig of edge neigh, if one is neigh of every edge direction it should be a point neighbor + + + h5_oct_idx_t* x_neigh = NULL; + h5_oct_idx_t* y_neigh = NULL; + h5_oct_idx_t* z_neigh = NULL; + + h5_oct_idx_t* x_anc = NULL; + h5_oct_idx_t* y_anc = NULL; + h5_oct_idx_t* z_anc = NULL; + + h5_oct_idx_t num_x_neigh = 0; + h5_oct_idx_t num_y_neigh = 0; + h5_oct_idx_t num_z_neigh = 0; + + h5_oct_idx_t num_x_anc = 0; + h5_oct_idx_t num_y_anc = 0; + h5_oct_idx_t num_z_anc = 0; + + h5_oct_idx_t num_x_alloc = 0; + h5_oct_idx_t num_y_alloc = 0; + h5_oct_idx_t num_z_alloc = 0; + + h5_oct_idx_t num_face_neigh = num_neigh_per_dir[0] + num_neigh_per_dir[1] + num_neigh_per_dir[2]; + + TRY (get_tmp_dir_neigh (octree, + num_neigh_per_dir[3], + &(*neighbors)[num_face_neigh], + &x_neigh, &num_x_neigh, + &x_anc, &num_x_anc, + &num_x_alloc, + userlevel + )); + + TRY (get_tmp_dir_neigh (octree, + num_neigh_per_dir[4], + &(*neighbors)[num_face_neigh + num_neigh_per_dir[3]], + &y_neigh, &num_y_neigh, + &y_anc, &num_y_anc, + &num_y_alloc, + userlevel + )); + + TRY (get_tmp_dir_neigh (octree, + num_neigh_per_dir[5], + &(*neighbors)[num_face_neigh + num_neigh_per_dir[3]+ num_neigh_per_dir[4]], + &z_neigh, &num_z_neigh, + &z_anc, &num_z_anc, + &num_z_alloc, + userlevel + )); + + + // TODO put in separate function + h5_oct_idx_t num_cand = 0; + // find entries that are contained in x, y and z + for (int i = 0; i < num_x_neigh; i++) { + h5_oct_idx_t neigh_idx = x_neigh[i]; + for (int j = 0; j < num_y_neigh; j++) { + if (neigh_idx == y_neigh[j]) { + for (int k = 0; k < num_z_neigh; k++) { + if (neigh_idx == z_neigh[k] && neigh_idx != oct_idx) { + // edge neighbor candidate is found + num_cand = 1; + TRY (check_neigh_cand (octree, oct_idx, &neigh_idx, &num_cand)); + if (num_cand == 1) { + // add to neigh + TRY (add_neigh (octree,neigh_idx, *neighbors, nbr_neigh)); + TRY (get_ancestors(octree, neigh_idx, *ancestor_of_neigh, nbr_anc_of_neigh)); + } + } + } + } + } + } + // There is a very strange case, where it is possible to miss vertex neighbor + // namely if on one edge there is no edge neighbor but there still exists a vertex only neighbor + // therefore a dirty hack: + for (int i = 0; i < num_x_neigh; i++) { + num_cand = 1; + h5_oct_idx_t neigh_idx = x_neigh[i]; + TRY (check_neigh_cand (octree, oct_idx, &neigh_idx, &num_cand)); + if (num_cand == 1 && neigh_idx != oct_idx) { + // add to neigh + TRY (add_neigh (octree,neigh_idx, *neighbors, nbr_neigh)); + TRY (get_ancestors(octree, neigh_idx, *ancestor_of_neigh, nbr_anc_of_neigh)); + } + } + for (int i = 0; i < num_y_neigh; i++) { + num_cand = 1; + h5_oct_idx_t neigh_idx = y_neigh[i]; + TRY (check_neigh_cand (octree, oct_idx, &neigh_idx, &num_cand)); + if (num_cand == 1 && neigh_idx != oct_idx) { + // add to neigh + TRY (add_neigh (octree,neigh_idx, *neighbors, nbr_neigh)); + TRY (get_ancestors(octree, neigh_idx, *ancestor_of_neigh, nbr_anc_of_neigh)); + } + } + for (int i = 0; i < num_z_neigh; i++) { + num_cand = 1; + h5_oct_idx_t neigh_idx = z_neigh[i]; + TRY (check_neigh_cand (octree, oct_idx, &neigh_idx, &num_cand)); + if (num_cand == 1 && neigh_idx != oct_idx) { + // add to neigh + TRY (add_neigh (octree,neigh_idx, *neighbors, nbr_neigh)); + TRY (get_ancestors(octree, neigh_idx, *ancestor_of_neigh, nbr_anc_of_neigh)); + } + } + + // check that all anc have been added + for (int i = 0; i < *nbr_neigh; i++) { + TRY (get_ancestors (octree, (*neighbors)[i], *ancestor_of_neigh, nbr_anc_of_neigh)); + } + TRY (h5_free (x_neigh)); + TRY (h5_free (y_neigh)); + TRY (h5_free (z_neigh)); + + TRY (h5_free (x_anc)); + TRY (h5_free (y_anc)); + TRY (h5_free (z_anc)); + } + + + + H5_PRIV_FUNC_RETURN (H5_SUCCESS); +} +h5_err_t H5t_get_neighbors ( h5t_octree_t* octree, h5_oct_idx_t oct_idx, h5_oct_idx_t** neighbors, h5_oct_idx_t* nbr_neigh, h5_oct_idx_t** ancestor_of_neigh, h5_oct_idx_t* nbr_anc_of_neigh, h5_oct_idx_t kind_of_neigh, h5_oct_level_t userlevel) { + return get_neighbors (octree, oct_idx, neighbors, nbr_neigh, ancestor_of_neigh, nbr_anc_of_neigh, kind_of_neigh, userlevel); +} + +/* + * function used to get edge neighbors + */ + +h5_err_t +get_edge_dir_neigh ( + h5t_octree_t* octree, + h5_oct_idx_t oct_idx, + h5_oct_idx_t tmp_oct_idx, + h5_oct_dir_t tmp_dir, + h5_oct_idx_t* neighbors, + h5_oct_idx_t* num_neigh, + h5_oct_idx_t* anc, + h5_oct_idx_t* num_anc, + h5_oct_level_t userlevel + ) { + H5_PRIV_FUNC_ENTER (h5_err_t, "octree=%p", octree); + + h5_oct_idx_t* neig_candidates = NULL; + TRY (neig_candidates = h5_calloc (OCT_MAX_NEIGHBORS , sizeof (*neig_candidates))); + memset (neig_candidates, 0, OCT_MAX_NEIGHBORS * sizeof (*neig_candidates) ); + h5_oct_idx_t* anc_neig_cand = NULL; + TRY (anc_neig_cand = h5_calloc (OCT_MAX_NEIGHBORS , sizeof (*anc_neig_cand))); + memset (anc_neig_cand, 0, OCT_MAX_NEIGHBORS * sizeof (*anc_neig_cand) ); + h5_oct_idx_t num_cand = 0; + h5_oct_idx_t num_anc_cand = 0; + h5_oct_orient_t orient = get_orient(octree, oct_idx); + h5_int32_t ifsibling =0; // WARNING is not set properly below + h5_oct_orient_t* orient_child_nca = NULL; + TRY (orient_child_nca = h5_calloc (get_oct_level(octree, oct_idx) + 1, sizeof (*orient_child_nca))); + + + h5_oct_idx_t nearest_common_anc = -1; + + TRY (get_kids_with_orient (octree, + tmp_oct_idx, + neighbors, + num_neigh, + anc, + num_anc, + userlevel, + orient, + tmp_dir, + ifsibling)); + + //get other neighbors in edge direction + TRY (get_nca (octree, oct_idx, tmp_dir, orient_child_nca, &nearest_common_anc)); + if (nearest_common_anc != -1) { + + TRY (get_equal_sized_neigh (octree, oct_idx, tmp_dir, orient_child_nca, nearest_common_anc, &tmp_oct_idx, userlevel)); + + TRY (get_kids_with_orient (octree, + tmp_oct_idx, + neig_candidates, + &num_cand, + anc_neig_cand, + &num_anc_cand, + userlevel, + orient, + tmp_dir, + ifsibling)); + + check_neigh_cand (octree, oct_idx, neig_candidates, &num_cand); + if (num_cand == 0) { + num_anc_cand = 0; + } + for (int i = 0; i < num_cand; i++) { + neighbors[(*num_neigh)++] = neig_candidates[i]; + TRY (get_ancestors(octree, neig_candidates[i], anc, num_anc)); + } + num_cand = 0; + num_anc_cand = 0; + } + TRY (h5_free (orient_child_nca)); + TRY (h5_free (neig_candidates)); + TRY (h5_free (anc_neig_cand)); + H5_PRIV_FUNC_RETURN (H5_SUCCESS); +} + + +h5_err_t +get_tmp_dir_neigh ( + h5t_octree_t* octree, + h5_oct_idx_t size, + h5_oct_idx_t* oct_idxs, + h5_oct_idx_t** neigh, + h5_oct_idx_t* num_neigh, + h5_oct_idx_t** anc, + h5_oct_idx_t* num_anc, + h5_oct_idx_t* num_alloc, + h5_oct_level_t userlevel + ) { + H5_PRIV_FUNC_ENTER (h5_err_t, "octree=%p", octree); + h5_oct_idx_t* tmp_neigh = NULL; + h5_oct_idx_t num_tmp_neigh = 0; + h5_oct_idx_t* tmp_anc = NULL; + h5_oct_idx_t num_tmp_anc = 0; + // get neigh of x-y edge neigh + for (int i = 0; i < size; i++) { + h5_oct_idx_t curr_idx = oct_idxs[i]; + get_neighbors (octree, curr_idx, &tmp_neigh, &num_tmp_neigh, &tmp_anc, &num_tmp_anc, 1, userlevel); + + // alloc enough mem in glb array + if (num_tmp_neigh + *num_neigh > *num_alloc || + num_tmp_anc + *num_anc > *num_alloc) { // alloc enough mem in x_neigh or x_neigh_anc + TRY (*neigh = h5_alloc (*neigh, (((int)*num_alloc) + OCT_MAX_NEIGHBORS) * sizeof (**neigh))); + TRY (*anc = h5_alloc (*anc, ((int)(*num_alloc) + OCT_MAX_NEIGHBORS) * sizeof (**anc))); + *num_alloc += OCT_MAX_NEIGHBORS; + } + // copy values to global array + for (int j = 0; j < num_tmp_neigh; j++) { + add_neigh (octree, tmp_neigh[j], *neigh, num_neigh); + } + // copy values to global array + for (int j = 0; j < num_tmp_anc; j++) { + add_ancestor (octree, tmp_anc[j], *anc, num_anc); + } + num_tmp_anc = 0; + num_tmp_neigh = 0; + } + TRY (h5_free (tmp_neigh)); + TRY (h5_free (tmp_anc)); + H5_PRIV_FUNC_RETURN (H5_SUCCESS); +} + + +/* + * iterates octree iterators + * return oct_idx of next octant or -1 if traverse is finished + */ +static h5_oct_idx_t +iterate_oct ( + h5t_oct_iterator_t* iter + ) { + H5_PRIV_FUNC_ENTER (h5_err_t, "iter=%p", iter); + h5_oct_userlev_t userlevels = 0; + h5_int32_t found = 0; + h5t_oct_iter_t* it = (h5t_oct_iter_t*) iter; + if (it->current_octant != -1) { + if (it->current_octant == -2) { + it->current_octant = -1; + } + it->current_octant++; + while (it->current_octant <= it->octree->current_oct_idx && !found) { + + userlevels = it->octree->octants[it->current_octant].userlevels; + if ((userlevels & (1 << it->level) )== 1 << it->level) { + // current oct idx points to a leaf octant + found = 1; + it->current_octant--; + } + it->current_octant++; + } + if ( it->current_octant > it->octree->current_oct_idx) { + it->current_octant = -1; + } + } + H5_PRIV_FUNC_RETURN (it->current_octant); +} +h5_oct_idx_t H5t_iterate_oct (h5t_oct_iterator_t* iter) { + return iterate_oct (iter); +} + +static h5_err_t +init_oct_iterator ( + h5t_octree_t* octree, + h5t_oct_iterator_t** iter, + h5_oct_level_t level + ) { + H5_PRIV_FUNC_ENTER (h5_err_t, "octree=%p, iter=%p, level=%d", octree, iter, level); + if (*iter != NULL) { + TRY (h5_free (*iter)); + } + TRY (*iter = h5_calloc (1, sizeof (h5t_oct_iter_t))); + h5t_oct_iter_t* it = (h5t_oct_iter_t*) (*iter); + it->iter = iterate_oct; + it->current_octant = -2; + it->octree = octree; + it->level = level; + H5_PRIV_FUNC_RETURN (H5_SUCCESS); +} +h5_err_t H5t_init_oct_iterator (h5t_octree_t* octree, h5t_oct_iterator_t** iter, h5_oct_level_t level) { + return init_oct_iterator (octree, iter, level); +} + +static h5_err_t +init_leafoct_iterator ( + h5t_octree_t* octree, + h5t_oct_iterator_t** iter + ) { + H5_PRIV_FUNC_ENTER (h5_err_t, "octree=%p, iter=%p", octree, iter); + init_oct_iterator (octree, iter, OCT_USERLEV_LENGTH - 1); + H5_PRIV_FUNC_RETURN (H5_SUCCESS); +} +h5_err_t H5t_init_leafoct_iterator (h5t_octree_t* octree, h5t_oct_iterator_t** iter) { + return init_leafoct_iterator (octree, iter); +} + +static h5_err_t +end_iterate_oct ( + h5t_oct_iterator_t* iter + ) { + H5_PRIV_FUNC_ENTER (h5_err_t, "iter=%p", iter); + TRY (h5_free (iter)); + H5_PRIV_FUNC_RETURN (H5_SUCCESS); +} +h5_err_t H5t_end_iterate_oct (h5t_oct_iterator_t* iter) { + return end_iterate_oct (iter); +} + +static h5_oct_idx_t +get_num_oct_leaflevel ( + h5t_octree_t* octree + ) { + H5_PRIV_FUNC_ENTER (h5_err_t, "octree=%p", octree); + h5t_oct_iterator_t* iter = NULL; + TRY (init_leafoct_iterator (octree, &iter)); + h5_oct_idx_t counter = 0; + while (iterate_oct (iter) != -1) { + counter++; + } + end_iterate_oct (iter); + H5_PRIV_FUNC_RETURN (counter); +} +h5_oct_idx_t H5t_get_num_oct_leaflevel (h5t_octree_t* octree) { + return get_num_oct_leaflevel (octree); +} + +h5_oct_idx_t H5t_get_num_octants (h5t_octree_t* octree) { + return octree->current_oct_idx +1; +} +/* + * complete level + */ +static h5_err_t +complete_level( + h5t_octree_t* octree, + h5_oct_level_t level + ) { + H5_PRIV_FUNC_ENTER (h5_err_t, "octree=%p, level=%d", octree, level); + // IDEA go through level, and make all siblings & parents +siblings as on level + // then then just keep finest level + // check should be successful after complete_level + update_internal (octree); + + h5t_oct_iterator_t* iterator = NULL; + init_oct_iterator (octree, &iterator, level); + h5_oct_idx_t octant = -1; + h5_oct_idx_t parent = -1; + h5_oct_idx_t siblings = -1; + h5_int32_t done; + set_userlevel_int (octree, 0, level); + while ((octant = iterate_oct (iterator)) != -1) { + + if (oct_has_level (octree, octant, level) && octant > 0) { + // set siblings and parent to level + get_siblings (octree,octant, &siblings); + if (siblings != -1 && !(siblings < octant && oct_has_level (octree, siblings, level))) { + set_userlevel_int (octree, siblings++, level); + set_userlevel_int (octree, siblings++, level); + set_userlevel_int (octree, siblings++, level); + set_userlevel_int (octree, siblings++, level); + set_userlevel_int (octree, siblings++, level); + set_userlevel_int (octree, siblings++, level); + set_userlevel_int (octree, siblings++, level); + set_userlevel_int (octree, siblings++, level); + } else { + // octant and it's parents have already been set to level, therefore avoid setting again + } + done = 0; + parent = octant; + while ((parent=get_parent(octree, parent)) != -1 && done == 0){ + if (oct_has_level (octree, parent, level)){ + done = 1; + } else { + get_siblings (octree, parent, &siblings); + if(siblings != -1){ + set_userlevel_int (octree, siblings++, level); + set_userlevel_int (octree, siblings++, level); + set_userlevel_int (octree, siblings++, level); + set_userlevel_int (octree, siblings++, level); + set_userlevel_int (octree, siblings++, level); + set_userlevel_int (octree, siblings++, level); + set_userlevel_int (octree, siblings++, level); + set_userlevel_int (octree, siblings++, level); + } + } + } + } + + } + end_iterate_oct (iterator); + // remove multiple levels on parents + iterator = NULL; + init_leafoct_iterator (octree, &iterator); + done = 0; + while ((octant = iterate_oct(iterator)) != -1) { + parent = octant; + while (oct_has_level (octree, parent, level) == 0 && parent != -1) { + parent = get_parent(octree, parent); + } + if (parent == -1){ + H5_PRIV_FUNC_LEAVE (H5_ERR_INTERNAL ); + } + done = 0; + // mark all parents of parent as not on level + while ((parent = get_parent (octree, parent)) != -1 && done == 0) { + if (oct_has_level (octree, parent, level) == 0) { + done = 1; + } + remove_userlevel_int (octree, parent, level); + } + } + end_iterate_oct (iterator); + + clear_level_internal (octree); + H5_PRIV_FUNC_RETURN (H5_SUCCESS); +} + +h5_err_t +H5t_complete_userlevel(h5t_octree_t* octree, h5_oct_level_t level) { + return complete_level(octree,level); +} + +#if 0 +/* + * check level + */ +// BUG does not work properly yet +static h5_err_t +check_level ( + h5t_octree_t* octree, + h5_oct_level_t level + ) { + H5_PRIV_FUNC_ENTER (h5_err_t, "octree=%p, level=%d", octree, level); + // idea go from leaf level octants up to root. exactly one time they should hit the level! + h5t_oct_iterator_t* iterator = NULL; + init_leafoct_iterator (octree, &iterator); + h5_oct_idx_t octant = -1; + h5_oct_idx_t parent = -1; + h5_int32_t counter = 0; + while ((octant = iterate_oct (iterator)) != -1){ + counter = 0; + if (oct_has_level (octree, octant, level)) { + counter++; + } + while ((parent=get_parent (octree, octant)) != -1){ + if (oct_has_level (octree, parent, level)) { + counter++; + } + } + if (counter != 1){ + H5_PRIV_FUNC_LEAVE (H5_ERR_INVAL); + } + } + end_iterate_oct (iterator); + H5_PRIV_FUNC_RETURN (H5_SUCCESS); +} +#endif + +/* + * set bounding box for root octant + */ +static h5_err_t +set_bounding_box ( + h5t_octree_t* octree, + h5_float64_t* bounding_box + ) { + H5_PRIV_FUNC_ENTER (h5_err_t, "octree=%p, bounding_box=%p", octree, bounding_box); + if ((bounding_box[0] >= bounding_box[3]) || + (bounding_box[1] >= bounding_box[4]) || + (bounding_box[2] >= bounding_box[5]) + ) { + H5_PRIV_FUNC_LEAVE (H5_ERR_INVAL); + } + + memcpy(octree->bounding_box, bounding_box, 6 * sizeof (*bounding_box)); + + H5_PRIV_FUNC_RETURN (H5_SUCCESS); +} +h5_err_t H5t_set_bounding_box ( h5t_octree_t* octree, h5_float64_t* bounding_box) { + return set_bounding_box (octree, bounding_box); +} + +static h5_float64_t* +get_bounding_box ( + h5t_octree_t* const octree + ) { + return octree->bounding_box; +} +h5_float64_t* H5t_get_bounding_box (h5t_octree_t* const octree) { + return get_bounding_box (octree); +} +/* + * func sceleton + */ +static h5_err_t +func_name ( + h5t_octree_t* octree, + h5_oct_idx_t oct_idx + ) { + H5_PRIV_FUNC_ENTER (h5_err_t, "octree=%p, oct_idx=%d", octree, oct_idx); + + H5_PRIV_FUNC_RETURN (H5_SUCCESS); +} +h5_err_t H5t_func_name (h5t_octree_t* octree, h5_oct_idx_t oct_idx) { + return func_name (octree, oct_idx); +} + +#endif diff --git a/src/h5core/h5t_octree_private.h b/src/h5core/h5t_octree_private.h new file mode 100644 index 0000000..2a6cd9e --- /dev/null +++ b/src/h5core/h5t_octree_private.h @@ -0,0 +1,180 @@ +/* + Copyright (c) 2006-2013, The Regents of the University of California, + through Lawrence Berkeley National Laboratory (subject to receipt of any + required approvals from the U.S. Dept. of Energy) and the Paul Scherrer + Institut (Switzerland). All rights reserved. + + License: see file COPYING in top level of source distribution. +*/ + +#ifndef __H5T_OCTREE_PRIVATE_H +#define __H5T_OCTREE_PRIVATE_H + +#include "h5core/h5_types.h" +#include "h5core/h5t_octree.h" + +// iterators +#if defined(PARALLEL_IO) +#include +#endif + +#define OCT_MAX_NEIGHBORS 1000 + +struct h5_oct_point { + h5_float64_t x; + h5_float64_t y; + h5_float64_t z; + h5_oct_idx_t oct; + h5_glb_idx_t elem; +}; + +// Iterators +struct h5t_oct_iterator { + h5t_octree_t* octree; + h5_oct_idx_t (*iter)(struct h5t_oct_iterator* iter); +}; + +/* + * Inititialization methods for octree + */ +struct h5t_getter_oct_methods; +struct h5t_init_oct_methods; + +/* + * All methods provided by the octree + */ + +typedef struct h5t_oct_methods { + struct h5t_getter_oct_methods* get; +// struct h5t_set_oct_methods* set; +// struct h5t_iter_oct_methods* iter; + struct h5t_init_oct_methods* init; +} h5t_oct_methods_t; + +/* + * Define Octant data type + */ +struct h5_octant { + h5_oct_idx_t idx; + h5_oct_idx_t parent_idx; + h5_oct_idx_t child_idx; + h5_lvl_idx_t level_idx; // first 3 bits for type x,y,z forth bit for user data changed +// h5_float64_t bounding_box[6]; + h5_int32_t processor; + h5_oct_userlev_t userlevels; + +}; + +/* + * Define octree data type + */ +struct h5_octree { + /*** variables ***/ + h5_int32_t size_userdata; + MPI_Comm comm; + + /*** octants ***/ + h5t_octant_t* octants; + void* userdata; + h5_oct_idx_t current_oct_idx; + h5_oct_idx_t nbr_alloc_oct; + h5_oct_idx_t ref_oct_idx; + // during refinement: ref_oct_idx == current_oct_idx before refinement, otherwise -1 + h5_float64_t bounding_box[6]; + /* */ + h5_int32_t maxpoints; + +}; + +typedef struct { + h5t_octree_t* octree; + h5_oct_idx_t (*iter)(struct h5t_oct_iterator* iter); + h5_oct_idx_t current_octant; + h5_oct_level_t level; +} h5t_oct_iter_t; + +///* +// * Getter methods working on a octree +// */ +//typedef struct h5t_getter_oct_methods { +// h5_oct_idx_t (*get_parent)(h5t_octree_t* const, +// const h5_oct_idx_t); +// h5_oct_idx_t (*get_children)(h5t_octree_t* const, +// const h5_oct_idx_t); +// +//}; +// +//typedef struct h5t_init_oct_methods { +// h5_err_t (*init_octree)(h5t_octree_t*, h5_int32_t, h5_float64_t*); +//}; + +/*** type ids' for compound types ***/ +typedef struct h5_oct_dtypes { + MPI_Datatype mpi_octant; +} h5_oct_dta_types_t; + +h5_oct_dta_types_t h5_oct_dta_types; + +h5_err_t H5t_create_mpi_type_octant ( void ); + +// Setter functions +h5_err_t H5t_set_userlevel (h5t_octree_t* octree, h5_oct_idx_t oct_idx, h5_oct_level_t level); +h5_err_t H5t_set_bounding_box(h5t_octree_t* octree, h5_float64_t* bounding_box); +h5_err_t H5t_set_proc (h5t_octree_t* octree, h5_oct_idx_t oct_idx, h5_int32_t proc); +h5_err_t H5t_set_proc_int (h5t_octree_t* octree, h5_oct_idx_t oct_idx, h5_int32_t proc); + +h5_err_t H5t_init_octree (h5t_octree_t** octree, h5_int32_t size_userdata, h5_float64_t* const bounding_box, h5_int32_t maxpoints, const MPI_Comm comm); +h5_err_t H5t_refine_w_points (h5t_octree_t* octree, h5_oct_point_t* points, h5_int32_t nbr_points, h5_int32_t max_points); +h5_err_t H5t_add_points_to_leaf (h5t_octree_t* octree, h5_oct_point_t* points, h5_int32_t nbr_points); + +h5_err_t H5t_read_octree (h5t_octree_t** octree, h5_oct_idx_t current_oct_idx, h5_int32_t size_userdata, h5_int32_t maxpoints, h5t_octant_t** octants, void** userdata, const MPI_Comm comm); + +// Getter functions +h5_oct_level_t H5t_get_userlevel (h5t_octree_t* octree, h5_oct_idx_t oct_idx); +h5_oct_idx_t H5t_get_sibling(h5t_octree_t* octree, h5_oct_idx_t oct_idx); +h5_oct_idx_t H5t_get_children (h5t_octree_t* const octree, const h5_oct_idx_t oct_idx); +h5_oct_idx_t H5t_get_parent (h5t_octree_t* const octree, const h5_oct_idx_t oct_idx); +h5_err_t H5t_get_userdata_r (h5t_octree_t* octree, h5_oct_idx_t oct_idx, void** userdata); +h5_err_t H5t_get_userdata_rw (h5t_octree_t* octree, h5_oct_idx_t oct_idx, void** userdata); +h5_err_t H5t_get_neighbors ( h5t_octree_t* octree, h5_oct_idx_t oct_idx, h5_oct_idx_t** neighbors, h5_oct_idx_t* nbr_neigh, h5_oct_idx_t** ancestor_of_neigh, h5_oct_idx_t* nbr_anc_of_neigh, h5_oct_idx_t kind_of_neigh, h5_oct_level_t userlevel); +h5_err_t H5t_get_point_neighbors ( h5t_octree_t* octree, h5_oct_idx_t oct_idx, h5_oct_idx_t** neighbors, h5_oct_idx_t* nbr_neigh, h5_oct_idx_t** ancestor_of_neigh, h5_oct_idx_t* nbr_anc_of_neigh, h5_oct_level_t userlevel); +h5_oct_idx_t H5t_get_num_oct_leaflevel (h5t_octree_t* octree); +h5_oct_idx_t H5t_get_num_octants (h5t_octree_t* octree); + + +h5_int32_t H5t_get_proc (h5t_octree_t* octree, h5_oct_idx_t oct_idx); +int H5t_get_maxpoints (h5t_octree_t* const octree); +h5_float64_t* H5t_get_bounding_box (h5t_octree_t* const octree); +h5_err_t H5t_get_bounding_box_of_octant (h5t_octree_t* const octree, h5_oct_idx_t oct_idx, h5_float64_t* bounding_box); + +h5_err_t H5t_complete_userlevel(h5t_octree_t* octree, h5_oct_level_t level); + +h5_err_t H5t_set_maxpoints (h5t_octree_t* const octree, int maxpoints); + +h5_err_t H5t_update_userdata (h5t_octree_t* const octree); +h5_err_t H5t_update_internal (h5t_octree_t* const octree); + +h5_oct_idx_t H5t_iterate_oct (h5t_oct_iterator_t* iter); +h5_err_t H5t_init_oct_iterator (h5t_octree_t* octree, h5t_oct_iterator_t** iter, h5_oct_level_t level); +h5_err_t H5t_init_leafoct_iterator (h5t_octree_t* octree, h5t_oct_iterator_t** iter); +h5_err_t H5t_end_iterate_oct (h5t_oct_iterator_t* iter); + +h5_err_t H5t_free_octree (h5t_octree_t* octree); +h5_err_t H5t_write_octree ( h5t_mesh_t* const m); + + + +h5_oct_idx_t H5t_find_leafoctant_of_point (h5t_octree_t* octree, h5_oct_idx_t oct_idx, h5_float64_t* bounding_box, h5_oct_point_t* point); + +h5_oct_level_t H5t_oct_has_level (h5t_octree_t* octree, h5_oct_idx_t oct_idx, h5_oct_level_t level); + +// for debug purposes only +h5_err_t plot_octants (h5t_octree_t* octree); +h5_err_t plot_octant_anc (h5t_octree_t* octree, h5_oct_idx_t oct_idx); + +h5_err_t plot_leaf_octants (h5t_octree_t* octree); +void print_array (h5_int32_t* neigh, h5_oct_idx_t nbr_neigh, int rank); +#endif + + + diff --git a/src/h5core/h5t_readwrite.c b/src/h5core/h5t_readwrite.c new file mode 100644 index 0000000..16095a3 --- /dev/null +++ b/src/h5core/h5t_readwrite.c @@ -0,0 +1,3005 @@ +/* + Copyright (c) 2006-2012, The Regents of the University of California, + through Lawrence Berkeley National Laboratory (subject to receipt of any + required approvals from the U.S. Dept. of Energy) and the Paul Scherrer + Institut (Switzerland). All rights reserved. + + License: see file COPYING in top level of source distribution. +*/ + +#include // for the use of sleep +#if defined (PARALLEL_IO) +//#define WITH_PARALLEL_H5FED +#endif + +//#if defined (WITH_PARALLEL_H5FED) // WARNING just used for eclipse to index all code... +#ifdef PARALLEL_IO +#include +#endif +#include +//#endif + +#include "h5_attribs_private.h" +#include "h5_hdf5_private.h" + +#include "h5_model_private.h" +#include "h5t_types_private.h" +#include "h5t_access_private.h" +#include "h5t_core_private.h" +#include "h5core/h5t_map.h" + +int preferred_direction = 0; +// 0 x direction +// 1 y direction +// 2 z direction + +int dont_use_parmetis = 0; +// 0 use parmetis +// 1 distribute with morton ordering +// 2 distribute geometrically with preferred direction + + +#include "h5core/h5.h" +#include "h5t_types_private.h" +#include "h5t_model_private.h" +#include "h5t_map_private.h" +#include "h5t_adjacencies_private.h" +#include "h5t_readwrite_private.h" +#include "h5t_store_private.h" +#include "h5t_core_private.h" +#include "h5_mpi_private.h" + +#include + +//TODO this is a bugfix remove after xfer_prop fix has been done! +void +set_xfer_prop_to (const h5_file_p file, hid_t prop) { + file->props->xfer_prop = prop; +} + +void +set_xfer_prop_to2 (h5t_mesh_t* const m, hid_t prop) { + m->f->props->xfer_prop = prop; +} + +static hid_t +open_space_all ( + h5t_mesh_t* const m, + const hid_t dataset_id + ) { + UNUSED_ARGUMENT (m); + UNUSED_ARGUMENT (dataset_id); + return H5S_ALL; +} + +int +hidxmap_cmp ( + const void* __a, + const void* __b + ) { + h5_idxmap_el_t* a = (h5_idxmap_el_t*)__a; + h5_idxmap_el_t* b = (h5_idxmap_el_t*)__b; + return b->glb_idx - a->glb_idx; +} + +unsigned int +hidxmap_compute_hval ( + const void* __item + ) { + h5_idxmap_el_t* item = (h5_idxmap_el_t*)__item; + uint16_t* key = (uint16_t*)&item->glb_idx; + unsigned int count = sizeof (item->glb_idx) / sizeof (uint16_t); + unsigned int hval = count; + while (count--) { + if (*key) { + hval <<= 6; + hval += *key; + } + key++; + } + return hval; +} + +/* + Write vertices: + * either we write a new dataset + * or we append data to this dataset + * appending means, a new level has been added + * existing vertices will never be changed! + + */ +static h5_err_t +write_vertices ( + h5t_mesh_t* const m + ) { + H5_PRIV_FUNC_ENTER (h5_err_t, "m=%p", m); + assert (m->num_leaf_levels > 0); + + // quick hack for serial case (for the time being writes are serial anyway) + for (size_t i = 0; i < m->num_leaf_levels; i++) { + m->num_glb_vertices[i] = m->num_loc_vertices[i]; + } + + m->dsinfo_vertices.dims[0] = m->num_loc_vertices[m->num_leaf_levels-1]; + TRY( h5priv_write_dataset_by_name ( + m, + m->f, + m->mesh_gid, + &m->dsinfo_vertices, + open_space_all, + open_space_all, + m->vertices) ); + + TRY (h5priv_write_attrib ( + m->mesh_gid, + "__num_vertices__", + H5T_NATIVE_INT64, + m->num_glb_vertices, + m->num_leaf_levels, + 1)); + TRY (h5priv_write_attrib ( + m->mesh_gid, + "__num_b_vertices__", + H5T_NATIVE_INT64, + m->num_b_vtx, + m->num_leaf_levels, + 1)); + TRY (h5priv_write_attrib ( + m->mesh_gid, + "__first_b_vertices__", + H5T_NATIVE_INT64, + m->first_b_vtx, + m->num_leaf_levels, + 1)); + H5_PRIV_FUNC_RETURN (H5_SUCCESS); +} +#ifdef PARALLEL_IO + +h5_err_t +add_chunk_to_list ( + h5t_mesh_t* const m, + h5_loc_idxlist_t** list, + h5_oct_idx_t oct_idx + ) { + H5_PRIV_FUNC_ENTER (h5_err_t, "m=%p, list=%p, oct_idx=%d", m, list, oct_idx); + h5t_oct_userdata_t* userdata; + TRY (H5t_get_userdata_r (m->octree, oct_idx,(void **) &userdata)); + for (int i = 0; i < OCT_USERDATA_SIZE; i++) { + if (userdata->idx[i] > -1) { + h5priv_search_in_loc_idxlist(list, (h5_loc_idx_t)userdata->idx[i]); + } + } + H5_PRIV_FUNC_RETURN (H5_SUCCESS); +} +int compare_chk_idx(const void *p_a, const void *p_b) +{ +return ((*(h5_chk_idx_t*)p_a) - (*(h5_chk_idx_t*)p_b)); +} + +h5_err_t +h5tpriv_get_list_of_chunks_to_write ( + h5t_mesh_t* const m, + h5_chk_idx_t** list, + int* counter + ) { + H5_PRIV_FUNC_ENTER (h5_err_t, "m=%p list=%p, counter=%p", m, list, counter); + h5_chk_idx_t num_chunks = m->chunks->curr_idx + 1; // Is that ok? yes if update is correct + + int rank = m->f->myproc; + int size_list = num_chunks; + TRY ( *list = h5_calloc (num_chunks, sizeof (**list))); + *counter = 0; + h5_loc_idxlist_t* loc_list = NULL; //WARNING works only if chk_idx == loc_idx + TRY (h5priv_alloc_loc_idxlist (&loc_list, size_list)); + + // go through chunks and get those that belong to this proc + for (h5_loc_idx_t i = 0; i < num_chunks; i++) { + if (H5t_get_proc (m->octree, m->chunks->chunks[i].oct_idx) == rank ) { + TRY (h5priv_search_in_loc_idxlist (&loc_list, i)); + } + } + *counter = loc_list->num_items; + for (int i = 0; i< loc_list->num_items; i++) { + (*list)[i] = (h5_chk_idx_t)loc_list->items[i]; + } +// memcpy (*list, loc_list->items, sizeof(**list) * loc_list->num_items); + TRY (h5priv_free_loc_idxlist (&loc_list)); + + if (size_list < *counter) { + h5_debug ("Overflow of list_of_chunks"); + H5_PRIV_FUNC_LEAVE (H5_ERR_INTERNAL); + } + H5_PRIV_FUNC_RETURN (H5_SUCCESS); +} +#endif +static h5_err_t +exchange_g2l_vtx_map ( + h5t_mesh_t* const m, + h5_idxmap_t* map, + h5_glb_idx_t** range, + h5_glb_idx_t** glb_vtx + ) { + H5_PRIV_FUNC_ENTER (h5_err_t, "m=%p map=%p, range=%p, glb_vtx=%p", m, map, range, glb_vtx); +#ifdef PARALLEL_IO + // alloc/get range + TRY (*range = h5_calloc (m->f->nprocs + 1, sizeof (**range))); + TRY (h5tpriv_get_ranges (m,*range, map->num_items, 0)); + + //alloc glb_vtx + TRY (*glb_vtx = h5_calloc ((*range)[m->f->nprocs], sizeof (**glb_vtx))); + h5_glb_idx_t* sendbuf = NULL; + TRY (sendbuf = h5_calloc (map->num_items, sizeof (*sendbuf))); + int* recvcount = NULL; + int* recvdisp = NULL; + TRY (recvcount = h5_calloc (m->f->nprocs , sizeof (*recvcount))); + TRY (recvdisp = h5_calloc (m->f->nprocs , sizeof (*recvdisp))); + for (int i = 0; i < m->f->nprocs; i++) { + recvdisp[i] = (int) (*range)[i]; + recvcount[i] = (int) ((*range)[i+1] - (*range)[i]); + } + for (int i = 0; i < map->num_items; i++) { + sendbuf[i] = map->items[i].glb_idx; + } + + TRY (h5priv_mpi_allgatherv ( + sendbuf, + (int)map->num_items, + MPI_LONG, + *glb_vtx, + recvcount, + recvdisp, + MPI_LONG, + m->f->props->comm)); +#endif + H5_PRIV_FUNC_RETURN (H5_SUCCESS); +} + +int sort_glb_idx(const void *p_a, const void *p_b) +{ + return (*(h5_glb_idx_t*)p_a) - (*(h5_glb_idx_t*)p_b); +} + +/* + * instead of bsearch it returns the first element that fulfills compare(key,element) == 0 in an unsorted array + * we don't want to sort array since it's also containing a permutation + */ +void * linsearch (const void *key, void *array, size_t count, size_t size, + comparison_fn_t compare) { + void* pointer = array; + for (int i = 0; i < count; i++) { + if (compare.compare(key,pointer) == 0) { + return pointer; + break; + } + pointer += size; + } + return NULL; +} + +h5_err_t +remove_item_from_idxmap ( + h5_idxmap_t* map, + int item_idx + ) { + H5_PRIV_FUNC_ENTER (h5_err_t, "map=%p, item_idx=%d", map, item_idx); + assert(item_idx < map->num_items); + + memmove(&map->items[item_idx], &map->items[item_idx + 1], (map->num_items - 1 - item_idx) * sizeof (*map->items)); + map->num_items--; + H5_PRIV_FUNC_RETURN (H5_SUCCESS); +} +/* + * Check if any proc with lower rank already writes a vtx that this proc has planed to write + * if so remove it from the map. Only the proc with the lowest rank writes the vertex + */ +static h5_err_t +check_multiple_vtx_writes ( + h5t_mesh_t* const m, + h5_idxmap_t* map, + h5_glb_idx_t* range, + h5_glb_idx_t* glb_vtx + ) { + H5_PRIV_FUNC_ENTER (h5_err_t, "m=%p map=%p, range=%p, glb_vtx=%p", m, map, range, glb_vtx); + if (m->f->myproc == 0) { + H5_PRIV_FUNC_LEAVE (H5_SUCCESS); + } + h5_glb_idx_t num_glb_vtx = range[m->f->myproc]; + // sort glb_vtx up to my vtx + qsort (glb_vtx,num_glb_vtx, sizeof (*glb_vtx), sort_glb_idx); + + h5_glb_idx_t* key = NULL; + +// comparison_fn_t comp_func; +// comp_func.compare = sort_glb_idx; + for (int i = 0; i < map->num_items; i++) { + h5_glb_idx_t* retval = NULL; + key = &map->items[i].glb_idx; + retval = bsearch (key, glb_vtx, num_glb_vtx, sizeof (*glb_vtx), sort_glb_idx); + if (retval != NULL) { + // vertex already exist on proc with lower rank + TRY (remove_item_from_idxmap (map, i)); + i--; // same position should be check again + } + } + H5_PRIV_FUNC_RETURN (H5_SUCCESS); +} + +h5_int32_t +find_proc_to_write ( + h5t_mesh_t* const m, + h5_loc_idx_t elem_idx + ) { + H5_PRIV_FUNC_ENTER (int, "m=%p ", m); +#ifdef PARALLEL_IO + h5_glb_idx_t glb_idx = h5tpriv_get_loc_elem_glb_idx (m, elem_idx); + for (int i = 0; i < m->chunks->num_alloc; i++) { + if ( glb_idx >= m->chunks->chunks[i].elem && + glb_idx < m->chunks->chunks[i].elem + m->chunks->chunks[i].num_elems) { + H5_PRIV_FUNC_LEAVE (H5t_get_proc (m->octree, m->chunks->chunks[i].oct_idx)); + } + } +#endif + H5_PRIV_FUNC_RETURN (H5_SUCCESS); +} +/* + * function returns a map with all the vtx that should be written by this proc + * + * first get all vtx that span elems that are written by this proc + * + * exchange the map and find which ones have to be written locally + */ +static h5_err_t +get_map_vertices_write ( + h5t_mesh_t* const m, + h5_idxmap_t* map + ) { + H5_PRIV_FUNC_ENTER (h5_err_t, "m=%p, map=%p", m, map); +#ifdef PARALLEL_IO + h5_chk_idx_t* list_of_chunks; + int num_chunks = 0; + TRY (h5tpriv_get_list_of_chunks_to_write (m, &list_of_chunks, &num_chunks)); + + /* for the time being we use the hash table only for a fast test + whether a global index has already been added to the map or not. */ + h5_hashtable_t htab; + TRY (h5priv_hcreate ((map->size << 2) / 3, &htab, + hidxmap_cmp, hidxmap_compute_hval, NULL)); + + int num_vertices = h5tpriv_ref_elem_get_num_vertices (m); + + // go through chunks + for (int i = 0; i < num_chunks; i++) { + h5_chk_idx_t chk_idx = list_of_chunks[i]; + h5_glb_idx_t glb_elem_idx = m->chunks->chunks[chk_idx].elem; + h5_chk_size_t num_elem = m->chunks->chunks[chk_idx].num_elems; + for (int j = 0; j < num_elem; j++) { // go through elements + h5_loc_idx_t loc_elem_idx = h5t_map_glb_elem_idx2loc(m, glb_elem_idx + j); + h5_loc_idx_t* vertices = h5tpriv_get_loc_elem_vertex_indices(m, loc_elem_idx); + for (int k = 0; k < num_vertices; k++) { + // get glb vertices + h5_glb_idx_t glb_vidx = m->vertices[vertices[k]].idx; + + // add index temporarly to map ... + map->items[map->num_items] = (h5_idxmap_el_t) {glb_vidx, vertices[k]}; + // ... and check whether it has already been added + h5_idxmap_el_t* retval; + h5priv_hsearch (&map->items[map->num_items], + H5_ENTER, (void**)&retval, &htab); + if (retval == &map->items[map->num_items]) { + // new entry in hash table thus in map + map->num_items++; + } + + } + } + } + TRY (h5priv_hdestroy (&htab)); + h5priv_sort_idxmap (map); + + h5_glb_idx_t* range = NULL; + h5_glb_idx_t* glb_vtx = NULL; + // do exchange map + TRY (exchange_g2l_vtx_map(m, map, &range, &glb_vtx)); + + // check your vertices if they already appear on a proc with lower rank + // if they appear, delete them from this map + TRY (check_multiple_vtx_writes (m, map, range, glb_vtx)); + + + h5priv_sort_idxmap (map); + TRY (h5_free (range)); + TRY (h5_free (glb_vtx)); +#endif + H5_PRIV_FUNC_RETURN (H5_SUCCESS); +} + +//TODO maybe use ifdef to have name without _chk +static h5_err_t +write_vertices_chk ( + h5t_mesh_t* const m + ) { + H5_PRIV_FUNC_ENTER (h5_err_t, "m=%p", m); + assert (m->num_leaf_levels > 0); +#ifdef PARALLEL_IO + hid_t dset_id; + TRY (dset_id = hdf5_open_dataset (m->mesh_gid, m->dsinfo_vertices.name)); + hid_t mspace_id; + hid_t dspace_id; + + + h5_idxmap_t map_r; + TRY (h5priv_new_idxmap (&map_r, m->num_loc_vertices[m->num_leaf_levels-1] + 128)); + h5_idxmap_t* map = &map_r; + get_map_vertices_write (m, map); + TRY (h5priv_mpi_barrier (m->f->props->comm)); + m->timing.measure[m->timing.next_time++] = MPI_Wtime(); + // create memspace + hsize_t num_loc_vertices = m->num_loc_vertices[m->leaf_level]; + TRY (mspace_id = hdf5_create_dataspace(1, &num_loc_vertices, NULL)); + // add memspace + hsize_t hstride = 1; + H5S_seloper_t seloper = H5S_SELECT_SET; // first selection + for (hsize_t i = 0; i < map->num_items; i++) { + hsize_t hstart = map->items[i].loc_idx; + hsize_t hcount = 1; + while (map->items[i].loc_idx+1 == map->items[i+1].loc_idx && + i+1 < map->num_items) {// WARINIG make sure +1 is right here + i++; hcount++; + } + TRY (hdf5_select_hyperslab_of_dataspace ( + mspace_id, + seloper, + &hstart, &hstride, &hcount, + NULL)); + seloper = H5S_SELECT_OR; + } + + + // create diskspace and select subset + hsize_t num_glb_vertices = m->num_glb_vertices[m->num_leaf_levels-1]; + m->dsinfo_vertices.dims[0] = num_glb_vertices; + TRY (dspace_id = hdf5_get_dataset_space (dset_id)); + TRY (hdf5_set_dataset_extent (dset_id, &num_glb_vertices)); + H5Sset_extent_simple(dspace_id, 1,m->dsinfo_vertices.dims, NULL); //TODO WRITE WRAPPER + + seloper = H5S_SELECT_SET; // first selection + for (hsize_t i = 0; i < map->num_items; i++) { + hsize_t hstart = map->items[i].glb_idx; + hsize_t hcount = 1; + while (map->items[i].glb_idx+1 == map->items[i+1].glb_idx && + i+1 < map->num_items) { // WARINIG make sure +1 is right here + i++; hcount++; + } + TRY (hdf5_select_hyperslab_of_dataspace ( + dspace_id, + seloper, + &hstart, &hstride, &hcount, + NULL)); + seloper = H5S_SELECT_OR; + } + TRY (h5priv_mpi_barrier (m->f->props->comm)); + m->timing.measure[m->timing.next_time++] = MPI_Wtime(); +#if defined(WITH_PARALLEL_H5FED) + TRY (h5priv_start_throttle (m->f)); +#endif + + + TRY( h5priv_write_dataset_by_name_id ( + m->f, + m->mesh_gid, + &m->dsinfo_vertices, + dset_id, + mspace_id, + dspace_id, + m->vertices) ); + + + TRY (h5priv_write_attrib ( + m->mesh_gid, + "__num_vertices__", + H5T_NATIVE_INT64, + m->num_glb_vertices, + m->num_leaf_levels, + 1)); + TRY (h5priv_write_attrib ( + m->mesh_gid, + "__num_b_vertices__", + H5T_NATIVE_INT64, + m->num_b_vtx, + m->num_leaf_levels, + 1)); + TRY (h5priv_write_attrib ( + m->mesh_gid, + "__first_b_vertices__", + H5T_NATIVE_INT64, + m->first_b_vtx, + m->num_leaf_levels, + 1)); + +#if defined(WITH_PARALLEL_H5FED) + TRY (h5priv_end_throttle (m->f)); +#endif + TRY (hdf5_close_dataspace (dspace_id)); + TRY (hdf5_close_dataspace (mspace_id)); + TRY (hdf5_close_dataset (dset_id)); + m->f->empty = 0; +#endif + H5_PRIV_FUNC_RETURN (H5_SUCCESS); +} +#if defined(WITH_PARALLEL_H5FED) +static h5_err_t +write_elems ( + h5t_mesh_t* const m + ) { + H5_PRIV_FUNC_ENTER (h5_err_t, "m=%p", m); + H5_PRIV_FUNC_RETURN (h5_error_not_implemented ()); +} + +#else + +// SERIAL WRITE +static h5_err_t +write_elems ( + h5t_mesh_t* const m + ) { + H5_PRIV_FUNC_ENTER (h5_err_t, "m=%p", m); + assert (m->num_leaf_levels > 0); + + h5_loc_idx_t num_interior_elems = m->num_interior_elems[m->num_leaf_levels-1]; + // alloc and inititalize data in memory + h5_glb_elem_t* glb_elems; + TRY (glb_elems = h5tpriv_alloc_glb_elems (m, num_interior_elems)); + TRY (h5tpriv_init_glb_elems_struct (m, glb_elems)); + + m->dsinfo_elems.dims[0] = num_interior_elems; + TRY (h5priv_write_dataset_by_name ( + m, + m->f, + m->mesh_gid, + &m->dsinfo_elems, + open_space_all, + open_space_all, + glb_elems)); + + TRY (h5priv_write_attrib ( + m->mesh_gid, + "__num_elems__", + H5T_NATIVE_INT64, + m->num_glb_elems, + m->num_leaf_levels, + 1)); + + TRY (h5priv_write_attrib ( + m->mesh_gid, + "__num_leaf_elems__", + H5T_NATIVE_INT64, + m->num_glb_leaf_elems, + m->num_leaf_levels, + 1)); + + TRY (h5priv_write_attrib ( + m->mesh_gid, + "__num_leaf_levels__", + H5T_NATIVE_INT16, + &m->num_leaf_levels, + 1, + 1)); + + TRY (h5priv_write_attrib ( + m->mesh_gid, + "__is_chunked__", + H5T_NATIVE_INT16, + &m->is_chunked, + 1, + 1)); + TRY (h5priv_write_attrib ( + m->mesh_gid, + "__num_weights__", + H5T_NATIVE_INT32, + &m->num_weights, + 1, + 1)); + // release mem + TRY (h5_free (glb_elems)); + H5_PRIV_FUNC_RETURN (H5_SUCCESS); +} +#endif +#ifdef PARALLEL_IO +//TODO maybe use ifdef to have name without _chk +static h5_err_t +write_elems_chk ( + h5t_mesh_t* const m + ) { + H5_PRIV_FUNC_ENTER (h5_err_t, "m=%p", m); + assert (m->num_leaf_levels > 0); + + h5_chk_idx_t* chk_list = NULL; + int num_chk = 0; + // get my chunks to write + TRY (h5tpriv_get_list_of_chunks_to_write(m, &chk_list, &num_chk)); + + hsize_t num_elems = 0; + for (int i = 0; i < num_chk; i++) { + num_elems += m->chunks->chunks[chk_list[i]].num_elems; + } + // alloc and inititalize data in memory + h5_glb_elem_t* glb_elems; + TRY (glb_elems = h5tpriv_alloc_glb_elems (m, num_elems)); + TRY (h5tpriv_init_glb_elems_struct_chk (m, glb_elems, chk_list, num_chk)); + + // could check here that glb_elems are in correct order + + hid_t dset_id; + TRY (dset_id = hdf5_open_dataset (m->mesh_gid, m->dsinfo_elems.name)); + hid_t dspace_id; + hid_t mspace_id; + hsize_t hstart = 0; + hsize_t hstride = 1; + hsize_t hcount = num_elems; + TRY (mspace_id = hdf5_create_dataspace (1, &num_elems, NULL)); + TRY (hdf5_select_hyperslab_of_dataspace ( + mspace_id, + H5S_SELECT_SET, + &hstart, &hstride, &hcount, + NULL)); + + + // create diskspace and select subset + hsize_t num_glb_elems = m->num_glb_elems[m->leaf_level]; + m->dsinfo_elems.dims[0] = num_glb_elems; + TRY (dspace_id = hdf5_get_dataset_space (dset_id)); + TRY (hdf5_set_dataset_extent (dset_id, &num_glb_elems)); + H5Sset_extent_simple(dspace_id, 1,m->dsinfo_elems.dims, NULL); //TODO WRITE WRAPPER + + + hsize_t hnext = h5tpriv_get_glb_elem_idx(m, glb_elems, 0); + hsize_t hcurr = 0; + // with those two variables the number of func calls can be reduced 3 times! + H5S_seloper_t seloper = H5S_SELECT_SET; // first selection + for (hsize_t i = 0; i < num_elems; i++) { + hstart = hnext; + hcurr = hnext; + hcount = 1; + while (i + 1 < num_elems && + (hnext = h5tpriv_get_glb_elem_idx(m, glb_elems, i + 1)) == hcurr + 1) { + i++; hcount++; hcurr++; + } + TRY (hdf5_select_hyperslab_of_dataspace ( + dspace_id, + seloper, + &hstart, &hstride, &hcount, + NULL)); + seloper = H5S_SELECT_OR; + } + // TODO add throttle + + TRY (h5priv_write_dataset_by_name_id( + m->f, + m->mesh_gid, + &m->dsinfo_elems, + dset_id, + mspace_id, + dspace_id, + glb_elems)); + + TRY (h5priv_write_attrib ( + m->mesh_gid, + "__num_elems__", + H5T_NATIVE_INT64, + m->num_glb_elems, + m->num_leaf_levels, + 1)); + + TRY (h5priv_write_attrib ( + m->mesh_gid, + "__num_leaf_elems__", + H5T_NATIVE_INT64, + m->num_glb_leaf_elems, + m->num_leaf_levels, + 1)); + + TRY (h5priv_write_attrib ( + m->mesh_gid, + "__num_leaf_levels__", + H5T_NATIVE_INT16, + &m->num_leaf_levels, + 1, + 1)); + + TRY (h5priv_write_attrib ( + m->mesh_gid, + "__is_chunked__", + H5T_NATIVE_INT16, + &m->is_chunked, + 1, + 1)); + + // release mem + TRY (h5_free (glb_elems)); + TRY (h5_free (chk_list)); + + TRY (hdf5_close_dataspace (dspace_id)); + TRY (hdf5_close_dataspace (mspace_id)); + TRY (hdf5_close_dataset (dset_id)); + H5_PRIV_FUNC_RETURN (H5_SUCCESS); +} + +hid_t +set_chk_memspace ( + h5t_mesh_t* m, + hid_t dataspace_id) { + H5_PRIV_FUNC_ENTER (h5_err_t, "m=%p, dataspace_id=%d", m, dataspace_id); + hid_t mspace_id; + TRY (mspace_id = hdf5_create_dataspace (1, m->dsinfo_chunks.dims, NULL)); + + hsize_t hstride = 1; + hsize_t hstart = 0; + hsize_t hcount = m->dsinfo_chunks.dims[0]; + if (m->f->myproc == 0) { + TRY (hdf5_select_hyperslab_of_dataspace ( + mspace_id, + H5S_SELECT_SET, + &hstart, &hstride, &hcount, + NULL)); + } else { + hcount = 0; + TRY (hdf5_select_hyperslab_of_dataspace ( + mspace_id, + H5S_SELECT_SET, + &hstart, &hstride, &hcount, + NULL)); + } + H5_PRIV_FUNC_RETURN (mspace_id); +} + +hid_t +set_chk_diskspace ( + h5t_mesh_t* m, + hid_t dspace_id + ) { + H5_PRIV_FUNC_ENTER (h5_err_t, "m=%p, dataspace_id=%d", m, dspace_id); + + H5Sset_extent_simple(dspace_id, 1,m->dsinfo_chunks.dims, NULL); //TODO WRITE WRAPPER + + hsize_t hstride = 1; + hsize_t hstart = 0; + hsize_t hcount = m->dsinfo_chunks.dims[0]; + if (m->f->myproc == 0) { + TRY (hdf5_select_hyperslab_of_dataspace ( + dspace_id, + H5S_SELECT_SET, + &hstart, &hstride, &hcount, + NULL)); + } else { + hcount = 0; + TRY (hdf5_select_hyperslab_of_dataspace ( + dspace_id, + H5S_SELECT_SET, + &hstart, &hstride, &hcount, + NULL)); + } + H5_PRIV_FUNC_RETURN (dspace_id); +} + +h5_err_t +write_chunks ( + h5t_mesh_t* const m + ) { + H5_PRIV_FUNC_ENTER (h5_err_t, "m=%p", m); + m->dsinfo_chunks.dims[0] = m->chunks->num_alloc; + + + TRY (h5priv_write_dataset_by_name ( + m, + m->f, + m->mesh_gid, + &m->dsinfo_chunks, + set_chk_memspace, + set_chk_diskspace, + m->chunks->chunks)); + + TRY (h5priv_write_attrib ( + m->mesh_gid, + "__num_chunks__", + H5_INT32_T, + &m->chunks->num_alloc, + 1, + 1)); + + TRY (h5priv_write_attrib ( + m->mesh_gid, + "__num_chk_levels__", + H5_INT16_T, // WARNING should maybe be uint + &m->chunks->num_levels, + 1, + 1)); + + TRY (h5priv_write_attrib ( + m->mesh_gid, + "__num_chk_p_level__", + H5_INT32_T, + m->chunks->num_chunks_p_level, + m->chunks->num_levels, + 1)); + + H5_PRIV_FUNC_RETURN (H5_SUCCESS); +} + +hid_t +set_oct_memspace ( + h5t_mesh_t* m, + hid_t dataspace_id) { + H5_PRIV_FUNC_ENTER (h5_err_t, "m=%p, dataspace_id=%d", m, dataspace_id); + hid_t mspace_id; + TRY (mspace_id = hdf5_create_dataspace (1, m->dsinfo_octree.dims, NULL)); + + hsize_t hstride = 1; + hsize_t hstart = 0; + hsize_t hcount = m->dsinfo_octree.dims[0]; + if (m->f->myproc == 0) { + TRY (hdf5_select_hyperslab_of_dataspace ( + mspace_id, + H5S_SELECT_SET, + &hstart, &hstride, &hcount, + NULL)); + } else { + hcount = 0; + TRY (hdf5_select_hyperslab_of_dataspace ( + mspace_id, + H5S_SELECT_SET, + &hstart, &hstride, &hcount, + NULL)); + } + H5_PRIV_FUNC_RETURN (mspace_id); +} + +hid_t +set_oct_diskspace ( + h5t_mesh_t* m, + hid_t dspace_id + ) { + H5_PRIV_FUNC_ENTER (h5_err_t, "m=%p, dataspace_id=%d", m, dspace_id); + + H5Sset_extent_simple(dspace_id, 1,m->dsinfo_octree.dims, NULL); //TODO WRITE WRAPPER + + hsize_t hstride = 1; + hsize_t hstart = 0; + hsize_t hcount = m->dsinfo_octree.dims[0]; + if (m->f->myproc == 0) { + TRY (hdf5_select_hyperslab_of_dataspace ( + dspace_id, + H5S_SELECT_SET, + &hstart, &hstride, &hcount, + NULL)); + } else { + hcount = 0; + TRY (hdf5_select_hyperslab_of_dataspace ( + dspace_id, + H5S_SELECT_SET, + &hstart, &hstride, &hcount, + NULL)); + } + H5_PRIV_FUNC_RETURN (dspace_id); +} + +h5_err_t +write_octree ( + h5t_mesh_t* const m + ) { + H5_PRIV_FUNC_ENTER (h5_err_t, "m=%p", m); + + TRY (H5t_update_internal (m->octree)); + TRY (H5t_update_userdata (m->octree)); + + m->dsinfo_octree.dims[0] = m->octree->current_oct_idx + 1; + + TRY (h5priv_write_dataset_by_name ( + m, + m->f, + m->mesh_gid, + &m->dsinfo_octree, + set_oct_memspace, + set_oct_diskspace, + m->octree->octants)); + + TRY (h5priv_write_attrib ( + m->mesh_gid, + "__curr_oct_idx__", + H5_INT32_T, + &m->octree->current_oct_idx, + 1, + 1)); + + TRY (h5priv_write_attrib ( + m->mesh_gid, + "__oct_maxpoints__", + H5_INT32_T, + &m->octree->maxpoints, + 1, + 1)); + TRY (h5priv_write_attrib ( + m->mesh_gid, + "__oct_size_userdata__", + H5_INT32_T, + &m->octree->size_userdata, + 1, + 1)); + TRY (h5priv_write_attrib ( + m->mesh_gid, + "__oct_bounding_box__", + H5_FLOAT64_T, + m->octree->bounding_box, + 6, + 1)); + + if (m->octree->size_userdata > 0) { + m->dsinfo_userdata.dims[0] = m->octree->current_oct_idx + 1; + + TRY (h5priv_write_dataset_by_name ( + m, + m->f, + m->mesh_gid, + &m->dsinfo_userdata, + set_oct_memspace, // should work fine same size as octree + set_oct_diskspace, + m->octree->userdata)); + + + } + + H5_PRIV_FUNC_RETURN (H5_SUCCESS); +} + + +hid_t +set_weight_memspace ( + h5t_mesh_t* m, + hid_t dataspace_id) { + H5_PRIV_FUNC_ENTER (h5_err_t, "m=%p, dataspace_id=%d", m, dataspace_id); + hid_t mspace_id; + TRY (mspace_id = hdf5_create_dataspace (1, m->dsinfo_weights.dims, NULL)); + + hsize_t hstride = 1; + hsize_t hstart = 0; + hsize_t hcount = m->dsinfo_weights.dims[0]; + if (m->f->myproc == 0) { + TRY (hdf5_select_hyperslab_of_dataspace ( + mspace_id, + H5S_SELECT_SET, + &hstart, &hstride, &hcount, + NULL)); + } else { + hcount = 0; + TRY (hdf5_select_hyperslab_of_dataspace ( + mspace_id, + H5S_SELECT_SET, + &hstart, &hstride, &hcount, + NULL)); + } + H5_PRIV_FUNC_RETURN (mspace_id); +} + +hid_t +set_weight_diskspace ( + h5t_mesh_t* m, + hid_t dspace_id + ) { + H5_PRIV_FUNC_ENTER (h5_err_t, "m=%p, dataspace_id=%d", m, dspace_id); + + H5Sset_extent_simple(dspace_id, 1,m->dsinfo_weights.dims, NULL); //TODO WRITE WRAPPER + + hsize_t hstride = 1; + hsize_t hstart = 0; + hsize_t hcount = m->dsinfo_weights.dims[0]; + if (m->f->myproc == 0) { + TRY (hdf5_select_hyperslab_of_dataspace ( + dspace_id, + H5S_SELECT_SET, + &hstart, &hstride, &hcount, + NULL)); + } else { + hcount = 0; + TRY (hdf5_select_hyperslab_of_dataspace ( + dspace_id, + H5S_SELECT_SET, + &hstart, &hstride, &hcount, + NULL)); + } + H5_PRIV_FUNC_RETURN (dspace_id); +} + +/* + * weights is an array that stores the element weights. c weights per element with n elements, gives a size of c*n. + * where the weights of an element are stored contiguosly. i.e. first weight of second elem is at weights[c*1]. + */ +h5_err_t +write_weights ( + h5t_mesh_t* const m + ) { + H5_PRIV_FUNC_ENTER (h5_err_t, "m=%p", m); + + m->dsinfo_weights.dims[0] = m->num_glb_elems[m->leaf_level] * m->num_weights; + + TRY (h5priv_write_dataset_by_name ( + m, + m->f, + m->mesh_gid, + &m->dsinfo_weights, + set_weight_memspace, + set_weight_diskspace, + m->weights)); + + TRY (h5priv_write_attrib ( + m->mesh_gid, + "__num_weights__", + H5_INT32_T, + &m->num_weights, + 1, + 1)); + + H5_PRIV_FUNC_RETURN (H5_SUCCESS); +} +#endif +h5_err_t +h5tpriv_write_mesh ( + h5t_mesh_t* const m + ) { + H5_PRIV_API_ENTER (h5_err_t, "m=%p", m); + if (m->mesh_changed) { + if (m->is_chunked) { +#ifdef PARALLEL_IO + if (m->num_weights > 0) { + TRY (write_weights (m)); + } + TRY (h5priv_mpi_barrier (m->f->props->comm)); + m->timing.measure[m->timing.next_time++] = MPI_Wtime(); + TRY (write_chunks (m)); + TRY (h5priv_mpi_barrier (m->f->props->comm)); + m->timing.measure[m->timing.next_time++] = MPI_Wtime(); + TRY (write_octree (m)); + TRY (h5priv_mpi_barrier (m->f->props->comm)); + m->timing.measure[m->timing.next_time++] = MPI_Wtime(); + if (m->f->nprocs > 1) { + TRY (write_vertices_chk (m)); + TRY (h5priv_mpi_barrier (m->f->props->comm)); + m->timing.measure[m->timing.next_time++] = MPI_Wtime(); + TRY (write_elems_chk (m)); + TRY (h5priv_mpi_barrier (m->f->props->comm)); + m->timing.measure[m->timing.next_time++] = MPI_Wtime(); + } else { + TRY (write_vertices (m)); + TRY (h5priv_mpi_barrier (m->f->props->comm)); + m->timing.measure[m->timing.next_time++] = MPI_Wtime(); + TRY (write_elems (m)); + TRY (h5priv_mpi_barrier (m->f->props->comm)); + m->timing.measure[m->timing.next_time++] = MPI_Wtime(); + } +#endif + } else { + TRY (write_vertices (m)); + TRY (write_elems (m)); + } + + + + } + H5_PRIV_API_RETURN (H5_SUCCESS); +} +// ANCHOR WRITE +/* + Read vertices from file. If map is NULL, read *all* vertices otherwise the + vertices specified in the map. + */ +static h5_err_t +read_vertices ( + h5t_mesh_t* m, + h5_idxmap_t* map + ) { + H5_PRIV_FUNC_ENTER (h5_err_t, "m=%p", m); + hid_t dset_id; + TRY (dset_id = hdf5_open_dataset (m->mesh_gid, m->dsinfo_vertices.name)); + hid_t mspace_id = H5S_ALL; + hid_t dspace_id = H5S_ALL; + + if (map) { + m->num_loc_vertices[m->num_leaf_levels-1] = map->num_items; + m->last_stored_vid = m->num_loc_vertices[m->num_leaf_levels-1] - 1; + TRY (h5tpriv_alloc_loc_vertices (m, map->num_items)); + + // create memspace + hsize_t num_loc_vertices = map->num_items; + TRY (mspace_id = hdf5_create_dataspace(1, &num_loc_vertices, NULL)); + + // create diskspace and select subset + hsize_t num_glb_vertices = m->num_glb_vertices[m->num_leaf_levels-1]; + TRY (dspace_id = hdf5_create_dataspace (1, &num_glb_vertices, NULL)); + hsize_t hstride = 1; + H5S_seloper_t seloper = H5S_SELECT_SET; // first selection + for (hsize_t i = 0; i < map->num_items; i++) { + hsize_t hstart = map->items[i].glb_idx; + hsize_t hcount = 1; + while (map->items[i].glb_idx+1 == map->items[i+1].glb_idx && + i + 1 < map->num_items) {// WARNING check if +1 is correct here + i++; hcount++; + } + TRY (hdf5_select_hyperslab_of_dataspace ( + dspace_id, + seloper, + &hstart, &hstride, &hcount, + NULL)); + seloper = H5S_SELECT_OR; + } + } else { + size_t num_vertices = m->num_glb_vertices[m->num_leaf_levels-1]; + m->last_stored_vid = m->num_glb_vertices[m->num_leaf_levels-1] - 1; + TRY (h5tpriv_alloc_loc_vertices (m, num_vertices)); + } + +#if defined(WITH_PARALLEL_H5FED) + TRY (h5priv_start_throttle (m->f)); +#endif + + TRY (hdf5_read_dataset ( + dset_id, + m->dsinfo_vertices.type_id, + mspace_id, + dspace_id, + m->f->props->xfer_prop, + m->vertices)); +#if defined(WITH_PARALLEL_H5FED) + TRY (h5priv_end_throttle (m->f)); +#endif + TRY (hdf5_close_dataspace (dspace_id)); + TRY (hdf5_close_dataspace (mspace_id)); + TRY (hdf5_close_dataset (dset_id)); + + H5_PRIV_FUNC_RETURN (H5_SUCCESS); +} + +static h5_err_t +read_elems ( + h5t_mesh_t* const m, + h5_loc_idx_t start, + h5_loc_idx_t count, + h5_glb_elem_t* glb_elems + ) { + H5_PRIV_FUNC_ENTER (h5_err_t, "m=%p, start=%lld, count=%lld", + m, (long long)start, (long long)count); + + hid_t dset_id; + TRY (dset_id = hdf5_open_dataset (m->mesh_gid, m->dsinfo_elems.name)); + hid_t mspace_id; + hsize_t hcount = (hsize_t)count; + TRY (mspace_id = hdf5_create_dataspace (1, &hcount, NULL)); + + hid_t dspace_id; + hsize_t hstart = (hsize_t)start; + hsize_t hstride = 1; + hsize_t num_glb_elems = m->num_glb_elems[m->num_leaf_levels-1]; + TRY (dspace_id = hdf5_create_dataspace (1, &num_glb_elems, NULL)); + TRY (hdf5_select_hyperslab_of_dataspace ( + dspace_id, + H5S_SELECT_SET, + &hstart, &hstride, &hcount, + NULL)); +#if 0 + // TODO DELETE from here +h5_glb_elem_t* glb_elems2 = glb_elems; + +#if NDEBUG == 0 +sleep (m->f->myproc*2); +for (int i = 0; i < num_glb_elems;i++) { + h5_debug ("\n" + "GLB ELEM\n idx: %d \n" + " parent_idx: %d \n" + " child_idx: %d \n" + " level_idx: %d \n" + " refinement: %d \n" + " flags: %d \n" + " indices: %d %d %d\n" + " neigh_indi: %d %d %d\n\n", + (int)glb_elems2[i].idx, + (int)glb_elems2[i].parent_idx, + (int)glb_elems2[i].child_idx, + (int)glb_elems2[i].level_idx, + (int)glb_elems2[i].refinement, + (int)glb_elems2[i].flags, + (int)((h5_glb_tri_t*)glb_elems2)[i].vertex_indices[0], + (int)((h5_glb_tri_t*)glb_elems2)[i].vertex_indices[1], + (int)((h5_glb_tri_t*)glb_elems2)[i].vertex_indices[2], + (int)((h5_glb_tri_t*)glb_elems2)[i].neighbor_indices[0], + (int)((h5_glb_tri_t*)glb_elems2)[i].neighbor_indices[1], + (int)((h5_glb_tri_t*)glb_elems2)[i].neighbor_indices[2]); +} + +#endif +#endif +// TODO END +#ifdef PARALLEL_IO + TRY (h5priv_start_throttle (m->f)); +#endif + + TRY (hdf5_read_dataset ( + dset_id, + m->dsinfo_elems.type_id, + mspace_id, + dspace_id, + m->f->props->xfer_prop, + glb_elems)); +#ifdef PARALLEL_IO + TRY (h5priv_end_throttle (m->f)); +#endif + + // TODO DELETE from here + +#if 0 +#if NDEBUG == 0 +sleep (m->f->myproc*2); +for (int i = 0; i < num_glb_elems;i++) { + h5_debug ("\n" + "GLB ELEM\n idx: %d \n" + " parent_idx: %d \n" + " child_idx: %d \n" + " level_idx: %d \n" + " refinement: %d \n" + " flags: %d \n" + " indices: %d %d %d\n" + " neigh_indi: %d %d %d\n\n", + (int)glb_elems2[i].idx, + (int)glb_elems2[i].parent_idx, + (int)glb_elems2[i].child_idx, + (int)glb_elems2[i].level_idx, + (int)glb_elems2[i].refinement, + (int)glb_elems2[i].flags, + (int)((h5_glb_tri_t*)glb_elems2)[i].vertex_indices[0], + (int)((h5_glb_tri_t*)glb_elems2)[i].vertex_indices[1], + (int)((h5_glb_tri_t*)glb_elems2)[i].vertex_indices[2], + (int)((h5_glb_tri_t*)glb_elems2)[i].neighbor_indices[0], + (int)((h5_glb_tri_t*)glb_elems2)[i].neighbor_indices[1], + (int)((h5_glb_tri_t*)glb_elems2)[i].neighbor_indices[2]); +} + +#endif +#endif +// TODO END + + TRY (hdf5_close_dataspace (dspace_id)); + TRY (hdf5_close_dataspace (mspace_id)); + TRY (hdf5_close_dataset (dset_id)); + + H5_PRIV_FUNC_RETURN (H5_SUCCESS); +} + + + +#if defined(WITH_PARALLEL_H5FED) +// READ MESH PARALLEL +/* + Partition mesh via dual graph partitioning + + Step 1: Partiton dual graph of mesh, all procs have their global + cell data loaded. + Step 2: Handle ghost- and border cells + Step 3: Read vertices + */ +h5_err_t +part_kway ( + h5t_mesh_t* const m, + h5_glb_elem_t** glb_elems + ) { + H5_PRIV_FUNC_ENTER (h5_err_t, "m=%p", m); + /* + Step 1: + - read num cell/num procs cells + - call partitioner + - each proc must know the number of cells assigned to his + partition on foreign procs. + - send global cell data to right proc + */ + + // compute initial distribution of cells on all procs + int n = m->num_glb_elems[0] / m->f->nprocs; + int r = m->num_glb_elems[0] % m->f->nprocs; + + idx_t* vtxdist; + TRY (vtxdist = h5_calloc (m->f->nprocs+1, sizeof (*vtxdist))); + vtxdist[0] = 0; + h5_debug ("vtxdist[%d]: %d", 0, 0); + for (int i = 1; i < m->f->nprocs+1; i++) { + if (r > 0) { + vtxdist[i] = vtxdist[i-1] + n + 1; + r--; + } else { + vtxdist[i] = vtxdist[i-1] + n; + } + h5_debug ("vtxdist[%d]: %d", i, vtxdist[i]); + } + // read cells only + idx_t start = vtxdist[m->f->myproc]; + idx_t num_interior_elems = vtxdist[m->f->myproc+1] - start; + m->num_interior_elems[0] = m->num_interior_leaf_elems[0] = num_interior_elems; + + h5_glb_elem_t* elems; + TRY (elems = h5tpriv_alloc_glb_elems (m, num_interior_elems)); + + TRY (read_elems (m, start, num_interior_elems, elems)); + + + // setup input for ParMETIS + idx_t* xadj; + idx_t* adjncy; + idx_t* part; + TRY (xadj = h5_calloc (num_interior_elems, sizeof(*xadj))); + TRY (part = h5_calloc (num_interior_elems, sizeof(*part))); + // TODO: 4*num_interior_elems will work for meshes with up to 4 facets only! + TRY (adjncy = h5_calloc (4*num_interior_elems, sizeof(*adjncy))); + idx_t i, j; + int num_facets = h5tpriv_ref_elem_get_num_facets (m); + for (i = 0, j = 0; i < num_interior_elems; i++) { + h5_glb_idx_t* neighbors = h5tpriv_get_glb_elem_neighbors(m, elems, i); + xadj[i] = j; + h5_debug ("xadj[%d]: %d", i, j); + // for all facets + for (int l = 0; l < num_facets; l++) { + if (neighbors[l] < 0) continue; + adjncy[j] = neighbors[l]; + h5_debug ("adjncy[%d]: %d", j, adjncy[j]); + j++; + } + } + xadj[num_interior_elems] = j; + h5_debug ("xadj[%lld]: %d", (long long)num_interior_elems, j); + // now we can call the partitioner + idx_t wgtflag = 0; + idx_t numflag = 0; + idx_t ncon = 1; + idx_t nparts = m->f->nprocs; + real_t* tpwgts; + real_t* ubvec; + idx_t options[] = {1,127,42}; + idx_t edgecut; + h5_debug ("nparts: %d", nparts); + TRY (tpwgts = h5_calloc (nparts, sizeof(*tpwgts))); + TRY (ubvec = h5_calloc (nparts, sizeof(*ubvec))); + for (i = 0; i < nparts; i++) { + tpwgts[i] = 1.0 / (real_t)nparts; + ubvec[i] = 1.05; + } + int rc = ParMETIS_V3_PartKway ( + vtxdist, + xadj, + adjncy, + NULL, // vwgt + NULL, // adjwgt + &wgtflag, + &numflag, + &ncon, + &nparts, + tpwgts, + ubvec, + options, + &edgecut, + part, + &m->f->props.comm + ); + if (rc != METIS_OK) { + H5_PRIV_FUNC_LEAVE( + h5_error (H5_ERR, "ParMETIS failed")); + } + TRY (h5_free (vtxdist)); + TRY (h5_free (xadj)); + TRY (h5_free (adjncy)); + TRY (h5_free (tpwgts)); + TRY (h5_free (ubvec)); + +#if !defined(NDEBUG) + for (i = 0; i < num_interior_elems; i++) { + h5_debug ("part[%d]: %llu", i, (unsigned long long)part[i]); + } +#endif + /* + Now we know the partitioning, but the cells aren't distributed + accordingly. + + Eeach processor knows the number of cells he has to send the other + procs in the group, but still don't how many cells he will receive + from the other procs in the group. + */ + + // So, let's count the number of cells we have to send to each proc. + int* sendcounts; + int* recvcounts; + TRY (sendcounts = h5_calloc (nparts, sizeof(sendcounts[0]))); + TRY (recvcounts = h5_calloc (nparts, sizeof(recvcounts[0]))); + for (i = 0; i < num_interior_elems; i++) { + sendcounts[part[i]]++; + } + // send these numbers to according procs + TRY (h5priv_mpi_alltoall ( + sendcounts, 1, MPI_INT, + recvcounts, 1, MPI_INT, + m->f->props.comm)); + + for (i = 0; i < nparts; i++) { + h5_debug ("sendcounts[%d]: %d", i, sendcounts[i]); + h5_debug ("recvcounts[%d]: %d", i, recvcounts[i]); + } + /* + next step is to scatter the cells to their procs + via an all-to-all communication: + - allocate and setup send buffer + - allocate and setup recv buffer + - setup MPI data type + - scatter all-to-all + */ + + // allocate and initialize send buffer num_interior_elems*sizeof(cell) + h5_glb_elem_t* sendbuf; + TRY (sendbuf = h5tpriv_alloc_glb_elems (m, num_interior_elems)); + int* senddispls; + TRY (senddispls = h5_calloc (m->f->nprocs, sizeof (senddispls[0]))); + + senddispls[0] = 0; + for (i = 0; i < m->f->nprocs-1; i++) { + senddispls[i+1] = senddispls[i] + sendcounts[i]; + sendcounts[i] = 0; + } + sendcounts[i] = 0; + for (i = 0; i < num_interior_elems; i++) { + size_t sendidx = senddispls[part[i]] + sendcounts[part[i]]; + h5tpriv_copy_glb_elems ( + m, + sendbuf, sendidx, + elems, i, 1); + sendcounts[part[i]]++; + } + for (i = 0; i < num_interior_elems; i++) { + h5_debug ("sendbuf[%d]: %lld", i, h5tpriv_get_glb_elem_idx (m, sendbuf, i)); + } + TRY (h5_free (part)); + + // allocate and initialize recv buffer + int* recvdispls; + recvdispls = h5_calloc (m->f->nprocs, sizeof (recvdispls[0])); + recvdispls[0] = 0; + for (i = 0; i < m->f->nprocs-1; i++) { + recvdispls[i+1] = recvdispls[i] + recvcounts[i]; + } + num_interior_elems = recvdispls[i] + recvcounts[i]; + h5_glb_elem_t* recvbuf; + TRY (recvbuf = h5tpriv_alloc_glb_elems (m, num_interior_elems)); + // scatter elems all to all + MPI_Datatype type = h5tpriv_get_mpi_type_of_glb_elem (m); + TRY (h5priv_mpi_alltoallv ( + sendbuf, sendcounts, senddispls, type, + recvbuf, recvcounts, recvdispls, type, + m->f->props.comm)); + for (i = 0; i < num_interior_elems; i++) { + h5_debug ("global cell ID[%d]: %lld", + i, h5tpriv_get_glb_elem_idx (m, recvbuf, i)); + } + TRY (h5_free (sendbuf)); + TRY (h5_free (sendcounts)); + TRY (h5_free (senddispls)); + TRY (h5_free (recvcounts)); + TRY (h5_free (recvdispls)); + + TRY (h5_free (elems)); + *glb_elems = recvbuf; + + H5_PRIV_FUNC_RETURN (H5_SUCCESS); +} + + +/* + exchange ghost cells: + idea: send my ghost cells to all procs + 1. compute ghost cells + 2. allgather ghost cell IDs: each proc knows the ghost cell IDs of all procs + 3. compute number of border cells to scatter to each proc + 4. scatter these numbers + 5. build array with (border)cells to scatter (note: we may have to scatter + the same cell to multiple procs) + 6. scatter border cells with alltoallv + */ +h5_err_t +exchange_ghost_cells ( + h5t_mesh_t* const m, + h5_glb_elem_t* glb_elems, + h5_glb_elem_t** ghost_elems, + size_t* num_ghost_elems + ) { + H5_PRIV_API_ENTER (h5_err_t, "m=%p, ghost_elems=%p", m, ghost_elems); + int* sendcounts; + int* senddispls; + int* recvcounts; + int* recvdispls; + int nprocs = m->f->nprocs; + TRY (sendcounts = h5_calloc (nprocs, sizeof(*sendcounts))); + TRY (senddispls = h5_calloc (nprocs, sizeof(*senddispls))); + TRY (recvcounts = h5_calloc (nprocs, sizeof(*recvcounts))); + TRY (recvdispls = h5_calloc (nprocs, sizeof(*recvdispls))); + + // determine my ghost cells + h5_glb_idxlist_t* loc_ghostcell_ids = NULL; + int num_facets = h5tpriv_ref_elem_get_num_facets (m); + for (int i = 0; i < m->num_interior_elems[0]; i++) { + h5_glb_idx_t* neighbors = h5tpriv_get_glb_elem_neighbors(m, glb_elems, i); + for (int facet = 0; facet < num_facets; facet++) { + if (neighbors[facet] == -1) { + // geometric boundary + continue; + } + if (h5priv_search_idxmap (&m->map_elem_g2l, neighbors[facet]) >= 0) { + // neighbor is local + continue; + } + // neighbor is *not* local + TRY (h5priv_search_in_glb_idxlist (&loc_ghostcell_ids, neighbors[facet])); + h5_debug ("ghost cell: %lld", neighbors[facet]); + } + } + // allgather number of ghost cells + int* num_ghostcells; + TRY (num_ghostcells = h5_calloc (nprocs, sizeof(num_ghostcells[0]))); + TRY (mpi_allgather (&loc_ghostcell_ids->num_items, 1, MPI_INT, + num_ghostcells, 1, MPI_INT, m->f->props.comm)); + for (int i = 0; i < nprocs; i++) { + h5_debug ("num_ghostcells[%d] = %d", i, num_ghostcells[i]); + } + + // allgather ghost cell IDs + int num_ghostcells_total = num_ghostcells[0]; + recvdispls[0] = 0; + for (int i = 1; i < nprocs; i++) { + recvdispls[i] = num_ghostcells_total; + num_ghostcells_total += num_ghostcells[i]; + } + h5_glb_id_t* ghostcells; + TRY (ghostcells = h5_calloc (num_ghostcells_total, sizeof(*ghostcells))); + TRY (mpi_allgatherv ( + loc_ghostcell_ids->items, (int)loc_ghostcell_ids->num_items, + MPI_LONG_LONG, + ghostcells, num_ghostcells, recvdispls, + MPI_LONG_LONG, + m->f->props.comm)); + + for (int i = 0; i < num_ghostcells_total; i++) { + h5_debug ("ghostcells[%d] = %lld", i, ghostcells[i]); + } + + // scatter my border cells + // - count and collect border cells we have to scatter + h5_loc_idxlist_t** belem_lists; + TRY (belem_lists = h5_calloc (nprocs, sizeof (*belem_lists))); + h5_loc_idx_t num_elems_to_scatter_total = 0; + for (int proc = 0; proc < nprocs; proc++) { + h5_loc_idxlist_t** list = &belem_lists[proc]; + h5_loc_idx_t last = recvdispls[proc] + num_ghostcells[proc] - 1; + for (int i = recvdispls[proc]; i <= last; i++) { + // is cell with ID local? + h5_loc_idx_t idx; + idx = h5priv_search_idxmap (&m->map_elem_g2l, ghostcells[i]); + if (idx >= 0) { + // yes: we have to send this cell to proc + // add to collection + TRY (h5priv_insert_into_loc_idxlist (list, idx, -1)); + num_elems_to_scatter_total++; + } + } + } + TRY (h5_free (num_ghostcells)); + TRY (h5_free (ghostcells)); + + // - allocate memory for border cells we have to scatter + h5_glb_elem_t* sendbuf; + TRY (sendbuf = h5tpriv_alloc_glb_elems (m, num_elems_to_scatter_total)); + + // - setup send buffer + for (int sendidx = 0, proc = 0; proc < nprocs; proc++) { + h5_loc_idxlist_t* list = belem_lists[proc]; + if (list) { + sendcounts[proc] = list->num_items; + senddispls[proc] = sendidx; + for (size_t i = 0; i < list->num_items; i++, sendidx++) { + // copy glb cell at list->item[i] to sendbuf + h5tpriv_copy_glb_elems ( + m, + sendbuf, sendidx, + glb_elems, + list->items[i], + 1); + } + TRY (h5_free (list)); + } else { // nothing to to for this proc + sendcounts[proc] = 0; + senddispls[proc] = sendidx; + } + } + TRY (h5_free (belem_lists)); + + // - scatter send counts + TRY (h5priv_mpi_alltoall ( + sendcounts, 1, MPI_INT, + recvcounts, 1, MPI_INT, + m->f->props.comm)); + + // compute receive displacements and number of local ghost cells + recvdispls[0] = 0; + for (int proc = 0; proc < nprocs-1; proc++) { + recvdispls[proc+1] = recvdispls[proc] + recvcounts[proc]; + } + int num_loc_ghost_elems = recvdispls[nprocs-1] + recvcounts[nprocs-1]; + + // - scatter ghost cells alltoall + h5_glb_elem_t* recvbuf; + TRY (recvbuf = h5tpriv_alloc_glb_elems (m, num_loc_ghost_elems)); + MPI_Datatype type = h5tpriv_get_mpi_type_of_glb_elem (m); + + TRY (h5priv_mpi_alltoallv ( + sendbuf, sendcounts, senddispls, type, + recvbuf, recvcounts, recvdispls, type, + m->f->props.comm)); + + for (int i = 0; i < num_loc_ghost_elems; i++) { + h5_debug ("global ghost cell ID[%d]: %lld", + i, h5tpriv_get_glb_elem_idx (m, recvbuf, i)); + } + TRY (h5_free (sendbuf)); + + TRY (h5_free (sendcounts)); + TRY (h5_free (senddispls)); + TRY (h5_free (recvcounts)); + TRY (h5_free (recvdispls)); + + *ghost_elems = recvbuf; + *num_ghost_elems = num_loc_ghost_elems; + H5_PRIV_API_RETURN (H5_SUCCESS); +} + + +h5_err_t +h5tpriv_read_mesh ( + h5t_mesh_t* const m + ) { + H5_PRIV_API_ENTER (h5_err_t, "m=%p", m); + h5_glb_elem_t* glb_elems; + TRY (part_kway (m, &glb_elems)); + h5_loc_idx_t num_interior_elems = m->num_interior_elems[0]; + + // add interior elements to global -> local index map + TRY (h5tpriv_init_map_elem_g2l (m, glb_elems, num_interior_elems)); + + // gather ghost cells + h5_glb_elem_t* ghost_elems; + size_t num_ghost_elems; + TRY (exchange_ghost_cells (m, glb_elems, &ghost_elems, &num_ghost_elems)); + m->num_ghost_elems[0] = num_ghost_elems; + + // add ghost cells to global -> local index map + TRY (h5tpriv_init_map_elem_g2l (m, ghost_elems, num_ghost_elems)); + + // define local indices for all vertices of all local elements + size_t size = num_interior_elems+num_ghost_elems; + TRY (h5priv_new_idxmap (&m->map_vertex_g2l, size+128)); + + h5_idxmap_t* map = &m->map_vertex_g2l; + + /* for the time being we use the hash table only for a fast test + whether a global index has already been added to the map or not. */ + h5_hashtable_t htab; + TRY (h5priv_hcreate ((size << 2) / 3, &htab, + hidxmap_cmp, hidxmap_compute_hval, NULL)); + + int num_vertices = h5tpriv_ref_elem_get_num_vertices (m); + for (size_t idx = 0; idx < num_interior_elems; idx++) { + h5_glb_idx_t* vertices = h5tpriv_get_glb_elem_vertices (m, glb_elems, idx); + for (int i = 0; i < num_vertices; i++) { + // add index temporarly to map ... + map->items[map->num_items] = (h5_idxmap_el_t) {vertices[i], 0}; + // ... and check whether it has already been added + h5_idxmap_el_t* retval; + h5priv_hsearch (&map->items[map->num_items], + H5_ENTER, (void**)&retval, &htab); + if (retval == &map->items[map->num_items]) { + // new entry in hash table thus in map + map->num_items++; + } + } + } + // same for ghost cells + for (size_t idx = 0; idx < num_ghost_elems; idx++) { + h5_glb_idx_t* vertices = h5tpriv_get_glb_elem_vertices (m, ghost_elems, idx); + for (int i = 0; i < num_vertices; i++) { + // add index temporarly to map ... + map->items[map->num_items] = (h5_idxmap_el_t) {vertices[i], 0}; + // ... and check whether it has already been added + h5_idxmap_el_t* retval; + h5priv_hsearch (&map->items[map->num_items], + H5_ENTER, (void**)&retval, &htab); + if (retval == &map->items[map->num_items]) { + // new entry in hash table thus in map + map->num_items++; + } + } + } + TRY (h5priv_hdestroy (&htab)); + h5priv_sort_idxmap (map); + for (h5_loc_idx_t i = 0; i < map->num_items; i++) { + map->items[i].loc_idx = i; + } + TRY (read_vertices (m, map)); + + TRY (h5tpriv_alloc_loc_elems (m, 0, num_interior_elems+num_ghost_elems)); + m->num_loaded_levels = 1; + + TRY (h5tpriv_init_loc_elems_struct (m, glb_elems, 0, num_interior_elems, 0)); + TRY (h5tpriv_init_loc_elems_struct (m, ghost_elems, num_interior_elems, num_ghost_elems, H5_GHOST_ENTITY)); + + TRY (h5_free (glb_elems)); + TRY (h5_free (ghost_elems)); + + TRY (h5tpriv_init_elem_flags (m, 0, num_interior_elems+num_ghost_elems)); + + TRY (h5tpriv_update_internal_structs (m, 0)); + H5_PRIV_API_RETURN (H5_SUCCESS); +} +#else + +// THE SERIAL VERSION ... +h5_err_t +h5tpriv_read_mesh ( + h5t_mesh_t* const m + ) { + H5_PRIV_API_ENTER (h5_err_t, "m=%p", m); + // local and global counts are identical in serial case + for (size_t lvl = 0; lvl < m->num_leaf_levels; lvl++) { + m->num_loc_vertices[lvl] = m->num_glb_vertices[lvl]; + m->num_interior_elems[lvl] = m->num_glb_elems[lvl]; + m->num_interior_leaf_elems[lvl] = m->num_glb_leaf_elems[lvl]; + } + + TRY (read_vertices (m, NULL)); + TRY (h5tpriv_rebuild_map_vertex_g2l (m, 0, m->num_leaf_levels-1)); + + h5_loc_idx_t num_interior_elems = m->num_interior_elems[m->num_leaf_levels-1]; + h5_glb_elem_t* glb_elems; + TRY (glb_elems = h5tpriv_alloc_glb_elems (m, num_interior_elems)); + TRY (read_elems (m, 0, num_interior_elems, glb_elems)); + TRY (h5tpriv_alloc_loc_elems (m, 0, num_interior_elems)); + m->num_loaded_levels = m->num_leaf_levels; + + TRY (h5tpriv_init_map_elem_g2l (m, glb_elems, num_interior_elems)); + TRY (h5tpriv_init_loc_elems_struct (m, glb_elems, 0, num_interior_elems, 0, NULL)); + TRY (h5tpriv_update_internal_structs (m, 0)); + TRY (h5tpriv_init_elem_flags (m, 0, num_interior_elems)); + TRY (h5_free (glb_elems)); + + H5_PRIV_API_RETURN (H5_SUCCESS); +} +#endif +#ifdef PARALLEL_IO +static h5_err_t +read_octree ( + h5t_mesh_t* m + ) { + H5_PRIV_FUNC_ENTER (h5_err_t, "m=%p", m); + hid_t dset_id, dset_id2; + TRY (dset_id = hdf5_open_dataset (m->mesh_gid, m->dsinfo_octree.name)); + hid_t mspace_id = H5S_ALL; + hid_t dspace_id = H5S_ALL; + + + int oct_size = -1; + int maxpoints = -1; + int size_userdata = -1; + h5_float64_t bounding_box[6]; + TRY (h5priv_read_attrib ( + m->mesh_gid, + "__curr_oct_idx__", + H5_INT32_T, + &oct_size)); + TRY (h5priv_read_attrib ( + m->mesh_gid, + "__oct_maxpoints__", + H5_INT32_T, + &maxpoints)); + TRY (h5priv_read_attrib ( + m->mesh_gid, + "__oct_size_userdata__", + H5_INT32_T, + &size_userdata)); + TRY (h5priv_read_attrib ( + m->mesh_gid, + "__oct_bounding_box__", + H5_FLOAT64_T, + bounding_box)) + h5t_octant_t* octants; + h5t_oct_userdata_t* userdata; + TRY (H5t_read_octree ( + &m->octree, + oct_size, + size_userdata, + maxpoints, + &octants, + (void **) &userdata, + m->f->props->comm)); + TRY (H5t_set_bounding_box (m->octree, bounding_box)); + TRY (h5priv_start_throttle (m->f)); + + TRY (hdf5_read_dataset ( + dset_id, + m->dsinfo_octree.type_id, + mspace_id, + dspace_id, + m->f->props->xfer_prop, + octants)); + + if (size_userdata > 0) { + TRY (dset_id2 = hdf5_open_dataset (m->mesh_gid, m->dsinfo_userdata.name)); + TRY (hdf5_read_dataset ( + dset_id2, + m->dsinfo_userdata.type_id, + mspace_id, + dspace_id, + m->f->props->xfer_prop, + userdata)); + TRY (hdf5_close_dataset (dset_id2)); + } + TRY (h5priv_end_throttle (m->f)); + + + TRY (hdf5_close_dataspace (dspace_id)); + TRY (hdf5_close_dataspace (mspace_id)); + TRY (hdf5_close_dataset (dset_id)); + + + + H5_PRIV_FUNC_RETURN (H5_SUCCESS); +} +static h5_err_t +read_weights ( + h5t_mesh_t* m + ) { + H5_PRIV_FUNC_ENTER (h5_err_t, "m=%p", m); + hid_t dset_id; + TRY (dset_id = hdf5_open_dataset (m->mesh_gid, m->dsinfo_weights.name)); + hid_t mspace_id = H5S_ALL; + hid_t dspace_id = H5S_ALL; + + + TRY (h5priv_read_attrib ( + m->mesh_gid, + "__num_weights__", + H5_INT32_T, + &m->num_weights)); + TRY (m->weights = h5_calloc (m->num_weights * m->num_glb_elems[m->num_leaf_levels-1], sizeof (*m->weights))); + if (m->num_weights < 1) { + m->weights = NULL; + } + TRY (h5priv_start_throttle (m->f)); + + TRY (hdf5_read_dataset ( + dset_id, + m->dsinfo_weights.type_id, + mspace_id, + dspace_id, + m->f->props->xfer_prop, + m->weights)); + TRY (h5priv_end_throttle (m->f)); + + // check that weights are > 0 + for (h5_glb_idx_t i = 0; i < m->num_weights * m->num_glb_elems[m->num_leaf_levels-1]; i++) { + if (m->weights[i] < 1) { + h5_debug ("Warning: weight %d from elem %lld was %d ", (int) i%m->num_weights, (long long int) i/m->num_weights, m->weights[i]); + m->weights[i] = 1; + + } + } + + TRY (hdf5_close_dataspace (dspace_id)); + TRY (hdf5_close_dataspace (mspace_id)); + TRY (hdf5_close_dataset (dset_id)); + H5_PRIV_FUNC_RETURN (H5_SUCCESS); +} + +static h5_err_t +read_chunks ( + h5t_mesh_t* m + ) { + H5_PRIV_FUNC_ENTER (h5_err_t, "m=%p", m); + hid_t dset_id; + TRY (dset_id = hdf5_open_dataset (m->mesh_gid, m->dsinfo_chunks.name)); + hid_t mspace_id = H5S_ALL; + hid_t dspace_id = H5S_ALL; + + TRY (m->chunks = h5_calloc (1, sizeof (*m->chunks))); + TRY (h5priv_read_attrib ( + m->mesh_gid, + "__num_chunks__", + H5_INT32_T, + &m->chunks->num_alloc)); + m->chunks->curr_idx = m->chunks->num_alloc -1; + TRY (h5priv_read_attrib ( + m->mesh_gid, + "__num_chk_levels__", + H5_INT16_T, + &m->chunks->num_levels)); + + TRY (m->chunks->num_chunks_p_level = h5_calloc (m->chunks->num_levels, sizeof (*m->chunks->num_chunks_p_level))); + + TRY (h5priv_read_attrib ( + m->mesh_gid, + "__num_chk_p_level__", + H5_INT32_T, + m->chunks->num_chunks_p_level)); + TRY (m->chunks->chunks = h5_calloc (m->chunks->num_alloc, sizeof (*m->chunks->chunks))); + + TRY (h5priv_start_throttle (m->f)); + + TRY (hdf5_read_dataset ( + dset_id, + m->dsinfo_chunks.type_id, + mspace_id, + dspace_id, + m->f->props->xfer_prop, + m->chunks->chunks)); + TRY (h5priv_end_throttle (m->f)); + + + TRY (hdf5_close_dataspace (dspace_id)); + TRY (hdf5_close_dataspace (mspace_id)); + TRY (hdf5_close_dataset (dset_id)); + + H5_PRIV_FUNC_RETURN (H5_SUCCESS); +} + +/* + * get weights of octant (i.e. of all elements that belong to a chunk that belongs to the octant or its parents) + * for parent octants a factor is used. therefore the weight of an octant is divided equally onto it's children + */ + +static h5_err_t +get_weights_of_octant ( + h5t_mesh_t* const m, + h5t_octree_t* octree, + h5_oct_idx_t oct_idx, + double factor, + idx_t* weights + ) { + H5_PRIV_FUNC_ENTER (h5_err_t, "m=%p, octree=%p, oct_idx=%d, factor=%4.4f, weights=%p", + m, octree, oct_idx, factor, weights); + + h5t_oct_userdata_t* userdata = NULL; + + TRY (H5t_get_userdata_r (octree, oct_idx, (void**) &userdata)); + for (int i = 0; i < MAX_CHUNKS_PER_OCTANT; i++) { // iterate through all chunks in octant + if (userdata->idx[i] != -1) { + h5_chk_idx_t chk_idx = userdata->idx[i]; + h5_glb_idx_t first_elem = m->chunks->chunks[chk_idx].elem; + h5_glb_idx_t num_elems = m->chunks->chunks[chk_idx].num_elems; + // iterate through all elements in chunk + for (h5_glb_idx_t j = first_elem; j < first_elem + num_elems; j++) { + for (h5_weight_t k = 0; k < m->num_weights; k++) { + weights[k] += (h5_weight_t) (m->weights[j * m->num_weights + k] * factor); + } + } + + } + } // add weights of parents proportionally + while ((oct_idx = H5t_get_parent (octree, oct_idx)) != -1) { + TRY (get_weights_of_octant (m, octree, oct_idx, factor/((double) NUM_OCTANTS), weights)); + } + H5_PRIV_FUNC_RETURN (H5_SUCCESS); +} + +h5_err_t +calc_weights_oct_leaflevel ( + h5t_mesh_t* const m, + idx_t** weights, + h5_oct_idx_t** new_numbering, + h5_oct_idx_t* num_tot_leaf_oct + ) { + H5_PRIV_FUNC_ENTER (h5_err_t, "m=%p, weights=%p, new_numbering=%p", m, weights, new_numbering); + int size = m->f->nprocs; + int rank = m->f->myproc; + + // get number of leaf octants + + TRY (*num_tot_leaf_oct = H5t_get_num_oct_leaflevel (m->octree)); + int counter = 0; + TRY (*new_numbering = h5_calloc (*num_tot_leaf_oct + 1 , sizeof (h5_oct_idx_t))); + + // get range per core + h5_oct_idx_t my_first_octant = -1; + h5_oct_idx_t num_leaf_octants = -1; + num_leaf_octants = *num_tot_leaf_oct / size; + if (rank < (*num_tot_leaf_oct % size)) { + num_leaf_octants++; + } + my_first_octant = (*num_tot_leaf_oct / size) * rank; + if (rank < (*num_tot_leaf_oct % size)) { + my_first_octant += rank; + } else { + my_first_octant += (*num_tot_leaf_oct % size); + } + // iterate through level and get weights + h5t_oct_iterator_t* iter = NULL; + TRY (H5t_init_oct_iterator (m->octree, &iter, m->leaf_level)); + for (int i = 0; i < my_first_octant; i++) { + TRY ((*new_numbering)[counter] = H5t_iterate_oct (iter)); + counter++; + } + TRY (*weights = h5_calloc (num_leaf_octants * m->num_weights, sizeof (**weights))); + idx_t* weights_p = *weights; + h5_oct_idx_t curr_oct_idx = -1; + for (int i = 0; i < num_leaf_octants; i++) { + TRY (curr_oct_idx = H5t_iterate_oct (iter)); + (*new_numbering)[counter] = curr_oct_idx; + counter++; + TRY (get_weights_of_octant (m, m->octree, curr_oct_idx, 1, &weights_p[i * m->num_weights])); + + // make sure weights are at least 1 + for (int j = 0;j < m->num_weights; j++) { + if (weights_p[i * m->num_weights + j] < 1) { + weights_p[i * m->num_weights + j] = 1; + } + } + } + while (((*new_numbering)[counter] = H5t_iterate_oct (iter)) != -1) { + counter++; + } + H5t_end_iterate_oct (iter); + + + H5_PRIV_FUNC_RETURN (H5_SUCCESS); +} +h5_err_t +distribute_octree_parmetis ( + h5t_mesh_t* const m, + idx_t* weights, + h5_oct_idx_t* new_numbering, + h5_oct_idx_t num_tot_leaf_oct + ) { + H5_PRIV_FUNC_ENTER (h5_err_t, "m=%p, weights=%p, new_numbering=%p", m, weights, new_numbering); + + if (num_tot_leaf_oct < m->f->nprocs) { + h5_debug ("Number of leaf octants %d is smaller then number of procs %d ",num_tot_leaf_oct, m->f->nprocs); + assert (num_tot_leaf_oct > m->f->nprocs); + } + + // compute initial distribution of cells on all procs + int n = num_tot_leaf_oct / m->f->nprocs; + int r = num_tot_leaf_oct % m->f->nprocs; + + idx_t* vtxdist = NULL; + idx_t* glb_part = NULL; + + TRY (vtxdist = h5_calloc (m->f->nprocs+1, sizeof (*vtxdist))); + vtxdist[0] = 0; +#if !defined(NDEBUG) + if (h5_debug_level & (1<<5) ) { + h5_debug ("vtxdist[%d]: %d", 0, 0); + } +#endif + for (int i = 1; i < m->f->nprocs+1; i++) { + if (r > 0) { + vtxdist[i] = vtxdist[i-1] + n + 1; + r--; + } else { + vtxdist[i] = vtxdist[i-1] + n; + } +#if !defined(NDEBUG) + if (h5_debug_level & (1<<5) ) { + h5_debug ("vtxdist[%d]: %d", i, vtxdist[i]); + } +#endif + } + TRY (glb_part = h5_calloc (vtxdist[m->f->nprocs], sizeof(*glb_part))); + if (!dont_use_parmetis) { + // // read cells only + idx_t start = vtxdist[m->f->myproc]; + idx_t num_interior_oct = vtxdist[m->f->myproc+1] - start; + + + // setup input for ParMETIS + idx_t* xadj; + idx_t* adjncy; + idx_t* part; + TRY (xadj = h5_calloc (num_interior_oct + 1, sizeof(*xadj))); + TRY (part = h5_calloc (num_interior_oct, sizeof(*part))); + int num_alloc_adj = 4*6*num_interior_oct; + TRY (adjncy = h5_calloc (num_alloc_adj, sizeof(*adjncy))); + + h5_oct_idx_t* neighbors = NULL; + h5_oct_idx_t num_neigh; + h5_oct_idx_t* ancestor_of_neigh = NULL; + h5_oct_idx_t num_anc_of_neigh; + + // plot_octants (m->octree); + idx_t i; + idx_t counter = 0; + for (i = 0; i < num_interior_oct; i++) { + TRY (H5t_get_neighbors (m->octree, new_numbering[start + i], &neighbors, &num_neigh, &ancestor_of_neigh, &num_anc_of_neigh, 1, m->leaf_level)); + if (counter + num_neigh >= num_alloc_adj) { + adjncy = realloc (adjncy, (num_alloc_adj + counter + num_neigh) * sizeof(*adjncy)); // WARNING may alloc too much mem (minimal would be counter + num_neigh) + } + xadj[i+1] = xadj[i] + num_neigh; +#if !defined(NDEBUG) + if (h5_debug_level & (1<<5) ) { + h5_debug ("xadj[%d]: %d", i+1, xadj[i+1]); + } +#endif + for (int k = 0; k < num_neigh; k++) { + int found = 0; + for (int j = 0; j < num_tot_leaf_oct; j++) { + if (new_numbering[j] == neighbors[k]) { + adjncy[counter] = j; +#if !defined(NDEBUG) + if (h5_debug_level & (1<<5) ) { + h5_debug ("adjncy[%d]: %d", counter, adjncy[counter]); + } +#endif + counter++; + found = 1; + } + } + if (found == 0) { + H5_PRIV_FUNC_LEAVE (H5_ERR_INTERNAL); + } + } + } + + + // now we can call the partitioner + idx_t wgtflag = 0; + idx_t numflag = 0; + idx_t ncon = 1; + idx_t* vwgt = NULL; + if (m->num_weights > 0) { + wgtflag = 2; + ncon = m->num_weights; + vwgt = weights; + } + + idx_t nparts = m->f->nprocs; + real_t* tpwgts; + real_t* ubvec; + idx_t options[] = {1,0,42}; + idx_t edgecut; + h5_debug ("nparts: %d", nparts); + TRY (tpwgts = h5_calloc (nparts * ncon, sizeof(*tpwgts))); + TRY (ubvec = h5_calloc (nparts * ncon, sizeof(*ubvec))); + for (i = 0; i < nparts * ncon; i++) { + tpwgts[i] = 1.0 / (real_t)nparts; + ubvec[i] = 1.05; + } + + + int rc = ParMETIS_V3_PartKway ( + vtxdist, + xadj, + adjncy, + vwgt, // vwgt vertex weights + NULL, // adjwgt + &wgtflag, + &numflag, + &ncon, // number of balance constraints + &nparts, + tpwgts, + ubvec, + options, + &edgecut, + part, + &m->f->props->comm + ); + if (rc != METIS_OK) { + H5_PRIV_FUNC_LEAVE( + h5_error (H5_ERR, "ParMETIS failed")); + } + + TRY (h5_free (xadj)); + TRY (h5_free (adjncy)); + TRY (h5_free (tpwgts)); + TRY (h5_free (ubvec)); + +#if !defined(NDEBUG) + if (h5_debug_level & (1<<5) ) { + for (i = 0; i < num_interior_oct; i++) { + h5_debug ("part[%d]: %llu", i, (unsigned long long)part[i]); + } + } +#endif + // instead of updating the whole octree, we just update the new procs locally + // therefore we need the glb_part array + int* recvcounts = NULL; + TRY (recvcounts = h5_calloc (m->f->nprocs, sizeof (*recvcounts))); + for (int i = 0; i < m->f->nprocs; i++) { + recvcounts[i] = vtxdist[i+1]-vtxdist[i]; + } + + TRY (h5priv_mpi_allgatherv (part, + num_interior_oct, + MPI_INT, + glb_part, + recvcounts, + vtxdist, + MPI_INT, + m->f->props->comm)); + TRY (h5_free (part)); + } + if (dont_use_parmetis == 1 ) { // not use parmetis and just distribute octants with morton ordering + int curr_proc = 0; + for (int i = 0; i < vtxdist[m->f->nprocs]; i++) { + while(i >= vtxdist[curr_proc +1]) { + curr_proc++; + } + glb_part[i] = curr_proc; + } + + } + if (dont_use_parmetis == 2) { // distribute geometrically in slices acc to preferred direction. + assert (preferred_direction > -1 && preferred_direction <3); + // calculate slices + h5_float64_t* bb = H5t_get_bounding_box(m->octree); + h5_float64_t glb_min = bb[preferred_direction]; + h5_float64_t glb_max = bb[preferred_direction + 3]; + h5_float64_t slice_length = (glb_max - glb_min) / (h5_float64_t)m->f->nprocs; + h5_float64_t newbb[6]; + // iterate through leave level octants and decide to whom they belong + // WARING this could be more efficient if every proc would take care of + // num_leaf_oct/nproc octants and exchange results + for (int i = 0; i < vtxdist[m->f->nprocs]; i++) { + h5_oct_idx_t oct_idx = new_numbering[i]; + + TRY (H5t_get_bounding_box_of_octant (m->octree, oct_idx, newbb)); + h5_float64_t loc_min = newbb[preferred_direction]; + h5_float64_t loc_max = newbb[preferred_direction + 3]; + h5_float64_t loc_mid = (loc_min + loc_max) / 2.0; + glb_part[i] = (int) ((loc_mid - glb_min)/slice_length); + +// int lower_slice = (int) ((loc_min-glb_min)/slice_length); +// int higher_slice = (int) ((loc_max-glb_min)/slice_length); +// if (!(lower_slice == higher_slice || lower_slice + 1 == higher_slice)) { +// printf (" glb_min %4.4f glb_max %4.4f slice_length %4.4f loc_min %4.4f loc_max %4.4f lower_slice %d higher_slice %d", +// glb_min, glb_max, slice_length, loc_min, loc_max, lower_slice, higher_slice); +// +// assert (lower_slice == higher_slice || lower_slice + 1 == higher_slice); +// +// } +// if (lower_slice == higher_slice) { +// glb_part[i] = lower_slice; +// } else if ( higher_slice *slice_length - (loc_min - glb_min) >= (loc_max-glb_min) - higher_slice *slice_length) { +// // belongs to lower_slice +// glb_part[i] = lower_slice; +// +// } else {// belongs to higher_slice +// glb_part[i] = higher_slice; +// } + + } + } + assert (dont_use_parmetis > -1 && dont_use_parmetis <3); + + for (int i = 0; i < vtxdist[m->f->nprocs]; i++) { + h5_oct_idx_t oct_idx = new_numbering[i]; + TRY (H5t_set_proc_int (m->octree, oct_idx, glb_part[i])); + h5_oct_idx_t parent = oct_idx; + while ((parent = H5t_get_parent (m->octree, parent)) != -1) { + if (H5t_get_children(m->octree, parent) == oct_idx) { + // oct_idx is the first children - so set the proc of the parent to the same as the oct_idx + TRY (H5t_set_proc_int (m->octree, parent, glb_part[i])); + oct_idx = parent; + } else { + // nothing further to do + break; + } + } + + } + + TRY (H5t_update_internal (m->octree)); //should not be necessary anymore but doesn't matter since it just checks if update is necessary + TRY (h5_free (vtxdist)); + + TRY (h5_free (glb_part)); + H5_PRIV_FUNC_RETURN (H5_SUCCESS); +} + +h5_err_t +add_oct_children_to_list ( + h5t_mesh_t* const m, + h5_loc_idxlist_t** oct_list, + h5_oct_idx_t oct_idx) { + H5_PRIV_FUNC_ENTER (h5_err_t, "m=%p list=%p, oct_idx=%d", m, oct_list, oct_idx); + assert (oct_idx > 0); // otherwise we add the whole octree! + h5_oct_idx_t children = H5t_get_children (m->octree, oct_idx); + if (children == -1 ) { + H5_PRIV_FUNC_LEAVE (H5_SUCCESS); + } + // get siblings + h5_oct_idx_t sibling_idx = H5t_get_sibling (m->octree, children); + for (int i = 0; i < NUM_OCTANTS; i++) { + h5priv_search_in_loc_idxlist(oct_list,(h5_loc_idx_t) sibling_idx + i); + TRY (add_oct_children_to_list (m, oct_list,(h5_loc_idx_t) sibling_idx + i)); // TODO it may could be faster to do this + // is a second loop because adding elems just after each other could be beneficial -> maybe extend + // insert to multiple insert... + } + + + H5_PRIV_FUNC_RETURN (H5_SUCCESS); +} + + +//h5_err_t +//h5tpriv_get_list_of_chunks_to_read ( +// h5t_mesh_t* const m, +// h5_chk_idx_t** list, +// int* counter +// ) { +// H5_PRIV_FUNC_ENTER (h5_err_t, "m=%p list=%p, counter=%p", m, list, counter); +// +// int rank = m->f->myproc; +// int size_list = m->chunks->curr_idx + 1; +// TRY ( *list = h5_calloc (size_list + 1, sizeof (**list))); // +1 to be on save side for accesses +// *counter = 0; +// +// // go through octree level, get own chunks and parent chunks +// h5t_oct_iterator_t* iter = NULL; +// TRY (H5t_init_oct_iterator (m->octree, &iter, m->leaf_level)); +// +// h5_oct_idx_t oct_idx = -1; +// while ((oct_idx = H5t_iterate_oct (iter)) != -1) { +// if (H5t_get_proc (m->octree, oct_idx) == rank) { +// add_chunk_to_list (m, *list, counter, oct_idx); +// h5_oct_idx_t parent = oct_idx; +// // add parent chunks +// while ((parent = H5t_get_parent (m->octree, parent)) != -1) { +// add_chunk_to_list (m, *list, counter, parent); +// } +// h5_oct_idx_t* neigh = NULL; +// h5_oct_idx_t* anc = NULL; +// h5_oct_idx_t num_neigh = 0; +// h5_oct_idx_t num_anc = 0; +// +// // get neighboring chunks as well +// TRY (H5t_get_neighbors ( +// m->octree, +// oct_idx, +// &neigh, +// &num_neigh, +// &anc, +// &num_anc, +// 3, +// m->leaf_level)); +// for (int i = 0; i < num_neigh; i++) { +// add_chunk_to_list (m, *list, counter, neigh[i]); +// } +// for (int i = 0; i < num_anc; i++) { +// add_chunk_to_list (m, *list, counter, anc[i]); +// // TODO get all children of ancestor on level 1 and ad them as well +// } +// } +// } +// +// TRY (H5t_end_iterate_oct (iter)); +// if (size_list < *counter) { +// h5_debug ("Overflow of list_of_chunks"); +// H5_PRIV_FUNC_LEAVE (H5_ERR_INTERNAL); +// } +// qsort (*list, *counter, sizeof (**list), compare_chk_idx); +// H5_PRIV_FUNC_RETURN (H5_SUCCESS); +//} +/* + Idea: we need to get all octants that belong to this proc including all their parent and children. + (octants that dont have a userlevel should not be added) + This gives us a a domain per proc (which will probably already overlap somewhat). + Concerning the neighbors: we need to get all the neighbors (of the domain) on level 0 and all their children. + */ +h5_err_t +h5tpriv_get_list_of_chunks_to_read ( + h5t_mesh_t* const m, + h5_chk_idx_t** list, + int* counter + ) { + H5_PRIV_FUNC_ENTER (h5_err_t, "m=%p list=%p, counter=%p", m, list, counter); + int rank = m->f->myproc; + int size_list = m->chunks->curr_idx + 1; + TRY ( *list = h5_calloc (size_list + 1, sizeof (**list))); // +1 to be on save side for accesses + h5_loc_idxlist_t* loc_list = NULL; + TRY (h5priv_alloc_loc_idxlist (&loc_list, size_list+1)); + *counter = 0; + + //WARNING works only if oct_idx = loc_idx + h5_loc_idxlist_t* oct_list = NULL; + TRY (h5priv_alloc_loc_idxlist (&oct_list, H5t_get_num_octants (m->octree)* 2 /m->f->nprocs)); + // go through octree level, get own chunks and parent chunks + h5t_oct_iterator_t* iter = NULL; + for (int i = 0; i < m->num_leaf_levels; i++) { + TRY (H5t_init_oct_iterator (m->octree, &iter, i)); + + // get all octants that belong to this proc + h5_oct_idx_t oct_idx = -1; + while ((oct_idx = H5t_iterate_oct (iter)) != -1) { + if (H5t_get_proc (m->octree, oct_idx) == rank) { + h5priv_search_in_loc_idxlist(&oct_list, (h5_loc_idx_t)oct_idx); + h5_oct_idx_t parent = oct_idx; + // add parent chunks + while ((parent = H5t_get_parent (m->octree, parent)) != -1) { + h5_oct_idx_t parent_idx = -1; + if (H5t_get_userlevel(m->octree, parent) == 0) { + // check if there are any parents that still have a level. + parent_idx = parent; + while ((parent_idx = H5t_get_parent (m->octree, parent_idx)) != -1) { + if (H5t_get_userlevel(m->octree, parent) != 0) { + break; // parent_idx still has a level -> so need parent needs to be added + } + } + if (parent_idx == -1) { + break; // parent_idx is -1 so all parents don't have a level anymore -> don't add + } + } + if (parent_idx != -1) { + h5priv_search_in_loc_idxlist(&oct_list, (h5_loc_idx_t)parent); + } + } + // add children + TRY (add_oct_children_to_list (m, &oct_list, (h5_loc_idx_t)oct_idx)); + } + + } + } + TRY (H5t_end_iterate_oct (iter)); + // get all neighbors + //WARNING works only if oct_idx = loc_idx + h5_loc_idxlist_t* neigh_oct_list = NULL; + TRY (h5priv_alloc_loc_idxlist (&neigh_oct_list, H5t_get_num_octants (m->octree)* 2 /m->f->nprocs)); + h5_oct_idx_t* neigh = NULL; + h5_oct_idx_t* anc = NULL; + for (int i = 0; i < oct_list->num_items; i++) { + + h5_oct_idx_t num_neigh = 0; + h5_oct_idx_t num_anc = 0; + + if ((H5t_get_userlevel (m->octree,(h5_oct_idx_t) oct_list->items[i]) & 1) == 1) { + // get neighbors + TRY (H5t_get_neighbors ( + m->octree, + (h5_oct_idx_t) oct_list->items[i], + &neigh, + &num_neigh, + &anc, + &num_anc, + 3, + 0)); + } + // TODO avoid any that have no level themselfs and above! + for (int i = 0; i < num_neigh; i++) { + h5priv_search_in_loc_idxlist(&neigh_oct_list, (h5_loc_idx_t)neigh[i]); + // add children + TRY (add_oct_children_to_list (m, &neigh_oct_list, (h5_loc_idx_t)neigh[i])); + } +// for (int i = 0; i < num_anc; i++) { +// h5priv_search_in_loc_idxlist(&neigh_oct_list, anc[i]); +// // add children +// TRY (add_oct_children_to_list (m, &neigh_oct_list, anc[i])); +// } + // add octants to chunk_list + add_chunk_to_list (m, &loc_list,(h5_oct_idx_t) oct_list->items[i]); + } + // add neighbors to chunk_list + for (int i = 0; i < neigh_oct_list->num_items; i++) { + add_chunk_to_list (m, &loc_list,(h5_oct_idx_t) neigh_oct_list->items[i]); + } + + for (int i = 0; i < loc_list->num_items; i++) { + (*list)[i] = (h5_chk_idx_t) loc_list->items[i]; + } + *counter = loc_list->num_items; + h5priv_free_loc_idxlist(&loc_list); + + TRY (h5_free (neigh)); + TRY (h5_free (anc)); + TRY (h5priv_free_loc_idxlist (&oct_list)); + TRY (h5priv_free_loc_idxlist (&neigh_oct_list)); + if (size_list < *counter) { + h5_debug ("Overflow of list_of_chunks"); + H5_PRIV_FUNC_LEAVE (H5_ERR_INTERNAL); + } + + H5_PRIV_FUNC_RETURN (H5_SUCCESS); +} + +/* + * returns a list of processors for assigning proc to each element + */ + +h5_err_t +get_list_of_proc ( + h5t_mesh_t* const m, + h5_int32_t* my_procs, + h5_chk_idx_t* list, + int num_chunks + ) { + H5_PRIV_FUNC_ENTER (h5_err_t, "m=%p, my_procs=%p, list=%p", m, my_procs, list); + int counter = 0; + for (int i = 0; i < num_chunks; i++) { + h5_glb_idx_t num = m->chunks->chunks[list[i]].num_elems; + int proc = H5t_get_proc(m->octree, m->chunks->chunks[list[i]].oct_idx); + for (int j = 0; j < num; j++) { + my_procs[counter] = proc; + counter++; + } + } + + + H5_PRIV_FUNC_RETURN (H5_SUCCESS); +} +// for (hsize_t i = 0; i < map->num_items; i++) { +// hsize_t hstart = map->items[i].glb_idx; +// hsize_t hcount = 1; +// while (map->items[i].glb_idx+1 == map->items[i+1].glb_idx && +// i < map->num_items) { +// i++; hcount++; +// } +// TRY (hdf5_select_hyperslab_of_dataspace ( +// dspace_id, +// seloper, +// &hstart, &hstride, &hcount, +// NULL)); +// seloper = H5S_SELECT_OR; +// } +h5_lvl_idx_t +get_level_of_chk_idx ( + h5t_mesh_t* const m, + h5_chk_idx_t chk_idx + ) { + H5_PRIV_FUNC_ENTER (h5_err_t, "m=%p, chk_idx=%d", m, chk_idx); + assert (chk_idx > -1); + int nbr_chunks = m->chunks->num_chunks_p_level[0]; + for (int i = 0; i < m->chunks->num_levels; i++) { + if (chk_idx < nbr_chunks) { + H5_PRIV_FUNC_LEAVE (i); + } else { + if (i+1 < m->chunks->num_levels) { + nbr_chunks += m->chunks->num_chunks_p_level[i + 1]; + } + } + } + H5_PRIV_FUNC_RETURN (-2); + // should be much simpler then that! +// // get oct_idx +// h5_oct_idx_t oct_idx = m->chunks->chunks[chk_idx].oct_idx; +// void* pointer; +// +// TRY (H5t_get_userdata_r (m->octree, oct_idx, &pointer)); //TRY gives unresolved?? +// h5t_oct_userdata_t* userdata = (h5t_oct_userdata_t*)pointer; +// int i = 0; +// for (; i < OCT_USERDATA_SIZE; i++) { +// if (userdata->idx[i] == chk_idx) { +// break; +// } +// } +// if (i >= OCT_USERDATA_SIZE) { +// H5_PRIV_FUNC_LEAVE ( +// h5_error (H5_ERR_INTERNAL, "Chunk %d should be in octant %d but it was not found", chk_idx, oct_idx)); +// } +// +// int position = 0; +// h5_oct_level_t usr_lvl = H5t_get_userlevel (m->octree, oct_idx); +// h5_lvl_idx_t level = -1; +// while (i >= 0) { +// while (position < OCT_USERLEV_LENGTH) { +// if ((usr_lvl & (1 << position)) == (1 << position)) { +// i--; +// break; +// } +// } +// position++; +// } +// +// if (i != -1 || position == OCT_USERLEV_LENGTH) { +// H5_PRIV_FUNC_LEAVE ( +// h5_error (H5_ERR_INTERNAL, "Userlevel in octant %d are not set correctly. Userlevel: %d", oct_idx, usr_lvl)); +// } else { +// level = position - 1; +// } + + +} + +h5_err_t +read_chunked_elements ( + h5t_mesh_t* const m, + h5_glb_elem_t** glb_elems, + h5_int32_t** my_procs + ) { + H5_PRIV_FUNC_ENTER (h5_err_t, "m=%p", m); + // find chunks to read + h5_chk_idx_t* list_of_chunks = NULL; + int num_interior_chunks = 0; + + TRY (h5tpriv_get_list_of_chunks_to_read (m, &list_of_chunks, &num_interior_chunks)); + + + for (int i = 0; i < num_interior_chunks; i++) { + // set number of vertices and elements + h5_lvl_idx_t level = get_level_of_chk_idx (m, list_of_chunks[i]); + assert (level > -1); + m->num_interior_elems[level] += m->chunks->chunks[list_of_chunks[i]].num_elems; + } + m->num_interior_leaf_elems[0] = m->num_interior_elems[0]; + for (int i = 1; i < m->num_leaf_levels; i++) { + m->num_interior_leaf_elems[i] = m->num_interior_leaf_elems[i-1] + + m->num_interior_elems[i] - + m->num_interior_elems[i] / h5tpriv_get_num_new_elems (m); + m->num_interior_elems[i] += m->num_interior_elems[i-1]; + } + int num_interior_elems = m->num_interior_elems[m->num_leaf_levels -1]; + + + TRY (*glb_elems = h5tpriv_alloc_glb_elems (m, num_interior_elems)); + + TRY (*my_procs = h5_calloc (num_interior_elems, sizeof (**my_procs))); + + // get list of proc to assign to each element + TRY (get_list_of_proc (m, *my_procs, list_of_chunks, num_interior_chunks)); + + hid_t dset_id; + TRY (dset_id = hdf5_open_dataset (m->mesh_gid, m->dsinfo_elems.name)); + hid_t mspace_id; + + // create memspace + hsize_t hcount = (hsize_t) num_interior_elems; + TRY (mspace_id = hdf5_create_dataspace (1, &hcount, NULL)); + + //create dspace + hid_t dspace_id; + H5S_seloper_t seloper = H5S_SELECT_SET; // first selection + hsize_t hstride = 1; + hsize_t num_glb_elems = m->num_glb_elems[m->num_leaf_levels-1]; + TRY (dspace_id = hdf5_create_dataspace (1, &num_glb_elems, NULL)); + hsize_t hstart = -1; + m->dsinfo_elems.dims[0] = num_interior_elems; + + for (hsize_t i = 0; i < num_interior_chunks; i++) { + hstart = (hsize_t)m->chunks->chunks[list_of_chunks[i]].elem; + hcount = (hsize_t)m->chunks->chunks[list_of_chunks[i]].num_elems; + while (i + 1 < num_interior_chunks && + hstart + hcount == m->chunks->chunks[list_of_chunks[i+1]].elem) { // WARNING make sure list has one free element in the back otherwise seg fault + hcount += (hsize_t)m->chunks->chunks[list_of_chunks[i+1]].num_elems; + i++; + } + TRY (hdf5_select_hyperslab_of_dataspace ( + dspace_id, + seloper, + &hstart, &hstride, &hcount, + NULL)); + seloper = H5S_SELECT_OR; + } + +#ifdef PARALLEL_IO + TRY (h5priv_start_throttle (m->f)); +#endif + TRY (hdf5_read_dataset ( + dset_id, + m->dsinfo_elems.type_id, + mspace_id, + dspace_id, + m->f->props->xfer_prop, + *glb_elems)); +#ifdef PARALLEL_IO + TRY (h5priv_end_throttle (m->f)); +#endif + TRY (hdf5_close_dataspace (dspace_id)); + TRY (hdf5_close_dataspace (mspace_id)); + TRY (hdf5_close_dataset (dset_id)); + + +#if NDEBUG == 0 + if (h5_debug_level & (1<<6) ) { + sleep (m->f->myproc*2); + for (int i = 0; i < num_interior_elems;i++) { + h5_debug ("\n" + "[proc %d] D: ELEM\n" + "[proc %d] D: idx: %d \n" + "[proc %d] D: parent_idx: %d \n" + "[proc %d] D: child_idx: %d \n" + "[proc %d] D: level_idx: %d \n" + "[proc %d] D: refinement: %d \n" + "[proc %d] D: flags: %d \n" + "[proc %d] D: indices: %d %d %d\n" + "[proc %d] D: neigh_indi: %d %d %d\n\n",m->f->myproc, + m->f->myproc, (int)((h5_glb_tri_t*)(*glb_elems))[i].idx, + m->f->myproc, (int)((h5_glb_tri_t*)(*glb_elems))[i].parent_idx, + m->f->myproc, (int)((h5_glb_tri_t*)(*glb_elems))[i].child_idx, + m->f->myproc, (int)((h5_glb_tri_t*)(*glb_elems))[i].level_idx, + m->f->myproc, (int)((h5_glb_tri_t*)(*glb_elems))[i].refinement, + m->f->myproc, (int)((h5_glb_tri_t*)(*glb_elems))[i].flags, + m->f->myproc, (int)((h5_glb_tri_t*)(*glb_elems))[i].vertex_indices[0], + (int)((h5_glb_tri_t*)(*glb_elems))[i].vertex_indices[1], + (int)((h5_glb_tri_t*)(*glb_elems))[i].vertex_indices[2], + m->f->myproc, (int)((h5_glb_tri_t*)(*glb_elems))[i].neighbor_indices[0], + (int)((h5_glb_tri_t*)(*glb_elems))[i].neighbor_indices[1], + (int)((h5_glb_tri_t*)(*glb_elems))[i].neighbor_indices[2]); + } + } + +#endif + + + H5_PRIV_FUNC_RETURN (H5_SUCCESS); +} + +#endif +// The chunked version +h5_err_t +h5tpriv_read_chunked_mesh ( + h5t_mesh_t* const m + ) { + H5_PRIV_API_ENTER (h5_err_t, "m=%p", m); +#ifdef PARALLEL_IO + + TRY (read_octree (m)); + TRY (h5priv_mpi_barrier (m->f->props->comm)); + m->timing.measure[m->timing.next_time++] = MPI_Wtime(); + TRY (read_chunks (m)); + TRY (h5priv_mpi_barrier (m->f->props->comm)); + m->timing.measure[m->timing.next_time++] = MPI_Wtime(); + if (m->num_weights > 0) { + TRY (read_weights (m)); + } else { + m->weights = NULL; + } + TRY (h5priv_mpi_barrier (m->f->props->comm)); + m->timing.measure[m->timing.next_time++] = MPI_Wtime(); +// if (m->f->myproc == 0) { +// plot_leaf_octants(m->octree); +// sleep (30); +// } else { +// sleep (30); +// } + h5_oct_idx_t* new_numbering = NULL; + idx_t* weights = NULL; + h5_oct_idx_t num_tot_leaf_oct = -1; + TRY (calc_weights_oct_leaflevel (m, &weights, &new_numbering, &num_tot_leaf_oct)); + + TRY (distribute_octree_parmetis (m, weights, new_numbering, num_tot_leaf_oct)); + TRY (h5_free (weights)); + + TRY (h5priv_mpi_barrier (m->f->props->comm)); + m->timing.measure[m->timing.next_time++] = MPI_Wtime(); + + h5_glb_elem_t* glb_elems; + h5_int32_t* my_procs; + TRY (read_chunked_elements (m, &glb_elems, &my_procs)); + + TRY (h5priv_mpi_barrier (m->f->props->comm)); + m->timing.measure[m->timing.next_time++] = MPI_Wtime(); + + h5_loc_idx_t num_interior_elems = m->num_interior_elems[m->leaf_level]; + // add interior elements to global -> local index map + TRY (h5tpriv_init_map_elem_g2l (m, glb_elems, num_interior_elems)); + + TRY (h5tpriv_alloc_loc_elems (m, 0, num_interior_elems)); + m->num_loaded_levels = m->num_leaf_levels; + + // define local indices for all vertices of all local elements + size_t size = m->num_interior_elems[m->leaf_level] *4 + 128; // TODO do we know smth about how many vtx? + TRY (h5priv_new_idxmap (&m->map_vertex_g2l, size)); + + h5_idxmap_t* map = &m->map_vertex_g2l; + + /* for the time being we use the hash table only for a fast test + whether a global index has already been added to the map or not. */ + h5_hashtable_t htab; + TRY (h5priv_hcreate ((size << 2) / 3, &htab, + hidxmap_cmp, hidxmap_compute_hval, NULL)); + + int num_vertices = h5tpriv_ref_elem_get_num_vertices (m); + for (size_t idx = 0; idx < num_interior_elems; idx++) { + h5_glb_idx_t* vertices = h5tpriv_get_glb_elem_vertices (m, glb_elems, idx); + + for (int i = 0; i < num_vertices; i++) { + // add index temporarly to map ... + map->items[map->num_items] = (h5_idxmap_el_t) {vertices[i], 0}; + // ... and check whether it has already been added + h5_idxmap_el_t* retval = NULL; + h5priv_hsearch (&map->items[map->num_items], + H5_ENTER, (void**)&retval, &htab); + if (retval == &map->items[map->num_items]) { + // new entry in hash table thus in map + map->num_items++; + h5_lvl_idx_t level = h5tpriv_get_glb_elem_level (m, glb_elems, idx); + m->num_loc_vertices[level]++; + } + } + } + TRY (h5priv_hdestroy (&htab)); + + for (int i = 1; i < m->num_leaf_levels; i++) { + m->num_loc_vertices[i] += m->num_loc_vertices[i-1]; + } + + h5priv_sort_idxmap (map); + for (h5_loc_idx_t i = 0; i < map->num_items; i++) { + map->items[i].loc_idx = i; + } + TRY (read_vertices (m, map)); + + TRY (h5priv_mpi_barrier (m->f->props->comm)); + m->timing.measure[m->timing.next_time++] = MPI_Wtime(); + + m->num_loaded_levels = m->num_leaf_levels; + // calculate which elem belongs to which proc + TRY (h5tpriv_init_loc_elems_struct (m, glb_elems, 0, num_interior_elems, 0, my_procs)); + TRY (h5tpriv_init_elem_flags (m, 0, num_interior_elems)); + + TRY (h5tpriv_update_internal_structs (m, 0)); //TODO check if that should be 0 or m->leaf_level + TRY (h5_free (glb_elems)); + + TRY (h5priv_mpi_barrier (m->f->props->comm)); + m->timing.measure[m->timing.next_time++] = MPI_Wtime(); +#endif + H5_PRIV_API_RETURN (H5_SUCCESS); +} + + + +static int +cmp_glb_idx ( + const void* x, + const void* y + ) { + if (*(h5_glb_idx_t*)x < *(h5_glb_idx_t*)y) return -1; + if (*(h5_glb_idx_t*)x > *(h5_glb_idx_t*)y) return 1; + + return 0; +} + + +static h5_err_t +read_elems_part ( + h5t_mesh_t* const m, + h5_glb_elem_t** glb_elems, + h5_glb_idx_t* elem_indices, // in + h5_glb_idx_t dim // in + ) { + H5_PRIV_FUNC_ENTER (h5_err_t, "m=%p", m); + + m->num_interior_elems[0] = dim; + m->num_interior_leaf_elems[0] = dim; + + h5_glb_elem_t* elems; + TRY (elems = h5tpriv_alloc_glb_elems (m, dim)); + + qsort (elem_indices, dim, sizeof(*elem_indices), cmp_glb_idx); + + // create memspace + hsize_t num_elems = dim; + hid_t mspace_id; + TRY (mspace_id = hdf5_create_dataspace(1, &num_elems, NULL)); + + // create diskspace and select subset + hsize_t num_glb_elems = m->num_glb_elems[m->num_leaf_levels-1]; + hid_t dspace_id; + TRY (dspace_id = hdf5_create_dataspace (1, &num_glb_elems, NULL)); + hsize_t hstride = 1; + H5S_seloper_t seloper = H5S_SELECT_SET; // first selection + for (hsize_t i = 0; i < dim; i++) { + hsize_t hstart = elem_indices[i]; + hsize_t hcount = 1; + while (elem_indices[i]+1 == elem_indices[i+1] && i < dim) { + i++; hcount++; + } + if (hstart+hcount > num_glb_elems) { + H5_PRIV_FUNC_LEAVE ( + h5_error ( + H5_ERR_H5FED, + "invalid selection: start=%lld, count=%lld", + (long long)hstart, (long long)hcount)); + } + TRY (hdf5_select_hyperslab_of_dataspace ( + dspace_id, + seloper, + &hstart, &hstride, &hcount, + NULL)); + seloper = H5S_SELECT_OR; + } + hid_t dset_id; + TRY (dset_id = hdf5_open_dataset (m->mesh_gid, m->dsinfo_elems.name)); + TRY (hdf5_read_dataset ( + dset_id, + m->dsinfo_elems.type_id, + mspace_id, + dspace_id, + m->f->props->xfer_prop, + elems)); + TRY (hdf5_close_dataspace (dspace_id)); + TRY (hdf5_close_dataspace (mspace_id)); + TRY (hdf5_close_dataset (dset_id)); + + *glb_elems = elems; + H5_PRIV_FUNC_RETURN (H5_SUCCESS); +} + +h5_err_t +h5tpriv_read_mesh_part ( + h5t_mesh_t* const m, + h5_glb_idx_t* elem_indices, + h5_glb_idx_t num_elems + ) { + H5_PRIV_API_ENTER (h5_err_t, "m=%p", m); +#ifdef PARALLEL_IO + TRY (h5priv_mpi_barrier (m->f->props->comm)); // octree + m->timing.measure[m->timing.next_time++] = MPI_Wtime(); + TRY (h5priv_mpi_barrier (m->f->props->comm)); // chunks + m->timing.measure[m->timing.next_time++] = MPI_Wtime(); + TRY (h5priv_mpi_barrier (m->f->props->comm)); // weights + m->timing.measure[m->timing.next_time++] = MPI_Wtime(); + TRY (h5priv_mpi_barrier (m->f->props->comm)); // distribute chunks + m->timing.measure[m->timing.next_time++] = MPI_Wtime(); +#endif + h5_glb_elem_t* glb_elems; + TRY (read_elems_part (m, &glb_elems, elem_indices, num_elems)); + h5_loc_idx_t num_interior_elems = m->num_interior_elems[0]; + h5_loc_idx_t num_ghost_elems = m->num_ghost_elems[0] = 0; +#ifdef PARALLEL_IO + TRY (h5priv_mpi_barrier (m->f->props->comm)); // read elems + m->timing.measure[m->timing.next_time++] = MPI_Wtime(); +#endif + // add interior elements to global -> local index map + TRY (h5tpriv_init_map_elem_g2l (m, glb_elems, num_interior_elems)); + + // define local indices for all vertices of all local elements + size_t size = 3*(num_interior_elems + num_ghost_elems) + 128; // added times 3 for random read of elems + TRY (h5priv_new_idxmap (&m->map_vertex_g2l, size)); + + h5_idxmap_t* map = &m->map_vertex_g2l; + + /* for the time being we use the hash table only for a fast test + whether a global index has already been added to the map or not. */ + h5_hashtable_t htab; + TRY (h5priv_hcreate ((size << 2) / 3, &htab, + hidxmap_cmp, hidxmap_compute_hval, NULL)); + + int num_vertices = h5tpriv_ref_elem_get_num_vertices (m); + for (size_t idx = 0; idx < num_interior_elems; idx++) { + h5_glb_idx_t* vertices = h5tpriv_get_glb_elem_vertices (m, glb_elems, idx); + for (int i = 0; i < num_vertices; i++) { + // add index temporarly to map ... + map->items[map->num_items] = (h5_idxmap_el_t) {vertices[i], 0}; + // ... and check whether it has already been added + h5_idxmap_el_t* retval; + h5priv_hsearch (&map->items[map->num_items], + H5_ENTER, (void**)&retval, &htab); + if (retval == &map->items[map->num_items]) { + // new entry in hash table thus in map + map->num_items++; + } + } + } + TRY (h5priv_hdestroy (&htab)); + h5priv_sort_idxmap (map); + for (h5_loc_idx_t i = 0; i < map->num_items; i++) { + map->items[i].loc_idx = i; + } + TRY (read_vertices (m, map)); + TRY (h5tpriv_alloc_loc_elems (m, 0, num_interior_elems+num_ghost_elems)); + m->num_loaded_levels = 1; +#ifdef PARALLEL_IO + TRY (h5priv_mpi_barrier (m->f->props->comm)); // read vtx + m->timing.measure[m->timing.next_time++] = MPI_Wtime(); +#endif + TRY (h5tpriv_init_loc_elems_struct (m, glb_elems, 0, num_interior_elems, 0, NULL)); + TRY (h5tpriv_init_elem_flags (m, 0, num_interior_elems+num_ghost_elems)); + TRY (h5tpriv_update_internal_structs (m, 0)); + + TRY (h5_free (glb_elems)); +#ifdef PARALLEL_IO + TRY (h5priv_mpi_barrier (m->f->props->comm)); // init update + m->timing.measure[m->timing.next_time++] = MPI_Wtime(); +#endif + H5_PRIV_API_RETURN (H5_SUCCESS); +} + + diff --git a/src/h5core/h5t_readwrite_private.h b/src/h5core/h5t_readwrite_private.h new file mode 100644 index 0000000..3869b93 --- /dev/null +++ b/src/h5core/h5t_readwrite_private.h @@ -0,0 +1,147 @@ +/* + Copyright (c) 2006-2013, The Regents of the University of California, + through Lawrence Berkeley National Laboratory (subject to receipt of any + required approvals from the U.S. Dept. of Energy) and the Paul Scherrer + Institut (Switzerland). All rights reserved. + + License: see file COPYING in top level of source distribution. +*/ + +#ifndef __H5T_READWRITE_PRIVATE_H +#define __H5T_READWRITE_PRIVATE_H + +#include "h5core/h5_types.h" +#include "h5t_types_private.h" + +struct h5t_read_methods { + h5_err_t (*init_loc_elems_struct)(h5t_mesh_t* const, + const h5_glb_elem_t*cosnt, + const h5_loc_idx_t, + const h5_loc_idx_t, + const h5_uint32_t, + const h5_int32_t* my_proc); + h5_err_t (*init_elem_flags)(h5t_mesh_t* const, h5_loc_idx_t, h5_loc_idx_t); + h5_err_t (*init_map_elem_g2l)(h5t_mesh_t* const, h5_glb_elem_t* + const, const h5_loc_idx_t); + h5_err_t (*init_glb_elems_struct)(h5t_mesh_t* const, const h5_glb_elem_t*const); + h5_err_t (*init_glb_elems_struct_chk)(h5t_mesh_t* const, const h5_glb_elem_t*const, h5_chk_idx_t* ,int); +}; + +extern struct h5t_read_methods h5tpriv_read_trim_methods; +extern struct h5t_read_methods h5tpriv_read_tetm_methods; + +h5_err_t +h5tpriv_read_mesh ( + h5t_mesh_t* const m + ); +h5_err_t +h5tpriv_read_chunked_mesh ( + h5t_mesh_t* const m + ); +h5_err_t +h5tpriv_read_mesh_part ( + h5t_mesh_t* const m, + h5_glb_idx_t* elem_indices, + h5_glb_idx_t dim + ); + +h5_err_t +h5tpriv_write_mesh ( + h5t_mesh_t* const m + ); + +static inline h5_err_t +h5tpriv_init_loc_elems_struct ( + h5t_mesh_t* const m, + const h5_glb_elem_t* const elems, + const h5_loc_idx_t from_idx, + const h5_loc_idx_t count, + const h5_uint32_t flags, + const h5_int32_t* my_proc + ) { + return m->methods->read->init_loc_elems_struct (m, elems, from_idx, count, flags, my_proc); +} + +static inline h5_err_t +h5tpriv_init_elem_flags ( + h5t_mesh_t* const m, + const h5_loc_idx_t from, + const h5_loc_idx_t count + ) { + return m->methods->read->init_elem_flags (m, from, count); +} + +static inline h5_err_t +h5tpriv_init_map_elem_g2l ( + h5t_mesh_t* const m, + h5_glb_elem_t* elems, + const h5_loc_idx_t count + ) { + return m->methods->read->init_map_elem_g2l (m, elems, count); +} + +static inline h5_err_t +h5tpriv_init_glb_elems_struct ( + h5t_mesh_t* const m, + const h5_glb_elem_t* const glb_elems + ) { + return m->methods->read->init_glb_elems_struct (m, glb_elems); +} + +static inline h5_err_t +h5tpriv_init_glb_elems_struct_chk ( + h5t_mesh_t* const m, + const h5_glb_elem_t* const glb_elems, + h5_chk_idx_t* list, + int num_items + ) { + return m->methods->read->init_glb_elems_struct_chk (m, glb_elems, list, num_items); +} + + +h5_err_t +h5tpriv_get_list_of_chunks_to_write ( + h5t_mesh_t* const m, + h5_chk_idx_t** list, + int* counter + ); + +h5_err_t +h5tpriv_get_list_of_chunks_to_read ( + h5t_mesh_t* const m, + h5_chk_idx_t** list, + int* counter + ); + +h5_int32_t +find_proc_to_write ( + h5t_mesh_t* const m, + h5_loc_idx_t elem_idx + ); + +//TODO this is a bugfix remove after xfer_prop fix has been done! +void +set_xfer_prop_to (const h5_file_p file, hid_t prop); +void +set_xfer_prop_to2 (h5t_mesh_t* const m, hid_t prop); + +// TODO move this to appropriate place +typedef struct { + int (*compare) (const void *p_a, const void *p_b); +} comparison_fn_t; + +void * linsearch (const void *key, void *array, size_t count, size_t size, + comparison_fn_t compare); + +unsigned int +hidxmap_compute_hval ( + const void* __item + ); + +int +hidxmap_cmp ( + const void* __a, + const void* __b + ); + +#endif diff --git a/src/h5core/h5t_readwrite_tetm.c b/src/h5core/h5t_readwrite_tetm.c new file mode 100644 index 0000000..8a36a3f --- /dev/null +++ b/src/h5core/h5t_readwrite_tetm.c @@ -0,0 +1,214 @@ +/* + Copyright (c) 2006-2012, The Regents of the University of California, + through Lawrence Berkeley National Laboratory (subject to receipt of any + required approvals from the U.S. Dept. of Energy) and the Paul Scherrer + Institut (Switzerland). All rights reserved. + + License: see file COPYING in top level of source distribution. +*/ + +#include "h5t_types_private.h" +#include "h5t_map_private.h" +#include "h5t_model_private.h" +#include "h5t_readwrite_private.h" + +#include "h5core/h5t_map.h" +/* + initialize local element structure + */ +static h5_err_t +init_loc_elems_struct ( + h5t_mesh_t* const m, + const h5_glb_elem_t* const elems, + const h5_loc_idx_t from_idx, + const h5_loc_idx_t count, + const h5_uint32_t flags, + const h5_int32_t* my_proc + ) { + H5_PRIV_FUNC_ENTER (h5_err_t, + "m=%p, elems=%p, from_idx=%lld, count=%lld, flags=%xu", + m, elems, (long long)from_idx, (long long)count, flags); + + int num_vertices = h5tpriv_ref_elem_get_num_vertices (m); + int num_facets = h5tpriv_ref_elem_get_num_facets (m); + h5_loc_tet_t* loc_elem = (h5_loc_tet_t*)m->loc_elems + from_idx; + h5_glb_tet_t* glb_elem = (h5_glb_tet_t*)elems; + h5_glb_tet_t* last = glb_elem + count; + int counter = 0; + + for (; glb_elem < last; loc_elem++, glb_elem++, counter++) { + // global element index + loc_elem->glb_idx = glb_elem->idx; + + // local parent index + loc_elem->parent_idx = h5t_map_glb_elem_idx2loc (m, glb_elem->parent_idx); + + // local child index + loc_elem->child_idx = h5t_map_glb_elem_idx2loc (m, glb_elem->child_idx); + + // level idx + loc_elem->level_idx = glb_elem->level_idx; + + // refinement level + loc_elem->refinement = glb_elem->refinement; + + // flags + loc_elem->flags = glb_elem->flags | flags; + + // proc + if (my_proc == NULL) { + loc_elem->my_proc = -1; + } else { + loc_elem->my_proc = my_proc[counter]; + } + + // vertex indices + TRY( h5t_map_global_vertex_indices2local ( + m, + glb_elem->vertex_indices, + num_vertices, + loc_elem->vertex_indices) ); + + // neighbor indices + h5t_map_glb_elem_indices2loc ( + m, + glb_elem->neighbor_indices, + num_facets, + loc_elem->neighbor_indices); + } + H5_PRIV_FUNC_RETURN (H5_SUCCESS); +} + +#define H5_LOC_ELEM_T h5_loc_tet_t + +/* + Set flags on local elements: + geometric border + processor border + + Note: + ghost elements must already be marked! + */ +static h5_err_t +init_elem_flags ( + h5t_mesh_t* const m, + const h5_loc_idx_t from, + const h5_loc_idx_t count + ) { + H5_PRIV_FUNC_ENTER (h5_err_t, + "m=%p, from=%lld, count=%lld", + m, (long long)from, (long long)count); + + int num_facets = h5tpriv_ref_elem_get_num_facets (m); + + H5_LOC_ELEM_T* elems = ((H5_LOC_ELEM_T*)m->loc_elems); + H5_LOC_ELEM_T* elem = ((H5_LOC_ELEM_T*)m->loc_elems) + from; + H5_LOC_ELEM_T* end = elem + count; + + while (elem < end) { + for (int i = 0; i < num_facets; i++) { + if (elem->neighbor_indices[i] == -1) { + elem->flags |= H5_GEOBORDER_ENTITY; + } + if (elem->flags & H5_GHOST_ENTITY) { + continue; // if ghost, we are done + } + // elem is not ghost so it must be interior (for the time + // being we have no overlap + elem->flags |= H5_INTERIOR_ENTITY; + if (elem->neighbor_indices[i] < -1 || + (elems[elem->neighbor_indices[i]].flags & H5_GHOST_ENTITY)) { + // if neighbor is < -1 we do not have ghost cells and cell + // is border cell + // if neighbor is ghost, cell is border cell + elem->flags |= H5_BORDER_ENTITY; + } + } + elem++; + } + H5_PRIV_FUNC_RETURN (H5_SUCCESS); +} + +/* + Add entries to global to local index map of elements. + */ +static h5_err_t +init_map_elem_g2l ( + h5t_mesh_t* const m, + h5_glb_elem_t* elems, + const h5_loc_idx_t count + ) { + H5_PRIV_FUNC_ENTER (h5_err_t, "m=%p, count=%lld", + m, (long long)count); + h5_idxmap_t* map = &m->map_elem_g2l; + + /* alloc mem for global to local ID mapping */ + TRY (h5priv_grow_idxmap (map, count)); + h5_loc_idx_t offs = map->num_items; + + h5_idxmap_el_t* item = &map->items[map->num_items]; + h5_glb_tet_t* elem = (h5_glb_tet_t*)elems; + + for (h5_loc_idx_t i = 0; i < count; elem++, i++, item++) { + item->glb_idx = elem->idx; + item->loc_idx = i + offs; + map->num_items++; + } + h5priv_sort_idxmap (map); + + H5_PRIV_FUNC_RETURN (H5_SUCCESS); +} + +/* + Setup data structure to be written on disk. We always write the hole mesh. + */ +static h5_err_t +init_glb_elems_struct ( + h5t_mesh_t* const m, + const h5_glb_elem_t* const glb_elems + ) { + H5_PRIV_FUNC_ENTER (h5_err_t, "m=%p", m); + h5_loc_idx_t num_interior_elems = m->num_interior_elems[m->num_leaf_levels-1]; + + // simple in serial runs: global index = local index + h5_loc_tet_t* loc_elem = (h5_loc_tet_t*)m->loc_elems; + h5_glb_tet_t* glb_elem = (h5_glb_tet_t*)glb_elems; + h5_loc_tet_t* end = loc_elem + num_interior_elems; + + while (loc_elem < end) { + glb_elem->idx = loc_elem->glb_idx; + glb_elem->parent_idx = loc_elem->parent_idx; + glb_elem->child_idx = loc_elem->child_idx; + glb_elem->level_idx = loc_elem->level_idx; + glb_elem->refinement = loc_elem->refinement; + glb_elem->flags = 0; + for (int i = 0; i < 4; i++) { + glb_elem->vertex_indices[i] = loc_elem->vertex_indices[i]; + glb_elem->neighbor_indices[i] = loc_elem->neighbor_indices[i]; + } + loc_elem++; + glb_elem++; + } + H5_PRIV_FUNC_RETURN (H5_SUCCESS); +} + +static h5_err_t +init_glb_elems_struct_chk ( + h5t_mesh_t* const m, + const h5_glb_elem_t* const glb_elems, + h5_chk_idx_t* chk_list, + int num_chk + ) { + H5_PRIV_FUNC_ENTER (h5_err_t, "m=%p", m); + H5_PRIV_FUNC_LEAVE (H5_ERR_NOT_IMPLEMENTED); + // TODO just copy from readwrite_trim and replace 3 indices with 4... + H5_PRIV_FUNC_RETURN (H5_SUCCESS); +} + +struct h5t_read_methods h5tpriv_read_tetm_methods = { + init_loc_elems_struct, + init_elem_flags, + init_map_elem_g2l, + init_glb_elems_struct, + init_glb_elems_struct_chk, +}; diff --git a/src/h5core/h5t_readwrite_trim.c b/src/h5core/h5t_readwrite_trim.c new file mode 100644 index 0000000..40d2353 --- /dev/null +++ b/src/h5core/h5t_readwrite_trim.c @@ -0,0 +1,253 @@ +/* + Copyright (c) 2006-2012, The Regents of the University of California, + through Lawrence Berkeley National Laboratory (subject to receipt of any + required approvals from the U.S. Dept. of Energy) and the Paul Scherrer + Institut (Switzerland). All rights reserved. + + License: see file COPYING in top level of source distribution. +*/ + +#include "h5t_types_private.h" +#include "h5t_map_private.h" +#include "h5t_model_private.h" +#include "h5t_readwrite_private.h" +#include "h5t_access_private.h" + +#include "h5core/h5t_map.h" + +#define H5_GLB_ELEM_T h5_glb_tri_t +#define H5_LOC_ELEM_T h5_loc_tri_t + +/* + initialize local element structure + */ +static h5_err_t +init_loc_elems_struct ( + h5t_mesh_t* const m, + const h5_glb_elem_t* const elems, + const h5_loc_idx_t from_idx, + const h5_loc_idx_t count, + const h5_uint32_t flags, + const h5_int32_t* my_proc + ) { + H5_PRIV_FUNC_ENTER (h5_err_t, + "m=%p, elems=%p, from_idx=%lld, count=%lld, flags=%xu", + m, elems, (long long)from_idx, (long long)count, flags); + + int num_vertices = h5tpriv_ref_elem_get_num_vertices (m); + int num_facets = h5tpriv_ref_elem_get_num_facets (m); + H5_LOC_ELEM_T* loc_elem = (H5_LOC_ELEM_T*)m->loc_elems + from_idx; + H5_GLB_ELEM_T* glb_elem = (H5_GLB_ELEM_T*)elems; + H5_GLB_ELEM_T* last = glb_elem + count; + int counter = 0; + + for (; glb_elem < last; loc_elem++, glb_elem++, counter++) { + // global element index + loc_elem->glb_idx = glb_elem->idx; + + // local parent index + loc_elem->parent_idx = h5t_map_glb_elem_idx2loc (m, glb_elem->parent_idx); + + // local child index + loc_elem->child_idx = h5t_map_glb_elem_idx2loc (m, glb_elem->child_idx); + + // level idx + loc_elem->level_idx = glb_elem->level_idx; + + // refinement level + loc_elem->refinement = glb_elem->refinement; + + // flags + loc_elem->flags = glb_elem->flags | flags; + + // proc + if (my_proc == NULL) { + loc_elem->my_proc = -1; + } else { + loc_elem->my_proc = my_proc[counter]; + } + + // vertex indices + TRY (h5t_map_global_vertex_indices2local ( + m, + glb_elem->vertex_indices, + num_vertices, + loc_elem->vertex_indices)); + + // neighbor indices + h5t_map_glb_elem_indices2loc ( + m, + glb_elem->neighbor_indices, + num_facets, + loc_elem->neighbor_indices); + + } + m->last_stored_eid = from_idx + count -1; + H5_PRIV_FUNC_RETURN (H5_SUCCESS); +} + +static h5_err_t +init_elem_flags ( + h5t_mesh_t* const m, + const h5_loc_idx_t from, + const h5_loc_idx_t count + ) { + H5_PRIV_FUNC_ENTER (h5_err_t, + "m=%p, from=%lld, count=%lld", + m, (long long)from, (long long)count); + + int num_facets = h5tpriv_ref_elem_get_num_facets (m); + + H5_LOC_ELEM_T* elems = ((H5_LOC_ELEM_T*)m->loc_elems); + H5_LOC_ELEM_T* elem = ((H5_LOC_ELEM_T*)m->loc_elems) + from; + H5_LOC_ELEM_T* end = elem + count; + + while (elem < end) { + for (int i = 0; i < num_facets; i++) { + if (elem->neighbor_indices[i] == -1) { + elem->flags |= H5_GEOBORDER_ENTITY; + } + if (elem->flags & H5_GHOST_ENTITY) { + continue; // if ghost, we are done + } + // elem is not ghost so it must be interior (for the time + // being we have no overlap + elem->flags |= H5_INTERIOR_ENTITY; + + if (elem->neighbor_indices[i] <= -1 || // added <= istead of < + (elems[elem->neighbor_indices[i]].flags & H5_GHOST_ENTITY)) { //TODO invalid access probably elem->neighbor_indices[i] == -1 + // if neighbor is < -1 we do not have ghost cells and cell + // is border cell + // if neighbor is ghost, cell is border cell + elem->flags |= H5_BORDER_ENTITY; + } + } + elem++; + } + H5_PRIV_FUNC_RETURN (H5_SUCCESS); +} + +static h5_err_t +init_map_elem_g2l ( + h5t_mesh_t* const m, + h5_glb_elem_t* elems, + h5_loc_idx_t count + ) { + H5_PRIV_FUNC_ENTER (h5_err_t, "m=%p, count=%lld", + m, (long long)count); + h5_idxmap_t* map = &m->map_elem_g2l; + + /* alloc mem for global to local ID mapping */ + TRY (h5priv_grow_idxmap (map, map->num_items+count)); + h5_loc_idx_t offs = map->num_items; + + h5_idxmap_el_t* item = &map->items[map->num_items]; + H5_GLB_ELEM_T* elem = (H5_GLB_ELEM_T*)elems; + + for (h5_loc_idx_t i = 0; i < count; elem++, i++, item++) { + item->glb_idx = elem->idx; + item->loc_idx = i + offs; + map->num_items++; + } + h5priv_sort_idxmap (map); + + H5_PRIV_FUNC_RETURN (H5_SUCCESS); +} + +/* + Setup data structure to be written on disk. We always write the hole mesh. + */ +static h5_err_t +init_glb_elems_struct ( + h5t_mesh_t* const m, + const h5_glb_elem_t* const glb_elems + ) { + H5_PRIV_FUNC_ENTER (h5_err_t, "m=%p", m); + h5_loc_idx_t num_interior_elems = m->num_interior_elems[m->num_leaf_levels-1]; + + // simple in serial runs: global index = local index + H5_LOC_ELEM_T* loc_elem = (H5_LOC_ELEM_T*)m->loc_elems; + H5_GLB_ELEM_T* glb_elem = (H5_GLB_ELEM_T*)glb_elems; + H5_LOC_ELEM_T* end = loc_elem + num_interior_elems; + + while (loc_elem < end) { + glb_elem->idx = loc_elem->glb_idx; + glb_elem->parent_idx = loc_elem->parent_idx; + glb_elem->child_idx = loc_elem->child_idx; + glb_elem->level_idx = loc_elem->level_idx; + glb_elem->refinement = loc_elem->refinement; + glb_elem->flags = 0; + for (int i = 0; i < 3; i++) { + glb_elem->vertex_indices[i] = loc_elem->vertex_indices[i]; + glb_elem->neighbor_indices[i] = loc_elem->neighbor_indices[i]; + } + loc_elem++; + glb_elem++; + } + H5_PRIV_FUNC_RETURN (H5_SUCCESS); +} + +//TODO maybe use ifdef to have name without _chk +static h5_err_t +init_glb_elems_struct_chk ( + h5t_mesh_t* const m, + const h5_glb_elem_t* const glb_elems, + h5_chk_idx_t* chk_list, + int num_chk + ) { + H5_PRIV_FUNC_ENTER (h5_err_t, "m=%p", m); + + h5_chk_idx_t chk_idx = -1; + h5_chk_size_t num_elems = -1; + h5_size_t counter = 0; + for (int i = 0; i < num_chk; i++) { + chk_idx = chk_list[i]; + num_elems = m->chunks->chunks[chk_idx].num_elems; // num_elems per chunk + h5_glb_idx_t glb_idx = m->chunks->chunks[chk_idx].elem; + for (h5_chk_size_t j = 0; j < num_elems; j++) { + // get local element + h5_loc_idx_t loc_idx = h5t_map_glb_elem_idx2loc(m, glb_idx); + H5_LOC_ELEM_T* loc_elem = &((H5_LOC_ELEM_T*)m->loc_elems)[loc_idx]; + H5_GLB_ELEM_T* glb_elem = &((H5_GLB_ELEM_T*)glb_elems)[counter]; + glb_elem->idx = loc_elem->glb_idx; + glb_elem->parent_idx = loc_elem->parent_idx > -1 ? + h5tpriv_get_loc_elem_glb_idx(m, loc_elem->parent_idx) : loc_elem->parent_idx; + glb_elem->child_idx = loc_elem->child_idx > -1 ? + h5tpriv_get_loc_elem_glb_idx(m, loc_elem->child_idx) : loc_elem->child_idx; + glb_elem->level_idx = loc_elem->level_idx; + glb_elem->refinement = loc_elem->refinement; + glb_elem->flags = 0; // TODO is that correct? why do we then store it? + for (int i = 0; i < 3; i++) { + glb_elem->vertex_indices[i] = loc_elem->vertex_indices[i] > -1 ? + m->vertices[loc_elem->vertex_indices[i]].idx :loc_elem->vertex_indices[i]; + + if (loc_elem->neighbor_indices[i] > -1) { + glb_elem->neighbor_indices[i] = ((H5_LOC_ELEM_T*)m->loc_elems)[loc_elem->neighbor_indices[i]].glb_idx; + } else { + if (loc_elem->neighbor_indices[i] < -1) {// if elem not locally available we store the - (glb_idx + 2) + glb_elem->neighbor_indices[i] = -( loc_elem->neighbor_indices[i] + 2); //TODO is there a func or makro that does that? + } else { + glb_elem->neighbor_indices[i] = loc_elem->neighbor_indices[i]; // geometrical border + } + } + } + counter++; + glb_idx++; + } + + } + + H5_PRIV_FUNC_RETURN (H5_SUCCESS); +} + + + + + +struct h5t_read_methods h5tpriv_read_trim_methods = { + init_loc_elems_struct, + init_elem_flags, + init_map_elem_g2l, + init_glb_elems_struct, + init_glb_elems_struct_chk, +}; diff --git a/src/h5core/h5t_ref_elements.c b/src/h5core/h5t_ref_elements.c new file mode 100644 index 0000000..5de609b --- /dev/null +++ b/src/h5core/h5t_ref_elements.c @@ -0,0 +1,223 @@ +/* + Copyright (c) 2006-2012, The Regents of the University of California, + through Lawrence Berkeley National Laboratory (subject to receipt of any + required approvals from the U.S. Dept. of Energy) and the Paul Scherrer + Institut (Switzerland). All rights reserved. + + License: see file COPYING in top level of source distribution. +*/ + +#include "h5t_types_private.h" +#include "h5t_model_private.h" +#include "h5t_ref_elements_private.h" + +/* + information we can retrieve from the reference element: + - number of vertices per sub-entity (1) + - vertex indices of all sub-elements + - upward connectivity + - which co-dim 1 entities are connected to a given vertex + - which co-dim 2 entities are connected to a given vertex + - which co-dim 1 entities are connected to a given co-dim 2 entity + - downward connectivity + - vertex coordinates + + get_conn(face, dim, dim) -> list + + for dim 3 reference elements: + get_conn(0, 3, 0) -> 0, 1, 2, 3 (all vertices) + get_conn(0, 3, 1) -> 0, 1, 2, 3, 4, 5 (all edges) + get_conn(0, 3, 2) -> 0, 1, 2, 3 (all facets) + get_conn(0, 3, 3) -> 0 + get_conn(i, 2, 0) -> vertices of facet i + get_conn(i, 2, 1) -> edges of facet i + get_conn(i, 2, 2) -> facets connected to facet i + get_conn(i, 2, 3) -> 0 + get_conn(i, 1, 0) -> vertices of edge i + get_conn(i, 1, 1) -> edges connected to edge i + get_conn(i, 1, 2) -> facets connected to edge i + get_conn(i, 1, 3) -> 0 + get_conn(i, 0, 0) -> i + get_conn(i, 0, 1) -> edges connected to vertex i + get_conn(i, 0, 2) -> facets connected to vertex i + get_conn(i, 0, 3) -> 0 + + (1) For triangle and tetrahedral meshes the number of vertices is + identical for all sub-entities within the same dimension. This is not + true for other grids (like prismen) + + + face: All kinds of sub-elements: vertices, edges, triangles ... + facet: co-dim 1 face + entities: all elements and faces of a grid + */ + +/* + 2 + ** + * * + * * + * * + * * + * * + * * + 1 2 + * * + * * + * * + * * + * * + * * + * * + 0 * * * * * * * 0 * * * * * * *1 + + */ + +const h5t_ref_elem_t h5t_tri_ref_elem = { + 2, // dimension + { + H5T_TYPE_VERTEX, + H5T_TYPE_EDGE, + H5T_TYPE_TRIANGLE, + }, + { + 3, // #vertices + 3, // #edges + 1 // #triangles + }, + { // number of vertices per entity + [0] = {1, 1, 1}, // #vertices of vertices + [1] = {2, 2, 2}, // #vertices of edges + [2] = {3} // #vertices of trinagles + }, + { // connection count + [0][0] = {1, 1, 1}, + [0][1] = {2, 2, 2}, + [0][2] = {1, 1, 1}, + + [1][0] = {2, 2, 2}, + [1][1] = {3, 3, 3}, + [1][2] = {1, 1, 1}, + + [2][0] = {3,-1,-1}, + [2][1] = {3,-1,-1}, + [2][2] = {3,-1,-1}, + }, + { // connectivity + // vertex to vertices/edges/triangles + [0][0] = {{0}, {1}, {2}}, + [0][1] = {{0,1}, {0,2}, {1,2}}, + [0][2] = {{0}, {0}, {0}}, + + // edge to vertices/edges/triangles + [1][0] = {{0,1}, {0,2}, {1,2}}, + [1][1] = {{0,1,2}, {0,1,2}, {0,1,2}}, + [1][2] = {{0}, {0}, {0}}, + + // triangle to vertices/edges/triangles + [2][0] = {{0,1,2}}, + [2][1] = {{0,1,2}}, + [2][2] = {{0,1,2}}, + }, + { // coordinates + {0.0, 0.0}, + {1.0, 0.0}, + {0.0, 1.0} + } +}; + +/* + 3 + ** + ** * + * * * + * * * + * * * + * 5 * + * * * + 3 * 4 + * 2 * 3 * + * 2 * + * * * * + * * * * + * 1 0 2 * + * * * * + ** ** + 0 * * * * * * * 0 * * * * * * *1 + + Front face is {0,1,3} with id 1 + */ + +const h5t_ref_elem_t h5t_tet_ref_elem = { + 3, // dimension + { + H5T_TYPE_VERTEX, + H5T_TYPE_EDGE, + H5T_TYPE_TRIANGLE, + H5T_TYPE_TET, + }, + { + 4, // #vertices + 6, // #edges + 4, // #triangles + 1 // #tetrahedra + }, + { // number of vertices per sub-element + [0] = {1,1,1,1}, // #vertices of vertices + [1] = {2,2,2,2,2,2}, // #vertices of edges + [2] = {3,3,3,3}, // #vertices of trinagles + [3] = {4} // #vertices of tets + }, + { // connection count + [0][0] = {1, 1, 1, 1,-1,-1}, + [0][1] = {3, 3, 3, 3,-1,-1}, + [0][2] = {3, 3, 3, 3,-1,-1}, + [0][3] = {1, 1, 1, 1,-1,-1}, + + [1][0] = {2, 2, 2, 2, 2, 2}, + [1][1] = {5, 5, 5, 5, 5, 5}, + [1][2] = {2, 2, 2, 2, 2, 2}, + [1][3] = {1, 1, 1, 1, 1, 1}, + + [2][0] = {3, 3, 3, 3,-1,-1}, + [2][1] = {3, 3, 3, 3,-1,-1}, + [2][2] = {4, 4, 4, 4,-1,-1}, + [2][3] = {1, 1, 1, 1,-1,-1}, + + [3][0] = {4,-1,-1,-1,-1,-1}, + [3][1] = {6,-1,-1,-1,-1,-1}, + [3][2] = {4,-1,-1,-1,-1,-1}, + [3][3] = {1,-1,-1,-1,-1,-1}, + }, + { // connectivity + // vertex to vertices/edges/triangles/tetrahedron + [0][0] = {{0}, {1}, {2}, {3}}, + [0][1] = {{0,1,3}, {0,2,4}, {1,2,5}, {3,4,5}}, + [0][2] = {{0,1,2}, {0,1,3}, {0,2,3}, {1,2,3}}, + [0][3] = {{0}, {0}, {0}, {0}}, + + // edges to vertices/edges/triangles/tetrahedron + [1][0] = {{0,1}, {0,2}, {1,2}, {0,3}, {1,3}, {2,3}}, + [1][1] = {{0,1,2,3,4}, {0,1,2,3,5}, {0,1,2,4,5}, {0,1,3,4,5}, {0,2,3,4,5}, {1,2,3,4,5}}, + [1][2] = {{0,1}, {0,2}, {0,3}, {1,2}, {1,3}, {2,3}}, + [1][3] = {{0}, {0}, {0}, {0}, {0}, {0}}, + + // triangle to vertices/edges/triangle/tetrahedron + [2][0] = {{0,1,2}, {0,1,3}, {0,2,3}, {1,2,3}}, + [2][1] = {{0,1,2}, {0,3,4}, {1,3,5}, {2,4,5}}, + [2][2] = {{0,1,2,3}, {0,1,2,3}, {0,1,2,3}, {0,1,2,3}}, + [2][3] = {{0}, {0}, {0}, {0}}, + + // tetrahedron to vertices/edges/triangle/tetrahedron + [3][0] = {{0,1,2,3}}, + [3][1] = {{0,1,2,3,4,5}}, + [3][2] = {{0,1,2,3}}, + [3][2] = {{0}} + }, + { // coordinates + {0.0, 0.0, 0.0}, + {1.0, 0.0, 0.0}, + {0.0, 1.0, 0.0}, + {0.0, 0.0, 1.0} + } +}; diff --git a/src/h5core/h5t_ref_elements_private.h b/src/h5core/h5t_ref_elements_private.h new file mode 100644 index 0000000..6579a11 --- /dev/null +++ b/src/h5core/h5t_ref_elements_private.h @@ -0,0 +1,73 @@ +/* + Copyright (c) 2006-2013, The Regents of the University of California, + through Lawrence Berkeley National Laboratory (subject to receipt of any + required approvals from the U.S. Dept. of Energy) and the Paul Scherrer + Institut (Switzerland). All rights reserved. + + License: see file COPYING in top level of source distribution. +*/ + +#ifndef __H5T_REF_ELEMENTS_PRIVATE_H +#define __H5T_REF_ELEMENTS_PRIVATE_H + +#include "h5core/h5_types.h" + +#define H5T_MAX_DIM 3 +#define H5T_MAX_FACES 6 // edges in tetrahedron +#define H5T_MAX_VERTICES 4 // tetrahedron + +struct h5t_ref_elem { + int dim; + int entity_types[H5T_MAX_DIM+1]; + int num_faces[H5T_MAX_DIM+1]; + int num_vertices_of_face[H5T_MAX_DIM+1][H5T_MAX_FACES]; + int connect_count[H5T_MAX_DIM+1][H5T_MAX_DIM+1][H5T_MAX_FACES]; + int connect[H5T_MAX_DIM+1][H5T_MAX_DIM+1][H5T_MAX_FACES][H5T_MAX_FACES]; + h5_float64_t coords[H5T_MAX_VERTICES][H5T_MAX_DIM]; +}; + +typedef struct h5t_ref_elem h5t_ref_elem_t; + +extern const h5t_ref_elem_t h5t_tet_ref_elem; +extern const h5t_ref_elem_t h5t_tri_ref_elem; + +#ifdef __cplusplus +} +#endif + +#define h5tpriv_ref_elem_get_num_vertices(this) (this->ref_elem->num_faces[0]) + +#define h5tpriv_ref_elem_get_num_edges(this) (this->ref_elem->num_faces[1]) + +#define h5tpriv_ref_elem_get_num_facets(this) \ + (this->ref_elem->num_faces[this->ref_elem->dim - 1]) + +#define h5tpriv_ref_elem_get_num_faces(this, dim) (this->ref_elem->num_faces[dim]) + +#define h5tpriv_ref_elem_get_dim(this) (this->ref_elem->dim) + +#define h5tpriv_ref_elem_get_entity_type(this,dim) \ + (this->ref_elem->entity_types[dim]) + +#define h5tpriv_ref_elem_get_vertex_idx(this, dim, face_idx, i) \ + (h5_loc_idx_t)(this->ref_elem->connect[dim][0][face_idx][i]) + +#define h5tpriv_ref_elem_get_edge_idx(this, dim, face_idx, i) \ + (h5_loc_idx_t)(this->ref_elem->connect[dim][1][face_idx][i]) + +#define h5tpriv_ref_elem_get_triangle_idx(this, dim, face_idx, i) \ + (h5_loc_idx_t)(this->ref_elem->connect[dim][2][face_idx][i]) + +#define h5tpriv_ref_elem_get_num_facets_to_vertex(this, i) \ + ((h5_loc_idx_t)this->ref_elem->connect_count[this->ref_elem->dim-1][0][i]) + +#define h5tpriv_ref_elem_get_num_facets_to_edge(this, i) \ + ((h5_loc_idx_t)this->ref_elem->connect_count[this->ref_elem->dim-1][1][i]) + +#define h5tpriv_ref_elem_get_facet_to_vertex(this, i, j) \ + ((h5_loc_idx_t)this->ref_elem->connect[this->ref_elem->dim-1][0][i][j]) + +#define h5tpriv_ref_elem_get_facet_to_edge(this, i, j) \ + ((h5_loc_idx_t)this->ref_elem->connect[this->ref_elem->dim-1][1][i][j]) + +#endif diff --git a/src/h5core/h5t_retrieve.c b/src/h5core/h5t_retrieve.c new file mode 100644 index 0000000..c525c17 --- /dev/null +++ b/src/h5core/h5t_retrieve.c @@ -0,0 +1,364 @@ +/* + Copyright (c) 2006-2012, The Regents of the University of California, + through Lawrence Berkeley National Laboratory (subject to receipt of any + required approvals from the U.S. Dept. of Energy) and the Paul Scherrer + Institut (Switzerland). All rights reserved. + + License: see file COPYING in top level of source distribution. +*/ + +#include "h5t_types_private.h" +#include "h5t_errorhandling_private.h" +#include "h5t_map_private.h" +#include "h5t_model_private.h" +#include "h5t_access_private.h" +#include "h5t_tags_private.h" +#include "h5t_retrieve_private.h" + +#include "h5core/h5.h" +#include "h5core/h5t_map.h" + +/* + Skip elements which have been refined on a level <= the current one. + */ +static h5_err_t +iter_leaf_elem_idx ( + h5t_leaf_iterator_t* iter + ) { + h5_loc_elem_t* el; + do { + iter->elem_idx++; + if (iter->elem_idx >= iter->mesh->num_interior_elems[iter->leaf_level]) { + return H5_NOK; // done + } + el = h5tpriv_get_loc_elem (iter->mesh, iter->elem_idx); + } while (!h5tpriv_is_leaf_elem (iter->mesh, el)); + return H5_SUCCESS; +} + +static h5_loc_id_t +iterate_leaf_elems ( + h5t_iterator_t* iter + ) { + h5t_leaf_iterator_t* it = (h5t_leaf_iterator_t*)iter; + if ( iter_leaf_elem_idx (it) == H5_NOK) { + return H5_NOK; + } + int dim = h5tpriv_ref_elem_get_dim (it); + h5_loc_id_t type_id = h5tpriv_ref_elem_get_entity_type (it, dim); + return h5tpriv_build_entity_id (type_id, 0, it->elem_idx ); +} + +static h5_loc_id_t +iterate_geom_boundary_elems ( + h5t_iterator_t* iter + ) { + h5t_leaf_iterator_t* it = (h5t_leaf_iterator_t*)iter; + do { + if ( iter_leaf_elem_idx (it) == H5_NOK) { + return H5_NOK; + } + } while (!h5tpriv_is_geom_boundary_elem (it->mesh, it->elem_idx)); + int dim = h5tpriv_ref_elem_get_dim (it); + h5_loc_id_t type_id = h5tpriv_ref_elem_get_entity_type (it, dim); + return h5tpriv_build_entity_id (type_id, 0, it->elem_idx ); +} + +/* + Iterate boundary facets (co-dim 1 entities). + */ +static h5_loc_id_t +iterate_boundary_facets ( + h5t_iterator_t* iter + ) { + H5_PRIV_FUNC_ENTER (h5_loc_id_t, "iter=%p", iter); + h5t_leaf_iterator_t* it = (h5t_leaf_iterator_t*)iter; + int num_facets = h5tpriv_ref_elem_get_num_facets (it) - 1; + int dim = h5tpriv_ref_elem_get_dim (it) - it->codim; + do { + if (it->face_idx >= num_facets) { + h5_loc_id_t elem_id; + TRY( elem_id = iterate_geom_boundary_elems (iter) ); + if (elem_id == H5_NOK) { + H5_PRIV_FUNC_LEAVE (H5_NOK); // done! + } + it->elem_idx = h5tpriv_get_elem_idx (elem_id); + it->face_idx = 0; + } else { + it->face_idx++; + } + } while (!h5tpriv_is_boundary_facet (it->mesh, it->elem_idx, it->face_idx)); + int type = h5tpriv_ref_elem_get_entity_type (it, dim); + H5_PRIV_FUNC_RETURN (h5tpriv_build_entity_id (type, it->face_idx, it->elem_idx)); +} + +/*! + Travere entities with co-dim > 0 + */ +static h5_loc_id_t +iterate_leaf_faces ( + h5t_iterator_t* iter + ) { + H5_PRIV_FUNC_ENTER (h5_loc_id_t, "iter=%p", iter); + h5t_leaf_iterator_t* it = (h5t_leaf_iterator_t*)iter; + h5_loc_idlist_t* entry; + int dim = h5tpriv_ref_elem_get_dim (it) - it->codim; + int num_faces = h5tpriv_ref_elem_get_num_faces (it, dim) - 1; + int i = -1; + do { + if (it->face_idx >= num_faces) { + if (iter_leaf_elem_idx (it) == H5_NOK) { + H5_PRIV_FUNC_LEAVE (H5_NOK); // done! + } + it->face_idx = 0; + } else { + it->face_idx++; + } + // Skip already visited faces: + + // 1. Get list of all elements with this face. Actually we + // retrieve a list of entities sorted by the element index. + TRY( (it->find)(it->mesh, it->face_idx, it->elem_idx, &entry) ); + + // 2. Go to first element in list which is on current level + i = -1; + h5_loc_elem_t *el; + do { + i++; + h5_loc_idx_t idx = h5tpriv_get_elem_idx (entry->items[i]); + el = h5tpriv_get_loc_elem (it->mesh, idx); + } while (!h5tpriv_is_leaf_elem (it->mesh, el)); + + // 3. Face already visited if + } while (it->elem_idx > h5tpriv_get_elem_idx(entry->items[i])); + /* + note: in above test it->elem_idx is always greater or equal to the + compared index. It cannot be smaller since it->elem_idx is on the + current level and the element index of entry->items[i] is the smallest + element index with the given face on the current level. + */ + H5_PRIV_FUNC_RETURN (entry->items[i]); +} + +/* + Iterate boundary faces with co-dim > 1 + */ +static h5_loc_id_t +iterate_boundary_faces ( + h5t_iterator_t* iter + ) { + H5_PRIV_FUNC_ENTER (h5_loc_id_t, "iter=%p", iter); + h5t_leaf_iterator_t* it = (h5t_leaf_iterator_t*)iter; + // TODO!!! + int dim = h5tpriv_ref_elem_get_dim (it) - it->codim; + int num_faces = h5tpriv_ref_elem_get_num_faces (it, dim) - 1; + do { + // iterate to next boundary face + do { + // first iterate over all faces of element, if done + // goto next element + if (it->face_idx >= num_faces) { + h5_loc_id_t elem_id; + TRY( elem_id = iterate_geom_boundary_elems (iter) ); + if (elem_id == H5_NOK) { + H5_PRIV_FUNC_LEAVE (H5_NOK); // done! + } + it->face_idx = 0; + } else { + it->face_idx++; + } + } while (!h5tpriv_is_boundary_face ( + it->mesh, dim, it->elem_idx, it->face_idx)); + // Skip already visited faces + } while (0); + H5_PRIV_FUNC_RETURN (h5_error_internal ()); +} + +static h5_loc_id_t +iterate_tags ( + h5t_iterator_t* iter + ) { + H5_PRIV_FUNC_ENTER (h5_loc_id_t, "iter=%p", iter); + UNUSED_ARGUMENT (iter); +#if 0 + h5t_tagsel_t* tags; + do { + if (iter->subentity_idx >= 14) { + iter->elem_idx++; + iter->subentity_idx = 0; + } else { + iter->subentity_idx++; + } + tags = iter->tagset->elems[iter->elem_idx]; + } while ((tags == NULL) || (tags->idx[iter->subentity_idx])); +#endif + H5_PRIV_FUNC_RETURN (h5_error_internal ()); +} + +h5_err_t +h5t_init_leaf_iterator ( + h5t_iterator_t* iter, + h5t_mesh_t* m, + int codim + ) { + H5_CORE_API_ENTER (h5_err_t, "iter=%p, m=%p, codim=%d", iter, m, codim); + h5t_leaf_iterator_t* it = (h5t_leaf_iterator_t*)iter; + it->mesh = m; + it->face_idx = 999; + it->elem_idx = -1; + it->codim = codim; + it->leaf_level = m->leaf_level; + it->ref_elem = m->ref_elem; + + if (it->codim > 0) { + it->iter = iterate_leaf_faces; + } else if (it->codim == 0) { + it->iter = iterate_leaf_elems; + } + TRY (h5tpriv_init_entity_iterator (m, iter, codim)); + H5_CORE_API_RETURN (H5_SUCCESS); +} + +h5_err_t +h5t_init_boundary_face_iterator ( + h5t_iterator_t* iter, + h5t_mesh_t* m, + int codim + ) { + H5_CORE_API_ENTER (h5_err_t, "iter=%p, m=%p, codim=%d", iter, m, codim); + h5t_leaf_iterator_t* it = (h5t_leaf_iterator_t*)iter; + it->mesh = m; + it->face_idx = 999; // something > max number of faces + it->elem_idx = -1; + it->codim = codim; + it->leaf_level = m->leaf_level; + it->ref_elem = m->ref_elem; + + if (it->codim <= 0 || it->codim > it->ref_elem->dim) { + H5_CORE_API_LEAVE (h5tpriv_inval_codim (codim, 1, it->ref_elem->dim)); + } else if (it->codim == 1) { + it->iter = iterate_boundary_facets; + } + else if (it->codim > 1) { + it->iter = iterate_boundary_faces; + } + H5_CORE_API_RETURN (H5_SUCCESS); +} + +h5_err_t +h5t_init_mtag_iterator ( + h5t_iterator_t* iter, + h5t_mesh_t* m, + const char* name + ) { + H5_CORE_API_ENTER (h5_err_t, "iter=%p, m=%p, name='%s'", iter, m, name); + h5t_tag_iterator_t* it = (h5t_tag_iterator_t*)iter; + it->mesh = m; + TRY (h5t_open_mtagset (m, name, &it->tagset)); + it->elem_idx = -1; + it->subentity_idx = 999; + it->level_idx = m->leaf_level; + it->iter = iterate_tags; + H5_CORE_API_RETURN (H5_SUCCESS); +} + +h5_err_t +h5t_release_entity_iterator ( + h5t_iterator_t* iter + ) { + H5_CORE_API_ENTER (h5_err_t, "iter=%p", iter); + H5_CORE_API_RETURN (h5_free (iter)); +} + +h5_loc_id_t +h5t_iterate_entities ( + h5t_iterator_t* iter + ) { + H5_CORE_API_ENTER (h5_err_t, "iter=%p", iter); + H5_CORE_API_RETURN (iter->iter (iter)); +} + +h5_err_t +h5t_end_iterate_entities ( + h5t_iterator_t* iter + ) { + H5_CORE_API_ENTER (h5_err_t, "iter=%p", iter); + memset (iter, 0, sizeof(*iter)); + h5t_leaf_iterator_t* it = (h5t_leaf_iterator_t*)iter; + it->face_idx = -1; + it->elem_idx = -1; + it->codim = -1; + H5_CORE_API_RETURN (H5_SUCCESS); +} + +h5_err_t +h5t_get_vertex_coords_by_index ( + h5t_mesh_t* const m, + h5_loc_idx_t vertex_index, + h5_float64_t P[3] + ) { + H5_CORE_API_ENTER (h5_err_t, + "m=%p, vertex_index=%llu, P=%p", + m, + (long long unsigned)vertex_index, + P); + h5_loc_vertex_t *vertex = &m->vertices[vertex_index]; + memcpy ( P, &vertex->P, sizeof ( vertex->P ) ); + H5_CORE_API_RETURN (H5_SUCCESS); +} + +h5_err_t +h5t_get_vertex_coords_by_id ( + h5t_mesh_t* const m, + h5_loc_id_t vertex_id, + h5_float64_t P[3] + ) { + H5_CORE_API_ENTER (h5_err_t, + "m=%p, vertex_id=%llu, P=%p", + m, + (long long unsigned)vertex_id, + P); + h5_loc_idx_t vertex_index; + TRY (h5tpriv_get_vertex_index_of_vertex (m, vertex_id, &vertex_index)); + TRY (h5t_get_vertex_coords_by_index (m, vertex_index, P)); + H5_CORE_API_RETURN (H5_SUCCESS); +} + +h5_err_t +h5t_get_vertex_by_id ( + h5t_mesh_t* const m, + const h5_loc_id_t vertex_id, + h5_glb_idx_t* glb_idx, + h5_float64_t* P[] + ) { + H5_CORE_API_ENTER (h5_err_t, + "m=%p, vertex_id=%lld, glb_idx=%p, P[]=%p", + m, (long long)vertex_id, glb_idx, P); + // get loc index of vertex + h5_loc_idx_t idx; + TRY (h5t_get_loc_vertex_index_of_vertex (m, vertex_id, &idx)); + *glb_idx = m->vertices[idx].idx; + *P = m->vertices[idx].P; + H5_CORE_API_RETURN (H5_SUCCESS); +} + + +h5_err_t +h5t_get_neighbor_indices ( + h5t_mesh_t* const m, + h5_loc_id_t entity_id, + h5_loc_idx_t* neighbor_indices + ) { + H5_CORE_API_ENTER (h5_err_t, + "m=%p, entity_id=%llu, neighbor_indices=%p", + m, + (long long unsigned)entity_id, + neighbor_indices); + h5_loc_idx_t elem_idx = h5tpriv_get_elem_idx (entity_id); + h5_loc_idx_t* indices = h5tpriv_get_loc_elem_neighbor_indices (m, elem_idx); + int num_facets = h5tpriv_ref_elem_get_num_facets (m); + for (int i = 0; i < num_facets; i++) { + neighbor_indices[i] = indices[i]; + } + H5_CORE_API_RETURN (H5_SUCCESS); +} diff --git a/src/h5core/h5t_retrieve_private.h b/src/h5core/h5t_retrieve_private.h new file mode 100644 index 0000000..54e5bb4 --- /dev/null +++ b/src/h5core/h5t_retrieve_private.h @@ -0,0 +1,34 @@ +/* + Copyright (c) 2006-2013, The Regents of the University of California, + through Lawrence Berkeley National Laboratory (subject to receipt of any + required approvals from the U.S. Dept. of Energy) and the Paul Scherrer + Institut (Switzerland). All rights reserved. + + License: see file COPYING in top level of source distribution. +*/ + +#ifndef __H5T_RETRIEVE_PRIVATE_H +#define __H5T_RETRIEVE_PRIVATE_H + +#include "h5core/h5_types.h" +#include "h5t_types_private.h" +#include "h5core/h5t_retrieve.h" + +struct h5t_retrieve_methods { + h5_err_t (*init_entity_iterator)( + h5t_iterator_t*, const int); +}; + +extern struct h5t_retrieve_methods h5tpriv_trim_retrieve_methods; +extern struct h5t_retrieve_methods h5tpriv_tetm_retrieve_methods; + +static inline h5_err_t +h5tpriv_init_entity_iterator ( + h5t_mesh_t* m, + h5t_iterator_t* const iter, + const int codim + ) { + return m->methods->retrieve->init_entity_iterator (iter, codim); +} + +#endif diff --git a/src/h5core/h5t_retrieve_tetm.c b/src/h5core/h5t_retrieve_tetm.c new file mode 100644 index 0000000..5fe7cfb --- /dev/null +++ b/src/h5core/h5t_retrieve_tetm.c @@ -0,0 +1,47 @@ +/* + Copyright (c) 2006-2012, The Regents of the University of California, + through Lawrence Berkeley National Laboratory (subject to receipt of any + required approvals from the U.S. Dept. of Energy) and the Paul Scherrer + Institut (Switzerland). All rights reserved. + + License: see file COPYING in top level of source distribution. +*/ + +#include "h5t_types_private.h" +#include "h5t_errorhandling_private.h" +#include "h5t_core_private.h" +#include "h5t_map_private.h" +#include "h5t_model_private.h" +#include "h5t_access_private.h" +#include "h5t_tags_private.h" +#include "h5t_retrieve_private.h" + +static h5_err_t +init_entity_iterator ( + h5t_iterator_t* const iter, + const int codim + ) { + h5t_leaf_iterator_t* it = (h5t_leaf_iterator_t*)iter; + switch (it->ref_elem->dim - codim) { + case 0: // iterate vertices + it->find = h5tpriv_find_tv2; + break; + case 1: // iterate edges + it->find = h5tpriv_find_te2; + break; + case 2: // iterate faces + it->find = h5tpriv_find_td2; + break; + case 3: // iterate elems + it->find = NULL; + break; + default: + return h5_error_internal (); + } + return H5_SUCCESS; +} + +struct h5t_retrieve_methods h5tpriv_tetm_retrieve_methods = { + init_entity_iterator +}; + diff --git a/src/h5core/h5t_retrieve_trim.c b/src/h5core/h5t_retrieve_trim.c new file mode 100644 index 0000000..8b2d834 --- /dev/null +++ b/src/h5core/h5t_retrieve_trim.c @@ -0,0 +1,43 @@ +/* + Copyright (c) 2006-2012, The Regents of the University of California, + through Lawrence Berkeley National Laboratory (subject to receipt of any + required approvals from the U.S. Dept. of Energy) and the Paul Scherrer + Institut (Switzerland). All rights reserved. + + License: see file COPYING in top level of source distribution. +*/ + +#include "h5t_types_private.h" +#include "h5t_errorhandling_private.h" +#include "h5t_core_private.h" +#include "h5t_map_private.h" +#include "h5t_model_private.h" +#include "h5t_access_private.h" +#include "h5t_tags_private.h" +#include "h5t_retrieve_private.h" + +static h5_err_t +init_entity_iterator ( + h5t_iterator_t* iter, + const int codim + ) { + h5t_leaf_iterator_t* it = (h5t_leaf_iterator_t*)iter; + switch (h5tpriv_ref_elem_get_dim (it) - codim) { + case 0: // iterate vertices + it->find = h5tpriv_find_tv2; + break; + case 1: // iterate edges + it->find = h5tpriv_find_te2; + break; + case 2: // iterate elems + it->find = NULL; + break; + default: + return h5_error_internal (); + } + return H5_SUCCESS; +} + +struct h5t_retrieve_methods h5tpriv_trim_retrieve_methods = { + init_entity_iterator +}; diff --git a/src/h5core/h5t_store.c b/src/h5core/h5t_store.c new file mode 100644 index 0000000..aeeb983 --- /dev/null +++ b/src/h5core/h5t_store.c @@ -0,0 +1,2744 @@ +/* + Copyright (c) 2006-2012, The Regents of the University of California, + through Lawrence Berkeley National Laboratory (subject to receipt of any + required approvals from the U.S. Dept. of Energy) and the Paul Scherrer + Institut (Switzerland). All rights reserved. + + License: see file COPYING in top level of source distribution. +*/ + +#include "h5_errorhandling_private.h" +#include "h5t_types_private.h" +#include "h5t_errorhandling_private.h" +#include "h5t_access_private.h" +#include "h5t_core_private.h" +#include "h5t_map_private.h" +#include "h5t_model_private.h" +#include "h5t_store_private.h" +#include "h5t_core_private.h" +#include "h5t_readwrite_private.h" +#include "h5_init_private.h" +#include "h5_mpi_private.h" + +#include "h5core/h5t_map.h" + +#define MAX(a, b) (((a) > (b)) ? (a) : (b)) + +int max_num_elems_p_chunk = 120; // minimum is 4 for triangle meshes and +// 8 for thetrahedral meshes + +#ifdef PARALLEL_IO +// that probably doesn't belong here... //TODO put in right place + print variables +h5_edge_list_t* +h5tpriv_init_edge_list ( + h5_int32_t num_alloc + ) { + + h5_edge_list_t* list = NULL; + list = h5_calloc (1, sizeof (*list)); + list->num_alloc = num_alloc; + list->num_items = 0; + list->items = h5_calloc (num_alloc, sizeof (*list->items)); + return list; +} +h5_err_t +h5tpriv_free_edge_list ( + h5_edge_list_t* list + ) { + H5_PRIV_FUNC_ENTER (h5_err_t, "list=%p", list); + TRY (h5_free (list->items)); + list->items = NULL; + TRY (h5_free(list)); + list = NULL; + H5_PRIV_FUNC_RETURN (H5_SUCCESS); +} +h5_err_t +h5tpriv_grow_edge_list ( + h5_edge_list_t* list, + h5_int32_t size + ) { + H5_PRIV_FUNC_ENTER (h5_err_t, "list=%p", list); + assert (list->num_alloc + size >= 0); + if (size < 0) { + h5_debug ("Warning: you are shrinking the edge_list!"); + } + if (size == 0) { + h5_debug ("Warning: you are not growing the edge_list!"); + } + TRY ( list->items = h5_alloc(list->items, (list->num_alloc + size) * sizeof (*list->items))); + H5_PRIV_FUNC_RETURN (H5_SUCCESS); +} + +/* + * compare edge_list_elem + */ +int compare_edge_list_elem(const void *p_a, const void *p_b) { + h5t_edge_list_elem_t* elem_a = ((h5t_edge_list_elem_t*) p_a); + h5t_edge_list_elem_t* elem_b = ((h5t_edge_list_elem_t*) p_b); + + if (elem_a->vtx1 - elem_b->vtx1 != 0) { + return elem_a->vtx1 - elem_b->vtx1; + } else { + if (elem_a->vtx2 - elem_b->vtx2 != 0) { + return elem_a->vtx2 - elem_b->vtx2; + } + } + return elem_a->proc - elem_b->proc; +} +h5_err_t +h5tpriv_uniquify_edge_list ( + h5_edge_list_t* list + ) { + H5_PRIV_FUNC_ENTER (h5_err_t, "list=%p", list); + if (list->num_items == 0) { + H5_PRIV_FUNC_LEAVE (H5_SUCCESS); + } + h5t_edge_list_elem_t* old_elem = list->items; + int num_old_elems = list->num_items; + list->items = h5_calloc (list->num_alloc, sizeof (*list->items)); + memcpy (&list->items[0], &old_elem[0], sizeof (*list->items)); + list->num_items = 1; + for (int i = 1; i < num_old_elems; i++) { + int comp = compare_edge_list_elem (&list->items[list->num_items-1], &old_elem[i] ); + if (comp > 0) { // element in old_elem is smaller then last elem in list + H5_PRIV_FUNC_LEAVE (H5_ERR_INVAL); // probably list wasn't sorted + } + if (comp < 0) { + memcpy (&list->items[list->num_items++], &old_elem[i], sizeof (*list->items)); + } + } + TRY (h5_free (old_elem)); + + H5_PRIV_FUNC_RETURN (H5_SUCCESS); +} + +h5_err_t +h5tpriv_sort_edge_list ( + h5_edge_list_t* list + ) { + H5_PRIV_FUNC_ENTER (h5_err_t, "list=%p", list); + qsort(list->items,list->num_items, sizeof (*list->items), compare_edge_list_elem); + H5_PRIV_FUNC_RETURN (H5_SUCCESS); +} + + +h5_int32_t +h5tpriv_find_edge_list ( + h5_edge_list_t* list, + h5t_edge_list_elem_t* elem + ) { + H5_PRIV_FUNC_ENTER (h5_err_t, "list=%p", list); + + comparison_fn_t comp_func; + comp_func.compare = compare_edge_list_elem; + // need linear search because we want to know first elem that hits. + h5t_edge_list_elem_t* retval = linsearch (elem, list->items ,list->num_items, sizeof (*list->items), comp_func); + if (retval == NULL) { + H5_PRIV_FUNC_LEAVE (list->num_items); + } + H5_PRIV_FUNC_RETURN (retval - list->items); // TODO check if that works +} +h5_err_t +h5tpriv_add_edge_list ( + h5_edge_list_t* list, + h5_glb_idx_t vtx1, + h5_glb_idx_t vtx2, + h5_loc_idx_t new_vtx, + h5_int32_t proc + ) { + H5_PRIV_FUNC_ENTER (h5_err_t, "list=%p", list); + h5t_edge_list_elem_t elem; + elem.vtx1 = vtx1 < vtx2 ? vtx1 : vtx2; // vtx1 < vtx2 always! + elem.vtx2 = vtx1 > vtx2 ? vtx1 : vtx2; + elem.new_vtx = (h5_glb_idx_t) new_vtx; // problem => first we would like to store loc_idx and later the glb_idx therefore cast here + // alternative would be to store two variables... + elem.proc = -1; + + // add edge + if (list->num_alloc == list->num_items) { + H5_PRIV_FUNC_LEAVE (H5_ERR_INVAL); + } + list->items[list->num_items].vtx1 = elem.vtx1; + list->items[list->num_items].vtx2 = elem.vtx2; + list->items[list->num_items].new_vtx = elem.new_vtx; + list->items[list->num_items++].proc = proc; + + H5_PRIV_FUNC_RETURN (H5_SUCCESS); +} + +//END TODO put in right place + print variables + +h5_err_t +h5tpriv_calc_chunk_statistic ( + h5t_mesh_t* const m, + FILE* file + ) { + H5_PRIV_FUNC_ENTER (h5_err_t, "m=%p", m); + if (file == NULL || m->chunks == NULL) { + H5_PRIV_FUNC_LEAVE (H5_SUCCESS); + } + fprintf (file, "# printing chunk statistics of file \n"); + fprintf (file, "# num_levels level max_elem num_chunks elems_p_level minfill maxfill avg_p_level avg_fill_p_level \n"); + int counter = 0; + h5_glb_idx_t* num_elems_p_level = NULL; + TRY (num_elems_p_level = h5_calloc (m->chunks->num_levels +1, sizeof (*num_elems_p_level))); + h5_glb_idx_t* min_elems_p_level = NULL; + TRY (min_elems_p_level = h5_calloc (m->chunks->num_levels +1, sizeof (*min_elems_p_level))); + h5_glb_idx_t* max_elems_p_level = NULL; + TRY (max_elems_p_level = h5_calloc (m->chunks->num_levels +1, sizeof (*max_elems_p_level))); + h5_float64_t* avg_p_level = NULL; + TRY (avg_p_level = h5_calloc (m->chunks->num_levels +1, sizeof (*avg_p_level))); + h5_float64_t* avgfill_p_level = NULL; + TRY (avgfill_p_level = h5_calloc (m->chunks->num_levels +1, sizeof (*avg_p_level))); + min_elems_p_level[ m->chunks->num_levels] = m->chunks->chunks[counter].num_elems; + max_elems_p_level[ m->chunks->num_levels] = m->chunks->chunks[counter].num_elems; + for (int i = 0; i < m->chunks->num_levels; i++) { + // calc avg + min_elems_p_level[i] = m->chunks->chunks[counter].num_elems; + max_elems_p_level[i] = m->chunks->chunks[counter].num_elems; + for (int j = 0; j < m->chunks->num_chunks_p_level[i]; j++) { + num_elems_p_level[i] += m->chunks->chunks[counter].num_elems; + num_elems_p_level[m->chunks->num_levels] += m->chunks->chunks[counter].num_elems; + min_elems_p_level[i] > m->chunks->chunks[counter].num_elems ? min_elems_p_level[i] = m->chunks->chunks[counter].num_elems : 0; + max_elems_p_level[i] < m->chunks->chunks[counter].num_elems ? max_elems_p_level[i] = m->chunks->chunks[counter].num_elems : 0; + counter++; + } + avg_p_level[i] = num_elems_p_level[i] / (double) m->chunks->num_chunks_p_level[i]; + avgfill_p_level[i] = avg_p_level[i] / max_num_elems_p_chunk; + min_elems_p_level[m->chunks->num_levels] > min_elems_p_level[i] ? min_elems_p_level[m->chunks->num_levels] = min_elems_p_level[i] : 0; + max_elems_p_level[m->chunks->num_levels] < max_elems_p_level[i] ? max_elems_p_level[m->chunks->num_levels] = max_elems_p_level[i] : 0; + } + avg_p_level[m->chunks->num_levels] = num_elems_p_level[m->chunks->num_levels] / (double) counter; + avgfill_p_level[m->chunks->num_levels] = avg_p_level[m->chunks->num_levels] / max_num_elems_p_chunk; + for (int i = 0; i <= m->chunks->num_levels; i++) { + if (i == m->chunks->num_levels) { + fprintf (file, " %6d %6d %9d %9d %10lld %10lld %10lld %10.4f %10.4f #avg over whole mesh\n\n", + m->chunks->num_levels, i, max_num_elems_p_chunk, counter, + (long long int) num_elems_p_level[i],(long long int)min_elems_p_level[i], + (long long int)max_elems_p_level[i],avg_p_level[i],avgfill_p_level[i]); + } else { + fprintf (file, " %6d %6d %9d %9d %10lld %10lld %10lld %10.4f %10.4f \n", + m->chunks->num_levels, i, max_num_elems_p_chunk, m->chunks->num_chunks_p_level[i], + (long long int) num_elems_p_level[i],(long long int)min_elems_p_level[i], + (long long int)max_elems_p_level[i],avg_p_level[i],avgfill_p_level[i]); + } + + } + + H5_PRIV_FUNC_RETURN (H5_SUCCESS); +} + +/* + * Calculate the global vertex range for the new vertices + * range[i] = first glb idx of proc i + * range[nproc] = next glb idx to assign + */ +h5_err_t +h5tpriv_get_vtx_ranges ( + h5t_mesh_t* const m, + h5_glb_idx_t* range + ) { + H5_PRIV_FUNC_ENTER (h5_err_t, "m=%p, range=%p", m, range); + h5_glb_idx_t sendbuf = m->last_stored_vid - m->last_stored_vid_before_ref; + + TRY (h5priv_mpi_allgather ( + &sendbuf, + 1, + MPI_LONG, + &range[1], + 1, + MPI_LONG, + m->f->props->comm)); + + // set start of new vtx idx (because if leaf_level != 0 it was increased already) + if (m->leaf_level == 0) { + range[0] = 0; + } else { + range[0] = m->num_glb_vertices[m->leaf_level-1]; + } + // calc range + for (int i = 1; i <= m->f->nprocs; i++) { + range[i] += range[i-1]; + } + + if (m->leaf_level == 0) { + m->num_glb_vertices[0] = range[m->f->myproc]; + } else { + m->num_glb_vertices[m->leaf_level-1] = range[m->f->myproc]; + } + H5_PRIV_FUNC_RETURN (H5_SUCCESS); +} +#endif +/* + Assign unique global indices to vertices. + */ +static h5_err_t +assign_global_vertex_indices ( + h5t_mesh_t* const m + ) { + H5_PRIV_FUNC_ENTER (h5_err_t, "m=%p", m); + h5_loc_idx_t local_idx = (m->leaf_level == 0) ? + 0 : m->num_loc_vertices[m->leaf_level-1]; + + +#ifdef PARALLEL_IO + // exchange num vertices and calc range + h5_glb_idx_t* range = NULL; + TRY (range = h5_calloc (m->f->nprocs + 1, sizeof (*range))); + TRY (h5tpriv_get_vtx_ranges (m, range)); + int counter = 0; + for (;local_idx < m->num_loc_vertices[m->num_leaf_levels-1]; + local_idx++, counter++) { + m->vertices[local_idx].idx = range[m->f->myproc] + counter; + } + if (counter + range[m->f->myproc] != range[m->f->myproc + 1]) { + H5_PRIV_FUNC_LEAVE (H5_ERR_INTERNAL); + } + TRY (h5_free (range)); +#else + /* + simple in serial runs: global_id = local_id + */ + + for (; + local_idx < m->num_loc_vertices[m->num_leaf_levels-1]; + local_idx++) { + m->vertices[local_idx].idx = local_idx; + } +#endif + H5_PRIV_FUNC_RETURN (H5_SUCCESS); +} +/* + * there is a different version needed for after the refinement because + * not all vertices need to get a glb_idx from this proc + */ + +static h5_err_t +assign_global_vertex_indices_chk ( + h5t_mesh_t* const m, + h5_loc_idxlist_t* vtx_list, // list with vertices that don't need to be assigned + h5_glb_idx_t* vtx_range + ) { + H5_PRIV_FUNC_ENTER (h5_err_t, "m=%p, vtx_list=%p, vtx_range=%p", m, vtx_list, vtx_range); + h5_loc_idx_t local_idx = (m->leaf_level == 0) ? + 0 : m->num_loc_vertices[m->leaf_level-1]; // should not be 0 since only after ref... + + int counter = 0; + for (;local_idx < m->num_loc_vertices[m->num_leaf_levels-1]; + local_idx++) { + + h5_loc_idx_t retval = h5priv_find_in_loc_idxlist (vtx_list, local_idx); + if (retval < 0) { + // idx needs to be assigned. + m->vertices[local_idx].idx = vtx_range[m->f->myproc] + counter; + counter++; + } + } + if (counter + vtx_range[m->f->myproc] != vtx_range[m->f->myproc + 1]) { + H5_PRIV_FUNC_LEAVE (H5_ERR_INTERNAL); + } + + H5_PRIV_FUNC_RETURN (H5_SUCCESS); +} + +/*! + Assign unique global indices to new elements. + */ +static h5_err_t +assign_glb_elem_indices ( + h5t_mesh_t* const m + ) { + /* + simple in serial runs: global index = local index + */ + h5_loc_idx_t loc_idx = (m->leaf_level == 0) ? 0 : m->num_interior_elems[m->leaf_level-1]; + + for (; loc_idx < m->num_interior_elems[m->leaf_level]; loc_idx++) { + h5tpriv_set_loc_elem_glb_idx (m, loc_idx, loc_idx); + } + + return H5_SUCCESS; +} + +/*! + Assign unique global indices to new elements. + */ +static h5_err_t +assign_glb_elem_indices_chk ( //TODO use ifdef instead of new func name + h5t_mesh_t* const m, + h5_glb_idx_t* range + ) { + + H5_PRIV_FUNC_ENTER (h5_err_t, "m=%p, range=%p", m, range); + + h5_loc_idx_t loc_idx = (m->leaf_level == 0) ? 0 : m->num_interior_elems[m->leaf_level-1]; + int counter = 0; + for (; loc_idx < m->num_interior_elems[m->leaf_level]; loc_idx++, counter++) { + h5tpriv_set_loc_elem_glb_idx (m, loc_idx, range[m->f->myproc] + counter); + } + + if (counter + range[m->f->myproc] != range[m->f->myproc + 1]) { + H5_PRIV_FUNC_LEAVE (H5_ERR_INTERNAL); + } + H5_PRIV_FUNC_RETURN (H5_SUCCESS); + +} + + +h5_lvl_idx_t +h5tpriv_add_level ( + h5t_mesh_t* const m + ) { + H5_CORE_API_ENTER (h5_lvl_idx_t, "m=%p", m); + CHECK_WRITABLE_MODE(m->f); + + m->leaf_level = m->num_leaf_levels++; + m->num_loaded_levels = m->num_leaf_levels; + + TRY (m->num_glb_vertices = h5_alloc (m->num_glb_vertices, m->num_leaf_levels*sizeof (*m->num_glb_vertices))); + TRY (m->num_loc_vertices = h5_alloc (m->num_loc_vertices, m->num_leaf_levels*sizeof (*m->num_loc_vertices))); + + TRY (m->num_b_vtx = h5_alloc (m->num_b_vtx, m->num_leaf_levels*sizeof (*m->num_b_vtx))); + TRY (m->first_b_vtx = h5_alloc (m->first_b_vtx, m->num_leaf_levels*sizeof (*m->first_b_vtx))); + + TRY (m->num_glb_elems = h5_alloc (m->num_glb_elems, m->num_leaf_levels*sizeof (*m->num_glb_elems))); + TRY (m->num_glb_leaf_elems = h5_alloc (m->num_glb_leaf_elems, m->num_leaf_levels*sizeof (*m->num_glb_leaf_elems))); + TRY (m->num_interior_elems = h5_alloc (m->num_interior_elems, m->num_leaf_levels*sizeof (*m->num_interior_elems))); + TRY (m->num_interior_leaf_elems = h5_alloc (m->num_interior_leaf_elems, m->num_leaf_levels*sizeof (*m->num_interior_leaf_elems))); + TRY (m->num_ghost_elems = h5_alloc (m->num_ghost_elems, m->num_leaf_levels*sizeof (*m->num_ghost_elems))); + + m->num_glb_vertices[m->leaf_level] = -1; + m->num_loc_vertices[m->leaf_level] = -1; + + m->num_glb_elems[m->leaf_level] = -1; + m->num_glb_leaf_elems[m->leaf_level] = -1; + m->num_interior_elems[m->leaf_level] = -1; + m->num_interior_leaf_elems[m->leaf_level] = -1; + m->num_ghost_elems[m->leaf_level] = 0; + + if (m->leaf_level == 0) { + /* nothing stored yet */ + m->last_stored_vid = -1; + m->last_stored_eid = -1; + m->last_stored_vid_before_ref = -1; + m->last_stored_eid_before_ref = -1; + } else { + assert (m->last_stored_vid == m->num_loc_vertices[m->leaf_level - 1] - 1); + assert (m->last_stored_eid == m->num_interior_elems[m->leaf_level - 1] - 1); + } + + H5_CORE_API_RETURN (m->leaf_level); +} + +/*! + Allocate memory for (more) vertices. + */ +h5_err_t +h5t_begin_store_vertices ( + h5t_mesh_t* const m, + const h5_size_t num + ) { + H5_CORE_API_ENTER (h5_err_t, "m=%p, num=%llu", m, (long long unsigned)num); + if (m->leaf_level < 0) { + H5_CORE_API_LEAVE (h5tpriv_error_undef_level()); + } + h5_size_t cur_num_loc_vertices = (m->leaf_level > 0 ? + m->num_loc_vertices[m->leaf_level-1] : 0); + m->last_stored_vid = cur_num_loc_vertices - 1; + m->last_stored_vid_before_ref = m->last_stored_vid; + m->num_loc_vertices[m->leaf_level] = cur_num_loc_vertices+num; + m->dsinfo_vertices.dims[0] = cur_num_loc_vertices+num; + H5_CORE_API_RETURN (h5tpriv_alloc_loc_vertices (m, cur_num_loc_vertices+num)); +} + +h5_loc_idx_t +h5t_store_vertex ( + h5t_mesh_t* const m, /*!< file handle */ + const h5_glb_idx_t glb_id, /*!< global vertex id from mesher or -1 */ + const h5_float64_t P[3] /*!< coordinates */ + ) { + H5_CORE_API_ENTER (h5_loc_idx_t, + "m=%p, glb=id=%lld, P=%p", + m, + (long long)glb_id, + P); + + // more than allocated + if (m->last_stored_vid+1 >= m->num_loc_vertices[m->leaf_level]) + H5_CORE_API_LEAVE (HANDLE_H5_OVERFLOW_ERR( + m->num_loc_vertices[m->leaf_level])); + + h5_loc_idx_t local_idx = ++m->last_stored_vid; + h5_loc_vertex_t *vertex = &m->vertices[local_idx]; + vertex->idx = glb_id; /* ID from mesher, replaced later!*/ + memcpy (&vertex->P, P, sizeof (vertex->P)); + H5_CORE_API_RETURN (local_idx); +} + +h5_err_t +h5t_end_store_vertices ( + h5t_mesh_t* const m + ) { + H5_CORE_API_ENTER (h5_err_t, "m=%p", m); + + m->num_loc_vertices[m->leaf_level] = m->last_stored_vid+1; + TRY (assign_global_vertex_indices (m)); + TRY (h5tpriv_rebuild_map_vertex_g2l_partial (m)); + m->last_stored_vid_before_ref = -1; + H5_CORE_API_RETURN (H5_SUCCESS); +} + +/*! + Initialize everything so that we can begin to store elements. + + \param[in] f file handle + \param[in] num number of elements to add + */ +h5_err_t +h5t_begin_store_elems ( + h5t_mesh_t* const m, + const h5_size_t num, + const h5_weight_t num_weights + ) { + H5_CORE_API_ENTER (h5_err_t, + "m=%p, num=%llu, num_weights=%d", + m, (long long unsigned)num, num_weights); + + h5_debug ("begin storing %llu elements", (long long)num); + size_t cur = m->leaf_level > 0 ? m->num_interior_elems[m->leaf_level-1] : 0; + m->last_stored_eid = cur - 1; + size_t new = num + cur; + m->dsinfo_elems.dims[0] = new; + + m->num_interior_elems[m->leaf_level] = new; + + m->num_interior_leaf_elems[m->leaf_level] = m->leaf_level > 0 ? + num + m->num_interior_leaf_elems[m->leaf_level-1] : num; + + m->num_weights = num_weights; + if (m->leaf_level == 0) { + TRY (m->weights = h5_calloc(num_weights * num, sizeof (* m->weights) )); + if (m->num_weights < 1) { + m->weights = NULL; + } + } else { + // we don't now how many glb elems -> alloc needs to be later + } + + m->last_stored_eid_before_ref = m->last_stored_eid; + + H5_CORE_API_RETURN (h5tpriv_alloc_loc_elems (m, cur, new)); +} + + +/*! + Store element. The vertices are given via their local indices. + + \param[in] f File handle. + \param[in] elem_idx_of_parent Local indexd of the parent element + or \c -1. + \param[in] vertices Local vertex indices defining the + tetrahedron. + */ +h5_loc_idx_t +h5t_store_elem ( + h5t_mesh_t* const m, + const h5_loc_idx_t parent_idx, + const h5_loc_idx_t* vertex_indices, + const h5_weight_t* weights + ) { + H5_CORE_API_ENTER (h5_loc_idx_t, + "m=%p, parent_idx=%lld, vertex_indices=%p, weights=%p", + m, + (long long)parent_idx, + vertex_indices, + weights); + + /* more than allocated? */ + if ( m->last_stored_eid+1 >= m->num_interior_elems[m->leaf_level] ) + H5_CORE_API_LEAVE ( + HANDLE_H5_OVERFLOW_ERR (m->num_interior_elems[m->leaf_level])); + + /* check parent id */ + if ((m->leaf_level == 0 && parent_idx != -1) || + (m->leaf_level > 0 && parent_idx < 0) || + (m->leaf_level > 0 + && parent_idx >= m->num_interior_elems[m->leaf_level-1]) + ) { + H5_CORE_API_LEAVE ( + HANDLE_H5_PARENT_ID_ERR (parent_idx)); + } + + /* store elem data (but neighbors) */ + h5_loc_idx_t elem_idx = ++m->last_stored_eid; + h5tpriv_set_loc_elem_parent_idx (m, elem_idx, parent_idx); + h5tpriv_set_loc_elem_child_idx (m, elem_idx, -1); + h5tpriv_set_loc_elem_level_idx (m, elem_idx, m->leaf_level); + + // get ptr to local vertices store + h5_loc_idx_t* loc_vertex_indices = h5tpriv_get_loc_elem_vertex_indices ( + m, elem_idx); + int num_vertices = h5tpriv_ref_elem_get_num_vertices (m); + memcpy (loc_vertex_indices, vertex_indices, + sizeof (*vertex_indices)*num_vertices); + + + if (m->leaf_level > 0) { + /* add edges to map edges -> elements */ + h5_loc_idx_t face_idx; + int num_faces = h5tpriv_ref_elem_get_num_edges (m); + for (face_idx = 0; face_idx < num_faces; face_idx++) { + // add edges to neighbour struct + TRY (h5tpriv_enter_te2 (m, face_idx, elem_idx, NULL)); + } + } + if (weights != NULL && m->leaf_level == 0) { + memcpy (&m->weights[elem_idx * m->num_weights], weights, sizeof (*m->weights) * m->num_weights); + for (int i = 0; i < m->num_weights; i++) { + if (m->weights[elem_idx * m->num_weights + i] < 1) { + m->weights[elem_idx * m->num_weights + i] = 1; + } + } + } + H5_CORE_API_RETURN (elem_idx); +} +h5_loc_idx_t +h5t_store_elem2 ( + h5t_mesh_t* const m, + const h5_loc_idx_t parent_idx, + const h5_loc_idx_t* vertex_indices, + const h5_weight_t* weights + ) { + H5_CORE_API_ENTER (h5_loc_idx_t, + "m=%p, parent_idx=%lld, vertex_indices=%p, weights=%p", + m, + (long long)parent_idx, + vertex_indices, + weights); + h5t_store_elem (m, parent_idx, vertex_indices, weights); + h5_loc_idx_t* loc_vertex_indices = h5tpriv_get_loc_elem_vertex_indices ( + m, m->last_stored_eid); + int num_vertices = h5tpriv_ref_elem_get_num_vertices (m); + TRY (h5tpriv_sort_local_vertex_indices (m, loc_vertex_indices, num_vertices)); + H5_CORE_API_RETURN (m->last_stored_eid); +} +/* + Rebuild mapping of global element indices to their local indices. + */ +h5_err_t +rebuild_map_elem_g2l ( + h5t_mesh_t* const m + ) { + H5_PRIV_FUNC_ENTER (h5_err_t, "m=%p", m); + if (m->num_leaf_levels <= 0) H5_PRIV_API_LEAVE (H5_SUCCESS); + + h5_idxmap_t* map = &m->map_elem_g2l; + h5_loc_idx_t loc_idx = m->leaf_level > 0 ? m->num_interior_elems[m->leaf_level-1] : 0; + h5_loc_idx_t num_interior_elems = m->num_interior_elems[m->num_leaf_levels-1]; + + /* (re-)alloc mem for global to local ID mapping */ + TRY (h5priv_grow_idxmap (map, num_interior_elems)); + + h5_idxmap_el_t *item = &map->items[loc_idx]; + for (; loc_idx < num_interior_elems; loc_idx++, item++) { + item->glb_idx = h5tpriv_get_loc_elem_glb_idx (m, loc_idx); + item->loc_idx = loc_idx; + map->num_items++; + } + h5priv_sort_idxmap (map); + H5_PRIV_FUNC_RETURN (H5_SUCCESS); +} +/* + Rebuild mapping of global element indices to their local indices. + */ +h5_err_t +rebuild_map_elem_g2l_partial ( // we need that to update map for the refined elems before we have the + // refined elements from the other proces + h5t_mesh_t* const m + ) { + H5_PRIV_FUNC_ENTER (h5_err_t, "m=%p", m); + if (m->num_leaf_levels <= 0) H5_PRIV_API_LEAVE (H5_SUCCESS); + + h5_idxmap_t* map = &m->map_elem_g2l; + h5_loc_idx_t loc_idx = m->last_stored_eid_before_ref +1; + h5_loc_idx_t num_interior_elems = m->last_stored_eid - m->last_stored_eid_before_ref; + + /* (re-)alloc mem for global to local ID mapping */ + TRY (h5priv_grow_idxmap (map, map->size + num_interior_elems)); + + h5_idxmap_el_t *item = &map->items[loc_idx]; + for (; loc_idx <= m->last_stored_eid ; loc_idx++, item++) { + item->glb_idx = h5tpriv_get_loc_elem_glb_idx (m, loc_idx); + item->loc_idx = loc_idx; + map->num_items++; + } + assert (map->size >= map->num_items); + h5priv_sort_idxmap (map); + H5_PRIV_FUNC_RETURN (H5_SUCCESS); +} + +h5_err_t +h5t_end_store_elems ( + h5t_mesh_t* const m + ) { + H5_CORE_API_ENTER (h5_err_t, "m=%p", m); + h5_debug ("end storing elements"); + m->num_interior_elems[m->leaf_level] = m->last_stored_eid+1; + m->num_glb_elems[m->leaf_level] = m->last_stored_eid+1; + m->num_glb_leaf_elems[m->leaf_level] = m->num_interior_leaf_elems[m->leaf_level]; + m->last_stored_eid_before_ref = -1; + + /* assign global indices to new indices */ + TRY (assign_glb_elem_indices (m)); + + /* rebuild map: global index -> local_index */ + TRY (rebuild_map_elem_g2l (m)); + + /* mesh specific finalize */ + TRY (m->methods->store->end_store_elems (m)); + + H5_CORE_API_RETURN (H5_SUCCESS); +} +/* + * linear search trough chunks to find chk_idx which contains element + */ +static h5_err_t +h5tpriv_find_chk_of_elem ( + h5t_mesh_t* m, + h5_loc_id_t id, + h5_chk_idx_t* chk_idx + ) { + H5_PRIV_FUNC_ENTER (h5_err_t, "m=%p, id=%lld, chk_idx=%p", m, (long long int)id, chk_idx); + h5_glb_idx_t glb_idx = h5tpriv_get_loc_elem_glb_idx (m, h5tpriv_get_elem_idx (id)); + + // calc total num chunks + h5_chk_idx_t total_num_chunks = 0; + for (int i = 0; i < m->chunks->num_levels; i++) { + total_num_chunks += m->chunks->num_chunks_p_level[i]; + } + for (h5_chk_idx_t i = 0; i < total_num_chunks; i++) { + if (glb_idx >= m->chunks->chunks[i].elem && + glb_idx < m->chunks->chunks[i].elem + m->chunks->chunks[i].num_elems) { + // elem is contained in chunk + *chk_idx = i; + H5_PRIV_FUNC_LEAVE (H5_SUCCESS); + } + + } + H5_PRIV_FUNC_RETURN (H5_ERR_INVAL); +} +/* + * compare chk_idx + */ +int compare_vtx_chk_list(const void *p_a, const void *p_b) { + return ((h5t_vtx_chk_list_t*) p_a)->chk - ((h5t_vtx_chk_list_t*) p_b)->chk; +} + +#ifdef CHUNKING_OF_VTX +static h5_err_t +h5tpriv_calc_vtx_permutation ( + h5t_mesh_t* m, + h5t_vtx_chk_list_t* permut + ) { + H5_PRIV_FUNC_ENTER (h5_err_t, "m=%p, permut=%p", m, permut); + h5t_vtx_chk_list_t* b_vtx = NULL; // boundary vertices + TRY (b_vtx = h5_calloc (m->num_loc_vertices[m->leaf_level], sizeof (*b_vtx))); + memset (b_vtx, -1,m->num_loc_vertices[m->leaf_level]*sizeof (*b_vtx)); + + h5_chk_idx_t* chk_idx_of_vtx = NULL; // allows us also to sort vtx acc to chunks + TRY (chk_idx_of_vtx = h5_calloc (m->num_loc_vertices[m->leaf_level], sizeof (*chk_idx_of_vtx))); + h5_loc_idx_t counter = 0; + h5_loc_idx_t b_counter = 0; + h5_loc_idlist_t* list = NULL; + + + for (h5_loc_idx_t i = 0; i < m->num_loc_vertices[m->leaf_level]; i++) { + // get list of elems for vertex i + TRY (h5tpriv_find_tv3 (m, i, &list)); + h5_chk_idx_t old_chk_idx = -1; + h5_chk_idx_t chk_idx = -1; + int done = 0; + for (int j = 0; j < list->num_items; j++) { + TRY ( h5tpriv_find_chk_of_elem (m, list->items[j], &chk_idx)); + if (j == 0) { + old_chk_idx = chk_idx; + } + if (old_chk_idx != chk_idx) { + // vtx is a chunk boundary vtx + b_vtx[b_counter++].vtx = i; + done = 1; + break; + } + + } + if (!done) { + // vtx is a inner chunk vtx + permut[counter].vtx = i; + permut[counter++].chk = chk_idx; + } + } + if (counter + b_counter != m->num_loc_vertices[m->leaf_level]) { + H5_PRIV_FUNC_LEAVE (H5_ERR_INTERNAL); + } + // sort vtx acc to chunk + qsort (permut, counter, sizeof (*permut), compare_vtx_chk_list); + + memcpy (&permut[counter], b_vtx, b_counter * sizeof (*permut)); + + m->num_b_vtx[0] = b_counter; + m->first_b_vtx[0] = counter; + + TRY (h5_free (b_vtx)); + H5_PRIV_FUNC_RETURN (H5_SUCCESS); +} + +/* + * calculate the reverse permutation access old_idx gives new_idx + */ +static h5_err_t +h5tpriv_calc_vtx_revpermutation ( + h5t_mesh_t* m, + h5t_vtx_chk_list_t* permut, + h5t_vtx_chk_list_t* rev_permut + ) { + H5_PRIV_FUNC_ENTER (h5_err_t, "m=%p, permut=%p, rev_permut=%p", m, permut, rev_permut); + for (int i = 0; i < m->num_loc_vertices[m->leaf_level]; i++) { + h5_loc_idx_t vtx = permut[i].vtx; + rev_permut[vtx].vtx = i; + } + H5_PRIV_FUNC_RETURN (H5_SUCCESS); +} +#endif // CHUNKING_OF_VTX + +// used to chunk vtx +//static h5_err_t +//h5tpriv_store_vtx_range_to_chk ( +// h5t_mesh_t* m, +// h5t_vtx_chk_list_t* permut +// ) { +// H5_PRIV_FUNC_ENTER (h5_err_t, "m=%p, permut=%p", m, permut); +// assert (m->f->nprocs == 1); +// int counter = 0; +// h5_chk_idx_t chk_idx = -1; +// h5_glb_idx_t first_vtx = -1; +// for (int i = 0; i < m->num_loc_vertices[m->leaf_level]; i++) { +// first_vtx = i; +// chk_idx = permut[i].chk; +// counter = 1; +// while (i + 1 < m->num_loc_vertices[m->leaf_level] && chk_idx == permut[i+1].chk) { +// counter++; +// i++; +// } +// if (chk_idx != -1) { +// m->chunks->chunks[chk_idx].vtx = first_vtx; +// m->chunks->chunks[chk_idx].num_vtx = counter; +// } +// } +// H5_PRIV_FUNC_RETURN (H5_SUCCESS); +//} + + +h5_err_t +h5t_end_store_ckd_elems ( + h5t_mesh_t* const m + ) { + H5_CORE_API_ENTER (h5_err_t, "m=%p", m); + h5_debug ("end storing elements"); +#ifdef PARALLEL_IO + m->num_interior_elems[m->leaf_level] = m->last_stored_eid+1; + m->num_glb_elems[m->leaf_level] = m->last_stored_eid+1;// only works for serial case + m->num_glb_leaf_elems[m->leaf_level] = m->num_interior_leaf_elems[m->leaf_level]; + + if (m->leaf_level == 0) { + // calculate midpoints of elements + h5_oct_point_t* midpoints; + TRY (midpoints = h5_calloc (m->num_glb_elems[0], sizeof (*midpoints))); + h5_loc_idx_t curr_midp = 0; + + h5_float64_t bb[6]; // for calculating bounding box + int num_faces = h5tpriv_ref_elem_get_num_edges (m); + int num_vertices = h5tpriv_ref_elem_get_num_vertices (m); + + for (h5_loc_idx_t i = 0; i < m->num_glb_elems[0]; i++) { + h5_loc_idx_t* indices; //[4] = {-1, -1, -1, -1}; + indices = h5tpriv_get_loc_elem_vertex_indices (m, i); + h5_float64_t midpoint[3] = {0, 0, 0}; + h5_float64_t P[3]; + + for (int j = 0; j < num_vertices; j++) { + TRY (h5t_get_vertex_coords_by_index (m, indices[j], P)); + midpoint[0] += P[0]; + midpoint[1] += P[1]; + midpoint[2] += P[2]; + if (i == 0 && j == 0) { + bb[0] = P[0]; + bb[1] = P[1]; + bb[2] = P[2]; + bb[3] = P[0]; + bb[4] = P[1]; + bb[5] = P[2]; + } else { + bb[0] = (P[0] < bb[0]) ? P[0] : bb[0]; + bb[1] = (P[1] < bb[1]) ? P[1] : bb[1]; + bb[2] = (P[2] < bb[2]) ? P[2] : bb[2]; + bb[3] = (P[0] > bb[3]) ? P[0] : bb[3]; + bb[4] = (P[1] > bb[4]) ? P[1] : bb[4]; + bb[5] = (P[2] > bb[5]) ? P[2] : bb[5]; + } + } + midpoints[curr_midp].x = midpoint[0] / 3.0; + midpoints[curr_midp].y = midpoint[1] / 3.0; + midpoints[curr_midp].z = midpoint[2] / 3.0; + midpoints[curr_midp].oct = -1; + midpoints[curr_midp].elem = i; + curr_midp++; + } + + bb[3] += 0.1; + + bb[4] += 0.1; + + bb[5] += 0.1; + + TRY (H5t_set_bounding_box (m->octree, bb)); + + TRY (H5t_set_maxpoints (m->octree, max_num_elems_p_chunk/ h5tpriv_get_num_new_elems(m))); + + TRY (H5t_refine_w_points(m->octree, midpoints, m->num_glb_elems[0], max_num_elems_p_chunk)); + + TRY (H5t_add_points_to_leaf (m->octree, midpoints, m->num_glb_elems[0])); + + // set octree userlevel + h5t_oct_iterator_t* iter = NULL; + + TRY (H5t_init_leafoct_iterator (m->octree, &iter)); + + h5_oct_idx_t oct_idx; + while ((oct_idx = H5t_iterate_oct (iter)) != -1) { + TRY (H5t_set_userlevel (m->octree, oct_idx, 0)); + } + TRY (H5t_end_iterate_oct (iter)); + + TRY (H5t_update_internal (m->octree)); + // reorder elements + // midpoints where already ordered according to octants (i.e. chunks) + + h5_loc_idx_t size = m->num_interior_elems[m->leaf_level]; + h5_loc_elem_t* loc_elems = m->loc_elems; + m->loc_elems = NULL; + TRY (h5tpriv_alloc_loc_elems (m, 0, size)); + + //TODO include ordering in subchunks + h5_loc_idx_t* loc_vertex_indices; + h5_loc_idx_t* old_loc_vertex_indices; + // could get a problem is no element is added + h5_chk_idx_t num_chunks = 1; + h5_oct_idx_t old_idx = midpoints[0].oct; + + h5_weight_t* old_weights = m->weights; + TRY (m->weights = h5_calloc(m->num_weights * m->num_glb_elems[0], sizeof (* m->weights) )); + if (m->num_weights < 1) { + m->weights = NULL; + } + h5t_oct_count_list_t oct_c_list; + oct_c_list.num_items = 0; + oct_c_list.size = size; + TRY (oct_c_list.items = h5_calloc (size, sizeof (*oct_c_list.items))); + oct_c_list.items[oct_c_list.num_items++].oct = midpoints[0].oct; + int running_counter = 0; + // copy the elements into the right order + for (int i = 0; i < size; i++) { + if (midpoints[i].oct != old_idx) { + // this will be a new chunk + num_chunks++; + old_idx = midpoints[i].oct; + oct_c_list.items[oct_c_list.num_items].oct = old_idx; + oct_c_list.items[oct_c_list.num_items-1].count = i - running_counter; + running_counter = i; + oct_c_list.num_items++; + } + // permute weights + memcpy(&m->weights[i*m->num_weights], + &old_weights[midpoints[i].elem *m->num_weights], + sizeof (*m->weights) * m->num_weights); + + loc_vertex_indices = h5tpriv_get_loc_elem_vertex_indices (m, i); + + old_loc_vertex_indices = h5tpriv_get_loc_elem_vertex_indices_of_array (m, midpoints[i].elem, loc_elems); + + h5tpriv_set_loc_elem_parent_idx (m, i, -1); + h5tpriv_set_loc_elem_child_idx (m, i, -1); + h5tpriv_set_loc_elem_level_idx (m, i, m->leaf_level); + + memcpy (loc_vertex_indices, old_loc_vertex_indices, num_vertices * sizeof (*loc_vertex_indices)); + + /* add edges to map edges -> elements */ + h5_loc_idx_t face_idx; + + for (face_idx = 0; face_idx < num_faces; face_idx++) { + // add edges to neighbour struct + TRY (h5tpriv_enter_te2 (m, face_idx, i, NULL)); + } + + } + oct_c_list.items[oct_c_list.num_items-1].count = size - running_counter; + + // free loc_elems + TRY (h5_free (loc_elems)); + + // free old_weights + TRY (h5_free (old_weights)); + + // set up chunk structure + TRY (h5tpriv_init_chunks (m)); + + TRY (h5tpriv_grow_chunks (m, num_chunks)); + + // create chunks + h5_glb_idx_t elem_range[2]; + elem_range[0] = 0; + elem_range[1] = m->num_glb_elems[m->leaf_level]; + h5_glb_idx_t chk_range[2]; + chk_range[0] = 0; + chk_range[1] = num_chunks; + TRY (h5tpriv_store_chunks (m, &oct_c_list, num_chunks, elem_range, chk_range)); + TRY (h5_free (oct_c_list.items)); + + h5t_oct_userdata_t* userdata = NULL; + //store userdata to chunks + for (int j = 0; j < num_chunks; j++) { + TRY (H5t_get_userdata_rw (m->octree, m->chunks->chunks[j].oct_idx,(void **) &userdata)); + userdata->idx[0] = (h5_chk_idx_t) j; + } + + TRY (H5t_update_userdata (m->octree)); + TRY (h5_free (midpoints)); + } + + + + /* assign global indices to new indices */ + TRY (assign_glb_elem_indices (m)); + + /* rebuild map: global index -> local_index */ + TRY (rebuild_map_elem_g2l (m)); + + /* mesh specific finalize */ + TRY (m->methods->store->end_store_elems (m)); + + +#ifdef CHUNKING_OF_VTX + // abbandon chunking of vtx for time reasons + if (m->leaf_level == 0) { + // sort vertices + //calculate permutation + h5t_vtx_chk_list_t* permut = NULL; + TRY (permut = h5_calloc (m->num_loc_vertices[m->leaf_level], sizeof (*permut))); + memset (permut, -1,m->num_loc_vertices[m->leaf_level]*sizeof (*permut)); + TRY (h5tpriv_calc_vtx_permutation (m, permut)); + + h5t_vtx_chk_list_t* rev_permut = NULL; // here is the reverse permutation + TRY (rev_permut = h5_calloc (m->num_loc_vertices[m->leaf_level], sizeof (*rev_permut))); + + TRY (h5tpriv_calc_vtx_permutation (m, permut)); + + TRY (h5tpriv_calc_vtx_revpermutation (m, permut, rev_permut)); + + // permute vertices + h5_loc_vertex_t* vertices = m->vertices; + m->vertices = NULL; + TRY (h5tpriv_alloc_loc_vertices (m, *m->num_loc_vertices)); + for (h5_loc_idx_t i = 0; i < *m->num_loc_vertices; i++) { + memcpy (&m->vertices[i], &vertices[permut[i].vtx], sizeof (*vertices)); + } + TRY (h5_free (vertices)); + TRY (assign_global_vertex_indices (m)); + TRY (h5_free (m->map_vertex_g2l.items)); + m->map_vertex_g2l.items = NULL; + size_t size = m->num_loc_vertices[m->leaf_level] + 128; + TRY (h5priv_new_idxmap (&m->map_vertex_g2l, size)); + TRY (h5tpriv_rebuild_map_vertex_g2l (m, m->leaf_level, m->leaf_level)); + m->last_stored_vid_before_ref = -1; + // update elements + + // permute vertex_indices + for (h5_loc_idx_t i = 0; i < *m->num_glb_elems; i++) { + h5_loc_idx_t* vertex_indices = NULL; + int num_vtx = h5tpriv_ref_elem_get_num_vertices(m); + vertex_indices = h5tpriv_get_loc_elem_vertex_indices (m, i); + for (int j = 0; j < num_vtx; j++) { + vertex_indices[j] = rev_permut[vertex_indices[j]].vtx; + } + TRY (h5tpriv_sort_local_vertex_indices (m, vertex_indices, num_vtx)); + + // TODO is this necessary or already done with end store elems + /* add edges to map edges -> elements */ + h5_loc_idx_t face_idx; + int num_faces = h5tpriv_ref_elem_get_num_edges (m); + for (face_idx = 0; face_idx < num_faces; face_idx++) { + // add edges to neighbour struct + TRY (h5tpriv_enter_te2 (m, face_idx, i, NULL)); + } + + } + // store vtx info to chunks + TRY (h5tpriv_store_vtx_range_to_chk (m, permut)); +// /* mesh specific finalize */ +// TRY (m->methods->store->end_store_elems (m)); + } +#endif // CHUNKING_OF_VTX + +#endif + H5_CORE_API_RETURN (H5_SUCCESS); +} + +#ifdef PARALLEL_IO +h5_err_t +h5tpriv_find_oct_proc_of_point ( + h5t_mesh_t* m, + h5_loc_idx_t loc_idx, + h5_oct_point_t* point, + h5_int32_t* proc + ) { + H5_PRIV_FUNC_ENTER (h5_err_t, "m=%p, loc_idx=%lld, point=%p, proc=%d", m, (long long int)loc_idx, point,*proc); + h5_loc_idx_t* indices = h5tpriv_get_loc_elem_vertex_indices (m, loc_idx); + h5_float64_t midpoint[3] = {0, 0, 0}; + h5_float64_t P[3]; + int num_vertices = h5tpriv_ref_elem_get_num_vertices (m); + + for (int j = 0; j < num_vertices; j++) { + TRY (h5t_get_vertex_coords_by_index (m, indices[j], P)); + midpoint[0] += P[0]; + midpoint[1] += P[1]; + midpoint[2] += P[2]; + } + point->x = midpoint[0] / ((double) num_vertices); + point->y = midpoint[1] / ((double) num_vertices); + point->z = midpoint[2] / ((double) num_vertices); + + point->elem = -1; + // check in which octant the new elems would be + TRY (point->oct = H5t_find_leafoctant_of_point (m->octree, 0, H5t_get_bounding_box (m->octree), point)); + // get proc of octant + *proc = H5t_get_proc (m->octree, point->oct); + + H5_PRIV_FUNC_RETURN (H5_SUCCESS); +} + +int compare_midpoint_oct (const void *p_a, const void *p_b) { + return ((h5_oct_point_t*) p_a)->oct - ((h5_oct_point_t*) p_b)->oct; +} +/* + * Update the marked_entities list such that it contains all elements that are + * going to be refined with the current proc + */ +h5_err_t +h5tpriv_mark_chk_elems_to_refine ( + h5t_mesh_t* const m, + h5_glb_idxlist_t* glb_list, + h5_oct_point_t* midpoint_list + ) { + H5_PRIV_FUNC_ENTER (h5_err_t, "m=%p, glb_list=%p", m, glb_list); + // clear marked_entities list + TRY (h5priv_free_loc_idlist (&m->marked_entities)); + TRY (h5priv_alloc_loc_idlist (&m->marked_entities, MAX_NUM_ELEMS_TO_REFINE_LOCALLY)); + + h5_glb_idx_t glb_idx = -1; + h5_loc_idx_t loc_idx = -1; + h5_oct_point_t point; + int counter = 0; + // go through all elems + for (int i = 0; i < glb_list->num_items; i++) { + glb_idx = glb_list->items[i]; + + // check if element is locally available (if not some other proc needs to refine it) + loc_idx = h5t_map_glb_elem_idx2loc(m, glb_idx); + if (loc_idx >= 0) { + // check in which octant the element is + h5_int32_t proc = -1; + TRY (h5tpriv_find_oct_proc_of_point (m, loc_idx, &point, &proc)); //TODO maybe use hash table here!!! + + if (proc == m->f->myproc && // needs to be in my octant + h5priv_find_in_loc_idlist(m->marked_entities, loc_idx) < 0 && // not already in list + h5tpriv_get_loc_elem_child_idx (m, loc_idx) == -1) { // not refined already + // element is in octant of this proc, add to marked list + TRY (h5priv_search_in_loc_idlist (&m->marked_entities, loc_idx)); + + midpoint_list[counter].x = point.x; + midpoint_list[counter].y = point.y; + midpoint_list[counter].z = point.z; + midpoint_list[counter].oct = point.oct; + midpoint_list[counter].elem = h5tpriv_get_loc_elem_glb_idx(m, loc_idx); + counter++; + } + } + } + // sort midpoint list such that they are aligned according to octants + qsort (midpoint_list, counter, sizeof (*midpoint_list), compare_midpoint_oct); + H5_PRIV_FUNC_RETURN (H5_SUCCESS); +} +#endif +/* + Mark entity for further processing (e.g. refinement). + */ +h5_err_t +h5t_mark_entity ( + h5t_mesh_t* const m, + const h5_loc_id_t entity_id + ) { + H5_CORE_API_ENTER (h5_err_t, "m=%p, entity_id=%llu", + m, (long long unsigned)entity_id); + H5_CORE_API_RETURN (h5priv_insert_into_loc_idlist (&m->marked_entities, entity_id, -1)); +} + +h5_err_t +h5t_pre_refine ( + h5t_mesh_t* const m + ) { + H5_CORE_API_ENTER (h5_err_t, "m=%p", m); + H5_CORE_API_RETURN (m->methods->store->pre_refine (m)); +} +#ifdef PARALLEL_IO +//TODO maybe use ifdef to have name without _chk +h5_err_t +h5t_pre_refine_chk ( + h5t_mesh_t* const m, + h5_glb_idxlist_t** glb_list, + h5_oct_point_t** point_list + ) { + H5_CORE_API_ENTER (h5_err_t, "m=%p", m); + // exchange list of marked entities + TRY (*point_list = h5_calloc (m->num_glb_leaf_elems[m->leaf_level-1], sizeof (**point_list))); // alloc for maximal num elems to refine + + TRY (h5priv_exchange_loc_list_to_glb (m, glb_list)); + h5_glb_idxlist_t* glb_marked_entities = *glb_list; + + // decide which elements this proc has to refine + TRY (h5tpriv_mark_chk_elems_to_refine (m, glb_marked_entities, *point_list)); + + //TODO maybe check that sum of m->marked_entities->num_items over all proc is equal to glb_marked_entities->num_items + // this would find out if there is a problem with loading neighboring chunks... + + H5_CORE_API_RETURN (m->methods->store->pre_refine (m)); +} +#endif +/* + Refine previously marked elements. + */ +h5_err_t +h5t_refine_marked_elems ( + h5t_mesh_t* const m + ) { + H5_CORE_API_ENTER (h5_err_t, "m=%p", m); + int i; + for (i = 0; i < m->marked_entities->num_items; i++) { + TRY (h5tpriv_refine_elem (m, m->marked_entities->items[i])); + } + H5_CORE_API_RETURN (H5_SUCCESS); +} + +#ifdef PARALLEL_IO +/* + * Calculate the global entity range + * range[i] = first glb entity of proc i + * range[nproc] = next idx to assign + */ +h5_err_t +h5tpriv_get_ranges ( + h5t_mesh_t* const m, + h5_glb_idx_t* range, + h5_glb_idx_t mycount, + h5_glb_idx_t glb_start + ) { + H5_PRIV_FUNC_ENTER (h5_err_t, "m=%p, range=%p, mycount=%lld, glb_start=%lld", m, range, (long long int) mycount, (long long int) glb_start); + + TRY (h5priv_mpi_allgather ( + &mycount, + 1, + MPI_LONG, + &range[1], + 1, + MPI_LONG, + m->f->props->comm)); + + range[0] = glb_start; + + for (int i = 1; i <= m->f->nprocs; i++) { + range[i] += range[i-1]; + } + H5_PRIV_FUNC_RETURN (H5_SUCCESS); +} + +/* + * Calculate the global element range for the new elements + * range[i] = first glb element of proc i + * range[nproc] = next idx to assign + */ +h5_err_t +h5tpriv_get_elem_ranges ( + h5t_mesh_t* const m, + h5_glb_idx_t* range + ) { + H5_PRIV_FUNC_ENTER (h5_err_t, "m=%p, range=%p", m, range); + h5_glb_idx_t sendbuf = m->marked_entities->num_items * h5tpriv_get_num_new_elems (m); + TRY (h5priv_mpi_allgather ( + &sendbuf, + 1, + MPI_LONG, + &range[1], + 1, + MPI_LONG, + m->f->props->comm)); + + range[0] = m->leaf_level > 0 ? m->num_glb_elems[m->leaf_level-1] : 0; // TODo check if correct + + for (int i = 1; i <= m->f->nprocs; i++) { + range[i] += range[i-1]; + } + H5_PRIV_FUNC_RETURN (H5_SUCCESS); +} +/* + * Check if edge is on proc border. If yes also check that it hasn't been refined yet and the other proc + * is also refining his element. + */ +int +check_edge ( + h5t_mesh_t* const m, + const h5_loc_idx_t face_idx, + const h5_loc_idx_t elem_idx, + h5_glb_idxlist_t* glb_elems + ) { + H5_PRIV_FUNC_ENTER (h5_loc_idx_t, + "m=%p, face_idx=%lld, elem_idx=%lld, glb_elems=%p", + m, (long long)face_idx, (long long)elem_idx, glb_elems); + h5_loc_idlist_t* retval; + // get all elements sharing the given edge + TRY (h5tpriv_find_te2 (m, face_idx, elem_idx, &retval)); + + size_t i; + for (i = 0; i < retval->num_items; i++) { + // check weather the found element has been refined + h5_loc_id_t kids[2] = {-1,-1}; + TRY (h5tpriv_get_loc_entity_children (m, retval->items[i], kids)); + if (kids[0] >= 0) { + // element has been refined + H5_PRIV_FUNC_LEAVE (0); + } + h5_loc_id_t el_id1 = retval->items[i]; + h5_chk_idx_t chk_idx1 = -1; + h5_loc_id_t el_id2 = h5tpriv_build_entity_id( + h5tpriv_ref_elem_get_entity_type(m, h5tpriv_ref_elem_get_dim (m) -1), + face_idx, + elem_idx ); + h5_chk_idx_t chk_idx2 = -2; + TRY (h5tpriv_find_chk_of_elem (m, el_id1, &chk_idx1)); + TRY (h5tpriv_find_chk_of_elem (m, el_id2, &chk_idx2)); + if (chk_idx1 == chk_idx2) { + H5_PRIV_FUNC_LEAVE (0); + } +// // BUG this works depending on what is my_proc interior elems or interior_chunks +//// // check weather the found element is owned by the same proc +//// if (m->loc_elems[elem_idx].my_proc == m->loc_elems[retval->items[i]].my_proc) { +//// // element is on same proc +//// +//// } +// // check if it is going to be refined +// if (h5priv_find_in_glb_idxlist(glb_elems, m->loc_elems[h5tpriv_get_elem_idx(retval->items[i])].glb_idx) < 0 ) { +// // element is not going to be refined +// H5_PRIV_FUNC_LEAVE (0); +// } +// // check if it is on this proc +// if (h5priv_find_in_loc_idlist(m->marked_entities, retval->items[i]) >= 0 ) { +// // element is on same proc +// H5_PRIV_FUNC_LEAVE (0); +// } + } + + + H5_PRIV_FUNC_RETURN (1); +} +h5_loc_idx_t +get_new_vtx_of_edge( + h5t_mesh_t* const m, + h5_loc_id_t loc_id + ) { + H5_PRIV_FUNC_ENTER (h5_err_t, "m=%p, loc_id=%lld", + m, (long long int)loc_id); + + h5_loc_id_t kids[2] = {-1,-1}; + TRY (h5tpriv_get_loc_entity_children (m, loc_id, kids)); + if (kids[0] >= 0) { + // element has been refined, return bisecting point + h5_loc_idx_t edge0[2], edge1[2]; + TRY (h5t_get_loc_vertex_indices_of_edge (m, kids[0], edge0)); + TRY (h5t_get_loc_vertex_indices_of_edge (m, kids[1], edge1)); + if ((edge0[0] == edge1[0]) || (edge0[0] == edge1[1])) { + H5_PRIV_FUNC_LEAVE (edge0[0]); + } else { + H5_PRIV_FUNC_LEAVE (edge0[1]); + } + } + H5_PRIV_FUNC_RETURN (H5_ERR_INTERNAL); //edge that should be refined in not refined +} +/* + * Go through elements and find boundary edges that were refined on this proc. + * we try to find edges that are shared with non-local elements (they could have + * been refined) or if one of the local elements was refined on a different proc + */ +h5_err_t +h5tpriv_find_boundary_edges ( // todo maybe put some part into another function... + h5t_mesh_t* const m, + h5_glb_idxlist_t* glb_elems, + h5_edge_list_t* list + ) { + H5_PRIV_FUNC_ENTER (h5_err_t, "m=%p, glb_elems=%p, list=%p", + m, glb_elems, list); + // go through marked elements + h5_loc_idx_t elem_idx = -1; + for (int i = 0; i < m->marked_entities->num_items; i++) { + elem_idx = h5tpriv_get_elem_idx( m->marked_entities->items[i]); + int num_faces = h5tpriv_ref_elem_get_num_facets(m); + for (int j = 0; j < num_faces; j++) { + h5_loc_idlist_t* retval = NULL; + // get all elements sharing the given edge + TRY (h5tpriv_find_te2 (m, j, elem_idx, &retval)); + + // check if it is a border edge //TODO does not work yet since flags are not set properly but as long as we have all surounding elems it's not a problem -> i.e. tetrahedrals + if (retval->flags == H5_BORDER_ENTITY && 0) { + // add to edgelist + h5_glb_idx_t vertices[2]; + h5t_get_glb_vertex_indices_of_entity (m, retval->items[0], vertices); + + // we need to get the edge_id of elem_idx (other elems may not be refined + // and therefore can not return the splitting vertex + int l = 0; + for (; l < retval->num_items; l++) { + if (elem_idx == h5tpriv_get_elem_idx (retval->items[l])) { + break; + } + } + assert (l < retval->num_items); + h5_loc_idx_t loc_new_vtx = get_new_vtx_of_edge(m, retval->items[l]); + assert (loc_new_vtx > -1); + + TRY (h5tpriv_add_edge_list (list ,vertices[0], vertices[1], loc_new_vtx, m->f->myproc)); + continue; + } + // check if one of the neighbors (locally available) was refined on a different proc + for (int k = 0; k < retval->num_items; k++) { + h5_loc_idx_t neigh_idx = h5tpriv_get_elem_idx (retval->items[k]); + if (neigh_idx == elem_idx) { + continue; + } + h5_glb_idx_t neigh_glb_idx = h5tpriv_get_loc_elem_glb_idx(m, neigh_idx); + h5_loc_idx_t idx = h5priv_find_in_glb_idxlist(glb_elems, neigh_glb_idx); + if (idx < 0) { + // element has not been refined + continue; + } else { + // check if it was refined on this proc + int proc = -1; + h5_oct_point_t point; + TRY (h5tpriv_find_oct_proc_of_point (m, neigh_idx, &point, &proc)); + if (m->f->myproc != proc) { + // element was refined on different proc + // add to edgelist + h5_glb_idx_t vertices[2]; + h5t_get_glb_vertex_indices_of_entity (m, retval->items[k], vertices); + + // we need to get the edge_id of elem_idx (other elems may not be refined + // and therefore can not return the splitting vertex + int l = 0; + for (; l < retval->num_items; l++) { + if (elem_idx == h5tpriv_get_elem_idx (retval->items[l])) { + break; + } + } + assert (l < retval->num_items); + h5_loc_idx_t loc_new_vtx = get_new_vtx_of_edge(m, retval->items[l]); + assert (loc_new_vtx > -1); + TRY (h5tpriv_add_edge_list (list ,vertices[0], vertices[1],loc_new_vtx, m->f->myproc)); + break; + } + } + + } + } + } + // sort & uniquify + TRY (h5tpriv_sort_edge_list (list)); + TRY (h5tpriv_uniquify_edge_list (list)); + + H5_PRIV_FUNC_RETURN (H5_SUCCESS); +} + +/* + * exchange boundary edges info + */ +h5_err_t +exchange_boundary_edge_list ( + h5t_mesh_t* const m, + h5_edge_list_t* b_edges, + h5_edge_list_t* glb_b_edges + ) { + H5_PRIV_FUNC_ENTER (h5_err_t, "m=%p", m); // TODO + + int* recvcounts = NULL; + TRY (recvcounts = h5_calloc (m->f->nprocs, sizeof (*recvcounts))); + int* recvdisp = NULL; + TRY (recvdisp = h5_calloc (m->f->nprocs + 1, sizeof (*recvdisp))); + TRY (h5priv_mpi_allgather ( + &b_edges->num_items, + 1, + MPI_INT, + recvcounts, + 1, + MPI_INT, + m->f->props->comm)); + int tot_num_b_edges = 0; + recvdisp[0] = 0; + for (int i = 0; i < m->f->nprocs; i++) { + tot_num_b_edges += recvcounts[i]; + recvdisp[i+1] = recvcounts[i] + recvdisp[i]; + } + if (tot_num_b_edges > 0) { + TRY (h5tpriv_grow_edge_list (glb_b_edges, tot_num_b_edges)); + + TRY (h5priv_mpi_allgatherv ( + b_edges->items, + b_edges->num_items, + h5_dta_types.mpi_edge_list_elem, + glb_b_edges->items, + recvcounts, + recvdisp, + h5_dta_types.mpi_edge_list_elem, + m->f->props->comm)); + + glb_b_edges->num_items = tot_num_b_edges; + h5tpriv_sort_edge_list(glb_b_edges); + } + TRY (h5_free(recvcounts)); + TRY (h5_free(recvdisp)); + + H5_PRIV_FUNC_RETURN (H5_SUCCESS); +} +h5_err_t +set_exchanged_glb_idx ( + h5t_mesh_t* const m, + h5_edge_list_t* list, + h5_edge_list_t* glb_list + ) { + H5_PRIV_FUNC_ENTER (h5_err_t, "m=%p", m); // TODO + + for (int i = 0; i < list->num_items; i++) { + if ( list->items[i].proc != m->f->myproc) { + h5_int32_t retval = h5tpriv_find_edge_list(glb_list,&list->items[i]); + assert (retval != glb_list->num_items); + m->vertices[list->items[i].new_vtx].idx = glb_list->items[retval].new_vtx; + } + } + H5_PRIV_FUNC_RETURN (H5_SUCCESS); +} +/* + * find local edges in glb list and find out which proc sets glb_idx + */ +h5_err_t +find_edges_in_boundary_edge_list ( + h5_edge_list_t* list, + h5_edge_list_t* glb_list + ) { + H5_PRIV_FUNC_ENTER (h5_err_t, "list=%p, glb_list=%p", list, glb_list); + h5_int32_t idx = -1; + for (int i = 0; i < list->num_items; i++) { + h5t_edge_list_elem_t* retval = bsearch (&list->items[i], glb_list->items,glb_list->num_items, sizeof(*list->items), compare_edge_list_elem ); + assert (retval != NULL); //all items in list are copied from glb_list so retval can't be NULL + + idx =(int) (retval - glb_list->items); + // if there was another proc with lower rank that refined the same edge, the edge would lie at position idx - 1 + // so we try to find lowest proc that has refined edge i + h5t_edge_list_elem_t edge; + edge.vtx1 = list->items[i].vtx1; + edge.vtx2 = list->items[i].vtx2; + edge.proc = 0; + while (idx > 0 && + compare_edge_list_elem (&glb_list->items[idx-1], &edge) >= 0) { + idx--; + } + list->items[i].proc = glb_list->items[idx].proc; + } + H5_PRIV_FUNC_RETURN (H5_SUCCESS); +} +/* + * set glb_idx of new vertex into edge list -> will be exchanged to other procs + */ +h5_err_t +set_glb_idx_edge_list ( + h5t_mesh_t* m, + h5_edge_list_t* list + ) { + H5_PRIV_FUNC_ENTER (h5_err_t, "m=%p, list=%p",m ,list); + for (int i = 0; i < list->num_items; i++) { + if (list->items[i].proc == m->f->myproc) { + list->items[i].new_vtx = m->vertices[list->items[i].new_vtx].idx; + assert (list->items[i].new_vtx != -1); + } + } + H5_PRIV_FUNC_RETURN (H5_SUCCESS); +} +/* + * at the moment either split weights equally to children or assign equal as parent + */ +static h5_err_t +update_weight_children ( + h5t_mesh_t* m, + h5_weight_t* parent_weight, + h5_weight_t* children_weight) { + H5_PRIV_FUNC_ENTER (h5_err_t, "m=%p",m ); + int num_new_elems = h5tpriv_get_num_new_elems (m); + + if (UPDATE_WEIGHTS == 1) { // split + for (int j = 0; j < m->num_weights; j++) { + children_weight[j] = MAX (1, parent_weight[j]/num_new_elems); + } + + } + if (UPDATE_WEIGHTS == 2) { // copy + for (int j = 0; j < m->num_weights; j++) { + children_weight[j] = parent_weight[j]; + } + } + + H5_PRIV_FUNC_RETURN (H5_SUCCESS); +} + +/* + * function to set weights after refinement automatically + */ +static h5_err_t +h5tpriv_set_local_weights ( + h5t_mesh_t* m, + h5_glb_idx_t* range + ) { + H5_PRIV_FUNC_ENTER (h5_err_t, "m=%p, range=%p",m ,range); + + for (h5_glb_idx_t idx = range[m->f->myproc]; idx < range[m->f->myproc + 1]; idx++) { + // get loc_idx of elem + h5_loc_idx_t loc_idx = h5t_map_glb_elem_idx2loc (m, idx); + assert (loc_idx >= 0); + h5_loc_idx_t parent_idx = h5tpriv_get_loc_elem_parent_idx (m, loc_idx); + h5_glb_idx_t parent_glb_idx = h5tpriv_get_loc_elem_glb_idx (m, parent_idx); + h5_weight_t* parent_weight = NULL; + h5_weight_t* children_weight = NULL; + parent_weight = &m->weights[parent_glb_idx * m->num_weights]; + children_weight = &m->weights[idx * m->num_weights]; + TRY (update_weight_children (m, parent_weight, children_weight)); + } + + + H5_PRIV_FUNC_RETURN (H5_SUCCESS); +} +/* + * function to update weights after refinement + */ +static h5_err_t +h5tpriv_exchange_weights ( + h5t_mesh_t* m, + h5_glb_idx_t* range + ) { + H5_PRIV_FUNC_ENTER (h5_err_t, "m=%p, range=%p",m ,range); + + int* recvcounts = h5_calloc (m->f->nprocs, sizeof (* recvcounts)); + int* recvdisp = h5_calloc (m->f->nprocs, sizeof (* recvdisp)); + + for (int i = 0; i < m->f->nprocs; i++) { + recvdisp[i] = (int) range[i] * m->num_weights; + recvcounts[i] = (int) (range[i+1]- range[i]) * m->num_weights; + + } + + int sendcount = (range[m->f->myproc + 1] - range[m->f->myproc]) * m->num_weights; + h5_weight_t* sendbuf = h5_calloc (sendcount, sizeof (*sendbuf)); + + memcpy (sendbuf, &m->weights[range[m->f->myproc] * m->num_weights], sendcount * sizeof (*sendbuf)); + + TRY (h5priv_mpi_allgatherv ( + sendbuf, + sendcount, + MPI_INT, + m->weights, + recvcounts, + recvdisp, + MPI_INT, + m->f->props->comm)); + for (h5_glb_idx_t i = 0; i < range[m->f->nprocs] * m->num_weights; i++ ) { + assert (m->weights[i] > 0); + } + H5_PRIV_FUNC_RETURN (H5_SUCCESS); +} + +/* + Refine previously marked elements. + */ +h5_err_t +h5t_refine_marked_elems_chk ( + h5t_mesh_t* const m, + h5_glb_idxlist_t* glb_elems, + h5_oct_point_t* midpoints + ) { + H5_CORE_API_ENTER (h5_err_t, "m=%p", m); + int num_midpoints = m->marked_entities->num_items; + + // refine octree + TRY (H5t_refine_w_points (m->octree, midpoints, num_midpoints, H5t_get_maxpoints (m->octree))); + + // sort midpoint list such that they are aligned according to octants + qsort (midpoints, num_midpoints, sizeof (*midpoints), compare_midpoint_oct); + + // set octree userlevel + h5t_oct_iterator_t* iter = NULL; + + TRY (H5t_init_leafoct_iterator (m->octree, &iter)); + + h5_oct_idx_t oct_idx; + while ((oct_idx = H5t_iterate_oct (iter)) != -1) { + if (H5t_get_proc (m->octree, oct_idx) == m->f->myproc) { + TRY (H5t_set_userlevel (m->octree, oct_idx, m->leaf_level)); + } + } + TRY (H5t_end_iterate_oct (iter)); + TRY (H5t_update_internal (m->octree)); + + // get elem ranges + h5_glb_idx_t* elem_range = NULL; + TRY (elem_range = h5_calloc (m->f->nprocs + 1, sizeof (*elem_range))); + + //TODO use generic get_range function + TRY (h5tpriv_get_elem_ranges (m, elem_range)); + + // CHUNKS + h5_chk_idx_t num_chunks = 1; + + h5t_oct_count_list_t oct_c_list; // list has contains all octants and number of elems per octant + oct_c_list.num_items = 0; + oct_c_list.size = num_midpoints; + TRY (oct_c_list.items = h5_calloc (num_midpoints, sizeof (*oct_c_list.items))); + + h5_oct_idx_t old_idx = -1; + if (num_midpoints > 0) { + old_idx = midpoints[0].oct; + oct_c_list.items[oct_c_list.num_items++].oct = old_idx; + } else { + num_chunks = 0; + } + + + int running_counter = 0; + // calc number of chunks + for (int i = 0; i < num_midpoints; i++) { + if (midpoints[i].oct != old_idx) { + // point i will be in a new chunk + num_chunks++; + old_idx = midpoints[i].oct; + oct_c_list.items[oct_c_list.num_items].oct = old_idx; + oct_c_list.items[oct_c_list.num_items-1].count = i - running_counter; + running_counter = i; + oct_c_list.num_items++; + } + } + oct_c_list.items[oct_c_list.num_items-1].count = num_midpoints - running_counter; + // calc chunk range + h5_glb_idx_t* chk_range = NULL; + TRY (chk_range = h5_calloc (m->f->nprocs + 1, sizeof (*chk_range))); + TRY (h5tpriv_get_ranges (m, chk_range, num_chunks, m->chunks->curr_idx + 1)); + + // get total number of chunks + int tot_num_chunks = 0; + + tot_num_chunks = chk_range[m->f->nprocs] - chk_range[0]; + // alloc mem for chunks + TRY (h5tpriv_grow_chunks (m, tot_num_chunks)); + + // create chunks + TRY (h5tpriv_store_chunks (m, &oct_c_list, num_chunks, elem_range, chk_range)); + + // update newly created chunks + TRY (h5tpriv_update_chunks (m, chk_range)); + + h5t_oct_userdata_t* userdata = NULL; + //store userdata to octree + for (int j = chk_range[m->f->myproc]; j < chk_range[m->f->myproc + 1]; j++) { + assert ( H5t_get_proc (m->octree, m->chunks->chunks[j].oct_idx) == m->f->myproc); + TRY (H5t_get_userdata_rw (m->octree, m->chunks->chunks[j].oct_idx,(void **) &userdata)); + if (userdata->idx[0] == -1) { + userdata->idx[0] = (h5_chk_idx_t) j; + } else if (userdata->idx[1] == -1) { + userdata->idx[1] = (h5_chk_idx_t) j; + } else if (userdata->idx[2] == -1) { + userdata->idx[2] = (h5_chk_idx_t) j; + } else if (userdata->idx[3] == -1) { + userdata->idx[3] = (h5_chk_idx_t) j; + } else { + H5_CORE_API_LEAVE (H5_ERR_INTERNAL); + } + } + + TRY (H5t_update_userdata (m->octree)); + + + // refine elements + for (int i = 0; i < num_midpoints; i++) { + TRY (h5tpriv_refine_elem (m, h5t_map_glb_elem_idx2loc(m,midpoints[i].elem))); // needs to be ordered acc to octants + } + TRY (h5_free (oct_c_list.items)); + TRY (h5_free (elem_range)); + TRY (h5_free (chk_range)); + H5_CORE_API_RETURN (H5_SUCCESS); +} +/* + * This function checks if there is the possibility to add another chunk to an octant + */ +int +h5tpriv_octant_is_full ( + h5t_octree_t* octree, + h5_oct_idx_t oct_idx + ) { + H5_PRIV_FUNC_ENTER (h5_err_t, "octree=%p, oct_idx=%d", octree, oct_idx); + h5t_oct_userdata_t* userdata = NULL; + TRY (H5t_get_userdata_r (octree, oct_idx,(void **) &userdata)); + if (userdata->idx[3] == -1) { + H5_PRIV_FUNC_LEAVE (0) + } + H5_PRIV_FUNC_RETURN (1); +} + +/* + * only compares the glb_idx of a vertex + */ +int compare_glb_vertex (const void *p_a, const void *p_b) { + return ((h5_glb_vertex_t*) p_a)->idx - ((h5_glb_vertex_t*) p_b)->idx; +} +/* + * find vertex in list and return num_vtx if not in list + * list needs to be sorted + */ +static int +h5tpriv_find_vertex_in_list ( + h5t_mesh_t* const m, + h5_glb_idx_t vtx_idx, + h5_glb_vertex_t* vtx_list, + int num_vtx + ) { + h5_glb_vertex_t key; + key.idx = vtx_idx; + + h5_glb_vertex_t* retval = bsearch (&key, vtx_list, num_vtx, sizeof (*retval), compare_glb_vertex); + if (retval == NULL) { + return num_vtx; + } + return retval - vtx_list; +} +static h5_err_t +h5tpriv_sort_vertex_list ( + h5_glb_vertex_t* vtx_list, + int num_vtx + ) { + qsort (vtx_list, num_vtx, sizeof(*vtx_list), compare_glb_vertex); + return (H5_SUCCESS); +} + + + +int comp_vtx_coord (void* p_a, void* p_b) { + h5_glb_vertex_t* a = (h5_glb_vertex_t*)p_a; + h5_glb_vertex_t* b = (h5_glb_vertex_t*)p_b; + + if (a->idx != b->idx) { + return a->idx != b->idx; + } else { + if (a->P[0] != b->P[0]) { + return a->P[0] != b->P[0]; + } else { + if (a->P[1] != b->P[1]) { + return a->P[1] != b->P[1]; + } else { + if (a->P[2] != b->P[2]) { + return a->P[2] != b->P[2]; + } else { + return 0; + } + } + } + } +} + +static h5_err_t +h5tpriv_add_glb_vertex_to_list ( + h5t_mesh_t* const m, + h5_glb_idx_t vtx_idx, + h5_glb_vertex_t* glb_vtx, + h5_glb_idx_t num_glb_vtx, + h5_glb_vertex_t* vtx_list, + int* num_vtx + ) { + H5_PRIV_FUNC_ENTER (h5_err_t, "m=%p", m); + h5_loc_idx_t loc_idx = h5tpriv_find_vertex_in_list (m, vtx_idx, glb_vtx, num_glb_vtx); + assert (loc_idx > -1 ); + assert (loc_idx < num_glb_vtx); + memcpy (&vtx_list[*num_vtx], &glb_vtx[loc_idx], sizeof (*vtx_list)); + (*num_vtx)++; + H5_PRIV_FUNC_RETURN (H5_SUCCESS); +} + + +static h5_err_t +h5tpriv_init_glb_vtx_struct_chk ( + h5t_mesh_t* const m, + h5_glb_elem_t* glb_elems, + int num_glb_elems, + h5_glb_vertex_t* vtx_list, + int* num_vtx + ) { + H5_PRIV_FUNC_ENTER (h5_err_t, "m=%p", m); + // todo could be optimised by using a hashtab for glb_idx_list instead of map + int num_vertices = h5tpriv_ref_elem_get_num_vertices(m); + + h5_idxmap_t map_s; + TRY (h5priv_new_idxmap (&map_s, num_vertices * num_glb_elems)); + h5_idxmap_t* map = &map_s; + + h5_hashtable_t htab; + TRY (h5priv_hcreate (((num_vertices * num_glb_elems) << 2) / 3, &htab, + hidxmap_cmp, hidxmap_compute_hval, NULL)); + + for (int i = 0; i < num_glb_elems; i++) { + h5_glb_idx_t* vtx_idx = h5tpriv_get_glb_elem_vertices(m, glb_elems, i); + + for (int j = 0; j < num_vertices; j++) { + // add index temporarly to map ... + map->items[map->num_items] = (h5_idxmap_el_t) {vtx_idx[j], 0}; + // ... and check whether it has already been added + h5_idxmap_el_t* retval; + h5priv_hsearch (&map->items[map->num_items], + H5_ENTER, (void**)&retval, &htab); + + if (retval == &map->items[map->num_items]) { // not in list + // new entry in hash table thus in map + map->num_items++; + //todo optimise by copy in the end (copy consequtive vtx together) + h5_loc_idx_t loc_idx = h5t_map_global_vertex_idx2local (m, vtx_idx[j]); + assert (loc_idx > -1 && loc_idx <= m->last_stored_vid); + memcpy (&vtx_list[*num_vtx], &m->vertices[loc_idx], sizeof (*vtx_list)); + (*num_vtx)++; + } + } + } + TRY (h5priv_hdestroy (&htab)); + TRY (h5_free (map->items)); + TRY (h5tpriv_sort_vertex_list (vtx_list, *num_vtx)); + H5_PRIV_FUNC_RETURN (H5_SUCCESS); +} +// little bit different funtion since it's used to store and not to load... +static h5_err_t +h5tpriv_init_glb_vtx_struct_chk2 ( + h5t_mesh_t* const m, + h5_glb_elem_t* glb_elems, + int num_glb_elems, + h5_glb_vertex_t* glb_vtx, + int num_glb_vtx, + h5_glb_vertex_t* vtx_list, + int* num_vtx + ) { + H5_PRIV_FUNC_ENTER (h5_err_t, "m=%p", m); + // todo could be optimised by using a hashtab for glb_idx_list instead of map + int num_vertices = h5tpriv_ref_elem_get_num_vertices(m); + h5_idxmap_t* map = &m->map_vertex_g2l; + if (map->size <= map->num_items) { + h5priv_grow_idxmap (map, map->size +10); // 1 should be enough + } + + + h5_hashtable_t htab; + TRY (h5priv_hcreate (((num_vertices * num_glb_elems) << 2) / 3, &htab, + hidxmap_cmp, hidxmap_compute_hval, NULL)); + + for (int i = 0; i < num_glb_elems; i++) { + h5_glb_idx_t* vtx_idx = h5tpriv_get_glb_elem_vertices(m, glb_elems, i); + + for (int j = 0; j < num_vertices; j++) { + // add index temporarly to map ... + map->items[map->num_items] = (h5_idxmap_el_t) {vtx_idx[j], 0}; + // ... and check whether it has already been added + h5_idxmap_el_t* retval; + h5priv_hsearch (&map->items[map->num_items], + H5_ENTER, (void**)&retval, &htab); + + if (retval == &map->items[map->num_items]) { // not in list + // new entry in hash table + h5tpriv_add_glb_vertex_to_list(m, vtx_idx[j], glb_vtx, num_glb_vtx, vtx_list, num_vtx); + + } + } + } + TRY (h5priv_hdestroy (&htab)); + TRY (h5tpriv_sort_vertex_list (vtx_list, *num_vtx)); + H5_PRIV_FUNC_RETURN (H5_SUCCESS); +} + +/* + * there are already all local & neighbor chunks in the list + * we remove all chunks that are not on m->leaf_level, and + * from neighbors + */ + +static h5_err_t +get_list_of_chunks_to_retrieve ( + h5t_mesh_t* const m, + h5_chk_idx_t* list, + int* num_list + ) { + H5_PRIV_FUNC_ENTER (h5_err_t, "m=%p", m); + + // retrieve only chunks from this level + int tmp_counter = 0; + for (int i = 0; i < *num_list; i++) { + if (list[i] > m->chunks->curr_idx - m->chunks->num_chunks_p_level[m->leaf_level] && // only the chunks stored on the last level + H5t_get_proc (m->octree, m->chunks->chunks[list[i]].oct_idx) != m->f->myproc) { + list[tmp_counter] = list[i]; + tmp_counter++; + } + } + *num_list = tmp_counter; + H5_PRIV_FUNC_RETURN (H5_SUCCESS); +} +static h5_err_t +exchange_glb_elem_glb_vtx ( + h5t_mesh_t* const m, + h5_glb_elem_t* glb_elems, + int num_glb_elems, + h5_glb_elem_t** tot_glb_elems, + int* num_tot_glb_elems, + h5_glb_vertex_t* glb_vtx, + int num_glb_vtx, + h5_glb_vertex_t** tot_glb_vtx, + int* num_tot_glb_vtx + ) { + H5_PRIV_FUNC_ENTER (h5_err_t, "m=%p", m); + + h5_glb_idx_t* e_range = h5_calloc (m->f->nprocs +1, sizeof (*e_range)); + TRY (h5tpriv_get_ranges(m, e_range, (h5_glb_idx_t) num_glb_elems, 0)); + + h5_glb_idx_t* v_range = h5_calloc (m->f->nprocs +1, sizeof (*v_range)); + TRY (h5tpriv_get_ranges(m, v_range, (h5_glb_idx_t) num_glb_vtx, 0)); + + int* e_recvcounts = h5_calloc (m->f->nprocs, sizeof (* e_recvcounts)); + int* v_recvcounts = h5_calloc (m->f->nprocs, sizeof (* v_recvcounts)); + + int* e_recvdisp = h5_calloc (m->f->nprocs, sizeof (* e_recvdisp)); + int* v_recvdisp = h5_calloc (m->f->nprocs, sizeof (* v_recvdisp)); + + for (int i = 0; i < m->f->nprocs; i++) { + e_recvdisp[i] = (int) e_range[i]; + v_recvdisp[i] = (int) v_range[i]; + e_recvcounts[i] = (int) (e_range[i+1]- e_range[i]); + v_recvcounts[i] = (int) (v_range[i+1]- v_range[i]); + } + *num_tot_glb_elems = e_range[m->f->nprocs]; + TRY (*tot_glb_elems = h5tpriv_alloc_glb_elems(m, *num_tot_glb_elems)); + + *num_tot_glb_vtx = v_range[m->f->nprocs]; + *tot_glb_vtx = h5_calloc (*num_tot_glb_vtx, sizeof (**tot_glb_vtx)); + + + TRY (h5priv_mpi_allgatherv ( + glb_elems, + num_glb_elems, + h5tpriv_get_mpi_type_of_glb_elem(m), + *tot_glb_elems, + e_recvcounts, + e_recvdisp, + h5tpriv_get_mpi_type_of_glb_elem(m), + m->f->props->comm)); + + TRY (h5priv_mpi_allgatherv ( + glb_vtx, + num_glb_vtx, + h5_dta_types.mpi_glb_vtx, + *tot_glb_vtx, + v_recvcounts, + v_recvdisp, + h5_dta_types.mpi_glb_vtx, + m->f->props->comm)); + + TRY (h5tpriv_sort_vertex_list (*tot_glb_vtx, *num_tot_glb_vtx)); + TRY (h5tpriv_sort_glb_elems (m, *tot_glb_elems, (size_t)*num_tot_glb_elems)); + + // free mem + TRY (h5_free (e_recvcounts)); + TRY (h5_free (v_recvcounts)); + TRY (h5_free (e_recvdisp)); + TRY (h5_free (v_recvdisp)); + TRY (h5_free (e_range)); + TRY (h5_free (v_range)); + + H5_PRIV_FUNC_RETURN (H5_SUCCESS); +} + +/* + * compare chk_idx + */ +int compare_chk_list(const void *p_a, const void *p_b) { + return ((h5t_chunk_t*) p_a)->idx - ((h5t_chunk_t*) p_b)->idx; +} + +h5_err_t +store_exchanged_elems ( + h5t_mesh_t* const m, + h5_chk_idx_t* chk_list, + int num_chk_list, + h5_glb_elem_t* glb_elems, + int num_glb_elems, + h5_glb_vertex_t* glb_vtx, + int num_glb_vtx + ) { + H5_PRIV_FUNC_ENTER (h5_err_t, "m=%p", m); + + qsort (chk_list, num_chk_list, sizeof (*chk_list), compare_chk_list); + + // calc how many new elems + int num_new_elems = 0; + for (int i = 0; i < num_chk_list; i++) { + num_new_elems += m->chunks->chunks[chk_list[i]].num_elems; + } + TRY (h5tpriv_alloc_loc_elems (m, m->num_interior_elems[m->leaf_level], m->num_interior_elems[m->leaf_level] + num_new_elems)); + + // extract glb elems that should be stored + h5_glb_elem_t* new_elems = NULL; + h5_loc_idx_t new_elems_c = 0; // counter + + // temporary idx list so we don't have to search in glb_elems. glb_elems should be sorted! + h5_glb_idxlist_t* glb_list = NULL; + h5priv_alloc_glb_idxlist (&glb_list, num_glb_elems); + for (int i = 0; i < num_glb_elems; i++) { + glb_list->items[i] = h5tpriv_get_glb_elem_idx (m, glb_elems, i); + } + glb_list->num_items = num_glb_elems; + + int* proc = h5_calloc (num_new_elems, sizeof (*proc)); + int proc_counter = 0; + TRY (new_elems = h5tpriv_alloc_glb_elems(m, num_new_elems)); + for (int i = 0; i < num_chk_list; i++) { + int num_elems = m->chunks->chunks[chk_list[i]].num_elems; + int chk_proc = H5t_get_proc (m->octree, m->chunks->chunks[chk_list[i]].oct_idx ); + + h5_glb_idx_t glb_idx = m->chunks->chunks[chk_list[i]].elem; + h5_loc_idx_t loc_idx = h5priv_find_in_glb_idxlist (glb_list, glb_idx); + assert (loc_idx > -1); + assert (h5tpriv_get_glb_elem_idx (m,glb_elems, loc_idx) == glb_idx); + + TRY(h5tpriv_copy_glb_elems(m, new_elems, new_elems_c, glb_elems, loc_idx, num_elems)); + new_elems_c += num_elems; + while (proc_counter < new_elems_c) { + + proc[proc_counter] = chk_proc; // TODO may need to be changed after we have lb + proc_counter++; + } + } + assert (new_elems_c == num_new_elems); + + + // create list of new glb_vtx + h5_glb_vertex_t* new_vtx = h5_calloc(new_elems_c * 4, sizeof (*new_vtx));// TODO should be by far enough -> could be optimzed + int new_vtx_c = 0; + + + // TODO maybe this function could be extended and used instead of the stuff below + //TRY (h5tpriv_init_glb_vtx_struct_chk (m, new_elems, new_elems_c, new_vtx, &new_vtx_c)); + // extract glb vertices that should be stored + TRY (h5tpriv_init_glb_vtx_struct_chk2 (m, new_elems, new_elems_c, + glb_vtx, num_glb_vtx, new_vtx, &new_vtx_c)); +// int num_vertices = h5tpriv_ref_elem_get_num_vertices(m); +// for (int i = 0; i < new_elems_c; i++) { +// h5_glb_idx_t* vertices = h5tpriv_get_glb_elem_vertices(m, new_elems, i); +// for (int j = 0; j < num_vertices; j++) { +// // check if vertex is already locally available +// int idx = -1; +// TRY (idx = h5tpriv_find_glb_idx_in_map (&m->map_vertex_g2l, vertices[j])); +// if (idx == m->map_vertex_g2l.num_items) { // locally not available +// // add at end and sort later +// h5tpriv_add_glb_vertex_to_list(m, vertices[j], glb_vtx, num_glb_vtx, new_vtx, &new_vtx_c); +// } +// } +// } +// TRY (h5tpriv_sort_vertex_list (new_vtx, new_vtx_c)); + + // store vertices + + TRY (h5tpriv_alloc_loc_vertices (m, new_vtx_c + m->last_stored_vid + 1)); // maybe somewhat more? + memcpy (&m->vertices[m->last_stored_vid + 1], new_vtx, new_vtx_c * sizeof (*new_vtx)); + m->last_stored_vid += new_vtx_c; + + // rebuild map vtx + TRY (h5priv_grow_idxmap (&m->map_vertex_g2l, new_vtx_c + m->map_vertex_g2l.size)); + TRY (h5tpriv_rebuild_map_vertex_g2l_partial (m)); + + + // store elems + TRY (h5priv_grow_idxmap (&m->map_elem_g2l, num_new_elems + m->map_elem_g2l.size)); + TRY (h5tpriv_init_loc_elems_struct (m, new_elems, m->num_interior_elems[m->leaf_level], num_new_elems, 0, proc)); + + // rebuild map elems + TRY (rebuild_map_elem_g2l_partial (m)); + + TRY (h5tpriv_init_elem_flags (m, m->num_interior_elems[m->leaf_level], num_new_elems)); + + m->num_interior_elems[m->leaf_level] += num_new_elems; + + TRY (h5_free (new_elems)); + TRY (h5_free (new_vtx)); + TRY (h5_free (proc)); + H5_PRIV_FUNC_RETURN (H5_SUCCESS); +} +#endif + +h5_err_t +h5t_post_refine ( + h5t_mesh_t* const m + ) { + H5_CORE_API_ENTER (h5_err_t, "m=%p", m); + TRY (h5t_end_store_vertices (m)); + TRY (h5t_end_store_elems (m)); + H5_CORE_API_RETURN (h5priv_free_loc_idlist (&m->marked_entities)); +} + + +#ifdef PARALLEL_IO + +h5_err_t +h5t_post_refine_chk ( + h5t_mesh_t* const m, + h5_glb_idxlist_t* marked_glb_elems + ) { + H5_CORE_API_ENTER (h5_err_t, "m=%p", m); + h5_debug("post_refine_chk"); + // get boundary edges + h5_edge_list_t* b_edges = h5tpriv_init_edge_list(h5tpriv_ref_elem_get_num_edges(m) * m->marked_entities->num_items); + TRY (h5tpriv_find_boundary_edges (m, marked_glb_elems, b_edges)); + + // exchange boundary edges + h5_edge_list_t* glb_b_edges = h5tpriv_init_edge_list(0); + TRY (exchange_boundary_edge_list (m, b_edges, glb_b_edges)); + + // find out which edges are split by other procs (i.e. with lower rank) + // set proc in b_edges to proc who sets glb_idx + TRY (find_edges_in_boundary_edge_list (b_edges, glb_b_edges)); + + + // calc vertex range, num loc vertices = (num new vertices - vertices to be set by other proc) + int num_vtx_not_named = 0; + for (int i = 0; i < b_edges->num_items; i++) { + b_edges->items[i].proc != m->f->myproc ? num_vtx_not_named++ : 0; + } + h5_glb_idx_t* vtx_range = NULL; + TRY (vtx_range = h5_calloc (m->f->nprocs + 1, sizeof (*vtx_range))); + TRY (h5tpriv_get_ranges(m, vtx_range, m->last_stored_vid - m->last_stored_vid_before_ref - num_vtx_not_named, m->num_glb_vertices[m->leaf_level-1])); + + // assign glb vtx idx + m->num_loc_vertices[m->leaf_level] = m->last_stored_vid+1; + + // make list of loc vtx that don't get a glb_idx from this proc + h5_loc_idxlist_t* vtx_list = NULL; + TRY (h5priv_alloc_loc_idxlist(&vtx_list, b_edges->num_items)); + for (int i = 0; i < b_edges->num_items; i++) { + if (b_edges->items[i].proc != m->f->myproc) { + TRY (h5priv_search_in_loc_idxlist (&vtx_list, (h5_loc_idx_t)b_edges->items[i].new_vtx)); + } + } + + TRY (assign_global_vertex_indices_chk (m, vtx_list, vtx_range)); + + // set glb_idx in b_edge list + TRY (set_glb_idx_edge_list (m, b_edges)); + + // exchange glb_idx of vertices + TRY (exchange_boundary_edge_list (m, b_edges, glb_b_edges)); + // TODO could be more efficient by only sending the glb_idx around entries around + // but one would need to create a new list... + + // set exchanged glb_idx + TRY (set_exchanged_glb_idx (m, b_edges, glb_b_edges)); + + // rebuild map g2l + TRY (h5priv_grow_idxmap (&m->map_vertex_g2l, m->map_vertex_g2l.num_items + m->last_stored_vid - m->last_stored_vid_before_ref)); + TRY (h5tpriv_rebuild_map_vertex_g2l_partial (m)); + m->last_stored_vid_before_ref = m->last_stored_vid; + // this is replacing TRY (h5t_end_store_vertices (m)); + // since we need a special assign glb_idx + + TRY (h5priv_mpi_barrier (m->f->props->comm)); + m->timing.measure[m->timing.next_time++] = MPI_Wtime(); + + // get elem ranges + h5_glb_idx_t* elem_range = NULL; + TRY (elem_range = h5_calloc (m->f->nprocs + 1, sizeof (*elem_range))); + + //TODO use generic get_range function + TRY (h5tpriv_get_elem_ranges (m, elem_range)); + + m->num_interior_elems[m->leaf_level] = m->last_stored_eid+1; // TODO needs to be reset after exchange + m->num_glb_elems[m->leaf_level] = elem_range[m->f->nprocs]; + m->num_glb_leaf_elems[m->leaf_level] = m->num_glb_leaf_elems[m->leaf_level - 1] + + (h5tpriv_get_num_new_elems(m) - 1) * (m->num_glb_elems[m->leaf_level]- m->num_glb_elems[m->leaf_level-1]); + // idea: after ref we have the same number of leaf elems + all refined elems - elems that were refined + + /* assign global indices to new indices */ + TRY (assign_glb_elem_indices_chk (m, elem_range)); + + + /* rebuild map: global index -> local_index */ + TRY (rebuild_map_elem_g2l_partial (m)); + m->last_stored_eid_before_ref = m->last_stored_eid; + + + // weights + h5_debug("weights"); + if (m->num_weights < 1) { + m->weights = NULL; + } else { + TRY ( m->weights = h5_alloc (m->weights, elem_range[m->f->nprocs] * m->num_weights * sizeof (*m->weights))); + + // set local weights + TRY (h5tpriv_set_local_weights (m, elem_range)); + + // exchange weights + TRY (h5tpriv_exchange_weights (m, elem_range)); + } + TRY (h5priv_mpi_barrier (m->f->props->comm)); + m->timing.measure[m->timing.next_time++] = MPI_Wtime(); + // get list of new chunks + h5_chk_idx_t* chk_send_list = NULL; + int counter = 0; + TRY (h5tpriv_get_list_of_chunks_to_write (m, &chk_send_list, &counter)); + + // send only chunks from this level + int tmp_counter = 0; + for (int i = 0; i < counter; i++) { + if (chk_send_list[i] > m->chunks->curr_idx - m->chunks->num_chunks_p_level[m->leaf_level]) { // only the chunks stored on the last level + chk_send_list[tmp_counter] = chk_send_list[i]; + tmp_counter++; + } + } + // TODO this should be optimized only really needed chunks should be sent around + + counter = tmp_counter; + // create glb_chunks + h5_glb_elem_t* glb_elems = NULL; + int num_glb_elems = m->num_interior_elems[m->leaf_level] - m->num_interior_elems[m->leaf_level-1]; + TRY (glb_elems = h5tpriv_alloc_glb_elems(m, num_glb_elems)); + TRY (h5tpriv_init_glb_elems_struct_chk(m, glb_elems, chk_send_list, counter)); + + TRY (h5priv_mpi_barrier (m->f->props->comm)); + m->timing.measure[m->timing.next_time++] = MPI_Wtime(); + // create list of glb_vtx + h5_glb_vertex_t* glb_vtx = NULL; + h5_int32_t num_glb_vtx = 0; + TRY (glb_vtx = h5_calloc (4 * num_glb_elems, sizeof (*glb_vtx))); // TODO should be by far enough -> could be optimzed + TRY (h5tpriv_init_glb_vtx_struct_chk (m, glb_elems, num_glb_elems, glb_vtx, &num_glb_vtx)); + + // get list of chunks to retrieve + h5_chk_idx_t* chk_list_read = NULL; + int num_chk_list_read = 0; + TRY (h5tpriv_get_list_of_chunks_to_read(m, &chk_list_read, &num_chk_list_read)); + TRY (get_list_of_chunks_to_retrieve (m, chk_list_read, &num_chk_list_read)); + + TRY (h5priv_mpi_barrier (m->f->props->comm)); + m->timing.measure[m->timing.next_time++] = MPI_Wtime(); + // exchange cells and vertices + h5_glb_elem_t* tot_glb_elems = NULL; + h5_glb_vertex_t* tot_glb_vtx = NULL; + int num_tot_glb_elems = 0; + int num_tot_glb_vtx = 0; + TRY (exchange_glb_elem_glb_vtx (m, glb_elems, num_glb_elems, + &tot_glb_elems, &num_tot_glb_elems, + glb_vtx, num_glb_vtx, + &tot_glb_vtx, &num_tot_glb_vtx)); + TRY (h5_free (glb_elems)); // doesn't that create mem leak? + TRY (h5priv_mpi_barrier (m->f->props->comm)); + m->timing.measure[m->timing.next_time++] = MPI_Wtime(); + + h5_debug("store exchanged elems"); + // store elems & vertices + TRY (store_exchanged_elems (m, chk_list_read, num_chk_list_read, tot_glb_elems, num_tot_glb_elems, tot_glb_vtx, num_tot_glb_vtx)); + + TRY (h5priv_mpi_barrier (m->f->props->comm)); + m->timing.measure[m->timing.next_time++] = MPI_Wtime(); + + // set variables elems + m->num_glb_elems[m->leaf_level] = m->num_glb_elems[m->leaf_level - 1] + num_tot_glb_elems ; + m->num_glb_leaf_elems[m->leaf_level] = m->num_glb_leaf_elems[m->leaf_level - 1] + + num_tot_glb_elems /h5tpriv_get_num_new_elems(m) * (h5tpriv_get_num_new_elems(m) - 1) ; + + m->num_interior_elems[m->leaf_level] = m->last_stored_eid + 1; + m->num_interior_leaf_elems[m->leaf_level] = m->num_interior_leaf_elems[m->leaf_level-1] + + ((m->num_interior_elems[m->leaf_level] - m->num_interior_elems[m->leaf_level-1])/h5tpriv_get_num_new_elems(m) ) * + (h5tpriv_get_num_new_elems(m) - 1); // can it be calc easier? + m->last_stored_eid_before_ref = -1; + + + // set variables vtx + m->num_glb_vertices[m->leaf_level] = vtx_range[m->f->nprocs]; + m->num_loc_vertices[m->leaf_level] = m->last_stored_vid + 1; + m->last_stored_vid_before_ref = -1; + + // update parent elems + // idea go through all refined elem (they know their parent) and set parent.child_idx to their idx + // if it is done backwards always the first child will be stored finally -> is optimizable + for (int i = m->last_stored_eid; i >= m->num_interior_elems[m->leaf_level - 1]; i--) { + h5_loc_idx_t parent_idx = h5tpriv_get_loc_elem_parent_idx (m, i); + if (parent_idx > -1) { // there can be elems with on the chunk border that don't have their parents locally available + // those were refined on a different proc but exchanged to this proc. + assert (h5tpriv_get_loc_elem_child_idx (m, parent_idx) == -1 || + h5tpriv_get_loc_elem_child_idx (m, parent_idx) == i + 1 || + h5tpriv_get_loc_elem_child_idx (m, parent_idx) > i - 4); + TRY (h5tpriv_set_loc_elem_child_idx (m, parent_idx, i)); + } + } + h5_debug("end store elems"); + /* mesh specific finalize */ + TRY (m->methods->store->end_store_elems (m)); + + + + // WARNING elements on boundary chunks that lay on proc boundary may not have enough information + // to update the neighborhood correctly. a possibility would be to send them around again (the proc + // who owns their chunk has all necessary neighboring chunks i.e. chan update them properly) + + + //since we need special versions of this function, it was already implemented above + // i don't know if there is a nice way to separate it also in parallel... + // TRY (h5t_end_store_elems (m)); + + // memory cleanup + + TRY (h5_free (vtx_range)); + + TRY (h5_free (chk_list_read)); + TRY (h5priv_free_glb_idxlist (&marked_glb_elems)); + + + marked_glb_elems = NULL; + H5_CORE_API_RETURN (h5priv_free_loc_idlist (&m->marked_entities)); + +} + +#endif +h5_err_t +h5t_begin_refine_elems ( + h5t_mesh_t* const m + ) { + H5_CORE_API_ENTER (h5_err_t, "m=%p", m); + + TRY (h5tpriv_add_level (m)); + /* + Pre-allocate space for items to avoid allocating small pieces of + memory. + */ + TRY (h5priv_alloc_loc_idlist (&m->marked_entities, MAX_NUM_ELEMS_TO_REFINE_LOCALLY)); + H5_CORE_API_RETURN (H5_SUCCESS); +} + +h5_err_t +h5t_end_refine_elems ( + h5t_mesh_t* const m + ) { + H5_CORE_API_ENTER (h5_err_t, "m=%p", m); + if (m->is_chunked) { +#ifdef PARALLEL_IO + TRY (h5priv_mpi_barrier (m->f->props->comm)); + m->timing.measure[m->timing.next_time++] = MPI_Wtime(); + h5_glb_idxlist_t* glb_list = NULL; + h5_oct_point_t* midpoints = NULL; + TRY (h5t_pre_refine_chk (m, &glb_list, &midpoints)); + TRY (h5priv_mpi_barrier (m->f->props->comm)); + m->timing.measure[m->timing.next_time++] = MPI_Wtime(); + TRY (h5t_refine_marked_elems_chk (m, glb_list, midpoints)); + TRY (h5priv_mpi_barrier (m->f->props->comm)); + m->timing.measure[m->timing.next_time++] = MPI_Wtime(); + TRY (h5_free (midpoints)); + midpoints = NULL; + TRY (h5t_post_refine_chk (m, glb_list)); + m->mesh_changed = 1; + TRY (h5priv_mpi_barrier (m->f->props->comm)); + m->timing.measure[m->timing.next_time++] = MPI_Wtime(); +#endif + } else { + TRY (h5t_pre_refine (m)); + TRY (h5t_refine_marked_elems (m)); + TRY (h5t_post_refine (m)); + m->mesh_changed = 1; + } + + H5_CORE_API_RETURN (H5_SUCCESS); +} + + +h5_err_t +h5tpriv_init_chunks ( + h5t_mesh_t* const m + ) { + H5_PRIV_FUNC_ENTER (h5_err_t, "m=%p", m); + + if (m->chunks != NULL) { + H5_PRIV_FUNC_LEAVE (H5_ERR_INVAL); + } + TRY (m->chunks = h5_calloc (1, sizeof (*m->chunks))); + m->chunks->curr_idx = -1; + m->chunks->num_alloc = -1; + m->chunks->num_levels = -1; + m->chunks->num_chunks_p_level = NULL; + m->chunks->chunks = NULL; + + H5_PRIV_FUNC_RETURN (H5_SUCCESS); +} + +h5_err_t +h5tpriv_grow_chunks ( + h5t_mesh_t* const m, + h5_chk_idx_t const size + ) { + H5_PRIV_FUNC_ENTER (h5_err_t, "m=%p, size=%d", m, size); + if (m->chunks->chunks == NULL ) { + m->chunks->num_alloc = size; + m->chunks->num_levels = 1; + TRY (m->chunks->chunks = h5_calloc (size, sizeof (*m->chunks->chunks))); + TRY (m->chunks->num_chunks_p_level = h5_calloc ( + m->chunks->num_levels, + sizeof (*m->chunks->num_chunks_p_level))); + m->chunks->num_chunks_p_level[0] = size; + } else { + m->chunks->num_alloc += size; + m->chunks->num_levels++; + TRY (m->chunks->chunks = h5_alloc (m->chunks->chunks, (m->chunks->num_alloc)* sizeof (*m->chunks->chunks))); + TRY (m->chunks->num_chunks_p_level = h5_alloc ( + m->chunks->num_chunks_p_level, + m->chunks->num_levels * sizeof (*m->chunks->num_chunks_p_level))); + m->chunks->num_chunks_p_level[m->chunks->num_levels - 1] = size; + } + H5_PRIV_FUNC_RETURN (H5_SUCCESS); +} + +h5_err_t +h5tpriv_store_chunks ( + h5t_mesh_t* const m, + h5t_oct_count_list_t* list, + h5_chk_idx_t num_chunks, + h5_glb_idx_t* elem_range, + h5_glb_idx_t* chk_range + ) { + H5_PRIV_FUNC_ENTER (h5_err_t, "m=%p, list=%p, num_chunks=%d, " + "elem_range=%p, chk_range=%p", m, list, num_chunks, elem_range, chk_range); + + if (list->num_items <= 0) { + assert (chk_range[m->f->myproc+1] - chk_range[m->f->myproc] == 0); + assert (elem_range[m->f->myproc+1] - elem_range[m->f->myproc] == 0); + assert (num_chunks == 0); + H5_PRIV_FUNC_LEAVE (H5_SUCCESS); + } + int counter = 0; + h5_chk_weight_t weight = 0; + h5_oct_idx_t oct_idx = -1; + //h5_lvl_idx_t level = m->leaf_level; + int tot_loc_elem = 0; + for (int i = 0; i < list->num_items; i++) { + + oct_idx = list->items[i].oct; + counter = list->items[i].count; + if (m->leaf_level > 0) { + counter *= h5tpriv_get_num_new_elems (m); + } + TRY (h5tpriv_create_chunk (m, oct_idx, elem_range[m->f->myproc] + tot_loc_elem, weight, counter, chk_range)); + tot_loc_elem += counter; + } + + if ((m->chunks->curr_idx + 1 != chk_range[m->f->myproc + 1]) || + (tot_loc_elem != elem_range[m->f->myproc + 1] - elem_range[m->f->myproc])) { + H5_PRIV_FUNC_LEAVE (H5_ERR_INTERNAL); + } + + H5_PRIV_FUNC_RETURN (H5_SUCCESS); +} +h5_err_t +h5tpriv_create_chunk ( + h5t_mesh_t* m, + h5_oct_idx_t const oct_idx, + h5_glb_idx_t const first_elem, + h5_chk_weight_t const weight, + h5_chk_size_t num_elems, + h5_glb_idx_t* chk_range + ) { + H5_PRIV_FUNC_ENTER (h5_err_t, "m=%p, oct_idx=%d, first_elem=%lld, weight=%lld, num_elems=%d", + m, oct_idx,(long long) first_elem, (long long) weight, num_elems); + + if (m->chunks->curr_idx + 1 > m->chunks->num_alloc) { + H5_PRIV_FUNC_LEAVE (H5_ERR_INTERNAL); + } + if (chk_range == NULL) { + m->chunks->curr_idx++; + } else { + // set curr_idx to beginn of chk_range if not there + if (m->chunks->curr_idx < chk_range[m->f->myproc]) { + m->chunks->curr_idx = (h5_chk_idx_t) chk_range[m->f->myproc]; + } else { + // otherwise already in right range, just add one + m->chunks->curr_idx++; + } + // check that curr_idx doesn't leave range + assert (m->chunks->curr_idx < chk_range[m->f->myproc + 1]); + } + + + m->chunks->chunks[m->chunks->curr_idx].idx = m->chunks->curr_idx; + m->chunks->chunks[m->chunks->curr_idx].oct_idx = oct_idx; + m->chunks->chunks[m->chunks->curr_idx].elem = first_elem; +// m->chunks->chunks[m->chunks->curr_idx].elems_subchk = NULL; + m->chunks->chunks[m->chunks->curr_idx].weight = weight; + m->chunks->chunks[m->chunks->curr_idx].num_elems = num_elems; +// m->chunks->chunks[m->chunks->curr_idx].vtx = -2; // TODO remove from chunks +// m->chunks->chunks[m->chunks->curr_idx].num_vtx = -2; // TODO remove from chunks + + + H5_PRIV_FUNC_RETURN (H5_SUCCESS); +} + +#ifdef PARALLEL_IO +/* + * exchange newly created chunks + */ + +h5_err_t +h5tpriv_update_chunks ( + h5t_mesh_t* m, + h5_glb_idx_t* chk_range + ) { + H5_PRIV_FUNC_ENTER (h5_err_t, "m=%p, chk_range=%p", m, chk_range); + // range is already known + int sendcount = chk_range[m->f->myproc + 1 ] - chk_range[m->f->myproc]; + + // sendbuffer + h5t_chunk_t* sendbuf = NULL; + TRY (sendbuf = h5_calloc (sendcount, sizeof (*sendbuf))); + memcpy(sendbuf, &m->chunks->chunks[chk_range[m->f->myproc]], sendcount * sizeof (*m->chunks->chunks)); + + + // recvbuf + int* recvdisp = NULL; + int* recvcount = NULL; + TRY (recvdisp = h5_calloc (m->f->nprocs, sizeof (*recvdisp))); + TRY (recvcount = h5_calloc (m->f->nprocs, sizeof (*recvcount))); + recvdisp[0] = 0; + recvcount[0] = chk_range[1] - chk_range[0]; + for (int i = 1; i < m->f->nprocs; i++) { + recvdisp[i] = chk_range[i] - chk_range[0]; + recvcount[i] = chk_range[i + 1 ] - chk_range[i]; + } + + h5priv_mpi_allgatherv( + sendbuf, + sendcount, + h5_dta_types.mpi_chunk, + &m->chunks->chunks[chk_range[0]], + recvcount, + recvdisp, + h5_dta_types.mpi_chunk, + m->f->props->comm); + + m->chunks->curr_idx = chk_range[m->f->nprocs] -1; + TRY (h5_free (sendbuf)); + TRY (h5_free (recvdisp)); + TRY (h5_free (recvcount)); + + H5_PRIV_FUNC_RETURN (H5_SUCCESS); +} + + +h5_err_t +h5tpriv_free_chunks ( + h5t_mesh_t* const m + ) { + H5_PRIV_FUNC_ENTER (h5_err_t, "m=%p", m); + + if (m->chunks != NULL) { + TRY (h5_free (m->chunks->chunks)); + TRY (h5_free (m->chunks->num_chunks_p_level)); + TRY (h5_free (m->chunks)); + } + H5_PRIV_FUNC_RETURN (H5_SUCCESS); +} + +h5_err_t +h5tpriv_print_chunks ( + h5t_mesh_t* const m + ) { + H5_PRIV_FUNC_ENTER (h5_err_t, "m=%p", m); + h5_debug ("\nPrinting chunks: \n curr_idx: %d\n num_alloc: %d\n num_levels: %d\n\n", + m->chunks->curr_idx, + m->chunks->num_alloc, + m->chunks->num_levels); + for (int i = 0; i <= m->chunks->curr_idx; i++) { + h5_debug ("\nchunk: %d \n oct_idx: %d \n elem: %lld \n weight:%lld \n num_elems: %d\n\n", + m->chunks->chunks[i].idx, + m->chunks->chunks[i].oct_idx, + (long long) m->chunks->chunks[i].elem, + (long long) m->chunks->chunks[i].weight, + m->chunks->chunks[i].num_elems + ); + } + + + H5_PRIV_FUNC_RETURN (H5_SUCCESS); +} + +h5_err_t +h5tpriv_print_oct_userdata ( + h5t_mesh_t* const m + ) { + H5_PRIV_FUNC_ENTER (h5_err_t, "m=%p", m); + h5_debug ("\nPrinting oct_userdata: \n curr_idx: %d\n", + m->octree->current_oct_idx); + for (int i = 0; i <= m->octree->current_oct_idx; i++) { + h5_debug ("\n oct_idx: %d \n %d - %d - %d - %d \n\n", + i, + ((h5t_oct_userdata_t*)m->octree->userdata)[i].idx[0], + ((h5t_oct_userdata_t*)m->octree->userdata)[i].idx[1], + ((h5t_oct_userdata_t*)m->octree->userdata)[i].idx[2], + ((h5t_oct_userdata_t*)m->octree->userdata)[i].idx[3] + ); + } + + + H5_PRIV_FUNC_RETURN (H5_SUCCESS); +} +#endif +#if 0 +// index set for DUNE +h5_err_t +h5t_create_index_set ( + h5t_mesh_t* const m + ) { + H5_CORE_API_ENTER (h5_err_t, "m=%p", m); + int codim; + int dim = h5tpriv_ref_elem_get_dim (m); + // todo: check tagset already exist + TRY (h5t_add_mtagset (m, "__IndexSet__", H5_INT64_T)); + + for (codim = 0; codim <= dim; codim++) { + h5_glb_idx_t idx = 0; + h5t_leaf_iterator_t it; + h5_glb_id_t entity_id; + TRY (h5t_init_leaf_iterator ((h5t_iterator_t*)&it, m, codim)); + while ((entity_id = it.iter(f, (h5t_iterator_t*)&it)) >= 0) { + TRY (h5t_set_mtag_by_name (f, "__IndexSet__", entity_id, 1, &idx)); + } + } + H5_CORE_API_RETURN (H5_SUCCESS); +} +#endif diff --git a/src/h5core/h5t_store_private.h b/src/h5core/h5t_store_private.h new file mode 100644 index 0000000..9f17596 --- /dev/null +++ b/src/h5core/h5t_store_private.h @@ -0,0 +1,85 @@ +/* + Copyright (c) 2006-2013, The Regents of the University of California, + through Lawrence Berkeley National Laboratory (subject to receipt of any + required approvals from the U.S. Dept. of Energy) and the Paul Scherrer + Institut (Switzerland). All rights reserved. + + License: see file COPYING in top level of source distribution. +*/ + +#ifndef __H5T_STORE_PRIVATE_H +#define __H5T_STORE_PRIVATE_H + +#include "h5core/h5_types.h" +#include "h5t_types_private.h" +#include "h5core/h5t_store.h" + +struct h5t_store_methods { + h5_err_t (*alloc_loc_elems)(h5t_mesh_t* const, const size_t, const size_t); + h5_err_t (*pre_refine)(h5t_mesh_t* const); + h5_loc_idx_t (*refine_elem)(h5t_mesh_t* const, const h5_loc_idx_t); + int (*get_num_new_elems)(void); + h5_err_t (*end_store_elems)(h5t_mesh_t* const); +}; + +extern struct h5t_store_methods h5tpriv_trim_store_methods; +extern struct h5t_store_methods h5tpriv_tetm_store_methods; + +h5_lvl_idx_t +h5tpriv_add_level (h5t_mesh_t* const); + +static inline h5_err_t +h5tpriv_alloc_loc_elems ( + h5t_mesh_t* const m, + const size_t cur, + const size_t new + ) { + return m->methods->store->alloc_loc_elems (m, cur, new); +} + +static inline h5_loc_idx_t +h5tpriv_refine_elem ( + h5t_mesh_t * const m, + const h5_loc_idx_t elem_idx + ) { + return m->methods->store->refine_elem (m, elem_idx); +} + +static inline int +h5tpriv_get_num_new_elems ( + h5t_mesh_t * const m + ) { + return m->methods->store->get_num_new_elems (); +} + +h5_err_t +h5tpriv_init_chunks (h5t_mesh_t* const); + +h5_err_t +h5tpriv_grow_chunks (h5t_mesh_t* const, h5_chk_idx_t const size); + +h5_err_t +h5tpriv_store_chunks (h5t_mesh_t* const m, h5t_oct_count_list_t* list, h5_chk_idx_t num_chunks, h5_glb_idx_t* elem_range, h5_glb_idx_t* chk_range); + +h5_err_t +h5tpriv_create_chunk (h5t_mesh_t* m, h5_oct_idx_t const oct_idx, h5_glb_idx_t const first_elem, h5_chk_weight_t const weight, h5_chk_size_t num_elems, h5_glb_idx_t* chk_range); + +h5_err_t +h5tpriv_update_chunks (h5t_mesh_t* m, h5_glb_idx_t* chk_range); + +h5_err_t +h5tpriv_free_chunks (h5t_mesh_t* const m); + +h5_err_t +h5tpriv_print_chunks (h5t_mesh_t* const m); + +h5_err_t +h5tpriv_mark_chk_elems_to_refine (h5t_mesh_t* const m, h5_glb_idxlist_t* glb_marked_entities, h5_oct_point_t* midpoint_list); + +int +h5tpriv_octant_is_full (h5t_octree_t* octree, h5_oct_idx_t oct_idx); + +h5_err_t +h5tpriv_get_ranges (h5t_mesh_t* const m, h5_glb_idx_t* range, h5_glb_idx_t mycount, h5_glb_idx_t glb_start); + +#endif diff --git a/src/h5core/h5t_store_tetm.c b/src/h5core/h5t_store_tetm.c new file mode 100644 index 0000000..14f269d --- /dev/null +++ b/src/h5core/h5t_store_tetm.c @@ -0,0 +1,342 @@ +/* + Copyright (c) 2006-2012, The Regents of the University of California, + through Lawrence Berkeley National Laboratory (subject to receipt of any + required approvals from the U.S. Dept. of Energy) and the Paul Scherrer + Institut (Switzerland). All rights reserved. + + License: see file COPYING in top level of source distribution. +*/ + +#include "h5t_types_private.h" +#include "h5t_errorhandling_private.h" +#include "h5t_access_private.h" +#include "h5t_adjacencies_private.h" +#include "h5t_core_private.h" +#include "h5t_map_private.h" +#include "h5t_model_private.h" +#include "h5t_readwrite_private.h" +#include "h5t_store_private.h" + +#include "h5core/h5t_map.h" + +static h5_err_t +alloc_loc_elems ( + h5t_mesh_t* const m, + const size_t cur, // currently allocated + const size_t new // new size + ) { + H5_PRIV_FUNC_ENTER (h5_err_t, "m=%p, cur=%zu, new=%zu", m, cur, new); + + /* alloc mem for local data of elements */ + TRY ( m->loc_elems = h5_alloc ( + m->loc_elems, + new * sizeof (h5_loc_tet_t) ) ); + memset ( + (h5_loc_tet_t*)m->loc_elems + cur, + -1, + (new-cur) * sizeof (h5_loc_tet_t) ); + + H5_PRIV_FUNC_RETURN (H5_SUCCESS); +} + + +/*! + Refine edge. Store vertex, if new. + + Function can be used with tetrahedral and triangle meshes. + + \return local index of vertex + */ +static h5_loc_idx_t +bisect_edge ( + h5t_mesh_t* const m, + const h5_loc_idx_t face_idx, + const h5_loc_idx_t elem_idx + ) { + H5_PRIV_FUNC_ENTER (h5_loc_idx_t, + "m=%p, face_idx=%lld, elem_idx=%lld", + m, (long long)face_idx, (long long)elem_idx); + h5_loc_idlist_t* retval; + /* + get all elements sharing the given edge + */ + TRY (h5tpriv_find_te2 (m, face_idx, elem_idx, &retval)); + /* + check wether one of the found elements has been refined + */ + size_t i; + for (i = 0; i < retval->num_items; i++) { + h5_loc_id_t kids[2] = {-1,-1}; + TRY (h5tpriv_get_loc_entity_children (m, retval->items[i], kids)); + if (kids[0] >= 0) { + // element has been refined, return bisecting point + h5_loc_idx_t edge0[2], edge1[2]; + TRY( h5t_get_loc_vertex_indices_of_edge (m, kids[0], edge0) ); + TRY( h5t_get_loc_vertex_indices_of_edge (m, kids[1], edge1) ); + if ((edge0[0] == edge1[0]) || (edge0[0] == edge1[1])) { + H5_PRIV_FUNC_LEAVE (edge0[0]); // return first vertex + } else { + H5_PRIV_FUNC_LEAVE (edge0[1]); // return second vertex + } + } + } + /* + None of the elements has been refined -> add new vertex. + */ + h5_loc_idx_t indices[2]; + TRY( h5t_get_loc_vertex_indices_of_edge2 (m, face_idx, elem_idx, indices) ); + h5_float64_t* P0 = m->vertices[indices[0]].P; + h5_float64_t* P1 = m->vertices[indices[1]].P; + h5_float64_t P[3]; + + P[0] = (P0[0] + P1[0]) / 2.0; + P[1] = (P0[1] + P1[1]) / 2.0; + P[2] = (P0[2] + P1[2]) / 2.0; + + H5_PRIV_FUNC_RETURN (h5t_store_vertex (m, -1, P)); // return idx of new vertex +} + +/* + When calling this function, we know the number of elements to refine. But + we don't now the number of new vertices we will get. We have to compute + this number or just to guess it. + + Let n be the number of elements to refine and L the number of boundary faces of the + disconnected areas to be refined. Let l be the number of edges on + + For triangle grids the upper limit of new vertices is 3n and the lower limit + 3/2n + 3/2. The exact number is 3/2n + 1/2L. + The number of inner vertices is (3n-L)/2 and the boundary vertices L. + + similar for tetrahedrals but calc also include boundary edges... +// For tetrahedral grids the upper limit is 6n and the lower limit is 3n+3. +// The exact number is 3n + 3l. + + To get the real number of vertices to add, we either have to compute the + number of disconnected areas (which is quiet expensive), try to guess it + (which is impossible) or just set a limit. In most cases the number of + disconnected areas will be "small". + + For the time being we set the maximum number of boundary to 64. + */ +static h5_err_t +pre_refine_tet ( + h5t_mesh_t* const m + ) { + H5_PRIV_FUNC_ENTER (h5_err_t, "m=%p", m); + unsigned int num_interior_elems_to_refine = m->marked_entities->num_items; + TRY (h5t_begin_store_vertices (m, num_interior_elems_to_refine*3 + 192)); + TRY (h5t_begin_store_elems (m, num_interior_elems_to_refine*8, m->num_weights)); + H5_PRIV_FUNC_RETURN (H5_SUCCESS); +} + +/*! + Refine tetrahedron \c elem_idx. This function implements a "red refinement" + as described by J. Bey in "Tetrahedral grid refinement", Computing 55 + (1995), pp. 355-378 + + \return Local id of first new tetrahedron or \c -1 + */ +static h5_loc_idx_t +refine_tet ( + h5t_mesh_t* const m, + const h5_loc_idx_t elem_idx + ) { + H5_PRIV_FUNC_ENTER (h5_loc_idx_t, + "m=%p, elem_idx=%lld", + m, (long long)elem_idx); + h5_loc_idx_t vertices[10]; + h5_loc_idx_t elem_idx_of_first_child; + h5_loc_tet_t* el = (h5_loc_tet_t*)m->loc_elems + elem_idx; + + if ( el->child_idx >= 0 ) + H5_PRIV_FUNC_LEAVE ( + h5_error ( + H5_ERR_INVAL, + "Tetrahedron %lld already refined.", + (long long)elem_idx )); + vertices[0] = el->vertex_indices[0]; + vertices[1] = el->vertex_indices[1]; + vertices[2] = el->vertex_indices[2]; + vertices[3] = el->vertex_indices[3]; + + vertices[4] = bisect_edge (m, 0, elem_idx); // edge (0,1) + vertices[5] = bisect_edge (m, 1, elem_idx); // edge (0,2) + vertices[6] = bisect_edge (m, 2, elem_idx); // edge (1,2) + vertices[7] = bisect_edge (m, 3, elem_idx); // edge (0,3) + vertices[8] = bisect_edge (m, 4, elem_idx); // edge (1,3) + vertices[9] = bisect_edge (m, 5, elem_idx); // edge (2,3) + + // add new tets + h5_loc_idx_t new_elem[4]; + + // child 0 + new_elem[0] = vertices[0]; // vertex 0 + new_elem[1] = vertices[4]; // split point (0,1) + new_elem[2] = vertices[5]; // split point (0,2) + new_elem[3] = vertices[7]; // split point (0,3) + TRY( elem_idx_of_first_child = h5t_store_elem (m, elem_idx, new_elem, NULL) ); //TODO check use of h5t_store_elem2 + + // child 1 + new_elem[0] = vertices[4]; // split point (0,1) + new_elem[1] = vertices[1]; // vertex 1 + new_elem[2] = vertices[6]; // split point (1,2) + new_elem[3] = vertices[8]; // split point (1,3) + TRY( h5t_store_elem (m, elem_idx, new_elem, NULL) ); //TODO check use of h5t_store_elem2 + + // child 2 + new_elem[0] = vertices[5]; // split point (0,2) + new_elem[1] = vertices[6]; // split point (1,2) + new_elem[2] = vertices[2]; // vertex 2 + new_elem[3] = vertices[9]; // split point (2,3) + TRY( h5t_store_elem (m, elem_idx, new_elem, NULL) ); //TODO check use of h5t_store_elem2 + + // child 3 + new_elem[0] = vertices[7]; // split point (0,3) + new_elem[1] = vertices[8]; // split point (1,3) + new_elem[2] = vertices[9]; // split point (2,3) + new_elem[3] = vertices[3]; // vertex 3 + TRY( h5t_store_elem (m, elem_idx, new_elem, NULL) );//TODO check use of h5t_store_elem2 + + // child 4 + new_elem[0] = vertices[4]; // split point (0,1) + new_elem[1] = vertices[5]; // split point (0,2) + new_elem[2] = vertices[6]; // split point (1,2) + new_elem[3] = vertices[8]; // split point (1,3) + TRY( h5t_store_elem (m, elem_idx, new_elem, NULL) );//TODO check use of h5t_store_elem2 + + // child 5 + new_elem[0] = vertices[4]; // split point (0,1) + new_elem[1] = vertices[5]; // split point (0,2) + new_elem[2] = vertices[7]; // split point (0,3) + new_elem[3] = vertices[8]; // split point (1,3) + TRY( h5t_store_elem (m, elem_idx, new_elem, NULL) );//TODO check use of h5t_store_elem2 + + // child 6 + new_elem[0] = vertices[5]; // split point (0,2) + new_elem[1] = vertices[6]; // split point (1,2) + new_elem[2] = vertices[8]; // split point (1,3) + new_elem[3] = vertices[9]; // split point (2,3) + TRY( h5t_store_elem (m, elem_idx, new_elem, NULL) );//TODO check use of h5t_store_elem2 + + // child 7 + new_elem[0] = vertices[5]; // split point (0,2) + new_elem[1] = vertices[7]; // split point (0,3) + new_elem[2] = vertices[8]; // split point (1,3) + new_elem[3] = vertices[9]; // split point (2,3) + TRY( h5t_store_elem (m, elem_idx, new_elem, NULL) );//TODO check use of h5t_store_elem2 + + ((h5_loc_tet_t*)m->loc_elems)[elem_idx].child_idx = elem_idx_of_first_child; + m->num_interior_leaf_elems[m->leaf_level]--; + + H5_PRIV_FUNC_RETURN (elem_idx_of_first_child); +} + +static inline h5_loc_idx_t +compute_neighbor_of_face ( + h5t_mesh_t* const m, + h5_loc_idx_t elem_idx, + const h5_loc_idx_t face_idx + ) { + H5_PRIV_FUNC_ENTER (h5_loc_idx_t, + "m=%p, elem_idx=%lld, face_idx=%lld", + m, (long long)elem_idx, (long long)face_idx); + h5_loc_idlist_t* td; + h5_loc_idx_t neighbor_idx = -2; + + do { + TRY( h5tpriv_find_td2 ( + m, + face_idx, + elem_idx, + &td) ); + if (td == NULL) { + H5_PRIV_FUNC_LEAVE (h5_error_internal ()); + } + if (td->num_items == 1) { + // neighbor is coarser or face is on the boundary + elem_idx = ((h5_loc_tet_t*)m->loc_elems)[elem_idx].parent_idx; + if (elem_idx == -1) { + // we are on the level of the macro grid + neighbor_idx = -1; + } + } else if (td->num_items == 2) { + // neighbor has same level of coarsness + if (h5tpriv_get_elem_idx(td->items[0]) == elem_idx) { + neighbor_idx = h5tpriv_get_elem_idx (td->items[1]); + } else { + neighbor_idx = h5tpriv_get_elem_idx (td->items[0]); + } + + } else { + H5_PRIV_FUNC_LEAVE (h5_error_internal ()); + } + } while (neighbor_idx < -1); + H5_PRIV_FUNC_RETURN (neighbor_idx); +} + +/* + Compute neighbors for elements on given level. + */ +static inline h5_err_t +compute_neighbors_of_elems ( + h5t_mesh_t* const m, + h5_lvl_idx_t level + ) { + H5_PRIV_FUNC_ENTER (h5_err_t, "m=%p, level=%d", m, level); + if (level < 0 || level >= m->num_leaf_levels) { + H5_PRIV_FUNC_LEAVE ( + h5_error ( + H5_ERR_INVAL, + "level idx %lld out of bound, must be in [%lld,%lld]", + (long long)level, + (long long)0, + (long long)m->num_leaf_levels)); + } + h5_loc_idx_t elem_idx = level == 0 ? 0 : m->num_interior_elems[level-1]; + const h5_loc_idx_t last_idx = m->num_interior_elems[level] - 1; + h5_loc_tet_t *el = (h5_loc_tet_t*)m->loc_elems + elem_idx; + while (elem_idx <= last_idx) { + h5_loc_idx_t face_idx = 0; + for (; face_idx < 4; face_idx++) { + el->neighbor_indices[face_idx] = + compute_neighbor_of_face (m, elem_idx, face_idx); + } + elem_idx++; + el++; + } + + H5_PRIV_FUNC_RETURN (H5_SUCCESS); +} +/* + * returns number of newly created tetrahedra when refining a tetrahedral + */ +static int +get_num_new_tetrahedra ( + void + ) { + return 8; +} + +static h5_err_t +end_store_elems ( + h5t_mesh_t* const m + ) { + H5_PRIV_FUNC_ENTER (h5_err_t, "m=%p", m); + + h5_loc_idx_t start_idx = (m->leaf_level > 0) ? m->num_interior_elems[m->leaf_level-1] : 0; + h5_loc_idx_t count = m->num_interior_elems[m->leaf_level] - start_idx; + + TRY( h5tpriv_update_internal_structs (m, m->leaf_level) ); + TRY( compute_neighbors_of_elems (m, m->leaf_level) ); + TRY( h5tpriv_init_elem_flags (m, start_idx, count) ); + H5_PRIV_FUNC_RETURN (H5_SUCCESS); +} + +struct h5t_store_methods h5tpriv_tetm_store_methods = { + alloc_loc_elems, + pre_refine_tet, + refine_tet, + get_num_new_tetrahedra, + end_store_elems, +}; diff --git a/src/h5core/h5t_store_trim.c b/src/h5core/h5t_store_trim.c new file mode 100644 index 0000000..ba0b4d4 --- /dev/null +++ b/src/h5core/h5t_store_trim.c @@ -0,0 +1,292 @@ +/* + Copyright (c) 2006-2012, The Regents of the University of California, + through Lawrence Berkeley National Laboratory (subject to receipt of any + required approvals from the U.S. Dept. of Energy) and the Paul Scherrer + Institut (Switzerland). All rights reserved. + + License: see file COPYING in top level of source distribution. +*/ + +#include "h5t_types_private.h" +#include "h5t_errorhandling_private.h" +#include "h5t_access_private.h" +#include "h5t_adjacencies_private.h" +#include "h5t_core_private.h" +#include "h5t_map_private.h" +#include "h5t_model_private.h" +#include "h5t_readwrite_private.h" +#include "h5t_store_private.h" + +#include "h5core/h5t_map.h" + +static h5_err_t +alloc_loc_elems ( + h5t_mesh_t* const m, + const size_t cur, + const size_t new + ) { + H5_PRIV_FUNC_ENTER (h5_err_t, "m=%p, cur=%zu, new=%zu", m, cur, new); + + /* alloc mem for local data of elements */ + TRY (m->loc_elems = h5_alloc ( + m->loc_elems, + new * sizeof (h5_loc_tri_t))); + memset ( + (h5_loc_tri_t*)m->loc_elems + cur, + -1, + (new-cur) * sizeof (h5_loc_tri_t)); + + H5_PRIV_FUNC_RETURN (H5_SUCCESS); +} + +/* + Bisect edge and return local vertex index of the bisecting point. + */ +static h5_loc_idx_t +bisect_edge ( + h5t_mesh_t* const m, + const h5_loc_idx_t face_idx, + const h5_loc_idx_t elem_idx + ) { + H5_PRIV_FUNC_ENTER (h5_loc_idx_t, + "m=%p, face_idx=%lld, elem_idx=%lld", + m, (long long)face_idx, (long long)elem_idx); + h5_loc_idlist_t* retval; + // get all elements sharing the given edge + TRY (h5tpriv_find_te2 (m, face_idx, elem_idx, &retval)); + // check weather one of the found elements has been refined + size_t i; + for (i = 0; i < retval->num_items; i++) { +// // check if it is shared boundary edge that has been refined already +// if (num_b_edges > 0) { +// h5_glb_idx_t my_glb_idx = m->loc_elems[elem_idx].glb_idx; +// for (int j = 0; j < num_b_edges; j++) { +// if (b_edges[j].idx == my_glb_idx && +// b_edges[j].face_idx == face_idx) { +// H5_PRIV_FUNC_LEAVE (b_edges[j].vtx); +// } +// } +// } + h5_loc_id_t kids[2] = {-1,-1}; + TRY (h5tpriv_get_loc_entity_children (m, retval->items[i], kids)); + if (kids[0] >= 0) { + // element has been refined, return bisecting point + h5_loc_idx_t edge0[2], edge1[2]; + TRY (h5t_get_loc_vertex_indices_of_edge (m, kids[0], edge0)); + TRY (h5t_get_loc_vertex_indices_of_edge (m, kids[1], edge1)); + if ((edge0[0] == edge1[0]) || (edge0[0] == edge1[1])) { + H5_PRIV_FUNC_LEAVE (edge0[0]); + } else { + H5_PRIV_FUNC_LEAVE (edge0[1]); + } + } + } + /* + None of the elements has been refined -> add new vertex. + */ + h5_loc_idx_t indices[2]; + TRY( h5t_get_loc_vertex_indices_of_edge2 (m, face_idx, elem_idx, indices) ); + h5_float64_t* P0 = m->vertices[indices[0]].P; + h5_float64_t* P1 = m->vertices[indices[1]].P; + h5_float64_t P[3]; + + P[0] = (P0[0] + P1[0]) / 2.0; + P[1] = (P0[1] + P1[1]) / 2.0; + P[2] = (P0[2] + P1[2]) / 2.0; + + H5_PRIV_FUNC_RETURN (h5t_store_vertex (m, -1, P)); +} + +/* + Please read note about number of new vertices in tetrahedral + mesh implementation. + */ +static h5_err_t +pre_refine_triangle ( + h5t_mesh_t* const m + ) { + H5_PRIV_FUNC_ENTER (h5_err_t, "m=%p", m); + unsigned int num_interior_elems_to_refine = m->marked_entities->num_items; + TRY (h5t_begin_store_vertices (m, num_interior_elems_to_refine*3 + 64)); + TRY (h5t_begin_store_elems (m, num_interior_elems_to_refine*4, m->num_weights)); + H5_PRIV_FUNC_RETURN (H5_SUCCESS); +} + +/*! + Refine triangle \c local_eid + + \return Local index of first new triangle or \c H5_ERR + */ +static h5_loc_idx_t +refine_triangle ( + h5t_mesh_t* const m, + const h5_loc_idx_t elem_idx + ) { + H5_PRIV_FUNC_ENTER (h5_loc_idx_t, + "m=%p, elem_idx=%lld", + m, (long long)elem_idx); + h5_loc_idx_t vertices[6]; // local vertex indices + h5_loc_idx_t elem_idx_of_first_child; + h5_loc_tri_t* el = (h5_loc_tri_t*)m->loc_elems + elem_idx; + + if (el->child_idx >= 0) + H5_PRIV_FUNC_LEAVE ( + h5_error ( + H5_ERR_INVAL, + "Element %lld already refined.", + (long long)elem_idx)); + + vertices[0] = el->vertex_indices[0]; + vertices[1] = el->vertex_indices[1]; + vertices[2] = el->vertex_indices[2]; + + vertices[3] = bisect_edge (m, 0, elem_idx); + vertices[4] = bisect_edge (m, 1, elem_idx); + vertices[5] = bisect_edge (m, 2, elem_idx); + + h5_loc_idx_t new_elem[3]; + + new_elem[0] = vertices[0]; // V[0] < V[3] , V[4] + new_elem[1] = vertices[3]; + new_elem[2] = vertices[4]; + TRY( elem_idx_of_first_child = h5t_store_elem (m, elem_idx, new_elem, NULL) ); + + new_elem[0] = vertices[3]; // V[3] < V[1] , V[5] + new_elem[1] = vertices[1]; + new_elem[2] = vertices[5]; + TRY( h5t_store_elem (m, elem_idx, new_elem, NULL) ); + + new_elem[0] = vertices[4]; // V[4] < V[5] , V[2] + new_elem[1] = vertices[5]; + new_elem[2] = vertices[2]; + TRY( h5t_store_elem (m, elem_idx, new_elem, NULL) ); + + new_elem[0] = vertices[3]; // V[3] < V[4] , V[5] + new_elem[1] = vertices[5]; + new_elem[2] = vertices[4]; // TODO check if that ordering is correct! + TRY( h5t_store_elem (m, elem_idx, new_elem, NULL) ); + + ((h5_loc_tri_t*)m->loc_elems)[elem_idx].child_idx = elem_idx_of_first_child; + m->num_interior_leaf_elems[m->leaf_level]--; + + H5_PRIV_FUNC_RETURN (elem_idx_of_first_child); +} + +static inline h5_loc_idx_t +compute_neighbor_of_face ( + h5t_mesh_t* const m, + h5_loc_idx_t elem_idx, + const h5_loc_idx_t face_idx + ) { + H5_PRIV_FUNC_ENTER (h5_loc_idx_t + , "m=%p, elem_idx=%lld, face_idx=%lld", + m, (long long)elem_idx, (long long)face_idx); + h5_loc_idlist_t* te; + h5_loc_idx_t neighbor_idx = -2; + + do { + TRY( h5tpriv_find_te2 ( + m, + face_idx, + elem_idx, + &te) ); + if (te == NULL) { + H5_PRIV_FUNC_LEAVE (h5_error_internal ()); + } + if (te->num_items == 1) { + h5_loc_idx_t old_elem_idx = elem_idx; + // neighbor is coarser or face is on the boundary + elem_idx = ((h5_loc_tri_t*)m->loc_elems)[elem_idx].parent_idx; + if (elem_idx == -1) { + // we are on the level of the macro grid + neighbor_idx = -1; + } + if (elem_idx < -1) { // this should only happen if we are on the boarder + // of a loaded chunk and the parent is on a different chunk + if (h5_debug_level >= 6) { + h5_debug ("Elem %d is on different proc than its parent %d \n" + "therefore neighborhood idx is not correct resolved", old_elem_idx, elem_idx); + } + assert (m->f->myproc != find_proc_to_write (m, old_elem_idx)); + H5_PRIV_FUNC_LEAVE (~0); //TODO what is a resonable output here? + } + } else if (te->num_items == 2) { + // neighbor has same level of coarsness + if (h5tpriv_get_elem_idx(te->items[0]) == elem_idx) { + neighbor_idx = h5tpriv_get_elem_idx (te->items[1]); + } else { + neighbor_idx = h5tpriv_get_elem_idx (te->items[0]); + } + + } else { + printf ("elem %d face %d num_items %d", elem_idx, face_idx, te->num_items); + H5_PRIV_FUNC_LEAVE (h5_error_internal ()); + } + } while (neighbor_idx < -1); + H5_PRIV_FUNC_RETURN (neighbor_idx); +} + +/* + Compute neighbors for elements on given level. + */ +static inline h5_err_t +compute_neighbors_of_elems ( + h5t_mesh_t* const m, + h5_lvl_idx_t level + ) { + H5_PRIV_FUNC_ENTER (h5_err_t, "m=%p, level=%d", m, level); + if (level < 0 || level >= m->num_leaf_levels) { + H5_PRIV_FUNC_LEAVE ( + h5_error ( + H5_ERR_INVAL, + "level idx %lld out of bound, must be in [%lld,%lld]", + (long long)level, + (long long)0, + (long long)m->num_leaf_levels)); + } + h5_loc_idx_t elem_idx = level == 0 ? 0 : m->num_interior_elems[level-1]; + const h5_loc_idx_t last_idx = m->num_interior_elems[level] - 1; + h5_loc_tri_t *el = (h5_loc_tri_t*)m->loc_elems + elem_idx; + while (elem_idx <= last_idx) { + h5_loc_idx_t face_idx = 0; + for (; face_idx < 3; face_idx++) { + el->neighbor_indices[face_idx] = + compute_neighbor_of_face (m, elem_idx, face_idx); + } + elem_idx++; + el++; + } + + H5_PRIV_FUNC_RETURN (H5_SUCCESS); +} +/* + * returns number of newly created triangles when refining a triangle + */ +static int +get_num_new_triangles ( + void + ) { + return 4; +} +static h5_err_t +end_store_elems ( + h5t_mesh_t* const m + ) { + H5_PRIV_FUNC_ENTER (h5_err_t, "m=%p", m); + + h5_loc_idx_t start_idx = (m->leaf_level > 0) ? m->num_interior_elems[m->leaf_level-1] : 0; + h5_loc_idx_t count = m->num_interior_elems[m->leaf_level] - start_idx; + + TRY( h5tpriv_update_internal_structs (m, m->leaf_level) ); + TRY( compute_neighbors_of_elems (m, m->leaf_level) ); + TRY( h5tpriv_init_elem_flags (m, start_idx, count) ); + H5_PRIV_FUNC_RETURN (H5_SUCCESS); +} + +struct h5t_store_methods h5tpriv_trim_store_methods = { + alloc_loc_elems, + pre_refine_triangle, + refine_triangle, + get_num_new_triangles, + end_store_elems, +}; diff --git a/src/h5core/h5t_tags.c b/src/h5core/h5t_tags.c new file mode 100644 index 0000000..5a50501 --- /dev/null +++ b/src/h5core/h5t_tags.c @@ -0,0 +1,896 @@ +/* + Copyright (c) 2006-2012, The Regents of the University of California, + through Lawrence Berkeley National Laboratory (subject to receipt of any + required approvals from the U.S. Dept. of Energy) and the Paul Scherrer + Institut (Switzerland). All rights reserved. + + License: see file COPYING in top level of source distribution. +*/ + +#include "h5t_types_private.h" +#include "h5core/h5t_map.h" + +#include "h5core/h5.h" + +#include "h5_va_macros.h" + +#include "h5_attribs_private.h" +#include "h5_hdf5_private.h" + +#include "h5_model_private.h" +#include "h5t_access_private.h" +#include "h5t_map_private.h" +#include "h5t_model_private.h" +#include "h5t_tags_private.h" + +#include "h5_init_private.h" + +#include + +static h5_err_t +read_dataset ( + h5t_mesh_t* const m, + const h5_file_p f, + hid_t dset_id, + h5_dsinfo_t* dsinfo, + hid_t (*set_mspace)(h5t_mesh_t*,hid_t), + hid_t (*set_dspace)(h5t_mesh_t*,hid_t), + void* const data + ) { + H5_PRIV_API_ENTER (h5_err_t, + "f=%p, dset_id=%d (%s), dsinfo=%p, set_mspace=%p, " + "set_dspace=%p, data=%p", + f, dset_id, hdf5_get_objname(dset_id), + dsinfo, + set_mspace, set_dspace, data); + + hid_t mspace_id; + hid_t dspace_id; + + TRY (mspace_id = (*set_mspace)(m, dset_id)); + TRY (dspace_id = (*set_dspace)(m, dset_id)); +#ifdef PARALLEL_IO + TRY (h5priv_start_throttle (f)); +#endif + TRY (hdf5_read_dataset ( + dset_id, + dsinfo->type_id, + mspace_id, + dspace_id, + f->props->xfer_prop, + data)); +#ifdef PARALLEL_IO + TRY (h5priv_end_throttle (f)); +#endif + TRY (hdf5_close_dataspace (dspace_id)); + TRY (hdf5_close_dataspace (mspace_id)); + + H5_PRIV_API_RETURN (H5_SUCCESS); +} + +static hid_t +open_space_all ( + h5t_mesh_t* const m, + const hid_t dataset_id + ) { + UNUSED_ARGUMENT (m); + UNUSED_ARGUMENT (dataset_id); + return H5S_ALL; +} + +/*! + Get number of tagsets + */ +h5_ssize_t +h5t_get_num_mtagsets ( + h5t_mesh_t* const m + ) { + H5_CORE_API_ENTER (h5_ssize_t, "m=%p", m); + h5_ssize_t num_mtagsets = 0; + h5_err_t exists = 0; + TRY (exists = h5priv_link_exists (m->mesh_gid, "Tags")); + if (!exists) H5_CORE_API_LEAVE (0); + + hid_t loc_id; + TRY (loc_id = h5priv_open_group (0, m->mesh_gid, "Tags")); + TRY (num_mtagsets = hdf5_get_num_groups (loc_id)); + TRY (hdf5_close_group (loc_id)); + + H5_CORE_API_RETURN (num_mtagsets); + +} + +static h5_err_t +get_tagset_info ( + const hid_t loc_id, + const h5_size_t idx, + char name[], + const h5_size_t len_name, + h5_int64_t* const type + ) { + H5_PRIV_FUNC_ENTER (h5_err_t, + "loc_id=%d, idx=%llu, name=%p, len_name=%llu, type=%p", + loc_id, (long long unsigned)idx, name, + (long long unsigned)len_name, type); + + hid_t tags_id, tag_id, dset_id; + // open ctn with all tags + TRY (tags_id = hdf5_open_group (loc_id, "Tags")); + // get name of tag given by idx + TRY (hdf5_get_name_of_group_by_idx (tags_id, idx, name, len_name)); + // open this tag + TRY (tag_id = hdf5_open_group (tags_id, name)); + // determine type of dataset with values + TRY (dset_id = hdf5_open_dataset (tag_id, "values")); + hid_t type_; + TRY (type_ = hdf5_get_dataset_type (dset_id)); + TRY (*type = h5priv_normalize_h5_type (type_)); + + TRY (hdf5_close_dataset (dset_id)); + TRY (hdf5_close_group (tag_id)); + TRY (hdf5_close_group (tags_id)); + H5_PRIV_FUNC_RETURN (H5_SUCCESS); +} + +/*! + Get information about tagset given by index: + name + type + */ +h5_err_t +h5t_get_mtagset_info ( + h5t_mesh_t* const m, + const h5_size_t idx, + char name[], + const h5_size_t len_name, + h5_int64_t* const type + ) { + H5_CORE_API_ENTER (h5_err_t, + "m=%p, idx=%llu, name=%p, len_name=%llu, type=%p", + m, (long long unsigned)idx, name, + (long long unsigned)len_name, type); + + + H5_CORE_API_RETURN (get_tagset_info(m->mesh_gid, idx, name, len_name, type)); +} + +/*! + Check whether taget exists. + */ +h5_err_t +h5t_mtagset_exists ( + h5t_mesh_t* const m, + const char name[] + ) { + H5_CORE_API_ENTER (h5_err_t, "m=%p, name=%s", m, name); + H5_CORE_API_RETURN (h5priv_link_exists (m->mesh_gid, "Tags", name)); +} + +static h5_err_t +new_tagset ( + h5t_mesh_t* const m, + hid_t parent_gid, + const char name[], + h5_id_t type, + h5t_tagset_t** rtagset + ) { + H5_PRIV_FUNC_ENTER (h5_err_t, + "m=%p, name='%s', type=%llu, rtagset=%p", + m, name, (long long unsigned)type, rtagset); + + h5t_tagset_t* tagset = NULL; + size_t size = (m->num_interior_elems[m->num_leaf_levels-1] - 1) * sizeof(*tagset->elems) + + sizeof(*tagset); + TRY (tagset = h5_calloc (1, size)); + + TRY (tagset->name = h5_strdup (name)); + tagset->m = m; + tagset->parent_gid = parent_gid; + tagset->type = type; + tagset->num_interior_elems = m->num_interior_elems[m->num_leaf_levels-1]; + tagset->scope.min_level = 32767; + tagset->scope.max_level = -1; + TRY (h5priv_search_strlist (&m->mtagsets, name)); + + *rtagset = tagset; + H5_PRIV_FUNC_RETURN (H5_SUCCESS); +} + +/*! + Create a new tagset + */ +h5_err_t +h5t_create_mtagset ( + h5t_mesh_t* const m, + const char name[], + const h5_id_t type, + h5t_tagset_t** set + ) { + H5_CORE_API_ENTER (h5_err_t, + "m=%p, name='%s', type=%llu, set=%p", + m, name, (long long unsigned)type, set); + // validate name + if (name == NULL || name[0] == '\0') { + H5_PRIV_FUNC_LEAVE ( + h5_error (H5_ERR_INVAL, "Invalid name" )); + } + + // validate type + if (type != H5_INT64_T && type != H5_FLOAT64_T) { + H5_PRIV_FUNC_LEAVE ( + h5_error (H5_ERR_INVAL, "Unsupported data type." )); + } + + // check if a tagset with given name already exists + h5_err_t exists; + TRY (exists = h5priv_link_exists (m->mesh_gid, "Tags", name)); + if (exists || h5priv_find_strlist (m->mtagsets, name) >= 0) + H5_CORE_API_LEAVE ( + h5_error ( + H5_ERR_H5FED, + "Cannot create tagset '%s': Tagset exists", name)); + + + H5_CORE_API_RETURN (new_tagset (m, m->mesh_gid, name, type, set)); +} + +static int +find_face_id ( + h5t_tageleminfo_t* eleminfo, + h5_loc_idx_t face_id + ) { + if (eleminfo->num_tags == 0) return -1; + h5t_taginfo_t* taginfo = eleminfo->ti; + register int low = 0; + register int high = eleminfo->num_tags-1; + while (low <= high) { + register int mid = (low + high) / 2; + register int diff = taginfo[mid].face_id - face_id; + if (diff > 0) + high = mid -1; + else if (diff < 0) + low = mid + 1; + else + return mid; + } + return -(low+1); +} + + +static h5_err_t +remove_tag ( + h5t_tagset_t* tagset, + const h5_loc_idx_t face_id, + const h5_loc_idx_t elem_idx + ) { + H5_PRIV_FUNC_ENTER (h5_err_t, + "tagset=%p, face_id=%lld, elem_idx=%lld", + tagset, (long long)face_id, (long long)elem_idx); + if (tagset->elems[elem_idx] == NULL) { + H5_PRIV_FUNC_LEAVE ( + h5_warn ( + "Tag %s not set for face %llx of element %lld", + tagset->name, + (long long)face_id, + (long long)elem_idx)); + } + h5t_tageleminfo_t* eleminfo = tagset->elems[elem_idx]; + + // remove values + int idx = find_face_id (eleminfo, face_id); + if (idx < 0) { + H5_PRIV_FUNC_LEAVE ( + h5_warn ( + "Tag %s not set for face %llx of element %lld", + tagset->name, + (long long)face_id, + (long long)elem_idx)); + } + h5t_taginfo_t* ti = &eleminfo->ti[idx]; + + tagset->num_values -= ti->val_dim; + memmove (tagset->values + ti->val_idx, + tagset->values + ti->val_idx + ti->val_dim, + (tagset->num_values - idx) * sizeof (tagset->values[0])); + + // remove tag info for this entity + memmove (ti, + ti + 1, + (eleminfo->num_tags-idx-1)*sizeof (ti[0]) ); + + // we don't resize the eleminfo structure!!! + H5_PRIV_FUNC_RETURN (H5_SUCCESS); +} + +static h5_err_t +add_tag ( + h5t_tagset_t *tagset, + const int idx, + const h5_loc_idx_t face_id, + const h5_loc_idx_t elem_idx, + const size_t dim, + void* val + ) { + H5_PRIV_FUNC_ENTER (h5_err_t, + "tagset=%p, idx=%d, face_id=%lld, elem_idx=%lld, dim=%zu, val=%p", + tagset, idx, (long long)face_id, (long long)elem_idx, dim, val); + // insert new taginfo + h5t_tageleminfo_t* eleminfo = tagset->elems[elem_idx]; + TRY (eleminfo = tagset->elems[elem_idx] = h5_alloc ( + tagset->elems[elem_idx], + sizeof (*eleminfo) + + eleminfo->num_tags * sizeof (eleminfo->ti[0]))); + h5t_taginfo_t* ti = &eleminfo->ti[idx]; + memmove (ti + 1, + ti, + (eleminfo->num_tags - idx) * sizeof(*ti)); + eleminfo->num_tags++; + ti->face_id = (short)face_id; + ti->val_dim = dim; + + // append values + TRY (tagset->values = h5_alloc ( + tagset->values, + (tagset->num_values+dim) * sizeof (*tagset->values))); + memcpy (tagset->values + tagset->num_values, + val, + dim*sizeof (*tagset->values)); + ti->val_idx = tagset->num_values; + tagset->num_values += dim; + H5_PRIV_FUNC_RETURN (H5_SUCCESS); +} + +static inline h5_err_t +overwrite_tag ( + h5t_tagset_t* tagset, + const int idx, + const h5_loc_idx_t elem_idx, + void* val + ) { + h5t_tageleminfo_t* eleminfo = tagset->elems[elem_idx]; + h5t_taginfo_t* ti = &eleminfo->ti[idx]; + + memcpy (tagset->values + ti->val_idx, + val, + ti->val_dim * sizeof (*ti) ); + return H5_SUCCESS; +} + +/*! + Set tag for entity in current mesh. + */ +static h5_err_t +set_tag ( + h5t_tagset_t* tagset, + const h5_loc_idx_t face_id, + const h5_loc_idx_t elem_idx, + const size_t dim, + void* val + ) { + H5_PRIV_FUNC_ENTER (h5_err_t, + "tagset=%p, face_id=%lld, elem_idx=%lld, dim=%zu, val=%p", + tagset, (long long)face_id, (long long)elem_idx, dim, val); + if (tagset->elems[elem_idx] == NULL) { + TRY (tagset->elems[elem_idx] = h5_calloc ( + 1, sizeof (*tagset->elems))); + } + h5t_tageleminfo_t* eleminfo = tagset->elems[elem_idx]; + int i = find_face_id (eleminfo, face_id); + h5t_taginfo_t* ti = eleminfo->ti + i; + if (i >= 0 && dim != ti->val_dim) { + /* + Overwrite existing value with new dimension. + This is a very unusual case. + */ + TRY (remove_tag (tagset, face_id, elem_idx)); + TRY (add_tag (tagset, i, face_id, elem_idx, dim, val)); + } else if (i >= 0 && dim == ti->val_dim) { + TRY (overwrite_tag (tagset, i, elem_idx, val)); + } else { // i < 0 + TRY (add_tag (tagset, -i-1, face_id, elem_idx, dim, val)); + tagset->num_entities++; + } + if (tagset->m->leaf_level < tagset->scope.min_level) { + tagset->scope.min_level = tagset->m->leaf_level; + } + if (tagset->m->leaf_level > tagset->scope.max_level) { + tagset->scope.max_level = tagset->m->leaf_level; + } + H5_PRIV_FUNC_RETURN (H5_SUCCESS); +} + + +static h5_err_t +read_tagset ( + h5t_tagset_t* const tagset + ) { + H5_PRIV_FUNC_ENTER (h5_err_t, "tagset=%p", tagset); + hid_t loc_id = 0; + + // open HDF5 group + + TRY (loc_id = h5priv_open_group (0, tagset->parent_gid, "Tags", tagset->name)); + + // read datasets: + + // "elems" + h5t_glb_tag_idx_t* elems; + size_t num_interior_elems = 0; + + hid_t dset_id; + TRY (dset_id = hdf5_open_dataset (loc_id, "elems")); + TRY (num_interior_elems = hdf5_get_npoints_of_dataset (dset_id)); + TRY (elems = h5_calloc (num_interior_elems, sizeof(*elems))); + h5_dsinfo_t dsinfo; + memset (&dsinfo, 0, sizeof (dsinfo)); + dsinfo.type_id = h5_dta_types.h5t_glb_tag_idx_t; + TRY (h5priv_read_dataset ( + tagset->m->f, + dset_id, + &dsinfo, + open_space_all, + open_space_all, + elems)); + TRY (hdf5_close_dataset (dset_id)); + num_interior_elems--; + + // "entities" + h5t_glb_tag_idx_t* entities; + size_t ent_idx = 0; + size_t num_entities = 0; + TRY (dset_id = hdf5_open_dataset (loc_id, "entities")); + TRY (num_entities = hdf5_get_npoints_of_dataset (dset_id)); + TRY (entities = h5_calloc (num_entities, sizeof(*entities))); + TRY (read_dataset ( + tagset->m, + tagset->m->f, + dset_id, + &dsinfo, + open_space_all, open_space_all, + entities)); + TRY (hdf5_close_dataset (dset_id)); + num_entities--; + + // "values" + h5_int64_t* vals; + size_t num_vals = 0; + TRY (dset_id = hdf5_open_dataset (loc_id, "values")); + TRY (num_vals = hdf5_get_npoints_of_dataset (dset_id)); + TRY (vals = h5_calloc (num_vals, sizeof (*vals))); + TRY (dsinfo.type_id = hdf5_get_dataset_type (dset_id)); + TRY (read_dataset ( + tagset->m, + tagset->m->f, + dset_id, + &dsinfo, + open_space_all, open_space_all, + vals)); + TRY (hdf5_close_dataset (dset_id )); + tagset->type = h5priv_normalize_h5_type (dsinfo.type_id); + + /* + add tagset and set values + */ + + h5_int64_t scope; + TRY (h5priv_read_attrib (loc_id, "__scope_min__", H5_INT64_T, &scope)); + tagset->scope.min_level = scope; + TRY (h5priv_read_attrib (loc_id, "__scope_max__", H5_INT64_T, &scope)); + tagset->scope.max_level = scope; + + for (ent_idx = 0; ent_idx < num_entities; ent_idx++) { + h5t_glb_tag_idx_t *entity = &entities[ent_idx]; + size_t dim = (entity+1)->idx - entity->idx; + // map global face id and global element idx to local + h5_loc_idx_t face_id; + h5_loc_idx_t elem_idx; + h5_glb_idx_t glb_elem_idx = h5tpriv_get_elem_idx (entity->eid); + elem_idx = h5t_map_glb_elem_idx2loc (tagset->m, glb_elem_idx); + assert (elem_idx >= 0); + face_id = h5tpriv_get_face_id (entity->eid); + TRY (set_tag ( + tagset, + face_id, + elem_idx, + dim, + &vals[entity->idx])); + } + TRY (h5_free (elems)); + TRY (h5_free (entities)); + TRY (h5_free (vals)); + H5_PRIV_FUNC_RETURN (H5_SUCCESS); +} + +/*! + Open existing tagset given by \c name. + */ +h5_err_t +h5t_open_mtagset ( + h5t_mesh_t* const m, + const char name[], + h5t_tagset_t** set + ) { + H5_CORE_API_ENTER (h5_err_t, + "m=%p, name='%s', set=%p", + m, name, set); + // validate name + if (name == NULL || name[0] == '\0') { + H5_PRIV_FUNC_LEAVE ( + h5_error (H5_ERR_INVAL, "Invalid name" )); + } + + // check if a tagset with given name exists + h5_err_t exists; + TRY (exists = h5priv_link_exists (m->mesh_gid, "Tags", name)); + if (!exists) H5_CORE_API_LEAVE ( + h5_error ( + H5_ERR_INVAL, + "Cannot open tagset '%s': No such tagset ", name)); + + // check if tagset has already been opened + if (h5priv_find_strlist (m->mtagsets, name) >= 0) H5_CORE_API_LEAVE ( + h5_error ( + H5_ERR_INVAL, + "Cannot open tagset '%s': Already open ", name)); + + + TRY (new_tagset (m, m->mesh_gid, name, -1, set)); + TRY (read_tagset (*set)); + H5_CORE_API_RETURN (H5_SUCCESS); +} + +/* + Write tagset to disk. + */ +static h5_err_t +write_tagset ( + h5t_tagset_t* tagset + ) { + H5_PRIV_FUNC_ENTER (h5_err_t, "tagset=%p", tagset); + h5t_tageleminfo_t** eleminfos = tagset->elems; + hid_t group_id; + h5t_glb_tag_idx_t* elems = NULL; // in memory dataset + h5t_glb_tag_idx_t* elem = NULL; // reference an element in elems + h5_loc_idx_t num_interior_elems = 0; + h5t_glb_tag_idx_t* entities = NULL; // in memory dataset + h5t_glb_tag_idx_t* entity = NULL; // reference an element in entities + h5t_tagval_t* values = NULL; // in memory dataset + + h5_loc_idx_t elem_idx = 0; + h5_loc_idx_t entity_idx = 0; + h5_loc_idx_t val_idx = 0; + + h5t_mesh_t* m = tagset->m; + if (m->num_leaf_levels <= 0) { + H5_PRIV_FUNC_LEAVE (H5_SUCCESS); // nothing to do + } + num_interior_elems = m->num_interior_elems[m->num_leaf_levels-1]; + if (num_interior_elems == 0 || tagset->num_entities == 0) { + H5_PRIV_FUNC_LEAVE (H5_SUCCESS); // nothing to do + } + // allocate memory per element (plus 1) + TRY (elems = h5_calloc (num_interior_elems+1, sizeof(*elems))); + elem = elems; + + // allocate memory per entity (plus 1) + TRY (entities = h5_calloc (tagset->num_entities+1, sizeof(*entities)) ); + entity = entities; + + // allocate memory for all values + TRY (values = h5_calloc (tagset->num_values, sizeof(*values)) ); + + // build data structures in memory + while (elem < elems+num_interior_elems) { + elem->eid = elem_idx; + elem->idx = entity_idx; + h5t_tageleminfo_t* eleminfo = *eleminfos; + + // loop over all tagged faces of this element + int ti_idx; + for (ti_idx = 0; eleminfo && ti_idx < eleminfo->num_tags; ti_idx++) { + h5t_taginfo_t* ti = eleminfo->ti+ti_idx; + h5_glb_idx_t glb_elem_idx = h5tpriv_get_loc_elem_glb_idx ( + m, elem_idx); + entity->eid = h5tpriv_build_entity_id ( + 0, (h5_glb_id_t)ti->face_id, glb_elem_idx); + entity->idx = val_idx; + + // copy values + memcpy (values + val_idx, + &tagset->values[ti->val_idx], + ti->val_dim * sizeof (*values)); + val_idx += ti->val_dim; + entity_idx++; + entity++; + } + elem_idx++; + eleminfos++; + elem++; + } + elem->eid = -1; // last entry + tagset->num_entities = elem->idx = entity_idx; + entity->eid = -1; + tagset->num_values = entity->idx = val_idx; + + // write data + TRY (group_id = h5priv_open_group ( + 1, + tagset->parent_gid, + "Tags", + tagset->name)); + h5_dsinfo_t dsinfo; + memset (&dsinfo, 0, sizeof(dsinfo)); + dsinfo.rank = 1; + dsinfo.max_dims[0] = H5S_UNLIMITED; + dsinfo.chunk_dims[0] = 4096; + dsinfo.access_prop = H5P_DEFAULT; + + strcpy (dsinfo.name, "elems"); + dsinfo.dims[0] = num_interior_elems + 1; + dsinfo.type_id = h5_dta_types.h5t_glb_tag_idx_t; + TRY (dsinfo.create_prop = hdf5_create_property (H5P_DATASET_CREATE)); + TRY (hdf5_set_chunk_property (dsinfo.create_prop, dsinfo.rank, + dsinfo.chunk_dims)); + + TRY (h5priv_write_dataset_by_name ( + m, + m->f, + group_id, + &dsinfo, + open_space_all, open_space_all, + elems)); + + strcpy (dsinfo.name, "entities"); + dsinfo.dims[0] = tagset->num_entities + 1; + + TRY (h5priv_write_dataset_by_name ( + m, + m->f, + group_id, + &dsinfo, + open_space_all, open_space_all, + entities)); + + strcpy (dsinfo.name, "values"); + dsinfo.dims[0] = tagset->num_values; + dsinfo.type_id = h5_dta_types.h5_int64_t; + + TRY (h5priv_write_dataset_by_name ( + m, + m->f, + group_id, + &dsinfo, + open_space_all, open_space_all, + values)); + h5_int64_t scope = tagset->scope.min_level; + TRY (h5priv_write_attrib (group_id, "__scope_min__", H5_INT64_T, &scope, 1, 1)); + scope = tagset->scope.max_level; + TRY (h5priv_write_attrib (group_id, "__scope_max__", H5_INT64_T, &scope, 1, 1)); + + TRY (hdf5_close_group (group_id)); + TRY (h5_free (elems)); + TRY (h5_free (entities)); + TRY (h5_free (values)); + H5_PRIV_FUNC_RETURN (H5_SUCCESS); +} + + +/* + Release a tag-set + */ +static inline h5_err_t +release_mtagset ( + h5t_tagset_t* tagset + ) { + H5_PRIV_FUNC_ENTER (h5_err_t, "tagset=%p", tagset); + unsigned int i; + // release per element structures + for (i = 0; i < tagset->num_interior_elems; i++) { + if (tagset->elems[i] != NULL) { + TRY (h5_free (tagset->elems[i])); + } + } + // remove from book-keeping list in mesh + TRY (h5priv_remove_strlist(tagset->m->mtagsets, tagset->name)); + + // release other memory + TRY (h5_free (tagset->name)); + TRY (h5_free (tagset->values)); + TRY (h5_free (tagset)); + + H5_PRIV_FUNC_RETURN (H5_SUCCESS); +} + +/*! + Close tagset. + + Write data to disk, if something as been changed, and release memory. + */ +h5_err_t +h5t_close_mtagset ( + h5t_tagset_t* tagset + ) { + H5_CORE_API_ENTER (h5_err_t, "tagset=%p", tagset); + if (tagset->changed) { + TRY (write_tagset (tagset)); + } + TRY (release_mtagset (tagset)); + H5_CORE_API_RETURN (H5_SUCCESS); +} + +/*! + Delete tagset on disk. + + Note: + There may be a copy in memory! This copy is still accessable, even + changes are possible. Since data are written on close, the tagset will + be created again. + We should implement something to avoid this! We have a similiar problem, + if the user opens the dataset more than once. + */ + +/*! + Remove a tagset from the current mesh. + + \param[in] f file handle + \param[in] name name of tagset to remove + + \return H5_SUCCESS or error code + */ +static h5_err_t +remove_tagset ( + const hid_t tagsets_id, + const char name[] + ) { + H5_PRIV_FUNC_ENTER (h5_err_t, "tagsets_id=%d, name=%s", tagsets_id, name); + hid_t loc_id; + TRY (loc_id = hdf5_open_group (tagsets_id, name)); + TRY (hdf5_delete_link (loc_id, "elems", H5P_DEFAULT)); + TRY (hdf5_delete_link (loc_id, "entities", H5P_DEFAULT)); + TRY (hdf5_delete_link (loc_id, "values", H5P_DEFAULT)); + TRY (hdf5_close_group (loc_id)); + TRY (hdf5_delete_link (tagsets_id, name, H5P_DEFAULT)); + H5_PRIV_FUNC_RETURN (H5_SUCCESS); +} + +/*! + Remove a tagset from the current mesh. + + \param[in] f file handle + \param[in] name name of tagset to remove + + \return H5_SUCCESS or error code + */ +h5_err_t +h5t_remove_mtagset ( + h5t_mesh_t* const m, + const char name[] + ) { + H5_CORE_API_ENTER (h5_err_t, "m=%p, name='%s'", m, name); + + // check if tagset has a copy in memory + if (h5priv_find_strlist (m->mtagsets, name) >= 0) H5_CORE_API_LEAVE ( + h5_error ( + H5_ERR_INVAL, + "Cannot remove tagset '%s': Still open ", name)); + + hid_t loc_id; + TRY (loc_id = hdf5_open_group (m->mesh_gid, "Tags")); + TRY (remove_tagset (loc_id, name)); + TRY (hdf5_close_group (loc_id)); + H5_CORE_API_RETURN (H5_SUCCESS); +} + +/*! + Set tag. + */ +h5_err_t +h5t_set_tag ( + h5t_tagset_t* const tagset, + const h5_loc_id_t entity_id, + const h5_size_t size, + void* val + ) { + H5_CORE_API_ENTER (h5_err_t, + "tagset=%p, entity_id=%lld, size=%llu, val=%p", + tagset, + (long long)entity_id, + (long long unsigned)size, + val); + h5_loc_idx_t face_id = h5tpriv_get_face_id (entity_id); + h5_loc_idx_t elem_idx = h5tpriv_get_elem_idx (entity_id); + TRY (set_tag (tagset, face_id, elem_idx, size, val)); + tagset->changed = 1; + H5_CORE_API_RETURN (H5_SUCCESS); +} + +static inline h5_err_t +get_idx_of_tagval ( + const h5t_tagset_t* tagset, + const h5_loc_id_t entity_id, + int* taginfo_idx, + h5_loc_idx_t* val_idx + ) { + h5_loc_idx_t face_id = h5tpriv_get_face_id (entity_id); + h5_loc_idx_t elem_idx = h5tpriv_get_elem_idx (entity_id); + h5t_tageleminfo_t* eleminfo = tagset->elems[elem_idx]; + if (eleminfo == NULL) { + return H5_NOK; // not tagged + } + *taginfo_idx = find_face_id (eleminfo, face_id); + if (*taginfo_idx < 0) { + return H5_NOK; // not tagged + } + *val_idx = eleminfo->ti[*taginfo_idx].val_idx; + return H5_SUCCESS; +} + +/*! + Get tag for entity in given tagset. Untagged entities inherit tags from + their closest parent. + + \param[in] tagset tagset + \param[in] entity_id id of entity + \param[out] size size of value + \param[out] vals tag value + + \return H5_SUCCESS or error code + */ +h5_loc_id_t +h5t_get_tag ( + const h5t_tagset_t* tagset, + const h5_loc_id_t entity_id, + h5_size_t* const dim, + void* const values + ) { + H5_CORE_API_ENTER (h5_err_t, + "tagset=%p, entity_id=%lld, dim=%p, values=%p", + tagset, + (long long)entity_id, + dim, + values); + if (tagset->m->leaf_level < tagset->scope.min_level) { + H5_CORE_API_LEAVE (H5_NOK); // entity not tagged + } + h5_loc_id_t id = entity_id; + h5_err_t h5err; + int ti_idx = 0; + h5_loc_idx_t val_idx = 0; + // query entity while not tagged and parent exists + while ((h5err = get_idx_of_tagval (tagset, id, &ti_idx, &val_idx)) < 0 && + (id = h5tpriv_get_loc_entity_parent (tagset->m, id)) >= 0) ; + + if (h5err < 0) + H5_CORE_API_LEAVE (H5_NOK); // entity not tagged + + h5_loc_idx_t elem_idx = h5tpriv_get_elem_idx (id); + h5t_taginfo_t* ti = &tagset->elems[elem_idx]->ti[ti_idx]; + h5t_tagval_t* v = tagset->values; + if (*dim > ti->val_dim || values == NULL) { + *dim = ti->val_dim; + } + if (values != NULL) { + memcpy (values, v + val_idx, *dim*sizeof(*v) ); + } + H5_CORE_API_RETURN (id); +} + +/*! + Remove tag from entity + + \param[in] tagset pointer to tagset + \param[in] entity_id local entity id + */ +h5_err_t +h5t_remove_tag ( + h5t_tagset_t* tagset, + const h5_loc_id_t entity_id + ) { + H5_CORE_API_ENTER (h5_err_t, + "tagset=%p, entity_id=%lld", + tagset, (long long)entity_id); + h5_loc_idx_t face_id = h5tpriv_get_face_id (entity_id); + h5_loc_idx_t elem_idx = h5tpriv_get_elem_idx (entity_id); + H5_CORE_API_RETURN (remove_tag (tagset, face_id, elem_idx)); +} + diff --git a/src/h5core/h5t_tags_private.h b/src/h5core/h5t_tags_private.h new file mode 100644 index 0000000..9eb0ead --- /dev/null +++ b/src/h5core/h5t_tags_private.h @@ -0,0 +1,102 @@ +/* + Copyright (c) 2006-2013, The Regents of the University of California, + through Lawrence Berkeley National Laboratory (subject to receipt of any + required approvals from the U.S. Dept. of Energy) and the Paul Scherrer + Institut (Switzerland). All rights reserved. + + License: see file COPYING in top level of source distribution. +*/ + +#ifndef __H5T_TAGS_PRIVATE_H +#define __H5T_TAGS_PRIVATE_H + +#include + +#include "h5core/h5_types.h" +#include "h5core/h5t_tags.h" + +/* + * Tags can be assigned to all entities of a mesh + * Tag values are arrays of int64 or float64 + * Complex numbers can be stored as array of float64 with even dimension + * Tags are addressed via a name and the entity id. + * Tags with the same name are called a "tagset" + * Tagsets can be used to store time/step-constant data. These tagsets are + called "m-tagsets" and are assigned directly to a mesh. + * Tagsets can be used to store data which may change from step to step. + These tagsets are called "s-tagsets" and are assigned to a mesh and a + (time-)step. + + ToDo + * Scalar values + */ + + +/* + Tags are addressed via name and entity id. We access a tag very indirect: + First we lookup for the name of the tagset in a hash table. The value of the + hash entry gives us information about the data type stored in this tagset, + whether this tagset has been changed or not and a pointer to another data + structure. This data structure keeps information about tags within the given + tagset per element. + */ + + +/* + All tags of an element are stored in an array of the below defined + structure + */ +typedef struct { + union { + h5_float64_t f; + h5_int64_t i; + } item; +} h5t_tagval_t; + + +/* + + */ +typedef struct { + int16_t face_id; // face id: type and face index + uint16_t val_dim; // dim of value for this entity + uint32_t val_idx; // index of first value +} h5t_taginfo_t; + +typedef struct { + int32_t num_tags; + h5t_taginfo_t ti[1]; +} h5t_tageleminfo_t; + +struct h5t_tagset { + char* name; // name of tagset + hid_t parent_gid; + h5t_mesh_t* m; + + unsigned int changed; // flag tagset changed, ... + struct { + h5_lvl_idx_t min_level; + h5_lvl_idx_t max_level; + } scope; + h5_id_t type; // int64 or float64 + h5_loc_idx_t num_entities; // number of tagged entities + h5_loc_idx_t num_values; // number of values + h5_loc_idx_t num_interior_elems; // number of elements in tagset + h5t_tagval_t* values; // ptr to array of tag values + h5t_tageleminfo_t* elems[1]; // per element structure +}; + +typedef struct { + h5_glb_id_t eid; // global entity id + h5_glb_idx_t idx; // global index +} h5t_glb_tag_idx_t; + +typedef struct { + h5_loc_id_t eid; // local entity id + h5_loc_idx_t idx; // local index +} h5t_loc_tag_idx_t; + + +h5_err_t h5tpriv_write_mtags (h5t_mesh_t* const); +h5_err_t h5tpriv_read_tag_container ( h5t_mesh_t* const, h5t_tagcontainer_t*); +#endif diff --git a/src/h5core/h5t_types_private.h b/src/h5core/h5t_types_private.h new file mode 100644 index 0000000..f760fc5 --- /dev/null +++ b/src/h5core/h5t_types_private.h @@ -0,0 +1,330 @@ +/* + Copyright (c) 2006-2013, The Regents of the University of California, + through Lawrence Berkeley National Laboratory (subject to receipt of any + required approvals from the U.S. Dept. of Energy) and the Paul Scherrer + Institut (Switzerland). All rights reserved. + + License: see file COPYING in top level of source distribution. +*/ + +#ifndef __H5T_TYPES_PRIVATE_H +#define __H5T_TYPES_PRIVATE_H + +#include "h5core/h5_types.h" +#include "h5_types_private.h" +#include "h5_hsearch_private.h" +#include "h5_maps_private.h" + +#include "h5t_ref_elements_private.h" + +#include "h5_readwrite_private.h" +#include "h5t_octree_private.h" + + +typedef struct h5_glb_vertex { + h5_glb_idx_t idx; + h5_coord3d_t P; +} h5_glb_vertex_t; + +typedef struct h5_glb_vertex h5_loc_vertex_t; + + +typedef struct h5_glb_elem { + h5_glb_idx_t idx; + h5_glb_idx_t parent_idx; + h5_glb_idx_t child_idx; + h5_lvl_idx_t level_idx; + h5_lvl_idx_t refinement; + h5_uint32_t flags; + h5_glb_idx_t indices[1]; +} h5_glb_elem_t; +typedef h5_glb_elem_t* h5_glb_elem_p; + + +typedef struct h5_glb_tri { + h5_glb_idx_t idx; + h5_glb_idx_t parent_idx; + h5_glb_idx_t child_idx; + h5_lvl_idx_t level_idx; + h5_lvl_idx_t refinement; + h5_uint32_t flags; + h5_glb_idx_t vertex_indices[3]; + h5_glb_idx_t neighbor_indices[3]; +} h5_glb_tri_t; + +typedef h5_glb_tri_t h5_glb_triangle_t; + +typedef struct h5_glb_tet { + h5_glb_idx_t idx; + h5_glb_idx_t parent_idx; + h5_glb_idx_t child_idx; + h5_lvl_idx_t level_idx; + h5_lvl_idx_t refinement; + h5_uint32_t flags; + h5_glb_idx_t vertex_indices[4]; + h5_glb_idx_t neighbor_indices[4]; +} h5_glb_tet_t; +typedef h5_glb_tet_t h5_glb_tetrahedron_t; + + +typedef struct h5_loc_tri { + h5_glb_idx_t glb_idx; // global index of element + h5_loc_idx_t parent_idx; // index of parent element + h5_loc_idx_t child_idx; // index of (first) children + h5_lvl_idx_t level_idx; // leaf level on which this element has been created + h5_lvl_idx_t refinement; // number of refinements of father in macro-grid + h5_uint32_t flags; + h5_int32_t my_proc; + h5_int32_t neighbor_proc; + h5_loc_idx_t vertex_indices[3]; + h5_loc_idx_t neighbor_indices[3]; +} h5_loc_tri_t; + +typedef struct h5_loc_tet { + h5_glb_idx_t glb_idx; + h5_loc_idx_t parent_idx; + h5_loc_idx_t child_idx; + h5_lvl_idx_t level_idx; + h5_lvl_idx_t refinement; + h5_uint32_t flags; + h5_int32_t my_proc; + h5_int32_t neighbor_proc; + h5_loc_idx_t vertex_indices[4]; + h5_loc_idx_t neighbor_indices[4]; +} h5_loc_tet_t; + + +// generic data type for local elements +typedef struct h5_loc_elem { + h5_glb_idx_t glb_idx; + h5_loc_idx_t parent_idx; + h5_loc_idx_t child_idx; + h5_lvl_idx_t level_idx; + h5_lvl_idx_t refinement; + h5_uint32_t flags; + h5_int32_t my_proc; + h5_int32_t neighbor_proc; + h5_loc_idx_t indices[1]; +} h5_loc_elem_t; + +/*** type ids' for compound types ***/ +typedef struct h5_dta_types { + hid_t h5_glb_idx_t; /* ID's */ + hid_t h5_int64_t; /* 64 bit signed integer */ + hid_t h5_float64_t; /* 64 bit floating point */ + hid_t h5_coord3d_t; /* 3-tuple of 64-bit float */ + hid_t h5_coord6d_t; /* 6-tuple of 64-bit float */ + hid_t h5_3glb_idx_t; /* 3-tuple of indices */ + hid_t h5_4glb_idx_t; /* 4-tuple of indices */ + hid_t h5_4chk_idx_t; + hid_t h5_vertex_t; /* vertex structure */ + hid_t h5_triangle_t; /* triangle structure */ + hid_t h5_tet_t; /* tetrahedron structure */ + hid_t h5_chunk_t; // chunk structure + hid_t h5_octree_t; // octree structure + hid_t h5_userdata_t; // userdata structure + hid_t h5t_glb_tag_idx_t; + hid_t h5_int32_t; + MPI_Datatype mpi_glb_triangle; + MPI_Datatype mpi_glb_tet; + MPI_Datatype mpi_glb_vtx; + MPI_Datatype mpi_chunk; + MPI_Datatype mpi_edge_list_elem; +} h5_dta_types_t; + +typedef struct h5t_adjacencies { + struct { + // h5_size_t size; + h5_loc_idlist_t** v; + } tv; + h5_hashtable_t te_hash; + h5_hashtable_t td_hash; +} h5t_adjacencies_t; + +#define OCT_USERDATA_SIZE 4 + +typedef struct h5t_oct_userdata { + h5_chk_idx_t idx[OCT_USERDATA_SIZE]; +} h5t_oct_userdata_t; + +typedef struct h5t_chunk { + h5_chk_idx_t idx; + h5_oct_idx_t oct_idx; + h5_glb_idx_t elem; + h5_chk_weight_t weight; + h5_chk_size_t num_elems; +// h5_glb_idx_t vtx; +// h5_glb_idx_t num_vtx; +// h5_chk_size_t* elems_subchk; +} h5t_chunk_t; + +typedef struct h5t_chunks { + h5_chk_idx_t curr_idx; + h5_chk_idx_t num_alloc; + h5_chk_size_t num_levels; + h5_chk_idx_t* num_chunks_p_level; + h5t_chunk_t* chunks; +} h5t_chunks_t; + +typedef struct h5t_edge_list_elem { + h5_glb_idx_t vtx1; + h5_glb_idx_t vtx2; + h5_glb_idx_t new_vtx; + h5_int32_t proc; +} h5t_edge_list_elem_t; + +typedef struct h5t_edge_list_t { + h5_int32_t num_items; + h5t_edge_list_elem_t* items; + h5_int32_t num_alloc; +} h5_edge_list_t; + +typedef struct h5t_vtx_chk_list { + h5_loc_idx_t vtx; + h5_chk_idx_t chk; +} h5t_vtx_chk_list_t; + +#define NUM_TIMING 27 + +typedef struct h5t_timing { + int num_timing; + int next_time; + h5_time_t measure[NUM_TIMING]; + char* f; +// h5_time_t t1; // after init mesh +// h5_time_t t2; // after reading octree +// h5_time_t t3; // after reading chunks +// h5_time_t t4; // after reading weights +// h5_time_t t5; // after distributing chunks +// h5_time_t t6; // after reading elems +// h5_time_t t7; // after reading vertices +// h5_time_t t8; // after internal updates +// h5_time_t t9; // begin end refinement +// h5_time_t t10; // after pre ref +// h5_time_t t11; // after refine +// h5_time_t t12; // after boundary edges exchange +// h5_time_t t13; // after weights exchange +// h5_time_t t14; // after init glb elems struct +// h5_time_t t15; // after init glb vertices struct +// h5_time_t t16; // after exchange glb_struct +// h5_time_t t17; // after store glb elems struct +// h5_time_t t18; // after post_refine +// h5_time_t t19; // before close +// h5_time_t t20; // after write weights +// h5_time_t t21; // after write chunks +// h5_time_t t22; // after write octree +// h5_time_t t23; // after calc vtx map +// h5_time_t t24; // after vtx hyperslap select +// h5_time_t t25; // after write vertices +// h5_time_t t26; // after write elems + +} h5t_timing_t; + +typedef struct h5t_oct_count { + h5_oct_idx_t oct; + h5_int32_t count; +} h5t_oct_count_t; + +typedef struct h5t_oct_count_list { + h5_int32_t num_items; + h5_int32_t size; + h5t_oct_count_t* items; +} h5t_oct_count_list_t; + +struct h5t_read_methods; +struct h5t_store_methods; +struct h5t_retrieve_methods; +struct h5t_access_methods; +struct h5t_adjacency_methods; +struct h5t_core_methods; + +typedef struct h5t_methods { + struct h5t_read_methods* read; + struct h5t_store_methods* store; + struct h5t_retrieve_methods* retrieve; + struct h5t_access_methods* access; + struct h5t_adjacency_methods* adjacency; + struct h5t_core_methods* core; +} h5t_methods_t; + + +struct h5t_mesh { + /*** book-keeping ***/ + char mesh_name[256]; + const h5t_ref_elem_t* ref_elem; + h5_id_t mesh_changed; /* true if new or has been changed */ + h5_lvl_idx_t leaf_level; /* idx of current level */ + h5_lvl_idx_t num_leaf_levels; /* number of levels */ + h5_lvl_idx_t num_loaded_levels; + + /*** chunking ***/ + h5_lvl_idx_t is_chunked; /* == 1 if mesh is chunked */ + h5t_octree_t* octree; + h5t_chunks_t* chunks; + h5_dsinfo_t dsinfo_chunks; + h5_dsinfo_t dsinfo_octree; + h5_dsinfo_t dsinfo_userdata; + h5t_timing_t timing; + + h5_strlist_t* mtagsets; + + /*** HDF5 IDs ***/ + hid_t mesh_gid; + + /*** functions to handle differnt mesh types ***/ + h5t_methods_t* methods; + + /*** vertices ***/ + h5_loc_vertex_t* vertices; + h5_glb_idx_t* num_glb_vertices; + h5_loc_idx_t* num_loc_vertices; + h5_idxmap_t map_vertex_g2l; /* map global to local idx */ + h5_loc_idx_t last_stored_vid; + h5_loc_idx_t last_stored_vid_before_ref; // needed for parallel refinement + h5_glb_idx_t* num_b_vtx; // stores the number of boundary vertices per level + h5_glb_idx_t* first_b_vtx; // stores the first boundary vertex per level + h5_dsinfo_t dsinfo_vertices; + + /*** Elements ***/ + h5_loc_elem_t* loc_elems; + + // number of global elements in mesh including refined for all levels + h5_glb_idx_t* num_glb_elems; + + // number of global leaf elements in mesh for all levels + h5_glb_idx_t* num_glb_leaf_elems; + + // number of interior (local) elements including refined for all loaded levels + h5_loc_idx_t* num_interior_elems; + + // number of interior (local) leaf elements for all loaded levels + h5_loc_idx_t* num_interior_leaf_elems; + + // number of ghost elements including refined for all loaded levels + h5_loc_idx_t* num_ghost_elems; + + h5_idxmap_t map_elem_g2l; /* map global id to local index */ + + h5_loc_idx_t last_stored_eid; + h5_loc_idx_t last_stored_eid_before_ref; + h5_dsinfo_t dsinfo_elems; + + h5_loc_idlist_t* marked_entities; + + /*** Weights ***/ + + h5_weight_t num_weights; + h5_weight_t* weights; + h5_dsinfo_t dsinfo_weights; + + /*** Adjacencies ***/ + h5t_adjacencies_t adjacencies; + + /*** IndexSets ***/ + h5_loc_idlist_t* index_sets[3]; + + /*** File ***/ + h5_file_p f; +}; + +#endif diff --git a/src/h5core/h5u_errorhandling_private.h b/src/h5core/h5u_errorhandling_private.h new file mode 100644 index 0000000..c51e63a --- /dev/null +++ b/src/h5core/h5u_errorhandling_private.h @@ -0,0 +1,17 @@ +#ifndef __H5U_ERRORHANDLING_PRIVATE_H +#define __H5U_ERRORHANDLING_PRIVATE_H + +#define HANDLE_H5_SET_VIEW_ERR( f, rc, start, end ) \ + h5_error( \ + f, \ + rc, \ + "Cannot set view to (%lld, %lld).", \ + (long long)start, (long long)end ); + +#define HANDLE_H5_GET_NUM_PARTICLES_ERR( f, rc ) \ + h5_error( \ + f, \ + rc, \ + "Cannot get number of particles." ); + +#endif diff --git a/src/h5core/h5u_model.c b/src/h5core/h5u_model.c new file mode 100644 index 0000000..f18ca84 --- /dev/null +++ b/src/h5core/h5u_model.c @@ -0,0 +1,630 @@ +/* + Copyright (c) 2006-2012, The Regents of the University of California, + through Lawrence Berkeley National Laboratory (subject to receipt of any + required approvals from the U.S. Dept. of Energy) and the Paul Scherrer + Institut (Switzerland). All rights reserved. + + License: see file COPYING in top level of source distribution. +*/ + +#include "h5core/h5.h" +#include "h5_private.h" +#include "h5_hdf5_private.h" + +#include "h5_model_private.h" +#include "h5_mpi_private.h" +#include "h5_readwrite_private.h" +#include "h5u_types_private.h" +#include "h5core/h5u_model.h" + +h5_ssize_t +h5u_get_num_particles ( + const h5_file_t fh /*!< [in] Handle to open file */ + ) { + h5_file_p f = (h5_file_p)fh; + H5_CORE_API_ENTER (h5_ssize_t, "f=%p", f); + h5_ssize_t nparticles; + + if (h5u_has_view ((h5_file_t)f)) { + /* if a view exists, use its size as the number of particles */ + TRY (nparticles = h5u_get_num_particles_in_view (fh)); + } else { + /* otherwise, report all particles on disk in the first dataset + for this timestep */ + TRY (nparticles = h5u_get_totalnum_particles_by_idx (fh, 0)); + } + + H5_CORE_API_RETURN (nparticles); +} + +h5_ssize_t +h5u_get_num_particles_in_view ( + const h5_file_t fh /*!< [in] Handle to open file */ + ) { + h5_file_p f = (h5_file_p)fh; + H5_CORE_API_ENTER (h5_ssize_t, "f=%p", f); + h5_ssize_t nparticles; + + if (!h5u_has_view (fh)) { + H5_CORE_API_LEAVE ( + h5_error ( + H5_ERR_H5PART, + "No view has been set.")); + } + TRY (nparticles = hdf5_get_selected_npoints_of_dataspace(f->u->diskshape)); + h5_debug ("Found %lld particles in view.", (long long)nparticles ); + H5_CORE_API_RETURN (nparticles); +} + +h5_ssize_t +h5u_get_totalnum_particles_by_name ( + const h5_file_t fh, ///< [in] Handle to open file + const char* const name ///< [in] Index of dataset to query + ) { + h5_file_p f = (h5_file_p)fh; + H5_CORE_API_ENTER (h5_ssize_t, "f=%p, name=%s", f, name); + h5_ssize_t nparticles; + + TRY (nparticles = hdf5_get_npoints_of_dataset_by_name (f->step_gid, name)); + h5_debug ("Found %lld particles in dataset %s.", (long long)nparticles, name); + H5_CORE_API_RETURN (nparticles); +} + +h5_ssize_t +h5u_get_totalnum_particles_by_idx ( + const h5_file_t fh, ///< [in] Handle to open file + h5_id_t idx ///< [in] Index of dataset to query + ) { + h5_file_p f = (h5_file_p)fh; + H5_CORE_API_ENTER (h5_ssize_t, "f=%p, idx=%lld", f, (long long)idx); + char dataset_name[H5_DATANAME_LEN]; + dataset_name[0] = '\0'; + TRY (hdf5_get_name_of_dataset_by_idx ( + f->step_gid, + idx, + dataset_name, + H5_DATANAME_LEN)); + H5_CORE_API_RETURN (h5u_get_totalnum_particles_by_name (fh, dataset_name)); +} + +h5_err_t +h5u_set_num_particles ( + const h5_file_t fh, /*!< [in] Handle to open file */ + const h5_size_t nparticles, /*!< [in] Number of particles */ + const h5_size_t stride /*!< [in] Stride of particles in memory */ + ) { + h5_file_p f = (h5_file_p)fh; + H5_CORE_API_ENTER (h5_ssize_t, + "f=%p, nparticles=%llu, stride=%llu", + f, (long long unsigned)nparticles, + (long long unsigned)stride); + struct h5u_fdata *u = f->u; + hsize_t start; + hsize_t dmax = H5S_UNLIMITED; + + if (nparticles < 0) + H5_CORE_API_LEAVE ( + h5_error( + H5_ERR_INVAL, + "Invalid number particles: %lld!\n", + (long long)nparticles)); + + hsize_t hstride = (hsize_t)stride; + if (hstride > 1) + h5_debug ("Striding by %lld elements.", (long long)hstride); + +#ifndef PARALLEL_IO + /* + if we are not using parallel-IO, there is enough information + to know that we can short circuit this routine. However, + for parallel IO, this is going to cause problems because + we don't know if things have changed globally + */ + if ( u->nparticles == nparticles && stride == 1 ) { + H5_CORE_API_LEAVE (H5_SUCCESS); + } +#endif + + TRY (h5u_reset_view(fh)); + + TRY (hdf5_close_dataspace (u->shape)); + u->shape = H5S_ALL; + + u->nparticles = (hsize_t)nparticles; + + /* declare local memory datasize with striding */ + hsize_t count = u->nparticles * stride; + TRY (u->memshape = hdf5_create_dataspace (1, &count, &dmax)); + + /* we need a hyperslab selection if there is striding + * (otherwise, the default H5S_ALL selection is ok) + */ + if (hstride > 1) { + start = 0; + count = u->nparticles; + TRY (hdf5_select_hyperslab_of_dataspace ( + u->memshape, + H5S_SELECT_SET, + &start, &hstride, &count, + NULL)); + } + +#ifndef PARALLEL_IO + count = u->nparticles; + TRY( u->shape = hdf5_create_dataspace (1, &count, NULL)); + u->viewstart = 0; + u->viewend = nparticles - 1; // view range is *inclusive* +#else /* PARALLEL_IO */ + /* + The Gameplan here is to declare the overall size of the on-disk + data structure the same way we do for the serial case. But + then we must have additional "DataSpace" structures to define + our in-memory layout of our domain-decomposed portion of the particle + list as well as a "selection" of a subset of the on-disk + data layout that will be written in parallel to mutually exclusive + regions by all of the processors during a parallel I/O operation. + These are f->shape, f->memshape and f->diskshape respectively. + */ + + /* + acquire the number of particles to be written from each MPI process + */ + hsize_t total; + TRY( h5priv_mpi_sum( + &(u->nparticles), &total, 1, MPI_LONG_LONG, f->props->comm ) ); + TRY( h5priv_mpi_prefix_sum( + &(u->nparticles), &start, 1, MPI_LONG_LONG, f->props->comm ) ); + start -= u->nparticles; + + h5_debug("Total particles across all processors: %lld.", (long long)total); + + u->viewstart = start; + u->viewend = start + u->nparticles - 1; // view range is *inclusive* + + /* declare overall datasize */ + count = total; + TRY( u->shape = hdf5_create_dataspace(1, &count, NULL) ); + + /* declare overall data size but then will select a subset */ + TRY( u->diskshape = hdf5_create_dataspace(1, &count, NULL) ); + + count = nparticles; + hstride = 1; + if (count > 0) { + TRY( hdf5_select_hyperslab_of_dataspace( + u->diskshape, + H5S_SELECT_SET, + &start, &hstride, &count, + NULL) ); + } else { + TRY (hdf5_select_none (u->diskshape)); + } +#endif + H5_CORE_API_RETURN (H5_SUCCESS); +} + +h5_err_t +h5u_has_view ( + const const h5_file_t fh + ) { + h5_file_p f = (h5_file_p)fh; + H5_CORE_API_ENTER (h5_ssize_t, "f=%p", f); + H5_CORE_API_RETURN (f->u->viewindexed || f->u->viewstart >= 0); +} + +h5_err_t +h5u_reset_view ( + const h5_file_t fh + ) { + h5_file_p f = (h5_file_p)fh; + H5_CORE_API_ENTER (h5_ssize_t, "f=%p", f); + struct h5u_fdata *u = f->u; + + u->viewstart = -1; + u->viewend = -1; + u->viewindexed = 0; + TRY (hdf5_close_dataspace (u->diskshape)); + u->diskshape = H5S_ALL; + TRY (hdf5_close_dataspace (u->memshape)); + u->memshape = H5S_ALL; + + H5_CORE_API_RETURN (H5_SUCCESS); +} + +h5_err_t +h5u_set_view ( + const h5_file_t fh, ///!< [in] Handle to open file + h5_int64_t start, ///!< [in] Start particle + h5_int64_t end ///!< [in] End particle + ) { + h5_file_p f = (h5_file_p)fh; + H5_CORE_API_ENTER (h5_err_t, + "f=%p, start=%lld, end=%lld", + f, (long long)start, (long long)end); + hsize_t total = 0; + hsize_t stride = 1; + hsize_t dmax = H5S_UNLIMITED; + struct h5u_fdata *u = f->u; + + TRY (h5u_reset_view (fh)); + + if (start == -1 && end == -1) + H5_CORE_API_LEAVE (H5_SUCCESS); + + if (f->u->shape > 0) { + TRY (total = hdf5_get_npoints_of_dataspace (f->u->shape) ); + h5_debug( + "Found %lld particles from previous H5PartSetNumParticles call.", + (long long)total); + } else { + TRY (total = (hsize_t)h5u_get_totalnum_particles_by_idx (fh,0)); + } + if (total == 0) { + /* No datasets have been created yet and no views are set. + * We have to leave the view empty because we don't know how + * many particles there should be! */ + H5_CORE_API_LEAVE (H5_SUCCESS); + } + + if (start == -1) start = 0; + if (end == -1) end = total - 1; // select to end + + if (end < start) + H5_CORE_API_LEAVE ( + h5_error( + H5_ERR_INVAL, + "Invalid selection for last particle: start=%lld, end=%lld!\n", + (long long)start, (long long)end)); + + /* setting up the new view */ + u->viewstart = start; + u->viewend = end; + u->nparticles = end - start + 1; + + h5_debug ( + "This view selected %lld particles.", + (long long)u->nparticles ); + + /* declare overall data size but then will select a subset */ + TRY (u->diskshape = hdf5_create_dataspace ( 1, &total, NULL )); + + total = (hsize_t)u->nparticles; + hsize_t hstart = (hsize_t)start; + + TRY (hdf5_select_hyperslab_of_dataspace ( + u->diskshape, + H5S_SELECT_SET, + &hstart, &stride, &total, + NULL)); + + /* declare local memory datasize */ + TRY (u->memshape = hdf5_create_dataspace (1, &total, &dmax)); + H5_CORE_API_RETURN (H5_SUCCESS); +} + +h5_err_t +h5u_set_view_start_length ( + const h5_file_t fh, ///!< [in] Handle to open file + h5_int64_t start, ///!< [in] Start particle + h5_int64_t length ///!< [in] number of particle in view + ) { + h5_file_p f = (h5_file_p)fh; + H5_CORE_API_ENTER (h5_err_t, + "f=%p, start=%lld, length=%lld", + f, (long long)start, (long long)length); + hsize_t total = 0; + hsize_t stride = 1; + hsize_t dmax = H5S_UNLIMITED; + struct h5u_fdata *u = f->u; + + TRY (h5u_reset_view (fh)); + + if (start == -1 && length == -1) + H5_CORE_API_LEAVE (H5_SUCCESS); + + if (u->shape > 0) { + TRY (total = hdf5_get_npoints_of_dataspace (u->shape) ); + h5_debug( + "Found %lld particles from previous H5PartSetNumParticles call.", + (long long)total); + } else { + TRY (total = (hsize_t)h5u_get_totalnum_particles_by_idx (fh,0)); + } + if (total == 0) { + /* No datasets have been created yet and no views are set. + * We have to leave the view empty because we don't know how + * many particles there should be! */ + H5_CORE_API_LEAVE (H5_SUCCESS); + } + + if (start < 0 || length < 0 || start+length > total) + H5_CORE_API_LEAVE ( + h5_error( + H5_ERR_INVAL, + "Invalid view: start=%lld, length=%lld, total=%lld", + (long long)start, (long long)length, (long long)total)); + + /* setting up the new view */ + u->viewstart = start; + u->viewend = start + length - 1; + u->nparticles = length; + + h5_debug ( + "This view selected %lld particles.", + (long long)u->nparticles ); + + /* declare overall data size but then will select a subset */ + TRY (u->diskshape = hdf5_create_dataspace ( 1, &total, NULL )); + + total = (hsize_t)u->nparticles; + hsize_t hstart = (hsize_t)start; + + TRY (hdf5_select_hyperslab_of_dataspace ( + u->diskshape, + H5S_SELECT_SET, + &hstart, &stride, &total, + NULL)); + + /* declare local memory datasize */ + TRY (u->memshape = hdf5_create_dataspace (1, &total, &dmax)); + H5_CORE_API_RETURN (H5_SUCCESS); +} + +h5_err_t +h5u_set_view_indices ( + const h5_file_t fh, /*!< [in] Handle to open file */ + const h5_size_t *const indices, /*!< [in] List of indices */ + h5_size_t nelems /*!< [in] Size of list */ + ) { + h5_file_p f = (h5_file_p)fh; + H5_CORE_API_ENTER (h5_err_t, + "f=%p, indices=%p, nelems=%llu", + f, indices, (long long unsigned)nelems); + CHECK_FILEHANDLE (f); + if (f->step_gid < 0) { + TRY (h5_set_step (fh, 0)); + } + + hsize_t total = 0; + hsize_t dmax = H5S_UNLIMITED; + struct h5u_fdata *u = f->u; + + TRY (h5u_reset_view (fh)); + + if ( indices == NULL ) { + h5_warn ("View indices array is null: reseting view."); + H5_CORE_API_LEAVE (H5_SUCCESS); + } + if (f->u->shape > 0) { + TRY (total = hdf5_get_npoints_of_dataspace (f->u->shape) ); + h5_debug( + "Found %lld particles from previous H5PartSetNumParticles call.", + (long long)total); + } else { + TRY (total = h5u_get_totalnum_particles_by_idx (fh,0)); + } + if (total == 0) { + /* No datasets have been created yet and no views are set. + * We have to leave the view empty because we don't know how + * many particles there should be! */ + H5_CORE_API_LEAVE (H5_SUCCESS); + } + + u->nparticles = nelems; + + /* declare overall data size but then we select a subset */ + TRY (u->diskshape = hdf5_create_dataspace (1, &total, NULL)); + + /* declare local memory datasize */ + total = u->nparticles; + TRY (u->memshape = hdf5_create_dataspace (1, &total, &dmax)); + if (nelems > 0) { + TRY (hdf5_select_elements_of_dataspace ( + u->diskshape, + H5S_SELECT_SET, + (hsize_t)nelems, (hsize_t*)indices ) ); + } else { + TRY (hdf5_select_none (u->diskshape)); + } + u->viewindexed = 1; + + H5_CORE_API_RETURN (H5_SUCCESS); +} + +h5_int64_t +h5u_get_view ( + const h5_file_t fh, + h5_int64_t *start, + h5_int64_t *end + ) { + h5_file_p f = (h5_file_p)fh; + H5_CORE_API_ENTER (h5_err_t, + "f=%p, start=%p, end=%p", + f, start, end); + struct h5u_fdata *u = f->u; + + if ( u->viewindexed ) { + H5_CORE_API_LEAVE ( + h5_error ( + H5_ERR_INVAL, + "The current view has an index selection, but " + "this function only works for ranged views." )); + } + + h5_int64_t viewstart = 0; + h5_int64_t viewend = 0; + + if ( u->viewstart >= 0 ) + viewstart = u->viewstart; + + if ( u->viewend >= 0 ) { + viewend = u->viewend; + } + else { + TRY (viewend = h5u_get_num_particles (fh)); + } + + if ( start ) *start = viewstart; + if ( end ) *end = viewend; + + H5_CORE_API_RETURN (viewend - viewstart + 1); // view range is *inclusive* +} + +h5_int64_t +h5u_set_canonical_view ( + const h5_file_t fh + ) { + h5_file_p f = (h5_file_p)fh; + H5_CORE_API_ENTER (h5_int64_t, "f=%p", f); + h5u_fdata_t* u = f->u; + TRY( h5u_reset_view (fh) ); + + h5_int64_t start = 0; + h5_int64_t total = 0; + + TRY (total = h5u_get_num_particles (fh)); + +#ifdef PARALLEL_IO + h5_int64_t remainder = 0; + + u->nparticles = total / f->nprocs; + remainder = total % f->nprocs; + start = f->myproc * u->nparticles; + + /* distribute the remainder */ + if ( f->myproc < remainder ) u->nparticles++; + + /* adjust the offset */ + if ( f->myproc < remainder ) start += f->myproc; + else start += remainder; + + h5_int64_t length = u->nparticles; +#else + u->nparticles = total; + h5_int64_t length = total - 1; +#endif // PARALLEL_IO + H5_CORE_API_RETURN (h5u_set_view_start_length (fh, start, length)); +} + +h5_ssize_t +h5u_get_num_datasets ( + const h5_file_t fh /*!< [in] Handle to open file */ + ) { + h5_file_p f = (h5_file_p)fh; + H5_CORE_API_ENTER (h5_int64_t, "f=%p", f); + H5_CORE_API_RETURN (hdf5_get_num_datasets (f->step_gid)); +} + +/*! + Get information about dataset in current index given by its index + */ +h5_err_t +h5u_get_dataset_info ( + const h5_file_t fh, /*!< [in] Handle to open file */ + const h5_id_t idx, /*!< [in] Index of the dataset */ + char *dataset_name, /*!< [out] Name of dataset */ + const h5_size_t len_dataset_name, + /*!< [in] Size of buffer \c dataset_name */ + h5_int64_t *type, /*!< [out] Type of data in dataset */ + h5_size_t *nelem /*!< [out] Number of elements. */ + ) { + h5_file_p f = (h5_file_p)fh; + H5_CORE_API_ENTER (h5_err_t, + "f=%p, " + "idx=%lld, " + "dataset_name='%s', len_dataset_name=%llu, " + "type=%p, nelem=%p", + f, + (long long)idx, + dataset_name, + (long long unsigned)len_dataset_name, + type, nelem); + TRY (hdf5_get_name_of_dataset_by_idx ( + f->step_gid, + idx, + dataset_name, len_dataset_name) ); + + H5_CORE_API_RETURN ( + h5u_get_dataset_info_by_name(f, dataset_name, type, nelem)); +} + +/*! + Get information about dataset in current index given by its index + */ +h5_err_t +h5u_get_dataset_info_by_name ( + const h5_file_p f, /*!< [in] Handle to open file */ + const char* const dataset_name, /*!< [in] Name of dataset */ + h5_int64_t* const type, /*!< [out] Type of data in dataset */ + h5_size_t* const nelem /*!< [out] Number of elements. */ + ) { + H5_CORE_API_ENTER (h5_err_t, + "f=%p, " + "dataset_name='%s', " + "type=%p, nelem=%p", + f, + dataset_name, + type, nelem); + + if (nelem) { + h5_ssize_t nelem_; + TRY (nelem_ = hdf5_get_npoints_of_dataset_by_name ( + f->step_gid, + dataset_name) ); + if ( nelem_ < 0 ) H5_CORE_API_LEAVE (nelem_); + *nelem = nelem_; + } + + if (type) { + *type = h5priv_get_dataset_type (f->step_gid, dataset_name); + if (*type < 0) H5_CORE_API_LEAVE (*type); + } + + H5_CORE_API_RETURN (H5_SUCCESS); +} + +h5_err_t +h5u_set_chunk ( + const h5_file_t fh, + const h5_size_t size + ) { + h5_file_p f = (h5_file_p)fh; + H5_CORE_API_ENTER (h5_int64_t, "f=%p, size=%llu", f, (long long unsigned)size); + if ( size == 0 ) + { + h5_info ("Disabling chunking" ); + TRY (hdf5_set_layout_property ( + f->u->dcreate_prop, H5D_CONTIGUOUS)); + } else + { + h5_info ("Setting chunk size to %lld particles", (long long)size); + TRY (hdf5_set_chunk_property( + f->u->dcreate_prop, 1, (hsize_t*)&size)); + } + H5_CORE_API_RETURN (H5_SUCCESS); +} + +h5_err_t +h5u_get_chunk ( + const h5_file_t fh, /*!< IN: File handle */ + const char *name, /*!< IN: name of dataset */ + h5_size_t *size /*!< OUT: chunk size in particles */ + ) { + h5_file_p f = (h5_file_p)fh; + H5_CORE_API_ENTER (h5_int64_t, "f=%p, name='%s', size=%p", f,name,size); + hid_t dataset_id; + hid_t plist_id; + hsize_t hsize; + + TRY (dataset_id = hdf5_open_dataset (f->step_gid, name) ); + TRY (plist_id = hdf5_get_dataset_create_plist (dataset_id) ); + TRY (hdf5_get_chunk_property (plist_id, 1, &hsize) ); + TRY (hdf5_close_property ( plist_id) ); + TRY (hdf5_close_dataset (dataset_id) ); + + *size = (h5_size_t)hsize; + + h5_info ("Found chunk size of %lld particles", (long long)*size); + H5_CORE_API_RETURN (H5_SUCCESS); +} + diff --git a/src/h5core/h5u_readwrite.c b/src/h5core/h5u_readwrite.c new file mode 100644 index 0000000..2328129 --- /dev/null +++ b/src/h5core/h5u_readwrite.c @@ -0,0 +1,243 @@ +/* + Copyright (c) 2006-2012, The Regents of the University of California, + through Lawrence Berkeley National Laboratory (subject to receipt of any + required approvals from the U.S. Dept. of Energy) and the Paul Scherrer + Institut (Switzerland). All rights reserved. + + License: see file COPYING in top level of source distribution. +*/ + +#include "h5_types_private.h" +#include "h5_hdf5_private.h" +#include "h5_model_private.h" +#include "h5_readwrite_private.h" +#include "h5u_types_private.h" + +#include "h5core/h5.h" +#include "h5core/h5_model.h" +#include "h5core/h5_syscall.h" + +/*! + \ingroup h5_private + + \internal + + Initialize unstructured data internal data structure. + + TODO: Move to file "h5u_openclose.c" + + \return H5_SUCCESS or error code +*/ +h5_err_t +h5upriv_open_file ( + const h5_file_p f /*!< IN: file handle */ + ) { + H5_PRIV_API_ENTER (h5_err_t, "f=%p", f); + TRY (f->u = (h5u_fdata_t*)h5_calloc (1, sizeof (*f->u))); + h5u_fdata_t *u = f->u; + + u->shape = -1; + u->diskshape = H5S_ALL; + u->memshape = H5S_ALL; + u->viewstart = -1; + u->viewend = -1; + u->viewindexed = 0; + + TRY (u->dcreate_prop = hdf5_create_property (H5P_DATASET_CREATE)); + + H5_PRIV_API_RETURN (H5_SUCCESS); +} + +/*! + \ingroup h5_private + + \internal + + De-initialize H5Block internal structure. Open HDF5 objects are + closed and allocated memory freed. + + \return H5_SUCCESS or error code +*/ +h5_err_t +h5upriv_close_file ( + const h5_file_p f /*!< file handle */ + ) { + H5_PRIV_API_ENTER (h5_err_t, "f=%p", f); + struct h5u_fdata* u = f->u; + + h5_errno = H5_SUCCESS; + TRY (hdf5_close_dataspace (u->shape)); + TRY (hdf5_close_dataspace (u->diskshape)); + TRY (hdf5_close_dataspace (u->memshape)); + TRY (hdf5_close_property (u->dcreate_prop)); + TRY (h5_free (f->u)); + f->u = NULL; + + H5_PRIV_API_RETURN (H5_SUCCESS); +} + +h5_err_t +h5u_read_data ( + const h5_file_t fh, /*!< [in] Handle to open file */ + const char* name, /*!< [in] Name to associate dataset with */ + void* data, /*!< [out] Array of data */ + const hid_t type + ) { + h5_file_p f = (h5_file_p)fh; + H5_CORE_API_ENTER (h5_err_t, "f=%p, name='%s', data=%p, type=%d", + f, name, data, type); + CHECK_TIMEGROUP (f); + + struct h5u_fdata *u = f->u; + hid_t dataset_id; + hid_t space_id; + hid_t memspace_id; + hsize_t ndisk, nread, nmem; + + if ( f->step_gid < 0 ) { + TRY (h5_set_step ((h5_file_t)f, f->step_idx)); + } + + char name2[H5_DATANAME_LEN]; + TRY (h5priv_normalize_dataset_name (name, name2)); + + TRY (dataset_id = hdf5_open_dataset (f->step_gid, name2)); + + /* default spaces, if not using a view selection */ + memspace_id = H5S_ALL; + TRY (space_id = hdf5_get_dataset_space (dataset_id)); + + /* get the number of elements on disk for the datset */ + TRY (ndisk = hdf5_get_npoints_of_dataspace (space_id)); + + if (u->diskshape != H5S_ALL) { + TRY (nread = hdf5_get_selected_npoints_of_dataspace (u->diskshape)); + + /* make sure the disk space selected by the view doesn't + * exceed the size of the dataset */ + if (nread <= ndisk) { + /* we no longer need the dataset space... */ + TRY (hdf5_close_dataspace(space_id)); + /* ...because it's safe to use the view selection */ + space_id = f->u->diskshape; + } else { + /* the view selection is too big? + * fall back to using the dataset space */ + h5_warn ( + "Ignoring view: dataset[%s] has fewer " + "elements on disk (%lld) than are selected " + "(%lld).", + name2, (long long)ndisk, (long long)nread ); + nread = ndisk; + } + } else { + /* since the view selection is H5S_ALL, we will + * read all available elements in the dataset space */ + nread = ndisk; + } + + if (u->memshape != H5S_ALL) { + TRY (nmem = hdf5_get_npoints_of_dataspace (u->memshape)); + + /* make sure the memory space selected by the view has + * enough capacity for the read */ + if (nmem >= nread) { + memspace_id = f->u->memshape; + } else { + /* the view selection is too small? + * fall back to using H5S_ALL */ + h5_warn ( + "Ignoring view: dataset[%s] has more " + "elements selected (%lld) than are available " + "in memory (%lld).", + name2, (long long)nread, (long long)nmem ); + memspace_id = H5S_ALL; + } + } +#ifdef PARALLEL_IO + TRY (h5priv_start_throttle (f)); +#endif + TRY (hdf5_read_dataset ( + dataset_id, + type, + memspace_id, + space_id, + f->props->xfer_prop, + data )); +#ifdef PARALLEL_IO + TRY (h5priv_end_throttle (f)); +#endif + if (space_id != f->u->diskshape) { + TRY (hdf5_close_dataspace (space_id)); + } + + TRY (hdf5_close_dataset (dataset_id)); + + H5_CORE_API_RETURN (H5_SUCCESS); +} + +h5_err_t +h5u_write_data ( + const h5_file_t fh, /*!< IN: Handle to open file */ + const char *name, /*!< IN: Name to associate array with */ + const void *data, /*!< IN: Array to commit to disk */ + const hid_t type /*!< IN: Type of data */ + ) { + h5_file_p f = (h5_file_p)fh; + H5_CORE_API_ENTER (h5_err_t, "f=%p, name='%s', data=%p, type=%d", + f, name, data, type); + CHECK_TIMEGROUP( f ); + CHECK_WRITABLE_MODE( f ); + + struct h5u_fdata *u = f->u; + hid_t dset_id; + + char name2[H5_DATANAME_LEN]; + TRY (h5priv_normalize_dataset_name (name, name2)); + + if ( u->shape == H5S_ALL ) + h5_warn("The view is unset or invalid."); + + /* test for existing dataset */ + H5E_BEGIN_TRY + dset_id = H5Dopen(f->step_gid, name2, H5P_DEFAULT); + H5E_END_TRY + + if (dset_id > 0) { + h5_warn("Dataset %s/%s already exists", + hdf5_get_objname(f->step_gid), name2); + } else { + TRY (dset_id = hdf5_create_dataset ( + f->step_gid, + name2, + type, + u->shape, + H5P_DEFAULT)); + } + +#ifdef PARALLEL_IO + TRY (h5priv_start_throttle (f)); +#endif + h5_info ("Writing dataset %s/%s.", + hdf5_get_objname(f->step_gid), name2); + TRY (hdf5_write_dataset ( + dset_id, + type, + u->memshape, + u->diskshape, + f->props->xfer_prop, + data)); +#ifdef PARALLEL_IO + TRY (h5priv_end_throttle (f)); +#endif + if (f->props->mode & H5_FLUSH_STEP) + TRY (hdf5_flush (f->step_gid, H5F_SCOPE_LOCAL)); + + TRY (hdf5_close_dataset (dset_id)); + + f->empty = 0; + TRY (hdf5_flush (f->step_gid, H5F_SCOPE_LOCAL)); + + H5_CORE_API_RETURN (H5_SUCCESS); +} + diff --git a/src/h5core/h5u_readwrite_private.h b/src/h5core/h5u_readwrite_private.h new file mode 100644 index 0000000..34d0d1a --- /dev/null +++ b/src/h5core/h5u_readwrite_private.h @@ -0,0 +1,24 @@ +/* + Copyright (c) 2006-2012, The Regents of the University of California, + through Lawrence Berkeley National Laboratory (subject to receipt of any + required approvals from the U.S. Dept. of Energy) and the Paul Scherrer + Institut (Switzerland). All rights reserved. + + License: see file COPYING in top level of source distribution. +*/ + +#ifndef __H5U_READWRITE_PRIVATE_H +#define __H5U_READWRITE_PRIVATE_H + +#include "h5core/h5_types.h" + +h5_err_t +h5upriv_open_file ( + const h5_file_p f + ); + +h5_err_t +h5upriv_close_file ( + const h5_file_p f + ); +#endif diff --git a/src/h5core/h5u_types_private.h b/src/h5core/h5u_types_private.h new file mode 100644 index 0000000..b507198 --- /dev/null +++ b/src/h5core/h5u_types_private.h @@ -0,0 +1,29 @@ +/* + Copyright (c) 2006-2012, The Regents of the University of California, + through Lawrence Berkeley National Laboratory (subject to receipt of any + required approvals from the U.S. Dept. of Energy) and the Paul Scherrer + Institut (Switzerland). All rights reserved. + + License: see file COPYING in top level of source distribution. +*/ + +#ifndef __H5U_TYPES_PRIVATE_H +#define __H5U_TYPES_PRIVATE_H + +#include "h5core/h5_types.h" + +struct h5u_fdata { + hsize_t nparticles; /* -> u.nparticles */ + + h5_int64_t viewstart; /* -1 if no view is available: A "view" looks */ + h5_int64_t viewend; /* at a subset of the data. */ + char viewindexed; /* flag whether this view is a list of indices */ + + hid_t shape; + hid_t diskshape; + hid_t memshape; + + hid_t dcreate_prop; +}; +typedef struct h5u_fdata h5u_fdata_t; +#endif diff --git a/src/include/H5.h b/src/include/H5.h new file mode 100644 index 0000000..a5f68c9 --- /dev/null +++ b/src/include/H5.h @@ -0,0 +1,366 @@ +/* + Copyright (c) 2006-2013, The Regents of the University of California, + through Lawrence Berkeley National Laboratory (subject to receipt of any + required approvals from the U.S. Dept. of Energy) and the Paul Scherrer + Institut (Switzerland). All rights reserved. + + License: see file COPYING in top level of source distribution. +*/ + +#ifndef __H5_H +#define __H5_H + +#include + +#include "H5_model.h" +#include "H5_attribs.h" + +#ifdef __cplusplus +extern "C" { +#endif + +static inline h5_prop_t +H5CreateFileProp ( + void + ) { + H5_API_ENTER (h5_prop_t, "%s", ""); + H5_API_RETURN (h5_create_prop (H5_PROP_FILE)); +} + +static inline h5_err_t +H5SetPropFileMPIO ( + h5_prop_t prop, + MPI_Comm* comm + ) { + H5_API_ENTER (h5_err_t, "prop=%p, comm=%p", (void*)prop, comm); + H5_API_RETURN (h5_set_prop_file_mpio (prop, comm)); +} + +static inline h5_err_t +H5SetPropFileAlign ( + h5_prop_t prop, + h5_int64_t align + ) { + H5_API_ENTER (h5_err_t, "prop=%p, align=%lld", (void*)prop, align); + H5_API_RETURN (h5_set_prop_file_align (prop, align)); +} + +static inline h5_err_t +H5SetPropFileThrottle ( + h5_prop_t prop, + h5_int64_t throttle + ) { + H5_API_ENTER (h5_err_t, "prop=%p, throttle=%lld", (void*)prop, throttle); + H5_API_RETURN (h5_set_prop_file_throttle (prop, throttle)); +} + +static inline h5_err_t +H5CloseProp ( + h5_prop_t prop + ) { + H5_API_ENTER (h5_err_t, "prop=%p", (void*)prop); + H5_API_RETURN (h5_close_prop (prop)); +} + +/*! + \ingroup h5hut_file + + + Open file with name \c filename. This function is available in the parallel + and serial version. In the serial case \c comm may have any value. + + + File mode flags are: + - \c H5_O_RDONLY: only reading allowed + - \c H5_O_WRONLY: create new file, dataset must not exist + - \c H5_O_APPEND: allows to append a new datasets to an existing file + - \c H5_O_RDWR: dataset may exist + - \c H5_FS_LUSTRE - enable optimizations for the Lustre file system + - \c H5_VFD_MPIPOSIX - use the HDF5 MPI-POSIX virtual file driver + - \c H5_VFD_MPIIO_IND - use MPI-IO in indepedent mode + + The typical file extension is \c .h5. + + \c h5_file_p should be treated as an essentially opaque + datastructure. It acts as the file handle, but internally + it maintains several key state variables associated with + the file. + + \return File handle or \c (void*)H5_FAILURE +*/ +static inline h5_file_t +H5OpenFile ( + const char* filename, ///< [in] file name. + h5_int32_t flags, ///< [in] file access mode flags. + MPI_Comm comm ///< [in] MPI communicator. + ) { + H5_API_ENTER (h5_file_t, + "filename='%s', flags=%d, ...", + filename, flags); + H5_API_RETURN (h5_open_file (filename, flags, comm, 0)); +} + +static inline h5_file_t +H5OpenFile2 ( + const char* filename, + h5_int64_t mode, + h5_prop_t props + ) { + H5_API_ENTER (h5_file_t, + "filename='%s', mode=%lld, props=%p", + filename, mode, (void*)props); + H5_API_RETURN (h5_open_file2 (filename, mode, props)); +} + +/*! + \ingroup h5hut_file + + + Opens file with specified filename, and also specifices an alignment + value used for HDF5 tuning parameters. In the serial case \c comm may have + any value. + + File modes and flags are bit values that can be combined with the bit operator \c | + and include: + + - \c H5_O_RDONLY: only reading allowed + - \c H5_O_WRONLY: create new file, dataset must not exist + - \c H5_O_APPEND: allows to append a new datasets to an existing file + - \c H5_O_RDWR: dataset may exist + - \c H5_FS_LUSTRE - enable optimizations for the Lustre file system + - \c H5_VFD_MPIPOSIX - use the HDF5 MPI-POSIX virtual file driver + - \c H5_VFD_MPIIO_IND - use MPI-IO in indepedent mode + + The typical file extension is \c .h5. + + \c h5_file_p should be treated as an essentially opaque + datastructure. It acts as the file handle, but internally + it maintains several key state variables associated with + the file. + + \return File handle or \c (void*)H5_FAILURE + */ +static inline h5_file_t +H5OpenFileAlign ( + const char* filename, ///< [in] name of the data file to open. + const h5_int32_t flags, ///< [in] file access mode flags. + MPI_Comm comm, ///< [in] MPI communicator. + const h5_size_t align ///< [in] alignment size in bytes. + ) { + H5_API_ENTER (h5_file_t, + "filename='%s', flags=%d, ...", + filename, flags); + H5_API_RETURN (h5_open_file (filename, flags, comm, align)); +} + +/*! + \ingroup h5hut_file + + Close file and free all memory associated with the file handle. + + \return \c H5_SUCCESS or \c H5_FAILURE +*/ +static inline h5_err_t +H5CloseFile ( + const h5_file_t f ///< [in] file handle. + ) { + H5_API_ENTER (h5_err_t, + "f=%p", + (h5_file_p)f); + H5_API_RETURN (h5_close_file (f)); +} + +/*! + \ingroup h5hut_file + + Verify that the file handle points to a valid H5hut file structure. + + \return \c H5_SUCCESS or \c H5_FAILURE +*/ +static inline h5_err_t +H5CheckFile ( + const h5_file_t f ///< [in] file handle. + ) { + H5_API_ENTER (h5_err_t, + "f=%p", + (h5_file_p)f); + H5_API_RETURN (h5_check_filehandle (f)); +} + +/*! + \ingroup h5hut_file + + Set the `throttle` factor, which causes HDF5 write and read + calls to be issued in that number of batches. + + This can prevent large concurrency parallel applications that + use independent writes from overwhelming the underlying + parallel file system. + + Throttling only works with the H5_VFD_MPIPOSIX or + H5_VFD_MPIIO_IND drivers and is only available in + the parallel library. + + \return \c H5_SUCCESS or \c H5_FAILURE +*/ +#ifdef PARALLEL_IO +h5_err_t +static inline H5SetThrottle ( + const h5_file_t f, ///< [in] file handle. + int factor ///< [in] throttle factor + ) { + H5_API_ENTER (h5_err_t, + "f=%p, factor=%d", + (h5_file_p)f, factor); + H5_API_RETURN (h5_set_throttle(f, factor)); +} +#endif // PARALLEL_IO +#ifdef __cplusplus +} +#endif + + +/*! + \ingroup h5hut_file + + Flush step data to disk. + + \return \c H5_SUCCESS or \c H5_FAILURE + */ +static inline h5_err_t +H5FlushStep ( + const h5_file_t f ///< [in] file handle. + ) { + H5_API_ENTER (h5_err_t, + "f=%p", + (h5_file_p)f); + H5_API_RETURN (h5_flush_step (f)); +} + +/*! + \ingroup h5hut_file + + Flush file data to disk. + + \return \c H5_SUCCESS or \c H5_FAILURE + */ +static inline h5_err_t +H5FlushFile ( + const h5_file_t f ///< [in] file handle. + ) { + H5_API_ENTER (h5_err_t, + "f=%p", + (h5_file_p)f); + H5_API_RETURN (h5_flush_file (f)); +} + +/*! + \ingroup h5hut_file + + Close H5hut library. This function should be called before program exit. + + \return \c H5_SUCCESS or \c H5_FAILURE +*/ +static inline h5_err_t +H5Finalize ( + void + ) { + H5_API_ENTER (h5_err_t, "%s", ""); + H5_API_RETURN (h5_close_hdf5 ()); +} + +/*! + \ingroup h5hut_error + + Set verbosity level to \c level. + + \return \c H5_SUCCESS +*/ +static inline h5_err_t +H5SetVerbosityLevel ( + const h5_id_t level ///< [in] verbosity/debug level. + ) { + return h5_set_debuglevel (level); +} + +/*! + \ingroup h5hut_error + + Set error handler to \c handler. + + \return \c H5_SUCCESS +*/ +static inline h5_err_t +H5SetErrorHandler ( + h5_errorhandler_t handler ///< [in] error handler to set. + ) { + H5_API_ENTER (h5_err_t, "handler=%p", handler); + H5_API_RETURN (h5_set_errorhandler (handler)); +} + +/*! + \ingroup h5hut_error + + Get current error handler. + + \return Pointer to error handler. +*/ +static inline h5_errorhandler_t +H5GetErrorHandler ( + void + ) { + H5_API_ENTER (h5_errorhandler_t, "%s", "void"); + H5_API_RETURN (h5_get_errorhandler()); +} + + +/*! + \ingroup h5hut_error + + The report error handler writes a message to stderr, sets the error number + and returns. + + \return \c H5_FAILURE + */ +static inline h5_err_t +H5ReportErrorhandler ( + const char* fmt, ///< [in] format string of error message. + va_list ap ///< [in] arguments to format string. + ) { + return h5_report_errorhandler (fmt, ap); +} + +/*! + \ingroup h5hut_error + + The abort error handler writes a message to stderr and exits the programm. + + \return does not return. + */ +static inline h5_err_t +H5AbortErrorhandler ( + const char* fmt, ///< [in] format string of error message. + va_list ap ///< [in] arguments to format string. + ) { + return h5_abort_errorhandler (fmt, ap); +} + +/*! + \ingroup h5hut_error + + Get last error code. + + \return error code +*/ +static inline h5_err_t +H5GetErrno ( + void + ) { + return h5_get_errno (); +} + +#ifdef __cplusplus +} +#endif + +#endif diff --git a/src/include/H5Block.h b/src/include/H5Block.h new file mode 100644 index 0000000..745a290 --- /dev/null +++ b/src/include/H5Block.h @@ -0,0 +1,41 @@ +/* + Copyright (c) 2006-2013, The Regents of the University of California, + through Lawrence Berkeley National Laboratory (subject to receipt of any + required approvals from the U.S. Dept. of Energy) and the Paul Scherrer + Institut (Switzerland). All rights reserved. + + License: see file COPYING in top level of source distribution. +*/ + +#ifndef __H5BLOCK_H +#define __H5BLOCK_H + +/*! + \ingroup h5block_model + + \note + Different field sizes are allowed in the same time-step. + + \note + The same layout can be used, if the size of the field matches the + size of the layout. If the size of the layout doesn't match the + size of the field, an error will be indicated. + + \note + In write mode partitions are shrinked to make them non-overlaping. This + process may shrink the partitions more than required. + + \note + In read-mode partitions may not cross boundaries. This means, if the grid + size is (X, Y, Z), all partitions must fit into this grid. + + \todo + check whether layout is reasonable +*/ + +#include "H5Block_attribs.h" +#include "H5Block_model.h" +#include "H5Block_io.h" + +#endif + diff --git a/src/include/H5Block_attribs.h b/src/include/H5Block_attribs.h new file mode 100644 index 0000000..7581798 --- /dev/null +++ b/src/include/H5Block_attribs.h @@ -0,0 +1,733 @@ +/* + Copyright (c) 2006-2013, The Regents of the University of California, + through Lawrence Berkeley National Laboratory (subject to receipt of any + required approvals from the U.S. Dept. of Energy) and the Paul Scherrer + Institut (Switzerland). All rights reserved. + + License: see file COPYING in top level of source distribution. +*/ + +#ifndef __H5BLOCK_ATTRIB +#define __H5BLOCK_ATTRIB + +#include + +#include "h5core/h5_types.h" +#include "h5core/h5.h" +#include "h5core/h5_debug.h" +#include "h5core/h5b_attribs.h" +#ifdef __cplusplus +extern "C" { +#endif + +/*! + \ingroup h5block_attrib + \anchor H5BlockGetNumFieldAttribs + + Query the number of attributes of field \c field_name. + + \return number of attributes + \return H5_FAILURE on error +*/ +static inline h5_ssize_t +H5BlockGetNumFieldAttribs ( + const h5_file_t f, ///< [in] file handle. + const char* field_name ///< [in] field name. + ) { + H5_API_ENTER (h5_ssize_t, + "f=%p, field_name='%s'", + (h5_file_p)f, field_name); + H5_API_RETURN (h5b_get_num_field_attribs (f, field_name)); +} + +/*! + \ingroup h5block_attrib + \anchor H5BlockGetFieldAttribInfo + + Gets the name, type and number of elements of the field attribute + specified by its index. + + This function can be used to retrieve all attributes bound to the + specified field by looping from \c 0 to the number of attribute + minus one. The number of attributes bound to the + field can be queried by calling \ref H5BlockGetNumFieldAttribs. + + \return \c H5_SUCCESS or \c H5_FAILURE +*/ +static inline h5_err_t +H5BlockGetFieldAttribInfo ( + const h5_file_t f, ///< [in] file handle. + const char* field_name, ///< [in] field name. + const h5_size_t attrib_idx, ///< [in] index of attribute to query + char* attrib_name, ///< [out] name of attribute. + const h5_size_t len_attrib_name,///< [in] length of buffer \c name. + h5_int64_t* attrib_type, ///< [out] type of value. + h5_size_t* attrib_nelem ///< [out] number of elements. + ) { + H5_API_ENTER (h5_err_t, + "f=%p field_name='%s', " + "attrib_idx=%llu, " + "attrib_name=%p, len_attrib_name=%llu, " + "attrib_type=%p, " + "attrib_nelem=%p", + (h5_file_p)f, + field_name, + (long long unsigned)attrib_idx, + attrib_name, (long long unsigned)len_attrib_name, + attrib_type, + attrib_nelem); + H5_API_RETURN ( + h5b_get_field_attrib_info ( + f, + field_name, + attrib_idx, + attrib_name, + len_attrib_name, + attrib_type, + attrib_nelem)); +} + +/********************** reading and writing attribute ************************/ + +/*! + \ingroup h5block_attrib + \anchor H5BlockWriteFieldAttribString + + Write the string in \c buffer as attribute \c attrib_name of field + \c field_name. + + \return \c H5_SUCCESS or \c H5_FAILURE +*/ +static inline h5_err_t +H5BlockWriteFieldAttribString ( + const h5_file_t f, ///< [in] file handle. + const char* field_name, ///< [in] field name. + const char* attrib_name, ///< [in] attribute name. + const char* buffer ///< [in] attribute value. + ) { + H5_API_ENTER (h5_err_t, + "f=%p, " + "field_name='%s', " + "attrib_name='%s', " + "buffer='%s'", + (h5_file_p)f, + field_name, + attrib_name, + buffer); + H5_API_RETURN ( + h5b_write_field_attrib ( + f, + field_name, + attrib_name, + H5T_NATIVE_CHAR, + buffer, + strlen(buffer) + 1)); +} + +/*! + \ingroup h5block_attrib + \anchor H5BlockReadFieldAttribString ( + + Read the string value from attribute \c attrib_name of field + \c field_name into \c buffer. + + \return \c H5_SUCCESS or \c H5_FAILURE +*/ +static inline h5_err_t +H5BlockReadFieldAttribString ( + const h5_file_t f, ///< [in] file handle. + const char* field_name, ///< [in] field name. + const char* attrib_name, ///< [in] attribute name. + char* buffer ///< [out] attribute value. + ) { + H5_API_ENTER (h5_err_t, + "f=%p, " + "field_name='%s', " + "attrib_name='%s', " + "buffer=%p", + (h5_file_p)f, + field_name, + attrib_name, + buffer); + H5_API_RETURN ( + h5b_read_field_attrib ( + f, + field_name, + attrib_name, + H5_STRING_T, + (void*)buffer)); +} + + +/*! + \ingroup h5block_attrib + \anchor H5BlockWriteFieldAttribFloat64 + + Write float64 \c values as attribute \c attrib_name of field + \c field_name. + + \return \c H5_SUCCESS or \c H5_FAILURE +*/ +static inline h5_err_t +H5BlockWriteFieldAttribFloat64 ( + const h5_file_t f, ///< [in] file handle. + const char* field_name, ///< [in] field name. + const char* attrib_name, ///< [in] attribute name. + const h5_float64_t* buffer, ///< [in] attribute values. + const h5_size_t nelems ///< [in] number of elements. + ) { + + H5_API_ENTER (h5_err_t, + "f=%p, field_name='%s', attrib_name='%s', " + "buffer=%p, nelems=%lld", + (h5_file_p)f, field_name, attrib_name, buffer, (long long)nelems); + H5_API_RETURN (h5b_write_field_attrib ( + f, + field_name, + attrib_name, + H5T_NATIVE_DOUBLE, + buffer, + nelems )); +} + +/*! + \ingroup h5block_attrib + \anchor H5BlockReadFieldAttribFloat64 + + Read float64 values from attribute \c attrib_name of field + \c field_name into a \c buffer. + + \return \c H5_SUCCESS or \c H5_FAILURE +*/ +static inline h5_err_t +H5BlockReadFieldAttribFloat64 ( + const h5_file_t f, ///< [in] file handle. + const char* field_name, ///< [in] field name. + const char* attrib_name, ///< [in] attribute name. + h5_float64_t* buffer ///< [out] attribute values. + ) { + + H5_API_ENTER (h5_err_t, + "f=%p, field_name='%s', attrib_name='%s', buffer=%p", + (h5_file_p)f, field_name, attrib_name, buffer); + H5_API_RETURN (h5b_read_field_attrib ( + f, + field_name, + attrib_name, + H5T_NATIVE_DOUBLE, + (void*)buffer )); +} + + +/*! + \ingroup h5block_attrib + \anchor H5BlockWriteFieldAttribFloat32 + + Write float32 \c values as attribute \c attrib_name of field + \c field_name. + + \return \c H5_SUCCESS or \c H5_FAILURE +*/ +static inline h5_err_t +H5BlockWriteFieldAttribFloat32 ( + const h5_file_t f, ///< [in] file handle. + const char* field_name, ///< [in] field name. + const char* attrib_name, ///< [in] attribute name. + const h5_float32_t* buffer, ///< [in] attribute values. + const h5_size_t nelems ///< [in] number of elements. + ) { + + H5_API_ENTER (h5_err_t, + "f=%p, field_name='%s', attrib_name='%s', " + "buffer=%p, nelems=%lld", + (h5_file_p)f, field_name, attrib_name, buffer, (long long)nelems); + H5_API_RETURN (h5b_write_field_attrib ( + f, + field_name, + attrib_name, + H5T_NATIVE_FLOAT, + buffer, + nelems )); +} + +/*! + \ingroup h5block_attrib + \anchor H5BlockReadFieldAttribFloat32 + + Read float32 values from attribute \c attrib_name of field + \c field_name into a \c buffer. + + \return \c H5_SUCCESS or \c H5_FAILURE +*/ +static inline h5_err_t +H5BlockReadFieldAttribFloat32 ( + const h5_file_t f, ///< [in] file handle. + const char* field_name, ///< [in] field name. + const char* attrib_name, ///< [in] attribute name. + h5_float32_t* const buffer ///< [out] attribute values. + ) { + + H5_API_ENTER (h5_err_t, + "f=%p, field_name='%s', attrib_name='%s', buffer=%p", + (h5_file_p)f, field_name, attrib_name, buffer); + H5_API_RETURN (h5b_read_field_attrib ( + f, + field_name, + attrib_name, + H5T_NATIVE_FLOAT, + buffer )); +} + +/*! + \ingroup h5block_attrib + \anchor H5BlockWriteFieldAttribInt64 + + Write int64 \c values as attribute \c attrib_name of field + \c field_name. + + \return \c H5_SUCCESS or \c H5_FAILURE +*/ +static inline h5_err_t +H5BlockWriteFieldAttribInt64 ( + const h5_file_t f, ///< [in] file handle. + const char* field_name, ///< [in] field name. + const char* attrib_name, ///< [in] attribute name. + const h5_int64_t* buffer, ///< [in] attribute values. + const h5_size_t nelems ///< [in] number of elements. + ) { + + H5_API_ENTER (h5_err_t, + "f=%p, field_name='%s', attrib_name='%s', buffer=%p, nelems=%lld", + (h5_file_p)f, field_name, attrib_name, buffer, (long long)nelems); + H5_API_RETURN (h5b_write_field_attrib ( + f, + field_name, + attrib_name, + H5T_NATIVE_INT64, + buffer, + nelems )); +} + +/*! + \ingroup h5block_attrib + \anchor H5BlockReadFieldAttribInt64 + + Read int64 values from attribute \c attrib_name of field + \c field_name into a \c buffer. + + \return \c H5_SUCCESS or \c H5_FAILURE +*/ +static inline h5_err_t +H5BlockReadFieldAttribInt64 ( + const h5_file_t f, ///< [in] file handle. + const char* field_name, ///< [in] field name. + const char* attrib_name, ///< [in] attribute name. + h5_int64_t* const buffer ///< [out] attribute values. + ) { + + H5_API_ENTER (h5_err_t, + "f=%p, field_name='%s', attrib_name='%s', buffer=%p", + (h5_file_p)f, field_name, attrib_name, buffer); + H5_API_RETURN (h5b_read_field_attrib ( + f, + field_name, + attrib_name, + H5T_NATIVE_INT64, + buffer )); +} + + +/*! + \ingroup h5block_attrib + \anchor H5BlockWriteFieldAttribInt32 + + Write int32 \c values as attribute \c attrib_name of field + \c field_name. + + \return \c H5_SUCCESS or \c H5_FAILURE +*/ +static inline h5_err_t +H5BlockWriteFieldAttribInt32 ( + const h5_file_t f, ///< [in] file handle. + const char* field_name, ///< [in] field name. + const char* attrib_name, ///< [in] attribute name. + const h5_int32_t* buffer, ///< [in] attribute values. + const h5_size_t nelems ///< [in] number of elements. + ) { + + H5_API_ENTER (h5_err_t, + "f=%p, field_name='%s', attrib_name='%s', " + "buffer=%p, nelems=%lld", + (h5_file_p)f, field_name, attrib_name, buffer, (long long)nelems); + H5_API_RETURN (h5b_write_field_attrib ( + f, + field_name, + attrib_name, + H5T_NATIVE_INT32, + buffer, + nelems )); +} + +/*! + \ingroup h5block_attrib + \anchor H5BlockReadFieldAttribInt32 + + Read int32 values from attribute \c attrib_name of field + \c field_name into a \c buffer. + + \return \c H5_SUCCESS or \c H5_FAILURE +*/ +static inline h5_err_t +H5BlockReadFieldAttribInt32 ( + const h5_file_t f, ///< [in] file handle. + const char* field_name, ///< [in] field name. + const char* attrib_name, ///< [in] attribute name. + h5_int32_t* buffer ///< [out] attribute values. + ) { + H5_API_ENTER (h5_err_t, + "f=%p, field_name='%s', attrib_name='%s', buffer=%p", + (h5_file_p)f, field_name, attrib_name, buffer); + H5_API_RETURN (h5b_read_field_attrib ( + f, + field_name, + attrib_name, + H5T_NATIVE_INT32, + (void*)buffer )); +} + +/* + :TODO: move macros to private include file +*/ +#define H5BLOCK_FIELD_ORIGIN_NAME "__Origin__" +#define H5BLOCK_FIELD_SPACING_NAME "__Spacing__" +#define H5BLOCK_FIELD_XCOORD_NAME "__X_Coordinates__" +#define H5BLOCK_FIELD_YCOORD_NAME "__Y_Coordinates__" +#define H5BLOCK_FIELD_ZCOORD_NAME "__Z_Coordinates__" + + +/*! + \ingroup h5block_attrib + \anchor H5Block3dGetFieldOrigin + + Get field origin. + + \return \c H5_SUCCESS or \c H5_FAILURE +*/ +static inline h5_err_t +H5Block3dGetFieldOrigin ( + const h5_file_t f, ///< [in] file handle. + const char* field_name, ///< [in] field name. + h5_float64_t* x_origin, ///< [out] X origin. + h5_float64_t* y_origin, ///< [out] Y origin. + h5_float64_t* z_origin ///< [out] Z origin. + ) { + H5_API_ENTER (h5_err_t, + "f=%p, field_name='%s', x_origin=%p, y_origin=%p, z_origin=%p", + (h5_file_p)f, field_name, x_origin, y_origin, z_origin); + h5_float64_t origin[3]; + + TRY (h5b_read_field_attrib ( + f, + field_name, + H5BLOCK_FIELD_ORIGIN_NAME, + H5_FLOAT64_T, + origin)); + + *x_origin = origin[0]; + *y_origin = origin[1]; + *z_origin = origin[2]; + + H5_API_RETURN (H5_SUCCESS); +} + +/*! + \ingroup h5block_attrib + \anchor H5Block3dSetFieldOrigin + + Set field origin. + + \return \c H5_SUCCESS or \c H5_FAILURE +*/ +static inline h5_err_t +H5Block3dSetFieldOrigin ( + const h5_file_t f, ///< [in] file handle. + const char* field_name, ///< [in] field name. + const h5_float64_t x_origin, ///< [in] X origin. + const h5_float64_t y_origin, ///< [in] Y origin. + const h5_float64_t z_origin ///< [in] Z origin. + ) { + H5_API_ENTER (h5_err_t, + "f=%p, field_name='%s', x_origin=%g, y_origin=%g, z_origin=%g", + (h5_file_p)f, field_name, x_origin, y_origin, z_origin); + h5_float64_t origin[3] = { x_origin, y_origin, z_origin }; + H5_API_RETURN (h5b_write_field_attrib ( + f, + field_name, + H5BLOCK_FIELD_ORIGIN_NAME, + (hid_t)H5_FLOAT64_T, + origin, + 3)); +} + +/*! + \ingroup h5block_attrib + \anchor H5Block3dGetFieldSpacing + + Get field spacing for field \c field_name in the current time step. + + \return \c H5_SUCCESS or \c H5_FAILURE +*/ +static inline h5_err_t +H5Block3dGetFieldSpacing ( + const h5_file_t f, ///< [in] file handle. + const char* field_name, ///< [in] field name. + h5_float64_t* x_spacing, ///< [out] X spacing. + h5_float64_t* y_spacing, ///< [out] Y spacing. + h5_float64_t* z_spacing ///< [out] Z spacing. + ) { + H5_API_ENTER (h5_err_t, + "f=%p, field_name='%s', " + "x_spacing=%p, y_spacing=%p, z_spacing=%p", + (h5_file_p)f, field_name, x_spacing, y_spacing, z_spacing); + h5_float64_t spacing[3]; + TRY (h5b_read_field_attrib ( + f, + field_name, + H5BLOCK_FIELD_SPACING_NAME, + H5_FLOAT64_T, + spacing)); + *x_spacing = spacing[0]; + *y_spacing = spacing[1]; + *z_spacing = spacing[2]; + H5_API_RETURN (H5_SUCCESS); +} + +/*! + \ingroup h5block_attrib + \anchor H5Block3dSetFieldSpacing + + Set field spacing for field \c field_name in the current time step. + + \return \c H5_SUCCESS or \c H5_FAILURE +*/ +static inline h5_err_t +H5Block3dSetFieldSpacing ( + const h5_file_t f, ///< [in] file handle. + const char* field_name, ///< [in] field name. + const h5_float64_t x_spacing, ///< [in] X spacing. + const h5_float64_t y_spacing, ///< [in] Y spacing. + const h5_float64_t z_spacing ///< [in] Z spacing. + ) { + H5_API_ENTER (h5_err_t, + "f=%p, field_name='%s', x_spacing=%g, y_spacing=%g, z_spacing=%g", + (h5_file_p)f, field_name, x_spacing, y_spacing, z_spacing); + h5_float64_t spacing[3] = { x_spacing, y_spacing, z_spacing }; + H5_API_RETURN (h5b_write_field_attrib ( + f, + field_name, + H5BLOCK_FIELD_SPACING_NAME, + (hid_t)H5_FLOAT64_T, + spacing, + 3)); +} + +/*! + \ingroup h5block_attrib + \anchor H5Block3dSetFieldXCoords + + Set an explicit list of X coordinates for field \c field_name in the current + time step. The coordinates are a 1D array of floating point values with + dimension \c n_coords. + + By convention, the \c coords array should have the same length as the X + dimension of the field, and a warning will be printed if not. + + \return \c H5_SUCCESS or \c H5_FAILURE +*/ +static inline h5_err_t +H5Block3dSetFieldXCoords ( + const h5_file_t f, ///< [in] file handle + const char* field_name, ///< [in] field name + const h5_float64_t* const coords,///< [in] X coordinates + const h5_int64_t n_coords ///< [in] number of coordinates + ) { + H5_API_ENTER (h5_err_t, + "f=%p, " + "field_name='%s', " + "coords=%p, n_coords=%llu", + (h5_file_p)f, + field_name, + coords, (long long unsigned)n_coords); + H5_API_RETURN (h5b_set_3d_field_coords ( + f, 0, field_name, H5BLOCK_FIELD_XCOORD_NAME, + coords, n_coords)); +} + + +/*! + \ingroup h5block_attrib + \anchor H5Block3dGetFieldXCoords + + Get the explicit list of X coordinates for field \c field_name in the current + time step. The coordinates are read into the 1D array \c coords which has + length \c n_coords. + + By convention, the \c coords array should have the same length as the X + dimension of the field, and a warning will be printed if they differ. + + \return \c H5_SUCCESS or \c H5_FAILURE +*/ +static inline h5_err_t +H5Block3dGetFieldXCoords ( + const h5_file_t f, ///< [in] file handle + const char* field_name, ///< [in] field name + h5_float64_t* const coords, ///< [in] X coordinates + const h5_int64_t n_coords ///< [in] number of coordinates + ) { + H5_API_ENTER (h5_err_t, + "f=%p, " + "field_name='%s', " + "coords=%p, n_coords=%llu", + (h5_file_p)f, + field_name, + coords, (long long unsigned)n_coords); + H5_API_RETURN (h5b_get_3d_field_coords ( + f, 0, field_name, H5BLOCK_FIELD_XCOORD_NAME, + coords, n_coords)); +} + +/*! + \ingroup h5block_attrib + \anchor H5Block3dSetFieldYCoords + + Set an explicit list of Y coordinates for field \c field_name in the current + time step. The coordinates are a 1D array of floating point values with + dimension \c n_coords. + + By convention, the \c coords array should have the same length as the Y + dimension of the field, and a warning will be printed if not. + + \return \c H5_SUCCESS or \c H5_FAILURE +*/ +static inline h5_err_t +H5Block3dSetFieldYCoords ( + const h5_file_t f, ///< [in] file handle + const char* field_name, ///< [in] field name + const h5_float64_t* const coords,///< [in] X coordinates + const h5_int64_t n_coords ///< [in] number of coordinates + ) { + H5_API_ENTER (h5_err_t, + "f=%p, " + "field_name='%s', " + "coords=%p, n_coords=%llu", + (h5_file_p)f, + field_name, + coords, (long long unsigned)n_coords); + H5_API_RETURN (h5b_set_3d_field_coords ( + f, 1, field_name, H5BLOCK_FIELD_YCOORD_NAME, + coords, n_coords)); +} + + +/*! + \ingroup h5block_attrib + \anchor H5Block3dGetFieldYCoords + + Get the explicit list of Y coordinates for field \c field_name in the current + time step. The coordinates are read into the 1D array \c coords which has + length \c n_coords. + + By convention, the \c coords array should have the same length as the Y + dimension of the field, and a warning will be printed if they differ. + + \return \c H5_SUCCESS or \c H5_FAILURE +*/ +static inline h5_err_t +H5Block3dGetFieldYCoords ( + const h5_file_t f, ///< [in] file handle + const char* field_name, ///< [in] field name + h5_float64_t* const coords, ///< [in] Y coordinates + const h5_int64_t n_coords ///< [in] number of coordinates + ) { + H5_API_ENTER (h5_err_t, + "f=%p, " + "field_name='%s', " + "coords=%p, n_coords=%llu", + (h5_file_p)f, + field_name, + coords, (long long unsigned)n_coords); + H5_API_RETURN (h5b_get_3d_field_coords ( + f, 1, field_name, H5BLOCK_FIELD_YCOORD_NAME, + coords, n_coords)); +} + +/*! + \ingroup h5block_attrib + \anchor H5Block3dSetFieldZCoords + + Set an explicit list of Z coordinates for field \c field_name in the current + time step. The coordinates are a 1D array of floating point values with + dimension \c n_coords. + + By convention, the \c coords array should have the same length as the Z + dimension of the field, and a warning will be printed if not. + + \return \c H5_SUCCESS or \c H5_FAILURE +*/ +static inline h5_err_t +H5Block3dSetFieldZCoords ( + const h5_file_t f, ///< [in] file handle + const char* field_name, ///< [in] field name + const h5_float64_t* const coords,///< [in] Z coordinates + const h5_int64_t n_coords ///< [in] number of coordinates + ) { + H5_API_ENTER (h5_err_t, + "f=%p, " + "field_name='%s', " + "coords=%p, n_coords=%llu", + (h5_file_p)f, + field_name, + coords, (long long unsigned)n_coords); + H5_API_RETURN (h5b_set_3d_field_coords ( + f, 2, field_name, H5BLOCK_FIELD_ZCOORD_NAME, + coords, n_coords)); +} + + +/*! + \ingroup h5block_attrib + \anchor H5Block3dGetFieldZCoords + + Get the explicit list of Z coordinates for field \c field_name in the current + time step. The coordinates are read into the 1D array \c coords which has + length \c n_coords. + + By convention, the \c coords array should have the same length as the Z + dimension of the field, and a warning will be printed if they differ. + + \return \c H5_SUCCESS or \c H5_FAILURE +*/ +static inline h5_err_t +H5Block3dGetFieldZCoords ( + const h5_file_t f, ///< [in] file handle + const char* field_name, ///< [in] field name + h5_float64_t* const coords, ///< [in] Z coordinates + const h5_int64_t n_coords ///< [in] number of coordinates + ) { + H5_API_ENTER (h5_err_t, + "f=%p, " + "field_name='%s', " + "coords=%p, n_coords=%llu", + (h5_file_p)f, + field_name, + coords, (long long unsigned)n_coords); + H5_API_RETURN (h5b_get_3d_field_coords ( + f, 2, field_name, H5BLOCK_FIELD_ZCOORD_NAME, + coords, n_coords)); +} + +#ifdef __cplusplus +} +#endif + +#endif diff --git a/src/include/H5Block_io.h b/src/include/H5Block_io.h new file mode 100644 index 0000000..ff5018e --- /dev/null +++ b/src/include/H5Block_io.h @@ -0,0 +1,464 @@ +/* + Copyright (c) 2006-2013, The Regents of the University of California, + through Lawrence Berkeley National Laboratory (subject to receipt of any + required approvals from the U.S. Dept. of Energy) and the Paul Scherrer + Institut (Switzerland). All rights reserved. + + License: see file COPYING in top level of source distribution. +*/ + +#ifndef __H5BLOCK_IO_H +#define __H5BLOCK_IO_H + +#include "h5core/h5_types.h" +#include "h5core/h5.h" +#include "h5core/h5_debug.h" +#include "h5core/h5b_io.h" + +#ifdef __cplusplus +extern "C" { +#endif + +/*! + \ingroup h5block_io + \anchor H5Block3dWriteScalarFieldFloat64 + + Write a 3-dimensional field \c name from the buffer starting at \c data + to the current time-step using the defined field layout. Values are + floating points (64-bit). + + You must use the Fortran indexing scheme to access items in \c data. + + \return \c H5_SUCCESS or \c H5_FAILURE +*/ +static inline h5_err_t +H5Block3dWriteScalarFieldFloat64 ( + const h5_file_t f, ///< [in] file handle. + const char* name, ///< [in] name of dataset to write. + const h5_float64_t* buffer ///< [in] pointer to write buffer. + ) { + + H5_API_ENTER (h5_err_t, + "f=%p, name='%s', buffer=%p", + (h5_file_p)f, name, buffer); + H5_API_RETURN (h5b_write_scalar_data(f, name, (void*)buffer, H5T_NATIVE_DOUBLE )); +} + +/*! + \ingroup h5block_io + \anchor H5Block3dReadScalarFieldFloat64 + + Read a 3-dimensional field \c name into the buffer starting at \c data from + the current time-step using the defined field layout. Values are + floating points (64-bit). + + You must use the Fortran indexing scheme to access items in \c data. + + \return \c H5_SUCCESS or \c H5_FAILURE +*/ +static inline h5_err_t +H5Block3dReadScalarFieldFloat64 ( + const h5_file_t f, ///< [in] file handle. + const char* name, ///< [in] name of dataset to read. + h5_float64_t* buffer ///< [out] pointer to read buffer. + ) { + + H5_API_ENTER (h5_err_t, + "f=%p, name='%s', buffer=%p", + (h5_file_p)f, name, buffer); + H5_API_RETURN (h5b_read_scalar_data(f, name, (void*)buffer, H5T_NATIVE_DOUBLE)); +} + +/*! + \ingroup h5block_io + \anchor H5Block3dWriteVector3dFieldFloat64 + + Write a 3-dimensional field \c name with 3-dimensional vectors as values + from the buffers starting at \c x_buf, \c y_buf and \c z_buf to the + current time-step using the defined field layout. Values are 3-dimensional + vectors with floating points (64-bit) values. + + You must use the Fortran indexing scheme to access items in \c x_buf. + + \return \c H5_SUCCESS or \c H5_FAILURE +*/ +static inline h5_err_t +H5Block3dWriteVector3dFieldFloat64 ( + const h5_file_t f, ///< [in] file handle. + const char* name, ///< [in] name of dataset to write. + const h5_float64_t* x_buf, ///< [in] pointer to X axis buffer. + const h5_float64_t* y_buf, ///< [in] pointer to Y axis buffer. + const h5_float64_t* z_buf ///< [in] pointer to Z axis buffer. + ) { + + H5_API_ENTER (h5_err_t, + "f=%p, name='%s', x_buf=%p, y_buf=%p, z_buf=%p", + (h5_file_p)f, name, x_buf, y_buf, z_buf); + H5_API_RETURN(h5b_write_vector3d_data(f, name, + (void*)x_buf, (void*)y_buf, (void*)z_buf, H5T_NATIVE_DOUBLE)); +} + +/*! + \ingroup h5block_io + \anchor H5Block3dReadVector3dFieldFloat64 + + Read a 3-dimensional field \c name with 3-dimensional vectors as values + from the buffers starting at \c x_buf, \c y_buf and \c z_buf to the + current time-step using the defined field layout. Values are 3-dimensional + vectors with floating points (64-bit) values. + + You must use the Fortran indexing scheme to access items in \c data. + + \return \c H5_SUCCESS or \c H5_FAILURE +*/ +static inline h5_err_t +H5Block3dReadVector3dFieldFloat64 ( + const h5_file_t f, ///< [in] file handle. + const char* name, ///< [in] name of dataset to write. + h5_float64_t* const x_buf, ///< [out] pointer to X axis buffer. + h5_float64_t* const y_buf, ///< [out] pointer to Y axis buffer. + h5_float64_t* const z_buf ///< [out] pointer to Z axis buffer. + ) { + + H5_API_ENTER (h5_err_t, + "f=%p, name='%s', x_buf=%p, y_buf=%p, z_buf=%p", + (h5_file_p)f, name, x_buf, y_buf, z_buf); + H5_API_RETURN(h5b_read_vector3d_data(f, name, + x_buf, y_buf, z_buf, H5T_NATIVE_DOUBLE)); +} + + +/*! + \ingroup h5block_io + \anchor H5Block3dWriteScalarFieldFloat32 + + Write a 3-dimensional field \c name from the buffer starting at \c data + to the current time-step using the defined field layout. Values are + floating points (32-bit). + + You must use the Fortran indexing scheme to access items in \c data. + + \return \c H5_SUCCESS or \c H5_FAILURE +*/ +static inline h5_err_t +H5Block3dWriteScalarFieldFloat32 ( + const h5_file_t f, ///< [in] file handle. + const char* name, ///< [in] name of dataset to write. + const h5_float32_t* buffer ///< [in] pointer to write buffer. + ) { + + H5_API_ENTER (h5_err_t, + "f=%p, name='%s', buffer=%p", + (h5_file_p)f, name, buffer); + H5_API_RETURN (h5b_write_scalar_data(f, name, buffer, H5T_NATIVE_FLOAT )); +} + +/*! + \ingroup h5block_io + \anchor H5Block3dReadScalarFieldFloat32 + + Read a 3-dimensional field \c name into the buffer starting at \c data from + the current time-step using the defined field layout. Values are + floating points (32-bit). + + You must use the Fortran indexing scheme to access items in \c data. + + \return \c H5_SUCCESS or \c H5_FAILURE +*/ +static inline h5_err_t +H5Block3dReadScalarFieldFloat32 ( + const h5_file_t f, ///< [in] file handle. + const char* name, ///< [in] name of dataset to read. + h5_float32_t* const buffer ///< [out] pointer to read buffer. + ) { + + H5_API_ENTER (h5_err_t, + "f=%p, name='%s', buffer=%p", + (h5_file_p)f, name, buffer); + H5_API_RETURN (h5b_read_scalar_data(f, name, buffer, H5T_NATIVE_FLOAT)); +} + +/*! + \ingroup h5block_io + \anchor H5Block3dWriteVector3dFieldFloat32 + + Write a 3-dimensional field \c name with 3-dimensional vectors as values + from the buffers starting at \c x_buf, \c y_buf and \c z_buf to the + current time-step using the defined field layout. Values are 3-dimensional + vectors with floating points (32-bit) values. + + You must use the Fortran indexing scheme to access items in \c x_buf. + + \return \c H5_SUCCESS or \c H5_FAILURE +*/ +static inline h5_err_t +H5Block3dWriteVector3dFieldFloat32 ( + const h5_file_t f, ///< [in] file handle. + const char* name, ///< [in] name of dataset to write. + const h5_float32_t* x_buf, ///< [in] pointer to X axis buffer. + const h5_float32_t* y_buf, ///< [in] pointer to Y axis buffer. + const h5_float32_t* z_buf ///< [in] pointer to Z axis buffer. + ) { + + H5_API_ENTER (h5_err_t, + "f=%p, name='%s', x_buf=%p, y_buf=%p, z_buf=%p", + (h5_file_p)f, name, x_buf, y_buf, z_buf); + H5_API_RETURN(h5b_write_vector3d_data(f, name, + x_buf, y_buf, z_buf, H5T_NATIVE_FLOAT)); +} + +/*! + \ingroup h5block_io + \anchor H5Block3dReadVector3dFieldFloat32 + + Read a 3-dimensional field \c name with 3-dimensional vectors as values + from the buffers starting at \c x_buf, \c y_buf and \c z_buf to the + current time-step using the defined field layout. Values are 3-dimensional + vectors with floating points (32-bit) values. + + You must use the Fortran indexing scheme to access items in \c data. + + \return \c H5_SUCCESS or \c H5_FAILURE +*/ +static inline h5_err_t +H5Block3dReadVector3dFieldFloat32 ( + const h5_file_t f, ///< [in] file handle. + const char* name, ///< [in] name of dataset to write. + h5_float32_t* const x_buf, ///< [out] pointer to X axis buffer. + h5_float32_t* const y_buf, ///< [out] pointer to Y axis buffer. + h5_float32_t* const z_buf ///< [out] pointer to Z axis buffer. + ) { + + H5_API_ENTER (h5_err_t, + "f=%p, name='%s', x_buf=%p, y_buf=%p, z_buf=%p", + (h5_file_p)f, name, x_buf, y_buf, z_buf); + H5_API_RETURN(h5b_read_vector3d_data(f, name, + x_buf, y_buf, z_buf, H5T_NATIVE_FLOAT)); +} + + +/*! + \ingroup h5block_io + \anchor H5Block3dWriteScalarFieldInt64 + + Write a 3-dimensional field \c name from the buffer starting at \c data + to the current time-step using the defined field layout. Values are + integers (64-bit). + + You must use the Fortran indexing scheme to access items in \c data. + + \return \c H5_SUCCESS or \c H5_FAILURE +*/ +static inline h5_err_t +H5Block3dWriteScalarFieldInt64 ( + const h5_file_t f, ///< [in] file handle. + const char* name, ///< [in] name of dataset to write. + const h5_int64_t* buffer ///< [in] pointer to write buffer. + ) { + + H5_API_ENTER (h5_err_t, + "f=%p, name='%s', buffer=%p", + (h5_file_p)f, name, buffer); + H5_API_RETURN (h5b_write_scalar_data(f, name, buffer, H5T_NATIVE_INT64 )); +} + +/*! + \ingroup h5block_io + \anchor H5Block3dReadScalarFieldInt64 + + Read a 3-dimensional field \c name into the buffer starting at \c data from + the current time-step using the defined field layout. Values are + integers (64-bit). + + You must use the Fortran indexing scheme to access items in \c data. + + \return \c H5_SUCCESS or \c H5_FAILURE +*/ +static inline h5_err_t +H5Block3dReadScalarFieldInt64 ( + const h5_file_t f, ///< [in] file handle. + const char* name, ///< [in] name of dataset to read. + h5_int64_t* const buffer ///< [out] pointer to read buffer. + ) { + + H5_API_ENTER (h5_err_t, + "f=%p, name='%s', buffer=%p", + (h5_file_p)f, name, buffer); + H5_API_RETURN (h5b_read_scalar_data(f, name, buffer, H5T_NATIVE_INT64)); +} + + +/*! + \ingroup h5block_io + \anchor H5Block3dWriteVector3dFieldInt64 + + Write a 3-dimensional field \c name with 3-dimensional vectors as values + from the buffers starting at \c x_buf, \c y_buf and \c z_buf to the + current time-step using the defined field layout. Values are 3-dimensional + vectors with integers (64-bit) values. + + You must use the Fortran indexing scheme to access items in \c x_buf. + + \return \c H5_SUCCESS or \c H5_FAILURE +*/ +static inline h5_err_t +H5Block3dWriteVector3dFieldInt64 ( + const h5_file_t f, ///< [in] file handle. + const char* name, ///< [in] name of dataset to write. + const h5_int64_t* x_buf, ///< [in] pointer to X axis buffer. + const h5_int64_t* y_buf, ///< [in] pointer to Y axis buffer. + const h5_int64_t* z_buf ///< [in] pointer to Z axis buffer. + ) { + + H5_API_ENTER (h5_err_t, + "f=%p, name='%s', x_buf=%p, y_buf=%p, z_buf=%p", + (h5_file_p)f, name, x_buf, y_buf, z_buf); + H5_API_RETURN (h5b_write_vector3d_data(f, name, + x_buf, y_buf, z_buf, H5T_NATIVE_INT64)); +} + +/*! + \ingroup h5block_io + \anchor H5Block3dReadVector3dFieldInt64 + + Read a 3-dimensional field \c name with 3-dimensional vectors as values + from the buffers starting at \c x_buf, \c y_buf and \c z_buf to the + current time-step using the defined field layout. Values are 3-dimensional + vectors with integers (64-bit) values. + + You must use the Fortran indexing scheme to access items in \c data. + + \return \c H5_SUCCESS or \c H5_FAILURE +*/ +static inline h5_err_t +H5Block3dReadVector3dFieldInt64 ( + const h5_file_t f, ///< [in] file handle. + const char* name, ///< [in] name of dataset to write. + h5_int64_t* const x_buf, ///< [out] pointer to X axis buffer. + h5_int64_t* const y_buf, ///< [out] pointer to Y axis buffer. + h5_int64_t* const z_buf ///< [out] pointer to Z axis buffer. + ) { + + H5_API_ENTER (h5_err_t, + "f=%p, name='%s', x_buf=%p, y_buf=%p, z_buf=%p", + (h5_file_p)f, name, x_buf, y_buf, z_buf); + H5_API_RETURN (h5b_read_vector3d_data(f, name, + x_buf, y_buf, z_buf, H5T_NATIVE_INT64)); +} + + +/*! + \ingroup h5block_io + \anchor H5Block3dWriteScalarFieldInt32 + + Write a 3-dimensional field \c name from the buffer starting at \c data + to the current time-step using the defined field layout. Values are + integers (32-bit). + + You must use the Fortran indexing scheme to access items in \c data. + + \return \c H5_SUCCESS or \c H5_FAILURE +*/ +static inline h5_err_t +H5Block3dWriteScalarFieldInt32 ( + const h5_file_t f, ///< [in] file handle. + const char* name, ///< [in] name of dataset to write. + const h5_int32_t* buffer ///< [in] pointer to write buffer. + ) { + + H5_API_ENTER (h5_err_t, + "f=%p, name='%s', buffer=%p", + (h5_file_p)f, name, buffer); + H5_API_RETURN (h5b_write_scalar_data(f, name, buffer, H5T_NATIVE_INT32 )); +} + +/*! + \ingroup h5block_io + \anchor H5Block3dReadScalarFieldInt32 + + Read a 3-dimensional field \c name into the buffer starting at \c data from + the current time-step using the defined field layout. Values are + integers (32-bit). + + You must use the Fortran indexing scheme to access items in \c data. + + \return \c H5_SUCCESS or \c H5_FAILURE +*/ +static inline h5_err_t +H5Block3dReadScalarFieldInt32 ( + const h5_file_t f, ///< [in] file handle. + const char* name, ///< [in] name of dataset to read. + h5_int32_t* const buffer ///< [out] pointer to read buffer. + ) { + + H5_API_ENTER (h5_err_t, + "f=%p, name='%s', buffer=%p", + (h5_file_p)f, name, buffer); + H5_API_RETURN (h5b_read_scalar_data(f, name, buffer, H5T_NATIVE_INT32)); +} + + +/*! + \ingroup h5block_io + \anchor H5Block3dWriteVector3dFieldInt32 + + Write a 3-dimensional field \c name with 3-dimensional vectors as values + from the buffers starting at \c x_buf, \c y_buf and \c z_buf to the + current time-step using the defined field layout. Values are 3-dimensional + vectors with integers (32-bit) values. + + You must use the Fortran indexing scheme to access items in \c x_buf. + + \return \c H5_SUCCESS or \c H5_FAILURE +*/ +static inline h5_err_t +H5Block3dWriteVector3dFieldInt32 ( + const h5_file_t f, ///< [in] file handle. + const char* name, ///< [in] name of dataset to write. + const h5_int32_t* x_buf, ///< [in] pointer to X axis buffer. + const h5_int32_t* y_buf, ///< [in] pointer to Y axis buffer. + const h5_int32_t* z_buf ///< [in] pointer to Z axis buffer. + ) { + + H5_API_ENTER (h5_err_t, + "f=%p, name='%s', x_buf=%p, y_buf=%p, z_buf=%p", + (h5_file_p)f, name, x_buf, y_buf, z_buf); + H5_API_RETURN(h5b_write_vector3d_data(f, name, + x_buf, y_buf, z_buf, H5T_NATIVE_INT32)); +} + +/*! + \ingroup h5block_io + \anchor H5Block3dReadVector3dFieldInt32 + + Read a 3-dimensional field \c name with 3-dimensional vectors as values + from the buffers starting at \c x_buf, \c y_buf and \c z_buf to the + current time-step using the defined field layout. Values are 3-dimensional + vectors with integers (32-bit) values. + + You must use the Fortran indexing scheme to access items in \c data. + + \return \c H5_SUCCESS or \c H5_FAILURE +*/ +static inline h5_err_t +H5Block3dReadVector3dFieldInt32 ( + const h5_file_t f, ///< [in] file handle. + const char* name, ///< [in] name of dataset to write. + h5_int32_t* const x_buf, ///< [out] pointer to X axis buffer. + h5_int32_t* const y_buf, ///< [out] pointer to Y axis buffer. + h5_int32_t* const z_buf ///< [out] pointer to Z axis buffer. + ) { + + H5_API_ENTER (h5_err_t, + "f=%p, name='%s', x_buf=%p, y_buf=%p, z_buf=%p", + (h5_file_p)f, name, x_buf, y_buf, z_buf); + H5_API_RETURN(h5b_read_vector3d_data(f, name, + x_buf, y_buf, z_buf, H5T_NATIVE_INT32)); +} + + +#ifdef __cplusplus +} +#endif + +#endif diff --git a/src/include/H5Block_model.h b/src/include/H5Block_model.h new file mode 100644 index 0000000..5d1aeba --- /dev/null +++ b/src/include/H5Block_model.h @@ -0,0 +1,425 @@ +/* + Copyright (c) 2006-2013, The Regents of the University of California, + through Lawrence Berkeley National Laboratory (subject to receipt of any + required approvals from the U.S. Dept. of Energy) and the Paul Scherrer + Institut (Switzerland). All rights reserved. + + License: see file COPYING in top level of source distribution. +*/ + +#ifndef __H5BLOCK_MODEL +#define __H5BLOCK_MODEL + +#include "h5core/h5_types.h" +#include "h5core/h5.h" +#include "h5core/h5_debug.h" +#include "h5core/h5b_model.h" + +#ifdef __cplusplus +extern "C" { +#endif + +/********************** defining the layout **********************************/ + +/*! + \ingroup h5block_model + \anchor H5BlockHasFieldData + + Checks whether the current time-step has field data or not. + + \return \c H5_SUCCESS if field data is available otherwise \c + H5_NOK. +*/ +static inline h5_err_t +H5BlockHasFieldData ( + const h5_file_t f ///< [in] file handle + ) { + H5_API_ENTER (h5_err_t, + "f=%p, ", + (h5_file_p)f); + H5_API_RETURN (h5b_has_field_data (f)); +} + +/*! + \ingroup h5block_model + \anchor H5Block3dHasView + + Tests whether a view has been set, either directly with + \ref H5Block3dSetView or indirectly with \ref H5Block3dSetGrid. + + \return \c 1 on true. + \return \c 0 on false. +*/ +static inline h5_int64_t +H5Block3dHasView ( + const h5_file_t f ///< [in] File handle */ + ) { + H5_API_ENTER (h5_int64_t, + "f=%p", + (h5_file_p)f); + H5_API_RETURN (h5b_3d_has_view (f)); +} + +/*! + \ingroup h5block_model + \anchor H5Block3dSetView + + Defines the partition of the field that this processor owns, using + Fortran ordering: the fastest moving index is \c i. + + This routine uses an MPI_Allgather, so at large concurrency it should + be called as infrequently as possible. For instance, if several timesteps + use the same field dimensions, set the layout only once before the + first timestep. + + \return \c H5_SUCCESS or \c H5_FAILURE +*/ +static inline h5_err_t +H5Block3dSetView ( + const h5_file_t f, ///< [in] File handle. + const h5_int64_t i_start, ///< [in] start index of \c i + const h5_int64_t i_end, ///< [in] end index of \c i + const h5_int64_t j_start, ///< [in] start index of \c j + const h5_int64_t j_end, ///< [in] end index of \c j + const h5_int64_t k_start, ///< [in] start index of \c k + const h5_int64_t k_end ///< [in] end index of \c k + ) { + H5_API_ENTER (h5_err_t, + "f=%p, " + "i_start=%lld, i_end=%lld, " + "j_start=%lld, j_end=%lld, " + "k_start=%lld, k_end=%lld", + (h5_file_p)f, + (long long)i_start, (long long)i_end, + (long long)j_start, (long long)j_end, + (long long)k_start, (long long)k_end); + H5_API_RETURN (h5b_3d_set_view (f, + i_start, i_end, + j_start, j_end, + k_start, k_end)); +} + +/*! + \ingroup h5block_model + \anchor H5Block3dGetView + Return the view of this processor. + + \return \c H5_SUCCESS or \c H5_FAILURE +*/ +static inline h5_err_t +H5Block3dGetView ( + const h5_file_t f, ///< [in] File handle. + h5_size_t* i_start, ///< [out] start index of \c i + h5_size_t* i_end, ///< [out] end index of \c i + h5_size_t* j_start, ///< [out] start index of \c j + h5_size_t* j_end, ///< [out] end index of \c j + h5_size_t* k_start, ///< [out] start index of \c k + h5_size_t* k_end ///< [out] end index of \c k + ) { + H5_API_ENTER (h5_err_t, + "f=%p, " + "i_start=%p, i_end=%p, " + "j_start=%p, j_end=%p, " + "k_start=%p, k_end=%p", + (h5_file_p)f, + i_start, i_end, + j_start, j_end, + k_start, k_end); + H5_API_RETURN (h5b_3d_get_view (f, i_start, i_end, j_start, j_end, k_start, k_end)); +} + +/*! + \ingroup h5block_model + \anchor H5Block3dGetReducedView + + Return the reduced (ghost-zone free) view of this processor. + + \return \c H5_SUCCESS or \c H5_FAILURE +*/ +static inline h5_err_t +H5Block3dGetReducedView ( + const h5_file_t f, ///< [in] file handle. + h5_size_t* const i_start, ///< [out] start index of \c i + h5_size_t* const i_end, ///< [out] end index of \c i + h5_size_t* const j_start, ///< [out] start index of \c j + h5_size_t* const j_end, ///< [out] end index of \c j + h5_size_t* const k_start, ///< [out] start index of \c j + h5_size_t* const k_end ///< [out] end index of \c j + ) { + H5_API_ENTER (h5_err_t, + "f=%p, " + "i_start=%p, i_end=%p, " + "j_start=%p, j_end=%p, " + "k_start=%p, k_end=%p", + (h5_file_p)f, + i_start, i_end, + j_start, j_end, + k_start, k_end); + H5_API_RETURN (h5b_3d_get_reduced_view(f, i_start, i_end, j_start, j_end, k_start, k_end)); +} + +/*! + \ingroup h5block_model + \anchor H5Block3dSetChunkSize + + Define the chunk dimensions and enable chunking in the underlying + HDF5 dataset. + + \return \c H5_SUCCESS or \c H5_FAILURE +*/ +static inline h5_err_t +H5Block3dSetChunkSize ( + const h5_file_t f, ///< [in] file handle. + const h5_size_t i, ///< [in] size of \c i + const h5_size_t j, ///< [in] size of \c j + const h5_size_t k ///< [in] size of \c k + ) { + H5_API_ENTER (h5_err_t, + "f=%p, i=%llu, j=%llu, k=%llu", + (h5_file_p)f, + (long long unsigned)i, + (long long unsigned)j, + (long long unsigned)k); + H5_API_RETURN (h5b_3d_set_chunk(f, i, j, k)); +} + +/*! + \ingroup h5block_model + \anchor H5Block3dGetChunkSize + + Lookup the chunk dimensions of the underlying HDF5 dataset. + + \return \c H5_SUCCESS or \c H5_FAILURE +*/ +static inline h5_err_t +H5Block3dGetChunkSize ( + const h5_file_t f, ///< [in] file handle. + const char* field_name, ///< [in] name of dataset + h5_size_t* const i, ///< [out] size of \c i + h5_size_t* const j, ///< [out] size of \c j + h5_size_t* const k ///< [out] size of \c k + ) { + H5_API_ENTER (h5_err_t, + "f=%p, i=%p, j=%p, k=%p", + (h5_file_p)f, i, j, k); + H5_API_RETURN (h5b_3d_get_chunk(f, field_name, i, j, k)); +} + +#ifdef PARALLEL_IO +/*! + \ingroup h5block_model + \anchor H5Block3dSetGrid + + Define an underlying 3D Cartesian grid on the processors with dimensions + (\c i,\c j,\c k). You can look up a processor's index into the grid + using \ref H5Block3dGetGridCoords. + + This function can be used in conjunction with \ref H5Block3dSetDims + to setup the view for a regular grid. + + The product of the dimensions must equal the size of the MPI communicator. + + \return \c H5_SUCCESS or \c H5_FAILURE +*/ +static inline h5_err_t +H5Block3dSetGrid ( + const h5_file_t f, ///< [in] file handle. + const h5_size_t i, ///< [in] dimension in \c i + const h5_size_t j, ///< [in] dimension in \c j + const h5_size_t k ///< [in] dimension in \c k + ) { + H5_API_ENTER (h5_err_t, + "f=%p, i=%llu, j=%llu, k=%llu", + (h5_file_p)f, + (long long unsigned)i, + (long long unsigned)j, + (long long unsigned)k); + H5_API_RETURN (h5b_3d_set_grid(f, i, j, k)); +} + +/*! + \ingroup h5block_model + \anchor H5Block3dGetGridCoords + + Look up the index (\c i, \c j, \c k) in the grid belonging to MPI processor + \c proc. + + \return \c H5_SUCCESS or \c H5_FAILURE +*/ +static inline h5_err_t +H5Block3dGetGridCoords ( + const h5_file_t f, ///< [in] file handle. + const int proc, ///< [in] MPI processor + h5_int64_t* i, ///< [out] index in \c i + h5_int64_t* j, ///< [out] index in \c j + h5_int64_t* k ///< [out] index in \c k + ) { + H5_API_ENTER (h5_err_t, + "f=%p, proc=%d, i=%p, j=%p, k=%p", + (h5_file_p)f, proc, i, j, k); + H5_API_RETURN (h5b_3d_get_grid_coords(f, proc, i, j, k)); +} + +/*! + \ingroup h5block_model + \anchor H5Block3dSetDims + + Set the dimensions of each processor's block when the field is a regular + grid. + + A grid must be already set with \ref H5Block3dSetGrid, and all processors + must specify the same dimensions. + + \return \c H5_SUCCESS or \c H5_FAILURE +*/ +static inline h5_err_t +H5Block3dSetDims ( + const h5_file_t f, ///< [in] file handle. + const h5_size_t i, ///< [in] dimension in \c i + const h5_size_t j, ///< [in] dimension in \c j + const h5_size_t k ///< [in] dimension in \c k + ) { + H5_API_ENTER (h5_err_t, + "f=%p, i=%llu, j=%llu, k=%llu", + (h5_file_p)f, + (long long unsigned)i, + (long long unsigned)j, + (long long unsigned)k); + H5_API_RETURN (h5b_3d_set_dims(f, i, j, k)); +} +#endif + +/*! + \ingroup h5block_model + \anchor H5Block3dSetHalo + + Sets the additional cells (\c i, \c j, \c k) in each direction to use as + the `halo` region (or `ghost zone`) that overlaps between neighboring + processors on the grid. + + A grid with dimensions must already be set with \ref H5Block3dSetGrid and + \ref H5Block3dSetDims, and all processors must specify the same halo radii. + + \return \c H5_SUCCESS or \c H5_FAILURE +*/ +static inline h5_err_t +H5Block3dSetHalo ( + const h5_file_t f, ///< [in] file handle. + const h5_size_t i, ///< [in] radius in \c i + const h5_size_t j, ///< [in] radius in \c j + const h5_size_t k ///< [in] radius in \c k + ) { + H5_API_ENTER (h5_err_t, + "f=%p, i=%llu, j=%llu, k=%llu", + (h5_file_p)f, + (long long unsigned)i, + (long long unsigned)j, + (long long unsigned)k); + H5_API_RETURN (h5b_3d_set_halo(f, i, j, k)); +} + +/*! + \ingroup h5block_model + \anchor H5BlockGetNumFields + + Query number of fields in current time step. + + \return \c number of fields + \return H5_FAILURE on error +*/ +static inline h5_ssize_t +H5BlockGetNumFields ( + const h5_file_t f ///< [in] file handle. + ) { + H5_API_ENTER (h5_ssize_t, + "f=%p", + (h5_file_p)f); + H5_API_RETURN (h5b_get_num_fields(f)); +} + + +/*! + \ingroup h5block_model + \anchor H5BlockGetFieldInfo + + Get the name, rank and dimensions of the field specified by the + index \c idx. + + \c elem_rank reports the rank of the elements in the field + (e.g. scalar or vector). + + This function can be used to retrieve all fields bound to the + current time-step by looping from \c 0 to the number of fields + minus one. The number of fields bound to the current time-step + can be queried by calling the function \ref H5BlockGetNumFields. + + \return \c H5_SUCCESS or \c H5_FAILURE +*/ +static inline h5_err_t +H5BlockGetFieldInfo ( + const h5_file_t f, ///< [in] file handle. + const h5_size_t idx, ///< [in] index of field. + char* name, ///< [out] field name. + const h5_size_t len_name, ///< [in] buffer size. + h5_size_t* field_rank, ///< [out] field rank. + h5_size_t* field_dims, ///< [out] field dimensions. + h5_size_t* elem_rank, ///< [out] element rank. + h5_int64_t* type ///< [out] datatype. + ) { + H5_API_ENTER (h5_err_t, + "f=%p, idx=%llu, " + "name=%p, len_name=%llu, " + "field_rank=%p, field_dims=%p, elem_rank=%p, type=%p", + (h5_file_p)f, (long long unsigned)idx, + name, (long long unsigned)len_name, + field_rank, field_dims, elem_rank, + type); + H5_API_RETURN ( + h5b_get_field_info ( + f, + idx, + name, + len_name, + field_rank, + field_dims, + elem_rank, + type)); +} + +/*! + \ingroup h5block_model + \anchor H5BlockGetFieldInfoByName + + Get the rank and dimensions of the field specified by its name. + See \ref H5BlockGetFieldInfo. + + \return \c H5_SUCCESS or \c H5_FAILURE +*/ +static inline h5_err_t +H5BlockGetFieldInfoByName ( + const h5_file_t f, ///< [in] file handle. + const char* name, ///< [in] field name. + h5_size_t* field_rank, ///< [out] field rank. + h5_size_t* field_dims, ///< [out] field dimensions. + h5_size_t* elem_rank, ///< [out] element rank. + h5_int64_t* type ///< [out] datatype. + ) { + H5_API_ENTER (h5_err_t, + "f=%p, name='%s', " + "field_rank=%p, field_dims=%p, elem_rank=%p, type=%p", + (h5_file_p)f, name, field_rank, field_dims, elem_rank, type); + H5_API_RETURN ( + h5b_get_field_info_by_name ( + f, + name, + field_rank, + field_dims, + elem_rank, + type)); +} + +#ifdef __cplusplus +} +#endif + +#endif diff --git a/src/include/H5Fed.h b/src/include/H5Fed.h new file mode 100644 index 0000000..90ac1b7 --- /dev/null +++ b/src/include/H5Fed.h @@ -0,0 +1,137 @@ +/* + Copyright (c) 2006-2013, The Regents of the University of California, + through Lawrence Berkeley National Laboratory (subject to receipt of any + required approvals from the U.S. Dept. of Energy) and the Paul Scherrer + Institut (Switzerland). All rights reserved. + + License: see file COPYING in top level of source distribution. +*/ + +#ifndef __H5FED_H +#define __H5FED_H + +#include "H5Fed_adjacency.h" +#include "H5Fed_model.h" +#include "H5Fed_retrieve.h" +#include "H5Fed_store.h" +#include "H5Fed_tags.h" + +#ifdef __cplusplus +extern "C" { +#endif + +/****** General routines *****************************************************/ + +static inline h5_err_t +H5FedOpenTetrahedralMesh ( + const h5_file_t f, + const char* name, + h5t_mesh_t** mesh + ) { + H5_API_ENTER (h5_err_t, + "f=%p, name=%s, mesh=%p", + (h5_file_p)f, name, mesh); + H5_API_RETURN (h5t_open_tetrahedral_mesh (f, name, mesh)); +} + +static inline h5_err_t +H5FedOpenTetrahedralMeshByIndex ( + const h5_file_t f, + const h5_id_t idx, + h5t_mesh_t** mesh + ) { + H5_API_ENTER (h5_err_t, + "f=%p, idx=%lld, mesh=%p", + (h5_file_p)f, (long long)idx, mesh); + H5_API_RETURN (h5t_open_tetrahedral_mesh_by_idx (f, idx, mesh)); +} + +static inline h5_err_t +H5FedOpenTriangleMesh ( + const h5_file_t f, + const char* name, + h5t_mesh_t** mesh + ) { + H5_API_ENTER (h5_err_t, + "f=%p, name=%s, mesh=%p", + (h5_file_p)f, name, mesh); + H5_API_RETURN (h5t_open_triangle_mesh (f, name, mesh)); +} + +static inline h5_err_t +H5FedOpenTriangleMeshPart ( + const h5_file_t f, + const char* name, + h5t_mesh_t** mesh, + h5_glb_idx_t* const elem_indices, + const h5_glb_idx_t num_elems + ) { + H5_API_ENTER (h5_err_t, + "f=%p, name=%s, mesh=%p", + (h5_file_p)f, name, mesh); + H5_API_RETURN (h5t_open_triangle_mesh_part (f, name, mesh, elem_indices, num_elems)); +} + +static inline h5_err_t +H5FedOpenTriangleMeshByIndex ( + const h5_file_t f, + const h5_id_t idx, + h5t_mesh_t** mesh + ) { + H5_API_ENTER (h5_err_t, + "f=%p, idx=%lld, mesh=%p", + (h5_file_p)f, (long long)idx, mesh); + H5_API_RETURN (h5t_open_triangle_mesh_by_idx (f, idx, mesh)); +} + +static inline h5_err_t +H5FedCloseMesh ( + h5t_mesh_t* const m + ) { + H5_API_ENTER (h5_err_t, "m=%p", m); + H5_API_RETURN (h5t_close_mesh (m)); +} + +static inline h5_err_t +H5FedSetLevel ( + h5t_mesh_t* const m, + const h5_lvl_idx_t level_id + ) { + H5_API_ENTER (h5_err_t, "m=%p, level_id=%d", m, level_id); + H5_API_RETURN (h5t_set_level (m, level_id)); +} + +static inline h5_err_t +H5FedSetMeshChanged ( + h5t_mesh_t* const m + ) { + H5_API_ENTER (h5_err_t, "m=%p", m); + H5_API_RETURN (h5t_set_mesh_changed (m)); +} + +static inline h5_err_t +H5FedLinkMeshToStep ( + h5_file_t* const m, + const h5_id_t mesh_id + ) { + H5_API_ENTER (h5_err_t, "m=%p, mesh_id=%lld", m, (long long)mesh_id); + H5_API_RETURN (h5_error_not_implemented ()); +} + +#ifdef __cplusplus +} +#endif + +#endif + + + + + + + + + + + + diff --git a/src/include/H5Fed_adjacency.h b/src/include/H5Fed_adjacency.h new file mode 100644 index 0000000..7378b48 --- /dev/null +++ b/src/include/H5Fed_adjacency.h @@ -0,0 +1,48 @@ +/* + Copyright (c) 2006-2013, The Regents of the University of California, + through Lawrence Berkeley National Laboratory (subject to receipt of any + required approvals from the U.S. Dept. of Energy) and the Paul Scherrer + Institut (Switzerland). All rights reserved. + + License: see file COPYING in top level of source distribution. +*/ + +#ifndef __H5FED_ADJACENCY_H +#define __H5FED_ADJACENCY_H + +#include "h5core/h5_types.h" +#include "h5core/h5.h" +#include "h5core/h5_debug.h" +#include "h5core/h5t_adjacencies.h" + +#ifdef __cplusplus +extern "C" { +#endif + +static inline h5_err_t +H5FedGetAdjacencies ( + h5t_mesh_t* const m, + const h5_loc_id_t entity_id, + const h5_int32_t dim, + h5_loc_idlist_t** list + ) { + H5_API_ENTER (h5_err_t, + "m=%p, entity_id=%lld, dim=%d, list=%p", + m, (long long)entity_id, dim, list); + H5_API_RETURN (h5t_get_adjacencies (m, entity_id, dim, list)); +} + +static inline h5_err_t +H5FedReleaseListOfAdjacencies ( + h5t_mesh_t* const m, + h5_loc_idlist_t** list + ) { + H5_API_ENTER (h5_err_t, "f=%p, list=%p", m, list); + H5_API_RETURN (h5t_release_list_of_adjacencies (m, list)); +} + +#ifdef __cplusplus +} +#endif + +#endif diff --git a/src/include/H5Fed_model.h b/src/include/H5Fed_model.h new file mode 100644 index 0000000..0917c90 --- /dev/null +++ b/src/include/H5Fed_model.h @@ -0,0 +1,184 @@ +/* + Copyright (c) 2006-2013, The Regents of the University of California, + through Lawrence Berkeley National Laboratory (subject to receipt of any + required approvals from the U.S. Dept. of Energy) and the Paul Scherrer + Institut (Switzerland). All rights reserved. + + License: see file COPYING in top level of source distribution. +*/ + +#ifndef __H5FED_MODEL_H +#define __H5FED_MODEL_H + +#include "h5core/h5_types.h" +#include "h5core/h5.h" +#include "h5core/h5_debug.h" +#include "h5core/h5t_model.h" + +#ifdef __cplusplus +extern "C" { +#endif + +/*! + Get number of meshes of given type. + + \param[in] f File handle + \param[in] type_id Type of mesh we want the number of. + + \return Number of meshes of type \c type_id or error code. + */ +static inline h5_ssize_t +H5FedGetNumTetrahedralMeshes ( + const h5_file_t f + ) { + H5_API_ENTER (h5_err_t, + "f=%p", + (h5_file_p)f); + H5_API_RETURN (h5t_get_num_tetmeshes (f)); +} + +static inline h5_ssize_t +H5FedGetNumTriangleMeshes ( + const h5_file_t f + ) { + H5_API_ENTER (h5_err_t, + "f=%p", + (h5_file_p)f); + H5_API_RETURN (h5t_get_num_trimeshes (f)); +} + +/*! + Get the number of hierarchical mesh levels. + + \param[in] f File handle + + \return Number of hierarchical mesh levels or error code. + */ +static inline h5_ssize_t +H5FedGetNumLevels ( + h5t_mesh_t* const m + ) { + H5_API_ENTER (h5_ssize_t, "m=%p", m); + H5_API_RETURN (h5t_get_num_leaf_levels (m)); +} + +/*! + Get current mesh levels. + + \param[in] f File handle + + \return ID of current mesh levels or error code. + */ +static inline h5_lvl_idx_t +H5FedGetLevel ( + h5t_mesh_t* const m + ) { + H5_API_ENTER (h5_lvl_idx_t, "m=%p", m); + H5_API_RETURN (h5t_get_level (m)); +} + +/*! + Returns the number of vertices used for defining the (sub-)mesh + at current level on this compute node. + + \param[in] f file handle + + \return Number of vertices or error code. +*/ +static inline h5_ssize_t +H5FedGetNumVertices ( + h5t_mesh_t* const m /*!< file handle */ + ) { + H5_API_ENTER (h5_ssize_t, "m=%p", m); + H5_API_RETURN (h5t_get_num_vertices (m, -1)); +} + +/*! + Returns the number of vertices used for defining the (sub-)mesh + at current level on compute node \c cnode. + + \param[in] f file handle + \param[in] cnode compute node + + \return Number of vertices or error code. +*/ +static inline h5_ssize_t +H5FedGetNumVerticesCnode ( + h5t_mesh_t* const m, + const int cnode + ) { + H5_API_ENTER (h5_ssize_t, "m=%p, cnode=%d", m, cnode); + H5_API_RETURN (h5t_get_num_vertices (m, cnode)); +} + +/*! + Returns the number of vertices used for defining the (sub-)mesh + at current level overl all compute nodes. + + \param[in] f file handle + + \return Total number of vertices or error code. +*/ +static inline h5_ssize_t +H5FedGetNumVerticesTotal ( + h5t_mesh_t* const m + ) { + H5_API_ENTER (h5_ssize_t, "m=%p", m); + H5_API_RETURN (h5t_get_num_vertices (m, -1)); +} + +/*! + Returns the number of elements present in the (sub-)mesh + at current level on this compute node. + + \param[in] f file handle + + \return Number of elements or error code. +*/ +static inline h5_ssize_t +H5FedGetNumElements ( + h5t_mesh_t* const m + ) { + H5_API_ENTER (h5_ssize_t, "m=%p", m); + H5_API_RETURN (h5t_get_num_leaf_elems (m, -1)); +} + +/*! + Returns the number of elements present in the (sub-)mesh + at current level on compute node \c cnode. + + \param[in] f file handle + \param[in] cnode Compute node + + \return Number of elements or error code. +*/ +static inline h5_ssize_t +H5FedGetNumElementsCnode ( + h5t_mesh_t* const m, + const int cnode + ) { + H5_API_ENTER (h5_ssize_t, "m=%p, cnode=%d", m, cnode); + H5_API_RETURN (h5t_get_num_leaf_elems (m, cnode)); +} + +/*! + Returns the number of elements present in the mesh + at current level over all compute nodes. + + \param[in] f File handle. + + \return Number of elements or error code. +*/ +static inline h5_ssize_t +H5FedGetNumElementsTotal ( + h5t_mesh_t* const m + ) { + H5_API_ENTER (h5_ssize_t, "m=%p", m); + H5_API_RETURN (h5t_get_num_leaf_elems (m, -1)); +} + +#ifdef __cplusplus +} +#endif + +#endif diff --git a/src/include/H5Fed_retrieve.h b/src/include/H5Fed_retrieve.h new file mode 100644 index 0000000..cf1c623 --- /dev/null +++ b/src/include/H5Fed_retrieve.h @@ -0,0 +1,218 @@ +/* + Copyright (c) 2006-2013, The Regents of the University of California, + through Lawrence Berkeley National Laboratory (subject to receipt of any + required approvals from the U.S. Dept. of Energy) and the Paul Scherrer + Institut (Switzerland). All rights reserved. + + License: see file COPYING in top level of source distribution. +*/ + +#ifndef __H5FED_RETRIEVE_H +#define __H5FED_RETRIEVE_H + +#include "h5core/h5_types.h" +#include "h5core/h5.h" +#include "h5core/h5_debug.h" +#include "h5core/h5_syscall.h" +#include "h5core/h5t_map.h" +#include "h5core/h5t_retrieve.h" + +#ifdef __cplusplus +extern "C" { +#endif + + +/*! + Begin traverse over all entities on this compute node. + Initialize internal data structures. + + \remark + Entities might be on processor boundaries! Therefore the same entity might be + processed on several compute nodes. + + \param[in] f file handle + \param[in] codim co-dimension of entity to traverse + + \return H5_SUCCESS or error code + */ + +static inline h5t_iterator_p +H5FedBeginTraverseEntities ( + h5t_mesh_t* const m, + const int codim + ) { + H5_API_ENTER (h5t_iterator_p, "m=%p, codim=%d", m, codim); + h5t_iterator_p iter; + TRY (iter = (h5t_iterator_p)h5_calloc (1, sizeof (*iter))); + TRY (h5t_init_leaf_iterator (iter, m, codim)); + H5_API_RETURN (iter); +} + +static inline h5t_iterator_p +H5FedBeginTraverseBoundaryFaces ( + h5t_mesh_t* const m, + const int codim + ) { + H5_API_ENTER (h5t_iterator_p, "m=%p, codim=%d", m, codim); + h5t_iterator_p iter; + TRY (iter = (h5t_iterator_p)h5_calloc (1, sizeof (*iter))); + TRY (h5t_init_boundary_face_iterator (iter, m, codim)); + H5_API_RETURN (iter); +} + +/*! + Get next local entity ID. + + \param[in/out] iter iterator + + \return Local entity ID + \return -1, if done + \return error code on error + */ +static inline h5_loc_id_t +H5FedTraverseEntities ( + h5t_iterator_t* iter + ) { + H5_API_ENTER (h5_loc_id_t, "iter=%p", iter); + H5_API_RETURN (h5t_iterate_entities (iter)); +} + +/*! + End of traversing. Release internal data structures. + + \param[in/out] iter iterator + + \return H5_SUCCESS or error code + + */ +static inline h5_err_t +H5FedEndTraverseEntities ( + h5t_iterator_t* iter + ) { + H5_API_ENTER (h5_err_t, "iter=%p", iter); + H5_API_RETURN (h5t_release_entity_iterator (iter)); +} + + +/*! + Get coordinates of vertex given by local index + + \param[in] f file handle + \param[in] vertex_idx local index of vertex + \param[out] P 3-dimensional coordinates + + \return H5_SUCCESS or error code + */ +static inline h5_err_t +H5FedGetVertexCoordsByIndex ( + h5t_mesh_t* const m, + h5_loc_idx_t vertex_index, + h5_float64_t P[3] + ) { + H5_API_ENTER (h5_err_t, + "m=%p, vertex_index=%lld, P=%p", + m, (long long)vertex_index, P); + H5_API_RETURN (h5t_get_vertex_coords_by_index (m, vertex_index, P)); +} + +static inline h5_err_t +H5FedGetVertexCoordsByID ( + h5t_mesh_t* const m, + h5_loc_id_t vertex_id, + h5_float64_t P[3] + ) { + H5_API_ENTER (h5_err_t, + "m=%p, vertex_id=%lld, P=%p", + m, (long long)vertex_id, P); + H5_API_RETURN (h5t_get_vertex_coords_by_id (m, vertex_id, P)); +} + +static inline h5_err_t +H5FedGetVertexIndicesOfEdge ( + h5t_mesh_t* const m, + h5_loc_id_t entity_id, + h5_loc_idx_t* vertex_indices + ) { + H5_API_ENTER (h5_err_t, + "m=%p, entity_id=%lld, vertex_indices=%p", + m, (long long)entity_id, vertex_indices); + H5_API_RETURN (h5t_get_loc_vertex_indices_of_edge (m, entity_id, vertex_indices)); +} + +static inline h5_err_t +H5FedGetVertexIndicesOfTriangle ( + h5t_mesh_t* const m, + h5_loc_id_t entity_id, + h5_loc_idx_t* vertex_indices + ) { + H5_API_ENTER (h5_err_t, + "m=%p, entity_id=%lld, vertex_indices=%p", + m, (long long)entity_id, vertex_indices); + H5_API_RETURN (h5t_get_loc_vertex_indices_of_triangle (m, entity_id, vertex_indices)); +} + +static inline h5_err_t +H5FedGetVertexIndicesOfTet ( + h5t_mesh_t* const m, + h5_loc_id_t entity_id, + h5_loc_idx_t* vertex_indices + ) { + H5_API_ENTER (h5_err_t, + "m=%p, entity_id=%lld, vertex_indices=%p", + m, (long long)entity_id, vertex_indices); + H5_API_RETURN (h5t_get_loc_vertex_indices_of_tet (m, entity_id, vertex_indices)); +} + +static inline h5_err_t +H5FedGetVertexIndicesOfEntity ( + h5t_mesh_t* const m, + h5_loc_id_t entity_id, + h5_loc_idx_t* indices + ) { + H5_API_ENTER (h5_err_t, + "m=%p, entity_id=%lld, indices=%p", + m, (long long)entity_id, indices); + H5_API_RETURN (h5t_get_loc_vertex_indices_of_entity (m, entity_id, indices)); +} + +static inline h5_err_t +H5FedGetGlobalVertexIndicesOfEntity ( + h5t_mesh_t* const m, + h5_loc_id_t entity_id, + h5_glb_idx_t* indices + ) { + H5_API_ENTER (h5_err_t, + "m=%p, entity_id=%lld, indices=%p", + m, (long long)entity_id, indices); + H5_API_RETURN (h5t_get_glb_vertex_indices_of_entity (m, entity_id, indices)); +} + +static inline h5_err_t +H5FedGetVertexByID ( + h5t_mesh_t* const m, + const h5_loc_id_t entity_id, + h5_glb_idx_t* glb_idx, + h5_float64_t* P[] + ) { + H5_API_ENTER (h5_err_t, + "m=%p, entity_id=%lld, glb_idx=%p, P[]=%p", + m, (long long)entity_id, glb_idx, P); + H5_API_RETURN (h5t_get_vertex_by_id (m, entity_id, glb_idx, P)); +} + +static inline h5_err_t +H5FedGetNeighborIndicesOfElement ( + h5t_mesh_t* const m, + h5_loc_id_t entity_id, + h5_loc_idx_t* neighbor_indices + ) { + H5_API_ENTER (h5_err_t, + "m=%p, entity_id=%lld, neighbor_indices=%p", + m, (long long)entity_id, neighbor_indices); + H5_API_RETURN (h5t_get_neighbor_indices (m, entity_id, neighbor_indices)); +} +#ifdef __cplusplus +} +#endif + +#endif diff --git a/src/include/H5Fed_store.h b/src/include/H5Fed_store.h new file mode 100644 index 0000000..534161e --- /dev/null +++ b/src/include/H5Fed_store.h @@ -0,0 +1,218 @@ +/* + Copyright (c) 2006-2013, The Regents of the University of California, + through Lawrence Berkeley National Laboratory (subject to receipt of any + required approvals from the U.S. Dept. of Energy) and the Paul Scherrer + Institut (Switzerland). All rights reserved. + + License: see file COPYING in top level of source distribution. +*/ + +#ifndef __H5FED_STORE_H +#define __H5FED_STORE_H + +#include "h5core/h5_types.h" +#include "h5core/h5.h" +#include "h5core/h5_debug.h" +#include "h5core/h5t_store.h" + +#ifdef __cplusplus +extern "C" { +#endif + +static inline h5_err_t +H5FedAddTetrahedralMesh ( + const h5_file_t f, + const char* name, + h5t_mesh_t** mesh + ) { + H5_API_ENTER (h5_err_t, + "f=%p, name=%s, mesh=%p", + (h5_file_p)f, name, mesh); + H5_API_RETURN (h5t_add_tetrahedral_mesh (f, name, mesh)); +} + +static inline h5_err_t +H5FedAddChunkedTetrahedralMesh ( + const h5_file_t f, + const char* name, + h5t_mesh_t** mesh + ) { + H5_API_ENTER (h5_err_t, + "f=%p, name=%s, mesh=%p", + (h5_file_p)f, name, mesh); + H5_API_RETURN (h5t_add_chunked_tetrahedral_mesh (f, name, mesh)); +} + + +static inline h5_err_t +H5FedAddTriangleMesh ( + const h5_file_t f, + const char* name, + h5t_mesh_t** mesh + ) { + H5_API_ENTER (h5_err_t, + "f=%p, name=%s, mesh=%p", + (h5_file_p)f, name, mesh); + H5_API_RETURN (h5t_add_triangle_mesh (f, name, mesh)); +} + +static inline h5_err_t +H5FedAddChunkedTriangleMesh ( + const h5_file_t f, + const char* name, + h5t_mesh_t** mesh + ) { + H5_API_ENTER(h5_err_t, + "f=%p, name=%s, mesh=%p", + (h5_file_p)f, name, mesh); + H5_API_RETURN (h5t_add_chunked_triangle_mesh (f, name, mesh)); +} +/*! + \ingroup h5fed_c_api + + Add a new level with \c num_elems elements. The number of elements must be the + real number of elements to add the level. If you want to refine \c n tetrahedra + \c n*8 elements must be added. + + \param[in] f File handle. + \param[in] num_elems_to_refine Number of elements which will be refined. + + \return ID of new level. + + \note + values for f->t.num_levels: + \c -1 unknown: after opening the file. This is equivalent to + "topological data has not been initialized". + \c 0 no levels: HDF5 group for meshes may already exist but must not! + \c > 0 number of mesh levels + + */ +static inline h5_err_t +H5FedBeginStoreVertices ( + h5t_mesh_t* const m, + const h5_size_t num + ) { + H5_API_ENTER (h5_err_t, + "m=%p, num=%llu", + m, (long long unsigned)num); + H5_API_RETURN (h5t_begin_store_vertices (m, num)); +} + +/*! + \ingroup h5fed_c_api + + Stores the the coordinates of a specific vertex at level \c level + with id \c vertex_id of the tetrahedral mesh. + + \return local vertex id on success + \return errno on error + */ +static inline h5_loc_idx_t +H5FedStoreVertex ( + h5t_mesh_t* const m, /*!< file handle */ + const h5_glb_id_t vertex_id, /*!< id from mesher or -1 */ + const h5_float64_t P[3] /*!< coordinates */ + ) { + H5_API_ENTER (h5_loc_idx_t, + "m=%p, vertex_id=%lld, P=%p", + m, (long long)vertex_id, P); + if (h5t_get_level (m) != 0) { + H5_API_LEAVE ( + h5_error ( + H5_ERR_INVAL, + "Vertices can be added to level 0 only!")); + } + H5_API_RETURN (h5t_store_vertex (m, vertex_id, P)); +} + +static inline h5_err_t +H5FedEndStoreVertices ( + h5t_mesh_t* const m + ) { + H5_API_ENTER (h5_err_t, "m=%p", m); + H5_API_RETURN (h5t_end_store_vertices (m)); +} + +static inline h5_err_t +H5FedBeginStoreElements ( + h5t_mesh_t* const m, + const h5_size_t num, + const h5_weight_t num_weights + ) { + H5_API_ENTER (h5_err_t, + "m=%p, num=%llu, num_weights=%d", + m, (long long unsigned)num, num_weights); + H5_API_RETURN (h5t_begin_store_elems (m, num, num_weights)); +} + +/*! + \ingroup h5fed_c_api + + Stores the 4-tuple, that contains the specific indices describing + a tetrahedron with id \c tet_id at level \c level of the tetrahedral + mesh. + + Errors: + * current level not yet defined + * to many tets stored on level + + \return local tetrahedron id + \return \c errno on error + */ +static inline h5_loc_idx_t +H5FedStoreElement ( + h5t_mesh_t* const m, /*!< file handle */ + const h5_loc_idx_t local_vids[], /*!< tuple with vertex id's */ + const h5_weight_t weights[] // tuple with weights + ) { + H5_API_ENTER (h5_loc_idx_t, "m=%p, local_vids=%p", m, local_vids); + if (h5t_get_level (m) != 0) { + H5_API_LEAVE ( + h5_error ( + H5_ERR_INVAL, + "Elements can be added to level 0 only!")); + } + H5_API_RETURN (h5t_store_elem2 (m, -1, local_vids, weights)); +} + +static inline h5_err_t +H5FedEndStoreElements ( + h5t_mesh_t* const m + ) { + H5_API_ENTER (h5_err_t, "m=%p", m); + + H5_API_RETURN ((h5t_is_chunked(m)) ? h5t_end_store_ckd_elems (m) : h5t_end_store_elems (m)); +} + +static inline h5_err_t +H5FedBeginRefineElements ( + h5t_mesh_t* const m + ) { + H5_API_ENTER (h5_err_t, "m=%p", m); + H5_API_RETURN (h5t_begin_refine_elems (m)); +} + +static inline h5_loc_idx_t +H5FedRefineElement ( + h5t_mesh_t* const m, /*!< file handle */ + const h5_loc_id_t local_eid /*!< local element id */ + ) { + H5_API_ENTER (h5_loc_idx_t, + "m=%p, local_eid=%lld", + m, (long long)local_eid); + H5_API_RETURN (h5t_mark_entity (m, local_eid)); +} + +static inline h5_err_t +H5FedEndRefineElements ( + h5t_mesh_t* const m + ) { + H5_API_ENTER (h5_err_t, "m=%p", m); + H5_API_RETURN (h5t_end_refine_elems (m)); +} + +#ifdef __cplusplus +} +#endif + +#endif diff --git a/src/include/H5Fed_tags.h b/src/include/H5Fed_tags.h new file mode 100644 index 0000000..711c1b3 --- /dev/null +++ b/src/include/H5Fed_tags.h @@ -0,0 +1,221 @@ +/* + Copyright (c) 2006-2013, The Regents of the University of California, + through Lawrence Berkeley National Laboratory (subject to receipt of any + required approvals from the U.S. Dept. of Energy) and the Paul Scherrer + Institut (Switzerland). All rights reserved. + + License: see file COPYING in top level of source distribution. +*/ + +#ifndef __H5FED_TAGS_H +#define __H5FED_TAGS_H + +#include "h5core/h5_types.h" +#include "h5core/h5.h" +#include "h5core/h5_debug.h" +#include "h5core/h5t_tags.h" + +#ifdef __cplusplus +extern "C" { +#endif + +/*! + Get number of tagsets assocciated with the mesh. + + \param[in] m mesh + */ +static inline h5_ssize_t +H5FedGetNumMTagsets ( + h5t_mesh_t* const m + ) { + H5_API_ENTER (h5_ssize_t, "m=%p", m); + H5_API_RETURN (h5t_get_num_mtagsets(m)); +} + +/*! + Get some information about the tagset \c name. + + \param[in] m mesh + \param[in] idx index of tagset to query + \param[out] name name of tagset + \param[in] len_name len of buffer \c name + \param[out] type type of tagset + */ +static inline h5_err_t +H5FedGetMTagsetInfo ( + h5t_mesh_t* const m, + const h5_size_t idx, + char name[], + const h5_size_t len_name, + h5_int64_t* const type + ) { + H5_API_ENTER (h5_err_t, + "m=%p, idx=%llu, name=%p, len_name=%llu, type=%p", + m, (long long unsigned)idx, name, + (long long unsigned)len_name, type); + H5_API_RETURN (h5t_get_mtagset_info (m, idx, name, len_name, type)); +} + +/*! + Test whether tagset \c name exists. + + \param[in] m mesh + \param[out] name name of tagset to test existance + */ +static inline h5_err_t +H5FedMTagsetExists ( + h5t_mesh_t* const m, + const char name[] + ) { + H5_API_ENTER (h5_err_t, "m=%p, name=%s", m, name); + H5_API_RETURN (h5t_mtagset_exists (m, name)); +} + +/*! + Add a tagset to the current mesh. + + \param[in] m mesh to add a tagset to + \param[in] name name of tagset + \param[in] type data type of tagset + \param[out] tagset new tagset + + \return H5_SUCCESS or error code + */ +static inline h5_err_t +H5FedAddMTagset ( + h5t_mesh_t* const m, + const char name[], + const h5_id_t type, + h5t_tagset_t** tagset + ) { + H5_API_ENTER (h5_err_t, + "m=%p, name='%s', type=%lld tagset=%p", + m, name, (long long)type, tagset); + H5_API_RETURN (h5t_create_mtagset (m, name, type, tagset)); +} + +/*! + Open tagset \c name. + + \param[in] m mesh + \param[in] name name of tagset to open + \param[out] tagset open tagset + + \return H5_SUCCESS or error code + */ +static inline h5_err_t +H5FedOpenMTagset ( + h5t_mesh_t* const m, + const char name[], + h5t_tagset_t** tagset + ) { + H5_API_ENTER (h5_err_t, + "m=%p, name='%s', tagset=%p", + m, name, tagset); + H5_API_RETURN (h5t_open_mtagset (m, name, tagset)); +} + +/*! + Close tagset. + + \param[in] tagset open tagset + + \return H5_SUCCESS or error code + */ +static inline h5_err_t +H5FedCloseMTagset ( + h5t_tagset_t* tagset + ) { + H5_API_ENTER (h5_err_t, "tagset=%p", tagset); + H5_API_RETURN (h5t_close_mtagset(tagset)); +} + +/*! + Remove tagset from mesh + + \param[in] tagset tagset + \param[in] name name of tagset to remove + + \return H5_SUCCESS or error code + */ +static inline h5_err_t +H5FedRemoveMTagset ( + h5t_mesh_t* m, + const char name[] + ) { + H5_API_ENTER (h5_err_t, "m=%p, name='%s'", m, name); + H5_API_RETURN (h5t_remove_mtagset (m, name)); +} + +/*! + Set tag for entity in current mesh. + + \param[in] tagset ptr tagset + \param[in] entity_id id of entity + \param[in] size size of value + \param[in] val tag value + + \return H5_SUCCESS or error code + */ +static inline h5_err_t +H5FedSetTag ( + h5t_tagset_t* const tagset, + h5_loc_id_t entity_id, + const h5_size_t size, + void* val + ) { + H5_API_ENTER (h5_err_t, + "tagset=%p, entity_id=%lld, size=%lld, val=%p", + tagset, (long long)entity_id, (long long)size, val); + H5_API_RETURN (h5t_set_tag (tagset, entity_id, size, val)); +} + +/*! + Get tag for entity in current mesh. If entity is not tagged, return tag of + the next coarser tagged entity. The corresponding entity ID is returned. + + \param[in] tagset ptr to tagset + \param[in] entity_id id of entity to tag + \param[out] size size of value + \param[out] val tag value + + \return entity id + \return H5_ERR on error + */ +static inline h5_loc_id_t +H5FedGetTag ( + h5t_tagset_t* const tagset, + const h5_loc_id_t entity_id, + h5_size_t* size, + void* val + ) { + H5_API_ENTER (h5_err_t, + "tagset=%p, entity_id=%lld, size=%p, val=%p", + tagset, (long long)entity_id, size, val); + H5_API_RETURN (h5t_get_tag (tagset, entity_id, size, val)); +} + +/*! + Remove tag for entity in current mesh. + + \param[in] tagset ptr to tagset tagset + \param[in] entity_id id of entity from which the tag must be removed. + + \return H5_SUCCESS or error code + */ +static inline h5_err_t +H5FedRemoveMTag ( + h5t_tagset_t* const tagset, + const h5_loc_id_t entity_id + ) { + H5_API_ENTER (h5_err_t, + "tagset=%p, entity_id=%lld", + tagset, (long long)entity_id); + H5_API_RETURN (h5t_remove_tag (tagset, entity_id)); +} + +#ifdef __cplusplus +} +#endif + +#endif diff --git a/src/include/H5Part.h b/src/include/H5Part.h new file mode 100644 index 0000000..3e44806 --- /dev/null +++ b/src/include/H5Part.h @@ -0,0 +1,16 @@ +/* + Copyright (c) 2006-2012, The Regents of the University of California, + through Lawrence Berkeley National Laboratory (subject to receipt of any + required approvals from the U.S. Dept. of Energy) and the Paul Scherrer + Institut (Switzerland). All rights reserved. + + License: see file COPYING in top level of source distribution. +*/ + +#ifndef __H5PART_H +#define __H5PART_H + +#include "H5Part_io.h" +#include "H5Part_model.h" + +#endif diff --git a/src/include/H5Part_io.h b/src/include/H5Part_io.h new file mode 100644 index 0000000..cd0fe0d --- /dev/null +++ b/src/include/H5Part_io.h @@ -0,0 +1,274 @@ +/* + Copyright (c) 2006-2013, The Regents of the University of California, + through Lawrence Berkeley National Laboratory (subject to receipt of any + required approvals from the U.S. Dept. of Energy) and the Paul Scherrer + Institut (Switzerland). All rights reserved. + + License: see file COPYING in top level of source distribution. +*/ + +#ifndef H5PART_IO +#define H5PART_IO + +#include "h5core/h5_types.h" +#include "h5core/h5.h" +#include "h5core/h5_debug.h" +#include "h5core/h5u_io.h" + +#ifdef __cplusplus +extern "C" { +#endif + +/*! + \ingroup h5part_data + + Write array of 64 bit floating point data to file. + + After setting the number of particles with \c H5PartSetNumParticles() and + the current timestep using \c H5SetStep(), you can start writing datasets + into the file. Each dataset has a name associated with it (chosen by the + user) in order to facilitate later retrieval. The name of the dataset is + specified in the parameter \c name, which must be a null-terminated string. + + There are no restrictions on naming of datasets, but it is useful to arrive + at some common naming convention when sharing data with other groups. + + The writing routines also implicitly store the datatype of the array so that + the array can be reconstructed properly on other systems with incompatible + type representations. + + All data that is written after setting the timestep is associated with that + timestep. While the number of particles can change for each timestep, you + cannot change the number of particles in the middle of a given timestep. + + The data is committed to disk before the routine returns. + + \return \c H5_SUCCESS or \c H5_FAILURE. + */ +static inline h5_err_t +H5PartWriteDataFloat64 ( + const h5_file_t f, ///< [in] file handle. + const char* name, ///< [in] name to associate array with. + const h5_float64_t* data ///< [in] array to commit to disk. + ) { + H5_API_ENTER (h5_err_t, + "f=%p, name='%s', date=%p", + (h5_file_p)f, name, data); + H5_API_RETURN (h5u_write_data (f, name, (void*)data, H5T_NATIVE_DOUBLE)); +} + +/*! + \ingroup h5part_data + + Write array of 32 bit floating point data to file. + + After setting the number of particles with \c H5PartSetNumParticles() and + the current timestep using \c H5SetStep(), you can start writing datasets + into the file. Each dataset has a name associated with it (chosen by the + user) in order to facilitate later retrieval. The name of the dataset is + specified in the parameter \c name, which must be a null-terminated string. + + There are no restrictions on naming of datasets, but it is useful to arrive + at some common naming convention when sharing data with other groups. + + The writing routines also implicitly store the datatype of the array so that + the array can be reconstructed properly on other systems with incompatible + type representations. + + All data that is written after setting the timestep is associated with that + timestep. While the number of particles can change for each timestep, you + cannot change the number of particles in the middle of a given timestep. + + The data is committed to disk before the routine returns. + + \return \c H5_SUCCESS or \c H5_FAILURE. + */ +static inline h5_err_t +H5PartWriteDataFloat32 ( + const h5_file_t f, ///< [in] file handle. + const char* name, ///< [in] name to associate array with. + const h5_float32_t* data ///< [in] array to commit to disk. + ) { + H5_API_ENTER (h5_err_t, + "f=%p, name='%s', date=%p", + (h5_file_p)f, name, data); + H5_API_RETURN (h5u_write_data(f, name, (void*)data, H5T_NATIVE_FLOAT)); +} + +/*! + \ingroup h5part_data + + Write array of 64 bit integer data to file. + + After setting the number of particles with \c H5PartSetNumParticles() and + the current timestep using \c H5SetStep(), you can start writing datasets + into the file. Each dataset has a name associated with it (chosen by the + user) in order to facilitate later retrieval. The name of the dataset is + specified in the parameter \c name, which must be a null-terminated string. + + There are no restrictions on naming of datasets, but it is useful to arrive + at some common naming convention when sharing data with other groups. + + The writing routines also implicitly store the datatype of the array so that + the array can be reconstructed properly on other systems with incompatible + type representations. + + All data that is written after setting the timestep is associated with that + timestep. While the number of particles can change for each timestep, you + cannot change the number of particles in the middle of a given timestep. + + The data is committed to disk before the routine returns. + + \return \c H5_SUCCESS or \c H5_FAILURE. + */ +static inline h5_err_t +H5PartWriteDataInt64 ( + const h5_file_t f, ///< [in] file handle. + const char* name, ///< [in] name to associate array with. + const h5_int64_t* data ///< [in] array to commit to disk. + ) { + H5_API_ENTER (h5_err_t, + "f=%p, name='%s', date=%p", + (h5_file_p)f, name, data); + H5_API_RETURN (h5u_write_data (f, name, (void*)data, H5T_NATIVE_INT64)); +} + +/*! + \ingroup h5part_data + + Write array of 32 bit integer data to file. + + After setting the number of particles with \c H5PartSetNumParticles() and + the current timestep using \c H5SetStep(), you can start writing datasets + into the file. Each dataset has a name associated with it (chosen by the + user) in order to facilitate later retrieval. The name of the dataset is + specified in the parameter \c name, which must be a null-terminated string. + + There are no restrictions on naming of datasets, but it is useful to arrive + at some common naming convention when sharing data with other groups. + + The writing routines also implicitly store the datatype of the array so that + the array can be reconstructed properly on other systems with incompatible + type representations. + + All data that is written after setting the timestep is associated with that + timestep. While the number of particles can change for each timestep, you + cannot change the number of particles in the middle of a given timestep. + + The data is committed to disk before the routine returns. + + \return \c H5_SUCCESS or \c H5_FAILURE. + */ +static inline h5_err_t +H5PartWriteDataInt32 ( + const h5_file_t f, ///< [in] file handle. + const char* name, ///< [in] name to associate array with. + const h5_int32_t* data ///< [in] array to commit to disk. + ) { + H5_API_ENTER (h5_err_t, + "f=%p, name='%s', date=%p", + (h5_file_p)f, name, data); + H5_API_RETURN (h5u_write_data (f, name, (void*)data, H5T_NATIVE_INT32)); +} + +/*! + \ingroup h5part_data + + Read array of 64 bit floating point data from file. + + When retrieving datasets from disk, you ask for them + by name. There are no restrictions on naming of arrays, + but it is useful to arrive at some common naming + convention when sharing data with other groups. + + \return \c H5_SUCCESS or \c H5_FAILURE. +*/ +static inline h5_err_t +H5PartReadDataFloat64 ( + const h5_file_t f, ///< [in] file handle. + const char* name, ///< [in] name to associate dataset with. + h5_float64_t* data ///< [out] array of data. + ) { + H5_API_ENTER (h5_err_t, + "f=%p, name='%s', date=%p", + (h5_file_p)f, name, data); + H5_API_RETURN (h5u_read_data (f, name, data, H5T_NATIVE_DOUBLE)); +} + +/*! + \ingroup h5part_data + + Read array of 32 bit floating point data from file. + + When retrieving datasets from disk, you ask for them + by name. There are no restrictions on naming of arrays, + but it is useful to arrive at some common naming + convention when sharing data with other groups. + + \return \c H5_SUCCESS or \c H5_FAILURE. +*/ +static inline h5_err_t +H5PartReadDataFloat32 ( + const h5_file_t f, ///< [in] file handle. + const char* name, ///< [in] name to associate dataset with. + h5_float32_t* data ///< [out] array of data. + ) { + H5_API_ENTER (h5_err_t, + "f=%p, name='%s', date=%p", + (h5_file_p)f, name, data); + H5_API_RETURN (h5u_read_data (f, name, data, H5T_NATIVE_FLOAT)); +} + +/*! + \ingroup h5part_data + + Read array of 64 bit integer data from file. + + When retrieving datasets from disk, you ask for them + by name. There are no restrictions on naming of arrays, + but it is useful to arrive at some common naming + convention when sharing data with other groups. + + \return \c H5_SUCCESS or \c H5_FAILURE. +*/ +static inline h5_err_t +H5PartReadDataInt64 ( + const h5_file_t f, ///< [in] file handle. + const char* name, ///< [in] name to associate dataset with. + h5_int64_t* data ///< [out] array of data. + ) { + H5_API_ENTER (h5_err_t, + "f=%p, name='%s', date=%p", + (h5_file_p)f, name, data); + H5_API_RETURN (h5u_read_data (f, name, data, H5T_NATIVE_INT64)); +} + +/*! + \ingroup h5part_data + + Read array of 32 bit integer data from file. + + When retrieving datasets from disk, you ask for them + by name. There are no restrictions on naming of arrays, + but it is useful to arrive at some common naming + convention when sharing data with other groups. + + \return \c H5_SUCCESS or \c H5_FAILURE. +*/ +static inline h5_err_t +H5PartReadDataInt32 ( + const h5_file_t f, ///< [in] file handle. + const char* name, ///< [in] name to associate dataset with. + h5_int32_t* data ///< [out] Array of data. + ) { + H5_API_ENTER (h5_err_t, + "f=%p, name='%s', date=%p", + (h5_file_p)f, name, data); + H5_API_RETURN (h5u_read_data (f, name, data, H5T_NATIVE_INT32)); +} + +#ifdef __cplusplus +} +#endif + +#endif diff --git a/src/include/H5Part_model.h b/src/include/H5Part_model.h new file mode 100644 index 0000000..e749248 --- /dev/null +++ b/src/include/H5Part_model.h @@ -0,0 +1,395 @@ +/* + Copyright (c) 2006-2013, The Regents of the University of California, + through Lawrence Berkeley National Laboratory (subject to receipt of any + required approvals from the U.S. Dept. of Energy) and the Paul Scherrer + Institut (Switzerland). All rights reserved. + + License: see file COPYING in top level of source distribution. +*/ + +#ifndef H5PART_MODEL +#define H5PART_MODEL + +#include "h5core/h5_types.h" +#include "h5core/h5.h" +#include "h5core/h5_debug.h" +#include "h5core/h5u_model.h" + +#ifdef __cplusplus +extern "C" { +#endif + +/*! + \ingroup h5part_model + + Set the number of particles for the current time-step. + After you call this subroutine, all subsequent + operations will assume this number of particles will be written. + + For the parallel library, the \c nparticles value is the number of + particles that the \e individual task will write. You can use + a different value on different tasks. + This function uses an \c MPI_Allgather + call to aggregate each tasks number of particles and determine + the appropiate offsets. Because of the use of this MPI collective, + it is advisable to call this function as + few times as possible when running at large concurrency. + + This function assumes that your particles' data fields are in stored in + contiguous 1D arrays. + For instance, the fields \e x and \e y for your particles are stored + in separate arrays \c x[] and \c y[]. + + If instead you store your particles as tuples, so that the values + are arranged \f$ x_1,y_1,x_2,y_2\f$... than you need to setup striding + (in this case with value 2) using \ref H5PartSetNumParticlesStrided. + + \return \c H5_SUCCESS or \c H5_FAILURE. + */ +static inline h5_err_t +H5PartSetNumParticles ( + const h5_file_t f, ///< [in] file handle. + h5_size_t nparticles ///< [in] Number of particles. + ) { + H5_API_ENTER (h5_err_t, + "f=%p, nparticles=%llu", + (h5_file_p)f, (long long unsigned)nparticles); + h5_size_t stride = 1; + H5_API_RETURN (h5u_set_num_particles (f, nparticles, stride)); +} + +/*! + \ingroup h5part_model + + Set the number of particles for the current time-step. + After you call this subroutine, all subsequent + operations will assume this number of particles will be written. + + For the parallel library, the \c nparticles value is the number of + particles that the \e individual task will write. You can use + a different value on different tasks. + This function uses an \c MPI_Allgather + call to aggregate each tasks number of particles and determine + the appropiate offsets. Because of the use of this MPI collective, + it is advisable to call this function as + few times as possible when running at large concurrency. + + This function assumes that your particles' data fields are + stored tuples. For instance, the fields \e x and \e y of your + particles are arranged \f$x_1,y_1,x_2,y_2\f$... in a single data + array. In this example, the stride value would be 2. + + If you instead have a separate array for each fields, + such as \c x[] and \c y[], + use \ref H5PartSetNumParticles. + + \return \c H5_SUCCESS or \c H5_FAILURE. +*/ +static inline h5_err_t +H5PartSetNumParticlesStrided ( + const h5_file_t f, ///< [in] file handle. + h5_size_t nparticles, ///< [in] number of particles. + h5_size_t stride ///< [in] stride value (e.g. number + ///< of fields in the particle array). + ) { + H5_API_ENTER (h5_err_t, + "f=%p, nparticles=%llu, stride=%llu", + (h5_file_p)f, (long long unsigned)nparticles, + (long long unsigned)stride); + H5_API_RETURN (h5u_set_num_particles (f, nparticles, stride)); +} + +/*! + \ingroup h5part_model + + Define the chunk \c size and enables chunking in the underlying + HDF5 layer. + + Note that this policy wastes some disk space, but can improve read and write + performance depending on the access pattern. + + On parallel filesystems that are sensitive to write alignment (e.g. lustre) + it is recommended to set a reasonable chunk size when using the MPI-POSIX + or MPI-IO independent VFDs (see \ref H5OpenFile). + + For more details about chunking, please read the HDF5 documentation. + + \return \c H5_SUCCESS or \c H5_FAILURE. +*/ +static inline h5_err_t +H5PartSetChunkSize ( + const h5_file_t f, ///< [in] file handle. + h5_size_t size ///< [in] chunk size. + ) { + H5_API_ENTER (h5_err_t, + "f=%p, size=%llu", + (h5_file_p)f, (long long unsigned)size); + H5_API_RETURN (h5u_set_chunk (f, size)); +} + +/*! + \ingroup h5part_model + + Get the number of datasets that are stored at the current time-step. + + \return number of datasets in current timestep or \c H5_FAILURE. +*/ +static inline h5_ssize_t +H5PartGetNumDatasets ( + const h5_file_t f ///< [in] file handle. + ) { + H5_API_ENTER (h5_err_t, + "f=%p", + (h5_file_p)f); + H5_API_RETURN (h5u_get_num_datasets(f)); +} + +/*! + \ingroup h5part_model + + This reads the name of a dataset specified by it's index in the current + time-step. + + If the number of datasets is \c n, the range of \c _index is \c 0 to \c n-1. + + \result \c H5_SUCCESS +*/ +static inline h5_err_t +H5PartGetDatasetName ( + const h5_file_t f, ///< [in] file handle. + const h5_id_t idx, ///< [in] index of the dataset. + char* name, ///< [out] name of dataset. + const h5_size_t len ///< [in] size of buffer \c name. + ) { + H5_API_ENTER (h5_err_t, + "f=%p, " + "idx=%lld, " + "name='%p', len=%llu, ", + (h5_file_p)f, + (long long)idx, + name, (unsigned long long)len); + H5_API_RETURN (h5u_get_dataset_info(f, idx, name, len, NULL, NULL)); +} + +/*! + \ingroup h5part_model + + Gets the name, type and number of elements of a dataset based on its + index in the current timestep. + + Type is one of the following values: + + - \c H5_FLOAT64_T (for \c h5_float64_t) + - \c H5_FLOAT32_T (for \c h5_float32_t) + - \c H5_INT64_T (for \c h5_int64_t) + - \c H5_INT32_T (for \c h5_int32_t) + + \return \c H5_SUCCESS or \c H5_FAILURE +*/ +static inline h5_err_t +H5PartGetDatasetInfo ( + const h5_file_t f, ///< [in] file handle. + const h5_id_t idx, ///< [in] index of the dataset. + char* name, ///< [out] name of dataset. + const h5_size_t len_name, ///< [in] size of buffer \c name. + h5_int64_t* type, ///< [out] type of data in dataset. + h5_size_t* nelems ///< [out] number of elements. + ) { + H5_API_ENTER (h5_int64_t, + "f=%p, " + "idx=%lld, " + "name='%p', len_name=%llu, " + "type=%p, nelems=%p", + (h5_file_p)f, + (long long)idx, + name, (long long unsigned)len_name, + type, nelems); + H5_API_RETURN (h5u_get_dataset_info ( + f, idx, name, len_name, type, nelems)); +} + +/*! + \ingroup h5part_model + + This function returns the number of particles in this processor's view, + if a view has been set. + + If not, it returns the total number of particles across all processors + from the last \ref H5PartSetNumParticles call. + + If you have neither set the number of particles + nor set a view, then this returns the total number of + particles in the first data set of the current time step. + Note that H5Part assumes that all data sets within a given time step + have the same number of particles (although the number particles can + vary across time steps). + + If none of these conditions are met, an error is thrown. + + \return number of particles in current step. + \return \c H5_FAILURE on error. + */ +static inline h5_ssize_t +H5PartGetNumParticles ( + const h5_file_t f ///< [in] file handle. + ) { + H5_API_ENTER (h5_ssize_t, + "f=%p", + (h5_file_p)f); + H5_API_RETURN (h5u_get_num_particles (f)); +} + +/*! + \ingroup h5part_model + + Reset the view. + + \return \c H5_SUCCESS or \c H5_FAILURE +*/ +static inline h5_err_t +H5PartResetView ( + const h5_file_t f ///< [in] file handle. + ) { + H5_API_ENTER (h5_ssize_t, + "f=%p", + (h5_file_p)f); + H5_API_RETURN (h5u_reset_view (f)); +} + +/*! + \ingroup h5part_model + + Check whether a view has been set, either automatically with + \ref H5PartSetNumParticles or manually with \ref H5PartSetView + or \ref H5PartSetViewIndices. + + \return \c 1 if view has been set. + \return \c 0 otherwise. + \return \c H5_FAILURE on error. +*/ +static inline h5_err_t +H5PartHasView ( + const h5_file_t f ///< [in] file handle. + ) { + H5_API_ENTER (h5_err_t, + "f=%p", + (h5_file_p)f); + H5_API_RETURN (h5u_has_view (f)); +} + +/*! + \ingroup h5part_model + + For parallel I/O or for subsetting operations on the datafile, + this function allows you to define a subset of the total + particle dataset to operate on. + The concept of "view" works for both serial + and for parallel I/O. The "view" will remain in effect until a new view + is set, or the number of particles in a dataset changes, or the view is + "unset" by calling \c H5PartSetView(file,-1,-1); + + Before you set a view, \ref H5PartGetNumParticles will return the + total number of particles in the current time-step (even for the parallel + reads). However, after you set a view, it will return the number of + particles contained in the view. + + The range is \e inclusive: the end value is the last index of the + data. + + \return \c H5_SUCCESS or \c H5_FAILURE. +*/ +static inline h5_err_t +H5PartSetView ( + const h5_file_t f, ///< [in] file handle. + h5_int64_t start, ///< [in] start particle. + h5_int64_t end ///< [in] end particle. + ) { + H5_API_ENTER (h5_err_t, + "f=%p, start=%lld, end=%lld", + (h5_file_p)f, (long long)start, (long long)end); + H5_API_RETURN (h5u_set_view (f, start, end)); +} + +/*! + \ingroup h5part_model + + For parallel I/O or for subsetting operations on the datafile, + this function allows you to define a subset of the total + dataset to operate on by specifying a list of indices. + The concept of "view" works for both serial + and for parallel I/O. The "view" will remain in effect until a new view + is set, or the number of particles in a dataset changes, or the view is + "unset" by calling \c H5PartSetViewIndices(NULL,0); + + When you perform a read or write on a view consisting of indices, it + is assumed that your buffer is \b unpacked, meaning that there is room + for all the intermediate values (which will not be touched by the read + or write). + + Before you set a view, the \c H5PartGetNumParticles() will return the + total number of particles in the current time-step (even for the parallel + reads). However, after you set a view, it will return the number of + particles contained in the view. + + \return \c H5_SUCCESS or \c H5_FAILURE. +*/ +static inline h5_err_t +H5PartSetViewIndices ( + const h5_file_t f, ///< [in] file handle. + const h5_size_t* indices, ///< [in] list of indices. + h5_size_t nelems ///< [in] size of list. + ) { + H5_API_ENTER (h5_err_t, + "f=%p, indices=%p, nelems=%llu", + (h5_file_p)f, indices, (long long unsigned)nelems); + H5_API_RETURN (h5u_set_view_indices (f, indices, nelems)); +} + +/*! + \ingroup h5part_model + + Allows you to query the current view. Start and End + will be \c -1 if there is no current view established. + Use \c H5PartHasView() to see if the view is smaller than the + total dataset. + + \return number of elements in the view + \return \c H5_FAILURE on error +*/ +static inline h5_int64_t +H5PartGetView ( + const h5_file_t f, ///< [in] file handle. + h5_int64_t* start, ///< [out] start particle. + h5_int64_t* end ///< [out] end particle. + ) { + H5_API_ENTER (h5_err_t, + "f=%p, start=%p, end=%p", + (h5_file_p)f, start, end); + H5_API_RETURN (h5u_get_view (f, start, end)); +} + +/*! + \ingroup h5part_model + + If it is too tedious to manually set the start and end coordinates + for a view, the \c H5SetCanonicalView() will automatically select an + appropriate domain decomposition of the data arrays for the degree + of parallelism and set the "view" accordingly. + + \return \c H5_SUCCESS or \c H5_FAILURE. +*/ +static inline h5_int64_t +H5PartSetCanonicalView ( + const h5_file_t f ///< [in] file handle. + ) { + H5_API_ENTER (h5_err_t, + "f=%p", + (h5_file_p)f); + H5_API_RETURN (h5u_set_canonical_view (f)); +} + +#ifdef __cplusplus +} +#endif + +#endif diff --git a/src/include/H5_attribs.h b/src/include/H5_attribs.h new file mode 100644 index 0000000..8e76b58 --- /dev/null +++ b/src/include/H5_attribs.h @@ -0,0 +1,650 @@ +/* + Copyright (c) 2006-2013, The Regents of the University of California, + through Lawrence Berkeley National Laboratory (subject to receipt of any + required approvals from the U.S. Dept. of Energy) and the Paul Scherrer + Institut (Switzerland). All rights reserved. + + License: see file COPYING in top level of source distribution. +*/ + +#ifndef __H5_ATTRIBS_H +#define __H5_ATTRIBS_H + +#include + +#include "h5core/h5_types.h" +#include "h5core/h5.h" +#include "h5core/h5_debug.h" +#include "h5core/h5_attribs.h" + +#ifdef __cplusplus +extern "C" { +#endif + +/*** WRITE ***/ + +/*! + \ingroup h5hut_attrib + + Write an attribute \c name with the string \c value to + the file root ("/"). + + \return \c H5_SUCCESS or \c H5_FAILURE. +*/ +static inline h5_err_t +H5WriteFileAttribString ( + const h5_file_t f, ///< [in] file handle. + const char *name, ///< [in] name of attribute to create. + const char *value ///< [in] value of attribute. + ) { + H5_API_ENTER (h5_err_t, + "f=%p, name='%s', value='%s'", + (h5_file_p)f, name, value); + H5_API_RETURN (h5_write_file_attrib ( + f, + name, + H5T_NATIVE_CHAR, + value, + strlen(value) + 1 )); +} + +/*! + \ingroup h5hut_attrib + + Write an attribute \c name with the string \c value to + the current timestep. + + \return \c H5_SUCCESS or \c H5_FAILURE. +*/ +static inline h5_err_t +H5WriteStepAttribString ( + const h5_file_t f, ///< [in] file handle. + const char *name, ///< [in] name of attribute to create. + const char *value ///< [in] value of attribute. + ) { + H5_API_ENTER (h5_err_t, + "f=%p, name='%s', value='%s'", + (h5_file_p)f, name, value); + H5_API_RETURN (h5_write_step_attrib ( + f, + name, + H5T_NATIVE_CHAR, + value, + strlen(value) + 1 )); +} + +/*! + \ingroup h5hut_attrib + + Write an attribute \c name with float32 \c values to + the file root ("/"). + + \return \c H5_SUCCESS or \c H5_FAILURE. +*/ +static inline h5_err_t +H5WriteFileAttribFloat32 ( + const h5_file_t f, ///< [in] file handle. + const char *name, ///< [in] name of attribute to create. + const h5_float32_t *values, ///< [in] values of attribute. + const h5_size_t nelems ///< [in] number of values. + ) { + H5_API_ENTER (h5_err_t, + "f=%p, name='%s', values=%p, nelems=%llu", + (h5_file_p)f, name, values, (long long unsigned)nelems); + H5_API_RETURN (h5_write_file_attrib ( + f, + name, + H5T_NATIVE_FLOAT, + values, + nelems )); +} + +/*! + \ingroup h5hut_attrib + + Write an attribute \c name with float32 \c values to + the current time step. + + \return \c H5_SUCCESS or \c H5_FAILURE. +*/ +static inline h5_err_t +H5WriteStepAttribFloat32 ( + const h5_file_t f, ///< [in] file handle. + const char *name, ///< [in] name of attribute to create. + const h5_float32_t *values, ///< [in] values of attribute. + const h5_size_t nelems ///< [in] number of values. + ) { + H5_API_ENTER (h5_err_t, + "f=%p, name='%s', values=%p, nelems=%llu", + (h5_file_p)f, name, values, (long long unsigned)nelems); + H5_API_RETURN (h5_write_step_attrib ( + f, + name, + H5T_NATIVE_FLOAT, + values, + nelems )); +} + +/*! + \ingroup h5hut_attrib + + Write an attribute \c name with float64 \c values to + the file root ("/"). + + \return \c H5_SUCCESS or \c H5_FAILURE. +*/ +static inline h5_err_t +H5WriteFileAttribFloat64 ( + const h5_file_t f, ///< [in] file handle. + const char *name, ///< [in] name of attribute to create. + const h5_float64_t *values, ///< [in] values of attribute. + const h5_size_t nelems ///< [in] number of values. + ) { + H5_API_ENTER (h5_err_t, + "f=%p, name='%s', values=%p, nelems=%llu", + (h5_file_p)f, name, values, (long long unsigned)nelems); + H5_API_RETURN (h5_write_file_attrib ( + f, + name, + H5T_NATIVE_DOUBLE, + values, + nelems)); +} + +/*! + \ingroup h5hut_attrib + + Write an attribute \c name with float64 \c values to + the current time step. + + \return \c H5_SUCCESS or \c H5_FAILURE. +*/ +static inline h5_err_t +H5WriteStepAttribFloat64 ( + const h5_file_t f, ///< [in] file handle. + const char *name, ///< [in] name of attribute to create. + const h5_float64_t *values, ///< [in] values of attribute. + const h5_size_t nelems ///< [in] number of values. + ) { + H5_API_ENTER (h5_err_t, + "f=%p, name='%s', values=%p, nelems=%llu", + (h5_file_p)f, name, values, (long long unsigned)nelems); + H5_API_RETURN (h5_write_step_attrib ( + f, + name, + H5T_NATIVE_DOUBLE, + values, + nelems)); +} + +/*! + \ingroup h5hut_attrib + + Write an attribute \c name with int32 \c values to + the file root ("/"). + + \return \c H5_SUCCESS or \c H5_FAILURE. +*/ +static inline h5_err_t +H5WriteFileAttribInt32 ( + const h5_file_t f, ///< [in] file handle. + const char *name, ///< [in] name of attribute to create. + const h5_int32_t *values, ///< [in] values of attribute. + const h5_size_t nelems ///< [in] number of values. + ) { + H5_API_ENTER (h5_err_t, + "f=%p, name='%s', values=%p, nelems=%llu", + (h5_file_p)f, name, values, (long long unsigned)nelems); + H5_API_RETURN (h5_write_file_attrib ( + f, + name, + H5T_NATIVE_INT32, + values, + nelems)); +} + +/*! + \ingroup h5hut_attrib + + Write an attribute \c name with int32 \c values to + the current time step. + + \return \c H5_SUCCESS or \c H5_FAILURE. +*/ +static inline h5_err_t +H5WriteStepAttribInt32 ( + const h5_file_t f, ///< [in] file handle. + const char *name, ///< [in] name of attribute to create. + const h5_int32_t *values, ///< [in] values of attribute. + const h5_size_t nelems ///< [in] number of values. + ) { + H5_API_ENTER (h5_err_t, + "f=%p, name='%s', values=%p, nelems=%llu", + (h5_file_p)f, name, values, (long long unsigned)nelems); + H5_API_RETURN (h5_write_step_attrib ( + f, + name, + H5T_NATIVE_INT32, + values, + nelems)); +} + +/*! + \ingroup h5hut_attrib + + Write an attribute \c name with int64 \c values to + the file root ("/"). + + \return \c H5_SUCCESS or \c H5_FAILURE. +*/ +static inline h5_err_t +H5WriteFileAttribInt64 ( + const h5_file_t f, ///< [in] file handle. + const char *name, ///< [in] name of attribute to create. + const h5_int64_t *values, ///< [in] values of attribute. + const h5_size_t nelems ///< [in] number of values. + ) { + H5_API_ENTER (h5_err_t, + "f=%p, name='%s', values=%p, nelems=%llu", + (h5_file_p)f, name, values, (long long unsigned)nelems); + H5_API_RETURN (h5_write_file_attrib ( + f, + name, + H5T_NATIVE_INT64, + values, + nelems)); +} + +/*! + \ingroup h5hut_attrib + + Write an attribute \c name with int64 \c values to + the current time step. + + \return \c H5_SUCCESS or \c H5_FAILURE. +*/ +static inline h5_err_t +H5WriteStepAttribInt64 ( + const h5_file_t f, ///< [in] file handle. + const char *name, ///< [in] name of attribute to create. + const h5_int64_t *values, ///< [in] values of attribute. + const h5_size_t nelems ///< [in] number of values. + ) { + H5_API_ENTER (h5_err_t, + "f=%p, name='%s', values=%p, nelems=%llu", + (h5_file_p)f, name, values, (long long unsigned)nelems); + H5_API_RETURN (h5_write_step_attrib ( + f, + name, + H5T_NATIVE_INT64, + values, + nelems)); +} + +/*** READ ***/ + +/*! + \ingroup h5hut_attrib + + Read a string into a \c buffer from an attribute \c name + in the file root ("/"). + + \return \c H5_SUCCESS or \c H5_FAILURE. +*/ +static inline h5_err_t +H5ReadFileAttribString ( + const h5_file_t f, ///< [in] file handle. + const char *name, ///< [in] name of attribute to create. + char *buffer ///< [out] value of attribute. + ) { + H5_API_ENTER (h5_err_t, + "f=%p, name='%s', value='%s'", + (h5_file_p)f, name, buffer); + H5_API_RETURN (h5_read_file_attrib ( + f, + name, + H5_STRING_T, + (void*)buffer)); +} + +/*! + \ingroup h5hut_attrib + + Read a string into a \c buffer from an attribute \c name + in the current timestep. + + \return \c H5_SUCCESS or \c H5_FAILURE. +*/ +static inline h5_err_t +H5ReadStepAttribString ( + const h5_file_t f, ///< [in] file handle. + const char *name, ///< [in] name of attribute to create. + char *buffer ///< [out] value of attribute. + ) { + H5_API_ENTER (h5_err_t, + "f=%p, name='%s', value='%s'", + (h5_file_p)f, name, buffer); + H5_API_RETURN (h5_read_step_attrib ( + f, + name, + H5_STRING_T, + (void*)buffer)); +} + +/*! + \ingroup h5hut_attrib + + Read int32 values into a \c buffer from an attribute \c name + in the file root ("/"). + + \return \c H5_SUCCESS or \c H5_FAILURE. +*/ +static inline h5_err_t +H5ReadFileAttribInt32 ( + const h5_file_t f, ///< [in] file handle. + const char *name, ///< [in] name of attribute to create. + h5_int32_t *buffer ///< [out] values of attribute. + ) { + H5_API_ENTER (h5_err_t, + "f=%p, name='%s', buffer=%p", + (h5_file_p)f, name, buffer); + H5_API_RETURN (h5_read_file_attrib ( + f, + name, + H5_INT32_T, + (void*)buffer)); +} + +/*! + \ingroup h5hut_attrib + + Read int32 values into a \c buffer from an attribute \c name + in the current time step. + + \return \c H5_SUCCESS or \c H5_FAILURE. +*/ +static inline h5_err_t +H5ReadStepAttribInt32 ( + const h5_file_t f, ///< [in] file handle. + const char *name, ///< [in] name of attribute to create. + h5_int32_t *buffer ///< [out] values of attribute. + ) { + H5_API_ENTER (h5_err_t, + "f=%p, name='%s', buffer=%p", + (h5_file_p)f, name, buffer); + H5_API_RETURN (h5_read_step_attrib ( + f, + name, + H5_INT32_T, + (void*)buffer)); +} + +/*! + \ingroup h5hut_attrib + + Read int64 values into a \c buffer from an attribute \c name + in the file root ("/"). + + \return \c H5_SUCCESS or \c H5_FAILURE. +*/ +static inline h5_err_t +H5ReadFileAttribInt64 ( + const h5_file_t f, ///< [in] file handle. + const char *name, ///< [in] name of attribute to create. + h5_int64_t *buffer ///< [out] values of attribute. + ) { + H5_API_ENTER (h5_err_t, + "f=%p, name='%s', buffer=%p", + (h5_file_p)f, name, buffer); + H5_API_RETURN (h5_read_file_attrib ( + f, + name, + H5_INT64_T, + (void*)buffer)); +} + +/*! + \ingroup h5hut_attrib + + Read int64 values into a \c buffer from an attribute \c name + in the current time step. + + \return \c H5_SUCCESS or \c H5_FAILURE. +*/ +static inline h5_err_t +H5ReadStepAttribInt64 ( + const h5_file_t f, ///< [in] file handle. + const char *name, ///< [in] name of attribute to create. + h5_int64_t *buffer ///< [out] values of attribute. + ) { + H5_API_ENTER (h5_err_t, + "f=%p, name='%s', buffer=%p", + (h5_file_p)f, name, buffer); + h5_err_t h5err = h5_read_step_attrib ( + f, + name, + H5_INT64_T, + (void*)buffer); + H5_API_RETURN (h5err); +} + +/*! + \ingroup h5hut_attrib + + Read float32 values into a \c buffer from an attribute \c name + in the file root ("/"). + + \return \c H5_SUCCESS or \c H5_FAILURE. +*/ +static inline h5_err_t +H5ReadFileAttribFloat32 ( + const h5_file_t f, ///< [in] file handle. + const char *name, ///< [in] name of attribute to create. + h5_float32_t *buffer ///< [out] values of attribute. + ) { + H5_API_ENTER (h5_err_t, + "f=%p, name='%s', buffer=%p", + (h5_file_p)f, name, buffer); + H5_API_RETURN (h5_read_file_attrib ( + f, + name, + H5_FLOAT32_T, + (void*)buffer)); +} + +/*! + \ingroup h5hut_attrib + + Read float32 values into a \c buffer from an attribute \c name + in the current time step. + + \return \c H5_SUCCESS or \c H5_FAILURE. +*/ +static inline h5_err_t +H5ReadStepAttribFloat32 ( + const h5_file_t f, ///< [in] file handle. + const char *name, ///< [in] name of attribute to create. + h5_float32_t *buffer ///< [out] values of attribute. + ) { + H5_API_ENTER (h5_err_t, + "f=%p, name='%s', buffer=%p", + (h5_file_p)f, name, buffer); + H5_API_RETURN (h5_read_step_attrib ( + f, + name, + H5_FLOAT32_T, + (void*)buffer)); +} + +/*! + \ingroup h5hut_attrib + + Read float64 values into a \c buffer from an attribute \c name + in the file root ("/"). + + \return \c H5_SUCCESS or \c H5_FAILURE. +*/ +static inline h5_err_t +H5ReadFileAttribFloat64 ( + const h5_file_t f, ///< [in] file handle. + const char *name, ///< [in] name of attribute to create. + h5_float64_t *buffer ///< [out] values of attribute. + ) { + H5_API_ENTER (h5_err_t, + "f=%p, name='%s', buffer=%p", + (h5_file_p)f, name, buffer); + H5_API_RETURN (h5_read_file_attrib ( + f, + name, + H5_FLOAT64_T, + (void*)buffer)); +} + +/*! + \ingroup h5hut_attrib + + Read float64 values into a \c buffer from an attribute \c name + in the current time step. + + \return \c H5_SUCCESS or \c H5_FAILURE. +*/ +static inline h5_err_t +H5ReadStepAttribFloat64 ( + const h5_file_t f, ///< [in] file handle. + const char *name, ///< [in] name of attribute to create. + h5_float64_t *buffer ///< [out] values of attribute. + ) { + H5_API_ENTER (h5_err_t, + "f=%p, name='%s', buffer=%p", + (h5_file_p)f, name, buffer); + H5_API_RETURN (h5_read_step_attrib ( + f, + name, + H5_FLOAT64_T, + (void*)buffer)); +} + +/*** QUERY ***/ + +/*! + \ingroup h5hut_attrib + + Gets the number of attributes in the file's root ("/"). + + \return Number of attributes or \c H5_FAILURE.. +*/ +static inline h5_int64_t +H5GetNumFileAttribs ( + const h5_file_t f ///< [in] file handle. + ) { + H5_API_ENTER (h5_int64_t, + "f=%p", + (h5_file_p)f); + H5_API_RETURN (h5_get_num_file_attribs (f)); +} + +/*! + \ingroup h5hut_attrib + + Gets the number of attributes bound to the current step. + + \return Number of attributes or \c H5_FAILURE.. +*/ +static inline h5_int64_t +H5GetNumStepAttribs ( + const h5_file_t f ///< [in] file handle. + ) { + H5_API_ENTER (h5_int64_t, + "f=%p", + (h5_file_p)f); + H5_API_RETURN (h5_get_num_step_attribs (f)); +} + + +/*! + \ingroup h5hut_attrib + + Gets the name, type and number of elements of the file attribute + specified by its index. + + This function can be used to retrieve all attributes bound to the + file \c f by looping from \c 0 to the number of attribute minus + one. The number of attributes bound to file \c f can be queried + by calling \ref H5GetNumFileAttribs. + + \return \c H5_SUCCESS or \c H5_FAILURE. +*/ + +static inline h5_err_t +H5GetFileAttribInfo ( + const h5_file_t f, ///< [in] file handle. + const h5_size_t idx, ///< [in] index of attribute to query + char* name, ///< [out] name of attribute. + const h5_size_t len_name, ///< [in] length of buffer \c name. + h5_int64_t* type, ///< [out] type of value.. + h5_size_t* nelems ///< [out] number of elements. + ) { + H5_API_ENTER (h5_err_t, + "f=%p, " + "idx=%llu, name=%p, len_name=%llu, " + "type=%p, nelems=%p", + (h5_file_p)f, + (long long unsigned)idx, + name, + (long long unsigned)len_name, + type, + nelems); + H5_API_RETURN (h5_get_file_attrib_info ( + f, + idx, + name, len_name, + type, + nelems)); +} + +/*! + \ingroup h5hut_attrib + + Gets the name, type and number of elements of the step attribute + specified by its index. + + This function can be used to retrieve all attributes bound to the + current time-step by looping from \c 0 to the number of attribute + minus one. The number of attributes bound to the current + time-step can be queried by calling \ref H5GetNumStepAttribs. + + \return \c H5_SUCCESS or \c H5_FAILURE. +*/ +static inline h5_err_t +H5GetStepAttribInfo ( + const h5_file_t f, ///< [in] file handle. + const h5_size_t idx, ///< [in] index of attribute to query + char* name, ///< [out] name of attribute. + const h5_size_t len_name, ///< [in] length of buffer \c name. + h5_int64_t* type, ///< [out] type of value.. + h5_size_t* nelems ///< [out] number of elements. + ) { + H5_API_ENTER (h5_err_t, + "f=%p, " + "idx=%llu, name=%p, len_name=%llu, " + "type=%p, nelems=%p", + (h5_file_p)f, + (long long unsigned)idx, + name, + (long long unsigned)len_name, + type, + nelems); + H5_API_RETURN (h5_get_step_attrib_info ( + f, + idx, + name, + len_name, + type, + nelems)); +} + +#ifdef __cplusplus +} +#endif + +#endif diff --git a/src/include/H5_model.h b/src/include/H5_model.h new file mode 100644 index 0000000..8018d3a --- /dev/null +++ b/src/include/H5_model.h @@ -0,0 +1,314 @@ +/* + Copyright (c) 2006-2013, The Regents of the University of California, + through Lawrence Berkeley National Laboratory (subject to receipt of any + required approvals from the U.S. Dept. of Energy) and the Paul Scherrer + Institut (Switzerland). All rights reserved. + + License: see file COPYING in top level of source distribution. +*/ + +#ifndef __H5_MODEL_H +#define __H5_MODEL_H + +#include "h5core/h5_types.h" +#include "h5core/h5.h" +#include "h5core/h5_debug.h" +#include "h5core/h5_model.h" + +#ifdef __cplusplus +extern "C" { +#endif + +/*! + \ingroup h5hut_model + + Define format of the step names. + + Example: ==H5SetStepNameFormat( f, "Step", 6 )== defines step names + like ==Step#000042==. + + \return \c H5_SUCCESS or \c H5_FAILURE +*/ +static inline h5_err_t +H5SetStepNameFormat ( + const h5_file_t f, ///< [in] file handle + const char* name, ///< [in] prefix, defaults to \c Step + const h5_int64_t width ///< [in] width of step number + ) { + H5_API_ENTER (h5_err_t, + "f=%p, name='%s', width=%lld", + (h5_file_p)f, name, (long long) width); + H5_API_RETURN (h5_set_stepname_fmt (f, name, width)); +} + +/*! + \ingroup h5hut_model + + Get format of the step names. + + \return \c H5_SUCCESS or \c H5_FAILURE +*/ +static inline h5_err_t +H5GetStepNameFormat ( + const h5_file_t f, ///< [in] file handle + char* name, ///< [out] prefix + const h5_size_t l_name, ///< [in] length of buffer name + int* width ///< [out] width of step number + ) { + H5_API_ENTER (h5_err_t, + "f=%p, name=%p, l_name=%llu, width=%p", + (h5_file_p)f, name, (unsigned long long)l_name, width); + H5_API_RETURN (h5_get_stepname_fmt (f, name, l_name, width)); +} + +/*! + \ingroup h5hut_model + + Set the current step. + + \return \c H5_SUCCESS or \c H5_FAILURE +*/ +static inline h5_err_t +H5SetStep ( + const h5_file_t f, ///< [in] file handle. + const h5_id_t step ///< [in] step to set. + ) { + H5_API_ENTER (h5_err_t, + "f=%p, step=%lld", + (h5_file_p)f, (long long)step); + H5_API_RETURN (h5_set_step (f, step)); +} + +/*! + \ingroup h5hut_model + + Get current step. + + \return Step index + \return H5_FAILURE on error +*/ +static inline h5_id_t +H5GetStep ( + const h5_file_t f ///< [in] file handle. + ) { + H5_API_ENTER (h5_err_t, + "f=%p", + (h5_file_p)f); + H5_API_RETURN (h5_get_step (f)); +} + +/*! + \ingroup h5hut_model + + Get the number of processors. + + \return Number of processors. + \return \c H5_FAILURE on error. + */ +static inline int +H5GetNumProcs ( + const h5_file_t f ///< [in] file handle. + ) { + H5_API_ENTER (h5_err_t, + "f=%p", + (h5_file_p)f); + H5_API_RETURN (h5_get_num_procs(f)); +} + +/*! + \ingroup h5hut_model + + Get the number of time-steps that are currently stored in the file + \c f. + + It works for both reading and writing of files, but is probably + only typically used when you are reading. + + \return Number of time-steps + \return \c H5_FAILURE on error. +*/ +static inline h5_ssize_t +H5GetNumSteps ( + const h5_file_t f ///< [in] file handle. + ) { + H5_API_ENTER (h5_err_t, + "f=%p", + (h5_file_p)f); + H5_API_RETURN (h5_get_num_steps(f)); +} + +/*! + \ingroup h5hut_model + + Query whether a particular step already exists in the file. + + \return \c 1 if step exists + \return \c 0 if step does not exist + \return \c H5_FAILURE on error +*/ +static inline h5_err_t +H5HasStep ( + const h5_file_t f, ///< [in] file handle. + h5_id_t stepno ///< [in] step number to query for existence. + ) { + H5_API_ENTER (h5_err_t, + "f=%p, stepno=%lld", + (h5_file_p)f, (long long)stepno); + H5_API_RETURN (h5_has_step (f, stepno)); +} + +/*! + \ingroup h5hut_model + + Start traversing steps. + + \note This function is not yet implemented! + + \return \c H5_SUCCESS or \c H5_FAILURE +*/ +static inline h5_err_t +H5StartTraverseSteps ( + const h5_file_t f ///< [in] file handle. + ) { + H5_API_ENTER (h5_err_t, + "f=%p", + (h5_file_p)f); + H5_API_RETURN (h5_start_traverse_steps (f)); +} + +/*! + \ingroup h5hut_model + + Go to next step. + + \note This function is not yet implemented! + + \return \c H5_SUCCESS or \c H5_FAILURE +*/ +static inline h5_err_t +H5TraverseSteps ( + const h5_file_t f ///< [in] file handle. + ) { + H5_API_ENTER (h5_err_t, + "f=%p", + (h5_file_p)f); + H5_API_RETURN (h5_traverse_steps (f)); +} + +/*! + \ingroup h5hut_model + + Return number of attached files. + + \return number of attachments. + \return \c H5_FAILURE on error. +*/ +static inline h5_ssize_t +H5GetNumAttachments ( + const h5_file_t f ///< [in] file handle. + ) { + H5_API_ENTER (h5_ssize_t, + "f=%p", + (h5_file_p)f); + H5_API_RETURN (h5_get_num_attachments (f)); +} + +/*! + \ingroup h5hut_model + + Get name and size of attachment given by index \c idx. Return the file name + in \c fname and the original size in \c fsize. + + \return \c H5_SUCCESS or \c H5_FAILURE +*/ +static inline h5_err_t +H5GetAttachmentInfoByIdx ( + const h5_file_t f, ///< [in] file handle. + const h5_size_t idx, ///< [in] index of attachment to be queried. + char* const fname, ///< [out] original file name. + h5_size_t len_fname, ///< [in] max length of file name. + h5_size_t* const fsize ///< [out] size of original file. + ) { + H5_API_ENTER (h5_err_t, + "idx=%llu, fname=%p, len_fname=%llu, fsize=%p", + (long long unsigned)idx, + fname, (long long unsigned)len_fname, + fsize); + H5_API_RETURN (h5_get_attachment_info_by_idx ( + f, idx, fname, len_fname, fsize)); +} + +/*! + \ingroup h5hut_model + + Get size of attached file with name \c fname. + + \return \c H5_SUCCESS or \c H5_FAILURE +*/ +static inline h5_err_t +H5GetAttachmentInfoByName ( + const h5_file_t f, ///< [in] file handle. + char* const fname, ///< [in] original file name. + h5_size_t* const fsize ///< [out] size of original file. + ) { + H5_API_ENTER (h5_err_t, "fname='%s', fsize=%p", fname, fsize); + H5_API_RETURN (h5_get_attachment_info_by_name ( + f, fname, fsize)); +} + +/*! + \ingroup h5hut_model + + Attach file \c fname. + + \return \c H5_SUCCESS or \c H5_FAILURE +*/ +static inline h5_err_t +H5AddAttachment ( + const h5_file_t f, ///< [in] file handle. + const char* fname ///< [in] name of file to attach. + ) { + H5_API_ENTER (h5_err_t, "fname='%s'", fname); + H5_API_RETURN (h5_add_attachment (f, fname)); +} + +/*! + \ingroup h5hut_model + + Get attachment \c fname from H5hut file and write it to disk in + the current working directory. + + \return \c H5_SUCCESS or \c H5_FAILURE +*/ +static inline h5_err_t +H5GetAttachment ( + const h5_file_t f, ///< [in] file handle. + const char* fname ///< [in] name of attachment. + ) { + H5_API_ENTER (h5_err_t, "fname='%s'", fname); + H5_API_RETURN (h5_get_attachment (f, fname)); +} + +/*! + \ingroup h5hut_model + + Delete attachment \c fname. + + \return \c H5_SUCCESS or \c H5_FAILURE +*/ +static inline h5_err_t +H5DeleteAttachment ( + const h5_file_t f, ///< [in] file handle. + const char* const fname ///< [in] name of attachment. + ) { + H5_API_ENTER (h5_err_t, "fname='%s'", fname); + H5_API_RETURN (h5_delete_attachment (f, fname)); +} + +#ifdef __cplusplus +} +#endif + +#endif + + diff --git a/src/include/H5hut.h b/src/include/H5hut.h new file mode 100644 index 0000000..cc46e53 --- /dev/null +++ b/src/include/H5hut.h @@ -0,0 +1,18 @@ +/* + Copyright (c) 2006-2012, The Regents of the University of California, + through Lawrence Berkeley National Laboratory (subject to receipt of any + required approvals from the U.S. Dept. of Energy) and the Paul Scherrer + Institut (Switzerland). All rights reserved. + + License: see file COPYING in top level of source distribution. +*/ + +#ifndef __H5HUT_H +#define __H5HUT_H + +#include "H5.h" +#include "H5Part.h" +#include "H5Block.h" +#include "H5Fed.h" + +#endif diff --git a/src/include/Makefile.am b/src/include/Makefile.am new file mode 100644 index 0000000..bbeca23 --- /dev/null +++ b/src/include/Makefile.am @@ -0,0 +1,29 @@ +# src/C level Makefile.am + +# Header files that I wish to install in $(prefix)/include +include_HEADERS = \ + ../include/h5core/h5.h \ + ../include/h5core/h5_attribs.h \ + ../include/h5core/h5_debug.h \ + ../include/h5core/h5_errorhandling.h \ + ../include/h5core/h5_model.h \ + ../include/h5core/h5_syscall.h \ + ../include/h5core/h5_types.h \ + ../include/h5core/h5b_attribs.h \ + ../include/h5core/h5b_model.h \ + ../include/h5core/h5b_io.h \ + ../include/h5core/h5t_adjacencies.h \ + ../include/h5core/h5t_map.h \ + ../include/h5core/h5t_model.h \ + ../include/h5core/h5t_retrieve.h \ + ../include/h5core/h5t_store.h \ + ../include/h5core/h5t_tags.h \ + ../include/h5core/h5u_model.h \ + ../include/h5core/h5u_io.h + +# Listing of all possible headers that I may include +EXTRA_HEADERS = + +clean-local: + $(RM) *~ + $(RM) h5core/*~ diff --git a/src/include/h5core/h5.h b/src/include/h5core/h5.h new file mode 100644 index 0000000..27f7fff --- /dev/null +++ b/src/include/h5core/h5.h @@ -0,0 +1,123 @@ +/* + Copyright (c) 2006-2013, The Regents of the University of California, + through Lawrence Berkeley National Laboratory (subject to receipt of any + required approvals from the U.S. Dept. of Energy) and the Paul Scherrer + Institut (Switzerland). All rights reserved. + + License: see file COPYING in top level of source distribution. +*/ + +#ifndef __H5CORE_H5_H +#define __H5CORE_H5_H + +#include "h5core/h5_types.h" +#include + +#define UNUSED_ARGUMENT(x) (void)x + + +#ifdef __cplusplus +extern "C" { +#endif + +extern int h5_initialized; + +h5_err_t +h5_initialize (void); + +hid_t +h5_get_hdf5_file( + const h5_file_t); + +h5_prop_t +h5_create_prop ( + const h5_int64_t); + +h5_err_t +h5_set_prop_file_throttle ( + h5_prop_t, const h5_int64_t); + +h5_err_t +h5_set_prop_file_align ( + h5_prop_t, const h5_int64_t); + +h5_err_t +h5_set_prop_file_mpio ( + h5_prop_t, MPI_Comm* const); + +h5_err_t +h5_close_prop ( + h5_prop_t); + +h5_file_t +h5_open_file ( + const char*, const h5_int32_t, MPI_Comm, const h5_size_t); + +h5_file_t +h5_open_file2 ( + const char*, const h5_int32_t, h5_prop_t prop); + +h5_err_t +h5_check_filehandle ( + const h5_file_t); + +h5_err_t +h5_close_file ( + const h5_file_t); + +h5_err_t +h5_close_hdf5 ( + void); + + +h5_err_t +h5_flush_step ( + const h5_file_t); + +h5_err_t +h5_flush_file ( + const h5_file_t); + +h5_err_t +h5_set_stepname_fmt ( + const h5_file_t, const char*, const int); + +h5_err_t +h5_get_stepname_fmt ( + const h5_file_t, char* const, const int, int* const); + +int +h5_get_num_procs ( + const h5_file_t); + +h5_ssize_t +h5_get_num_steps ( + const h5_file_t); + +h5_int64_t +h5_has_step ( + const h5_file_t, const h5_int64_t); + +h5_int64_t +h5_get_step ( + const h5_file_t); + +h5_err_t +h5_start_traverse_steps ( + const h5_file_t); + +h5_err_t +h5_traverse_steps ( + const h5_file_t); + +h5_err_t +h5_set_throttle ( + h5_file_t f, + int factor + ); + +#ifdef __cplusplus +} +#endif + +#endif diff --git a/src/include/h5core/h5_attribs.h b/src/include/h5core/h5_attribs.h new file mode 100644 index 0000000..8fd752c --- /dev/null +++ b/src/include/h5core/h5_attribs.h @@ -0,0 +1,57 @@ +/* + Copyright (c) 2006-2012, The Regents of the University of California, + through Lawrence Berkeley National Laboratory (subject to receipt of any + required approvals from the U.S. Dept. of Energy) and the Paul Scherrer + Institut (Switzerland). All rights reserved. + + License: see file COPYING in top level of source distribution. +*/ + +#ifndef __H5CORE_H5_ATTRIBS_H +#define __H5CORE_H5_ATTRIBS_H + +#include "h5core/h5_types.h" + +#ifdef __cplusplus +extern "C" { +#endif + +h5_err_t +h5_read_file_attrib ( + const h5_file_t, const char*, const hid_t, void*); + +h5_err_t +h5_read_step_attrib ( + const h5_file_t, const char*, const hid_t, void*); + +h5_err_t +h5_write_file_attrib ( + const h5_file_t, const char*, const hid_t, const void*, const hsize_t); + +h5_err_t +h5_write_step_attrib ( + const h5_file_t, const char*, const hid_t, const void*, const hsize_t); + +h5_err_t +h5_get_file_attrib_info ( + const h5_file_t, const h5_size_t, char*, const h5_size_t, h5_int64_t* const, + h5_size_t*); + +h5_err_t +h5_get_step_attrib_info ( + const h5_file_t, const h5_size_t, char*, const h5_size_t, h5_int64_t*, + h5_size_t*); + +h5_ssize_t +h5_get_num_file_attribs ( + const h5_file_t); + +h5_ssize_t +h5_get_num_step_attribs ( + const h5_file_t); + +#ifdef __cplusplus +} +#endif + +#endif diff --git a/src/include/h5core/h5_debug.h b/src/include/h5core/h5_debug.h new file mode 100644 index 0000000..f4cf82a --- /dev/null +++ b/src/include/h5core/h5_debug.h @@ -0,0 +1,142 @@ +/* + Copyright (c) 2006-2013, The Regents of the University of California, + through Lawrence Berkeley National Laboratory (subject to receipt of any + required approvals from the U.S. Dept. of Energy) and the Paul Scherrer + Institut (Switzerland). All rights reserved. + + License: see file COPYING in top level of source distribution. +*/ + +#ifndef __H5CORE_H5_DEBUG_H +#define __H5CORE_H5_DEBUG_H + +#include "h5core/h5_types.h" +#include "h5core/h5_errorhandling.h" + +#ifdef __cplusplus +extern "C" { +#endif + +#define H5_DEBUG_USER (1<<2) +#define H5_DEBUG_API (1<<3) +#define H5_DEBUG_CORE_API (1<<4) +#define H5_DEBUG_PRIV_API (1<<5) +#define H5_DEBUG_PRIV_FUNC (1<<6) +#define H5_DEBUG_HDF5 (1<<7) +#define H5_DEBUG_MPI (1<<8) +#define H5_DEBUG_MALLOC (1<<9) +#define H5_DEBUG_CLIB (1<<10) + +#define H5_DEBUG_ALL (-1) + +extern char* h5_rfmts[]; + +////////////////////////////////////////////////////////////////////////////// +// function enter macro +#if defined(NDEBUG) + +#define __API_ENTER(type, mask, fmt, ...) \ + h5_call_stack_init (__func__,e_##type); \ + type ret_value = (type)H5_ERR; + +#define __FUNC_ENTER(type, mask, fmt, ...) \ + type ret_value = (type)H5_ERR; + +#else // NDEBUG not defined + +#define __API_ENTER(type, mask, fmt, ...) \ + h5_call_stack_push (__func__,e_##type); \ + type ret_value = (type)H5_ERR; \ + if (h5_debug_level & mask ) { \ + h5_debug ("(" fmt ")", __VA_ARGS__); \ + } + +#define __FUNC_ENTER(type, mask, fmt, ...) \ + type ret_value = (type)H5_ERR; \ + if (h5_debug_level & mask ) { \ + h5_call_stack_push (__func__,e_##type); \ + h5_debug ("(" fmt ")", __VA_ARGS__); \ + } \ + +#endif +// +////////////////////////////////////////////////////////////////////////////// + +#define __API_LEAVE(expr) { \ + ret_value = expr; \ + goto done; \ + } + +#define __FUNC_LEAVE(expr) { \ + ret_value = expr; \ + goto done; \ +} + +////////////////////////////////////////////////////////////////////////////// +// function return macro +#if defined(NDEBUG) + +#define __API_RETURN(expr, mask) \ + ret_value = expr; \ + goto done; \ +done: \ + h5_call_stack_reset (); \ + return ret_value; + +#define __FUNC_RETURN(expr, mask) \ + ret_value = expr; \ + goto done; \ +done: \ + return ret_value; + +#else // NDEBUG not defined + +#define __API_RETURN(expr, mask) \ + ret_value = expr; \ + goto done; \ +done: \ + if (h5_debug_level & mask ) { \ + char fmt[256]; \ + snprintf (fmt, sizeof(fmt), "return: %s", \ + h5_rfmts[h5_call_stack_get_type()]); \ + h5_debug (fmt, ret_value); \ + } \ + h5_call_stack_reset (); \ + return ret_value; + +#define __FUNC_RETURN(expr, mask) \ + ret_value = expr; \ + goto done; \ +done: \ + if (h5_debug_level & mask ) { \ + char fmt[256]; \ + snprintf (fmt, sizeof(fmt), "return: %s", \ + h5_rfmts[h5_call_stack_get_type()]); \ + h5_debug (fmt, ret_value); \ + h5_call_stack_pop(); \ + } \ + return ret_value; + +#endif +// +////////////////////////////////////////////////////////////////////////////// + +#define H5_API_ENTER(type, fmt, ...) \ + if (!h5_initialized) { \ + h5_initialize(); \ + } \ + __API_ENTER(type, H5_DEBUG_API, fmt, __VA_ARGS__) +#define H5_API_LEAVE(expr) __API_LEAVE(expr) +#define H5_API_RETURN(expr) __API_RETURN(expr, H5_DEBUG_API); + + +#define TRY( func ) \ + if ((int64_t)(ptrdiff_t)(func) <= (int64_t)H5_ERR) { \ + goto done; \ + } + +#ifdef __cplusplus +} +#endif + +#endif diff --git a/src/include/h5core/h5_errorhandling.h b/src/include/h5core/h5_errorhandling.h new file mode 100644 index 0000000..9e3881b --- /dev/null +++ b/src/include/h5core/h5_errorhandling.h @@ -0,0 +1,321 @@ +/* + Copyright (c) 2006-2013, The Regents of the University of California, + through Lawrence Berkeley National Laboratory (subject to receipt of any + required approvals from the U.S. Dept. of Energy) and the Paul Scherrer + Institut (Switzerland). All rights reserved. + + License: see file COPYING in top level of source distribution. +*/ + +#ifndef __H5CORE_H5_ERRORHANDLING_H +#define __H5CORE_H5_ERRORHANDLING_H + +#include +#include +#include "h5core/h5_types.h" + +#ifdef __cplusplus +extern "C" { +#endif + +/** + \addtogroup h5hut_error + @{ +*/ + +#define H5_SUCCESS 0 ///< Function performs successfully +#define H5_OK H5_SUCCESS ///< Alias for \c H5_SUCCESS +#define H5_NOK -1 ///< +#define H5_FAILURE -2 ///< Function runs into an error +#define H5_ERR H5_FAILURE ///< Alias for H5_FAILURE + +#define H5_ERR_BADF -9 ///< Something is wrong with the file handle. +#define H5_ERR_NOMEM -12 ///< Out of memory. +#define H5_ERR_INVAL -22 ///< Invalid argument. + +#define H5_ERR_VIEW -100 ///< Something is wrong with the view. +#define H5_ERR_NOENTRY -101 ///< A lookup failed. + +#define H5_ERR_MPI -201 ///< A MPI error occured. +#define H5_ERR_HDF5 -202 ///< A HDF5 error occured. +#define H5_ERR_H5 -203 ///< Unspecified error in H5 module. +#define H5_ERR_H5PART -204 ///< Unspecified error in H5Part module. +#define H5_ERR_H5BLOCK -205 ///< Unspecified error in H5Block module. +#define H5_ERR_H5FED -206 ///< Unspecified error in H5Fed module. + +#define H5_ERR_INTERNAL -253 ///< Internal error. +#define H5_ERR_NOT_IMPLEMENTED -254 ///< Function not yet implemented. + +/** @}*/ + +enum h5_rtypes { + e_int = 0, + e_ssize_t, + e_char_p, + e_void_p, + e_h5_err_t, + e_h5_int64_t, + e_h5_id_t, + e_h5_ssize_t, + e_h5_errorhandler_t, + e_h5_file_p, + e_h5_file_t, + e_h5_lvl_idx_t, + e_h5t_iterator_p, + e_h5_loc_id_t, + e_h5_loc_idx_t, + e_hid_t, + e_H5O_type_t, + e_h5_glb_elem_p, + e_h5_prop_p, + e_h5_prop_t, + e_h5_prop_file_p, + e_h5_prop_file_t, + e_herr_t +}; + +struct call_stack_entry { + char* name; + enum h5_rtypes type; +}; + +struct call_stack { + int level; + struct call_stack_entry entry[1024]; +}; + +extern h5_int32_t h5_debug_level; +extern struct call_stack h5_call_stack; +extern h5_err_t h5_errno; + +#define h5_error_not_implemented() \ + h5_error( \ + H5_ERR_NOT_IMPLEMENTED, \ + "%s: Function '%s', line %d not yet implemented!", \ + __FILE__, __func__, __LINE__); + +#define h5_error_internal() \ + h5_error( \ + H5_ERR_INTERNAL, \ + "%s: Internal error: %s line %d!", \ + __FILE__, __func__, __LINE__) + + +h5_err_t +h5_set_debuglevel ( + const h5_id_t); + +h5_err_t +h5_get_debuglevel ( + void); + +h5_err_t +h5_set_errorhandler ( + const h5_errorhandler_t); + +h5_errorhandler_t +h5_get_errorhandler ( + void); + +h5_err_t +h5_get_errno ( + void); + +void +h5_set_errno ( + const h5_err_t); + +static inline void +h5_call_stack_init ( + const char* fname, + enum h5_rtypes type + ) { + h5_call_stack.level = 0; + h5_call_stack.entry[0].name = (char *)fname; + h5_call_stack.entry[0].type = type; +} + +static inline void +h5_call_stack_push ( + const char* fname, + enum h5_rtypes type + ) { + h5_call_stack.entry[h5_call_stack.level].name = (char *)fname; + h5_call_stack.entry[h5_call_stack.level].type = type; + h5_call_stack.level++; +} + +static inline const char* +h5_call_stack_pop ( + void + ) { + return h5_call_stack.entry[--h5_call_stack.level].name; +} + +static inline const char* +h5_call_stack_get_name ( + void + ) { + return h5_call_stack.entry[h5_call_stack.level-1].name; +} + +static inline const char* +h5_get_funcname ( + void + ) { + return h5_call_stack.entry[0].name; +} + +static inline enum h5_rtypes +h5_call_stack_get_type ( + void + ) { + return h5_call_stack.entry[h5_call_stack.level-1].type; +} + +static inline int +h5_call_stack_get_level ( + void + ) { + return h5_call_stack.level; +} + +static inline const char* +h5_call_stack_reset ( + void + ) { + h5_call_stack.level = 0; + return h5_call_stack.entry[0].name; +} + +h5_err_t +h5_report_errorhandler ( + const char *fmt, + va_list ap + ); + +h5_err_t +h5_abort_errorhandler ( + const char *fmt, + va_list ap + ); + +void +h5priv_vprintf ( + FILE* f, + const char* prefix, + const char* __funcname, + const char* fmt, + va_list ap + ); + +h5_err_t +h5_error ( + const h5_err_t error_no, + const char *fmt, + ... + ) +#ifdef __GNUC__ +__attribute__ ((format (printf, 2, 3))) +#endif +; + +void +h5_verror ( + const char* fmt, + va_list ap + ); + +/*! + \ingroup h5_core_errorhandling + + Print a warning message to \c stderr. + */ + +static inline h5_err_t +h5_warn ( + const char *fmt, + ... + ) +#ifdef __GNUC__ +__attribute__ ((format (printf, 1, 2))) +#endif +; +static inline h5_err_t +h5_warn ( + const char* fmt, + ... + ) { + if (h5_debug_level >= 2) { + va_list ap; + va_start (ap, fmt); + h5priv_vprintf (stderr, "W", h5_get_funcname(), fmt, ap); + va_end (ap); + } + return H5_NOK; +} + +/*! + \ingroup h5_core_errorhandling + + Print an informational message to \c stdout. + */ +static inline void +h5_info ( + const char *fmt, + ... + ) +#ifdef __GNUC__ +__attribute__ ((format (printf, 1, 2))) +#endif +; +static inline void +h5_info ( + const char* fmt, + ... + ) { + if (h5_debug_level >= 3) { + va_list ap; + va_start (ap, fmt); + h5priv_vprintf (stdout, "I", h5_get_funcname(), fmt, ap); + va_end (ap); + } +} + +/*! + \ingroup h5_core_errorhandling + + Print a debug message to \c stdout. + */ +static inline void +h5_debug ( + const char *fmt, + ... + ) +#ifdef __GNUC__ +__attribute__ ((format (printf, 1, 2))) +#endif +; + +static inline void +h5_debug ( + const char *fmt, + ... + ) { + if (h5_debug_level >= 4) { + char prefix[1024]; + snprintf (prefix, sizeof(prefix), "%*s %s", + h5_call_stack_get_level(), "", + h5_call_stack_get_name()); + va_list ap; + va_start (ap, fmt); + h5priv_vprintf (stdout, "D", prefix, fmt, ap); + va_end (ap); + } +} + +#ifdef __cplusplus +} +#endif + +#endif diff --git a/src/include/h5core/h5_model.h b/src/include/h5core/h5_model.h new file mode 100644 index 0000000..9683680 --- /dev/null +++ b/src/include/h5core/h5_model.h @@ -0,0 +1,55 @@ +/* + Copyright (c) 2006-2013, The Regents of the University of California, + through Lawrence Berkeley National Laboratory (subject to receipt of any + required approvals from the U.S. Dept. of Energy) and the Paul Scherrer + Institut (Switzerland). All rights reserved. + + License: see file COPYING in top level of source distribution. +*/ + +#ifndef __H5CORE_H5_MODEL +#define __H5CORE_H5_MODEL + +#include "h5core/h5_types.h" + +#ifdef __cplusplus +extern "C" { +#endif + +h5_int64_t +h5_set_step ( + const h5_file_t, const h5_int64_t); + +h5_err_t +h5_add_attachment ( + const h5_file_t, const char* const); + +h5_ssize_t +h5_get_num_attachments ( + const h5_file_t); + +h5_err_t +h5_get_attachment_info_by_idx ( + const h5_file_t, const h5_size_t, char* const, h5_size_t, h5_size_t* const); + +h5_err_t +h5_get_attachment_info_by_name ( + const h5_file_t, const char* const, h5_size_t* const); + +h5_err_t +h5_get_attachment ( + const h5_file_t, const char* const); + +h5_err_t +h5_delete_attachment ( + const h5_file_t, const char* const); + + +#ifdef __cplusplus +} +#endif +extern int dont_use_parmetis; // Warning bad style! used for switching without makro and recompiling... +extern int max_num_elems_p_chunk; // used for switching chunksize without recompiling +extern int preferred_direction; // DITO used for choosing direction without recompiling + +#endif diff --git a/src/include/h5core/h5_syscall.h b/src/include/h5core/h5_syscall.h new file mode 100644 index 0000000..b76eab3 --- /dev/null +++ b/src/include/h5core/h5_syscall.h @@ -0,0 +1,97 @@ +/* + Copyright (c) 2006-2013, The Regents of the University of California, + through Lawrence Berkeley National Laboratory (subject to receipt of any + required approvals from the U.S. Dept. of Energy) and the Paul Scherrer + Institut (Switzerland). All rights reserved. + + License: see file COPYING in top level of source distribution. +*/ + +#ifndef __H5CORE_H5_SYSCALL_H +#define __H5CORE_H5_SYSCALL_H + +#include +#include + +#include "h5core/h5_types.h" +#include "h5core/h5_debug.h" +#include "h5core/h5_errorhandling.h" + +#define MALLOC_WRAPPER_ENTER(type, fmt, ...) \ + __FUNC_ENTER(type, H5_DEBUG_MALLOC, fmt, __VA_ARGS__) +#define MALLOC_WRAPPER_LEAVE(value) __FUNC_LEAVE(value) +#define MALLOC_WRAPPER_RETURN(value) __FUNC_RETURN(value, H5_DEBUG_MALLOC) + +#ifdef __cplusplus +extern "C" { +#endif + + +static inline h5_err_t +h5_free ( + void* ptr + ) { + MALLOC_WRAPPER_ENTER (h5_err_t, "ptr=%p", ptr); + if (ptr) { + free (ptr); + } + MALLOC_WRAPPER_RETURN (H5_SUCCESS); +} + + +static inline void_p +h5_alloc ( + void* ptr, + const size_t size + ) { + MALLOC_WRAPPER_ENTER (void_p, "ptr=%p, size=%lu", ptr, size); + if (size < 1) { + ret_value = (void_p) h5_free (ptr); + MALLOC_WRAPPER_LEAVE (NULL); + } + ptr = realloc (ptr, size); + if (ptr == NULL) { + MALLOC_WRAPPER_LEAVE ( + (void_p)h5_error (H5_ERR_NOMEM, "Out of memory. Tried to alloc %lld", (long long int)size)); + } + MALLOC_WRAPPER_RETURN (ptr); +} + +static inline void_p +h5_calloc ( + const size_t count, + const size_t size + ) { + MALLOC_WRAPPER_ENTER (void_p, "count=%zu , size=%zu", count, size); + void* ptr = NULL; + if (count * size < 1) { + MALLOC_WRAPPER_LEAVE (ptr); + } + ptr = calloc (count, size); + if (ptr == NULL) { + MALLOC_WRAPPER_LEAVE ( + (void_p)h5_error (H5_ERR_NOMEM, "Out of memory. Tried to alloc %lld", (long long int)count* size)); + } + MALLOC_WRAPPER_RETURN (ptr); +} + + +static inline char_p +h5_strdup ( + const char* s1 + ) { + MALLOC_WRAPPER_ENTER (char_p, "s='%s'", s1); + + char_p s2 = (char_p)h5_calloc (1, strlen (s1)+1 ); + if (s2 == NULL) { + MALLOC_WRAPPER_LEAVE ( + (char_p)h5_error (H5_ERR_NOMEM, "Out of memory.")); + } + MALLOC_WRAPPER_RETURN (strcpy (s2, s1)); +} + +#ifdef __cplusplus +} +#endif + +#endif diff --git a/src/include/h5core/h5_types.h b/src/include/h5core/h5_types.h new file mode 100644 index 0000000..4afc977 --- /dev/null +++ b/src/include/h5core/h5_types.h @@ -0,0 +1,162 @@ +/* + Copyright (c) 2006-2013, The Regents of the University of California, + through Lawrence Berkeley National Laboratory (subject to receipt of any + required approvals from the U.S. Dept. of Energy) and the Paul Scherrer + Institut (Switzerland). All rights reserved. + + License: see file COPYING in top level of source distribution. +*/ + +#ifndef __H5CORE_H5_TYPES_H +#define __H5CORE_H5_TYPES_H + +//#include +#include +#include + +#ifdef __cplusplus +extern "C" { +#endif + +/* + file modes: + H5_O_RDONLY: only reading allowed + H5_O_WRONLY: create new file, dataset must not exist + H5_O_APPEND: allows to append a new datasets to an existing file + H5_O_RDWR: dataset may exist + */ + +#define H5_O_RDWR 0x001 +#define H5_O_RDONLY 0x002 +#define H5_O_WRONLY 0x004 +#define H5_O_APPEND 0x008 + +#define H5_VFD_MPIPOSIX 0x00000010 +#define H5_VFD_MPIIO_IND 0x00000020 +#define H5_VFD_CORE 0x00000040 + +#define H5_FLUSH_FILE 0x040 +#define H5_FLUSH_STEP 0x080 +#define H5_FLUSH_DATASET 0x100 + +#define H5_FS_LUSTRE 0x200 + +#define H5_ID_T H5T_NATIVE_INT64 +#define H5_FLOAT64_T H5T_NATIVE_DOUBLE +#define H5_FLOAT32_T H5T_NATIVE_FLOAT +#define H5_INT64_T H5T_NATIVE_INT64 +#define H5_INT32_T H5T_NATIVE_INT32 +#define H5_INT16_T H5T_NATIVE_INT16 +#define H5_UINT16_T H5T_NATIVE_UINT16 +#define H5_STRING_T H5T_NATIVE_CHAR +#define H5_COMPOUND_T H5T_COMPOUND + +#define H5_VER_STRING "2.0.0" + +extern const char * const H5_O_MODES[]; + +#ifdef WIN32 +typedef __int64 int64_t; +#endif /* WIN32 */ + +typedef int64_t h5_int64_t; +typedef int32_t h5_int32_t; +typedef uint64_t h5_uint64_t; +typedef uint32_t h5_uint32_t; +typedef int64_t h5_id_t; +typedef int16_t h5_lvl_idx_t; +typedef int64_t h5_glb_idx_t; // type for a global index +typedef int64_t h5_glb_id_t; // type for a global ID + +#if defined(USE_LARGE_INDICES) +typedef int64_t h5_loc_idx_t; // type for a local index +typedef int64_t h5_loc_id_t; // type for a local ID +#else +typedef int32_t h5_loc_idx_t; // type for a local index +typedef int32_t h5_loc_id_t; // type for a local ID +#endif + +typedef int32_t h5_chk_idx_t; // type for a chunk index + +typedef uint64_t h5_size_t; // size in number of elements +typedef int64_t h5_ssize_t; // size in number of elements */ +typedef int64_t h5_err_t; +typedef int64_t h5_chk_weight_t;// type for a chunk weight +typedef uint16_t h5_chk_size_t; // type for number of elements in chunk +typedef int32_t h5_weight_t; // type for weights +typedef double h5_time_t; // type for storing a time + +typedef char* char_p; +typedef void* void_p; +typedef double h5_float64_t; +typedef float h5_float32_t; + +typedef struct h5_complex { + h5_float64_t r,i; +} h5_complex_t; + +typedef h5_float64_t h5_coord3d_t[3]; + +struct h5_prop; +typedef struct h5_prop* h5_prop_p; +typedef uintptr_t h5_prop_t; + +struct h5_prop_file; +typedef struct h5_prop_file* h5_prop_file_p; + +struct h5_file; +typedef struct h5_file* h5_file_p; +typedef uintptr_t h5_file_t; + +struct h5t_mesh; +typedef struct h5t_mesh h5t_mesh_t; +typedef h5t_mesh_t* h5t_mesh_p; + +typedef h5_err_t (*h5_errorhandler_t)( + const char*, + va_list ap ); + +#ifndef PARALLEL_IO +typedef int MPI_Comm; +typedef int MPI_Datatype; +#endif + +typedef struct h5_loc_idlist { + int32_t size; /* allocated space in number of items */ + int32_t num_items; /* stored items */ + int32_t flags; + h5_loc_id_t items[1]; +} h5_loc_idlist_t; + +typedef struct h5_glb_idlist { + int32_t size; /* allocated space in number of items */ + int32_t num_items; /* stored items */ + h5_glb_id_t items[1]; +} h5_glb_idlist_t; + +typedef struct h5_loc_idxlist { + int32_t size; /* allocated space in number of items */ + int32_t num_items; /* stored items */ + h5_loc_idx_t items[1]; +} h5_loc_idxlist_t; + +typedef struct h5_glb_idxlist { + int32_t size; /* allocated space in number of items */ + int32_t num_items; /* stored items */ + h5_glb_idx_t items[1]; +} h5_glb_idxlist_t; + +struct h5_idxmap; +typedef struct h5_idxmap h5_idxmap_t; + +#define H5_TRIANGLE_MESH (H5_OID_TRIANGLE) +#define H5_TETRAHEDRAL_MESH (H5_OID_TETRAHEDRON) + +#define H5_PROP_DEFAULT (0) +#define H5_PROP_FILE (1) + +#ifdef __cplusplus +} +#endif + +#endif diff --git a/src/include/h5core/h5b_attribs.h b/src/include/h5core/h5b_attribs.h new file mode 100644 index 0000000..d9dc6e3 --- /dev/null +++ b/src/include/h5core/h5b_attribs.h @@ -0,0 +1,55 @@ +/* + Copyright (c) 2006-2013, The Regents of the University of California, + through Lawrence Berkeley National Laboratory (subject to receipt of any + required approvals from the U.S. Dept. of Energy) and the Paul Scherrer + Institut (Switzerland). All rights reserved. + + License: see file COPYING in top level of source distribution. +*/ + +#ifndef __H5CORE_H5B_ATTRIBS_H +#define __H5CORE_H5B_ATTRIBS_H + +#include "h5core/h5_types.h" + +#ifdef __cplusplus +extern "C" { +#endif + +h5_err_t +h5b_write_field_attrib ( + const h5_file_t, + const char*, const char*, const hid_t, const void*, const h5_int64_t); + +h5_err_t +h5b_read_field_attrib ( + const h5_file_t, + const char*, const char*, const h5_int64_t, void* const); + +h5_ssize_t +h5b_get_num_field_attribs ( + const h5_file_t, + const char*); + +h5_err_t +h5b_get_field_attrib_info ( + const h5_file_t, + const char*, const h5_size_t, char* const, const h5_size_t, + h5_int64_t* const, h5_size_t*); + +h5_err_t +h5b_set_3d_field_coords ( + const h5_file_t, + const int, const char* const, const char* const, + const h5_float64_t* const, const h5_int64_t n_coords); + +h5_err_t +h5b_get_3d_field_coords ( + const h5_file_t, + const int rank, const char* const, const char* const, + h5_float64_t* const, const h5_int64_t); +#ifdef __cplusplus +} +#endif + +#endif diff --git a/src/include/h5core/h5b_io.h b/src/include/h5core/h5b_io.h new file mode 100644 index 0000000..8e5fcd2 --- /dev/null +++ b/src/include/h5core/h5b_io.h @@ -0,0 +1,43 @@ +/* + Copyright (c) 2006-2013, The Regents of the University of California, + through Lawrence Berkeley National Laboratory (subject to receipt of any + required approvals from the U.S. Dept. of Energy) and the Paul Scherrer + Institut (Switzerland). All rights reserved. + + License: see file COPYING in top level of source distribution. +*/ + +#ifndef __H5CORE_H5B_IO_H +#define __H5CORE_H5B_IO_H + +#include "h5core/h5_types.h" + +#ifdef __cplusplus +extern "C" { +#endif + +h5_err_t +h5b_write_scalar_data ( + const h5_file_t, + const char*, const void*, const hid_t); + +h5_err_t +h5b_write_vector3d_data ( + const h5_file_t, + const char*, const void*, const void*, const void*, const hid_t); + +h5_err_t +h5b_read_scalar_data ( + const h5_file_t, + const char*, void*, const hid_t); + +h5_err_t +h5b_read_vector3d_data ( + const h5_file_t, + const char*, void*, void*, void*, const hid_t); + +#ifdef __cplusplus +} +#endif + +#endif diff --git a/src/include/h5core/h5b_model.h b/src/include/h5core/h5b_model.h new file mode 100644 index 0000000..81b840c --- /dev/null +++ b/src/include/h5core/h5b_model.h @@ -0,0 +1,102 @@ +/* + Copyright (c) 2006-2013, The Regents of the University of California, + through Lawrence Berkeley National Laboratory (subject to receipt of any + required approvals from the U.S. Dept. of Energy) and the Paul Scherrer + Institut (Switzerland). All rights reserved. + + License: see file COPYING in top level of source distribution. +*/ + +#ifndef __H5CORE_H5B_MODEL_H +#define __H5CORE_H5B_MODEL_H + +#include "h5core/h5_types.h" + +#ifdef __cplusplus +extern "C" { +#endif + +h5_err_t +h5b_has_field_data ( + const h5_file_t); + +h5_int64_t +h5b_3d_has_view ( + const h5_file_t f); + +h5_err_t +h5b_3d_set_view ( + const h5_file_t, + const h5_size_t, const h5_size_t, + const h5_size_t, const h5_size_t, + const h5_size_t, const h5_size_t); + +h5_err_t +h5b_3d_get_view ( + const h5_file_t, + h5_size_t* const, h5_size_t* const, + h5_size_t* const, h5_size_t* const, + h5_size_t* const, h5_size_t* const); + +h5_err_t +h5b_3d_get_reduced_view ( + const h5_file_t, + h5_size_t* const, h5_size_t* const, + h5_size_t* const, h5_size_t* const, + h5_size_t* const, h5_size_t* const); + +h5_err_t +h5b_3d_set_chunk ( + const h5_file_t, + const h5_size_t, const h5_size_t, const h5_size_t k); + +h5_err_t +h5b_3d_get_chunk ( + const h5_file_t, + const char*, + h5_size_t* const, h5_size_t* const, h5_size_t* const); + +#if defined(PARALLEL_IO) +h5_err_t +h5b_3d_set_grid ( + const h5_file_t, + const h5_size_t, const h5_size_t, const h5_size_t); + +h5_err_t +h5b_3d_get_grid_coords ( + const h5_file_t, + const int, + h5_int64_t* const, h5_int64_t* const, h5_int64_t* const); + +h5_err_t +h5b_3d_set_dims ( + const h5_file_t, + const h5_size_t, const h5_size_t, const h5_size_t); +#endif + +h5_err_t +h5b_3d_set_halo ( + const h5_file_t, const h5_size_t, const h5_size_t, const h5_size_t); + +h5_ssize_t +h5b_get_num_fields ( + const h5_file_t); + +h5_err_t +h5b_get_field_info_by_name ( + const h5_file_t, + const char* name, + h5_size_t* const, h5_size_t* const, h5_size_t* const, h5_int64_t* const); + +h5_err_t +h5b_get_field_info ( + const h5_file_t, + const h5_size_t, + char* const, const h5_size_t, + h5_size_t* const, h5_size_t* const, h5_size_t* const, h5_int64_t* const); + +#ifdef __cplusplus +} +#endif + +#endif diff --git a/src/include/h5core/h5t_adjacencies.h b/src/include/h5core/h5t_adjacencies.h new file mode 100644 index 0000000..e5038d9 --- /dev/null +++ b/src/include/h5core/h5t_adjacencies.h @@ -0,0 +1,45 @@ +/* + Copyright (c) 2006-2013, The Regents of the University of California, + through Lawrence Berkeley National Laboratory (subject to receipt of any + required approvals from the U.S. Dept. of Energy) and the Paul Scherrer + Institut (Switzerland). All rights reserved. + + License: see file COPYING in top level of source distribution. +*/ + +#ifndef __H5CORE_H5T_ADJACENCIES_H +#define __H5CORE_H5T_ADJACENCIES_H + +#include "h5core/h5_types.h" + +#ifdef __cplusplus +extern "C" { +#endif + +h5_err_t +h5t_get_adjacencies ( + h5t_mesh_t* const m, + const h5_loc_id_t entity_id, + const h5_int32_t dim, + h5_loc_idlist_t **list + ); + +h5_err_t +h5t_release_list_of_adjacencies ( + h5t_mesh_t* const m, + h5_loc_idlist_t **list + ); + +h5_err_t +h5t_find_te2 ( + h5t_mesh_t* const m, + h5_loc_idx_t face_idx, + h5_loc_idx_t elem_idx, + h5_loc_idlist_t** retval + ); + +#ifdef __cplusplus +} +#endif + +#endif diff --git a/src/include/h5core/h5t_map.h b/src/include/h5core/h5t_map.h new file mode 100644 index 0000000..ddb3e8d --- /dev/null +++ b/src/include/h5core/h5t_map.h @@ -0,0 +1,117 @@ +/* + Copyright (c) 2006-2013, The Regents of the University of California, + through Lawrence Berkeley National Laboratory (subject to receipt of any + required approvals from the U.S. Dept. of Energy) and the Paul Scherrer + Institut (Switzerland). All rights reserved. + + License: see file COPYING in top level of source distribution. +*/ + +#ifndef __H5T_MAP_H +#define __H5T_MAP_H + +#include "h5core/h5_types.h" + +#ifdef __cplusplus +extern "C" { +#endif + +h5_loc_idx_t +h5t_map_global_vertex_idx2local ( + h5t_mesh_t* const m, + h5_glb_idx_t glb_idx + ); + +h5_err_t +h5t_map_global_vertex_indices2local ( + h5t_mesh_t* f, + const h5_glb_id_t* const glb_indices, + const h5_size_t size, + h5_loc_idx_t* const loc_indices + ); + +h5_loc_idx_t +h5t_map_glb_elem_idx2loc ( + h5t_mesh_t* const m, + const h5_glb_idx_t glb_idx + ); + +h5_err_t +h5t_map_glb_elem_indices2loc ( + h5t_mesh_t* const m, + const h5_glb_idx_t* glb_indices, + const h5_size_t size, + h5_loc_idx_t* loc_indices + ); + +h5_err_t +h5t_get_loc_vertex_index_of_vertex ( + h5t_mesh_t* const m, + const h5_loc_id_t entity_id, + h5_loc_idx_t* vertex_index + ); + +h5_err_t +h5t_get_loc_vertex_index_of_vertex2 ( + h5t_mesh_t* const m, + const h5_loc_idx_t face_idx, + const h5_loc_idx_t elem_idx, + h5_loc_idx_t* vertex_indices + ); + +h5_err_t +h5t_get_loc_vertex_indices_of_edge ( + h5t_mesh_t* const m, + const h5_loc_id_t entity_id, + h5_loc_idx_t *vertex_indices + ); + +h5_err_t +h5t_get_loc_vertex_indices_of_edge2 ( + h5t_mesh_t* const m, + const h5_loc_idx_t face_idx, + const h5_loc_idx_t elem_id, + h5_loc_idx_t* vertex_indices + ); + +h5_err_t +h5t_get_loc_vertex_indices_of_triangle ( + h5t_mesh_t* const m, + const h5_loc_id_t entity_id, + h5_loc_idx_t* vertex_indices + ); + +h5_err_t +h5t_get_loc_vertex_indices_of_triangle2 ( + h5t_mesh_t* const m, + const h5_loc_idx_t face_idx, + const h5_loc_idx_t elem_idx, + h5_loc_idx_t* vertex_indices + ); + +h5_err_t +h5t_get_loc_vertex_indices_of_tet ( + h5t_mesh_t* const m, + const h5_loc_id_t entity_id, + h5_loc_idx_t *vertex_indices + ); + +h5_err_t +h5t_get_loc_vertex_indices_of_entity ( + h5t_mesh_t* const m, + const h5_loc_id_t entity_id, + h5_loc_idx_t *vertex_indices + ); + +h5_err_t +h5t_get_glb_vertex_indices_of_entity ( + h5t_mesh_t* const m, + const h5_loc_id_t entity_id, + h5_glb_idx_t *vertex_indices + ); + +#ifdef __cplusplus +} +#endif + +#endif diff --git a/src/include/h5core/h5t_model.h b/src/include/h5core/h5t_model.h new file mode 100644 index 0000000..9ba4a44 --- /dev/null +++ b/src/include/h5core/h5t_model.h @@ -0,0 +1,92 @@ +/* + Copyright (c) 2006-2013, The Regents of the University of California, + through Lawrence Berkeley National Laboratory (subject to receipt of any + required approvals from the U.S. Dept. of Energy) and the Paul Scherrer + Institut (Switzerland). All rights reserved. + + License: see file COPYING in top level of source distribution. +*/ + +#ifndef __H5CORE_H5T_MODEL_H +#define __H5CORE_H5T_MODEL_H + +#include "h5core/h5_types.h" + +#ifdef __cplusplus +extern "C" { +#endif + +#define H5_GEOBORDER_ENTITY 1 +#define H5_INTERIOR_ENTITY 2 +#define H5_BORDER_ENTITY 4 +#define H5_OVERLAP_ENTITY 8 +#define H5_FRONT_ENTITY 16 +#define H5_GHOST_ENTITY 32 +#define H5_LEAF_ENTITY 64 + +h5_err_t h5t_open_tetrahedral_mesh (const h5_file_t, const char*, h5t_mesh_t**); +h5_err_t h5t_open_tetrahedral_mesh_by_idx (const h5_file_t, const h5_id_t, h5t_mesh_t**); +h5_err_t h5t_open_tetrahedral_mesh_part (const h5_file_p, const char*, h5t_mesh_t** mesh, + h5_glb_idx_t*, h5_glb_idx_t); +h5_ssize_t h5t_get_num_tetmeshes (const h5_file_t f); + + +// TODO just removed svn comment, need to check if ok +h5_err_t +h5t_open_triangle_mesh ( + const h5_file_t, const char*, h5t_mesh_t**); + +h5_err_t +h5t_open_triangle_mesh_by_idx ( + const h5_file_t, const h5_id_t, h5t_mesh_t**); + +h5_err_t +h5t_open_triangle_mesh_part ( + const h5_file_t, const char*, h5t_mesh_t** mesh, + h5_glb_idx_t*, h5_glb_idx_t); + +h5_lvl_idx_t h5t_is_chunked (h5t_mesh_t* const); + +h5_ssize_t h5t_get_num_trimeshes (const h5_file_t f); + +h5_ssize_t h5t_get_num_leaf_levels (h5t_mesh_t* const); + +h5_ssize_t h5t_get_num_vertices (h5t_mesh_t* const, const h5_id_t); + +h5_ssize_t h5t_get_num_leaf_elems (h5t_mesh_t* const, const h5_id_t); + +h5_id_t h5t_add_chunked_tetrahedral_mesh (const h5_file_t, const char* name, h5t_mesh_t**); + +h5_id_t h5t_add_triangle_mesh (const h5_file_t, const char*, h5t_mesh_t**); + +h5_id_t h5t_add_chunked_triangle_mesh (const h5_file_t, const char*, h5t_mesh_t**); + +h5_lvl_idx_t h5t_get_level (h5t_mesh_t* const); + +h5_err_t h5t_open_tetrahedral_mesh (const h5_file_t , + const char*, h5t_mesh_t**); +h5_err_t h5t_open_tetrahedral_mesh_by_idx (const h5_file_t , + const h5_id_t, h5t_mesh_t**); + +h5_err_t h5t_open_triangle_mesh (const h5_file_t, + const char*, h5t_mesh_t**); +h5_err_t h5t_open_triangle_mesh_by_idx (const h5_file_t, + const h5_id_t, h5t_mesh_t**); +h5_id_t h5t_add_tetrahedral_mesh (const h5_file_t, + const char* name, h5t_mesh_t**); +h5_id_t h5t_add_triangle_mesh (const h5_file_t, + const char*, h5t_mesh_t**); + +h5_err_t h5t_set_level (h5t_mesh_t* const, const h5_lvl_idx_t); + +h5_err_t h5t_set_mesh_changed (h5t_mesh_t* const m); + +h5_err_t h5t_close_mesh (h5t_mesh_t* const); + + + +#ifdef __cplusplus +} +#endif + +#endif diff --git a/src/include/h5core/h5t_octree.h b/src/include/h5core/h5t_octree.h new file mode 100644 index 0000000..d15688e --- /dev/null +++ b/src/include/h5core/h5t_octree.h @@ -0,0 +1,58 @@ +/* + Copyright (c) 2006-2013, The Regents of the University of California, + through Lawrence Berkeley National Laboratory (subject to receipt of any + required approvals from the U.S. Dept. of Energy) and the Paul Scherrer + Institut (Switzerland). All rights reserved. + + License: see file COPYING in top level of source distribution. +*/ + +#ifndef __H5T_OCTREE_H +#define __H5T_OCTREE_H + +#include "h5core/h5_types.h" + +#ifdef __cplusplus +extern "C" { +#endif + +// it is very unlikely that there are more than 2^32 octants needed. since there is no id +// we dont need that... +//#if defined(USE_LARGE_INDICES) +//typedef int64_t h5_oct_idx_t; // type for a octant +//typedef h5_uint64_t h5_oct_userlev_t; // type for user defined levels +//#define OCT_USERLEV_LENGTH 64 +//#else +typedef h5_int32_t h5_oct_idx_t; // type for a octant +typedef h5_uint32_t h5_oct_userlev_t; // type for user defined levels +#define OCT_USERLEV_LENGTH 32 +//#endif + +typedef h5_int32_t h5_oct_level_t; +typedef int16_t h5_oct_orient_t; // orientation of an octant +typedef int16_t h5_oct_dir_t; // direction to look for neighboring octants + + +#define OCT_CHG_INTERNAL 11 +#define OCT_CHG_USERDATA 12 +#define OCT_X 13 +#define OCT_Y 14 +#define OCT_Z 15 + +struct h5_oct_point; +typedef struct h5_oct_point h5_oct_point_t; + +struct h5_octant; +typedef struct h5_octant h5t_octant_t; + +struct h5_octree; +typedef struct h5_octree h5t_octree_t; + +struct h5t_oct_iterator; +typedef struct h5t_oct_iterator h5t_oct_iterator_t; + +#ifdef __cplusplus +} +#endif + +#endif diff --git a/src/include/h5core/h5t_retrieve.h b/src/include/h5core/h5t_retrieve.h new file mode 100644 index 0000000..57fb65f --- /dev/null +++ b/src/include/h5core/h5t_retrieve.h @@ -0,0 +1,96 @@ +/* + Copyright (c) 2006-2013, The Regents of the University of California, + through Lawrence Berkeley National Laboratory (subject to receipt of any + required approvals from the U.S. Dept. of Energy) and the Paul Scherrer + Institut (Switzerland). All rights reserved. + + License: see file COPYING in top level of source distribution. +*/ + +#ifndef __H5CORE_H5T_RETRIEVE_H +#define __H5CORE_H5T_RETRIEVE_H + +#include "h5core/h5_types.h" + +#ifdef __cplusplus +extern "C" { +#endif + +struct h5t_ref_elem; +struct h5t_tagset; +struct h5t_iterator; + +typedef struct { + h5t_mesh_t* mesh; + h5_loc_id_t (*iter)(struct h5t_iterator*); + h5_lvl_idx_t leaf_level; + const struct h5t_ref_elem* ref_elem; + h5_loc_idx_t elem_idx; + h5_loc_idx_t face_idx; // face according reference element + int codim; // dimension of entities to traverse + h5_err_t (*find)(h5t_mesh_t *const, h5_loc_id_t, h5_loc_id_t, h5_loc_idlist_t**); +} h5t_leaf_iterator_t; + +typedef struct { + h5t_mesh_t* mesh; + h5_loc_id_t (*iter)(struct h5t_iterator* iter); + h5_lvl_idx_t refinement_level; + const struct h5t_ref_elem* ref_elem; + h5_loc_idx_t elem_idx; + h5_loc_idx_t face_idx; // face according reference element + int codim; // dimension of entities to traverse + h5_err_t (*find)(h5t_mesh_t *const f, h5_loc_id_t face_idx, + h5_loc_id_t elem_idx, h5_loc_idlist_t **retval); +} h5t_level_iterator_t; + +typedef struct { + h5t_mesh_t* mesh; + h5_loc_id_t (*iter)(struct h5t_iterator* iter); + h5_lvl_idx_t level_idx; + struct h5t_tagset* tagset; + h5_loc_idx_t elem_idx; + int subentity_idx; +} h5t_tag_iterator_t; + +typedef struct h5t_iterator { + h5t_mesh_t* mesh; + h5_loc_id_t (*iter)(struct h5t_iterator* iter); +} h5t_iterator_t; + + +typedef h5t_iterator_t* h5t_iterator_p; + +h5_err_t +h5t_init_leaf_iterator (h5t_iterator_t*, h5t_mesh_t*, const int); + +h5_err_t +h5t_init_boundary_face_iterator (h5t_iterator_t*, h5t_mesh_t*, const int); + +h5_err_t +h5t_init_mtag_iterator (h5t_iterator_t*, h5t_mesh_t*, const char*); + +h5_err_t +h5t_release_entity_iterator (h5t_iterator_t*); + +h5_loc_id_t +h5t_iterate_entities (h5t_iterator_t*); + +h5_err_t +h5t_end_iterate_entities (h5t_iterator_t*); + +h5_err_t +h5t_get_vertex_coords_by_index (h5t_mesh_t* const, h5_loc_idx_t, h5_float64_t[3]); + +h5_err_t +h5t_get_vertex_coords_by_id (h5t_mesh_t* const, h5_loc_id_t, h5_float64_t[3]); + +h5_err_t +h5t_get_vertex_by_id (h5t_mesh_t* const, const h5_loc_id_t, h5_glb_idx_t*, h5_float64_t*[]); + +h5_err_t +h5t_get_neighbor_indices (h5t_mesh_t* const, h5_loc_id_t, h5_loc_idx_t*); +#ifdef __cplusplus +} +#endif + +#endif diff --git a/src/include/h5core/h5t_store.h b/src/include/h5core/h5t_store.h new file mode 100644 index 0000000..e3c09da --- /dev/null +++ b/src/include/h5core/h5t_store.h @@ -0,0 +1,83 @@ +/* + Copyright (c) 2006-2013, The Regents of the University of California, + through Lawrence Berkeley National Laboratory (subject to receipt of any + required approvals from the U.S. Dept. of Energy) and the Paul Scherrer + Institut (Switzerland). All rights reserved. + + License: see file COPYING in top level of source distribution. +*/ + +#ifndef __H5CORE_H5T_STORE_H +#define __H5CORE_H5T_STORE_H + +#include "h5core/h5_types.h" + +#ifdef __cplusplus +extern "C" { +#endif + +h5_err_t +h5t_begin_store_vertices ( + h5t_mesh_t* const, const h5_size_t); + +h5_loc_id_t +h5t_store_vertex ( + h5t_mesh_t* const, const h5_glb_id_t, const h5_float64_t[3]); + +h5_err_t +h5t_end_store_vertices ( + h5t_mesh_t* const); + +h5_err_t +h5t_begin_store_elems ( + h5t_mesh_t* const, const h5_size_t, const h5_weight_t); + +h5_loc_idx_t +h5t_store_elem ( + h5t_mesh_t* const, const h5_loc_idx_t, const h5_loc_idx_t*, const h5_weight_t*); + +h5_loc_idx_t +h5t_store_elem2 ( + h5t_mesh_t* const, const h5_loc_idx_t, const h5_loc_idx_t*, const h5_weight_t*); + +h5_err_t +h5t_end_store_elems ( + h5t_mesh_t* const); + +h5_err_t +h5t_end_store_ckd_elems ( + h5t_mesh_t* const m); + +h5_err_t +h5t_begin_refine_elems ( + h5t_mesh_t* const); + +h5_err_t +h5t_refine_marked_elems ( + h5t_mesh_t* const); + +h5_err_t +h5t_end_refine_elems ( + h5t_mesh_t* const); + +h5_err_t +h5t_mark_entity ( + h5t_mesh_t* const, const h5_loc_id_t); + +h5_err_t +h5t_pre_refine ( + h5t_mesh_t* const); + +h5_err_t +h5t_refine ( + h5t_mesh_t* const); + +h5_err_t +h5t_post_refine ( + h5t_mesh_t* const); + +#ifdef __cplusplus +} +#endif + +#endif diff --git a/src/include/h5core/h5t_tags.h b/src/include/h5core/h5t_tags.h new file mode 100644 index 0000000..f0f878b --- /dev/null +++ b/src/include/h5core/h5t_tags.h @@ -0,0 +1,57 @@ +/* + Copyright (c) 2006-2013, The Regents of the University of California, + through Lawrence Berkeley National Laboratory (subject to receipt of any + required approvals from the U.S. Dept. of Energy) and the Paul Scherrer + Institut (Switzerland). All rights reserved. + + License: see file COPYING in top level of source distribution. +*/ + +#ifndef __H5CORE_H5T_TAGS_H +#define __H5CORE_H5T_TAGS_H + +#include "h5core/h5_types.h" + +#ifdef __cplusplus +extern "C" { +#endif + +typedef struct h5t_tagset h5t_tagset_t; +typedef struct h5t_tagcontainer h5t_tagcontainer_t; + +h5_ssize_t +h5t_get_num_mtagsets (h5t_mesh_t* const); + +h5_err_t +h5t_get_mtagset_info (h5t_mesh_t* const, const h5_size_t, char[], + const h5_size_t, h5_int64_t* const); + +h5_err_t +h5t_mtagset_exists (h5t_mesh_t* const, const char* const); + +h5_err_t +h5t_create_mtagset (h5t_mesh_t* const, const char[], const h5_id_t, h5t_tagset_t**); + +h5_err_t +h5t_open_mtagset (h5t_mesh_t* const, const char* const, h5t_tagset_t**); + +h5_err_t +h5t_close_mtagset (h5t_tagset_t*); + +h5_err_t +h5t_remove_mtagset (h5t_mesh_t* const, const char[]); + +h5_err_t +h5t_set_tag (h5t_tagset_t* const, const h5_loc_id_t, const h5_size_t, void*); + +h5_loc_id_t +h5t_get_tag (const h5t_tagset_t*, const h5_loc_id_t, h5_size_t* const, void* const); + +h5_err_t +h5t_remove_tag (h5t_tagset_t*, const h5_loc_id_t); + +#ifdef __cplusplus +} +#endif + +#endif diff --git a/src/include/h5core/h5u_io.h b/src/include/h5core/h5u_io.h new file mode 100644 index 0000000..a0fcece --- /dev/null +++ b/src/include/h5core/h5u_io.h @@ -0,0 +1,34 @@ +/* + Copyright (c) 2006-2013, The Regents of the University of California, + through Lawrence Berkeley National Laboratory (subject to receipt of any + required approvals from the U.S. Dept. of Energy) and the Paul Scherrer + Institut (Switzerland). All rights reserved. + + License: see file COPYING in top level of source distribution. +*/ + +#ifndef __H5CORE_H5U_IO_H +#define __H5CORE_H5U_IO_H + +#include "h5core/h5_types.h" + +#ifdef __cplusplus +extern "C" { +#endif + +h5_int64_t +h5u_read_data ( + const h5_file_t, + const char* const, void* const, const hid_t); + +h5_int64_t +h5u_write_data ( + const h5_file_t, + const char* const, const void* const, const hid_t); + +#ifdef __cplusplus +} +#endif + +#endif + diff --git a/src/include/h5core/h5u_model.h b/src/include/h5core/h5u_model.h new file mode 100644 index 0000000..64719ac --- /dev/null +++ b/src/include/h5core/h5u_model.h @@ -0,0 +1,101 @@ +/* + Copyright (c) 2006-2013, The Regents of the University of California, + through Lawrence Berkeley National Laboratory (subject to receipt of any + required approvals from the U.S. Dept. of Energy) and the Paul Scherrer + Institut (Switzerland). All rights reserved. + + License: see file COPYING in top level of source distribution. +*/ + +#ifndef __H5CORE_H5U_MODEL_H +#define __H5CORE_H5U_MODEL_H + +#include "h5core/h5_types.h" + +#ifdef __cplusplus +extern "C" { +#endif + +h5_ssize_t +h5u_get_num_particles ( + const h5_file_t); + +h5_ssize_t +h5u_get_num_particles_in_view ( + const h5_file_t); + +h5_ssize_t +h5u_get_totalnum_particles_by_name ( + const h5_file_t, + const char* const); + +h5_ssize_t +h5u_get_totalnum_particles_by_idx ( + const h5_file_t, + h5_id_t); + +h5_err_t +h5u_set_num_particles ( + const h5_file_t, + const h5_size_t, const h5_size_t); + +h5_err_t +h5u_has_view ( + const const h5_file_t); + +h5_err_t +h5u_reset_view ( + const h5_file_t); + +h5_err_t +h5u_set_view ( + const h5_file_t, const h5_int64_t, const h5_int64_t); + +h5_err_t +h5u_set_view_indices ( + const h5_file_t, + const h5_size_t* const, const h5_size_t); + +h5_err_t +h5u_get_view ( + const h5_file_t, + h5_int64_t* const, h5_int64_t* const); + +h5_err_t +h5u_set_canonical_view ( + const h5_file_t); + +h5_ssize_t +h5u_get_num_datasets ( + const h5_file_t); + +h5_err_t +h5u_get_dataset_info ( + const h5_file_t, + const h5_id_t, char* const, const h5_size_t, h5_int64_t* const, + h5_size_t* const); + +h5_err_t +h5u_get_dataset_info_by_name ( + const h5_file_p f, + const char* const dataset_name, + h5_int64_t* const type, + h5_size_t* const nelem + ); + +h5_err_t +h5u_set_chunk ( + const h5_file_t, + const h5_size_t); + +h5_err_t +h5u_get_chunk ( + const h5_file_t, + const char*, h5_size_t*); + +#ifdef __cplusplus +} +#endif + +#endif + diff --git a/test/Makefile.am b/test/Makefile.am new file mode 100644 index 0000000..a74461d --- /dev/null +++ b/test/Makefile.am @@ -0,0 +1,38 @@ +# test level Makefile.am + +OBJEXT=o + +AM_CPPFLAGS = -I../src/include @AM_CPPFLAGS@ + +LDADD = \ + ../src/lib/libH5hut.a + +noinst_PROGRAMS = @BUILD_TESTS@ + +TESTS_ENVIRONMENT = env LD_LIBRARY_PATH=@HDF5_PREFIX@/lib:$(LD_LIBRARY_PATH) +TESTS = @BUILD_TESTS@ + +EXTRA_PROGRAMS = h5u_test h5b_test h5_attach_test + +h5u_test_SOURCES = \ + h5u_test.c \ + h5u_write.c \ + h5u_read.c \ + testframe.c \ + testframe.h \ + params.h + +h5b_test_SOURCES = \ + h5b_test.c \ + h5b_write.c \ + h5b_read.c \ + testframe.c \ + testframe.h \ + params.h + +h5_attach_test_SOURCES = \ + h5_attach_test.c + +clean-local: + ${RM} -f *.h5 + diff --git a/test/h5_attach_test.c b/test/h5_attach_test.c new file mode 100644 index 0000000..f12900c --- /dev/null +++ b/test/h5_attach_test.c @@ -0,0 +1,34 @@ +#include +#include +#include +#include + +#define FNAME "h5_attach.h5" +#define ATTACHMENT "h5_attach_test" + + +int +main ( + int argc, + char* argv[] + ) { + H5SetErrorHandler (H5AbortErrorhandler); + H5SetVerbosityLevel (255); + h5_file_t f = H5OpenFile (FNAME, H5_O_WRONLY, 0); + H5AddAttachment (f, ATTACHMENT); + H5CloseFile (f); + f = H5OpenFile (FNAME, H5_O_RDONLY, 0); + h5_ssize_t num_attachments = H5GetNumAttachments (f); + printf ("Number of attachments: %lld\n", num_attachments); + int i; + char fname[FILENAME_MAX]; + h5_size_t fsize; + for (i=0; i < num_attachments; i++) { + H5GetAttachmentInfoByIdx (f, i, fname, sizeof(fname), &fsize); + printf ("Attachment %d: Name: %s, Size: %llu\n", i, fname, fsize); + H5GetAttachment (f, fname); + H5DeleteAttachment (f, fname); + } + H5CloseFile (f); + return 0; +} diff --git a/test/h5b_read.c b/test/h5b_read.c new file mode 100644 index 0000000..9d7aba7 --- /dev/null +++ b/test/h5b_read.c @@ -0,0 +1,283 @@ +#include +#include +#include "testframe.h" +#include "params.h" + +static void +test_read_field_attribs( + h5_file_t file, + const char *field_name, + int position) +{ + h5_err_t status; + char name[ATTR_NAME_SIZE]; + char str[ATTR_NAME_SIZE]; + h5_int32_t i32; + h5_int64_t i64; + h5_float32_t f32; + h5_float64_t f64; + + TEST("Reading field attributes"); + + i64 = H5BlockGetNumFieldAttribs(file, field_name); + VALUE(i64 % 5, 0, "file attribute count"); + + get_attr_name(name, "str", position); + status = H5BlockReadFieldAttribString( + file, field_name, name, str); + RETURN(status, H5_SUCCESS, "H5BlockReadFieldAttribString"); + SVALUE(str, ATTR_STR_VAL, "string attribute"); + + get_attr_name(name, "i32", position); + status = H5BlockReadFieldAttribInt32( + file, field_name, name, &i32); + RETURN(status, H5_SUCCESS, "H5BlockReadFieldAttribInt32"); + IVALUE(i32, ATTR_INT32_VAL, "int32 attribute"); + + get_attr_name(name, "i64", position); + status = H5BlockReadFieldAttribInt64( + file, field_name, name, &i64); + RETURN(status, H5_SUCCESS, "H5BlockReadFieldAttribInt64"); + IVALUE(i64, ATTR_INT64_VAL, "int64 attribute"); + + get_attr_name(name, "f32", position); + status = H5BlockReadFieldAttribFloat32( + file, field_name, name, &f32); + RETURN(status, H5_SUCCESS, "H5BlockReadFieldAttribFloat32"); + FVALUE(f32, ATTR_FLOAT_VAL, "float32 attribute"); + + get_attr_name(name, "f64", position); + status = H5BlockReadFieldAttribFloat64( + file, field_name, name, &f64); + RETURN(status, H5_SUCCESS, "H5BlockReadFieldAttribFloat64"); + FVALUE(f64, ATTR_FLOAT_VAL, "float64 attribute"); +} + +static void +test_read_data64(h5_file_t file, int step) +{ + extern h5_size_t grid[3]; + extern h5_size_t layout[6]; + + int i,t; + int rank, nprocs; + h5_err_t status; + h5_int64_t val, type[2]; + char name[4]; + h5_size_t field_rank[2], field_dims[6], elem_rank[2]; + + double *e; + double *ex,*ey,*ez; + h5_int64_t *id; + + const size_t nelems = + (layout[1] - layout[0] + 1) * + (layout[3] - layout[2] + 1) * + (layout[5] - layout[4] + 1); + + e=(double*)malloc(nelems*sizeof(double)); + ex=(double*)malloc(nelems*sizeof(double)); + ey=(double*)malloc(nelems*sizeof(double)); + ez=(double*)malloc(nelems*sizeof(double)); + id=(h5_int64_t*)malloc(nelems*sizeof(h5_int64_t)); + + TEST("Verifying dataset info"); + +#if defined(PARALLEL_IO) + MPI_Comm_rank(MPI_COMM_WORLD, &rank); + MPI_Comm_size(MPI_COMM_WORLD, &nprocs); +#else + nprocs = 1; + rank = 2; +#endif + + status = H5SetStep(file, step); + RETURN(status, H5_SUCCESS, "H5SetStep"); + + val = H5BlockGetNumFields(file); + IVALUE(val, 3, "field count"); + + for (i=0; i<3; i++) { + status = H5BlockGetFieldInfo( + file, i, name, 4, + field_rank, field_dims, elem_rank, type); + RETURN(status, H5_SUCCESS, "H5BlockGetFieldInfo"); + + status = H5BlockGetFieldInfoByName( + file, name, + field_rank+1, field_dims+3, elem_rank+1, type+1); + RETURN(status, H5_SUCCESS, "H5BlockGetFieldInfoByName"); + IVALUE(field_rank[0], field_rank[1], "field rank"); + IVALUE(field_dims[0], field_dims[3], "field dims x"); + IVALUE(field_dims[1], field_dims[4], "field dims y"); + IVALUE(field_dims[2], field_dims[5], "field dims z"); + IVALUE(elem_rank[0], elem_rank[1], "elem rank"); + IVALUE(type[0], type[1], "field type"); + + IVALUE(field_rank[0], 3, "field rank"); + IVALUE(field_dims[0], grid[0]*NBLOCKX, "field dims x"); + IVALUE(field_dims[1], grid[1]*NBLOCKY, "field dims y"); + IVALUE(field_dims[2], grid[2]*NBLOCKZ, "field dims z"); + if (i==1) { + CVALUE(name[0], 'e', "field name"); + IVALUE(elem_rank[0], 1, "elem rank"); + IVALUE(type[0], H5_FLOAT64_T, "field type"); + } else if (i==0) { + CVALUE(name[0], 'E', "field name"); + IVALUE(elem_rank[0], 3, "elem rank"); + IVALUE(type[1], H5_FLOAT64_T, "field type"); + } else if (i==2) { + CVALUE(name[0], 'i', "field name"); + IVALUE(elem_rank[0], 1, "elem rank"); + IVALUE(type[1], H5_INT64_T, "field type"); + } + } + +#if defined(PARALLEL_IO) + TEST("Setting throttle"); + status = H5SetThrottle(file, 3); + RETURN(status, H5_SUCCESS, "H5SetThrottle"); +#endif + + TEST("Reading 64-bit data"); + + for (t=step; t +#include +#include + +#include "testframe.h" +#include "params.h" + +/* global */ +h5_size_t grid[3]; +h5_size_t layout[6]; +h5_size_t fields_dims[3]; + +/* from write.c */ +void h5b_test_write1(void); +void h5b_test_write2(void); + +/* from read.c */ +void h5b_test_read1(void); +void h5b_test_read2(void); + +static int +_nth_root_int_divisor (const int m, const int n) +{ + int i, root; + double p; + + p = 1.0 / (double)n; + root = (int) ceil ( pow ( (double)m, p ) ); + for (i=root; i<=m; i++) + { + if (m % i == 0) return i; + } + + return i; +} + +int main(int argc, char **argv) +{ + extern h5_size_t layout[6]; +#ifdef PARALLEL_IO + MPI_Init(&argc, &argv); + + int procs, rank; + MPI_Comm_rank(MPI_COMM_WORLD, &rank); + MPI_Comm_size(MPI_COMM_WORLD, &procs); + + if (procs > MAX_MPI_TASKS) { + fprintf(stderr, + "ERROR: please use <= %d MPI tasks for the test.\n", + MAX_MPI_TASKS); + exit(EXIT_FAILURE); + } + + /* make up a 3D layout */ + grid[0] = _nth_root_int_divisor (procs, 3); + grid[1] = _nth_root_int_divisor (procs / grid[0], 2); + grid[2] = procs / grid[0] / grid[1]; + + h5_size_t i,j,k; + k = rank % grid[2]; + j = (rank / grid[2]) % grid[1]; + i = rank / (grid[2] * grid[1]); + + layout[0] = i*NBLOCKX; + layout[1] = (i+1)*NBLOCKX - 1; + layout[2] = j*NBLOCKY; + layout[3] = (j+1)*NBLOCKY - 1; + layout[4] = k*NBLOCKZ; + layout[5] = (k+1)*NBLOCKZ - 1; +#else // PARALLEL_IO + grid[0] = 1; + grid[1] = 1; + grid[2] = 1; + + layout[0] = 0; + layout[1] = NBLOCKX - 1; + layout[2] = 0; + layout[3] = NBLOCKY - 1; + layout[4] = 0; + layout[5] = NBLOCKZ - 1; +#endif + + /* Initialize testing framework */ + TestInit(argv[0], NULL, NULL); + + /* Tests are generally arranged from least to most complexity... */ + AddTest("write1", h5b_test_write1, NULL, "Write 64-bit data", NULL); + AddTest("read1", h5b_test_read1, NULL, "Read 64-bit data", NULL); + AddTest("write2", h5b_test_write2, NULL, "Write 32-bit data", NULL); + AddTest("read2", h5b_test_read2, NULL, "Read 32-bit data", NULL); + + /* Display testing information */ + TestInfo(argv[0]); + + /* Parse command line arguments */ + TestParseCmdLine(argc, argv); + + H5SetVerbosityLevel(GetTestVerbosity()); + + /* Perform requested testing */ + PerformTests(); + + /* Display test summary, if requested */ + if (GetTestSummary()) + TestSummary(); + + /* Clean up test files, if allowed */ + //if (GetTestCleanup() && !getenv("HDF5_NOCLEANUP")) + // TestCleanup(); + +#ifdef PARALLEL_IO + TestPrintf ("reached end\n"); + fflush(stdout); + MPI_Finalize(); +#endif + return GetTestNumErrs(); +} + diff --git a/test/h5b_write.c b/test/h5b_write.c new file mode 100644 index 0000000..fe78263 --- /dev/null +++ b/test/h5b_write.c @@ -0,0 +1,225 @@ +#include +#include "testframe.h" +#include "params.h" + +static void +test_write_field_attribs( + h5_file_t file, + const char *field_name, + int position) +{ + h5_err_t status; + char name[ATTR_NAME_SIZE]; + + TEST("Writing field attributes"); + + get_attr_name(name, "str", position); + status = H5BlockWriteFieldAttribString( + file, field_name, name, ATTR_STR_VAL); + RETURN(status, H5_SUCCESS, "H5BlockWriteFieldAttribString"); + + get_attr_name(name, "i32", position); + h5_int32_t i32 = ATTR_INT32_VAL; + status = H5BlockWriteFieldAttribInt32( + file, field_name, name, &i32, 1); + RETURN(status, H5_SUCCESS, "H5BlockWriteFieldAttribInt32"); + + get_attr_name(name, "i64", position); + h5_int64_t i64 = ATTR_INT64_VAL; + status = H5BlockWriteFieldAttribInt64( + file, field_name, name, &i64, 1); + RETURN(status, H5_SUCCESS, "H5BlockWriteFieldAttribInt64"); + + get_attr_name(name, "f32", position); + h5_float32_t f32 = ATTR_FLOAT_VAL; + status = H5BlockWriteFieldAttribFloat32( + file, field_name, name, &f32, 1); + RETURN(status, H5_SUCCESS, "H5BlockWriteFieldAttribFloat32"); + + get_attr_name(name, "f64", position); + h5_float64_t f64 = ATTR_FLOAT_VAL; + status = H5BlockWriteFieldAttribFloat64( + file, field_name, name, &f64, 1); + RETURN(status, H5_SUCCESS, "H5BlockWriteFieldAttribFloat64"); +} + +static void +test_write_data64(h5_file_t file, int step) +{ + extern h5_size_t layout[6]; + + int i,t; + h5_int64_t status, val; + + double *e; + double *ex,*ey,*ez; + h5_int64_t *id; + + const size_t nelems = + (layout[1] - layout[0] + 1) * + (layout[3] - layout[2] + 1) * + (layout[5] - layout[4] + 1); + + e=(double*)malloc(nelems*sizeof(double)); + ex=(double*)malloc(nelems*sizeof(double)); + ey=(double*)malloc(nelems*sizeof(double)); + ez=(double*)malloc(nelems*sizeof(double)); + id=(h5_int64_t*)malloc(nelems*sizeof(h5_int64_t)); + +#if defined(PARALLEL_IO) + TEST("Setting throttle"); + status = H5SetThrottle(file, 2); + RETURN(status, H5_SUCCESS, "H5SetThrottle"); +#endif + + TEST("Writing 64-bit data"); + + for (t=step; t +#include +#include "testframe.h" +#include "params.h" + +static void +test_read_file_attribs(h5_file_t file, int position) +{ + h5_err_t status; + char name[ATTR_NAME_SIZE]; + char str[ATTR_NAME_SIZE]; + h5_int32_t i32; + h5_int64_t i64; + h5_float32_t f32; + h5_float64_t f64; + + TEST("Reading file attributes"); + + i64 = H5GetNumFileAttribs(file); + VALUE(i64 % 5, 0, "file attribute count"); + + get_attr_name(name, "str", position); + status = H5ReadFileAttribString(file, name, str); + RETURN(status, H5_SUCCESS, "H5ReadFileAttribString"); + SVALUE(str, ATTR_STR_VAL, "string attribute"); + + get_attr_name(name, "i32", position); + status = H5ReadFileAttribInt32(file, name, &i32); + RETURN(status, H5_SUCCESS, "H5ReadFileAttribInt32"); + IVALUE(i32, ATTR_INT32_VAL, "int32 attribute"); + + get_attr_name(name, "i64", position); + status = H5ReadFileAttribInt64(file, name, &i64); + RETURN(status, H5_SUCCESS, "H5ReadFileAttribInt64"); + IVALUE(i64, ATTR_INT64_VAL, "int64 attribute"); + + get_attr_name(name, "f32", position); + status = H5ReadFileAttribFloat32(file, name, &f32); + RETURN(status, H5_SUCCESS, "H5ReadFileAttribFloat32"); + FVALUE(f32, ATTR_FLOAT_VAL, "float32 attribute"); + + get_attr_name(name, "f64", position); + status = H5ReadFileAttribFloat64(file, name, &f64); + RETURN(status, H5_SUCCESS, "H5ReadFileAttribFloat64"); + FVALUE(f64, ATTR_FLOAT_VAL, "float64 attribute"); +} + +static void +test_read_step_attribs(h5_file_t file, int position) +{ + h5_err_t status; + char name[ATTR_NAME_SIZE]; + char str[ATTR_NAME_SIZE]; + h5_int32_t i32; + h5_int64_t i64; + h5_float32_t f32; + h5_float64_t f64; + + TEST("Reading file attributes"); + + i64 = H5GetNumStepAttribs(file); + VALUE(i64 % 5, 0, "step attribute count"); + + get_attr_name(name, "str", position); + status = H5ReadStepAttribString(file, name, str); + RETURN(status, H5_SUCCESS, "H5ReadStepAttribString"); + SVALUE(str, ATTR_STR_VAL, "string attribute"); + + get_attr_name(name, "i32", position); + status = H5ReadStepAttribInt32(file, name, &i32); + RETURN(status, H5_SUCCESS, "H5ReadStepAttribInt32"); + IVALUE(i32, ATTR_INT32_VAL, "int32 attribute"); + + get_attr_name(name, "i64", position); + status = H5ReadStepAttribInt64(file, name, &i64); + RETURN(status, H5_SUCCESS, "H5ReadStepAttribInt64"); + IVALUE(i64, ATTR_INT64_VAL, "int64 attribute"); + + get_attr_name(name, "f32", position); + status = H5ReadStepAttribFloat32(file, name, &f32); + RETURN(status, H5_SUCCESS, "H5ReadStepAttribFloat32"); + FVALUE(f32, ATTR_FLOAT_VAL, "float32 attribute"); + + get_attr_name(name, "f64", position); + status = H5ReadStepAttribFloat64(file, name, &f64); + RETURN(status, H5_SUCCESS, "H5ReadStepAttribFloat64"); + FVALUE(f64, ATTR_FLOAT_VAL, "float64 attribute"); +} + +static void +test_read_data64(h5_file_t file, int nparticles, int step) +{ + int i,t; + int rank, nprocs; + h5_err_t status; + h5_int64_t val, start, end, type; + char name1[4]; + char name2[8]; + h5_size_t indices[8]; + h5_size_t size; + + double *x,*y,*z; + double *px,*py,*pz; + h5_int64_t *id; + + x=(double*)malloc(nparticles*sizeof(double)); + y=(double*)malloc(nparticles*sizeof(double)); + z=(double*)malloc(nparticles*sizeof(double)); + px=(double*)malloc(nparticles*sizeof(double)); + py=(double*)malloc(nparticles*sizeof(double)); + pz=(double*)malloc(nparticles*sizeof(double)); + id=(h5_int64_t*)malloc(nparticles*sizeof(h5_int64_t)); + + TEST("Verifying dataset info"); + +#if defined(PARALLEL_IO) + MPI_Comm_rank(MPI_COMM_WORLD, &rank); + MPI_Comm_size(MPI_COMM_WORLD, &nprocs); +#else + nprocs = 1; + rank = 2; +#endif + + val = H5PartGetNumParticles(file); + IVALUE(val, nprocs*nparticles, "particle count"); + + val = H5PartGetNumDatasets(file); + IVALUE(val, 7, "dataset count"); + + for (i=0; i<7; i++) { + status = H5PartGetDatasetName(file, i, name1, 2); + RETURN(status, H5_SUCCESS, "H5PartGetDatasetName"); + + status = H5PartGetDatasetInfo( + file, i, name2, 4, &type, &size); + RETURN(status, H5_SUCCESS, "H5PartGetDatasetInfo"); + CVALUE(name1[0], name2[0], "dataset name"); + + status = H5PartGetDatasetName(file, i, name1, 4); + RETURN(status, H5_SUCCESS, "H5PartGetDatasetName"); + CVALUE(name1[1], name2[1], "dataset name"); + + IVALUE(size, nprocs*nparticles, "dataset size"); + if (name1[0] == 'i') IVALUE(type, H5_INT64_T, "dataset type"); + else IVALUE(type, H5_FLOAT64_T, "dataset type"); + } + +#if defined(PARALLEL_IO) + TEST("Setting throttle"); + status = H5SetThrottle(file, 3); + RETURN(status, H5_SUCCESS, "H5SetThrottle"); +#endif + + TEST("Reading 64-bit data"); + + for (t=step; t +#include + +#include "testframe.h" +#include "params.h" + +/* from write.c */ +void h5u_test_write1(void); +void h5u_test_write2(void); +void h5u_test_write3(void); +void h5u_test_write4(void); + +/* from read.c */ +void h5u_test_read1(void); +void h5u_test_read2(void); +void h5u_test_read3(void); +void h5u_test_read4(void); + +int main(int argc, char **argv) +{ +#ifdef PARALLEL_IO + MPI_Init(&argc, &argv); + int procs; + MPI_Comm_size(MPI_COMM_WORLD, &procs); + if (procs > MAX_MPI_TASKS) { + fprintf(stderr, + "ERROR: please use <= %d MPI tasks for the test.\n", + MAX_MPI_TASKS); + exit(EXIT_FAILURE); + } +#endif + + /* Initialize testing framework */ + TestInit(argv[0], NULL, NULL); + + /* Tests are generally arranged from least to most complexity... */ + AddTest("write1", h5u_test_write1, NULL, "Write 32-bit data", NULL); + AddTest("read1", h5u_test_read1, NULL, "Read 32-bit data", NULL); + AddTest("write2", h5u_test_write2, NULL, "Write 32-bit strided data", NULL); + AddTest("read2", h5u_test_read2, NULL, "Read 32-bit strided data", NULL); + AddTest("write3", h5u_test_write3, NULL, "Write 64-bit strided data", NULL); + AddTest("read3", h5u_test_read3, NULL, "Read 64-bit strided data", NULL); + AddTest("write4", h5u_test_write4, NULL, "Write 64-bit data", NULL); + AddTest("read4", h5u_test_read4, NULL, "Read 64-bit data", NULL); + + /* Display testing information */ + TestInfo(argv[0]); + + /* Parse command line arguments */ + TestParseCmdLine(argc, argv); + + //H5SetVerbosityLevel(GetTestVerbosity()); + H5SetVerbosityLevel(1); + + /* Perform requested testing */ + PerformTests(); + + /* Display test summary, if requested */ + if (GetTestSummary()) + TestSummary(); + + /* Clean up test files, if allowed */ + //if (GetTestCleanup() && !getenv("HDF5_NOCLEANUP")) + // TestCleanup(); + +#ifdef PARALLEL_IO + TestPrintf ("reached end\n"); + fflush(stdout); + MPI_Finalize(); +#endif + return GetTestNumErrs(); +} + diff --git a/test/h5u_write.c b/test/h5u_write.c new file mode 100644 index 0000000..54b56c0 --- /dev/null +++ b/test/h5u_write.c @@ -0,0 +1,466 @@ +#include +#include "testframe.h" +#include "params.h" + +static void +test_write_file_attribs(h5_file_t file, int position) +{ + h5_err_t status; + char name[ATTR_NAME_SIZE]; + + TEST("Writing file attributes"); + + get_attr_name(name, "str", position); + status = H5WriteFileAttribString(file, name, ATTR_STR_VAL); + RETURN(status, H5_SUCCESS, "H5WriteFileAttribString"); + + get_attr_name(name, "i32", position); + h5_int32_t i32 = ATTR_INT32_VAL; + status = H5WriteFileAttribInt32(file, name, &i32, 1); + RETURN(status, H5_SUCCESS, "H5WriteFileAttribInt32"); + + get_attr_name(name, "i64", position); + h5_int64_t i64 = ATTR_INT64_VAL; + status = H5WriteFileAttribInt64(file, name, &i64, 1); + RETURN(status, H5_SUCCESS, "H5WriteFileAttribInt64"); + + get_attr_name(name, "f32", position); + h5_float32_t f32 = ATTR_FLOAT_VAL; + status = H5WriteFileAttribFloat32(file, name, &f32, 1); + RETURN(status, H5_SUCCESS, "H5WriteFileAttribFloat32"); + + get_attr_name(name, "f64", position); + h5_float64_t f64 = ATTR_FLOAT_VAL; + status = H5WriteFileAttribFloat64(file, name, &f64, 1); + RETURN(status, H5_SUCCESS, "H5WriteFileAttribFloat64"); +} + +static void +test_write_step_attribs(h5_file_t file, int position) +{ + h5_err_t status; + char name[ATTR_NAME_SIZE]; + + TEST("Writing file attributes"); + + get_attr_name(name, "str", position); + status = H5WriteStepAttribString(file, name, ATTR_STR_VAL); + RETURN(status, H5_SUCCESS, "H5WriteStepAttribString"); + + get_attr_name(name, "i32", position); + h5_int32_t i32 = ATTR_INT32_VAL; + status = H5WriteStepAttribInt32(file, name, &i32, 1); + RETURN(status, H5_SUCCESS, "H5WriteStepAttribInt32"); + + get_attr_name(name, "i64", position); + h5_int64_t i64 = ATTR_INT64_VAL; + status = H5WriteStepAttribInt64(file, name, &i64, 1); + RETURN(status, H5_SUCCESS, "H5WriteStepAttribInt64"); + + get_attr_name(name, "f32", position); + h5_float32_t f32 = ATTR_FLOAT_VAL; + status = H5WriteStepAttribFloat32(file, name, &f32, 1); + RETURN(status, H5_SUCCESS, "H5WriteStepAttribFloat32"); + + get_attr_name(name, "f64", position); + h5_float64_t f64 = ATTR_FLOAT_VAL; + status = H5WriteStepAttribFloat64(file, name, &f64, 1); + RETURN(status, H5_SUCCESS, "H5WriteStepAttribFloat64"); +} + +static void +test_write_data64(h5_file_t file, int nparticles, int step) +{ + int i,t; + h5_int64_t status, val; + + double *x,*y,*z; + double *px,*py,*pz; + h5_int64_t *id; + + x=(double*)malloc(nparticles*sizeof(double)); + y=(double*)malloc(nparticles*sizeof(double)); + z=(double*)malloc(nparticles*sizeof(double)); + px=(double*)malloc(nparticles*sizeof(double)); + py=(double*)malloc(nparticles*sizeof(double)); + pz=(double*)malloc(nparticles*sizeof(double)); + id=(h5_int64_t*)malloc(nparticles*sizeof(h5_int64_t)); + +#if PARALLEL_IO + TEST("Setting throttle"); + status = H5SetThrottle(file, 2); + RETURN(status, H5_SUCCESS, "H5SetThrottle"); +#endif + + TEST("Writing 64-bit data"); + + for (t=step; t + * Tuesday, January 6, 2004 + * + * Purpose: Provides support functions for the testing framework. + * + */ + +#include +#include +#include +#include +#include "testframe.h" + +/* + * Definitions for the testing structure. + */ +#define MAXNUMOFTESTS 64 +#define MAXTESTNAME 16 +#define MAXTESTDESC 64 + +typedef struct TestStruct { + int NumErrors; + char Description[MAXTESTDESC]; + int SkipFlag; + char Name[MAXTESTNAME]; + void (*Call)(void); + void (*Cleanup)(void); + const void *Parameters; +} TestStruct; + + +/* + * Variables used by testing framework. + */ +static int num_errs = 0; /* Total number of errors during testing */ +static int Verbosity = VERBO_DEF; /* Default Verbosity is Low */ +static int Summary = 0; /* Show test summary. Default is no. */ +static int CleanUp = 1; /* Do cleanup or not. Default is yes. */ +static int TestExpress = -1; /* Do TestExpress or not. -1 means not set yet. */ +static TestStruct Test[MAXNUMOFTESTS]; +static int Index = 0; +static const void *Test_parameters = NULL; +static const char *TestProgName = NULL; +static void (*TestPrivateUsage)(void) = NULL; +static int (*TestPrivateParser)(int ac, char *av[]) = NULL; + + +/* + * Setup a test function and add it to the list of tests. + * It must have no parameters and returns void. + * TheName--short test name. + * If the name starts with '-', do not run it by default. + * TheCall--the test routine. + * Cleanup--the cleanup routine for the test. + * TheDescr--Long description of the test. + * Parameters--pointer to extra parameters. Use NULL if none used. + * Since only the pointer is copied, the contents should not change. + */ +void +AddTest(const char *TheName, void (*TheCall)(void), void (*Cleanup)(void), const char *TheDescr, const void *Parameters) +{ + /* Sanity checking */ + if (Index >= MAXNUMOFTESTS) { + printf("Too many tests added, increase MAXNUMOFTEST(%d).\n", + MAXNUMOFTESTS); + exit(-1); + } /* end if */ + if (strlen(TheDescr) >= MAXTESTDESC) { + printf("Test description too long, increase MAXTESTDESC(%d).\n", + MAXTESTDESC); + exit(-1); + } /* end if */ + if (strlen(TheName) >= MAXTESTNAME) { + printf("Test name too long, increase MAXTESTNAME(%d).\n", + MAXTESTNAME); + exit(-1); + } /* end if */ + + /* Set up test function */ + strcpy(Test[Index].Description, TheDescr); + if (*TheName != '-') { + strcpy(Test[Index].Name, TheName); + Test[Index].SkipFlag = 0; + } + else { /* skip test by default */ + strcpy(Test[Index].Name, TheName+1); + Test[Index].SkipFlag = 1; + } + Test[Index].Call = TheCall; + Test[Index].Cleanup = Cleanup; + Test[Index].NumErrors = -1; + Test[Index].Parameters = Parameters; + + /* Increment test count */ + Index++; +} + + +/* + * Initialize testing framework + * + * ProgName: Name of test program. + * private_usage: Optional routine provided by test program to print the + * private portion of usage page. Default to NULL which means none is + * provided. + * private_parser: Optional routine provided by test program to parse the + * private options. Default to NULL which means none is provided. + * + * Modifications: + * Albert Cheng 2004/08/17 + * Added the ProgName, private_usage and private_parser arguments. + */ +void TestInit(const char *ProgName, void (*private_usage)(void), int (*private_parser)(int ac, char *av[])) +{ +#if !(defined MAC || defined SYMANTEC_C) + /* Un-buffer the stdout and stderr */ + setbuf(stderr, NULL); + setbuf(stdout, NULL); +#endif + + /* + * Turn off automatic error reporting since we do it ourselves. Besides, + * half the functions this test calls are private, so automatic error + * reporting wouldn't do much good since it's triggered at the API layer. + */ + //H5Eset_auto2(H5E_DEFAULT, NULL, NULL); + + /* + * Record the program name and private routines if provided. + */ + TestProgName = ProgName; + if (NULL != private_usage) + TestPrivateUsage = private_usage; + if (NULL != private_parser) + TestPrivateParser = private_parser; +} + + +/* + * Print test usage. + * First print the common test options, then the extra options if provided. + * + * Modification: + * 2004/08/18 Albert Cheng. Add TestPrivateUsage feature. + */ +void TestUsage(void) +{ + int i; + + printf("Usage: %s [-v[erbose] (l[ow]|m[edium]|h[igh]|0-9)] %s\n", + TestProgName, (TestPrivateUsage ? "" : "")); + printf(" [-[e]x[clude] name+] \n"); + printf(" [-o[nly] name+] \n"); + printf(" [-b[egin] name] \n"); + printf(" [-s[ummary]] \n"); + printf(" [-c[leanoff]] \n"); + printf(" [-h[elp]] \n"); + printf("\n\n"); + printf("verbose controls the amount of information displayed\n"); + printf("exclude to exclude tests by name\n"); + printf("only to name tests which should be run\n"); + printf("begin start at the name of the test givin\n"); + printf("summary prints a summary of test results at the end\n"); + printf("cleanoff does not delete *.hdf files after execution of tests\n"); + printf("help print out this information\n"); + if (TestPrivateUsage) { + printf("\nExtra options\n"); + TestPrivateUsage(); + } + printf("\n\n"); + printf("This program currently tests the following: \n\n"); + printf("%16s %s\n", "Name", "Description"); + printf("%16s %s\n", "----", "-----------"); + + for (i = 0; i < Index; i++) + printf("%16s %s\n", Test[i].Name, Test[i].Description); + + printf("\n\n"); +} + + +/* + * Print test info. + */ +void TestInfo(const char *ProgName) +{ + unsigned major, minor, release; + + H5get_libversion(&major, &minor, &release); + + printf("\nFor help use: %s -help\n",ProgName); + printf("Linked with HDF5 version %u.%u release %u\n", major, minor, release); + printf("Linked with H5hut version %s\n", H5_VER_STRING); +} + + +/* + * Parse command line information. + * argc, argv: the usual command line argument count and strings + * + * Modification: + * 2004/08/18 Albert Cheng. Add extra_parse feature. + */ +void TestParseCmdLine(int argc, char *argv[]) +{ + int ret_code; + + while (argv++, --argc > 0) { + if ((strcmp(*argv, "-verbose") == 0) || + (strcmp(*argv, "-v") == 0)) { + if (argc > 0) { + --argc; ++argv; + ParseTestVerbosity(*argv); + }else{ + TestUsage(); + exit(1); + } + } + else if (((strcmp(*argv, "-exclude") == 0) || + (strcmp(*argv, "-x") == 0))) { + if (argc > 0) { + --argc; ++argv; + SetTest(*argv, SKIPTEST); + }else{ + TestUsage(); + exit(1); + } + } + else if (((strcmp(*argv, "-begin") == 0) || + (strcmp(*argv, "-b") == 0))) { + if (argc > 0) { + --argc; ++argv; + SetTest(*argv, BEGINTEST); + }else{ + TestUsage(); + exit(1); + } + } + else if (((strcmp(*argv, "-only") == 0) || + (strcmp(*argv, "-o") == 0))) { + if (argc > 0) { + int Loop; + --argc; ++argv; + /* Skip all tests, then activate only one. */ + for (Loop = 0; Loop < Index; Loop++) + Test[Loop].SkipFlag = 1; + SetTest(*argv, ONLYTEST); + }else{ + TestUsage(); + exit(1); + } + } + else if ((strcmp(*argv, "-summary") == 0) || (strcmp(*argv, "-s") == 0)) + Summary = 1; + else if ((strcmp(*argv, "-help") == 0) || (strcmp(*argv, "-h") == 0)) { + TestUsage(); + exit(0); + } + else if ((strcmp(*argv, "-cleanoff") == 0) || (strcmp(*argv, "-c") == 0)) + SetTestNoCleanup(); + else { + /* non-standard option. Break out. */ + break; + } + + } + + /* Call extra parsing function if provided. */ + if (NULL != TestPrivateParser) { + ret_code=TestPrivateParser(argc+1, argv-1); + if (ret_code != 0) + exit(-1); + } +} + + +/* + * Perform Tests. + */ +void PerformTests(void) +{ + int Loop; + + for (Loop = 0; Loop < Index; Loop++) + if (Test[Loop].SkipFlag) { + MESSAGE(2, ("Skipping -- %s (%s) \n", Test[Loop].Description, Test[Loop].Name)); + } else { + MESSAGE(2, ("Testing -- %s (%s) \n", Test[Loop].Description, Test[Loop].Name)); + MESSAGE(5, ("===============================================\n")); + Test[Loop].NumErrors = num_errs; + Test_parameters = Test[Loop].Parameters; + //ALARM_ON; + Test[Loop].Call(); + //ALARM_OFF; + Test[Loop].NumErrors = num_errs - Test[Loop].NumErrors; + MESSAGE(5, ("===============================================\n")); + MESSAGE(5, ("There were %d errors detected.\n\n", (int)Test[Loop].NumErrors)); + } + + Test_parameters = NULL; /* clear it. */ + MESSAGE(2, ("\n\n")); + + if (num_errs) + printf("!!! %d Error(s) were detected !!!\n\n", (int) num_errs); + else + printf("All tests were successful. \n\n"); +} + + +/* + * Display test summary. + */ +void TestSummary(void) +{ + int Loop; + + printf("Summary of Test Results:\n"); + printf("Name of Test Errors Description of Test\n"); + printf("---------------- ------ --------------------------------------\n"); + + for (Loop = 0; Loop < Index; Loop++) { + if (Test[Loop].NumErrors == -1) + printf("%16s %6s %s\n", Test[Loop].Name, "N/A", Test[Loop].Description); + else + printf("%16s %6d %s\n", Test[Loop].Name, (int)Test[Loop].NumErrors, Test[Loop].Description); + } + + printf("\n\n"); +} + + +/* + * Cleanup files from testing + */ +void TestCleanup(void) +{ + int Loop; + + MESSAGE(2, ("\nCleaning Up temp files...\n\n")); + + /* call individual cleanup routines in each source module */ + for (Loop = 0; Loop < Index; Loop++) + if (!Test[Loop].SkipFlag && Test[Loop].Cleanup!=NULL) + Test[Loop].Cleanup(); +} + + +/* + * Retrieve the verbosity level for the testing framework + */ +int GetTestVerbosity(void) +{ + return(Verbosity); +} + +/* + * Set the verbosity level for the testing framework. + * Return previous verbosity level. + */ +int SetTestVerbosity(int newval) +{ + int oldval; + + oldval = Verbosity; + Verbosity = newval; + return(oldval); +} + +/* + * Retrieve the TestExpress mode for the testing framework + Values: + 0: Exhaustive run + Tests should take as long as necessary + 1: Full run. Default if HDF5TestExpress is not defined + Tests should take no more than 30 minutes + 2: Quick run + Tests should take no more than 10 minutes + 3: Smoke test. Default if HDF5TestExpress is set to a value other than 0-3 + Tests should take less than 1 minute + + Design: + If the environment variable $HDF5TestExpress is defined, + then test programs should skip some tests so that they + complete sooner. + + Terms: + A "test" is a single executable, even if it contains multiple + sub-tests. + The standard system for test times is a Linux machine running in + NFS space (to catch tests that involve a great deal of disk I/O). + + Implementation: + I think this can be easily implemented in the test library (libh5test.a) + so that all tests can just call it to check the status of $HDF5TestExpress. + */ +int GetTestExpress(void) +{ + char * env_val; + + /* set it here for now. Should be done in something like h5test_init(). */ + if(TestExpress==-1) + { + env_val = getenv("HDF5TestExpress"); + + if(env_val == NULL) + SetTestExpress(1); + else if(strcmp(env_val, "0") == 0) + SetTestExpress(0); + else if(strcmp(env_val, "1") == 0) + SetTestExpress(1); + else if(strcmp(env_val, "2") == 0) + SetTestExpress(2); + else + SetTestExpress(3); + } + + return(TestExpress); +} + +/* + * Set the TestExpress mode for the testing framework. + * Return previous TestExpress mode. + * Values: non-zero means TestExpress mode is on, 0 means off. + */ +int SetTestExpress(int newval) +{ + int oldval; + + oldval = TestExpress; + TestExpress = newval; + return(oldval); +} + +/* + * Retrieve Summary request value. + * 0 means no summary, 1 means yes. + */ +int GetTestSummary(void) +{ + return(Summary); +} + +/* + * Retrieve Cleanup request value. + * 0 means no Cleanup, 1 means yes. + */ +int GetTestCleanup(void) +{ + return(CleanUp); +} + +/* + * Set cleanup to no. + * Return previous cleanup value. + */ +int SetTestNoCleanup(void) +{ + int oldval; + + oldval = CleanUp; + CleanUp = 0; + return(oldval); +} + +/* + * Parse an argument string for verbosity level and set it. + */ +void ParseTestVerbosity(char *argv) +{ + if (*argv == 'l') + SetTestVerbosity(VERBO_LO); + else if (*argv == 'm') + SetTestVerbosity(VERBO_MED); + else if (*argv == 'h') + SetTestVerbosity(VERBO_HI); + else + SetTestVerbosity(atoi(argv)); +} + + +/* + * Retrieve the number of testing errors for the testing framework + */ +int GetTestNumErrs(void) +{ + return(num_errs); +} + + +/* + * Increment the number of testing errors + */ +void IncTestNumErrs(void) +{ + num_errs++; +} + + +/* + * Retrieve the current Test Parameters pointer. + */ +const void *GetTestParameters(void) +{ + return(Test_parameters); +} + +int +TestPrintf(const char *format, ...) +{ + va_list arglist; + int ret_value; + +#if defined(PARALLEL_IO) + int nproc; + MPI_Comm_rank(MPI_COMM_WORLD, &nproc); + if ( nproc == 0 || VERBOSE_HI ) { + char *format2 = malloc(strlen(format)+8); + sprintf(format2, "[%d] %s", nproc, format); + va_start(arglist, format); + ret_value = vprintf(format2, arglist); + va_end(arglist); + } +#else + va_start(arglist, format); + ret_value = vprintf(format, arglist); + va_end(arglist); +#endif + + /* Return the length of the string produced (like printf() does) */ + return ret_value; +} + + +/* + * This routine is designed to provide equivalent functionality to 'printf' + * and also increment the error count for the testing framework. + */ +int +TestErrPrintf(const char *format, ...) +{ + va_list arglist; + int ret_value; + + /* Increment the error count */ + num_errs++; + +#if PARALLEL_IO + int nproc; + MPI_Comm_rank(MPI_COMM_WORLD, &nproc); + if ( nproc == 0 || VERBOSE_HI ) { + char *format2 = malloc(strlen(format)+8); + sprintf(format2, "[%d] %s", nproc, format); + va_start(arglist, format); + ret_value = vfprintf(stderr, format2, arglist); + va_end(arglist); + } +#else + va_start(arglist, format); + ret_value = vfprintf(stderr, format, arglist); + va_end(arglist); +#endif + + /* Return the length of the string produced (like printf() does) */ + return ret_value; +} + + +/* + * Set (control) which test will be tested. + * SKIPTEST: skip this test + * ONLYTEST: do only this test + * BEGINETEST: skip all tests before this test + * + */ +void SetTest(const char *testname, int action) +{ + int Loop; + switch (action) { + case SKIPTEST: + for (Loop = 0; Loop < Index; Loop++) + if (strcmp(testname, Test[Loop].Name) == 0) { + Test[Loop].SkipFlag = 1; + break; + } + break; + case BEGINTEST: + for (Loop = 0; Loop < Index; Loop++) { + if (strcmp(testname, Test[Loop].Name) != 0) + Test[Loop].SkipFlag = 1; + else{ + /* Found it. Set it to run. Done. */ + Test[Loop].SkipFlag = 0; + break; + } + } + break; + case ONLYTEST: + for (Loop = 0; Loop < Index; Loop++) { + if (strcmp(testname, Test[Loop].Name) != 0) + Test[Loop].SkipFlag = 1; + else { + /* Found it. Set it to run. Break to skip the rest. */ + Test[Loop].SkipFlag = 0; + break; + } + } + /* skip the rest */ + while (++Loop < Index) + Test[Loop].SkipFlag = 1; + break; + default: + /* error */ + printf("*** ERROR: Unknown action (%d) for SetTest\n", action); + break; + } +} + +void +get_attr_name(char *name, char *tag, int id) +{ + sprintf(name, "Attr%d%s", id, tag); +} + +void +test_open_objects(h5_file_t file, int max_objects) +{ + hid_t hfile = h5_get_hdf5_file(file); + ssize_t nopen = H5Fget_obj_count(hfile, H5F_OBJ_ALL); + if (nopen > max_objects) + { + TestErrPrintf( "*** TOO MANY OBJECTS OPEN: %d > %d " + "at line %4d in %s\n", nopen, max_objects, + (int)__LINE__, __FILE__ ); + + hid_t *list = malloc(sizeof(hid_t)*nopen); + H5Fget_obj_ids(hfile, H5F_OBJ_ALL, nopen, list); + + H5O_info_t info; + int i; + for (i=0; i + +#ifndef PARALLEL_IO +#define MPI_COMM_WORLD 0 +#endif + +/* + * Predefined test verbosity levels. + * + * Convention: + * + * The higher the verbosity value, the more information printed. + * So, output for higher verbosity also include output of all lower + * verbosity. + * + * Value Description + * 0 None: No informational message. + * 1 "All tests passed" + * 2 Header of overall test + * 3 Default: header and results of individual test + * 4 + * 5 Low: Major category of tests. + * 6 + * 7 Medium: Minor category of tests such as functions called. + * 8 + * 9 High: Highest level. All information. + */ +#define VERBO_DEF 0 /* Default */ +#define VERBO_LO 2 /* Low */ +#define VERBO_MED 3 /* Medium */ +#define VERBO_HI 4 /* High */ + +/* + * Verbose queries + * Only None needs an exact match. The rest are at least as much. + */ +#define VERBOSE_DEF (GetTestVerbosity()>=VERBO_DEF) +#define VERBOSE_LO (GetTestVerbosity()>=VERBO_LO) +#define VERBOSE_MED (GetTestVerbosity()>=VERBO_MED) +#define VERBOSE_HI (GetTestVerbosity()>=VERBO_HI) + +#define SKIPTEST 1 +#define ONLYTEST 2 +#define BEGINTEST 3 + +/* + * Print the current location on the standard output stream. + */ +#define AT() TestPrintf (" at %s:%d in %s()...\n", \ + __FILE__, __LINE__, __FUNCTION__); + +/* + * The name of the test is printed by saying TESTING("something") which will + * result in the string `Testing something' being flushed to standard output. + * If a test passes, fails, or is skipped then the PASSED(), H5_FAILED(), or + * SKIPPED() macro should be called. After H5_FAILED() or SKIPPED() the caller + * should print additional information to stdout indented by at least four + * spaces. If the h5_errors() is used for automatic error handling then + * the H5_FAILED() macro is invoked automatically when an API function fails. + */ +#define TESTING(WHAT) {TestPrintf("Testing %-62s",WHAT); fflush(stdout); } +#define TESTING_2(WHAT) {TestPrintf(" Testing %-62s",WHAT); fflush(stdout); } +#define PASSED() {TestPrintf(" PASSED"); fflush(stdout); } +#define H5_FAILED() {TestPrintf("*FAILED*"); fflush(stdout); } +#define H5_WARNING() {TestPrintf("*WARNING*"); fflush(stdout); } +#define SKIPPED() {TestPrintf(" -SKIP-"); fflush(stdout); } +#define TEST_ERROR {H5_FAILED(); AT(); goto error; } +#define FAIL_PUTS_ERROR(s) {H5_FAILED(); AT(); TestPrintf(s); goto error; } + +/* Use %ld to print the value because long should cover most cases. */ +/* Used to make certain a return value _is_not_ a value */ +#define RETURN(ret, val, where) do { \ + if (VERBOSE_HI) TestPrintf( " Call to routine %15s at line %4d " \ + "in %s returned %ld \n", \ + where, (int)__LINE__, __FILE__, \ + (long)(ret)); \ + if ((ret) != (val)) { \ + TestErrPrintf("*** UNEXPECTED RETURN from %s is %ld at line %4d " \ + "in %s\n", where, (long)(ret), (int)__LINE__, __FILE__); \ + } \ +} while(0) + +#define VALUE(val, expected, what) do { \ + if ((val) != (expected)) { \ + TestErrPrintf( "*** INCORRECT VALUE of %s at line " \ + "%d in %s\n", what, (int)__LINE__, \ + __FILE__); \ + } \ +} while(0) + +#define IVALUE(val, expected, what) do { \ + if (VERBOSE_HI) TestPrintf( " Value of int %15s at line %4d " \ + "in %s is %ld =? %ld\n", what, \ + (int)__LINE__, __FILE__, \ + (long)(val), (long)(expected)); \ + VALUE(val, expected, what); \ +} while(0) + +#define FVALUE(val, expected, what) do { \ + if (VERBOSE_HI) TestPrintf( " Value of float %15s at line %4d " \ + "in %s is %g =? %g\n", what, \ + (int)__LINE__, __FILE__, \ + (val), (expected)); \ + VALUE(val, expected, what); \ +} while(0) + +#define CVALUE(val, expected, what) do { \ + if (VERBOSE_HI) TestPrintf( " Value of char %15s at line %4d " \ + "in %s is %c =? %c\n", what, \ + (int)__LINE__, __FILE__, \ + (val), (expected)); \ + VALUE(val, expected, what); \ +} while(0) + + +#define SVALUE(val, expected, what) do { \ + if (VERBOSE_HI) TestPrintf( " Value of string %15s at line %4d " \ + "in %s is %s =? %s\n", what, \ + (int)__LINE__, __FILE__, \ + (val), (expected)); \ + if (strcmp(val,expected) != 0) { \ + TestErrPrintf( "*** INCORRECT VALUE of %d at line " \ + "%4d in %s\n", what, (int)__LINE__, \ + __FILE__); \ + } \ +} while(0) + +/* Used to document process through a test */ +#define MESSAGE(V,A) do { \ + if (V) TestPrintf A; \ +} while(0) + +#define TEST(WHAT) MESSAGE(VERBOSE_DEF,(WHAT "\n")) + +/* definitions for command strings */ +#define VERBOSITY_STR "Verbosity" +#define SKIP_STR "Skip" +#define TEST_STR "Test" +#define CLEAN_STR "Cleanup" + +void TestUsage(void); +void AddTest(const char *TheName, void (*TheCall)(void), + void (*Cleanup)(void), const char *TheDescr, + const void *Parameters); +void TestInfo(const char *ProgName); +void TestParseCmdLine(int argc, char *argv[]); +void PerformTests(void); +void TestSummary(void); +void TestCleanup(void); +void TestInit(const char *ProgName, void (*private_usage)(void), int (*private_parser)(int ac, char *av[])); +int GetTestVerbosity(void); +int SetTestVerbosity(int newval); +int GetTestSummary(void); +int GetTestCleanup(void); +int SetTestNoCleanup(void); +int GetTestExpress(void); +int SetTestExpress(int newval); +void ParseTestVerbosity(char *argv); +int GetTestNumErrs(void); +void IncTestNumErrs(void); +const void *GetTestParameters(void); +int TestPrintf(const char *format, ...); +int TestErrPrintf(const char *format, ...); +void SetTest(const char *testname, int action); + +void +get_attr_name(char *name, char *tag, int id); + +void +test_open_objects(h5_file_t file, int max_objects); + +#endif + diff --git a/tools/H5PartMerge/AUTHORS b/tools/H5PartMerge/AUTHORS new file mode 100644 index 0000000..3bd39e1 --- /dev/null +++ b/tools/H5PartMerge/AUTHORS @@ -0,0 +1 @@ +christof.kraus@psi.ch (PSI, Switzerland) diff --git a/tools/H5PartMerge/COPYING b/tools/H5PartMerge/COPYING new file mode 100644 index 0000000..e69de29 diff --git a/tools/H5PartMerge/ChangeLog b/tools/H5PartMerge/ChangeLog new file mode 100644 index 0000000..e69de29 diff --git a/tools/H5PartMerge/INSTALL b/tools/H5PartMerge/INSTALL new file mode 100644 index 0000000..07ca44a --- /dev/null +++ b/tools/H5PartMerge/INSTALL @@ -0,0 +1,17 @@ + +Installing H5PartMerge version 0.1 - January 8, 2008 + +On Unix/Linux and similar systems, you can simply type + + ./configure [--prefix=/path] [other options] + make check + make install + +and ignore the rest of this document. + +If configure does not work on your system and you have a reasonably +up-to-date set of tools, running ./autogen.sh before running ./configure +may fix the problem. You can also run the individual commands in +autogen.sh with the --force option, if supported by your version of +the tools. + diff --git a/tools/H5PartMerge/NEWS b/tools/H5PartMerge/NEWS new file mode 100644 index 0000000..e69de29 diff --git a/tools/H5PartMerge/README b/tools/H5PartMerge/README new file mode 100644 index 0000000..e69de29 diff --git a/tools/H5PartMerge/autogen.sh b/tools/H5PartMerge/autogen.sh new file mode 100755 index 0000000..aacf815 --- /dev/null +++ b/tools/H5PartMerge/autogen.sh @@ -0,0 +1,7 @@ +#! /bin/sh + +aclocal +autoconf +automake -a -c + + diff --git a/tools/H5PartMerge/configure.ac b/tools/H5PartMerge/configure.ac new file mode 100644 index 0000000..fdb9d78 --- /dev/null +++ b/tools/H5PartMerge/configure.ac @@ -0,0 +1,160 @@ +# -*- Autoconf -*- +# Process this file with autoconf to produce a configure script. + +#m4_pattern_allow([AM_CPPFLAGS]) +#m4_pattern_allow([AM_LDFLAGS]) +#m4_pattern_allow([AM_INIT_AUTOMAKE]) +AC_PREREQ(2.59) +AC_INIT([H5PartMerge],[0.1],[christof.kraus@psi.ch]) +AM_INIT_AUTOMAKE + +AC_CONFIG_SRCDIR([./src/H5merge.cpp]) + +# Checks for programs. +AC_PROG_CC +AC_PROG_CPP +AC_PROG_CXX +AC_PROG_INSTALL + +# Checks for libraries. + Z_PREFIX="" + Z_INCL_PATH="" + Z_LIB_PATH="" + AC_ARG_WITH( + [zlib], + AC_HELP_STRING( + [--with-zlib=PREFIX], + [prefix, parent directory, where the z library and header files can be found] + ), + [Z_PREFIX=$withval + Z_INCL_PATH=${Z_PREFIX}/include + Z_LIB_PATH=${Z_PREFIX}/lib] + ) + if test "${Z_PREFIX}" != "" ; then + CPPFLAGS=${CPPFLAGS}" -I"${Z_INCL_PATH} + LDFLAGS=${LDFLAGS}" -L"${Z_LIB_PATH} + fi + AC_CHECK_LIB( + [z], + [main], + [], + [AC_MSG_ERROR(z library not found !)] + ) + +AC_LANG_PUSH(C) + HDF5_PREFIX="" + HDF5_INCL_PATH="" + HDF5_LIB_PATH="" + AC_ARG_WITH( + [hdf5], + AC_HELP_STRING([--with-hdf5=PREFIX], + [prefix, parent directory, where the serial(!) hdf5 library and header files can be found]), + [HDF5_PREFIX=$withval + HDF5_INCL_PATH=${HDF5_PREFIX}"/include " + HDF5_LIB_PATH=${HDF5_PREFIX}"/lib "] + ) + if test "${HDF5_PREFIX}" != "" ; then + CPPFLAGS=${CPPFLAGS}" -I"${HDF5_INCL_PATH}; + LDFLAGS=${LDFLAGS}" -L"${HDF5_LIB_PATH}; + fi + AC_CHECK_HEADERS( + [hdf5.h], + [], + [AC_MSG_ERROR(hdf5.h header file not found!)] + ) + AC_CHECK_LIB( + [hdf5], + [main], + [], + [AC_MSG_ERROR(hdf5 library not found!)] + ) + + H5HUT_PREFIX="" + H5HUT_INCL_PATH="" + H5HUT_LIB_PATH="" + AC_ARG_WITH( + [h5hut], + AC_HELP_STRING([--with-h5hut=PREFIX], + [prefix, parent directory, where the serial(!) h5hut library and header files can be found]), + [H5HUT_PREFIX=$withval + H5HUT_INCL_PATH=${H5HUT_PREFIX}"/include " + H5HUT_LIB_PATH=${H5HUT_PREFIX}"/lib "] + ) + if test "${H5HUT_PREFIX}" != ""; then + CPPFLAGS=${CPPFLAGS}" -I"${H5HUT_INCL_PATH}; + LDFLAGS=${LDFLAGS}" -L"${H5HUT_LIB_PATH}; + fi + AC_CHECK_HEADERS( + [H5hut.h], + [], + [AC_MSG_ERROR(H5hut.h not found!)] + ) + AC_CHECK_LIB( + [H5hut], + [main], + [], + [AC_MSG_ERROR(H5hut library not found!)] + ) + AC_CHECK_LIB( + [H5hutC], + [main], + [], + [AC_MSG_ERROR(H5hut library not found!)] + ) + + +AC_LANG_POP +AC_LANG(C++) + + USE_BOOST_=false + BOOST_INCL_PATH="" + AC_ARG_ENABLE( + [boost], + AC_HELP_STRING([--enable-boost], + [[enable usage of boost::any]]), + [USE_BOOST_=true] ) + + if test "x${USE_BOOST_}" = xtrue; then + AC_ARG_WITH( + [boost], + AC_HELP_STRING([--with-boost-include=DIR], + [include path for the boost library]), + [BOOST_INCL_PATH=$withval] + ) + + if test "${BOOST_INCL_PATH}" != ""; then + TEMP_CPPFLAGS=${CPPFLAGS} + CPPFLAGS=${CPPFLAGS}" -I"${BOOST_INCL_PATH} + fi + + AC_CHECK_HEADERS( + [boost/any.hpp], + [AC_DEFINE_UNQUOTED(USE_BOOST)], + [USE_BOOST_=false + AC_MSG_ERROR(any.hpp not found!)] + ) + fi + + if test "x${USE_BOOST_}" != xtrue ; then + if test "${BOOST_INCL_PATH}" != "" ; then + CPPFLAGS=${TEMP_CPPFLAGS} + fi + fi + +# Checks for typedefs, structures, and compiler characteristics. +AC_HEADER_STDBOOL +AC_C_CONST +AC_TYPE_SIZE_T + +# Checks for library functions. +#AC_FUNC_MALLOC + +CPPFLAGS=$CPPFLAGS" -m64 -mtune=k8" +LDFLAGS=$LDFLAGS" -lm" + +AC_SUBST([AM_CPPFLAGS], $CPPFLAGS) +AC_SUBST([AM_LDFLAGS], $LDFLAGS) + + +AC_CONFIG_FILES([makefile]) +AC_OUTPUT diff --git a/tools/H5PartMerge/makefile.am b/tools/H5PartMerge/makefile.am new file mode 100644 index 0000000..76313df --- /dev/null +++ b/tools/H5PartMerge/makefile.am @@ -0,0 +1,13 @@ +## Makefile.am -- process this file with automake to produce Makefile.in +## authors - christof kraus +## modified - 2008 jan 07, creation, christof kraus +## objective - automake file for H5PartMerge + +#SUBDIRS = src examples + +#SUBDIRS = src examples test doc +CLEANFILES=*~ +bin_PROGRAMS = H5merge +H5merge_SOURCES = ./src/H5merge.cpp ./src/optparse.cpp + +AM_CPPFLAGS = @AM_CPPFLAGS@ diff --git a/tools/H5PartMerge/src/H5merge.cpp b/tools/H5PartMerge/src/H5merge.cpp new file mode 100644 index 0000000..f8a25d8 --- /dev/null +++ b/tools/H5PartMerge/src/H5merge.cpp @@ -0,0 +1,897 @@ +/* Description + * + * This application merges and slices one, two or more H5hut files + * into a single one. The range of each file which should be merged/ + * sliced can be specified on the command line where each input file + * is handled similar to a python array. Negative indices are counted + * from the end of the file i.e. -1 signifies the last step. + * + * Copyright by Christof Kraus, 2007-2008, all rights reserved. + * + * \author Christof Kraus + * + * \date 2007 dec 27 + * + * \warning none + * + * \attention none required + * + * \bug this code is now ported to H5hut August 2011 Andreas Adelmann + * + * \todo + */ + +#include +#include "H5hut.h" + +#include +#include +#include +#include +#include +#include + +#include "optparse.hh" + +#ifdef USE_BOOST +#include +#endif + +#define MAX_LEN 128 + +using namespace std; + +struct StringCmp { + bool operator()(const string s1, const string s2) const { + return s1 < s2; + } +}; + +#ifdef USE_BOOST +using boost::any_cast; +typedef map StringAnyValueMap; +#endif + +typedef map StringIntMap; +typedef map StringInt64Map; + +h5_int64_t copyFileAttribute(h5_file_t *In, h5_file_t *Out, string AttrName, h5_int64_t Type, h5_size_t Num); +h5_int64_t copyFileToStepAttribute(h5_file_t *In, h5_file_t *Out, string AttrName, h5_int64_t Type, h5_size_t Num); + +#ifdef USE_BOOST +h5_int64_t copyFileAttribute(h5_file_t *In, h5_file_t *Out, StringAnyValueMap &FileAttributes, string AttrName, + h5_int64_t Type, h5_size_t Num); +h5_int64_t copyFileToStepAttribute(h5_file_t *In, h5_file_t *Out, StringAnyValueMap &FileAttributes, string AttrName, + h5_int64_t Type, h5_size_t Num); +#endif + +h5_int64_t copyStepAttribute(h5_file_t *In, h5_file_t *Out, string AttrName, h5_int64_t Type, h5_size_t Num); +h5_int64_t copyDataset(h5_file_t *In, h5_file_t *Out, string SetName, + h5_int64_t Type, h5_float64_t *FloatArray, h5_int64_t *IntArray); + +int main(int argc, char **argv) { + + using optparse::STORE; + using optparse::STORE_TRUE; + using optparse::STORE_FALSE; + using optparse::STRING; + using optparse::BOOL; + using optparse::INT; + using optparse::DOUBLE; + + h5_file_t *H5OutFile, *H5InFile; + ifstream testopen; + + int NumInput = 0; + int effNumInput = 0; + string *InputFilenames = NULL; + string Input; + string Range; + string from_str; + int *from = NULL; + string to_str; + int *to = NULL; + + + string OutputFilename; + bool isOutputInput = false; + int OutputIsInput = 0; + + char AttrName[MAX_LEN]; + int NumFileAttr; + StringIntMap FileAttribName; + StringInt64Map FileAttribType; + StringInt64Map FileAttribNumType; + +#ifdef USE_BOOST + StringAnyValueMap FileAttributes; +#endif + + char SetName[MAX_LEN]; + int NumDataSets; + StringIntMap DataSetName; + StringInt64Map DataSetType; + + char StepAttrName[MAX_LEN]; + int NumStepAttr; + StringIntMap StepAttribName; + StringInt64Map StepAttribType; + StringInt64Map StepAttribNumType; + + StringIntMap::iterator itName; + StringInt64Map::iterator itType; + StringInt64Map::iterator itNumType; + + + h5_int64_t NumParticles = 0; + h5_int64_t maxNumParticles = 0; + + h5_int64_t NumSteps; + h5_int64_t effStep = 0; + bool firstStepInput = true; + + h5_float64_t *FloatValues = NULL; + h5_int64_t *IntegerValues = NULL; + + h5_int64_t Type; + h5_int64_t SetType; + h5_size_t NumType; + + h5_size_t SetNum; + + int verbosity = 0; + h5_int64_t rc; + + string usage("H5merge\n\nmerges two or more H5hut files, but can also be used to slice a H5hut file\n\nUsage: H5merge [[options]] input1.h5[from1:to1] [input2.h5[from2:to2] ... inputN.h5[fromN:toN]] output.h5,\n where fromX and toX are the step numbers which determine the range to be merged.\n Negative values are counted from the end of the file\n\noptions:"); + optparse::OptionParser parser(usage); + + parser.add_option("-h", "--help", "help", "Show this message", STORE_TRUE, BOOL, "0"); + parser.add_option("-v", "--verbose", "verbosity", "increase verbosity", STORE, INT, "0"); + parser.add_option("-r", "--replace", "replace", "If output file name is the same as input file replace the input file at the end", STORE_TRUE, BOOL, "0"); + parser.add_option("-f", "--intersect-file-attributes", "intersect-file-attributes", "merge only the intersection of file attributes from all input files", STORE_TRUE, BOOL, "0"); + parser.add_option("-s", "--intersect-step-attributes", "intersect-step-attributes", "merge only the intersection of step attributes from all steps in all input files", STORE_TRUE, BOOL, "0"); + parser.add_option("-d", "--intersect-datasets", "intersect-datasets", "merge only the intersection of datasets of all input files", STORE_TRUE, BOOL, "0"); + try { + parser.parse_args(argc, argv); + if(parser.get("help")) { + parser.help(cerr); + exit(0); + } + } catch(optparse::OptionError e) { + cerr << e.what() << endl << endl; + parser.help(cerr); + exit(1); + } + + if(parser.arguments.size() < 2) { + cerr << "No output file found." << endl << endl; + parser.help(cerr); + exit(1); + } + + NumInput = parser.arguments.size(); //argc - 2; + InputFilenames = new string[NumInput]; + from = new int[NumInput]; + to = new int[NumInput]; + + verbosity = parser.get("verbosity"); + H5SetVerbosityLevel(verbosity); + + /**************************************************************\ + * Parse input file names and ranges to be merged + \**************************************************************/ + + for(int i = 0; i < NumInput - 1; ++i) { + Input = string(parser.arguments[i]); + + if(Input.find("[") != string::npos && Input.find("]") != string::npos) { + Range = Input; + Range.erase(0, Range.find_first_of("[") + 1); + Range.erase(Range.find_first_of("]")); + if(Range.find(":") != string::npos) { + from_str = Range; + from_str.erase(from_str.find_first_of(":")); + if(from_str.length() == 0) + from[effNumInput] = 0; + else + from[effNumInput] = atoi(from_str.c_str()); + + to_str = Range; + to_str.erase(0, to_str.find_first_of(":") + 1); + if(to_str.length() == 0) + to[effNumInput] = -1; + else + to[effNumInput] = atoi(to_str.c_str()); + } else { + if(Range.length() > 0) { + from[effNumInput] = atoi(Range.c_str()); + to[effNumInput] = from[effNumInput]; + } else { + from[effNumInput] = -1; + to[effNumInput] = 0; + } + } + Input.erase(Input.find_first_of("[")); + + } else { + if(Input.find("[") != string::npos) { + Input.erase(Input.find_first_of("[")); + cerr << "error when assigning a range for file " << Input << endl; + exit(1); + } + if(Input.find("]") != string::npos) { + Input.erase(Input.find_first_of("]")); + cerr << "error when assigning a range for file " << Input << endl; + exit(1); + } + from[effNumInput] = 0; + to[effNumInput] = -1; + } + testopen.open(Input.c_str(), ios::in); + if(testopen.good()) { + InputFilenames[effNumInput] = Input; + effNumInput++; + } else { + cerr << "Can't open " << Input << endl; + exit(1); + } + testopen.close(); + } + + OutputFilename = string(parser.arguments[NumInput - 1]); + + /**************************************************************\ + * check whether output file name is also an input filename; + * if true then append '_tmp' to the base name; + * rename it in the end + \**************************************************************/ + for(int i = 0; i < effNumInput; ++i) { + if(InputFilenames[i] == OutputFilename) { + if(!parser.get("replace")) { + cout << "Do you really want to overwrite the input file " << InputFilenames[i] << "? [y/N] "; + char answer = '0'; + cin.get(answer); + + if(answer != 'y' && answer != 'Y') { + cout << "Aborting..." << endl; + exit(1); + } + } + ostringstream tmp; + isOutputInput = true; + OutputIsInput = i; + OutputFilename.erase(OutputFilename.find_last_of(".")); + tmp << OutputFilename << "_tmp.h5"; + OutputFilename = tmp.str(); + break; + } + } + + /**************************************************************\ + * check whether output file allready exists + \**************************************************************/ + if(!isOutputInput) { + testopen.open(OutputFilename.c_str(), ios::in); + if(testopen.good()) { + testopen.close(); + if(!parser.get("replace")) { + cout << "Do you really want to overwrite the file " << OutputFilename << "? [y/N] "; + char answer = '0'; + cin.get(answer); + + if(answer != 'y' && answer != 'Y') { + cout << "Aborting..." << endl; + exit(1); + } + } + } else if(parser.get("replace")) { + cerr << "WARNING: option 'replace' chosen but output filename is not the same" << endl + << " as any of the input filenames" << endl; + } + } + + for(int i = 0; i < effNumInput; ++i) { + H5InFile = H5OpenFile(InputFilenames[i].c_str(), H5_O_RDONLY, 0); + + /**************************************************************\ + * fix range if values are negative + \**************************************************************/ + int n_steps = H5GetNumSteps(H5InFile); + + if(from[i] >= n_steps) + from[i] = n_steps - 1; + else + while(from[i] < 0) + from[i] += n_steps; + + if(to[i] >= n_steps) + to[i] = n_steps - 1; + else + while(to[i] < 0) + to[i] += n_steps; + if(to[i] < from[i]) { + int tmp; + tmp = to[i]; + to[i] = from[i]; + from[i] = tmp; + } + + NumSteps = to[i] - from[i] + 1; + + for(int k = from[i]; k <= to[i]; ++k) { + H5SetStep(H5InFile, k); + + /**************************************************************\ + * determine maximum number of particles in all input files + * and all steps + \**************************************************************/ + h5_int64_t localNumParticles = H5PartGetNumParticles(H5InFile); + if(localNumParticles > maxNumParticles) + maxNumParticles = localNumParticles; + } + + + /**************************************************************\ + * get the *intersection* of names of all file attributes + * --------------- " ------------------- step attributes + * --------------- " ------------------- datasets + * from all files which are to be merged + \**************************************************************/ + if(parser.get("intersect-file-attributes") || + parser.get("intersect-datasets") || + parser.get("intersect-step-attributes")) { + StringIntMap localStepAttribName; + StringInt64Map localStepAttribType; + StringInt64Map localStepAttribNumType; + StringIntMap localDataSetName; + StringInt64Map localDataSetType; + StringIntMap::iterator itlocalName; + StringInt64Map::iterator itlocalType; + StringInt64Map::iterator itlocalNumType; + + + if(parser.get("intersect-file-attributes")) { + NumFileAttr = H5GetNumFileAttribs(H5InFile); + for(int l = 0; l < NumFileAttr; ++l) { + + H5GetFileAttribInfo(H5InFile, l, AttrName, MAX_LEN, &Type, &NumType); + itName = FileAttribName.find(string(AttrName)); + if(itName == FileAttribName.end()) { + FileAttribName.insert(make_pair(string(AttrName), 1)); + FileAttribType.insert(make_pair(string(AttrName), Type)); + FileAttribNumType.insert(make_pair(string(AttrName), NumType)); + } else { + if(FileAttribType[string(AttrName)] == Type) { + if(FileAttribNumType[string(AttrName)] == NumType) { + FileAttribName[string(AttrName)] += 1; + } else { + cerr << "WARNING: found same file attribute (" << AttrName << ") " << endl; + cerr << " with same type but different length! Will be skipped!" << endl; + } + } else { + cerr << "WARNING: found same file attribute (" << AttrName << ") " << endl; + cerr << " with different type! Will be skipped!" << endl; + } + } + } + } + + for(int k = from[i]; k <= to[i]; ++k) { + H5SetStep(H5InFile, k); + + if(parser.get("intersect-datasets")) { + NumDataSets = H5PartGetNumDatasets(H5InFile); + for(h5_int64_t m = 0; m < NumDataSets; ++m) { + H5PartGetDatasetInfo(H5InFile, m, SetName, MAX_LEN, &SetType, &SetNum); + itName = localDataSetName.find(string(SetName)); + if(itName == localDataSetName.end()) { + localDataSetName.insert(make_pair(string(SetName), 1)); + localDataSetType.insert(make_pair(string(SetName), SetType)); + } else { + if(localDataSetType[string(SetName)] == SetType) { + localDataSetName[string(SetName)] += 1; + } else { + cerr << "WARNING: found same dataset (" << SetName << ")" << endl; + cerr << " with different type! Will be skipped!" << endl; + } + } + } + } + + if(parser.get("intersect-step-attributes")) { + NumStepAttr = H5GetNumStepAttribs(H5InFile); + for(int m = 0; m < NumStepAttr; ++m) { + H5GetStepAttribInfo(H5InFile, m, StepAttrName, MAX_LEN, &Type, &NumType); + itlocalName = localStepAttribName.find(string(StepAttrName)); + if(itlocalName == localStepAttribName.end()) { + localStepAttribName.insert(make_pair(string(StepAttrName), 1)); + localStepAttribType.insert(make_pair(string(StepAttrName), Type)); + localStepAttribNumType.insert(make_pair(string(StepAttrName), NumType)); + } else { + if(localStepAttribType[string(StepAttrName)] == Type) { + if(localStepAttribNumType[string(StepAttrName)] == NumType) { + localStepAttribName[string(StepAttrName)] += 1; + } else { + cerr << "WARNING: found same step attribute (" << StepAttrName << ") " << endl; + cerr << " with same type but different length! Will be skipped!" << endl; + } + } else { + cerr << "WARNING: found same step attribute (" << StepAttrName << ")" << endl; + cerr << " with different type! Will be skipped!" << endl; + } + } + } + } + } + + if(parser.get("intersect-datasets")) { + // exclude those datasets which do not occur in all steps in file i + for(itlocalName = localDataSetName.begin(), itlocalType = localDataSetType.begin(); + itlocalName != localDataSetName.end(); itlocalName++, itlocalType++) { + if(itlocalName->second != NumSteps) { + cerr << "WARNING: dataset '" << itlocalName->first << "' in file " + << InputFilenames[i] << " only found in " << itlocalName->second + << " of " << NumSteps << " steps;" << endl; + cerr << " Skipping this dataset;" << endl; + localDataSetName.erase(itlocalName); + } else { + itName = DataSetName.find(itlocalName->first); + if(itName == DataSetName.end()) { + DataSetName.insert(make_pair(itlocalName->first, 1)); + DataSetType.insert(make_pair(itlocalName->first, itlocalType->second)); + } else { + if(DataSetType[itlocalName->first] == itlocalType->second) { + DataSetName[itlocalName->first] += 1; + } else { + cerr << "WARNING: found same dataset (" << itlocalName->first << ")" << endl; + cerr << " with different type! Will be skipped!" << endl; + } + } + } + } + } + + if(parser.get("intersect-step-attributes")) { + // exclude those step attributes which do not occur in all steps in file i + itlocalType = localStepAttribType.begin(); + itlocalNumType = localStepAttribNumType.begin(); + for(itlocalName = localStepAttribName.begin(); itlocalName != localStepAttribName.end(); + itlocalName++, itlocalType++, itlocalNumType++) { + if(itlocalName->second != NumSteps) { + cerr << "WARNING: step attribute '" << itlocalName->first << "' in file " << InputFilenames[i] + << " only found in " << itlocalName->second << " of " << NumSteps << " steps;" << endl; + cerr << " Skipping this step attribute;" << endl; + } else { + itName = StepAttribName.find(itlocalName->first); + if(itName == StepAttribName.end()) { + StepAttribName.insert(make_pair(itlocalName->first, 1)); + StepAttribType.insert(make_pair(itlocalName->first, itlocalType->second)); + StepAttribNumType.insert(make_pair(itlocalName->first, itlocalNumType->second)); + } else { + if(StepAttribType[itlocalName->first] == itlocalType->second) { + if(StepAttribNumType[itlocalName->first] == itlocalNumType->second) { + StepAttribName[itlocalName->first] += 1; + } else { + cerr << "WARNING: found same step attribute (" << itlocalName->first << ") " << endl; + cerr << " with same type but different length! Will be skipped!" << endl; + } + } else { + cerr << "WARNING: found same step attribute (" << itlocalName->first << ")" << endl; + cerr << " with different type! Will be skipped!" << endl; + } + } + } + } + } + + H5CloseFile(H5InFile); + } + } + + + if(parser.get("intersect-file-attributes")) { + //erase all those file attributes which do not occur in all files + itType = FileAttribType.begin(); + itNumType = FileAttribNumType.begin(); + for(itName = FileAttribName.begin(); itName != FileAttribName.end(); itName++, itType++, itNumType++) { + if(itName->second != effNumInput) { + cerr << "WARNING: file attribute '" << itName->first << "' only found in " << itName->second << " of " + << effNumInput << " input files;" << endl; + cerr << " skipping this attribute!" << endl; + FileAttribName.erase(itName); + FileAttribType.erase(itType); + FileAttribNumType.erase(itNumType); + } + } + + if(verbosity > 0) { + cout << "found the following file attributes (intersection of all file attributes):" << endl; + for(itName = FileAttribName.begin(); itName != FileAttribName.end(); ++itName) { + cout << "file attribute '" << itName->first << "'" << endl; + } + cout << endl; + } + } + + if(parser.get("intersect-datasets")) { + //erase all those datasets which do not occur in all steps of all files + for(itName = DataSetName.begin(), itType = DataSetType.begin(); itName != DataSetName.end(); itName++, itType++) { + if(itName->second != effNumInput) { + cerr << "WARNING: dataset '" << itName->first << "' only found in " << itName->second + << " of " << effNumInput << " input files;" << endl; + cerr << " skipping this data set!" << endl; + DataSetName.erase(itName); + DataSetType.erase(itType); + } + } + + if(verbosity > 0) { + cout << "found the following data sets (intersection of all datasets):" << endl; + for(itName = DataSetName.begin(); itName != DataSetName.end(); itName++) + cout << "dataset '" << itName->first << "'" << endl; + cout << endl; + } + } + + if(parser.get("intersect-step-attributes")) { + //erase all those step attributes which do not occur in all steps of all fiels + itType = StepAttribType.begin(); + itNumType = StepAttribNumType.begin(); + for(itName = StepAttribName.begin(); itName != StepAttribName.end(); itName++, itType++, itNumType++) { + if(itName->second != effNumInput) { + cerr << "WARNING: step attribute '" << itName->first << "' only found in " << itName->second + << " of " << effNumInput << " input files;" << endl; + cerr << " skipping this attribute!" << endl; + StepAttribName.erase(itName); + StepAttribType.erase(itType); + StepAttribNumType.erase(itNumType); + } + } + + if(verbosity > 0) { + cout << "found the following step attributes (intersection of all step attributes):" << endl; + for(itName = StepAttribName.begin(); itName != StepAttribName.end(); ++itName) { + cout << "step attribute '" << itName->first << "'" << endl; + } + cout << endl; + } + } + + + H5OutFile = H5OpenFile(OutputFilename.c_str(), H5_O_WRONLY, 0); + if(H5OutFile == NULL) { + cerr << "ABORT: could not open '" << OutputFilename << "' for writing!" << endl; + exit(1); + } + + FloatValues = new h5_float64_t[maxNumParticles]; + IntegerValues = new h5_int64_t[maxNumParticles]; + + for(int i = 0; i < effNumInput; ++i) { + H5InFile = H5OpenFile(InputFilenames[i].c_str(), H5_O_RDONLY, 0); + + H5SetStep(H5InFile, from[i]); + H5SetStep(H5OutFile, effStep); + + if(parser.get("intersect-file-attributes")) { + itType = FileAttribType.begin(); + itNumType = FileAttribNumType.begin(); + for(itName = FileAttribName.begin(); itName != FileAttribName.end(); itName++, itType++, itNumType++) { + if(i == 0) { +#ifdef USE_BOOST + rc = copyFileAttribute(H5InFile, H5OutFile, FileAttributes, itName->first, itType->second, itNumType->second); +#else + rc = copyFileAttribute(H5InFile, H5OutFile, itName->first, itType->second, itNumType->second); +#endif + } else { +#ifdef USE_BOOST + rc = copyFileToStepAttribute(H5InFile, H5OutFile, FileAttributes, itName->first, itType->second, itNumType->second); +#else + rc = copyFileToStepAttribute(H5InFile, H5OutFile, itName->first, itType->second, itNumType->second); +#endif + } + if(rc != H5_SUCCESS) + cerr << "WARNING: could not write file attribute '" << AttrName << "'" << endl; + } + } else { + h5_int64_t NumFileAttr = H5GetNumFileAttribs(H5InFile); + for(h5_int64_t l = 0; l < NumFileAttr; ++l) { + H5GetFileAttribInfo(H5InFile, l, AttrName, MAX_LEN, &Type, &NumType); + if(i == 0) { +#ifdef USE_BOOST + rc = copyFileAttribute(H5InFile, H5OutFile, FileAttributes, string(AttrName), Type, NumType); +#else + rc = copyFileAttribute(H5InFile, H5OutFile, string(AttrName), Type, NumType); +#endif + } else { +#ifdef USE_BOOST + rc = copyFileToStepAttribute(H5InFile, H5OutFile, FileAttributes, string(AttrName), Type, NumType); +#else + rc = copyFileToStepAttribute(H5InFile, H5OutFile, string(AttrName), Type, NumType); +#endif + } + if(rc != H5_SUCCESS) + cerr << "WARNING: could not write file attribute '" << AttrName << "'" << endl; + } + } + + firstStepInput = true; + for(int l = from[i]; l <= to[i]; ++l, ++effStep) { + if(!firstStepInput) { + rc = H5SetStep(H5InFile, l); + if(rc != H5_SUCCESS) { + cerr << "ABORT: could not change to step #" << l << " in input file '" + << InputFilenames[i] << "'" << endl; + rc = H5CloseFile(H5InFile); + rc = H5CloseFile(H5OutFile); + exit(1); + } + rc = H5SetStep(H5OutFile, effStep); + if(rc != H5_SUCCESS) { + cerr << "ABORT: could not change to step #" << effStep << " in output file '" + << OutputFilename << "'" << endl; + rc = H5CloseFile(H5InFile); + rc = H5CloseFile(H5OutFile); + exit(1); + } + } else { + firstStepInput = false; + } + NumParticles = H5PartGetNumParticles(H5InFile); + rc = H5PartSetNumParticles(H5OutFile, NumParticles); + if(rc != H5_SUCCESS) { + cerr << "ABORT: could not set the number of particles in output file '" << OutputFilename << "'" << endl; + rc = H5CloseFile(H5InFile); + rc = H5CloseFile(H5OutFile); + exit(1); + } + if(parser.get("intersect-step-attributes")) { + itType = StepAttribType.begin(); + itNumType = StepAttribNumType.begin(); + for(itName = StepAttribName.begin(); itName != StepAttribName.end(); ++itName, ++itType, ++itNumType) { + rc = copyStepAttribute(H5InFile, H5OutFile, itName->first, itType->second, itNumType->second); + if(rc != H5_SUCCESS) + cerr << "WARNING: could not write step attribute '" << itName->first << "'" << endl; + } + } else { + h5_int64_t NumStepAttr = H5GetNumStepAttribs(H5InFile); + for(h5_int64_t m = 0; m < NumStepAttr; ++m) { + H5GetStepAttribInfo(H5InFile, m, StepAttrName, MAX_LEN, &Type, &NumType); + rc = copyStepAttribute(H5InFile, H5OutFile, string(StepAttrName), Type, NumType); + if(rc != H5_SUCCESS) + cerr << "WARNING: could not write step attribute '" << StepAttrName << "'" << endl; + } + } + + if(parser.get("intersect-datasets")) { + + for(itType = DataSetType.begin(); itType != DataSetType.end(); ++itType) { + rc = copyDataset(H5InFile, H5OutFile, itType->first, itType->second, FloatValues, IntegerValues); + if(rc != H5_SUCCESS) + cerr << "WARNING: could not write dataset '" << itType->first << "'" << endl; + } + } else { + h5_int64_t NumDataSets = H5PartGetNumDatasets(H5InFile); + for(h5_int64_t m = 0; m < NumDataSets; ++m) { + H5PartGetDatasetInfo(H5InFile, m, SetName, MAX_LEN, &SetType, &SetNum); + rc = copyDataset(H5InFile, H5OutFile, string(SetName), SetType, FloatValues, IntegerValues); + if(rc != H5_SUCCESS) + cerr << "WARNING: could not write dataset '" << SetName << "'" << endl; + } + } + + } + rc = H5CloseFile(H5InFile); + } + rc = H5CloseFile(H5OutFile); + + if(isOutputInput) { + rename(OutputFilename.c_str(), InputFilenames[OutputIsInput].c_str()); + } + + delete[] FloatValues; + delete[] IntegerValues; + delete[] InputFilenames; + delete[] from; + delete[] to; +} + +h5_int64_t copyFileAttribute(h5_file_t *In, h5_file_t *Out, string AttrName, h5_int64_t Type, h5_size_t Num) { + h5_int64_t rc; + if(Type == H5T_NATIVE_DOUBLE) { + void *Attrib = (double *)malloc(sizeof(double) * Num); + rc = H5ReadFileAttribFloat64(In, AttrName.c_str(), (double *)Attrib); + if(rc == H5_SUCCESS) + rc = H5WriteFileAttribFloat64(Out, AttrName.c_str(), (double *)Attrib, Num); + free(Attrib); + return rc; + } else if(Type == H5T_NATIVE_CHAR) { + void *Attrib = (char *)malloc(sizeof(char) * Num); + rc = H5ReadFileAttribString(In, AttrName.c_str(), (char *)Attrib); + if(rc == H5_SUCCESS) + rc = H5WriteFileAttribString(Out, AttrName.c_str(), (char *)Attrib); + free(Attrib); + return rc; + } else if(Type == H5T_NATIVE_INT64) { + void *Attrib = (h5_int64_t *)malloc(sizeof(h5_int64_t) * Num); + rc = H5ReadFileAttribInt64(In, AttrName.c_str(), (h5_int64_t *)Attrib); + if(rc == H5_SUCCESS) + rc = H5WriteFileAttribInt64(Out, AttrName.c_str(), (h5_int64_t *)Attrib, Num); + free(Attrib); + return rc; + } else { + cerr << "WARNING: unknown type for file attribue " << AttrName << "! Skipping it. " << endl; + return H5_ERR_INVAL; + } +} + + +h5_int64_t copyFileToStepAttribute(h5_file_t *In, h5_file_t *Out, string AttrName, h5_int64_t Type, h5_size_t Num) { + h5_int64_t rc; + if(Type == H5T_NATIVE_DOUBLE) { + void *Attrib = (double *)malloc(sizeof(double) * Num); + rc = H5ReadFileAttribFloat64(In, AttrName.c_str(), (double *)Attrib); + if(rc == H5_SUCCESS) + rc = H5WriteStepAttribFloat64(Out, AttrName.c_str(), (double *)Attrib, Num); + free(Attrib); + return rc; + } else if(Type == H5T_NATIVE_CHAR) { + void *Attrib = (char *)malloc(sizeof(char) * Num); + rc = H5ReadFileAttribString(In, AttrName.c_str(), (char *)Attrib); + if(rc == H5_SUCCESS) + rc = H5WriteStepAttribString(Out, AttrName.c_str(), (char *)Attrib); + free(Attrib); + return rc; + } else if(Type == H5T_NATIVE_INT64) { + void *Attrib = (h5_int64_t *)malloc(sizeof(h5_int64_t) * Num); + rc = H5ReadFileAttribInt64(In, AttrName.c_str(), (h5_int64_t *)Attrib); + if(rc == H5_SUCCESS) + rc = H5WriteStepAttribInt64(Out, AttrName.c_str(), (h5_int64_t *)Attrib, Num); + free(Attrib); + return rc; + } else { + cerr << "WARNING: unknown type for file attribue " << AttrName << "! Skipping it. " << endl; + return H5_ERR_INVAL; + } +} + +h5_int64_t copyStepAttribute(h5_file_t *In, h5_file_t *Out, string AttrName, h5_int64_t Type, h5_size_t Num) { + h5_int64_t rc; + if(Type == H5T_NATIVE_DOUBLE) { + void *Attrib = (double *)malloc(sizeof(double) * Num);; + rc = H5ReadStepAttribFloat64(In, AttrName.c_str(), (double *)Attrib); + if(rc == H5_SUCCESS) + rc = H5WriteStepAttribFloat64(Out, AttrName.c_str(), (double *)Attrib, Num); + free(Attrib); + return rc; + } else if(Type == H5T_NATIVE_CHAR) { + void *Attrib = (char *)malloc(sizeof(char) * Num);; + rc = H5ReadStepAttribString(In, AttrName.c_str(), (char *)Attrib); + if(rc == H5_SUCCESS) + rc = H5WriteStepAttribString(Out, AttrName.c_str(), (char *)Attrib); + free(Attrib); + return rc; + } else if(Type == H5T_NATIVE_INT64) { + void *Attrib = (h5_int64_t *)malloc(sizeof(h5_int64_t) * Num); + rc = H5ReadStepAttribInt64(In, AttrName.c_str(), (h5_int64_t *)Attrib); + if(rc == H5_SUCCESS) + rc = H5WriteStepAttribInt64(Out, AttrName.c_str(), (h5_int64_t *)Attrib, Num); + free(Attrib); + return rc; + } else { + cerr << "WARNING: unknown type for step attribute " << AttrName << "! Skipping it." << endl; + return H5_ERR_INVAL; + } +} + + +h5_int64_t copyDataset(h5_file_t *In, h5_file_t *Out, string SetName, h5_int64_t Type, h5_float64_t *FloatArray, h5_int64_t *IntegerArray) { + h5_int64_t rc; + if(Type == H5T_NATIVE_DOUBLE) { + rc = H5PartReadDataFloat64(In, SetName.c_str(), FloatArray); + if(rc == H5_SUCCESS) + rc = H5PartWriteDataFloat64(Out, SetName.c_str(), FloatArray); + return rc; + } else if(Type == H5T_NATIVE_INT64) { + rc = H5PartReadDataInt64(In, SetName.c_str(), IntegerArray); + if(rc == H5_SUCCESS) + rc = H5PartWriteDataInt64(Out, SetName.c_str(), IntegerArray); + return rc; + } else { + cerr << "WARNING: unknown type for dataset " << SetName << "! Skipping it." << endl; + return H5_ERR_INVAL; + } +} + +#ifdef USE_BOOST +h5_int64_t copyFileAttribute(h5_file_t *In, h5_file_t *Out, StringAnyValueMap &FileAttributes, string AttrName, h5_int64_t Type, h5_int64_t Num) { + h5_int64_t rc; + if(Type == H5T_NATIVE_DOUBLE) { + void *Attrib = (double *)malloc(sizeof(double) * Num); + rc = H5PartReadFileAttrib(In, AttrName.c_str(), (double *)Attrib); + if(rc == H5_SUCCESS) + rc = H5PartWriteFileAttrib(Out, AttrName.c_str(), Type, (double *)Attrib, Num); + if(rc == H5_SUCCESS) + FileAttributes.insert(make_pair(AttrName, boost::any(*(double *)Attrib))); + free(Attrib); + return rc; + } else if(Type == H5T_NATIVE_CHAR) { + void *Attrib = (char *)malloc(sizeof(char) * Num); + rc = H5PartReadFileAttrib(In, AttrName.c_str(), (char *)Attrib); + if(rc == H5_SUCCESS) + rc = H5PartWriteFileAttrib(Out, AttrName.c_str(), Type, (char *)Attrib, Num); + if(rc == H5_SUCCESS) + FileAttributes.insert(make_pair(AttrName, boost::any(string((char *)Attrib)))); + free(Attrib); + return rc; + } else if(Type == H5T_NATIVE_INT64) { + void *Attrib = (h5_int64_t *)malloc(sizeof(h5_int64_t) * Num); + rc = H5PartReadFileAttrib(In, AttrName.c_str(), (h5_int64_t *)Attrib); + if(rc == H5_SUCCESS) + rc = H5PartWriteFileAttrib(Out, AttrName.c_str(), Type, (h5_int64_t *)Attrib, Num); + if(rc == H5_SUCCESS) + FileAttributes.insert(make_pair(AttrName, boost::any(*(h5_int64_t *)Attrib))); + free(Attrib); + return rc; + } else { + cerr << "WARNING: unknown type for file attribue " << AttrName << "! Skipping it. " << endl; + return H5_ERR_INVAL; + } +} + + +h5_int64_t copyFileToStepAttribute(h5_file_t *In, h5_file_t *Out, StringAnyValueMap &FileAttributes, string AttrName, h5_int64_t Type, h5_int64_t Num) { + h5_int64_t rc; + if(Type == H5T_NATIVE_DOUBLE) { + void *Attrib = (double *)malloc(sizeof(double) * Num); + rc = H5PartReadFileAttrib(In, AttrName.c_str(), (double *)Attrib); + if(rc == H5_SUCCESS) { + if(FileAttributes.find(AttrName) == FileAttributes.end()) { + rc = H5PartWriteStepAttrib(Out, AttrName.c_str(), Type, (double *)Attrib, Num); + if(rc == H5_SUCCESS) + FileAttributes.insert(make_pair(AttrName, boost::any(*(double *)Attrib))); + } else if(any_cast(FileAttributes[AttrName]) != *(double *)Attrib) { + rc = H5PartWriteStepAttrib(Out, (AttrName + " changed to").c_str(), Type, (double *)Attrib, Num); + if(rc == H5_SUCCESS) + FileAttributes[AttrName] = boost::any(*(double *)Attrib); + } + } + free(Attrib); + return rc; + } else if(Type == H5T_NATIVE_CHAR) { + void *Attrib = (char *)malloc(sizeof(char) * Num); + rc = H5PartReadFileAttrib(In, AttrName.c_str(), (char *)Attrib); + if(rc == H5_SUCCESS) { + if(FileAttributes.find(AttrName) == FileAttributes.end()) { + rc = H5PartWriteStepAttrib(Out, AttrName.c_str(), Type, (char *)Attrib, Num); + if(rc == H5_SUCCESS) + FileAttributes.insert(make_pair(AttrName, boost::any(string((char *)Attrib)))); + } else if(strcmp((any_cast(FileAttributes[AttrName])).c_str(), (char *)Attrib) != 0) { + rc = H5PartWriteStepAttrib(Out, (AttrName + " changed to").c_str(), Type, (char *)Attrib, Num); + if(rc == H5_SUCCESS) + FileAttributes[AttrName] = boost::any(string((char *)Attrib)); + } + } + free(Attrib); + return rc; + } else if(Type == H5T_NATIVE_INT64) { + void *Attrib = (h5_int64_t *)malloc(sizeof(h5_int64_t) * Num); + rc = H5PartReadFileAttrib(In, AttrName.c_str(), (h5_int64_t *)Attrib); + if(rc == H5_SUCCESS) { + if(FileAttributes.find(AttrName) == FileAttributes.end()) { + rc = H5PartWriteStepAttrib(Out, AttrName.c_str(), Type, (h5_int64_t *)Attrib, Num); + FileAttributes.insert(make_pair(AttrName, boost::any((h5_int64_t *)Attrib))); + } else if(any_cast(FileAttributes[AttrName]) != *(h5_int64_t *)Attrib) { + rc = H5PartWriteStepAttrib(Out, (AttrName + " changed to").c_str(), Type, (h5_int64_t *)Attrib, Num); + if(rc == H5_SUCCESS) + FileAttributes[AttrName] = boost::any((h5_int64_t *)Attrib); + } + } + free(Attrib); + return rc; + } else { + cerr << "WARNING: unknown type for file attribue " << AttrName << "! Skipping it. " << endl; + return H5_ERR_INVAL; + } +} +#endif diff --git a/tools/H5PartMerge/src/optparse.cpp b/tools/H5PartMerge/src/optparse.cpp new file mode 100644 index 0000000..582f1b1 --- /dev/null +++ b/tools/H5PartMerge/src/optparse.cpp @@ -0,0 +1,309 @@ +/* + * Implementation of optparse.h + * + * Roman Geus, 2005 + * + */ + +#include +#include +#include "optparse.hh" + +using namespace std; + +namespace optparse { + +/********************** Option **********************/ + +Option::Option (string shrt, string lng, string dest, + string hlp, action_t act, string dfault, type_t type, string allowed_args) + : action (act), + shrt_flag (shrt), + lng_flag (lng), + help (hlp), + destination (dest), + dfault_(dfault), + type_(type), + allowed_args_(allowed_args) +{} + +Option::~Option () {} + +bool +Option::is_allowed(std::string argument) { + // Test type + // FIXME: implement that + + // Test allowed values + if (allowed_args_ == "") + return true; + + size_t pos_begin = 0; + do { + size_t pos_comma = allowed_args_.find(',', pos_begin); + if (pos_comma == string::npos) + pos_comma = allowed_args_.size(); + if (allowed_args_.substr(pos_begin, pos_comma-pos_begin) == argument) + return true; + pos_begin = pos_comma + 1; + } while(pos_begin < allowed_args_.size()); + return false; +} + +/******************** OptionParser *******************/ + +OptionParser::OptionParser (string usage) + : use_msg (usage) +{ } + +OptionParser::~OptionParser () {} + +void +OptionParser::add_option(string shrt_flag, string lng_flag, string destination, + string help, action_t act, type_t type, string dfault, + string allowed_values) +{ + Option option(shrt_flag, lng_flag, destination, help, act, dfault, type, allowed_values); + + /* Add the option to our list of options. */ + opts.push_back(option); + + /* Set the default value for this option, this not only allows you to + * set default values but insures that every option's destination will + * be in our dictionary, even if the value is only "". + */ + set_option(option, dfault); +} + +string OptionParser::get_option(std::string option_name) { + string arg(options[option_name]); + size_t colon_pos = arg.find(':'); + return arg.substr(0, colon_pos); +} + +void +OptionParser::parse_args (int argc, char **argv) { + /* Walk through the arguments and sort them into options + * or arguments. + */ + for (int i = 1; i < argc; i++) { + /* If we start with a '-' we're probably a pair + * so we need to figure out which option it is. find_opt() is + * where the real work is done. + */ + if (argv[i][0] == '-') + if (argv[i][1] == '-') + find_opt_long(argc, argv, i); + else + find_opt_short(argc, argv, i); + + /* If we're looking at an argument (i.e. a value with no flag who's + * meaning is determined by position) just append it into the + * arguments list. + */ + else + arguments.insert(arguments.end(), argv[i]); + } +} + +void +OptionParser::help (ostream& os) { + const size_t WORD_WRAP = 50; // max width of last column + + // Determine column width for short options + size_t shrt_flag_max_len = 0; + for (size_t i=0; i < opts.size(); ++ i) { + stringstream buf; + buf << opts[i].shrt_flag; + if (opts[i].shrt_flag != "" && opts[i].action == STORE) + buf << " " << type2string(opts[i].type_); + if (buf.str().size() > shrt_flag_max_len) + shrt_flag_max_len = buf.str().size(); + } + + // Determine column width for long options + size_t lng_flag_max_len = 0; + for (size_t i=0; i < opts.size(); ++ i) { + stringstream buf; + buf << opts[i].lng_flag; + if (opts[i].action == STORE) + buf << "=" << type2string(opts[i].type_); + if (buf.str().size() > lng_flag_max_len) + lng_flag_max_len = buf.str().size(); + } + + os << use_msg << endl; + for (size_t i=0; i < opts.size(); ++ i) { + stringstream line; + line << " "; + + // short option column + stringstream shrt_buf; + shrt_buf << opts[i].shrt_flag; + if (opts[i].shrt_flag != "" && opts[i].action == STORE) + shrt_buf << " " << type2string(opts[i].type_); + line << ' ' << shrt_buf.str(); + for (size_t k = 0; k < shrt_flag_max_len-shrt_buf.str().size()+2; ++ k) + line << ' '; + + // long option column + stringstream buf; + buf << opts[i].lng_flag; + if (opts[i].action == STORE) + buf << "=" << type2string(opts[i].type_); + line << buf.str(); + for (size_t k = 0; k < lng_flag_max_len-buf.str().size()+4; ++ k) + line << ' '; + + // help column + os << line.str(); + size_t help_col = line.str().size(); + line.str(""); + + line << opts[i].help; + bool is_allowed = opts[i].allowed_args_ != ""; + bool is_default = opts[i].action == STORE && opts[i].dfault_ != ""; + if (is_allowed || is_default) { + line << " ("; + if (is_allowed) { + line << "possible values="; + size_t pos_begin = 0; + size_t pos_comma = opts[i].allowed_args_.find(',', pos_begin); + while (pos_comma != string::npos) { + line << '\'' << opts[i].allowed_args_.substr(pos_begin, pos_comma-pos_begin) << "\',"; + pos_begin = pos_comma + 1; + pos_comma = opts[i].allowed_args_.find(',', pos_begin); + } + line << '\'' << opts[i].allowed_args_.substr(pos_begin) << '\''; + if (is_default) + line << ", "; + } + if (is_default) + line << "default=\'" << opts[i].dfault_ << "\'"; + line << ')'; + } + + // split over several lines + size_t begin_pos = 0; + size_t last_pos = 0; + size_t next_pos; + + do { + next_pos = line.str().find_first_of(" ,", last_pos+1); + if (next_pos == string::npos) + next_pos = line.str().size()-1; + if (last_pos == line.str().size()-1 || (next_pos+1 - begin_pos > WORD_WRAP && last_pos > begin_pos)) { + if (begin_pos != 0) + for (size_t k = 0; k < help_col+2; ++ k) + os << ' '; + os << line.str().substr(begin_pos, last_pos+1 - begin_pos) << endl; + begin_pos = last_pos+1; + last_pos = begin_pos; + } else + last_pos = next_pos; + } while (begin_pos != line.str().size()); + } + } + +void +OptionParser::find_opt_short(int argc, char **argv, int &index) { + /* Step through our list of known options. */ + for (size_t i = 0; i < opts.size(); i++) { + /* Uses the overridden == operator for the Options class + * to compare argv[index] to the flags of each Option. + */ + if (opts[i].shrt_flag == (string)argv[index]) { + switch (opts[i].action) { + case STORE_FALSE: + set_option(opts[i], "0"); + break; + case STORE_TRUE: + set_option(opts[i], "1"); + break; + case STORE: + /* Set the value and return if we've found a match. */ + if (index >= argc-1) + throw OptionError(argv[index], "Missing option argument"); + set_option(opts[i], argv[index+1]); + index++; + break; + default: + break; + }; + return; + } + } + + /* If we haven't found a match this is not a known argument. */ + throw OptionError(argv[index], "Unknown option"); +} + +void +OptionParser::find_opt_long(int argc, char **argv, int &index) { + // Split option and argument at "=" + string option; + string argument; + string arg_str(argv[index]); + size_t equal_pos = arg_str.find('='); + if (equal_pos != string::npos) { + option = arg_str.substr(0, equal_pos); + argument = arg_str.substr(equal_pos+1, string::npos); + } else + option = arg_str; + + /* Step through our list of known options. */ + for (size_t i = 0; i < opts.size(); i++) { + if (opts[i].lng_flag == option) { + switch (opts[i].action) { + case STORE_FALSE: + if (argument != "") + throw OptionError(option, "No argument expected for this option"); + set_option(opts[i], "0"); + break; + case STORE_TRUE: + if (argument != "") + throw OptionError(option, "No argument expected for this option"); + set_option(opts[i], "1"); + break; + case STORE: + if (argument == "") + throw OptionError(option, "Missing option argument"); + set_option(opts[i], argument); + break; + default: + break; + }; + return; + } + } + + /* If we haven't found a match this is not a known argument. */ + throw OptionError(option, "Unknown option"); +} + +void OptionParser::set_option(Option& option, std::string argument) { + if (option.is_allowed(argument)) + options[option.destination] = argument; + else + throw OptionError("", "Invalid argument for option"); +} + +string OptionParser::type2string(type_t type) { + if (type == STRING) + return string("STRING"); + else if (type == DOUBLE) + return string("DOUBLE"); + else if (type == INT) + return string("INT"); + else if (type == BOOL) + return string("BOOL"); + else + return ""; +} + +template<> bool OptionParser::get(std::string option_name) +{ + return get_option(option_name) == "1"; +} + +} // namespace optparse diff --git a/tools/H5PartMerge/src/optparse.hh b/tools/H5PartMerge/src/optparse.hh new file mode 100644 index 0000000..7183673 --- /dev/null +++ b/tools/H5PartMerge/src/optparse.hh @@ -0,0 +1,180 @@ +/* + * optparse.h + * + * An option parser for C++ modeled after the optparse Python + * module. Create an instance of OptionParser in your program + * and you can add options to it then call the method + * parse_args with argc and argv and it will parse them. The + * '-h' and '--help' options are built in, they print the + * usage message. + * + * W. Evan Sheehan + * + */ + +#ifndef OPTPARSE_H +#define OPTPARSE_H + +#include +#include +#include +#include +#include + +namespace optparse { + +/** + * Action type. + * Use this type to determine what we're storing, naming + * convention is the same as the optparse python module. + * Even with STORE_FALSE and STORE_TRUE the values are + * going to be stored as strings, false is "0" true is "1" + * so you can just atoi() the value and use that for tests. + */ +typedef enum {STORE_FALSE=0, STORE_TRUE, STORE} action_t; + +/** + * Option argument type. + * Defines expected option argument type. + */ +typedef enum {STRING=0, BOOL, INT, DOUBLE} type_t; + +/** Option for OptionParser */ +class Option { +public: + Option (std::string shrt, std::string lng, std::string dest, + std::string hlp, action_t act, std::string dfault, type_t type, + std::string allowed_args); + ~Option (); + + /** + * Validate option argument. + * Test if argument is valid for the option. The argument must be valid w.r.t. + * to type_ and allowed_values_. + * @param argument Argument to be tested. + * @return true if argument is valid. + */ + bool is_allowed(std::string argument); + + action_t action; // define what we store + std::string shrt_flag; // short flag, something like -o + std::string lng_flag; // long flag, something like --outfile + std::string help; // help message about the option + std::string destination; // the key used to store this option in the parser. + /** + * Default value. An empty string means no default value exist. + */ + std::string dfault_; + /** + * Expected type the argument of this option should have. + * Only relevant for STORE action. + * Used for generating the usage string. + */ + type_t type_; + std::string allowed_args_; //!< Comma-separated list of allowed option arguments. +}; + +class OptionError : public std::runtime_error { +public: + OptionError(std::string option, std::string error_msg) + : std::runtime_error("") { + std::ostringstream str; + str << "OptionParser error: option: " << option << ", cause: " << error_msg; + msg_ = str.str(); + } + virtual ~OptionError() throw() {} + /** + * Human-readable error message. + * @return Pointer to error message. + */ + virtual const char* what() const throw() { return msg_.c_str(); } +protected: + std::string msg_; +}; + +/** Option parser. */ +class OptionParser { +public: + OptionParser (std::string usage=""); + virtual ~OptionParser (); + + /** + * Add an option to the parser. + * @param shrt_flag Short option name, like e.g. "-q". + * @param lng_flag Long option name, like e.g. "--quiet" + * @param destination Key under which the option argument is stored in the dictionary. + * @param help Help string for generating the usage info. + * @param act Action, one of STORE, STORE_TRUE, STORE_FALSE. + * @param type Type info of the expected option argument. One of INT, DOUBLE, STRING, BOOL. + * @param dfault Default value. Value stored in the dictionary if the option is not given. + * @param allowed_values List of possible option values. + * A string of comma-separated allowed values. An empty string means + * that any value is allowed. + */ + void add_option (std::string shrt_flag, std::string lng_flag, + std::string destination, std::string help="", action_t act=STORE, + type_t type=STRING, std::string dfault="", + std::string allowed_values=""); + + /** + * Get option argument. + * @param option_name Name of option, as given in "destination" parameter of "add_option". + * @return Option argument with type appendix removed. + */ + std::string get_option(std::string option_name); + template T get(std::string option_name); + /* Parse the commandline args. */ + void parse_args (int argc, char **argv); + /** + * Write usage info to stream. + * The usage info includes a formatted list of all options the parser knows about, + * including the help string, expected argument type and default value. + * @param os Output stream the usage info is written to. + */ + void help (std::ostream& os); + /** + * Convert type_t type to human-readable string. + * This is used for generating the usage string and also in + * TypeOptionParser to encode the argument type in the options dictionary. + * @see help + * @param type Type. + * @return Converted string. + */ + std::string type2string(type_t type); + /** + * Type of "options" dictionary. + */ + typedef std::map options_type; + options_type options; //!< Dictionary of options. Use options[key] to access. + std::vector arguments; //!< List of positional arguments. +protected: + /** + * Set option in dictionary. + * Function the parser uses to store an option argument or a default value in + * options dictionary. Can be overridden in a subclass to store additional info. + * @param option Option object. + * @param argument Option argument to store. + */ + virtual void set_option(Option& option, std::string argument); + +private: + std::string use_msg; //!< Usage message. + std::vector

q c #76AA80", +",q c #8E868D", +"'q c #1D1722", +")q c #174024", +"!q c #04BD2D", +"~q c #164B25", +"{q c #201624", +"]q c #1E1E25", +"^q c #14122B", +"/q c #A5B83A", +"(q c #D5FB01", +"_q c #D8FF00", +":q c #D8FE02", +"r c #1C262E", +",r c #22171A", +"'r c #134354", +")r c #067C9F", +"!r c #173A48", +"~r c #211A1D", +"{r c #201F23", +"]r c #07A9C2", +"^r c #06A4D8", +"/r c #03B0FF", +"(r c #1096C4", +"_r c #21191A", +":r c #202124", +"s c #1F1F26", +",s c #446C19", +"'s c #2D3726", +")s c #34531C", +"!s c #334627", +"~s c #1C1825", +"{s c #211625", +"]s c #0D8425", +"^s c #0AA729", +"/s c #18171E", +"(s c #404044", +"_s c #9E9F9E", +":s c #9A9B9A", +"t c #D1FC31", +",t c #D8D7DD", +"'t c #DADBD9", +")t c #202227", +"!t c #211E23", +"~t c #1D272E", +"{t c #09808E", +"]t c #069AAA", +"^t c #0D626D", +"/t c #211C22", +"(t c #202127", +"_t c #202228", +":t c #221A1E", +"u c #0782A0", +",u c #134E5F", +"'u c #221A1F", +")u c #173846", +"!u c #10536C", +"~u c #124C61", +"{u c #07789B", +"]u c #1B313C", +"^u c #221E22", +"/u c #20252B", +"(u c #202229", +"_u c #1D2936", +":u c #055DA2", +"v c #1B3B27", +",v c #221A26", +"'v c #27223B", +")v c #B7D85A", +"!v c #C0FF00", +"~v c #BCFD02", +"{v c #BDFF00", +"]v c #BDFE02", +"^v c #BBFF00", +"/v c #C5F92E", +"(v c #E6E5EA", +"_v c #909091", +":v c #15161C", +"w c #1F252B", +",w c #222026", +"'w c #23161C", +")w c #0DA0A4", +"!w c #11FAFA", +"~w c #237177", +"{w c #21161C", +"]w c #22242A", +"^w c #231C21", +"/w c #163F4C", +"(w c #154858", +"_w c #231B20", +":w c #21242B", +"x c #273721", +",x c #37621D", +"'x c #221F2A", +")x c #222328", +"!x c #201B29", +"~x c #2F521F", +"{x c #334F26", +"]x c #284421", +"^x c #325B24", +"/x c #1B3826", +"(x c #05BF29", +"_x c #145A26", +":x c #2B1F2F", +"y c #7B7A7D", +",y c #A1A2A2", +"'y c #A4A3A4", +")y c #9D9F9E", +"!y c #2BCA4D", +"~y c #43BF5D", +"{y c #AFA6AD", +"]y c #46494B", +"^y c #1B1520", +"/y c #0D982D", +"(y c #0A9C2C", +"_y c #17171D", +":y c #979896", +"z c #ACFE03", +",z c #ABFF00", +"'z c #ABFE01", +")z c #ADF025", +"!z c #33313E", +"~z c #251B21", +"{z c #154D57", +"]z c #078594", +"^z c #1C333A", +"/z c #241E25", +"(z c #241D22", +"_z c #135163", +":z c #067D9A", +"A c #125D72", +",A c #251F24", +"'A c #23242B", +")A c #252127", +"!A c #1F2B33", +"~A c #105F74", +"{A c #241F23", +"]A c #23252C", +"^A c #21272E", +"/A c #0790AE", +"(A c #05C5E3", +"_A c #00DCF9", +":A c #185D6D", +"B c #04D3D8", +",B c #0BC9DC", +"'B c #13B9C6", +")B c #261A1F", +"!B c #22262D", +"~B c #0B6E94", +"{B c #098698", +"]B c #1F4034", +"^B c #261624", +"/B c #261B25", +"(B c #261C24", +"_B c #251F26", +":B c #26151B", +"C c #08B38C", +",C c #156848", +"'C c #16574B", +")C c #1A4A47", +"!C c #1E363A", +"~C c #1E444B", +"{C c #15767C", +"]C c #212B32", +"^C c #242229", +"/C c #23242C", +"(C c #23242F", +"_C c #0A59A5", +":C c #1A304E", +"D c #135950", +",D c #185242", +"'D c #136258", +")D c #135C59", +"!D c #099DA2", +"~D c #1F6368", +"{D c #26181E", +"]D c #24272D", +"^D c #262426", +"/D c #0C3983", +"(D c #153668", +"_D c #272323", +":D c #24262B", +"E c #1A5560", +",E c #261B21", +"'E c #24272E", +")E c #27171E", +"!E c #272324", +"~E c #113272", +"{E c #113475", +"]E c #28221D", +"^E c #24252E", +"/E c #25222B", +"(E c #233030", +"_E c #232B2E", +":E c #203F33", +"F c #21323A", +",F c #262127", +"'F c #25262D", +")F c #261C23", +"!F c #27171F", +"~F c #1A6B6F", +"{F c #21333A", +"]F c #252228", +"^F c #272423", +"/F c #13367B", +"(F c #0240C4", +"_F c #1E294A", +":F c #262425", +"G c #106979", +",G c #271F25", +"'G c #25272E", +")G c #252A30", +"!G c #261F27", +"~G c #1F555A", +"{G c #1A6E71", +"]G c #281A21", +"^G c #185864", +"/G c #00FCFF", +"(G c #13ADB5", +"_G c #29181C", +":G c #242B32", +"H c #164B60", +",H c #253227", +"'H c #1E5238", +")H c #0F574A", +"!H c #184A3D", +"~H c #135981", +"{H c #096D96", +"]H c #242430", +"^H c #281E26", +"/H c #233F44", +"(H c #13596D", +"_H c #0679A0", +":H c #20313D", +"I c #098A98", +",I c #0790A0", +"'I c #136069", +")I c #1B6468", +"!I c #272128", +"~I c #26272E", +"{I c #0D6D85", +"]I c #26242A", +"^I c #281E23", +"/I c #155665", +"(I c #0676A4", +"_I c #0DB063", +":I c #01D759", +"J c #252D30", +",J c #28202B", +"'J c #262A2F", +")J c #303238", +"!J c #C3C4C4", +"~J c #CFD0D0", +"{J c #CFD2CD", +"]J c #D7CFE1", +"^J c #B3F071", +"/J c #7FFF00", +"(J c #87FE03", +"_J c #85FF00", +":J c #85FE01", +"K c #206426", +",K c #2A3631", +"'K c #291C2E", +")K c #127D29", +"!K c #2AD64A", +"~K c #AAACAA", +"{K c #B3ABB1", +"]K c #89AC91", +"^K c #1CD743", +"/K c #66B477", +"(K c #3D3241", +"_K c #09A82E", +":K c #0D952D", +"L c #232737", +",L c #272527", +"'L c #252C2F", +")L c #24352F", +"!L c #1F5032", +"~L c #204A31", +"{L c #24342F", +"]L c #224231", +"^L c #224132", +"/L c #233A30", +"(L c #204A32", +"_L c #213433", +":L c #304028", +"M c #0F787E", +",M c #233237", +"'M c #0F8899", +")M c #00D0EF", +"!M c #02E2FE", +"~M c #0B7692", +"{M c #06B2CA", +"]M c #038FC6", +"^M c #026898", +"/M c #292429", +"(M c #27262C", +"_M c #252934", +":M c #134B6A", +"N c #79FE02", +",N c #7AFF00", +"'N c #7AFE01", +")N c #85F62A", +"!N c #1E8C7D", +"~N c #06816B", +"{N c #0B8370", +"]N c #0A8371", +"^N c #0B8070", +"/N c #0E766B", +"(N c #0E766C", +"_N c #0E756C", +":N c #0E756D", +"O c #26312F", +",O c #27342D", +"'O c #3C6523", +")O c #385528", +"!O c #4F751F", +"~O c #089122", +"{O c #0CA629", +"]O c #198130", +"^O c #28282E", +"/O c #28252F", +"(O c #26312C", +"_O c #226A22", +":O c #292C30", +"P c #01B3CB", +",P c #06C0D1", +"'P c #06BED5", +")P c #03DDF9", +"!P c #0AF3FF", +"~P c #1E9196", +"{P c #281820", +"]P c #272B32", +"^P c #0C6E88", +"/P c #0E6E87", +"(P c #292733", +"_P c #087A4E", +":P c #136044", +"

Q c #05FFA8", +",Q c #05FEA1", +"'Q c #13FEB8", +")Q c #24FAD6", +"!Q c #0C9464", +"~Q c #06804D", +"{Q c #098554", +"]Q c #24A06F", +"^Q c #2AA475", +"/Q c #2BA376", +"(Q c #2BA377", +"_Q c #2BA375", +":Q c #299C84", +"R c #132674", +",R c #2B2824", +"'R c #282830", +")R c #263030", +"!R c #243B31", +"~R c #243E31", +"{R c #253831", +"]R c #253731", +"^R c #272E30", +"/R c #253931", +"(R c #234531", +"_R c #243B30", +":R c #243F31", +"S c #15FCFD", +",S c #23F2F7", +"'S c #0F7386", +")S c #252730", +"!S c #2A282E", +"~S c #29282F", +"{S c #2A262C", +"]S c #24323C", +"^S c #087A96", +"/S c #145F74", +"(S c #2A242A", +"_S c #2A2027", +":S c #2D1620", +"T c #2CC14C", +",T c #2D2C33", +"'T c #2B1F30", +")T c #176B2E", +"!T c #06C22F", +"~T c #1F482D", +"{T c #2B2230", +"]T c #282A2F", +"^T c #138156", +"/T c #089D5E", +"(T c #08804C", +"_T c #0A5E3A", +":T c #095E3A", +"U c #1E3264", +",U c #26283B", +"'U c #103EA5", +")U c #054FFF", +"!U c #21397C", +"~U c #262936", +"{U c #242D47", +"]U c #272A39", +"^U c #272A37", +"/U c #272939", +"(U c #292830", +"_U c #263331", +":U c #243D31", +"V c #2A282F", +",V c #292A32", +"'V c #2B242B", +")V c #07809E", +"!V c #1A4F61", +"~V c #2B2329", +"{V c #29222A", +"]V c #0ECACC", +"^V c #00F2FF", +"/V c #178A9E", +"(V c #2C1C22", +"_V c #2A2329", +":V c #106881", +"W c #22953E", +",W c #281E2E", +"'W c #292D31", +")W c #2A2130", +"!W c #11882E", +"~W c #07B62F", +"{W c #24362E", +"]W c #2A2531", +"^W c #0A5D3B", +"/W c #0A5A39", +"(W c #077F4D", +"_W c #0C915A", +":W c #1F5844", +"X c #252C46", +",X c #252F45", +"'X c #272D3C", +")X c #2A292D", +"!X c #2A2931", +"~X c #2A292F", +"{X c #2A2830", +"]X c #283231", +"^X c #254332", +"/X c #292E31", +"(X c #205933", +"_X c #234A32", +":X c #263D31", +"Y c #0592B2", +",Y c #04C3D4", +"'Y c #177D8A", +")Y c #2C272C", +"!Y c #0E7892", +"~Y c #19435E", +"{Y c #1F5260", +"]Y c #0AB7E1", +"^Y c #12FEFF", +"/Y c #14CDD4", +"(Y c #223A53", +"_Y c #1D506C", +":Y c #253849", +"Z c #2C222E", +",Z c #2B2730", +"'Z c #292C32", +")Z c #2A2B32", +"!Z c #2C2C33", +"~Z c #4C4C52", +"{Z c #9EEF70", +"]Z c #53FF00", +"^Z c #5EFE03", +"/Z c #5DFE01", +"(Z c #58FF00", +"_Z c #6FF026", +":Z c #3C3845", +"` c #273A31", +",` c #264031", +"'` c #283731", +")` c #224A31", +"!` c #248028", +"~` c #294730", +"{` c #1D8E22", +"]` c #177B2C", +"^` c #0F9127", +"/` c #167629", +"(` c #293031", +"_` c #2B2530", +":` c #263C39", +"<` c #187D4E", +"[` c #283430", +"}` c #2E1624", +"|` c #2B202D", +"1` c #1A6428", +"2` c #2A3833", +"3` c #2A2631", +"4` c #2B2732", +"5` c #273531", +"6` c #12891E", +"7` c #1F6526", +"8` c #2A2C31", +"9` c #9D989D", +"0` c #A3B7A6", +"a` c #1FD641", +"b` c #5EC472", +"c` c #BCAFBA", +"d` c #B4B3B4", +"e` c #AEAFAE", +"f` c #30C851", +"g` c #099C2C", +"h` c #2A2C32", +"i` c #18692E", +"j` c #1E512F", +"k` c #2C2532", +"l` c #283638", +"m` c #2D222E", +"n` c #2B2A32", +"o` c #2D2D34", +"p` c #1F1F27", +"q` c #6A6A6F", +"r` c #CACDC9", +"s` c #D6CADD", +"t` c #9CEF6F", +"u` c #4FFF00", +"v` c #5AFE03", +"w` c #59FE01", +"x` c #54FF00", +"y` c #6CF026", +"z` c #3D3946", +"A` c #2B2C33", +"B` c #2B2830", +"C` c #10717E", +"D` c #0D818F", +"E` c #135567", +"F` c #0980A0", +"G` c #078BAE", +"H` c #125B70", +"I` c #2B282E", +"J` c #145E74", +"K` c #097A96", +"L` c #26343E", +"M` c #2C282F", +"N` c #2B2A33", +"O` c #0E6356", +"P` c #204740", +"Q` c #1D4B61", +"R` c #11637C", +"S` c #2D252A", +"T` c #2B2931", +"U` c #273942", +"V` c #2A2F36", +"W` c #06D4DA", +"X` c #0CFFFF", +"Y` c #20C9D1", +"Z` c #04AACA", +"`` c #05E5FF", +" . c #18BCCC", +". . c #1F5266", +"+ . c #214B60", +"@ . c #233F58", +"# . c #11717E", +"$ . c #117A90", +"% . c #1F596E", +"& . c #21475E", +"* . c #1D4875", +"= . c #1D4872", +"- . c #204266", +"; . c #1E4565", +"> . c #0A729B", +", . c #194C86", +"' . c #1157AA", +") . c #1A5183", +"! . c #174C7C", +"~ . c #0962AF", +"{ . c #0D62A1", +"] . c #16518F", +"^ . c #144C90", +"/ . c #0C5A9E", +"( . c #1A3783", +"_ . c #183B87", +": . c #173B8E", +"< . c #1B3A7C", +"[ . c #15368E", +"} . c #0D3A8D", +"| . c #18388C", +"1 . c #183B8B", +"2 . c #183A88", +"3 . c #1B387B", +"4 . c #183F8C", +"5 . c #1B3C7B", +"6 . c #1E376F", +"7 . c #223059", +"8 . c #1F3469", +"9 . c #223859", +"0 . c #223A59", +"a . c #233257", +"b . c #25344C", +"c . c #282D40", +"d . c #243553", +"e . c #213961", +"f . c #243551", +"g . c #263249", +"h . c #28313E", +"i . c #233855", +"j . c #292E3B", +"k . c #28303F", +"l . c #2B292E", +"m . c #2A2F32", +"n . c #283833", +"o . c #254633", +"p . c #244B33", +"q . c #244A33", +"r . c #293432", +"s . c #293332", +"t . c #254731", +"u . c #283631", +"v . c #205E30", +"w . c #263B33", +"x . c #256929", +"y . c #294830", +"z . c #1B8B24", +"A . c #1B782B", +"B . c #109229", +"C . c #128327", +"D . c #293132", +"E . c #2B252E", +"F . c #0FC577", +"G . c #05FF8E", +"H . c #0BCA6E", +"I . c #188779", +"J . c #205945", +"K . c #128729", +"L . c #264F35", +"M . c #2C2434", +"N . c #1C6326", +"O . c #188A1D", +"P . c #2B3431", +"Q . c #2B2832", +"R . c #898C8C", +"S . c #C3B7C1", +"T . c #59C06C", +"U . c #23D845", +"V . c #A1B3A4", +"W . c #B8B3B7", +"X . c #B0B4B1", +"Y . c #BFB3BC", +"Z . c #62B574", +"` . c #00BB28", +" .. c #2B2932", +"... c #253830", +"+.. c #08B830", +"@.. c #12862C", +"#.. c #2E162F", +"$.. c #2C2632", +"%.. c #2A2D32", +"&.. c #2A2A33", +"*.. c #2D2D35", +"=.. c #1F1F28", +"-.. c #8A8A8E", +";.. c #9AEF6F", +">.. c #4BFF00", +",.. c #56FE03", +"'.. c #55FE01", +").. c #50FF00", +"!.. c #69F026", +"~.. c #3D3846", +"{.. c #2A2C34", +"].. c #2D252D", +"^.. c #1F454F", +"/.. c #078D9C", +"(.. c #1A5964", +"_.. c #194354", +":.. c #0784A5", +"<.. c #088AAD", +"[.. c #125970", +"}.. c #2A2B34", +"|.. c #2C262D", +"1.. c #213E4C", +"2.. c #1B4F61", +"3.. c #2D252C", +"4.. c #2D2630", +"5.. c #145652", +"6.. c #146059", +"7.. c #301F28", +"8.. c #195263", +"9.. c #11657C", +"0.. c #292F37", +"a.. c #25434B", +"b.. c #25414A", +"c.. c #2A2F37", +"d.. c #1E5E6B", +"e.. c #1B8D9E", +"f.. c #264A55", +"g.. c #1B6173", +"h.. c #18A7B7", +"i.. c #295158", +"j.. c #214558", +"k.. c #234858", +"l.. c #244253", +"m.. c #1B5D79", +"n.. c #0890A2", +"o.. c #1E5267", +"p.. c #195387", +"q.. c #185A88", +"r.. c #185F8B", +"s.. c #115DAB", +"t.. c #19508C", +"u.. c #0F6792", +"v.. c #0D669F", +"w.. c #1B4E84", +"x.. c #1A5182", +"y.. c #164590", +"z.. c #085DAC", +"A.. c #0F5598", +"B.. c #0B5FB0", +"C.. c #18438F", +"D.. c #0E548B", +"E.. c #183C84", +"F.. c #15409C", +"G.. c #1A4080", +"H.. c #173D91", +"I.. c #0B60C6", +"J.. c #0867C6", +"K.. c #174096", +"L.. c #17378F", +"M.. c #1C3779", +"N.. c #1A387F", +"O.. c #164194", +"P.. c #1B397B", +"Q.. c #233158", +"R.. c #193C85", +"S.. c #154297", +"T.. c #1C4175", +"U.. c #1F3767", +"V.. c #25314C", +"W.. c #22385B", +"X.. c #263448", +"Y.. c #203F66", +"Z.. c #25344D", +"`.. c #243851", +" +. c #282E3D", +".+. c #25354B", +"++. c #223E5A", +"@+. c #26344A", +"#+. c #272F41", +"$+. c #2A2B35", +"%+. c #2A2D33", +"&+. c #293133", +"*+. c #254434", +"=+. c #283933", +"-+. c #273A33", +";+. c #234F33", +">+. c #263E32", +",+. c #293333", +"'+. c #264033", +")+. c #234E31", +"!+. c #254831", +"~+. c #22682A", +"{+. c #284E2F", +"]+. c #1B7B28", +"^+. c #1D6E2A", +"/+. c #167B2B", +"(+. c #0D9425", +"_+. c #07DD71", +":+. c #01FF67", +"<+. c #05F9BF", +"[+. c #08FFE0", +"}+. c #02FA98", +"|+. c #07F34B", +"1+. c #10D240", +"2+. c #2B2733", +"3+. c #273D30", +"4+. c #188E1B", +"5+. c #265729", +"6+. c #2B2434", +"7+. c #21212A", +"8+. c #7F8082", +"9+. c #C2BDC1", +"0+. c #9CAF9F", +"a+. c #22D743", +"b+. c #5FC572", +"c+. c #BEB1BB", +"d+. c #BAB4B8", +"e+. c #99AE9E", +"f+. c #08BB31", +"g+. c #13822F", +"h+. c #2D2233", +"i+. c #2A2F33", +"j+. c #2D2032", +"k+. c #148030", +"l+. c #01DE41", +"m+. c #12973F", +"n+. c #264034", +"o+. c #2C2332", +"p+. c #A8A8AA", +"q+. c #D6C9DC", +"r+. c #98EF6F", +"s+. c #47FF00", +"t+. c #53FE03", +"u+. c #51FF00", +"v+. c #52FE01", +"w+. c #4DFF00", +"x+. c #66F026", +"y+. c #2C2930", +"z+. c #10727F", +"A+. c #0C8392", +"B+. c #2A2F35", +"C+. c #194757", +"D+. c #0883A4", +"E+. c #13596E", +"F+. c #2C2B32", +"G+. c #0E6E88", +"H+. c #2E262F", +"I+. c #1E4347", +"J+. c #0F655F", +"K+. c #2C2E36", +"L+. c #2E2329", +"M+. c #1A5362", +"N+. c #12667A", +"O+. c #2E262C", +"P+. c #2B2C34", +"Q+. c #273E44", +"R+. c #26434B", +"S+. c #244E55", +"T+. c #21575E", +"U+. c #244B53", +"V+. c #24444E", +"W+. c #263A45", +"X+. c #244A53", +"Y+. c #1D5B6C", +"Z+. c #1E566B", +"`+. c #1D6073", +" @. c #1E5C6E", +".@. c #214D62", +"+@. c #214C68", +"@@. c #16687A", +"#@. c #0F758F", +"$@. c #1B5181", +"%@. c #204D66", +"&@. c #165C94", +"*@. c #165695", +"=@. c #165B96", +"-@. c #1E496D", +";@. c #0C6B92", +">@. c #155590", +",@. c #1B457D", +"'@. c #1D4477", +")@. c #0F5590", +"!@. c #0D53A0", +"~@. c #0C5CA3", +"{@. c #1C387E", +"]@. c #134D84", +"^@. c #144C82", +"/@. c #18408F", +"(@. c #164693", +"_@. c #1B3D7D", +":@. c #0F62B3", +"<@. c #0E83EF", +"[@. c #1C4289", +"}@. c #163D91", +"|@. c #143FA0", +"1@. c #1347A4", +"2@. c #14409E", +"3@. c #17408F", +"4@. c #1C4079", +"5@. c #1E3B6F", +"6@. c #1E3F70", +"7@. c #1E3D72", +"8@. c #203D69", +"9@. c #1E3C71", +"0@. c #223D5D", +"a@. c #223C5B", +"b@. c #22395C", +"c@. c #213962", +"d@. c #283241", +"e@. c #25384F", +"f@. c #214262", +"g@. c #253A51", +"h@. c #233C5A", +"i@. c #25364D", +"j@. c #28313F", +"k@. c #2B2C35", +"l@. c #2A2C35", +"m@. c #2A303A", +"n@. c #273E33", +"o@. c #283B33", +"p@. c #264333", +"q@. c #244C33", +"r@. c #293533", +"s@. c #244D33", +"t@. c #244C32", +"u@. c #245032", +"v@. c #274233", +"w@. c #264632", +"x@. c #273E32", +"y@. c #24572D", +"z@. c #236A2D", +"A@. c #1D642C", +"B@. c #198328", +"C@. c #1E612E", +"D@. c #0AA123", +"E@. c #273C31", +"F@. c #2A3334", +"G@. c #2A3033", +"H@. c #2C2732", +"I@. c #0F963A", +"J@. c #09C04D", +"K@. c #04DD78", +"L@. c #03DA7D", +"M@. c #0ADF8E", +"N@. c #07F746", +"O@. c #1E9F41", +"P@. c #2C2432", +"Q@. c #2B2E32", +"R@. c #2C2734", +"S@. c #1F7023", +"T@. c #217F1E", +"U@. c #2C2D33", +"V@. c #2B2C32", +"W@. c #717174", +"X@. c #BBBEBB", +"Y@. c #BAAEB8", +"Z@. c #5BC26E", +"`@. c #21D843", +" #. c #99B09D", +".#. c #B9B4B8", +"+#. c #B2B5B3", +"@#. c #B5ACB3", +"##. c #28A144", +"$#. c #04B12B", +"%#. c #283732", +"&#. c #2C2933", +"*#. c #2C2731", +"=#. c #0CBF4D", +"-#. c #07FF69", +";#. c #06FF5F", +">#. c #05E543", +",#. c #273C32", +"'#. c #2C2733", +")#. c #2C2C34", +"!#. c #36363D", +"~#. c #C9CCC8", +"{#. c #D6C9DB", +"]#. c #96EE6F", +"^#. c #43FF00", +"/#. c #4FFE03", +"(#. c #4EFE01", +"_#. c #49FF00", +":#. c #63F126", +"<#. c #3E3A47", +"[#. c #2C2D34", +"}#. c #2B2D35", +"|#. c #2E262D", +"1#. c #204751", +"2#. c #088D9C", +"3#. c #1C5964", +"4#. c #302127", +"5#. c #184A5B", +"6#. c #0982A3", +"7#. c #0989AC", +"8#. c #13586D", +"9#. c #1C4E60", +"0#. c #22414F", +"a#. c #2E272E", +"b#. c #2B2F37", +"c#. c #2D2B32", +"d#. c #26363D", +"e#. c #0C6867", +"f#. c #28393F", +"g#. c #2C2931", +"h#. c #1C525F", +"i#. c #126A7B", +"j#. c #2C2B33", +"k#. c #2C2A32", +"l#. c #2B3037", +"m#. c #2B3038", +"n#. c #273F45", +"o#. c #2A353C", +"p#. c #26484D", +"q#. c #12F4EC", +"r#. c #254150", +"s#. c #225360", +"t#. c #1B4D7E", +"u#. c #1266A8", +"v#. c #1E4675", +"w#. c #147A9E", +"x#. c #13D8D9", +"y#. c #1A417F", +"z#. c #085AAE", +"A#. c #1C3F7E", +"B#. c #1A3C81", +"C#. c #1B3C82", +"D#. c #124291", +"E#. c #173B7F", +"F#. c #1E3474", +"G#. c #15429A", +"H#. c #1F376E", +"I#. c #1B3F7F", +"J#. c #1C3C7A", +"K#. c #1B3D7E", +"L#. c #19438A", +"M#. c #18438C", +"N#. c #1C3B7D", +"O#. c #1B417E", +"P#. c #18478D", +"Q#. c #27334B", +"R#. c #253253", +"S#. c #1A4684", +"T#. c #20406A", +"U#. c #23345B", +"V#. c #273349", +"W#. c #283044", +"X#. c #283146", +"Y#. c #243D55", +"Z#. c #273547", +"`#. c #243E56", +" $. c #283342", +".$. c #293341", +"+$. c #2B2C37", +"@$. c #292F40", +"#$. c #2B2D36", +"$$. c #2B2E38", +"%$. c #2B2F33", +"&$. c #2B2D33", +"*$. c #293934", +"=$. c #2A3234", +"-$. c #2B3133", +";$. c #2A3333", +">$. c #2A3133", +",$. c #273F33", +"'$. c #2A3434", +")$. c #264733", +"!$. c #274032", +"~$. c #283C33", +"{$. c #22592F", +"]$. c #216D2D", +"^$. c #1E652E", +"/$. c #149926", +"($. c #225831", +"_$. c #06B322", +":$. c #224B2F", +"<$. c #2E2434", +"[$. c #2D2534", +"}$. c #22562F", +"|$. c #137325", +"1$. c #2E2230", +"2$. c #128842", +"3$. c #00D750", +"4$. c #03C15C", +"5$. c #1D5937", +"6$. c #2F1C31", +"7$. c #2D2635", +"8$. c #27462E", +"9$. c #209019", +"0$. c #2B4D2C", +"a$. c #2C2535", +"b$. c #2E2E36", +"c$. c #66666B", +"d$. c #BCBEBC", +"e$. c #9EB2A1", +"f$. c #53C067", +"g$. c #BBB0B9", +"h$. c #B2B6B3", +"i$. c #BAB0B8", +"j$. c #3B6F4A", +"k$. c #00BF2A", +"l$. c #1C6831", +"m$. c #301B33", +"n$. c #254C37", +"o$. c #00FB57", +"p$. c #0BFE60", +"q$. c #11EB56", +"r$. c #03FB46", +"s$. c #1F7A3D", +"t$. c #2E1E32", +"u$. c #2B2F34", +"v$. c #24242D", +"w$. c #4D4D53", +"x$. c #D6C8DB", +"y$. c #93EE6F", +"z$. c #3FFF00", +"A$. c #4BFE03", +"B$. c #4AFE01", +"C$. c #45FF00", +"D$. c #60F126", +"E$. c #3E3947", +"F$. c #107381", +"G$. c #29323B", +"H$. c #2E252B", +"I$. c #18485A", +"J$. c #14566B", +"K$. c #2D272E", +"L$. c #28333D", +"M$. c #0A7997", +"N$. c #2D2930", +"O$. c #2B2E36", +"P$. c #2F1D25", +"Q$. c #2C242D", +"R$. c #0E6268", +"S$. c #20494F", +"T$. c #2E252E", +"U$. c #2A2E36", +"V$. c #2E252C", +"W$. c #175E6A", +"X$. c #16616E", +"Y$. c #2A3037", +"Z$. c #283E43", +"`$. c #29363C", +" %. c #2A343B", +".%. c #25494E", +"+%. c #26474C", +"@%. c #26464C", +"#%. c #206365", +"$%. c #1E6E6F", +"%%. c #1C8E8E", +"&%. c #1F8385", +"*%. c #1B687F", +"=%. c #1A6D81", +"-%. c #1F5E6E", +";%. c #20586C", +">%. c #17A1AC", +",%. c #1690AE", +"'%. c #1C537C", +")%. c #1A5B85", +"!%. c #1F466B", +"~%. c #18578D", +"{%. c #17B6BD", +"]%. c #12A6BE", +"^%. c #24345E", +"/%. c #0F5291", +"(%. c #153C88", +"_%. c #1C377B", +":%. c #1B3A86", +"<%. c #0F4096", +"[%. c #193A7A", +"}%. c #174097", +"|%. c #193D89", +"1%. c #1D3978", +"2%. c #1A4386", +"3%. c #19448A", +"4%. c #18488F", +"5%. c #1D4074", +"6%. c #1B4180", +"7%. c #19458A", +"8%. c #194587", +"9%. c #19488A", +"0%. c #1D3B75", +"a%. c #1D3D76", +"b%. c #233958", +"c%. c #1A4C86", +"d%. c #1F416D", +"e%. c #1E446F", +"f%. c #223D5F", +"g%. c #214662", +"h%. c #243F56", +"i%. c #23405B", +"j%. c #273546", +"k%. c #233B59", +"l%. c #22415D", +"m%. c #204668", +"n%. c #273246", +"o%. c #26364B", +"p%. c #2A2F38", +"q%. c #2A2D3A", +"r%. c #2A2D38", +"s%. c #29313E", +"t%. c #29323A", +"u%. c #2A3034", +"v%. c #283B34", +"w%. c #264635", +"x%. c #293735", +"y%. c #293833", +"z%. c #2A3233", +"A%. c #2B2B34", +"B%. c #225833", +"C%. c #283A33", +"D%. c #283E32", +"E%. c #254932", +"F%. c #1F662F", +"G%. c #1E732C", +"H%. c #1F5F2F", +"I%. c #0DAF25", +"J%. c #1F6E31", +"K%. c #09AB24", +"L%. c #1C632C", +"M%. c #2D2735", +"N%. c #2C3134", +"O%. c #177A24", +"P%. c #21512E", +"Q%. c #293B38", +"R%. c #196B38", +"S%. c #128836", +"T%. c #00D146", +"U%. c #0E8E55", +"V%. c #2A2E34", +"W%. c #23791F", +"X%. c #297620", +"Y%. c #2C2935", +"Z%. c #23232C", +"`%. c #56565B", +" &. c #BCBCBB", +".&. c #B1B4B2", +"+&. c #BDB1BB", +"@&. c #5CC26F", +"#&. c #1FD741", +"$&. c #97B09C", +"%&. c #B9B4B9", +"&&. c #565A5C", +"*&. c #03A027", +"=&. c #10A132", +"-&. c #283D34", +";&. c #03F24B", +">&. c #00F946", +",&. c #02EE3C", +"'&. c #04E03B", +")&. c #225937", +"!&. c #2E2133", +"~&. c #2F2F36", +"{&. c #6B6B6F", +"]&. c #C8CBC7", +"^&. c #93F070", +"/&. c #3AFF00", +"(&. c #48FE03", +"_&. c #46FE01", +":&. c #41FF00", +"<&. c #5DF126", +"[&. c #3F3A48", +"}&. c #2C2D35", +"|&. c #214853", +"1&. c #1C5661", +"2&. c #2E272F", +"3&. c #2E2930", +"4&. c #194859", +"5&. c #0882A4", +"6&. c #0889AC", +"7&. c #185164", +"8&. c #2E272D", +"9&. c #165E74", +"0&. c #0A7B98", +"a&. c #2A2E38", +"b&. c #2D2931", +"c&. c #1F787D", +"d&. c #0E878F", +"e&. c #19525C", +"f&. c #2F2830", +"g&. c #2F252D", +"h&. c #146972", +"i&. c #195A64", +"j&. c #2F242C", +"k&. c #2C2B34", +"l&. c #2A363C", +"m&. c #283E42", +"n&. c #235656", +"o&. c #206664", +"p&. c #235657", +"q&. c #254D4D", +"r&. c #254B4D", +"s&. c #23595D", +"t&. c #225A5A", +"u&. c #216164", +"v&. c #197F88", +"w&. c #1B607E", +"x&. c #196C88", +"y&. c #1D6277", +"z&. c #1F5871", +"A&. c #1B6581", +"B&. c #156D7F", +"C&. c #21476D", +"D&. c #1C597B", +"E&. c #1C557D", +"F&. c #1B6287", +"G&. c #12F1E9", +"H&. c #147293", +"I&. c #25345C", +"J&. c #116D9C", +"K&. c #06A5DC", +"L&. c #22406A", +"M&. c #1B4583", +"N&. c #085DC1", +"O&. c #1D3E76", +"P&. c #193E8D", +"Q&. c #1A4087", +"R&. c #1E3873", +"S&. c #1F3A6F", +"T&. c #1C3F7C", +"U&. c #174895", +"V&. c #1C407F", +"W&. c #174A95", +"X&. c #223562", +"Y&. c #203C69", +"Z&. c #1D4476", +"`&. c #1B4782", +" *. c #1D4377", +".*. c #214068", +"+*. c #1F4670", +"@*. c #1F4572", +"#*. c #214067", +"$*. c #224463", +"%*. c #24445A", +"&*. c #244257", +"**. c #283347", +"=*. c #20496A", +"-*. c #214865", +";*. c #263D4E", +">*. c #27354B", +",*. c #293241", +"'*. c #243E57", +")*. c #283647", +"!*. c #293442", +"~*. c #2A313D", +"{*. c #2B303A", +"]*. c #2C2D36", +"^*. c #2A3734", +"/*. c #293C35", +"(*. c #254D31", +"_*. c #293931", +":*. c #2B3435", +"<*. c #264A34", +"[*. c #2A3634", +"}*. c #254D33", +"|*. c #293C33", +"1*. c #293C34", +"2*. c #235532", +"3*. c #225A32", +"4*. c #283F33", +"5*. c #245132", +"6*. c #17822B", +"7*. c #215830", +"8*. c #149627", +"9*. c #265432", +"0*. c #0CA326", +"a*. c #157E2A", +"b*. c #2E2635", +"c*. c #2A3534", +"d*. c #2B3034", +"e*. c #2C2E34", +"f*. c #2E2636", +"g*. c #25562B", +"h*. c #1B7522", +"i*. c #2E2735", +"j*. c #225C34", +"k*. c #1E6D34", +"l*. c #1B6723", +"m*. c #10933A", +"n*. c #00CE50", +"o*. c #16734A", +"p*. c #2F1C33", +"q*. c #29522B", +"r*. c #289018", +"s*. c #2E4230", +"t*. c #2C2735", +"u*. c #2E2E35", +"v*. c #25252E", +"w*. c #B2B4B3", +"x*. c #BAB5B9", +"y*. c #9EB2A2", +"z*. c #23D744", +"A*. c #54C268", +"B*. c #BAAFB8", +"C*. c #BCC1BC", +"D*. c #635766", +"E*. c #0F6827", +"F*. c #08C532", +"G*. c #224D31", +"H*. c #301E34", +"I*. c #1D7238", +"J*. c #07D83C", +"K*. c #07C335", +"L*. c #07D438", +"M*. c #2D2C35", +"N*. c #2F2F37", +"O*. c #D2C4D7", +"P*. c #84E364", +"Q*. c #38FF00", +"R*. c #43FD03", +"S*. c #42FE01", +"T*. c #3CFF00", +"U*. c #5AF126", +"V*. c #3F3B48", +"W*. c #2D2E35", +"X*. c #2D2C34", +"Y*. c #0E7886", +"Z*. c #0F7C8A", +"`*. c #2E292F", +" =. c #1C4555", +".=. c #0981A2", +"+=. c #2F282E", +"@=. c #253B48", +"#=. c #077D9C", +"$=. c #147485", +"%=. c #2A3C42", +"&=. c #2E252D", +"*=. c #2C3139", +"==. c #2F212A", +"-=. c #216369", +";=. c #04FFFF", +">=. c #2A464E", +",=. c #2D262E", +"'=. c #2F262E", +")=. c #15696F", +"!=. c #195D64", +"~=. c #2F2930", +"{=. c #293E41", +"]=. c #254E4D", +"^=. c #293D41", +"/=. c #293E42", +"(=. c #264B4C", +"_=. c #274648", +":=. c #274749", +"<=. c #1F6C66", +"[=. c #1F6A68", +"}=. c #1E7270", +"|=. c #1F6B6B", +"1=. c #235A5D", +"2=. c #1C7479", +"3=. c #167C94", +"4=. c #196E89", +"5=. c #1E6374", +"6=. c #1F556F", +"7=. c #1C557F", +"8=. c #0A8B9F", +"9=. c #22445B", +"0=. c #1D5A7E", +"a=. c #20526E", +"b=. c #1899AF", +"c=. c #189BB0", +"d=. c #1F406E", +"e=. c #0EB5C7", +"f=. c #11A1BF", +"g=. c #1C3F7D", +"h=. c #184983", +"i=. c #135685", +"j=. c #135785", +"k=. c #193C83", +"l=. c #195A8B", +"m=. c #0AABE6", +"n=. c #204577", +"o=. c #17418E", +"p=. c #0873EC", +"q=. c #1C4B95", +"r=. c #203569", +"s=. c #223864", +"t=. c #1E3975", +"u=. c #21366A", +"v=. c #1D3E7C", +"w=. c #1A4189", +"x=. c #16489A", +"y=. c #164B9A", +"z=. c #174694", +"A=. c #1C447E", +"B=. c #194A8B", +"C=. c #145BA3", +"D=. c #1B4D82", +"E=. c #1D477B", +"F=. c #194C8C", +"G=. c #1A548A", +"H=. c #263C53", +"I=. c #223D63", +"J=. c #283A4A", +"K=. c #254156", +"L=. c #273B4C", +"M=. c #253C58", +"N=. c #224764", +"O=. c #244059", +"P=. c #2C3038", +"Q=. c #253B55", +"R=. c #293547", +"S=. c #2B333C", +"T=. c #273C4D", +"U=. c #293643", +"V=. c #2D2C36", +"W=. c #2C3234", +"X=. c #2A3A35", +"Y=. c #284033", +"Z=. c #245A47", +"`=. c #226145", +" -. c #2B3132", +".-. c #2A3B35", +"+-. c #274734", +"@-. c #2A3834", +"#-. c #293D34", +"$-. c #284233", +"%-. c #284234", +"&-. c #284134", +"*-. c #0ADA41", +"=-. c #1A9138", +"--. c #119726", +";-. c #246435", +">-. c #109629", +",-. c #138628", +"'-. c #2F2436", +")-. c #2C3135", +"!-. c #2D2B35", +"~-. c #2D3135", +"{-. c #1E771E", +"]-. c #274C2D", +"^-. c #2D3036", +"/-. c #227130", +"(-. c #1C7626", +"_-. c #23572A", +":-. c #2C2835", +"<-. c #0AA93F", +"[-. c #00C452", +"}-. c #20543F", +"|-. c #2B7C1A", +"1-. c #2F6B24", +"2-. c #2D2737", +"3-. c #3D3D44", +"4-. c #B1B1B2", +"5-. c #B6B5B5", +"6-. c #BDB2BB", +"7-. c #1FD841", +"8-. c #95AF9A", +"9-. c #C5C0C4", +"0-. c #757078", +"a-. c #1C3529", +"b-. c #0AC033", +"c-. c #158230", +"d-. c #2F2334", +"e-. c #2E2634", +"f-. c #2A2E32", +"g-. c #12752B", +"h-. c #06C932", +"i-. c #11782B", +"j-. c #2D2633", +"k-. c #2C2C35", +"l-. c #A7A7A9", +"m-. c #CCD0CB", +"n-. c #C4B5C9", +"o-. c #68C84B", +"p-. c #39FF00", +"q-. c #3FFC02", +"r-. c #3EFF00", +"s-. c #3FFE01", +"t-. c #57F126", +"u-. c #1E4E59", +"v-. c #1F4F5A", +"w-. c #2E262E", +"x-. c #2C2F38", +"y-. c #30272D", +"z-. c #1E4251", +"A-. c #0981A3", +"B-. c #0888AC", +"C-. c #194F62", +"D-. c #2F272E", +"E-. c #2D2A32", +"F-. c #2A383F", +"G-. c #08A2B8", +"H-. c #00CCE5", +"I-. c #03DBED", +"J-. c #254852", +"K-. c #2E2830", +"L-. c #2D2831", +"M-. c #28474D", +"N-. c #06BAC9", +"O-. c #18ADB9", +"P-. c #2E373E", +"Q-. c #2F252E", +"R-. c #156B6E", +"S-. c #195E63", +"T-. c #283E41", +"U-. c #20645B", +"V-. c #25504E", +"W-. c #27484A", +"X-. c #254D4E", +"Y-. c #206962", +"Z-. c #216262", +"`-. c #1E6E69", +" ;. c #188982", +".;. c #206561", +"+;. c #1C717A", +"@;. c #1F5772", +"#;. c #205769", +"$;. c #205269", +"%;. c #205F6D", +"&;. c #1E5B72", +"*;. c #14748C", +"=;. c #127683", +"-;. c #28374D", +";;. c #1B5986", +">;. c #13E4E0", +",;. c #12F0E9", +"';. c #13E1E1", +");. c #14C7D2", +"!;. c #0FAEBD", +"~;. c #166596", +"{;. c #174796", +"];. c #0C63A0", +"^;. c #0599D0", +"/;. c #0894D3", +"(;. c #1B3589", +"_;. c #0D4C9E", +":;. c #134893", +"<;. c #164B98", +"[;. c #0951BB", +"};. c #1C3D83", +"|;. c #183E8E", +"1;. c #173F94", +"2;. c #193D8E", +"3;. c #143FA4", +"4;. c #1342A7", +"5;. c #19408B", +"6;. c #1B4184", +"7;. c #1C4180", +"8;. c #1A4A88", +"9;. c #15539C", +"0;. c #15589C", +"a;. c #175294", +"b;. c #1D4379", +"c;. c #1E4976", +"d;. c #1B4D84", +"e;. c #1C4C7D", +"f;. c #1C4E7E", +"g;. c #1C4C7C", +"h;. c #214466", +"i;. c #20436C", +"j;. c #254055", +"k;. c #28354A", +"l;. c #273D4F", +"m;. c #283546", +"n;. c #263F52", +"o;. c #24415C", +"p;. c #263D53", +"q;. c #254256", +"r;. c #2A3340", +"s;. c #2D2A34", +"t;. c #293B3C", +"u;. c #273D49", +"v;. c #254847", +"w;. c #283E33", +"x;. c #0CCA77", +"y;. c #0FCF6D", +"z;. c #2B3331", +"A;. c #274735", +"B;. c #2A3735", +"C;. c #293B35", +"D;. c #293F34", +"E;. c #274534", +"F;. c #293E34", +"G;. c #284334", +"H;. c #244F32", +"I;. c #1C8A3B", +"J;. c #24673A", +"K;. c #0BB228", +"L;. c #208437", +"M;. c #1B6D2D", +"N;. c #0E9825", +"O;. c #2D2F34", +"P;. c #2E2637", +"Q;. c #275427", +"R;. c #22701D", +"S;. c #2E2537", +"T;. c #2A5030", +"U;. c #228126", +"V;. c #1E7323", +"W;. c #263D33", +"X;. c #03BE47", +"Y;. c #08B848", +"Z;. c #317E1A", +"`;. c #2F3832", +" >. c #2C2A35", +".>. c #38383F", +"+>. c #B4B5B4", +"@>. c #BBB6BA", +"#>. c #9FB3A3", +"$>. c #52C167", +"%>. c #C7BCC4", +"&>. c #7B7E7F", +"*>. c #241D2B", +"=>. c #148F31", +"->. c #0AB12E", +";>. c #273D33", +">>. c #302034", +",>. c #2E2A36", +"'>. c #0E8A2C", +")>. c #07C532", +"!>. c #37373F", +"~>. c #BEBEBF", +"{>. c #D0D3CE", +"]>. c #AD9EB4", +"^>. c #57B93D", +"/>. c #3BFC01", +"(>. c #3BFE01", +"_>. c #35FF00", +":>. c #54F126", +"<>. c #403B49", +"[>. c #2D2D36", +"}>. c #2C2E37", +"|>. c #0E7A88", +"1>. c #107A88", +"2>. c #2C2F37", +"3>. c #30282F", +"4>. c #1F4251", +"5>. c #194E61", +"6>. c #2F282F", +"7>. c #2D2E37", +"8>. c #2D3038", +"9>. c #30212A", +"0>. c #21676D", +"a>. c #04E8EC", +"b>. c #0ABDD5", +"c>. c #01F3FF", +"d>. c #1E969A", +"e>. c #2F1D26", +"f>. c #2C333B", +"g>. c #312028", +"h>. c #166675", +"i>. c #1E515E", +"j>. c #30222A", +"k>. c #2D2F38", +"l>. c #2D2F37", +"m>. c #30252F", +"n>. c #156B6C", +"o>. c #196365", +"p>. c #2F2C32", +"q>. c #274748", +"r>. c #26504C", +"s>. c #21645B", +"t>. c #255350", +"u>. c #264E4C", +"v>. c #245555", +"w>. c #206864", +"x>. c #19897B", +"y>. c #21635E", +"z>. c #216560", +"A>. c #225E5E", +"B>. c #23575A", +"C>. c #234E62", +"D>. c #1F6073", +"E>. c #1C6D7C", +"F>. c #225865", +"G>. c #244F5D", +"H>. c #1C6783", +"I>. c #244761", +"J>. c #0C8C9D", +"K>. c #1E5765", +"L>. c #1C879A", +"M>. c #12F3EB", +"N>. c #18AAB8", +"O>. c #0CA4C6", +"P>. c #0AD6FB", +"Q>. c #11A1D1", +"R>. c #1B3A89", +"S>. c #184A87", +"T>. c #15477C", +"U>. c #0D5DC4", +"V>. c #0985FF", +"W>. c #21427A", +"X>. c #1441A0", +"Y>. c #1B3A88", +"Z>. c #163F9D", +"`>. c #1A3D8C", +" ,. c #16429C", +".,. c #173F95", +"+,. c #1B4286", +"@,. c #1547A1", +"#,. c #174795", +"$,. c #1D497F", +"%,. c #1A4E8A", +"&,. c #1A4A8B", +"*,. c #19528F", +"=,. c #165A9A", +"-,. c #1B5287", +";,. c #1D4E7D", +">,. c #1463A3", +",,. c #175C97", +"',. c #1C5581", +"),. c #273B52", +"!,. c #253E5B", +"~,. c #264055", +"{,. c #264156", +"],. c #293849", +"^,. c #24485E", +"/,. c #28364C", +"(,. c #234B62", +"_,. c #264154", +":,. c #2C2E38", +"<,. c #2A3442", +"[,. c #293746", +"},. c #2A3B3B", +"|,. c #293B41", +"1,. c #2B3440", +"2,. c #1C743F", +"3,. c #16863F", +"4,. c #2B3835", +"5,. c #2A3D36", +"6,. c #293E36", +"7,. c #2A3C35", +"8,. c #274B34", +"9,. c #245534", +"0,. c #235C33", +"a,. c #206A32", +"b,. c #2B3233", +"c,. c #264E33", +"d,. c #0CA52A", +"e,. c #1A8E38", +"f,. c #215F31", +"g,. c #0AA424", +"h,. c #2C2F35", +"i,. c #2E2C36", +"j,. c #2E2F35", +"k,. c #2B2637", +"l,. c #2C3335", +"m,. c #257918", +"n,. c #2B462F", +"o,. c #2E2B38", +"p,. c #2B6F26", +"q,. c #20891E", +"r,. c #29472F", +"s,. c #2E2837", +"t,. c #302335", +"u,. c #205637", +"v,. c #05D940", +"w,. c #198C3A", +"x,. c #2E2737", +"y,. c #2D2F35", +"z,. c #A2A2A3", +"A,. c #B5B4B5", +"B,. c #B4B6B4", +"C,. c #BEB2BC", +"D,. c #5DC270", +"E,. c #1DD740", +"F,. c #A0BBA4", +"G,. c #969398", +"H,. c #281B2E", +"I,. c #1E6A37", +"J,. c #00F04C", +"K,. c #02F04F", +"L,. c #15973D", +"M,. c #2F2C37", +"N,. c #0B9B2D", +"O,. c #07C131", +"P,. c #19592B", +"Q,. c #2F2636", +"R,. c #2D2F36", +"S,. c #4F4F55", +"T,. c #D3D7D2", +"U,. c #918298", +"V,. c #4EB236", +"W,. c #36FF00", +"X,. c #36FC01", +"Y,. c #37FE01", +"Z,. c #31FF00", +"`,. c #51F126", +" '. c #2E2F36", +".'. c #1F505A", +"+'. c #088D9D", +"@'. c #204E59", +"#'. c #30292F", +"$'. c #2E2E37", +"%'. c #2D2E36", +"&'. c #28464E", +"*'. c #01F2F4", +"='. c #08FFFF", +"-'. c #18FFFF", +";'. c #2A6D76", +">'. c #2F222A", +",'. c #2D3139", +"''. c #2F2B32", +")'. c #127783", +"!'. c #234B55", +"~'. c #302930", +"{'. c #302931", +"]'. c #127673", +"^'. c #1D5B5B", +"/'. c #2C3A3C", +"('. c #274C4A", +"_'. c #2D3238", +":'. c #264F4B", +"<'. c #235E56", +"['. c #245A55", +"}'. c #1D796A", +"|'. c #255553", +"1'. c #1E7368", +"2'. c #264F4F", +"3'. c #1E6F6E", +"4'. c #1D6D73", +"5'. c #205C6D", +"6'. c #24515C", +"7'. c #235261", +"8'. c #21576B", +"9'. c #20536F", +"0'. c #224869", +"a'. c #186A8A", +"b'. c #0C809A", +"c'. c #14D2D5", +"d'. c #14CDD6", +"e'. c #1067A7", +"f'. c #0A5BAD", +"g'. c #15449D", +"h'. c #1A3E8E", +"i'. c #0E5F97", +"j'. c #1059AA", +"k'. c #1956B1", +"l'. c #1445A6", +"m'. c #1C3D81", +"n'. c #1D3E80", +"o'. c #1A3A8A", +"p'. c #1A3D8B", +"q'. c #1D3D7F", +"r'. c #21386E", +"s'. c #1D3F7D", +"t'. c #1543A1", +"u'. c #19438F", +"v'. c #1552A1", +"w'. c #174C96", +"x'. c #1A488A", +"y'. c #1361AA", +"z'. c #1557A0", +"A'. c #16579E", +"B'. c #175F99", +"C'. c #1C5584", +"D'. c #1B5787", +"E'. c #17639A", +"F'. c #205171", +"G'. c #1F5176", +"H'. c #234962", +"I'. c #1D557D", +"J'. c #25455B", +"K'. c #2A3947", +"L'. c #264658", +"M'. c #2A3944", +"N'. c #2C323E", +"O'. c #293C4B", +"P'. c #2A3844", +"Q'. c #2B3541", +"R'. c #2C343A", +"S'. c #293F3E", +"T'. c #293E40", +"U'. c #2B3140", +"V'. c #294534", +"W'. c #168A3B", +"X'. c #2C3136", +"Y'. c #2C3436", +"Z'. c #2B3836", +"`'. c #2C3536", +" ). c #284535", +".). c #274A35", +"+). c #245B33", +"@). c #255334", +"#). c #206A33", +"$). c #1E7632", +"%). c #226534", +"&). c #109B2C", +"*). c #15B73D", +"=). c #265233", +"-). c #08AD24", +";). c #2F2A36", +">). c #2E2D35", +",). c #2B2936", +"'). c #353934", +")). c #316E19", +"!). c #2B5F13", +"~). c #301834", +"{). c #31422E", +"]). c #2A891A", +"^). c #266826", +"/). c #2F2937", +"(). c #2D2C38", +"_). c #345D22", +":). c #20A227", +"<). c #00D752", +"[). c #19633F", +"}). c #312434", +"|). c #99999B", +"1). c #9FB2A3", +"2). c #21D543", +"3). c #5ACC6F", +"4). c #9E949E", +"5). c #0CCB51", +"6). c #08FF6B", +"7). c #10F964", +"8). c #00FF4B", +"9). c #1B8339", +"0). c #312035", +"a). c #2C3235", +"b). c #302A37", +"c). c #24392F", +"d). c #0BAA2F", +"e). c #07BA30", +"f). c #1C4C2C", +"g). c #312637", +"h). c #2F2F38", +"i). c #57575D", +"j). c #D0D0CF", +"k). c #71627A", +"l). c #4CB236", +"m). c #32FF00", +"n). c #33FC01", +"o). c #33FE01", +"p). c #2DFF00", +"q). c #4EF126", +"r). c #0E7B8A", +"s). c #127583", +"t). c #2E2C34", +"u). c #0887AB", +"v). c #194D5F", +"w). c #205E6D", +"x). c #19A3B5", +"y). c #14ABBF", +"z). c #125E77", +"A). c #2F2A31", +"B). c #2F2A32", +"C). c #13747E", +"D). c #25444D", +"E). c #2F2831", +"F). c #2F2A33", +"G). c #0F8178", +"H). c #187969", +"I). c #235C54", +"J). c #235D56", +"K). c #245852", +"L). c #1F6F61", +"M). c #1D7968", +"N). c #206B5F", +"O). c #21685D", +"P). c #1E716B", +"Q). c #1F6F68", +"R). c #1C7674", +"S). c #168B8F", +"T). c #224669", +"U). c #204076", +"V). c #107595", +"W). c #0F669C", +"X). c #185399", +"Y). c #17659C", +"Z). c #167DAB", +"`). c #168FB7", +" !. c #14C8D3", +".!. c #0CB2D7", +"+!. c #115793", +"@!. c #164E8A", +"#!. c #1C3386", +"$!. c #0E8CB9", +"%!. c #0C9BE2", +"&!. c #183290", +"*!. c #1A408D", +"=!. c #1F3873", +"-!. c #1242AF", +";!. c #1A3A89", +">!. c #1B3B88", +",!. c #194890", +"'!. c #1A4489", +")!. c #194590", +"!!. c #223B67", +"~!. c #213B6D", +"{!. c #1D487E", +"]!. c #194C8F", +"^!. c #21436C", +"/!. c #1A5289", +"(!. c #0C69C6", +"_!. c #1452A4", +":!. c #204F72", +"~. c #2EFF00", +",~. c #2FFC01", +"'~. c #2FFF00", +")~. c #30FE01", +"!~. c #29FF00", +"~~. c #4BF126", +"{~. c #413C4A", +"]~. c #2E3038", +"^~. c #312830", +"/~. c #1F515D", +"(~. c #098C9C", +"_~. c #234953", +":~. c #2E2F38", +"<~. c #312930", +"[~. c #0787AB", +"}~. c #1C4A5B", +"|~. c #31282F", +"1~. c #30272E", +"2~. c #321B22", +"3~. c #1F4558", +"4~. c #058DB0", +"5~. c #1E4A5B", +"6~. c #2F2B34", +"7~. c #13757C", +"8~. c #25464F", +"9~. c #2E2D36", +"0~. c #2E3037", +"a~. c #2D3639", +"b~. c #0E8677", +"c~. c #197766", +"d~. c #26564B", +"e~. c #25574F", +"f~. c #245A51", +"g~. c #22665C", +"h~. c #245D56", +"i~. c #236156", +"j~. c #284A4B", +"k~. c #245856", +"l~. c #274C4D", +"m~. c #235D5B", +"n~. c #245959", +"o~. c #264E52", +"p~. c #1E7175", +"q~. c #264759", +"r~. c #254F5A", +"s~. c #284251", +"t~. c #225965", +"u~. c #235764", +"v~. c #25495F", +"w~. c #1F5178", +"x~. c #174F99", +"y~. c #195E8F", +"z~. c #0F7E8D", +"A~. c #1B4D7F", +"B~. c #1264B1", +"C~. c #1D4081", +"D~. c #195291", +"E~. c #1C4583", +"F~. c #1969A2", +"G~. c #11D7E1", +"H~. c #11E5E8", +"I~. c #0A5AB4", +"J~. c #0864BE", +"K~. c #143BA3", +"L~. c #0A79DA", +"M~. c #0B8EFC", +"N~. c #143AA6", +"O~. c #1A3F8D", +"P~. c #143DA6", +"Q~. c #0F3EBC", +"R~. c #0F46BE", +"S~. c #1543A3", +"T~. c #173C99", +"U~. c #1C3C86", +"V~. c #1C3C83", +"W~. c #1E347C", +"X~. c #183F96", +"Y~. c #203F74", +"Z~. c #1A498F", +"`~. c #1C4E85", +" {. c #195B93", +".{. c #195391", +"+{. c #1559A3", +"@{. c #1B5489", +"#{. c #1B4F8A", +"${. c #1C5A82", +"%{. c #1C6184", +"&{. c #1A618C", +"*{. c #22466C", +"={. c #244D63", +"-{. c #25455E", +";{. c #25445C", +">{. c #254A5F", +",{. c #284150", +"'{. c #284050", +"){. c #25485E", +"!{. c #264859", +"~{. c #2C333C", +"{{. c #27474B", +"]{. c #255246", +"^{. c #294743", +"/{. c #243E46", +"({. c #3B5E32", +"_{. c #5AE515", +":{. c #1B6F3F", +"<{. c #2F2D35", +"[{. c #2B3B37", +"}{. c #284B36", +"|{. c #2B3E39", +"1{. c #2A3F36", +"2{. c #294535", +"3{. c #255536", +"4{. c #294736", +"5{. c #274F35", +"6{. c #245935", +"7{. c #284C37", +"8{. c #1A6F2C", +"9{. c #17892E", +"0{. c #294B38", +"a{. c #119429", +"b{. c #1C672D", +"c{. c #312438", +"d{. c #2E3036", +"e{. c #2F3036", +"f{. c #2C2838", +"g{. c #374A32", +"h{. c #74F300", +"i{. c #39F24B", +"j{. c #02FEC7", +"k{. c #05FF9B", +"l{. c #1BCD4F", +"m{. c #305722", +"n{. c #2E2A3A", +"o{. c #2E2A38", +"p{. c #37731E", +"q{. c #3D791C", +"r{. c #302B39", +"s{. c #2D2A33", +"t{. c #07B646", +"u{. c #06B64A", +"v{. c #2D2834", +"w{. c #2F2E37", +"x{. c #2E2F37", +"y{. c #808084", +"z{. c #C0C0BF", +"A{. c #B5B7B5", +"B{. c #BCB7BB", +"C{. c #25D947", +"D{. c #4BC262", +"E{. c #422B44", +"F{. c #0EAB3C", +"G{. c #01ED38", +"H{. c #04EF3D", +"I{. c #1A6D32", +"J{. c #312337", +"K{. c #2D3137", +"L{. c #2D3136", +"M{. c #312638", +"N{. c #1C542D", +"O{. c #07C031", +"P{. c #0BA42F", +"Q{. c #56565C", +"R{. c #D1D5D0", +"S{. c #6C5C75", +"T{. c #49B336", +"U{. c #2AFF00", +"V{. c #2BFC01", +"W{. c #2BFF00", +"X{. c #2CFE01", +"Y{. c #25FF00", +"Z{. c #48F126", +"`{. c #2F2E35", +" ]. c #0D7E8D", +".]. c #137481", +"+]. c #312A30", +"@]. c #204250", +"#]. c #0985A8", +"$]. c #204757", +"%]. c #2F2E36", +"&]. c #2E3139", +"*]. c #2E333B", +"=]. c #16667E", +"-]. c #0883A3", +";]. c #293640", +">]. c #322830", +",]. c #12777B", +"']. c #25474E", +")]. c #312932", +"!]. c #2E3238", +"~]. c #2D353A", +"{]. c #284E45", +"]]. c #0F8775", +"^]. c #158B6E", +"/]. c #217057", +"(]. c #226756", +"_]. c #294945", +":]. c #245C51", +"<]. c #206E5D", +"[]. c #26534C", +"}]. c #236457", +"|]. c #22635C", +"1]. c #22665A", +"2]. c #265251", +"3]. c #294749", +"4]. c #26504F", +"5]. c #2A4446", +"6]. c #244E60", +"7]. c #215F6B", +"8]. c #264E59", +"9]. c #235463", +"0]. c #245263", +"a]. c #1F5978", +"b]. c #22406D", +"c]. c #17609A", +"d]. c #204C7A", +"e]. c #136E96", +"f]. c #14617A", +"g]. c #1D3C7F", +"h]. c #1A4E8D", +"i]. c #184596", +"j]. c #1249AE", +"k]. c #1A418F", +"l]. c #1254AC", +"m]. c #10EDEE", +"n]. c #12F2EC", +"o]. c #007BD8", +"p]. c #05CEF6", +"q]. c #0E75D7", +"r]. c #0E41BF", +"s]. c #0E4BC9", +"t]. c #0D3DC3", +"u]. c #0E43C3", +"v]. c #0B3FCE", +"w]. c #0645E5", +"x]. c #0C43CA", +"y]. c #0C43CB", +"z]. c #163FA0", +"A]. c #0F47BC", +"B]. c #0A4AD0", +"C]. c #1149B4", +"D]. c #1C3586", +"E]. c #184197", +"F]. c #213D72", +"G]. c #1C3F85", +"H]. c #185298", +"I]. c #175999", +"J]. c #1F507A", +"K]. c #166B9F", +"L]. c #1A5B8E", +"M]. c #1E4C7E", +"N]. c #1E5B7F", +"O]. c #1F5677", +"P]. c #1A658F", +"Q]. c #1B6288", +"R]. c #215471", +"S]. c #22526A", +"T]. c #264459", +"U]. c #234F68", +"V]. c #274857", +"W]. c #284454", +"X]. c #2A3E4B", +"Y]. c #293F4C", +"Z]. c #254F50", +"`]. c #27474F", +" ^. c #264F46", +".^. c #294143", +"+^. c #2C4342", +"@^. c #459821", +"#^. c #1B8843", +"$^. c #2D2E38", +"%^. c #2D3736", +"&^. c #284B37", +"*^. c #25553C", +"=^. c #294538", +"-^. c #284D35", +";^. c #265536", +">^. c #265336", +",^. c #236036", +"'^. c #255735", +")^. c #275237", +"!^. c #14942E", +"~^. c #18812E", +"{^. c #2F343A", +"]^. c #187F2C", +"^^. c #167C2A", +"/^. c #322338", +"(^. c #2E3136", +"_^. c #2F3136", +":^. c #2C253C", +"<^. c #3C7119", +"[^. c #33CE35", +"}^. c #00F487", +"|^. c #00E177", +"1^. c #48E13D", +"2^. c #44492A", +"3^. c #2A293A", +"4^. c #32472E", +"5^. c #418D13", +"6^. c #364630", +"7^. c #312B36", +"8^. c #283A35", +"9^. c #00D24C", +"0^. c #108E42", +"a^. c #322134", +"b^. c #2E3137", +"c^. c #313139", +"d^. c #C1C1C0", +"e^. c #5CC06F", +"f^. c #23DF46", +"g^. c #304C3C", +"h^. c #2E2835", +"i^. c #169E3A", +"j^. c #12A036", +"k^. c #0BB333", +"l^. c #08B12E", +"m^. c #22452F", +"n^. c #312938", +"o^. c #312537", +"p^. c #0BB433", +"q^. c #303039", +"r^. c #262630", +"s^. c #D1D4CF", +"t^. c #47B336", +"u^. c #26FF00", +"v^. c #28FC01", +"w^. c #27FF00", +"x^. c #28FE01", +"y^. c #21FF00", +"z^. c #45F126", +"A^. c #413C4B", +"B^. c #2E3039", +"C^. c #312931", +"D^. c #1C5763", +"E^. c #098C9D", +"F^. c #244751", +"G^. c #312A31", +"H^. c #204150", +"I^. c #0881A3", +"J^. c #0885A8", +"K^. c #204656", +"L^. c #0C7E9D", +"M^. c #116B85", +"N^. c #2E2D34", +"O^. c #0E8485", +"P^. c #26464D", +"Q^. c #302933", +"R^. c #2B3C3F", +"S^. c #294541", +"T^. c #2B4342", +"U^. c #0B987C", +"V^. c #139572", +"W^. c #255C4E", +"X^. c #245D50", +"Y^. c #226354", +"Z^. c #1D7C62", +"`^. c #236354", +" /. c #26534B", +"./. c #1E7665", +"+/. c #1C7E66", +"@/. c #1E7767", +"#/. c #216765", +"$/. c #294546", +"%/. c #26524F", +"&/. c #235A5F", +"*/. c #22576B", +"=/. c #26505A", +"-/. c #21606D", +";/. c #22556E", +">/. c #264259", +",/. c #214871", +"'/. c #1A538C", +")/. c #1F4F7B", +"!/. c #1B588B", +"~/. c #07BBC4", +"{/. c #0EA9CA", +"]/. c #1B488C", +"^/. c #1657A0", +"//. c #0E53C1", +"(/. c #1048B9", +"_/. c #0A40D1", +":/. c #0E70D5", +"(. c #25252F", +",(. c #65656A", +"'(. c #B6B7B6", +")(. c #BDB8BC", +"!(. c #2ADD4B", +"~(. c #1D9236", +"{(. c #2F2337", +"](. c #312437", +"^(. c #332038", +"/(. c #204B2F", +"((. c #08BC31", +"_(. c #0BA32E", +":(. c #283633", +"<(. c #19632E", +"[(. c #D0D4CF", +"}(. c #45B337", +"|(. c #22FF00", +"1(. c #24FC01", +"2(. c #23FF00", +"3(. c #25FE01", +"4(. c #1DFF00", +"5(. c #42F126", +"6(. c #423D4B", +"7(. c #2F3038", +"8(. c #302E36", +"9(. c #2C343D", +"0(. c #0C8190", +"a(. c #166E7B", +"b(. c #312B33", +"c(. c #2F3139", +"d(. c #322B31", +"e(. c #214150", +"f(. c #214555", +"g(. c #322A31", +"h(. c #2E323A", +"i(. c #2F323A", +"j(. c #2F313A", +"k(. c #312B32", +"l(. c #264250", +"m(. c #0789AC", +"n(. c #1B5667", +"o(. c #127C78", +"p(. c #293F45", +"q(. c #312B34", +"r(. c #2C3D3E", +"s(. c #285045", +"t(. c #294C45", +"u(. c #236453", +"v(. c #0D9372", +"w(. c #206355", +"x(. c #28534A", +"y(. c #284E49", +"z(. c #1E7A5E", +"A(. c #226854", +"B(. c #255E4E", +"C(. c #255D51", +"D(. c #26594F", +"E(. c #246254", +"F(. c #2D3741", +"G(. c #2B4142", +"H(. c #265256", +"I(. c #255958", +"J(. c #2A454C", +"K(. c #2A404E", +"L(. c #2B3F47", +"M(. c #294A50", +"N(. c #24565F", +"O(. c #22606E", +"P(. c #244F64", +"Q(. c #176C9E", +"R(. c #1A5991", +"S(. c #1C4D87", +"T(. c #0CBEDB", +"U(. c #11B9CC", +"V(. c #1A428C", +"W(. c #155DA5", +"X(. c #0E4EC1", +"Y(. c #114CB5", +"Z(. c #0C58CC", +"`(. c #0C45C9", +" _. c #10D8EB", +"._. c #0766EE", +"+_. c #0B4EDC", +"@_. c #013BF1", +"#_. c #0541E8", +"$_. c #0444EC", +"%_. c #0242F6", +"&_. c #0442EC", +"*_. c #063FE2", +"=_. c #0343EF", +"-_. c #0A42D4", +";_. c #0646E3", +">_. c #093CD6", +",_. c #063DE5", +"'_. c #0846D9", +")_. c #0447EB", +"!_. c #0B46D0", +"~_. c #0D43C5", +"{_. c #0F3DBF", +"]_. c #1547A6", +"^_. c #104FB9", +"/_. c #1654A2", +"(_. c #185897", +"__. c #1D4D82", +":_. c #186298", +"<_. c #196994", +"[_. c #156CA4", +"}_. c #1E5B81", +"|_. c #264460", +"1_. c #225670", +"2_. c #1279AF", +"3_. c #1B678A", +"4_. c #205D78", +"5_. c #215872", +"6_. c #244E66", +"7_. c #274A5C", +"8_. c #235069", +"9_. c #284856", +"0_. c #284B4A", +"a_. c #2A3E40", +"b_. c #1A9581", +"c_. c #0FCE93", +"d_. c #2A413E", +"e_. c #245448", +"f_. c #2F4F3D", +"g_. c #219A34", +"h_. c #21593D", +"i_. c #265B37", +"j_. c #2F3137", +"k_. c #284F38", +"l_. c #246138", +"m_. c #246139", +"n_. c #275337", +"o_. c #294D38", +"p_. c #226A36", +"q_. c #265A38", +"r_. c #1A8030", +"s_. c #18802D", +"t_. c #303239", +"u_. c #294734", +"v_. c #0F9A27", +"w_. c #312739", +"x_. c #26622D", +"y_. c #13872C", +"z_. c #2E4F2D", +"A_. c #4B9409", +"B_. c #1DA246", +"C_. c #0C9150", +"D_. c #322B34", +"E_. c #385629", +"F_. c #498B13", +"G_. c #353D34", +"H_. c #2E2C38", +"I_. c #303037", +"J_. c #2F3238", +"K_. c #332235", +"L_. c #16793F", +"M_. c #00DD4F", +"N_. c #244A38", +"O_. c #322737", +"P_. c #5A5A5F", +"Q_. c #B6B8B6", +"R_. c #C0B4BE", +"S_. c #62C274", +"T_. c #0BC72F", +"U_. c #312D39", +"V_. c #2E3437", +"W_. c #322738", +"X_. c #1A622E", +"Y_. c #07C632", +"Z_. c #0F902E", +"`_. c #302F38", +" :. c #2F3037", +".:. c #2F2D37", +"+:. c #31313A", +"@:. c #56565D", +"#:. c #CDCDCC", +"$:. c #CFD3CE", +"%:. c #6D5C75", +"&:. c #44B337", +"*:. c #1EFF00", +"=:. c #20FC01", +"-:. c #20FF00", +";:. c #21FE01", +">:. c #19FF00", +",:. c #3FF126", +"':. c #433D4B", +"):. c #322931", +"!:. c #1D5965", +"~:. c #0A8A9A", +"{:. c #27424C", +"]:. c #322B32", +"^:. c #0A81A3", +"/:. c #0A84A7", +"(:. c #214554", +"_:. c #34252C", +"::. c #32232C", +"<:. c #32262E", +"[:. c #32292F", +"}:. c #1C5A6F", +"|:. c #078BA9", +"1:. c #0E8481", +"2:. c #2E363D", +"3:. c #312835", +"4:. c #294E43", +"5:. c #2A4842", +"6:. c #285246", +"7:. c #22664E", +"8:. c #09AB87", +"9:. c #216755", +"0:. c #255F4C", +"a:. c #26594A", +"b:. c #255C4A", +"c:. c #226953", +"d:. c #207256", +"e:. c #216E58", +"f:. c #294C44", +"g:. c #294A4A", +"h:. c #294C4B", +"i:. c #284E4E", +"j:. c #2A4747", +"k:. c #255956", +"l:. c #206B6B", +"m:. c #2B3C4B", +"n:. c #26545B", +"o:. c #235D67", +"p:. c #255161", +"q:. c #215F73", +"r:. c #225D6E", +"s:. c #1E5982", +"t:. c #1C5289", +"u:. c #1C5A89", +"v:. c #16B4C7", +"w:. c #12EFE9", +"x:. c #11D5DC", +"y:. c #1087BF", +"z:. c #1152BC", +"A:. c #0A48D3", +"B:. c #0940D5", +"C:. c #074ADF", +"D:. c #0662F1", +"E:. c #0BB5F2", +"F:. c #023CF3", +"G:. c #0B3BCE", +"H:. c #093FDA", +"I:. c #0042FE", +"J:. c #013FF9", +"K:. c #053FE7", +"L:. c #0243F4", +"M:. c #0143F7", +"N:. c #0340EF", +"O:. c #0541EA", +"P:. c #0341EE", +"Q:. c #0647E4", +"R:. c #0642E6", +"S:. c #0A40D4", +"T:. c #0C3FCB", +"U:. c #034AF1", +"V:. c #0B42CE", +"W:. c #114AB5", +"X:. c #1646A2", +"Y:. c #194C96", +"Z:. c #204E79", +"`:. c #1A5A91", +" <. c #196694", +".<. c #1F4B7B", +"+<. c #1B568D", +"@<. c #1C6389", +"#<. c #1579A4", +"$<. c #1673A3", +"%<. c #27425B", +"&<. c #1F5A7C", +"*<. c #215773", +"=<. c #215B75", +"-<. c #284457", +";<. c #284A50", +"><. c #2C3B3E", +",<. c #2C3C45", +"'<. c #1F6A5C", +")<. c #119F59", +"!<. c #2A454B", +"~<. c #264E53", +"{<. c #2C493B", +"]<. c #249634", +"^<. c #1E6941", +"/<. c #2C4234", +"(<. c #2B4438", +"_<. c #2D3A38", +":<. c #2A4838", +"<<. c #1F7739", +"[<. c #255B38", +"}<. c #226938", +"|<. c #255C37", +"1<. c #245F38", +"2<. c #28543A", +"3<. c #1F6D33", +"4<. c #12962B", +"5<. c #285139", +"6<. c #2A4837", +"7<. c #109727", +"8<. c #2A3F35", +"9<. c #312C39", +"0<. c #302E38", +"a<. c #303339", +"b<. c #178624", +"c<. c #28752C", +"d<. c #336D21", +"e<. c #3C8119", +"f<. c #3B542F", +"g<. c #0BA052", +"h<. c #1A7947", +"i<. c #332934", +"j<. c #488715", +"k<. c #436325", +"l<. c #2E2A3B", +"m<. c #303137", +"n<. c #303138", +"o<. c #302636", +"p<. c #0AA246", +"q<. c #04C94A", +"r<. c #312C38", +"s<. c #2F3138", +"t<. c #B6B7B7", +"u<. c #BBB7BA", +"v<. c #ACB7AE", +"w<. c #1DCA3E", +"x<. c #0F8B29", +"y<. c #302937", +"z<. c #14792D", +"A<. c #07CA32", +"B<. c #147A2E", +"C<. c #302837", +"D<. c #2F2F39", +"E<. c #272731", +"F<. c #42B337", +"G<. c #1AFF00", +"H<. c #1DFC01", +"I<. c #1CFF00", +"J<. c #1DFE01", +"K<. c #15FF00", +"L<. c #3CF126", +"M<. c #433D4C", +"N<. c #2F3039", +"O<. c #302E37", +"P<. c #2D353E", +"Q<. c #0C8291", +"R<. c #322B33", +"S<. c #0981A4", +"T<. c #0B7FA3", +"U<. c #127F8D", +"V<. c #0FBDC0", +"W<. c #23616C", +"X<. c #302C35", +"Y<. c #11738D", +"Z<. c #059A9B", +"`<. c #2C393D", +" [. c #2D3C3D", +".[. c #2B4340", +"+[. c #275648", +"@[. c #29473C", +"#[. c #1AA0A1", +"$[. c #00FFED", +"%[. c #0EB992", +"&[. c #2A4A40", +"*[. c #255E4B", +"=[. c #226952", +"-[. c #1E7C5A", +";[. c #216D51", +">[. c #236654", +",[. c #294C46", +"'[. c #2A4843", +")[. c #284D4C", +"![. c #27504F", +"~[. c #26515B", +"{[. c #2C4146", +"][. c #1E8F8E", +"^[. c #20868A", +"/[. c #1F6B79", +"([. c #1F6D7A", +"_[. c #216474", +":[. c #215A74", +"<[. c #1C819B", +"[[. c #1B89A3", +"}[. c #1E5A80", +"|[. c #195794", +"1[. c #13E4E3", +"2[. c #0FBFE6", +"3[. c #076DE8", +"4[. c #054FEB", +"5[. c #0968E3", +"6[. c #0DC1F0", +"7[. c #075BE8", +"8[. c #0144F8", +"9[. c #0244F6", +"0[. c #003CFB", +"a[. c #0140F9", +"b[. c #013EF8", +"c[. c #043EED", +"d[. c #043FED", +"e[. c #033FF0", +"f[. c #0040FF", +"g[. c #0040FD", +"h[. c #013BF8", +"i[. c #0248F6", +"j[. c #023EF5", +"k[. c #033DF1", +"l[. c #0744DF", +"m[. c #0742E0", +"n[. c #0A3ED2", +"o[. c #0942D6", +"p[. c #0E49C2", +"q[. c #1247B1", +"r[. c #1054BC", +"s[. c #1A5191", +"t[. c #1457AA", +"u[. c #196596", +"v[. c #1C5189", +"w[. c #17609E", +"x[. c #18649A", +"y[. c #196394", +"z[. c #1E5F82", +"A[. c #1E5A81", +"B[. c #264761", +"C[. c #234E6B", +"D[. c #23576D", +"E[. c #284759", +"F[. c #2C3B49", +"G[. c #2B4145", +"H[. c #2B3D49", +"I[. c #2C3A48", +"J[. c #2D363A", +"K[. c #108B4C", +"L[. c #265254", +"M[. c #294544", +"N[. c #2D6F2F", +"O[. c #198240", +"P[. c #294848", +"Q[. c #284D3C", +"R[. c #2D3C37", +"S[. c #245F39", +"T[. c #20723A", +"U[. c #284E39", +"V[. c #1E793A", +"W[. c #236639", +"X[. c #294C39", +"Y[. c #265838", +"Z[. c #27583A", +"`[. c #235E35", +" }. c #177D2B", +".}. c #2A473A", +"+}. c #302E3A", +"@}. c #138D29", +"#}. c #255032", +"$}. c #32283A", +"%}. c #312B3A", +"&}. c #245B2D", +"*}. c #198C1C", +"=}. c #368D1D", +"-}. c #3B6F22", +";}. c #3D5230", +">}. c #263D3C", +",}. c #06B058", +"'}. c #2F822E", +")}. c #537D12", +"!}. c #323738", +"~}. c #2F2D39", +"{}. c #302F39", +"]}. c #312D38", +"^}. c #2A3639", +"/}. c #01C54C", +"(}. c #0CAA45", +"_}. c #43434B", +":}. c #B5B8B5", +"<}. c #C4B8C2", +"[}. c #57AF69", +"}}. c #00BB22", +"|}. c #32293A", +"1}. c #10902E", +"2}. c #07C732", +"3}. c #1B632F", +"4}. c #322739", +"5}. c #32323A", +"6}. c #282831", +"7}. c #CED2CD", +"8}. c #40B337", +"9}. c #16FF00", +"0}. c #19FC01", +"a}. c #18FF00", +"b}. c #1AFE01", +"c}. c #11FF00", +"d}. c #39F126", +"e}. c #443E4C", +"f}. c #30323A", +"g}. c #332A32", +"h}. c #1D5B67", +"i}. c #2A3F49", +"j}. c #322D34", +"k}. c #303139", +"l}. c #332C33", +"m}. c #223F4D", +"n}. c #0496B7", +"o}. c #00C5E4", +"p}. c #04E7F1", +"q}. c #00EFFF", +"r}. c #215E72", +"s}. c #33272E", +"t}. c #30323B", +"u}. c #332A33", +"v}. c #28434A", +"w}. c #01A3A2", +"x}. c #18666E", +"y}. c #275B43", +"z}. c #285245", +"A}. c #265D49", +"B}. c #295244", +"C}. c #0CC0B2", +"D}. c #01DDBE", +"E}. c #14E1C8", +"F}. c #295144", +"G}. c #255D4B", +"H}. c #265C4B", +"I}. c #2B4840", +"J}. c #2A4A44", +"K}. c #2A4946", +"L}. c #245F5C", +"M}. c #2B4544", +"N}. c #265654", +"O}. c #1C7188", +"P}. c #1D6588", +"Q}. c #1463A9", +"R}. c #196DA0", +"S}. c #13B7D2", +"T}. c #12E0E7", +"U}. c #12F1EC", +"V}. c #11E3ED", +"W}. c #0DCBEC", +"X}. c #0A8EEB", +"Y}. c #0346F2", +"Z}. c #033FF1", +"`}. c #0140F7", +" |. c #0639E5", +".|. c #0339EF", +"+|. c #0244F5", +"@|. c #023DF6", +"#|. c #023AF3", +"$|. c #013AF6", +"%|. c #013DF8", +"&|. c #053CE9", +"*|. c #023CF6", +"=|. c #023FF3", +"-|. c #024BF4", +";|. c #0548E9", +">|. c #064EE4", +",|. c #0C41CC", +"'|. c #0840DC", +")|. c #0B4BD0", +"!|. c #0E52C2", +"~|. c #17579F", +"{|. c #1154B7", +"]|. c #1658A5", +"^|. c #0E6AC2", +"/|. c #1E5D85", +"(|. c #23526E", +"_|. c #24446B", +":|. c #1C6D89", +"<|. c #1C658A", +"[|. c #1C6289", +"}|. c #24566A", +"||. c #225E73", +"1|. c #2D3848", +"2|. c #25565F", +"3|. c #25585B", +"4|. c #2E3A44", +"5|. c #294353", +"6|. c #2F4F42", +"7|. c #1CBF35", +"8|. c #1F654B", +"9|. c #2F3546", +"0|. c #302A3E", +"a|. c #2F6131", +"b|. c #169544", +"c|. c #255444", +"d|. c #28543C", +"e|. c #2B4838", +"f|. c #285438", +"g|. c #2C4438", +"h|. c #226C3A", +"i|. c #265D3A", +"j|. c #255E39", +"k|. c #265C3A", +"l|. c #226E3A", +"m|. c #246439", +"n|. c #226A39", +"o|. c #109D2C", +"p|. c #2D3F38", +"q|. c #351F3A", +"r|. c #1A7B2D", +"s|. c #34263A", +"t|. c #303338", +"u|. c #30253C", +"v|. c #2E3F35", +"w|. c #1C7B1E", +"x|. c #27791F", +"y|. c #388D1C", +"z|. c #323139", +"A|. c #3A7221", +"B|. c #3B5B32", +"C|. c #311E38", +"D|. c #206740", +"E|. c #13D048", +"F|. c #375730", +"G|. c #30283A", +"H|. c #2F3339", +"I|. c #332937", +"J|. c #205540", +"K|. c #00DA50", +"L|. c #14893F", +"M|. c #332637", +"N|. c #393940", +"O|. c #C2BFC1", +"P|. c #86918A", +"Q|. c #02AF25", +"R|. c #15922F", +"S|. c #322D3A", +"T|. c #293933", +"U|. c #0CA62F", +"V|. c #09BF32", +"W|. c #214F30", +"X|. c #33293A", +"Y|. c #32323B", +"Z|. c #CDD1CC", +"`|. c #3FB437", +" 1. c #13FF00", +".1. c #16FC01", +"+1. c #17FE01", +"@1. c #0EFF00", +"#1. c #37F126", +"$1. c #443E4D", +"%1. c #30313A", +"&1. c #312F37", +"*1. c #2D3740", +"=1. c #0C8493", +"-1. c #1A6673", +";1. c #332B34", +">1. c #32333A", +",1. c #0AB0BA", +"'1. c #07C1D7", +")1. c #07C3E2", +"!1. c #00E5FF", +"~1. c #16A5B2", +"{1. c #33282D", +"]1. c #2F373E", +"^1. c #31323A", +"/1. c #2C3E40", +"(1. c #08978B", +"_1. c #0889A7", +":1. c #1D6D5E", +"<1. c #21774E", +"[1. c #255F4B", +"}1. c #217353", +"|1. c #088366", +"11. c #0FBA99", +"21. c #24967F", +"31. c #216A4C", +"41. c #23694E", +"51. c #285547", +"61. c #236B51", +"71. c #27594A", +"81. c #2A4948", +"91. c #2B4945", +"01. c #294F4D", +"a1. c #27564D", +"b1. c #2E393D", +"c1. c #285151", +"d1. c #246157", +"e1. c #255C5C", +"f1. c #2A474C", +"g1. c #265A5C", +"h1. c #216C69", +"i1. c #23636A", +"j1. c #255864", +"k1. c #205D7A", +"l1. c #1D6986", +"m1. c #215A77", +"n1. c #1E5B84", +"o1. c #17689E", +"p1. c #1767A0", +"q1. c #18709B", +"r1. c #1D5C89", +"s1. c #18649D", +"t1. c #18599D", +"u1. c #185A9C", +"v1. c #0766E0", +"w1. c #0B55D2", +"x1. c #0A4AD6", +"y1. c #056FCA", +"z1. c #0555DD", +"A1. c #0358D3", +"B1. c #073DDF", +"C1. c #0242F4", +"D1. c #023BF3", +"E1. c #053BE7", +"F1. c #033EF0", +"G1. c #043CEE", +"H1. c #043AED", +"I1. c #0239F6", +"J1. c #013DF7", +"K1. c #023AF6", +"L1. c #0138F7", +"M1. c #0239F5", +"N1. c #0133FA", +"O1. c #043EEC", +"P1. c #033DF0", +"Q1. c #0047FF", +"R1. c #0143F8", +"S1. c #0344EF", +"T1. c #0448ED", +"U1. c #0549E9", +"V1. c #0946D8", +"W1. c #093FD9", +"X1. c #094BD7", +"Y1. c #0F50C0", +"Z1. c #1059BD", +"`1. c #0C51CD", +" 2. c #115EB8", +".2. c #155DA9", +"+2. c #1F517F", +"@2. c #186C9D", +"#2. c #196697", +"$2. c #1A6B93", +"%2. c #1F5D80", +"&2. c #1B6391", +"*2. c #1E6384", +"=2. c #1F5E81", +"-2. c #2A4357", +";2. c #206A75", +">2. c #255A61", +",2. c #2A4955", +"'2. c #274B5D", +")2. c #2E5E41", +"!2. c #2ED822", +"~2. c #1B7852", +"{2. c #294D4F", +"]2. c #284C44", +"^2. c #2A6637", +"/2. c #1A973F", +"(2. c #1B734B", +"_2. c #2C4638", +":2. c #2A4B3B", +"<2. c #2C4439", +"[2. c #24663C", +"}2. c #179C3F", +"|2. c #28523B", +"12. c #265E3B", +"22. c #1B8A3C", +"32. c #24663B", +"42. c #207139", +"52. c #138D2A", +"62. c #34263B", +"72. c #206530", +"82. c #1A762C", +"92. c #34243B", +"02. c #313039", +"a2. c #313239", +"b2. c #2F293B", +"c2. c #375331", +"d2. c #247D19", +"e2. c #245A28", +"f2. c #31771F", +"g2. c #347528", +"h2. c #30233E", +"i2. c #386F24", +"j2. c #3B5933", +"k2. c #2C263E", +"l2. c #49611D", +"m2. c #28AE37", +"n2. c #0C9954", +"o2. c #312D37", +"p2. c #31303A", +"q2. c #332838", +"r2. c #137C47", +"s2. c #00DC4E", +"t2. c #1D6B3B", +"u2. c #332638", +"v2. c #30333A", +"w2. c #B8B9B8", +"x2. c #C0C3C0", +"y2. c #928593", +"z2. c #156D2B", +"A2. c #08C72D", +"B2. c #264C34", +"C2. c #332A3A", +"D2. c #332B3B", +"E2. c #234831", +"F2. c #09B830", +"G2. c #0BB131", +"H2. c #283E34", +"I2. c #332C3B", +"J2. c #C2C2C3", +"K2. c #3DB438", +"L2. c #0FFF00", +"M2. c #12FC01", +"N2. c #13FE01", +"O2. c #0AFF00", +"P2. c #34F126", +"Q2. c #332B33", +"R2. c #19616E", +"S2. c #0B8797", +"T2. c #2B3D47", +"U2. c #322D36", +"V2. c #312D36", +"W2. c #0AD5D6", +"X2. c #00F1F9", +"Y2. c #00D7EF", +"Z2. c #0EFFFF", +"`2. c #2C9B9F", +" 3. c #31232C", +".3. c #30353D", +"+3. c #30343B", +"@3. c #2A4346", +"#3. c #108871", +"$3. c #127588", +"%3. c #0A879C", +"&3. c #255D42", +"*3. c #285D40", +"=3. c #10786A", +"-3. c #0F7C6C", +";3. c #295542", +">3. c #26563F", +",3. c #2C4341", +"'3. c #24634C", +")3. c #265C48", +"!3. c #295043", +"~3. c #27554C", +"{3. c #275549", +"]3. c #2C433E", +"^3. c #275751", +"/3. c #2D3E3D", +"(3. c #28504E", +"_3. c #265A53", +":3. c #24605A", +"<3. c #27565A", +"[3. c #2B444A", +"}3. c #265958", +"|3. c #285157", +"13. c #2A4951", +"23. c #2B3D4F", +"33. c #225A74", +"43. c #255664", +"53. c #1D6689", +"63. c #1F5D7F", +"73. c #1B6590", +"83. c #1D5B86", +"93. c #156CA8", +"03. c #1278B3", +"a3. c #1A5E93", +"b3. c #1362AF", +"c3. c #0A6FD6", +"d3. c #0F48C0", +"e3. c #0B57D1", +"f3. c #094DDB", +"g3. c #054CE0", +"h3. c #0285D0", +"i3. c #03B0E8", +"j3. c #034CF4", +"k3. c #043BEC", +"l3. c #063BE6", +"m3. c #0137F7", +"n3. c #0235F4", +"o3. c #0139FA", +"p3. c #0238F4", +"q3. c #013FFA", +"r3. c #0235F5", +"s3. c #0136FA", +"t3. c #0034FD", +"u3. c #0039FD", +"v3. c #0139F7", +"w3. c #0232F6", +"x3. c #043BEE", +"y3. c #023EF4", +"z3. c #0040FB", +"A3. c #0043FD", +"B3. c #0242F5", +"C3. c #014BF7", +"D3. c #0648E3", +"E3. c #084CDB", +"F3. c #0C46CC", +"G3. c #0D58C9", +"H3. c #0C53CB", +"I3. c #1256B3", +"J3. c #18519B", +"K3. c #1268B2", +"L3. c #1171B7", +"M3. c #1E5682", +"N3. c #186C9B", +"O3. c #1C5C8C", +"P3. c #186F9A", +"Q3. c #235B6F", +"R3. c #215976", +"S3. c #225573", +"T3. c #225B6F", +"U3. c #264F5E", +"V3. c #255B5D", +"W3. c #236064", +"X3. c #2A4750", +"Y3. c #294551", +"Z3. c #236937", +"`3. c #149252", +" 4. c #2A4252", +".4. c #2C4246", +"+4. c #2D4433", +"@4. c #12CE6E", +"#4. c #0BE27C", +"$4. c #2B4C3F", +"%4. c #265941", +"&4. c #275940", +"*4. c #25623D", +"=4. c #21733D", +"-4. c #236A3B", +";4. c #216F3C", +">4. c #226C3C", +",4. c #25613B", +"'4. c #29523B", +")4. c #0EBA36", +"!4. c #226B38", +"~4. c #274D34", +"{4. c #13912C", +"]4. c #33263B", +"^4. c #313339", +"/4. c #2E273C", +"(4. c #3A5F2D", +"_4. c #54F005", +":4. c #2ABF04", +"<4. c #397424", +"[4. c #328716", +"}4. c #30692D", +"|4. c #30243D", +"14. c #366229", +"24. c #385536", +"34. c #373E33", +"44. c #5D8E0E", +"54. c #414D2B", +"64. c #0B9F53", +"74. c #178349", +"84. c #2E323B", +"94. c #09A14E", +"04. c #01D049", +"a4. c #24523A", +"b4. c #332839", +"c4. c #979799", +"d4. c #BEBFBD", +"e4. c #A19EA2", +"f4. c #2B3736", +"g4. c #0BB72D", +"h4. c #13922E", +"i4. c #322A39", +"j4. c #1D5B30", +"k4. c #08C332", +"l4. c #0E9F30", +"m4. c #2D3337", +"n4. c #322E3A", +"o4. c #33333C", +"p4. c #CACAC9", +"q4. c #6E5C75", +"r4. c #3CB438", +"s4. c #0CFF00", +"t4. c #10FC02", +"u4. c #0FFF01", +"v4. c #11FE03", +"w4. c #08FF00", +"x4. c #32F127", +"y4. c #453F4D", +"z4. c #31323B", +"A4. c #332F37", +"B4. c #2C3B45", +"C4. c #0B8696", +"D4. c #1A6471", +"E4. c #332C34", +"F4. c #31333C", +"G4. c #342831", +"H4. c #236B74", +"I4. c #00E1FA", +"J4. c #0DEEFF", +"K4. c #21EAF1", +"L4. c #246371", +"M4. c #332931", +"N4. c #31323C", +"O4. c #2F3C3E", +"P4. c #31333A", +"Q4. c #2B4245", +"R4. c #108F6F", +"S4. c #2B4441", +"T4. c #0B7F98", +"U4. c #13798D", +"V4. c #178483", +"W4. c #078476", +"X4. c #1D805B", +"Y4. c #2C4A40", +"Z4. c #2C4842", +"`4. c #236C4B", +" 5. c #2B4B42", +".5. c #266248", +"+5. c #266148", +"@5. c #2A4D46", +"#5. c #2D4342", +"$5. c #2D4443", +"%5. c #2A4E47", +"&5. c #2F3B3D", +"*5. c #2E3F43", +"=5. c #2C4749", +"-5. c #236A63", +";5. c #236860", +">5. c #265A5A", +",5. c #265D5C", +"'5. c #2A4957", +")5. c #2A4959", +"!5. c #225378", +"~5. c #25466C", +"{5. c #1D628A", +"]5. c #1F5B80", +"^5. c #1F5F80", +"/5. c #205B7D", +"(5. c #196A9D", +"_5. c #1766A2", +":5. c #1567A9", +"<5. c #1D578A", +"[5. c #1752A3", +"}5. c #0E5AC4", +"|5. c #1251B7", +"15. c #0264F5", +"25. c #0350F0", +"35. c #03A7E7", +"45. c #09E5FB", +"55. c #0548F2", +"65. c #0237F4", +"75. c #023FF7", +"85. c #0235F6", +"95. c #003AFF", +"05. c #0038FE", +"a5. c #0334F0", +"b5. c #0437ED", +"c5. c #0232F4", +"d5. c #0333F2", +"e5. c #0037FD", +"f5. c #0438EB", +"g5. c #032EF1", +"h5. c #0136F9", +"i5. c #0437EE", +"j5. c #0634E4", +"k5. c #0233F5", +"l5. c #013AF8", +"m5. c #0240F7", +"n5. c #0345F1", +"o5. c #0444ED", +"p5. c #0846DE", +"q5. c #0A4ED7", +"r5. c #0C47CB", +"s5. c #0B4DD0", +"t5. c #0E56C5", +"u5. c #1160BA", +"v5. c #0C69CF", +"w5. c #1670A4", +"x5. c #1270B7", +"y5. c #166BA7", +"z5. c #1D5A8A", +"A5. c #225577", +"B5. c #196D9A", +"C5. c #1B6A91", +"D5. c #20607D", +"E5. c #235F70", +"F5. c #1C7181", +"G5. c #284B5C", +"H5. c #29504B", +"I5. c #1E867F", +"J5. c #265E5F", +"K5. c #2B513B", +"L5. c #149848", +"M5. c #275048", +"N5. c #275A42", +"O5. c #18A951", +"P5. c #12B25E", +"Q5. c #28603D", +"R5. c #275A3D", +"S5. c #1F7E40", +"T5. c #24663D", +"U5. c #2B4D3B", +"V5. c #1A8F3F", +"W5. c #246A3C", +"X5. c #1E813F", +"Y5. c #236C3D", +"Z5. c #28593C", +"`5. c #21733E", +" 6. c #04FA38", +".6. c #1C9939", +"+6. c #37193A", +"@6. c #236F3C", +"#6. c #05FF3C", +"$6. c #285E39", +"%6. c #33283A", +"&6. c #323439", +"*6. c #30263D", +"=6. c #396C29", +"-6. c #4FF60F", +";6. c #489918", +">6. c #2F7022", +",6. c #316231", +"'6. c #31253D", +")6. c #35632A", +"!6. c #385537", +"~6. c #516E1A", +"{6. c #56771B", +"]6. c #31273D", +"^6. c #2B423B", +"/6. c #08B756", +"(6. c #216143", +"_6. c #352738", +":6. c #31343A", +"<6. c #342C38", +"[6. c #264A42", +"}6. c #02BC51", +"|6. c #07BC44", +"16. c #2B3F3A", +"26. c #332D3B", +"36. c #33333B", +"46. c #8F8F92", +"56. c #382C3F", +"66. c #1B7331", +"76. c #07C62C", +"86. c #264E34", +"96. c #342B3B", +"06. c #17712F", +"a6. c #07CC33", +"b6. c #138930", +"c6. c #57575E", +"d6. c #CBCFCA", +"e6. c #6F5C75", +"f6. c #36B438", +"g6. c #00FF00", +"h6. c #05FC01", +"i6. c #03FF00", +"j6. c #05FE01", +"k6. c #29F126", +"l6. c #453F4E", +"m6. c #32313B", +"n6. c #342C34", +"o6. c #1A6370", +"p6. c #0C8696", +"q6. c #332F38", +"r6. c #32313A", +"s6. c #342931", +"t6. c #2D3F4D", +"u6. c #236072", +"v6. c #0C7593", +"w6. c #0C6E8D", +"x6. c #2B4045", +"y6. c #2F3E3D", +"z6. c #31313B", +"A6. c #342B37", +"B6. c #274E4C", +"C6. c #108C70", +"D6. c #2F4335", +"E6. c #1A7678", +"F6. c #00C4DF", +"G6. c #11A3A3", +"H6. c #2C4E3A", +"I6. c #275C46", +"J6. c #295442", +"K6. c #295444", +"L6. c #266249", +"M6. c #285A45", +"N6. c #285846", +"O6. c #2A4F43", +"P6. c #2A4F46", +"Q6. c #303741", +"R6. c #2C4546", +"S6. c #2A4F4D", +"T6. c #2B4C47", +"U6. c #29544E", +"V6. c #265B5C", +"W6. c #285450", +"X6. c #25615F", +"Y6. c #284660", +"Z6. c #29435D", +"`6. c #1C6690", +" 7. c #225479", +".7. c #29415A", +"+7. c #205981", +"@7. c #255073", +"#7. c #1E688B", +"$7. c #03DCEA", +"%7. c #0FA8C4", +"&7. c #1D4F8B", +"*7. c #1074BF", +"=7. c #096FD8", +"-7. c #0E64C7", +";7. c #0969D9", +">7. c #065BE7", +",7. c #0351F0", +"'7. c #0346F0", +")7. c #036EF7", +"!7. c #055AF6", +"~7. c #0132F8", +"{7. c #0036FB", +"]7. c #0134F7", +"^7. c #0137F9", +"/7. c #0335F1", +"(7. c #0230F7", +"_7. c #0237F6", +":7. c #052FEA", +"<7. c #022DF5", +"[7. c #0134FA", +"}7. c #0138FA", +"|7. c #0435ED", +"17. c #022EF6", +"27. c #0031FF", +"37. c #003AFB", +"47. c #0032FD", +"57. c #023FF6", +"67. c #023FF4", +"77. c #0240F5", +"87. c #0246F3", +"97. c #033EF2", +"07. c #034CEF", +"a7. c #0B4AD2", +"b7. c #085ADF", +"c7. c #0A58D6", +"d7. c #115ABC", +"e7. c #1168BB", +"f7. c #1462AE", +"g7. c #0F73C3", +"h7. c #1660A5", +"i7. c #205B7E", +"j7. c #176FA2", +"k7. c #225B76", +"l7. c #18729F", +"m7. c #1F6C80", +"n7. c #27515E", +"o7. c #255B5F", +"p7. c #2C414B", +"q7. c #07E1B8", +"r7. c #1A9A81", +"s7. c #2D4243", +"t7. c #159E41", +"u7. c #1D6E57", +"v7. c #29564D", +"w7. c #2B4644", +"x7. c #26713E", +"y7. c #178740", +"z7. c #23693F", +"A7. c #275E3F", +"B7. c #246A3F", +"C7. c #24673F", +"D7. c #227140", +"E7. c #207B40", +"F7. c #20793F", +"G7. c #29553E", +"H7. c #25633E", +"I7. c #2F403D", +"J7. c #17852D", +"K7. c #245B34", +"L7. c #381B3C", +"M7. c #1F7C39", +"N7. c #00FF2C", +"O7. c #276539", +"P7. c #34273B", +"Q7. c #31293D", +"R7. c #30921C", +"S7. c #43B314", +"T7. c #405429", +"U7. c #295C2D", +"V7. c #325A33", +"W7. c #32253D", +"X7. c #325E2E", +"Y7. c #487C28", +"Z7. c #62840F", +"`7. c #3C4234", +" 8. c #2F313C", +".8. c #352938", +"+8. c #215F42", +"@8. c #08B856", +"#8. c #2A443D", +"$8. c #342C3A", +"%8. c #31333B", +"&8. c #342A38", +"*8. c #1B6A4B", +"=8. c #00CC51", +"-8. c #0EA541", +";8. c #332E3A", +">8. c #31343B", +",8. c #34343D", +"'8. c #7F7F83", +")8. c #C4C4C3", +"!8. c #B5B6B6", +"~8. c #403D48", +"{8. c #2A3635", +"]8. c #0CB82E", +"^8. c #13942F", +"/8. c #332B3A", +"(8. c #08CA33", +"_8. c #187831", +":8. c #C9C9C8", +"<8. c #6C5C72", +"[8. c #49B449", +"}8. c #27FF20", +"|8. c #29FC23", +"18. c #28FF22", +"28. c #29FE24", +"38. c #22FF1C", +"48. c #46F142", +"58. c #443F4D", +"68. c #2C3C46", +"78. c #31343D", +"88. c #322F37", +"98. c #36242A", +"08. c #1D5266", +"a8. c #0883A5", +"b8. c #1A586E", +"c8. c #342D35", +"d8. c #30363D", +"e8. c #303D3B", +"f8. c #216353", +"g8. c #0B9E73", +"h8. c #2B4F35", +"i8. c #13B29D", +"j8. c #01E4F5", +"k8. c #09E9FE", +"l8. c #1CC3BF", +"m8. c #285439", +"n8. c #275C47", +"o8. c #2B4C41", +"p8. c #2E403E", +"q8. c #22714D", +"r8. c #265F49", +"s8. c #295443", +"t8. c #2B4D42", +"u8. c #2D463F", +"v8. c #2D4540", +"w8. c #295350", +"x8. c #29514E", +"y8. c #30373C", +"z8. c #2E3E45", +"A8. c #294F57", +"B8. c #2B4850", +"C8. c #2B4956", +"D8. c #2C474E", +"E8. c #265665", +"F8. c #284862", +"G8. c #25596D", +"H8. c #2B4353", +"I8. c #245C6D", +"J8. c #197198", +"K8. c #12839C", +"L8. c #0D788D", +"M8. c #06D8DB", +"N8. c #17B8CF", +"O8. c #20507C", +"P8. c #1A5296", +"Q8. c #0B63D3", +"R8. c #0B62D2", +"S8. c #0753E0", +"T8. c #0A56D6", +"U8. c #015FFA", +"V8. c #0443EC", +"W8. c #033BEE", +"X8. c #003EFF", +"Y8. c #0137F8", +"Z8. c #0138F8", +"`8. c #0335F2", +" 9. c #0031FE", +".9. c #0033FB", +"+9. c #002FFD", +"@9. c #012DFA", +"#9. c #002AFD", +"$9. c #002CFC", +"%9. c #0031FB", +"&9. c #0134F8", +"*9. c #012EFA", +"=9. c #022EF5", +"-9. c #0133F9", +";9. c #0231F6", +">9. c #013AF9", +",9. c #0045FF", +"'9. c #0545E9", +")9. c #0640E4", +"!9. c #084ADE", +"~9. c #084EDE", +"{9. c #0A53D4", +"]9. c #0562E8", +"^9. c #0D68C9", +"/9. c #0D65CB", +"(9. c #1163B9", +"_9. c #0F77C0", +":9. c #1D618D", +"<9. c #166AA7", +"[9. c #1F6184", +"}9. c #1E6687", +"|9. c #274B5F", +"19. c #1775A0", +"29. c #24506A", +"39. c #265367", +"49. c #236260", +"59. c #275D63", +"69. c #1E5F4A", +"79. c #148560", +"89. c #323440", +"99. c #1C8741", +"09. c #1A784E", +"a9. c #2C464C", +"b9. c #2C424E", +"c9. c #266641", +"d9. c #169643", +"e9. c #246542", +"f9. c #29573E", +"g9. c #266242", +"h9. c #207941", +"i9. c #285A3F", +"j9. c #217641", +"k9. c #227040", +"l9. c #275C3F", +"m9. c #2B4D3D", +"n9. c #295941", +"o9. c #1D7738", +"p9. c #1B712E", +"q9. c #35283C", +"r9. c #33303C", +"s9. c #11982A", +"t9. c #1D702F", +"u9. c #35263D", +"v9. c #332B3E", +"w9. c #275626", +"x9. c #3A8E15", +"y9. c #39353A", +"z9. c #28622C", +"A9. c #315C34", +"B9. c #2F5E30", +"C9. c #5CA317", +"D9. c #536121", +"E9. c #2E2D3E", +"F9. c #342738", +"G9. c #17824A", +"H9. c #0CA853", +"I9. c #32303B", +"J9. c #118C52", +"K9. c #00CD4E", +"L9. c #129449", +"M9. c #31303B", +"N9. c #332D38", +"O9. c #282832", +"P9. c #757579", +"Q9. c #C2C2C1", +"R9. c #B8B7B8", +"S9. c #46494E", +"T9. c #302337", +"U9. c #1E7633", +"V9. c #342B3C", +"W9. c #0C9E2E", +"X9. c #0BC335", +"Y9. c #C8C8C7", +"Z9. c #BFBFC0", +"`9. c #CACEC9", +" 0. c #6D5C74", +".0. c #41B444", +"+0. c #16FF13", +"@0. c #19FC18", +"#0. c #18FF17", +"$0. c #1AFE18", +"%0. c #12FF0F", +"&0. c #3AF139", +"*0. c #46404E", +"=0. c #32343D", +"-0. c #352D35", +";0. c #1A6572", +">0. c #0D8393", +",0. c #2F3A43", +"'0. c #32333C", +")0. c #33353D", +"!0. c #106D8A", +"~0. c #0B7A9A", +"{0. c #2A3F4C", +"]0. c #2F463E", +"^0. c #32373B", +"/0. c #245A4F", +"(0. c #0C9B6F", +"_0. c #266944", +":0. c #246A4D", +"<0. c #07D7D6", +"[0. c #1DD2D3", +"}0. c #297054", +"|0. c #2B4B3D", +"10. c #22744A", +"20. c #295844", +"30. c #266648", +"40. c #285E45", +"50. c #2A5444", +"60. c #27604C", +"70. c #2D4740", +"80. c #303A40", +"90. c #2C4D44", +"00. c #285851", +"a0. c #26634D", +"b0. c #285B4D", +"c0. c #2C4A4B", +"d0. c #2D474B", +"e0. c #2B4E54", +"f0. c #28585D", +"g0. c #236676", +"h0. c #275767", +"i0. c #26506A", +"j0. c #1F768F", +"k0. c #06FEFC", +"l0. c #07C0C9", +"m0. c #0D7791", +"n0. c #1C628B", +"o0. c #0F86A7", +"p0. c #1C638C", +"q0. c #1F6589", +"r0. c #1F5887", +"s0. c #0E6DC6", +"t0. c #0C55CF", +"u0. c #0B56D2", +"v0. c #0954D9", +"w0. c #024DF7", +"x0. c #0156F9", +"y0. c #0048FB", +"z0. c #0041FC", +"A0. c #0341F2", +"B0. c #0241F6", +"C0. c #003BFC", +"D0. c #0033FF", +"E0. c #002DFB", +"F0. c #0031FC", +"G0. c #012FF9", +"H0. c #0126FB", +"I0. c #002CFE", +"J0. c #0131FA", +"K0. c #0532EB", +"L0. c #002AFB", +"M0. c #0035FF", +"N0. c #012EF8", +"O0. c #032CF3", +"P0. c #0137FA", +"Q0. c #003AFC", +"R0. c #053DEA", +"S0. c #003DFF", +"T0. c #004DFF", +"U0. c #004EFB", +"V0. c #0559EA", +"W0. c #084FDC", +"X0. c #065BE6", +"Y0. c #065FE4", +"Z0. c #0B5FD3", +"`0. c #1366B3", +" a. c #1278B9", +".a. c #0F7CC3", +"+a. c #1A609A", +"@a. c #1F5286", +"#a. c #19619E", +"$a. c #1A7599", +"%a. c #245D70", +"&a. c #265666", +"*a. c #255964", +"=a. c #25576B", +"-a. c #275C73", +";a. c #1B802B", +">a. c #03BF54", +",a. c #275368", +"'a. c #266635", +")a. c #17844D", +"!a. c #246456", +"~a. c #303A41", +"{a. c #26634B", +"]a. c #10AC47", +"^a. c #236843", +"/a. c #2C4D3D", +"(a. c #246B45", +"_a. c #295843", +":a. c #227441", +"b. c #2D4940", +",b. c #2E4540", +"'b. c #2A524D", +")b. c #303E3F", +"!b. c #2C4B45", +"~b. c #266251", +"{b. c #2D4649", +"]b. c #2A4F5B", +"^b. c #285961", +"/b. c #2B4E58", +"(b. c #2C4755", +"_b. c #236174", +":b. c #2C4459", +"c. c #3C4931", +",c. c #31960F", +"'c. c #2E5333", +")c. c #34293E", +"!c. c #27742A", +"~c. c #305837", +"{c. c #362F3B", +"]c. c #638F10", +"^c. c #516E26", +"/c. c #2E2A3F", +"(c. c #342E3B", +"_c. c #2B413D", +":c. c #1F6945", +"d. c #0039FC", +",d. c #0039FF", +"'d. c #0038FC", +")d. c #0034FE", +"!d. c #022FF3", +"~d. c #0230F5", +"{d. c #0237F7", +"]d. c #0432ED", +"^d. c #022BF7", +"/d. c #002FFF", +"(d. c #002EFF", +"_d. c #012FFA", +":d. c #0135F9", +"e. c #352F3D", +",e. c #33333D", +"'e. c #2C2C36", +")e. c #58585E", +"!e. c #C8CCC7", +"~e. c #35B53D", +"{e. c #00FF02", +"]e. c #01FC08", +"^e. c #00FF07", +"/e. c #01FE08", +"(e. c #26F12C", +"_e. c #47414F", +":e. c #33353F", +"f. c #1F5F89", +",f. c #1B6A96", +"'f. c #20597B", +")f. c #1D6B8C", +"!f. c #25606D", +"~f. c #28585E", +"{f. c #294D65", +"]f. c #285A5E", +"^f. c #265C53", +"/f. c #1C7942", +"(f. c #178870", +"_f. c #1F6C4A", +":f. c #10B979", +"g. c #058CA6", +",g. c #1A6C66", +"'g. c #1A8250", +")g. c #15855C", +"!g. c #2E4E3C", +"~g. c #286141", +"{g. c #2D4B3E", +"]g. c #276441", +"^g. c #256C42", +"/g. c #2E4941", +"(g. c #2A5940", +"_g. c #286142", +":g. c #286043", +"h. c #286247", +",h. c #217D4C", +"'h. c #295D45", +")h. c #2D4D41", +"!h. c #313C3E", +"~h. c #362D3D", +"{h. c #2B4B38", +"]h. c #197D2D", +"^h. c #34323D", +"/h. c #2F3E39", +"(h. c #0AAE25", +"_h. c #2A4F37", +":h. c #34343C", +"i. c #2F4056", +",i. c #285067", +"'i. c #225D80", +")i. c #1C6B94", +"!i. c #1A759A", +"~i. c #089DB7", +"{i. c #19679E", +"]i. c #176CAA", +"^i. c #1D5C92", +"/i. c #1B589A", +"(i. c #1A539E", +"_i. c #134FB5", +":i. c #0B4ED2", +"j. c #352F3C", +",j. c #178A59", +"'j. c #05C868", +")j. c #00FA63", +"!j. c #01FB5D", +"~j. c #1DA55B", +"{j. c #362C3D", +"]j. c #B3B3B5", +"^j. c #D2D2D1", +"/j. c #A1A1A4", +"(j. c #2D2D38", +"_j. c #1E7534", +":j. c #07C82C", +"k. c #0951DB", +",k. c #0E4FC8", +"'k. c #0A5FDA", +")k. c #066CE8", +"!k. c #1069C2", +"~k. c #185BA6", +"{k. c #1368B9", +"]k. c #1869A6", +"^k. c #186B9F", +"/k. c #147CAD", +"(k. c #1F698B", +"_k. c #226879", +":k. c #265B6E", +"l. c #0995A7", +",l. c #157584", +"'l. c #353139", +")l. c #33393F", +"!l. c #31413F", +"~l. c #323C3F", +"{l. c #30453F", +"]l. c #2D5040", +"^l. c #2D543B", +"/l. c #146C7C", +"(l. c #01A696", +"_l. c #188656", +":l. c #2F503C", +"m. c #28674D", +",m. c #217D52", +"'m. c #266A4C", +")m. c #24724E", +"!m. c #256F4D", +"~m. c #2D4F45", +"{m. c #323F41", +"]m. c #34373F", +"^m. c #382B40", +"/m. c #216A33", +"(m. c #372D40", +"_m. c #36323F", +":m. c #2D4739", +"n. c #24586C", +",n. c #187A88", +"'n. c #2E485C", +")n. c #196885", +"!n. c #12729A", +"~n. c #20618F", +"{n. c #1C6A98", +"]n. c #11A3D1", +"^n. c #11C8E0", +"/n. c #1357B8", +"(n. c #114BC0", +"_n. c #0D5CD0", +":n. c #0D50CF", +"o. c #52525A", +",o. c #D5D5D4", +"'o. c #79797E", +")o. c #373741", +"!o. c #34363F", +"~o. c #362E3F", +"{o. c #2D4F3F", +"]o. c #02FA4E", +"^o. c #10FF5C", +"/o. c #13F353", +"(o. c #01FF3C", +"_o. c #267A3F", +":o. c #37283F", +"p. c #0343F2", +",p. c #0846E2", +"'p. c #0FC8EB", +")p. c #0C4DD1", +"!p. c #075AE5", +"~p. c #0E59CC", +"{p. c #0C5BD2", +"]p. c #145AB7", +"^p. c #215787", +"/p. c #205A87", +"(p. c #1A64A0", +"_p. c #1D6195", +":p. c #20598C", +"q. c #01FC22", +",q. c #00FF21", +"'q. c #01FE23", +")q. c #00FF1B", +"!q. c #26F141", +"~q. c #382F38", +"{q. c #235763", +"]q. c #079BAF", +"^q. c #205D64", +"/q. c #363838", +"(q. c #314542", +"_q. c #333E3F", +":q. c #32423F", +"r. c #2B6055", +",r. c #1F7F51", +"'r. c #1D7F4B", +")r. c #2A6153", +"!r. c #286851", +"~r. c #2F4F48", +"{r. c #324345", +"]r. c #36323E", +"^r. c #353640", +"/r. c #36353F", +"(r. c #373140", +"_r. c #1A7E2F", +":r. c #2F463B", +"s. c #314352", +",s. c #343C47", +"'s. c #343945", +")s. c #2F585F", +"!s. c #0F9DA7", +"~s. c #1D6173", +"{s. c #353A46", +"]s. c #333C4C", +"^s. c #1E7070", +"/s. c #236367", +"(s. c #0B9BC0", +"_s. c #1283AF", +":s. c #1C6494", +"t. c #392C3D", +",t. c #09B857", +"'t. c #2F4240", +")t. c #373340", +"!t. c #343A41", +"~t. c #236C4F", +"{t. c #09B665", +"]t. c #323D42", +"^t. c #313E3D", +"/t. c #08BB45", +"(t. c #207241", +"_t. c #392C3F", +":t. c #383842", +"u. c #1B5A9E", +",u. c #224F85", +"'u. c #20598B", +")u. c #1E6A94", +"!u. c #1962A4", +"~u. c #245182", +"{u. c #245980", +"]u. c #206D85", +"^u. c #24716F", +"/u. c #2E5059", +"(u. c #2D545C", +"_u. c #2F5152", +":u. c #29655D", +"v. c #2C4E4A", +",v. c #373B3C", +"'v. c #2E5442", +")v. c #2D5F40", +"!v. c #0D8564", +"~v. c #1F6B54", +"{v. c #31503C", +"]v. c #2B643A", +"^v. c #255F4E", +"/v. c #0A7EA0", +"(v. c #13787A", +"_v. c #2F523B", +":v. c #286B40", +"w. c #31423C", +",w. c #1A7D2D", +"'w. c #3A2C44", +")w. c #353C3F", +"!w. c #335635", +"~w. c #2E8621", +"{w. c #16B41B", +"]w. c #257B29", +"^w. c #3E2A42", +"/w. c #332F45", +"(w. c #324F38", +"_w. c #3A8420", +":w. c #489913", +"x. c #246073", +",x. c #295573", +"'x. c #08A1BF", +")x. c #0DA9D1", +"!x. c #1E6798", +"~x. c #24587F", +"{x. c #25577C", +"]x. c #2A486D", +"^x. c #26507A", +"/x. c #225087", +"(x. c #1B74A9", +"_x. c #13D5DE", +":x. c #13E7E4", +"y. c #1E7440", +",y. c #09BC46", +"'y. c #AAAAAC", +")y. c #AFAFB1", +"!y. c #363940", +"~y. c #0BB22D", +"{y. c #46464E", +"]y. c #BBBBBA", +"^y. c #BEC2BE", +"/y. c #A08D9F", +"(y. c #3BBB59", +"_y. c #00FF32", +":y. c #01FC35", +"z. c #08B7AB", +",z. c #1D8B82", +"'z. c #256580", +")z. c #2B6063", +"!z. c #247278", +"~z. c #199399", +"{z. c #237D73", +"]z. c #218275", +"^z. c #2A6764", +"/z. c #237D6F", +"(z. c #1E8F79", +"_z. c #286C64", +":z. c #2D5F5B", +"A. c #1F6663", +",A. c #344B3B", +"'A. c #314B42", +")A. c #2C603F", +"!A. c #2E5740", +"~A. c #2C5F41", +"{A. c #315041", +"]A. c #363C43", +"^A. c #353E49", +"/A. c #373943", +"(A. c #2B4F5C", +"_A. c #167B88", +":A. c #353F4C", +"B. c #04EA7B", +",B. c #00FC76", +"'B. c #1DA268", +")B. c #3B2F40", +"!B. c #3B2E3E", +"~B. c #1F7B55", +"{B. c #0CB064", +"]B. c #323F42", +"^B. c #3C2D41", +"/B. c #236B41", +"(B. c #09BF46", +"_B. c #2F4A40", +":B. c #393342", +"C. c #24617F", +",C. c #237682", +"'C. c #227386", +")C. c #2D5263", +"!C. c #266F7D", +"~C. c #1E757E", +"{C. c #0D93A4", +"]C. c #227A86", +"^C. c #218082", +"/C. c #237979", +"(C. c #227681", +"_C. c #267576", +":C. c #237D78", +"D. c #393743", +",D. c #373F42", +"'D. c #393841", +")D. c #363D4B", +"!D. c #393744", +"~D. c #2A5662", +"{D. c #167E89", +"]D. c #393845", +"^D. c #147370", +"/D. c #304A4F", +"(D. c #363E51", +"_D. c #2E505E", +":D. c #314661", +"E. c #0BB859", +",E. c #21784D", +"'E. c #3C2F41", +")E. c #3A3340", +"!E. c #149C5F", +"~E. c #14995D", +"{E. c #393540", +"]E. c #3C3143", +"^E. c #256540", +"/E. c #08C246", +"(E. c #2D5141", +"_E. c #32323C", +":E. c #5A5A61", +"F. c #1F7D95", +",F. c #1A8B9B", +"'F. c #07A4AC", +")F. c #1D8894", +"!F. c #296175", +"~F. c #1D8297", +"{F. c #217F88", +"]F. c #286E6F", +"^F. c #267176", +"/F. c #2E5A60", +"(F. c #2B6965", +"_F. c #2C6466", +":F. c #324D51", +"G. c #343F55", +",G. c #2E4465", +"'G. c #2F4663", +")G. c #2C4C72", +"!G. c #22557F", +"~G. c #1B6389", +"{G. c #264C89", +"]G. c #1B5F93", +"^G. c #1C7A9F", +"/G. c #14DADF", +"(G. c #13EFE9", +"_G. c #17C6D2", +":G. c #1C73AB", +"H. c #295C41", +",H. c #08C347", +"'H. c #2C5943", +")H. c #3C3244", +"!H. c #3B3B46", +"~H. c #2E2E3A", +"{H. c #75757B", +"]H. c #5B5B63", +"^H. c #3A3A45", +"/H. c #9D9D9F", +"(H. c #B1B6B3", +"_H. c #C3B0BE", +":H. c #68E78D", +"I. c #178EB2", +",I. c #22778E", +"'I. c #1A80A6", +")I. c #1B83A3", +"!I. c #1F7898", +"~I. c #23728A", +"{I. c #0BB7C2", +"]I. c #0AD7E1", +"^I. c #296676", +"/I. c #2E5E66", +"(I. c #27747A", +"_I. c #267B7C", +":I. c #2E5E65", +"J. c #354151", +",J. c #363D52", +"'J. c #2E5053", +")J. c #128284", +"!J. c #2F466A", +"~J. c #2E4869", +"{J. c #334258", +"]J. c #334359", +"^J. c #2F4364", +"/J. c #284D7A", +"(J. c #2F4369", +"_J. c #1D5785", +":J. c #224E7B", +"K. c #3C3442", +",K. c #3B3544", +"'K. c #2C5541", +")K. c #286443", +"!K. c #3D3144", +"~K. c #393B44", +"{K. c #959599", +"]K. c #31313D", +"^K. c #6D6D73", +"/K. c #B0B4B2", +"(K. c #C2AFBC", +"_K. c #67E791", +":K. c #03FD54", +"L. c #1E7386", +",L. c #0B94A6", +"'L. c #2F5767", +")L. c #2E6068", +"!L. c #218B8D", +"~L. c #2A6C76", +"{L. c #2D626B", +"]L. c #27767C", +"^L. c #354B55", +"/L. c #354A52", +"(L. c #3E3042", +"_L. c #178F5A", +":L. c #237054", +"M. c #2F5469", +",M. c #10B9D8", +"'M. c #22748E", +")M. c #179DA9", +"!M. c #314A69", +"~M. c #323F5D", +"{M. c #304166", +"]M. c #264785", +"^M. c #2E3E6D", +"/M. c #2E3E6B", +"(M. c #2B4175", +"_M. c #243F8C", +":M. c #224393", +"N. c #256D42", +",N. c #3E3244", +"'N. c #3A3D44", +")N. c #B0B0B2", +"!N. c #C0AEBA", +"~N. c #67E694", +"{N. c #03FD5C", +"]N. c #00FF5A", +"^N. c #01FE5B", +"/N. c #26F26F", +"(N. c #4E4756", +"_N. c #374644", +":N. c #394044", +"O. c #325561", +",O. c #364752", +"'O. c #3E3344", +")O. c #2A614D", +"!O. c #0CAB66", +"~O. c #3D2E42", +"{O. c #1E9D6B", +"]O. c #04FF83", +"^O. c #374D4A", +"/O. c #3E3544", +"(O. c #21664F", +"_O. c #1D7454", +":O. c #403144", +"P. c #323D66", +",P. c #245677", +"'P. c #04BAD6", +")P. c #2A5080", +"!P. c #303867", +"~P. c #33415F", +"{P. c #373C53", +"]P. c #2F3F69", +"^P. c #304268", +"/P. c #213E95", +"(P. c #2B3D77", +"_P. c #293F7C", +":P. c #2A3C7B", +"Q. c #03FD63", +",Q. c #00FF61", +"'Q. c #01FE62", +")Q. c #26F275", +"!Q. c #4F4956", +"~Q. c #3C3A46", +"{Q. c #3A4145", +"]Q. c #384645", +"^Q. c #384744", +"/Q. c #364F43", +"(Q. c #335642", +"_Q. c #2E683F", +":Q. c #325A42", +"R. c #432842", +",R. c #236F46", +"'R. c #315246", +")R. c #3E3744", +"!R. c #2C544E", +"~R. c #187D5E", +"{R. c #3F3745", +"]R. c #334A47", +"^R. c #15804B", +"/R. c #354A4E", +"(R. c #0DA7A8", +"_R. c #2C5E64", +":R. c #37434E", +"S. c #314166", +",S. c #363B58", +"'S. c #313F68", +")S. c #2E406F", +"!S. c #2B3F77", +"~S. c #333E61", +"{S. c #2D3D73", +"]S. c #353F5C", +"^S. c #2E4170", +"/S. c #2B3E78", +"(S. c #2C3E75", +"_S. c #2A417B", +":S. c #303C69", +"T. c #03FD6A", +",T. c #00FF69", +"'T. c #01FE6A", +")T. c #26F27B", +"!T. c #3A4246", +"~T. c #3C3D46", +"{T. c #3D3B47", +"]T. c #306441", +"^T. c #325E41", +"/T. c #394744", +"(T. c #364F44", +"_T. c #374C44", +":T. c #325C42", +"U. c #3C3A47", +",U. c #3C4346", +"'U. c #2C842E", +")U. c #30663D", +"!U. c #188247", +"~U. c #335247", +"{U. c #3F3747", +"]U. c #24744A", +"^U. c #276548", +"/U. c #403546", +"(U. c #22734B", +"_U. c #364947", +":U. c #3F3444", +"V. c #3A424F", +",V. c #3C3D4A", +"'V. c #364151", +")V. c #1F6B84", +"!V. c #3F3943", +"~V. c #1D7889", +"{V. c #384450", +"]V. c #3E3B45", +"^V. c #3A454D", +"/V. c #08EEB6", +"(V. c #06E38F", +"_V. c #2D5E51", +":V. c #3F3645", +"W. c #363E5A", +",W. c #3B3D4C", +"'W. c #373D57", +")W. c #343F61", +"!W. c #334062", +"~W. c #363E5B", +"{W. c #373C58", +"]W. c #333F64", +"^W. c #303E67", +"/W. c #1A3182", +"(W. c #393D52", +"_W. c #324566", +":W. c #31436A", +"X. c #365544", +",X. c #326143", +"'X. c #365346", +")X. c #306643", +"!X. c #374F46", +"~X. c #355646", +"{X. c #3B4247", +"]X. c #3D3E48", +"^X. c #3D3E4A", +"/X. c #413840", +"(X. c #2B5164", +"_X. c #05A6C8", +":X. c #00C1EE", +"Y. c #AAAEAC", +",Y. c #BBA8B2", +"'Y. c #65E5A2", +")Y. c #00FF73", +"!Y. c #03FD79", +"~Y. c #00FF78", +"{Y. c #01FE79", +"]Y. c #00FF75", +"^Y. c #26F287", +"/Y. c #514A58", +"(Y. c #3E3D49", +"_Y. c #3C4348", +":Y. c #3B4748", +"Z. c #354D4B", +",Z. c #0BBB69", +"'Z. c #207E57", +")Z. c #413546", +"!Z. c #3D4048", +"~Z. c #413549", +"{Z. c #276D45", +"]Z. c #09C548", +"^Z. c #315847", +"/Z. c #616169", +"(Z. c #393945", +"_Z. c #505059", +":Z. c #A9ADAB", +"`. c #3A5147", +",`. c #287F3E", +"'`. c #0DB158", +")`. c #1B8E53", +"!`. c #403747", +"~`. c #1A935E", +"{`. c #0FAC64", +"]`. c #3A4048", +"^`. c #10AB46", +"/`. c #169C46", +"(`. c #40404B", +"_`. c #8B8B90", +":`. c #DBDBDA", +"<`. c #8B8B91", +"[`. c #3E3E4A", +"}`. c #42424D", +"|`. c #A1A1A2", +"1`. c #AFAFAE", +"2`. c #A8ADAB", +"3`. c #BAA7B0", +"4`. c #65E4A5", +"5`. c #00FF7B", +"6`. c #03FD80", +"7`. c #00FF7F", +"8`. c #01FE80", +"9`. c #00FF7D", +"0`. c #27F28D", +"a`. c #514B58", +"b`. c #3C4549", +"c`. c #3C4449", +"d`. c #3D4149", +"e`. c #375447", +"f`. c #3C4548", +"g`. c #394F48", +"h`. c #355B46", +"i`. c #355946", +"j`. c #306A44", +"k`. c #385247", +"l`. c #3A4B48", +"m`. c #3B4749", +"n`. c #3D4349", +"o`. c #3E3D4A", +"p`. c #3E4049", +"q`. c #3D414A", +"r`. c #3F4047", +"s`. c #374556", +"t`. c #166F94", +"u`. c #07D7DE", +"v`. c #04D5EC", +"w`. c #06F3FF", +"x`. c #346F77", +"y`. c #403440", +"z`. c #3E404C", +"A`. c #3F3E48", +"B`. c #213272", +"C`. c #3C3F4D", +"D`. c #3F3A45", +"E`. c #1D5A8C", +"F`. c #3B404F", +"G`. c #3F3D48", +"H`. c #413943", +"I`. c #315466", +"J`. c #226B83", +"K`. c #423842", +"L`. c #3F3C48", +"M`. c #374A57", +"N`. c #1F7788", +"O`. c #403B46", +"P`. c #3E3F4A", +"Q`. c #3E404B", +"R`. c #413541", +"S`. c #11CDD0", +"T`. c #00F5EB", +"U`. c #0BD2CC", +"V`. c #2098A5", +"W`. c #374C5B", +"X`. c #403A45", +"Y`. c #403A4B", +"Z`. c #344E43", +"``. c #0CBE8C", +" + c #01FFCC", +". + c #366564", +"+ + c #256D43", +"@ + c #2F5D4B", +"# + c #443345", +"$ + c #1C6F71", +"% + c #2A6268", +"& + c #453342", +"* + c #1E6C62", +"= + c #2C5E5B", +"- + c #413947", +"; + c #3A444F", +"> + c #0DA9A9", +", + c #296A70", +"' + c #394653", +") + c #0AA2B1", +"! + c #2E5B64", +"~ + c #423147", +"{ + c #3E6639", +"] + c #3D8226", +"^ + c #2B773A", +"/ + c #2F6C3F", +"( + c #41394B", +"_ + c #2C7E3D", +": + c #375344", +"< + c #40394B", +"[ + c #3E3F49", +"} + c #423548", +"| + c #27704F", +"1 + c #09C25C", +"2 + c #33534B", +"3 + c #443247", +"4 + c #2C6552", +"5 + c #08C16A", +"6 + c #2B6350", +"7 + c #413748", +"8 + c #41364A", +"9 + c #2B6546", +"0 + c #08C648", +"a + c #2D6046", +"b + c #42384A", +"c + c #B9B9BB", +"d + c #5D5D66", +"e + c #40404A", +"f + c #A8ACAA", +"g + c #B9A6AF", +"h + c #65E4A7", +"i + c #00FF80", +"j + c #03FD84", +"k + c #00FF84", +"l + c #01FE84", +"m + c #00FF81", +"n + c #27F291", +"o + c #3F3E4A", +"p + c #3D4449", +"q + c #3B4A49", +"r + c #3B4949", +"s + c #3A4D48", +"t + c #3C4748", +"u + c #3B4849", +"v + c #345E45", +"w + c #3B4B48", +"x + c #385148", +"y + c #385349", +"z + c #3B484A", +"A + c #3F3D49", +"B + c #38524A", +"C + c #3C474B", +"D + c #403D47", +"E + c #374958", +"F + c #1B6385", +"G + c #20919E", +"H + c #0BEEFC", +"I + c #2EB0B6", +"J + c #403E49", +"K + c #3F3F48", +"L + c #3C3D4C", +"M + c #1A3283", +"N + c #384355", +"O + c #1B5887", +"P + c #3F3E49", +"Q + c #3E3F4B", +"R + c #423C44", +"S + c #215884", +"T + c #34475E", +"U + c #413D45", +"V + c #3B4451", +"W + c #403C47", +"X + c #3C434E", +"Y + c #1D7C8C", +"Z + c #3D434E", +"` + c #3E414B", +" .+ c #423541", +"..+ c #239092", +"+.+ c #06D9D2", +"@.+ c #0AF2F2", +"#.+ c #0FB0D6", +"$.+ c #403E47", +"%.+ c #3B454A", +"&.+ c #1B8856", +"*.+ c #1C9065", +"=.+ c #384F53", +"-.+ c #2F5E47", +";.+ c #25734A", +">.+ c #473044", +",.+ c #22646A", +"'.+ c #2D5961", +").+ c #463341", +"!.+ c #226562", +"~.+ c #2D5C5C", +"{.+ c #423946", +"].+ c #3D414C", +"^.+ c #423642", +"/.+ c #1E8286", +"(.+ c #149596", +"_.+ c #452834", +":.+ c #198591", +"<.+ c #198094", +"[.+ c #414A3F", +"}.+ c #3F8724", +"|.+ c #327935", +"1.+ c #2B783A", +"2.+ c #413D4B", +"3.+ c #34703F", +"4.+ c #316B3E", +"5.+ c #10B059", +"6.+ c #1B9254", +"7.+ c #3B4349", +"8.+ c #0FAF66", +"9.+ c #19925D", +"0.+ c #413847", +"a.+ c #3E404A", +"b.+ c #3E3A48", +"c.+ c #13A446", +"d.+ c #14A648", +"e.+ c #403C4A", +"f.+ c #383844", +"g.+ c #5E5E67", +"h.+ c #D0D0D1", +"i.+ c #CFCFD0", +"j.+ c #41414C", +"k.+ c #363643", +"l.+ c #A7ABA9", +"m.+ c #B8A5AE", +"n.+ c #64E4A8", +"o.+ c #00FF83", +"p.+ c #03FD88", +"q.+ c #00FF87", +"r.+ c #01FE87", +"s.+ c #00FF85", +"t.+ c #27F293", +"u.+ c #514B59", +"v.+ c #3D444A", +"w.+ c #394F49", +"x.+ c #3D4249", +"y.+ c #375448", +"z.+ c #385348", +"A.+ c #3A4C49", +"B.+ c #326446", +"C.+ c #394E48", +"D.+ c #385248", +"E.+ c #306A47", +"F.+ c #365848", +"G.+ c #375449", +"H.+ c #3C474A", +"I.+ c #3C454A", +"J.+ c #3A4C4A", +"K.+ c #37544B", +"L.+ c #413A47", +"M.+ c #374857", +"N.+ c #186B8C", +"O.+ c #403845", +"P.+ c #3D4350", +"Q.+ c #3F3945", +"R.+ c #3F3C47", +"S.+ c #3E3F4C", +"T.+ c #423C3E", +"U.+ c #234F9B", +"V.+ c #3A3F59", +"W.+ c #403E46", +"X.+ c #413D46", +"Y.+ c #34465C", +"Z.+ c #1F5480", +"`.+ c #433B42", +" ++ c #285276", +".++ c #2A5072", +"+++ c #423B42", +"@++ c #433841", +"#++ c #25687E", +"$++ c #2D5A6D", +"%++ c #423943", +"&++ c #206E80", +"*++ c #394451", +"=++ c #3E3944", +"-++ c #128A85", +";++ c #00EFF8", +">++ c #02B4E0", +",++ c #19B7D5", +"'++ c #40444E", +")++ c #403A49", +"!++ c #217952", +"~++ c #267357", +"{++ c #27725C", +"]++ c #3B4547", +"^++ c #1B844A", +"/++ c #443443", +"(++ c #1C777F", +"_++ c #1C7F88", +":++ c #463442", +"<++ c #206665", +"[++ c #286464", +"}++ c #413844", +"|++ c #325861", +"1++ c #03D4D3", +"2++ c #209A9E", +"3++ c #256F7D", +"4++ c #1098A2", +"5++ c #437D1B", +"6++ c #3C7927", +"7++ c #297F38", +"8++ c #3E4648", +"9++ c #3F3C4A", +"0++ c #3F394B", +"a++ c #3B5844", +"b++ c #307C38", +"c++ c #423649", +"d++ c #28704F", +"e++ c #34544B", +"f++ c #443147", +"g++ c #20845A", +"h++ c #0AB968", +"i++ c #364C4B", +"j++ c #413B49", +"k++ c #2C6045", +"l++ c #07C647", +"m++ c #2C6A48", +"n++ c #372C40", +"o++ c #84868A", +"p++ c #95959A", +"q++ c #353541", +"r++ c #3F3F4B", +"s++ c #606068", +"t++ c #B0B0AF", +"u++ c #A6ABA9", +"v++ c #B8A5AD", +"w++ c #64E4A9", +"x++ c #00FF86", +"y++ c #03FD8B", +"z++ c #00FF8A", +"A++ c #01FE8A", +"B++ c #00FF88", +"C++ c #27F296", +"D++ c #524C59", +"E++ c #403E4B", +"F++ c #3C484A", +"G++ c #3F404A", +"H++ c #3F404B", +"I++ c #3D474A", +"J++ c #3A5048", +"K++ c #3B4C49", +"L++ c #395249", +"M++ c #3A5049", +"N++ c #3F414A", +"O++ c #3B4D49", +"P++ c #3A504A", +"Q++ c #385549", +"R++ c #3C4A4A", +"S++ c #37574A", +"T++ c #3D464A", +"U++ c #3B4B4C", +"V++ c #403E48", +"W++ c #394856", +"X++ c #147393", +"Y++ c #413D47", +"Z++ c #3F404C", +"`++ c #3E3F4D", +" @+ c #443F40", +".@+ c #234593", +"+@+ c #0546E0", +"@@+ c #39476A", +"#@+ c #413E44", +"$@+ c #433D45", +"%@+ c #2F4A66", +"&@+ c #423D45", +"*@+ c #324A64", +"=@+ c #235782", +"-@+ c #433D44", +";@+ c #413C46", +">@+ c #364E5E", +",@+ c #21718A", +"'@+ c #423843", +")@+ c #17AEB7", +"!@+ c #26858F", +"~@+ c #433541", +"{@+ c #3E414D", +"]@+ c #3B4852", +"^@+ c #147C7D", +"/@+ c #1C859E", +"(@+ c #0797C9", +"_@+ c #2B5F76", +":@+ c #433942", +"<@+ c #433749", +"[@+ c #296D52", +"}@+ c #287154", +"|@+ c #228061", +"1@+ c #3C474E", +"2@+ c #1F7E43", +"3@+ c #346160", +"4@+ c #07E1E6", +"5@+ c #04E9ED", +"6@+ c #3D5460", +"7@+ c #255D5E", +"8@+ c #236E6E", +"9@+ c #433A46", +"0@+ c #3E434E", +"a@+ c #43333F", +"b@+ c #278A91", +"c@+ c #07FFFF", +"d@+ c #06E0E4", +"e@+ c #26AA6D", +"f@+ c #27B671", +"g@+ c #298849", +"h@+ c #3D4B3D", +"i@+ c #403C4E", +"j@+ c #3F3D4B", +"k@+ c #40464A", +"l@+ c #338136", +"m@+ c #3C4F45", +"n@+ c #403C4C", +"o@+ c #403F4B", +"p@+ c #11B059", +"q@+ c #1B9455", +"r@+ c #453248", +"s@+ c #33584F", +"t@+ c #0AC06A", +"u@+ c #247756", +"v@+ c #433849", +"w@+ c #403949", +"x@+ c #179D47", +"y@+ c #12AF48", +"z@+ c #B2B1B5", +"A@+ c #D8D9D8", +"B@+ c #66666E", +"C@+ c #4E4E58", +"D@+ c #A6AAA8", +"E@+ c #B7A4AC", +"F@+ c #64E3AB", +"G@+ c #00FF8B", +"H@+ c #03FD8E", +"I@+ c #00FF8E", +"J@+ c #01FE8E", +"K@+ c #00FF8C", +"L@+ c #27F299", +"M@+ c #403F4A", +"N@+ c #3E444B", +"O@+ c #3C4B4A", +"P@+ c #385749", +"Q@+ c #3D484A", +"R@+ c #38564A", +"S@+ c #355F49", +"T@+ c #346348", +"U@+ c #3A4F4A", +"V@+ c #39544B", +"W@+ c #39534A", +"X@+ c #3D484B", +"Y@+ c #3E444C", +"Z@+ c #3F4448", +"`@+ c #394A55", +" #+ c #127795", +".#+ c #394753", +"+#+ c #413E49", +"@#+ c #414048", +"##+ c #3C3E51", +"$#+ c #1B3387", +"%#+ c #403D45", +"&#+ c #2B4F6F", +"*#+ c #255177", +"=#+ c #443D44", +"-#+ c #413F48", +";#+ c #3B4454", +">#+ c #1E5A8A", +",#+ c #1E748D", +"'#+ c #394A58", +")#+ c #433842", +"!#+ c #0BD6DC", +"~#+ c #17B8C1", +"{#+ c #443540", +"]#+ c #3F424D", +"^#+ c #3F414B", +"/#+ c #15787F", +"(#+ c #39474C", +"_#+ c #235E80", +":#+ c #1A688D", +"<#+ c #433C44", +"[#+ c #423A4A", +"}#+ c #33584E", +"|#+ c #247752", +"1#+ c #28745C", +"2#+ c #315F58", +"3#+ c #2A6E43", +"4#+ c #22735C", +"5#+ c #07CDD8", +"6#+ c #20BCC0", +"7#+ c #443D48", +"8#+ c #2B585E", +"9#+ c #246A6D", +"0#+ c #3E444E", +"a#+ c #44313D", +"b#+ c #1F9FA5", +"c#+ c #0ADCDC", +"d#+ c #0AF6F1", +"e#+ c #0EF5E4", +"f#+ c #05EDED", +"g#+ c #375763", +"h#+ c #413B45", +"i#+ c #3F414C", +"j#+ c #413B4D", +"k#+ c #397538", +"l#+ c #38643D", +"m#+ c #41394D", +"n#+ c #29704F", +"o#+ c #0AC35C", +"p#+ c #35544C", +"q#+ c #423748", +"r#+ c #16A162", +"s#+ c #12A562", +"t#+ c #433A4B", +"u#+ c #335A48", +"v#+ c #04C043", +"w#+ c #408B5D", +"x#+ c #D7CBD4", +"y#+ c #D1D4D2", +"z#+ c #D2D1D2", +"A#+ c #C6C6C7", +"B#+ c #474752", +"C#+ c #40404C", +"D#+ c #41414D", +"E#+ c #9B9B9D", +"F#+ c #ACACAB", +"G#+ c #A5A9A7", +"H#+ c #B6A3AB", +"I#+ c #64E3AD", +"J#+ c #00FF8F", +"K#+ c #03FD92", +"L#+ c #00FF92", +"M#+ c #01FE92", +"N#+ c #27F29C", +"O#+ c #524C5A", +"P#+ c #3E454B", +"Q#+ c #3B4C4B", +"R#+ c #3D474B", +"S#+ c #3A514A", +"T#+ c #3C494B", +"U#+ c #3B4D4B", +"V#+ c #34624A", +"W#+ c #38554A", +"X#+ c #365D4A", +"Y#+ c #413C49", +"Z#+ c #3A4656", +"`#+ c #127994", +" $+ c #384C54", +".$+ c #413D49", +"+$+ c #1751A7", +"@$+ c #334469", +"#$+ c #423E45", +"$$+ c #3F404D", +"%$+ c #3E404D", +"&$+ c #443B43", +"*$+ c #274770", +"=$+ c #294B6E", +"-$+ c #443D45", +";$+ c #423B46", +">$+ c #1F5E89", +",$+ c #38485A", +"'$+ c #3F414D", +")$+ c #433943", +"!$+ c #2A6075", +"~$+ c #28657A", +"{$+ c #47333D", +"]$+ c #2C6270", +"^$+ c #227585", +"/$+ c #433944", +"($+ c #167380", +"_$+ c #31555F", +":$+ c #30516A", +"<$+ c #0E79A7", +"[$+ c #3C424F", +"}$+ c #3D424B", +"|$+ c #1D8555", +"1$+ c #335B53", +"2$+ c #247B61", +"3$+ c #335E47", +"4$+ c #089968", +"5$+ c #33495D", +"6$+ c #433742", +"7$+ c #433945", +"8$+ c #2A5B64", +"9$+ c #25686E", +"0$+ c #433B47", +"a$+ c #423844", +"b$+ c #336B71", +"c$+ c #01ECEF", +"d$+ c #03D7D7", +"e$+ c #23CFAE", +"f$+ c #09FDF9", +"g$+ c #11E8EB", +"h$+ c #01FFFF", +"i$+ c #27969C", +"j$+ c #44313E", +"k$+ c #40394E", +"l$+ c #3E6140", +"m$+ c #377834", +"n$+ c #403E4D", +"o$+ c #403F4C", +"p$+ c #1B9556", +"q$+ c #462F48", +"r$+ c #297156", +"s$+ c #09C16A", +"t$+ c #305C50", +"u$+ c #42394B", +"v$+ c #159242", +"w$+ c #26CC5D", +"x$+ c #C5CEC8", +"y$+ c #D6D3D5", +"z$+ c #9F9FA3", +"A$+ c #A3A8A6", +"B$+ c #B5A3AA", +"C$+ c #64E3AE", +"D$+ c #00FF93", +"E$+ c #03FD96", +"F$+ c #00FF95", +"G$+ c #01FE95", +"H$+ c #27F29F", +"I$+ c #534D5A", +"J$+ c #413F4B", +"K$+ c #3E464C", +"L$+ c #40424B", +"M$+ c #40414B", +"N$+ c #3F434B", +"O$+ c #3D494B", +"P$+ c #3F424B", +"Q$+ c #3F444B", +"R$+ c #423C4C", +"S$+ c #3C4C4B", +"T$+ c #3B514B", +"U$+ c #3A524A", +"V$+ c #3E474B", +"W$+ c #3E484C", +"X$+ c #39554B", +"Y$+ c #3F444C", +"Z$+ c #39544C", +"`$+ c #413F4C", +" %+ c #3F424C", +".%+ c #3E4A4A", +"+%+ c #375257", +"@%+ c #127C94", +"#%+ c #3B4653", +"$%+ c #423F49", +"%%+ c #40414C", +"&%+ c #40414D", +"*%+ c #364F6A", +"=%+ c #0081FF", +"-%+ c #1162D7", +";%+ c #42414A", +">%+ c #41434A", +",%+ c #169BB8", +"'%+ c #24698F", +")%+ c #413F4A", +"!%+ c #3F434D", +"~%+ c #0ACCE9", +"{%+ c #1E89B1", +"]%+ c #443840", +"^%+ c #3F424E", +"/%+ c #423E48", +"(%+ c #3A4A58", +"_%+ c #1E758F", +":%+ c #433C47", +"<%+ c #3C4551", +"[%+ c #1C7D8D", +"}%+ c #423F4A", +"|%+ c #177081", +"1%+ c #305360", +"2%+ c #3E4250", +"3%+ c #0D7AA9", +"4%+ c #315065", +"5%+ c #433D46", +"6%+ c #40424C", +"7%+ c #44394A", +"8%+ c #208055", +"9%+ c #34574E", +"0%+ c #28795F", +"a%+ c #14856E", +"b%+ c #148C4F", +"c%+ c #453847", +"d%+ c #3F434E", +"e%+ c #443B48", +"f%+ c #2C535E", +"g%+ c #236770", +"h%+ c #443848", +"i%+ c #3F3D4E", +"j%+ c #403D4F", +"k%+ c #3E2D49", +"l%+ c #355E61", +"m%+ c #31B158", +"n%+ c #3A9736", +"o%+ c #05F0E6", +"p%+ c #00DDE7", +"q%+ c #0DDCDF", +"r%+ c #3A6E77", +"s%+ c #413843", +"t%+ c #403F4E", +"u%+ c #414C48", +"v%+ c #3A822E", +"w%+ c #3F4947", +"x%+ c #413D4D", +"y%+ c #44384B", +"z%+ c #2A7050", +"A%+ c #0AC35D", +"B%+ c #38524D", +"C%+ c #3C464C", +"D%+ c #0DB868", +"E%+ c #1D8B5B", +"F%+ c #43394A", +"G%+ c #443C4D", +"H%+ c #335346", +"I%+ c #19D356", +"J%+ c #7CD398", +"K%+ c #DED2DA", +"L%+ c #D0D3D1", +"M%+ c #3A3A46", +"N%+ c #AEAEAD", +"O%+ c #A2A7A5", +"P%+ c #B5A2A9", +"Q%+ c #63E3B0", +"R%+ c #00FF97", +"S%+ c #03FD9A", +"T%+ c #00FF99", +"U%+ c #01FE99", +"V%+ c #00FF98", +"W%+ c #27F2A2", +"X%+ c #3E474C", +"Y%+ c #3C4E4C", +"Z%+ c #39574A", +"`%+ c #3E484B", +" &+ c #3D4C4C", +".&+ c #3C4D4C", +"+&+ c #3D4B4C", +"@&+ c #3B524B", +"#&+ c #3A554C", +"$&+ c #3E484D", +"%&+ c #3F444D", +"&&+ c #414049", +"*&+ c #375558", +"=&+ c #127E93", +"-&+ c #3B4754", +";&+ c #3D4659", +">&+ c #0C4DBE", +",&+ c #284F90", +"'&+ c #444248", +")&+ c #40404D", +"!&+ c #423C48", +"~&+ c #3C515A", +"{&+ c #00C3F5", +"]&+ c #1791C6", +"^&+ c #443F46", +"/&+ c #197CAA", +"(&+ c #206A96", +"_&+ c #453C43", +":&+ c #40414E", +"<&+ c #40424D", +"[&+ c #433B45", +"}&+ c #1F718A", +"|&+ c #355464", +"1&+ c #443B45", +"2&+ c #38505D", +"3&+ c #433D48", +"4&+ c #443D47", +"5&+ c #1E6479", +"6&+ c #256073", +"7&+ c #473942", +"8&+ c #16719A", +"9&+ c #206485", +"0&+ c #443C45", +"a&+ c #45384B", +"b&+ c #2A6B53", +"c&+ c #2B7051", +"d&+ c #246A66", +"e&+ c #138073", +"f&+ c #1C9858", +"g&+ c #365A52", +"h&+ c #423F4D", +"i&+ c #434146", +"j&+ c #276F78", +"k&+ c #138F9B", +"l&+ c #414F48", +"m&+ c #435144", +"n&+ c #3E5342", +"o&+ c #667E34", +"p&+ c #A7D007", +"q&+ c #3FB232", +"r&+ c #2C8F37", +"s&+ c #36685F", +"t&+ c #09B2C2", +"u&+ c #1E8B97", +"v&+ c #453641", +"w&+ c #423E4E", +"x&+ c #3E7C30", +"y&+ c #3E5E3E", +"z&+ c #413C4F", +"A&+ c #41404C", +"B&+ c #11B05A", +"C&+ c #1A9755", +"D&+ c #1C925E", +"E&+ c #0EB466", +"F&+ c #3B494C", +"G&+ c #423E4C", +"H&+ c #594D5F", +"I&+ c #5CCC81", +"J&+ c #2DDB66", +"K&+ c #BACAC0", +"L&+ c #D8D4D7", +"M&+ c #D1D2D1", +"N&+ c #CDCDCE", +"O&+ c #50505A", +"P&+ c #42424E", +"Q&+ c #B3A0A8", +"R&+ c #63E3B2", +"S&+ c #00FF9B", +"T&+ c #03FD9D", +"U&+ c #00FF9D", +"V&+ c #01FE9D", +"W&+ c #00FF9C", +"X&+ c #27F2A5", +"Y&+ c #534D5B", +"Z&+ c #41404D", +"`&+ c #3E494C", +" *+ c #3B504C", +".*+ c #375C4B", +"+*+ c #39574C", +"@*+ c #3C4C4C", +"#*+ c #3C4F4C", +"$*+ c #3F464D", +"%*+ c #3C4D4D", +"&*+ c #3A534F", +"**+ c #3D494D", +"=*+ c #3E474E", +"-*+ c #41404A", +";*+ c #3B4957", +">*+ c #127F93", +",*+ c #423F4B", +"'*+ c #3F414F", +")*+ c #463E40", +"!*+ c #294679", +"~*+ c #224B8B", +"{*+ c #433E49", +"]*+ c #2C5579", +"^*+ c #1A6597", +"/*+ c #423C47", +"(*+ c #40424E", +"_*+ c #433E48", +":*+ c #3C3E50", +"<*+ c #1E5887", +"[*+ c #42404B", +"}*+ c #443B46", +"|*+ c #2F5B6E", +"1*+ c #25647D", +"2*+ c #4B2C36", +"3*+ c #247080", +"4*+ c #2C6372", +"5*+ c #443A45", +"6*+ c #3F424F", +"7*+ c #1F6079", +"8*+ c #255C71", +"9*+ c #493840", +"0*+ c #255F7E", +"a*+ c #12749F", +"b*+ c #423E4D", +"c*+ c #394D4C", +"d*+ c #15925E", +"e*+ c #16736D", +"f*+ c #1A976A", +"g*+ c #03FA8E", +"h*+ c #0FC55D", +"i*+ c #287A3D", +"j*+ c #2D8242", +"k*+ c #0BDED8", +"l*+ c #01EEFA", +"m*+ c #2EA06E", +"n*+ c #467323", +"o*+ c #3E7630", +"p*+ c #6C9724", +"q*+ c #B9FC06", +"r*+ c #3CB833", +"s*+ c #1D8D75", +"t*+ c #483143", +"u*+ c #1F7A86", +"v*+ c #158B99", +"w*+ c #413A50", +"x*+ c #416839", +"y*+ c #3F7531", +"z*+ c #413B4F", +"A*+ c #44384C", +"B*+ c #2A7051", +"C*+ c #08C55C", +"D*+ c #35514B", +"E*+ c #335C52", +"F*+ c #08C46B", +"G*+ c #296F55", +"H*+ c #44394B", +"I*+ c #43434F", +"J*+ c #343642", +"K*+ c #857F8A", +"L*+ c #BCD5C3", +"M*+ c #21D75C", +"N*+ c #6CD08C", +"O*+ c #DED3DB", +"P*+ c #A9A9AC", +"Q*+ c #393946", +"R*+ c #43434E", +"S*+ c #B19EA6", +"T*+ c #63E2B3", +"U*+ c #00FF9F", +"V*+ c #03FDA1", +"W*+ c #00FFA0", +"X*+ c #01FEA1", +"Y*+ c #27F2A8", +"Z*+ c #544E5B", +"`*+ c #41424C", +" =+ c #40454D", +".=+ c #41434C", +"+=+ c #3F484D", +"@=+ c #42404D", +"#=+ c #3A574C", +"$=+ c #3E4C4C", +"%=+ c #3E4C4D", +"&=+ c #40444D", +"*=+ c #3B544C", +"==+ c #3C514C", +"-=+ c #3A554D", +";=+ c #3F494D", +">=+ c #3E4B4D", +",=+ c #3C514D", +"'=+ c #3B534F", +")=+ c #3D4952", +"!=+ c #167B8C", +"~=+ c #3B4A56", +"{=+ c #433F4A", +"]=+ c #41424D", +"^=+ c #42404C", +"/=+ c #41424E", +"(=+ c #433E46", +"_=+ c #177ECB", +":=+ c #007AFF", +"<=+ c #2E4D86", +"[=+ c #453F42", +"}=+ c #40424F", +"|=+ c #473B40", +"1=+ c #25567D", +"2=+ c #285F7C", +"3=+ c #473D43", +"4=+ c #42414C", +"5=+ c #1C5D8D", +"6=+ c #3B4658", +"7=+ c #43404A", +"8=+ c #3E4450", +"9=+ c #13AEBE", +"0=+ c #37636D", +"a=+ c #335663", +"b=+ c #217887", +"c=+ c #453B45", +"d=+ c #40434F", +"e=+ c #463D46", +"f=+ c #1E6882", +"g=+ c #1F627C", +"h=+ c #354F62", +"i=+ c #0C7CAC", +"j=+ c #364B5D", +"k=+ c #443F49", +"l=+ c #3F444E", +"m=+ c #07A365", +"n=+ c #365254", +"o=+ c #267D5E", +"p=+ c #11C46A", +"q=+ c #327759", +"r=+ c #413F45", +"s=+ c #374E56", +"t=+ c #06C1C8", +"u=+ c #1BD1D5", +"v=+ c #3F4D5D", +"w=+ c #41384B", +"x=+ c #403D50", +"y=+ c #3E3656", +"z=+ c #46801F", +"A=+ c #2A9555", +"B=+ c #0EA4AE", +"C=+ c #41434B", +"D=+ c #296C78", +"E=+ c #0F9CA8", +"F=+ c #3E4053", +"G=+ c #455342", +"H=+ c #418228", +"I=+ c #42464A", +"J=+ c #42414D", +"K=+ c #199755", +"L=+ c #12AD65", +"M=+ c #159F60", +"N=+ c #A4A7A9", +"O=+ c #E5DAE0", +"P=+ c #65CB86", +"Q=+ c #29DD63", +"R=+ c #B5CDBD", +"S=+ c #DBD5D9", +"T=+ c #D2D3D2", +"U=+ c #818188", +"V=+ c #44444F", +"W=+ c #4C4C57", +"X=+ c #9EA2A1", +"Y=+ c #B3A0A7", +"Z=+ c #62E2B5", +"`=+ c #03FDA5", +" -+ c #00FFA4", +".-+ c #01FEA4", +"+-+ c #27F2AB", +"@-+ c #554E5C", +"#-+ c #41434D", +"$-+ c #3D4E4D", +"%-+ c #3D4D4E", +"&-+ c #3F494E", +"*-+ c #3D4F4E", +"=-+ c #3A564E", +"--+ c #3C514E", +";-+ c #3B534E", +">-+ c #395B4F", +",-+ c #41444E", +"'-+ c #3D5050", +")-+ c #3D4E4F", +"!-+ c #3E4B4F", +"~-+ c #197987", +"{-+ c #3A4C58", +"]-+ c #42434C", +"^-+ c #40464F", +"/-+ c #41414E", +"(-+ c #44434A", +"_-+ c #145CB6", +":-+ c #0666E5", +"<-+ c #365885", +"[-+ c #443D43", +"}-+ c #414250", +"|-+ c #414450", +"1-+ c #453745", +"2-+ c #31777E", +"3-+ c #20779D", +"4-+ c #443B44", +"5-+ c #365F6D", +"6-+ c #404551", +"7-+ c #463F46", +"8-+ c #235780", +"9-+ c #2E506F", +"0-+ c #453F47", +"a-+ c #41424F", +"b-+ c #41454F", +"c-+ c #05E4F0", +"d-+ c #219AAB", +"e-+ c #1A8494", +"f-+ c #423E4B", +"g-+ c #404F58", +"h-+ c #0BBECA", +"i-+ c #01ABD9", +"j-+ c #395C6E", +"k-+ c #1178A4", +"l-+ c #275D7A", +"m-+ c #453D47", +"n-+ c #45404C", +"o-+ c #216861", +"p-+ c #0E9762", +"q-+ c #385A4F", +"r-+ c #355A56", +"s-+ c #26775E", +"t-+ c #4A2F47", +"u-+ c #404752", +"v-+ c #127B81", +"w-+ c #2B5A64", +"x-+ c #473744", +"y-+ c #42404A", +"z-+ c #43474C", +"A-+ c #433D51", +"B-+ c #3F6338", +"C-+ c #3D6D24", +"D-+ c #335A68", +"E-+ c #0AB0AF", +"F-+ c #38545D", +"G-+ c #345764", +"H-+ c #0AA1B1", +"I-+ c #38585F", +"J-+ c #487D24", +"K-+ c #425841", +"L-+ c #423D50", +"M-+ c #42434D", +"N-+ c #45394D", +"O-+ c #08C65D", +"P-+ c #36524B", +"Q-+ c #287759", +"R-+ c #09C069", +"S-+ c #355750", +"T-+ c #453D4D", +"U-+ c #C9CACA", +"V-+ c #DCD8DA", +"W-+ c #BDCDC2", +"X-+ c #2BDA64", +"Y-+ c #5DCE82", +"Z-+ c #DBD1D7", +"`-+ c #D2D4D2", +" ;+ c #575761", +".;+ c #3B3B48", +"+;+ c #7D8184", +"@;+ c #B8A5AB", +"#;+ c #61E0B5", +"$;+ c #00FFA7", +"%;+ c #03FDA8", +"&;+ c #01FEA8", +"*;+ c #26F1AD", +"=;+ c #3E4A4E", +"-;+ c #3F474E", +";;+ c #3E4C4E", +">;+ c #40474E", +",;+ c #40464E", +"';+ c #3F484E", +");+ c #395950", +"!;+ c #40454F", +"~;+ c #197B87", +"{;+ c #433F4B", +"];+ c #41414F", +"^;+ c #464348", +"/;+ c #243E78", +"(;+ c #224685", +"_;+ c #474245", +":;+ c #40414F", +"<;+ c #453844", +"[;+ c #2F7381", +"};+ c #05CFF7", +"|;+ c #1477AA", +"1;+ c #1789A7", +"2;+ c #02E6FF", +"3;+ c #188DBF", +"4;+ c #453C46", +"5;+ c #454049", +"6;+ c #2E4F6D", +"7;+ c #225984", +"8;+ c #463E46", +"9;+ c #443E49", +"0;+ c #2E6072", +"a;+ c #217189", +"b;+ c #463A45", +"c;+ c #1B8292", +"d;+ c #38515E", +"e;+ c #463B46", +"f;+ c #3B4A57", +"g;+ c #01CFE9", +"h;+ c #10D7F5", +"i;+ c #3C5B6A", +"j;+ c #463841", +"k;+ c #1D6B8F", +"l;+ c #177098", +"m;+ c #424049", +"n;+ c #463C4C", +"o;+ c #28635A", +"p;+ c #20695E", +"q;+ c #315F4E", +"r;+ c #257550", +"s;+ c #49334C", +"t;+ c #1D8D65", +"u;+ c #3E4952", +"v;+ c #1C6D76", +"w;+ c #226670", +"x;+ c #414150", +"y;+ c #403F50", +"z;+ c #3C3454", +"A;+ c #404E44", +"B;+ c #3D7E20", +"C;+ c #444748", +"D;+ c #3C4856", +"E;+ c #0DACAA", +"F;+ c #2C6B72", +"G;+ c #3F4651", +"H;+ c #0B9BB3", +"I;+ c #328F56", +"J;+ c #48672B", +"K;+ c #413C53", +"L;+ c #42414E", +"M;+ c #1B9655", +"N;+ c #394C4E", +"O;+ c #0BBE6A", +"P;+ c #21835A", +"Q;+ c #473D4E", +"R;+ c #75757C", +"S;+ c #DFD3DB", +"T;+ c #72CD8F", +"U;+ c #22DC5E", +"V;+ c #AECEB9", +"W;+ c #DBD3D9", +"X;+ c #D8DAD8", +"Y;+ c #B2B2B5", +"Z;+ c #575B62", +"`;+ c #B4A1A7", +" >+ c #61E1B8", +".>+ c #00FFAB", +"+>+ c #03FDAC", +"@>+ c #00FFAC", +"#>+ c #01FEAC", +"$>+ c #00FFAA", +"%>+ c #2FFAB8", +"&>+ c #635D68", +"*>+ c #43424E", +"=>+ c #41474E", +"->+ c #3D514F", +";>+ c #42444E", +">>+ c #404B4E", +",>+ c #3C544F", +"'>+ c #3C554F", +")>+ c #3F4B4F", +"!>+ c #3F4D4F", +"~>+ c #3E4E50", +"{>+ c #43414D", +"]>+ c #188087", +"^>+ c #395259", +"/>+ c #453E4B", +"(>+ c #404850", +"_>+ c #42434E", +":>+ c #41434F", +"<>+ c #484045", +"[>+ c #203A76", +"}>+ c #2D3E68", +"|>+ c #464349", +"1>+ c #42424F", +"2>+ c #423F4C", +"3>+ c #3D5262", +"4>+ c #473C44", +"5>+ c #2A778A", +"6>+ c #02F1FF", +"7>+ c #06D1F0", +"8>+ c #395266", +"9>+ c #463E47", +"0>+ c #3C4759", +"a>+ c #1C5D8E", +"b>+ c #1C758E", +"c>+ c #404552", +"d>+ c #247381", +"e>+ c #2F6371", +"f>+ c #443F4A", +"g>+ c #165E77", +"h>+ c #26607D", +"i>+ c #405561", +"j>+ c #464049", +"k>+ c #2E5770", +"l>+ c #0C7DAA", +"m>+ c #3F4356", +"n>+ c #385251", +"o>+ c #157A5F", +"p>+ c #443F4B", +"q>+ c #395B5F", +"r>+ c #0BD295", +"s>+ c #306953", +"t>+ c #287D54", +"u>+ c #169266", +"v>+ c #188167", +"w>+ c #415249", +"x>+ c #424D49", +"y>+ c #404E4A", +"z>+ c #455047", +"A>+ c #79A824", +"B>+ c #4C9B12", +"C>+ c #405142", +"D>+ c #433E51", +"E>+ c #43424B", +"F>+ c #149D9E", +"G>+ c #1F898B", +"H>+ c #443A4B", +"I>+ c #119DA4", +"J>+ c #27916F", +"K>+ c #474044", +"L>+ c #414350", +"M>+ c #463A4D", +"N>+ c #2B7151", +"O>+ c #09C65D", +"P>+ c #34594D", +"Q>+ c #1C9761", +"R>+ c #0EB065", +"S>+ c #40494F", +"T>+ c #A3A4A7", +"U>+ c #D1D2D2", +"V>+ c #D9D6D8", +"W>+ c #C2CCC5", +"X>+ c #32DA68", +"Y>+ c #57D480", +"Z>+ c #D5CED3", +"`>+ c #DEDFDD", +" ,+ c #8B8C91", +".,+ c #454550", +"+,+ c #9C8991", +"@,+ c #66E6BE", +"#,+ c #00FFAF", +"$,+ c #03FDB0", +"%,+ c #00FFB0", +"&,+ c #02FEB0", +"*,+ c #00FFAD", +"=,+ c #34FFBF", +"-,+ c #8A848A", +";,+ c #444450", +">,+ c #43424F", +",,+ c #42434F", +"',+ c #41484F", +"),+ c #43414E", +"!,+ c #42454F", +"~,+ c #3F4C4F", +"{,+ c #404950", +"],+ c #3C5453", +"^,+ c #188386", +"/,+ c #3B4D58", +"(,+ c #44404C", +"_,+ c #424350", +":,+ c #44404A", +"<,+ c #3C5063", +"[,+ c #0972D2", +"},+ c #2C4B7F", +"|,+ c #474146", +"1,+ c #43414C", +"2,+ c #453A47", +"3,+ c #37656D", +"4,+ c #03E8F7", +"5,+ c #02C3EE", +"6,+ c #2B8297", +"7,+ c #463843", +"8,+ c #1C5E8E", +"9,+ c #384C62", +"0,+ c #45414B", +"a,+ c #424450", +"b,+ c #473E48", +"c,+ c #2A6175", +"d,+ c #2B6277", +"e,+ c #365965", +"f,+ c #1D8090", +"g,+ c #186074", +"h,+ c #29596D", +"i,+ c #483D46", +"j,+ c #433E4A", +"k,+ c #424451", +"l,+ c #44414C", +"m,+ c #3C4959", +"n,+ c #0D7BAB", +"o,+ c #285F75", +"p,+ c #197653", +"q,+ c #365555", +"r,+ c #493447", +"s,+ c #317570", +"t,+ c #00FFB5", +"u,+ c #20A566", +"v,+ c #1F8553", +"w,+ c #0EA75E", +"x,+ c #36763F", +"y,+ c #357D39", +"z,+ c #3A7F36", +"A,+ c #3B7932", +"B,+ c #4F8F27", +"C,+ c #A2FF00", +"D,+ c #7ADB10", +"E,+ c #434350", +"F,+ c #42444F", +"G,+ c #463C48", +"H,+ c #208689", +"I,+ c #129DA1", +"J,+ c #484643", +"K,+ c #1FA382", +"L,+ c #198A97", +"M,+ c #453D4B", +"N,+ c #1C9656", +"O,+ c #2E6955", +"P,+ c #09C46B", +"Q,+ c #2C6653", +"R,+ c #4B4152", +"S,+ c #C5C7C7", +"T,+ c #E1D5DD", +"U,+ c #82D09B", +"V,+ c #1DDB5B", +"W,+ c #A0CBAE", +"X,+ c #E2D8DE", +"Y,+ c #5C5F67", +"Z,+ c #3C3C49", +"`,+ c #393D49", +" '+ c #73606D", +".'+ c #69E8C2", +"+'+ c #00FFB2", +"@'+ c #03FDB3", +"#'+ c #00FFB3", +"$'+ c #02FEB4", +"%'+ c #00FFB1", +"&'+ c #2EF9BD", +"*'+ c #A9A2A5", +"='+ c #494A55", +"-'+ c #41464F", +";'+ c #41474F", +">'+ c #3E4F51", +",'+ c #3D5150", +"''+ c #3D5250", +")'+ c #3E5050", +"!'+ c #43404E", +"~'+ c #3F4D51", +"{'+ c #198285", +"]'+ c #43454E", +"^'+ c #414750", +"/'+ c #404951", +"('+ c #414451", +"_'+ c #473B41", +":'+ c #1F78AF", +"<'+ c #0090FF", +"['+ c #116BD5", +"}'+ c #44434D", +"|'+ c #44444E", +"1'+ c #198AAE", +"2'+ c #0894C7", +"3'+ c #3E5461", +"4'+ c #433F4C", +"5'+ c #474148", +"6'+ c #25557F", +"7'+ c #2E4A6E", +"8'+ c #483E45", +"9'+ c #44414D", +"0'+ c #3D4856", +"a'+ c #375562", +"b'+ c #067E90", +"c'+ c #2D5262", +"d'+ c #46414C", +"e'+ c #414551", +"f'+ c #43414B", +"g'+ c #1A6D9A", +"h'+ c #068592", +"i'+ c #2E5D4E", +"j'+ c #473E4F", +"k'+ c #3A645B", +"l'+ c #3A585F", +"m'+ c #15726B", +"n'+ c #198C6C", +"o'+ c #3B4F56", +"p'+ c #443C4F", +"q'+ c #42414F", +"r'+ c #42404F", +"s'+ c #568534", +"t'+ c #5B7740", +"u'+ c #42464F", +"v'+ c #473D47", +"w'+ c #2C6D72", +"x'+ c #0AAAB2", +"y'+ c #4B7F2A", +"z'+ c #2A8F6C", +"A'+ c #0F95AB", +"B'+ c #404650", +"C'+ c #463B4E", +"D'+ c #2E6750", +"E'+ c #13B169", +"F'+ c #109057", +"G'+ c #6E6874", +"H'+ c #DDDEDD", +"I'+ c #D4D5D4", +"J'+ c #D8D6D7", +"K'+ c #C8CDCA", +"L'+ c #34D569", +"M'+ c #53DB7F", +"N'+ c #C0BBC0", +"O'+ c #3F444F", +"P'+ c #544152", +"Q'+ c #56D5B3", +"R'+ c #00FFBA", +"S'+ c #02FDB7", +"T'+ c #00FFB7", +"U'+ c #02FEB8", +"V'+ c #00FFB6", +"W'+ c #2BF7BE", +"X'+ c #B2ACAC", +"Y'+ c #6D6E74", +"Z'+ c #454551", +"`'+ c #44424F", +" )+ c #414B51", +".)+ c #434550", +"+)+ c #434650", +"@)+ c #424750", +"#)+ c #3F4F51", +"$)+ c #3F4E51", +"%)+ c #3F5052", +"&)+ c #3E5353", +"*)+ c #3F4F52", +"=)+ c #168A8A", +"-)+ c #355B62", +";)+ c #414C4F", +">)+ c #424550", +",)+ c #414A52", +"')+ c #44434F", +"))+ c #43444F", +"!)+ c #424452", +"~)+ c #484145", +"{)+ c #275994", +"])+ c #005DDD", +"^)+ c #2668AE", +"/)+ c #46434B", +"()+ c #434450", +"_)+ c #45414D", +":)+ c #43404F", +"<)+ c #136A9B", +"[)+ c #384A60", +"})+ c #45434D", +"|)+ c #463F4A", +"1)+ c #33586E", +"2)+ c #1689B0", +"3)+ c #444452", +"4)+ c #44434E", +"5)+ c #434451", +"6)+ c #424652", +"7)+ c #483C47", +"8)+ c #266B7F", +"9)+ c #0AB2BA", +"0)+ c #366C77", +"a)+ c #4A3544", +"b)+ c #473E4D", +"c)+ c #45404E", +"d)+ c #424551", +"e)+ c #4A3C49", +"f)+ c #1E6E80", +"g)+ c #0686A8", +"h)+ c #424454", +"i)+ c #44404E", +"j)+ c #127F66", +"k)+ c #31595A", +"l)+ c #346757", +"m)+ c #287555", +"n)+ c #4B344A", +"o)+ c #444350", +"p)+ c #453F4F", +"q)+ c #453E50", +"r)+ c #413255", +"s)+ c #3F3454", +"t)+ c #423E53", +"u)+ c #443650", +"v)+ c #355465", +"w)+ c #0EBCA8", +"x)+ c #3D7E47", +"y)+ c #34616A", +"z)+ c #0BA2B1", +"A)+ c #3B515D", +"B)+ c #46404C", +"C)+ c #12B05A", +"D)+ c #1D9756", +"E)+ c #24895E", +"F)+ c #02B15F", +"G)+ c #93ACA3", +"H)+ c #E2DCDE", +"I)+ c #D3D5D4", +"J)+ c #E0D5DD", +"K)+ c #84CA9B", +"L)+ c #28E765", +"M)+ c #578F6E", +"N)+ c #443A4E", +"O)+ c #424651", +"P)+ c #4B384A", +"Q)+ c #43C2A5", +"R)+ c #00FFC1", +"S)+ c #01FCBA", +"T)+ c #00FFBB", +"U)+ c #02FEBB", +"V)+ c #2CF8C2", +"W)+ c #ADA7A8", +"X)+ c #909192", +"Y)+ c #454651", +"Z)+ c #404C51", +"`)+ c #424851", +" !+ c #3D5754", +".!+ c #168D89", +"+!+ c #336165", +"@!+ c #444250", +"#!+ c #45444E", +"$!+ c #414254", +"%!+ c #11439E", +"&!+ c #3C445A", +"*!+ c #46424C", +"=!+ c #1A6794", +"-!+ c #285C7C", +";!+ c #46444D", +">!+ c #473846", +",!+ c #2F7F86", +"'!+ c #00DFFF", +")!+ c #20719D", +"!!+ c #483B43", +"~!+ c #46414E", +"{!+ c #424752", +"]!+ c #424A55", +"^!+ c #13787C", +"/!+ c #148190", +"(!+ c #0AEDEF", +"_!+ c #0BC0C3", +":!+ c #276D6C", +"~+ c #345A5F", +",~+ c #28726A", +"'~+ c #1F8168", +")~+ c #207D5A", +"!~+ c #14C491", +"~~+ c #02D075", +"{~+ c #316253", +"]~+ c #1573A5", +"^~+ c #216A89", +"/~+ c #483F51", +"(~+ c #276A57", +"_~+ c #1B765B", +":~+ c #464351", +"<~+ c #3F4F5B", +"[~+ c #04F7CE", +"}~+ c #15B67D", +"|~+ c #2D754E", +"1~+ c #317D50", +"2~+ c #397249", +"3~+ c #3C7145", +"4~+ c #417342", +"5~+ c #45733D", +"6~+ c #486D3B", +"7~+ c #435B41", +"8~+ c #8FAD1C", +"9~+ c #49E17F", +"0~+ c #1D9293", +"a~+ c #0F9EAB", +"b~+ c #277380", +"c~+ c #473D49", +"d~+ c #14AF5B", +"e~+ c #179D56", +"f~+ c #28B373", +"g~+ c #41D88E", +"h~+ c #CCD1CF", +"i~+ c #D9D7D8", +"j~+ c #D6D5D5", +"k~+ c #D3D5D3", +"l~+ c #E2D7DE", +"m~+ c #8EC9A2", +"n~+ c #04C445", +"o~+ c #2E6F4B", +"p~+ c #473C51", +"q~+ c #444451", +"r~+ c #4D3A4B", +"s~+ c #44C4AA", +"t~+ c #00FFC9", +"u~+ c #01FCC1", +"v~+ c #00FFC2", +"w~+ c #02FEC3", +"x~+ c #2DF8C8", +"y~+ c #A8A2A3", +"z~+ c #87878A", +"A~+ c #444551", +"B~+ c #454450", +"C~+ c #424A53", +"D~+ c #424C53", +"E~+ c #414F54", +"F~+ c #434952", +"G~+ c #178C81", +"H~+ c #346163", +"I~+ c #483F4D", +"J~+ c #434752", +"K~+ c #424B53", +"L~+ c #454350", +"M~+ c #45444F", +"N~+ c #414457", +"O~+ c #133F99", +"P~+ c #384363", +"Q~+ c #47454D", +"R~+ c #444652", +"S~+ c #483E49", +"T~+ c #335C70", +"U~+ c #04B5DA", +"V~+ c #306A84", +"W~+ c #473F4A", +"X~+ c #45434F", +"Y~+ c #493C45", +"Z~+ c #483F49", +"`~+ c #375765", +" {+ c #1C7E85", +".{+ c #19B3B5", +"+{+ c #09AFA3", +"@{+ c #286567", +"#{+ c #4F3845", +"${+ c #2B6275", +"%{+ c #2B6177", +"&{+ c #4B3843", +"*{+ c #493D4C", +"={+ c #46424F", +"-{+ c #12CA83", +";{+ c #0EF393", +">{+ c #445755", +",{+ c #20648A", +"'{+ c #146F9B", +"){+ c #4A3646", +"!{+ c #325D51", +"~{+ c #148058", +"{{+ c #434851", +"]{+ c #464250", +"^{+ c #444550", +"/{+ c #366D63", +"({+ c #434D58", +"_{+ c #463F51", +":{+ c #463D52", +"<{+ c #453D52", +"[{+ c #453D53", +"}{+ c #443D53", +"|{+ c #443E54", +"1{+ c #423E56", +"2{+ c #43374C", +"3{+ c #258583", +"4{+ c #10A3A6", +"5{+ c #17909E", +"6{+ c #1D8593", +"7{+ c #473F4B", +"8{+ c #444552", +"9{+ c #444651", +"0{+ c #483D50", +"a{+ c #2B7152", +"b{+ c #12C361", +"c{+ c #41C582", +"d{+ c #29D985", +"e{+ c #9BCEB5", +"f{+ c #E2D8DD", +"g{+ c #D4D6D5", +"h{+ c #DFDFDE", +"i{+ c #A2A0A5", +"j{+ c #0D9C40", +"k{+ c #13B24A", +"l{+ c #454451", +"m{+ c #44C4AC", +"n{+ c #00FFCD", +"o{+ c #01FCC5", +"p{+ c #00FFC7", +"q{+ c #00FFC6", +"r{+ c #2DF8CB", +"s{+ c #989999", +"t{+ c #9E9E9D", +"u{+ c #575760", +"v{+ c #424B52", +"w{+ c #444752", +"x{+ c #444650", +"y{+ c #424A54", +"z{+ c #0DB5AA", +"A{+ c #346669", +"B{+ c #493B49", +"C{+ c #424456", +"D{+ c #123B98", +"E{+ c #32426D", +"F{+ c #48454C", +"G{+ c #16D0D4", +"H{+ c #06F6FF", +"I{+ c #03B7F2", +"J{+ c #3E5264", +"K{+ c #434754", +"L{+ c #48404B", +"M{+ c #45424E", +"N{+ c #0ADFDF", +"O{+ c #03F9EC", +"P{+ c #405E68", +"Q{+ c #473D4A", +"R{+ c #3F4A57", +"S{+ c #1B7C94", +"T{+ c #424B57", +"U{+ c #473F4F", +"V{+ c #434A4F", +"W{+ c #405557", +"X{+ c #4B3847", +"Y{+ c #2D6478", +"Z{+ c #01C8DF", +"`{+ c #1BA3B0", +" ]+ c #177F59", +".]+ c #3B514F", +"+]+ c #474151", +"@]+ c #483B4C", +"#]+ c #45424F", +"$]+ c #454650", +"%]+ c #444751", +"&]+ c #493E4A", +"*]+ c #2F6871", +"=]+ c #0BB2B0", +"-]+ c #3D505A", +";]+ c #217F8C", +">]+ c #1495A2", +",]+ c #464552", +"']+ c #2ABE6D", +")]+ c #34D47B", +"!]+ c #2AD281", +"~]+ c #5FD19A", +"{]+ c #DDD5D9", +"]]+ c #DEE1DE", +"^]+ c #746A7A", +"/]+ c #2A5943", +"(]+ c #0BCA4B", +"_]+ c #2A774A", +":]+ c #493C51", +"<]+ c #434753", +"[]+ c #44C4AE", +"}]+ c #00FFD1", +"|]+ c #01FCC9", +"1]+ c #00FFCA", +"2]+ c #02FECA", +"3]+ c #2DF8CE", +"4]+ c #A8A1A3", +"5]+ c #969897", +"6]+ c #7A7A7F", +"7]+ c #3F3F4C", +"8]+ c #464653", +"9]+ c #444754", +"0]+ c #493846", +"a]+ c #2998A0", +"b]+ c #11CEC6", +"c]+ c #444954", +"d]+ c #46454F", +"e]+ c #434353", +"f]+ c #0D41AB", +"g]+ c #35426A", +"h]+ c #4A4548", +"i]+ c #444553", +"j]+ c #454552", +"k]+ c #47404C", +"l]+ c #11C2D7", +"m]+ c #00BBF3", +"n]+ c #0D9FD6", +"o]+ c #415C6A", +"p]+ c #444653", +"q]+ c #444753", +"r]+ c #473F4D", +"s]+ c #38676F", +"t]+ c #39757D", +"u]+ c #493F4A", +"v]+ c #236D84", +"w]+ c #32576B", +"x]+ c #4B3A46", +"y]+ c #434854", +"z]+ c #454351", +"A]+ c #454352", +"B]+ c #473C48", +"C]+ c #1CB6BA", +"D]+ c #06FFFF", +"E]+ c #12ACCA", +"F]+ c #48404D", +"G]+ c #47414E", +"H]+ c #3A5760", +"I]+ c #0BB2B1", +"J]+ c #34646B", +"K]+ c #2E6977", +"L]+ c #0CA2B0", +"M]+ c #3E4E5B", +"N]+ c #655A6B", +"O]+ c #88CBA6", +"P]+ c #28DB76", +"Q]+ c #2FCD7D", +"R]+ c #34D588", +"S]+ c #BBD0C6", +"T]+ c #DDD8DA", +"U]+ c #C2C2C4", +"V]+ c #484954", +"W]+ c #453E4F", +"X]+ c #1A9D49", +"Y]+ c #0FB749", +"Z]+ c #3E4A4D", +"`]+ c #464352", +" ^+ c #464651", +".^+ c #444853", +"+^+ c #4E3B4B", +"@^+ c #45C4B0", +"#^+ c #00FFD5", +"$^+ c #01FCCC", +"%^+ c #00FFCE", +"&^+ c #02FECE", +"*^+ c #2DF8D1", +"=^+ c #A7A1A2", +"-^+ c #979898", +";^+ c #9A9B9B", +">^+ c #4E4E59", +",^+ c #464652", +"'^+ c #454652", +")^+ c #464551", +"!^+ c #454854", +"~^+ c #4A3A46", +"{^+ c #21A8AD", +"]^+ c #00E3D4", +"^^+ c #14DED8", +"/^+ c #45505B", +"(^+ c #46434F", +"_^+ c #454654", +":^+ c #494248", +"<^+ c #2C5F99", +"[^+ c #0075FF", +"}^+ c #1152D3", +"|^+ c #424559", +"1^+ c #464650", +"2^+ c #454653", +"3^+ c #47424D", +"4^+ c #405062", +"5^+ c #1383BB", +"6^+ c #1378AD", +"7^+ c #454752", +"8^+ c #483E4B", +"9^+ c #483C48", +"0^+ c #48414D", +"a^+ c #385766", +"b^+ c #12AFBD", +"c^+ c #3E5C67", +"d^+ c #4C3B49", +"e^+ c #444953", +"f^+ c #46424D", +"g^+ c #0FD8DC", +"h^+ c #08EEFB", +"i^+ c #07BFE6", +"j^+ c #11D2EC", +"k^+ c #454D57", +"l^+ c #464350", +"m^+ c #464450", +"n^+ c #424955", +"o^+ c #0FA9A8", +"p^+ c #287C80", +"q^+ c #385966", +"r^+ c #0AA7B5", +"s^+ c #365C68", +"t^+ c #49414D", +"u^+ c #454753", +"v^+ c #474753", +"w^+ c #ADACB0", +"x^+ c #42D482", +"y^+ c #27D475", +"z^+ c #26D481", +"A^+ c #85CFAB", +"B^+ c #E2D7DC", +"C^+ c #D4D4D5", +"D^+ c #74747C", +"E^+ c #4B4255", +"F^+ c #345D4B", +"G^+ c #09C749", +"H^+ c #258049", +"I^+ c #493D52", +"J^+ c #454751", +"K^+ c #45C4B2", +"L^+ c #00FFD9", +"M^+ c #01FCD0", +"N^+ c #00FFD2", +"O^+ c #02FED2", +"P^+ c #2DF8D4", +"Q^+ c #A6A0A1", +"R^+ c #969797", +"S^+ c #9F9F9E", +"T^+ c #3F3F4D", +"U^+ c #48414F", +"V^+ c #3B555D", +"W^+ c #0AA89B", +"X^+ c #3C6D76", +"Y^+ c #483E4C", +"Z^+ c #48434A", +"`^+ c #136BD3", +" /+ c #045EE9", +"./+ c #035BF4", +"+/+ c #39527F", +"@/+ c #484349", +"#/+ c #49414B", +"$/+ c #414555", +"%/+ c #0E6FAC", +"&/+ c #374F67", +"*/+ c #48434D", +"=/+ c #454754", +"-/+ c #493C49", +";/+ c #377079", +">/+ c #0FA9B3", +",/+ c #2A6567", +"'/+ c #365B5D", +")/+ c #434852", +"!/+ c #494051", +"~/+ c #493E53", +"{/+ c #4D3446", +"]/+ c #1C9C9E", +"^/+ c #00C6F0", +"//+ c #03B2DB", +"(/+ c #3195A4", +"_/+ c #483F4B", +":/+ c #48414E", +"(+ c #483E52", +",(+ c #454954", +"'(+ c #4F3C4B", +")(+ c #45C5B6", +"!(+ c #00FFE1", +"~(+ c #01FCD7", +"{(+ c #02FED9", +"](+ c #2DF8DA", +"^(+ c #A59FA0", +"/(+ c #959696", +"((+ c #9C9C9B", +"_(+ c #62626A", +":(+ c #484853", +"<(+ c #464753", +"[(+ c #474652", +"}(+ c #4B3D48", +"|(+ c #49404B", +"1(+ c #4B4048", +"2(+ c #464853", +"3(+ c #4B414E", +"4(+ c #1E797C", +"5(+ c #4A4451", +"6(+ c #464752", +"7(+ c #474751", +"8(+ c #464553", +"9(+ c #10389E", +"0(+ c #364166", +"a(+ c #4A474B", +"b(+ c #464754", +"c(+ c #4B434B", +"d(+ c #2D5A7C", +"e(+ c #136EA6", +"f(+ c #4A3C48", +"g(+ c #4B414F", +"h(+ c #4A414F", +"i(+ c #444B54", +"j(+ c #3A5451", +"k(+ c #20995E", +"l(+ c #20B853", +"m(+ c #3B4C6A", +"n(+ c #0985B3", +"o(+ c #335A71", +"p(+ c #4A434D", +"q(+ c #464854", +"r(+ c #4A404D", +"s(+ c #33676F", +"t(+ c #0AB3B1", +"u(+ c #3B5962", +"v(+ c #1E8693", +"w(+ c #16929F", +"x(+ c #474450", +"y(+ c #494954", +"z(+ c #76767E", +"A(+ c #E2D7DD", +"B(+ c #8ECDA9", +"C(+ c #1BD96E", +"D(+ c #1BD275", +"E(+ c #69CD9E", +"F(+ c #E9E0E3", +"G(+ c #A2A5A8", +"H(+ c #484854", +"I(+ c #493F52", +"J(+ c #1F8F49", +"K(+ c #0BC149", +"L(+ c #3B554E", +"M(+ c #494354", +"N(+ c #464852", +"O(+ c #454955", +"P(+ c #4F3C4C", +"Q(+ c #45C5B8", +"R(+ c #00FFE5", +"S(+ c #01FCDB", +"T(+ c #02FEDD", +"U(+ c #2CF8DD", +"V(+ c #A49E9F", +"W(+ c #949595", +"X(+ c #9A9A99", +"Y(+ c #838386", +"Z(+ c #474653", +"`(+ c #464855", +" _+ c #454856", +"._+ c #464755", +"+_+ c #484450", +"@_+ c #2395AA", +"#_+ c #0EB0DF", +"$_+ c #296F9A", +"%_+ c #474551", +"&_+ c #4B4350", +"*_+ c #1F747B", +"=_+ c #286B74", +"-_+ c #464654", +";_+ c #43465A", +">_+ c #11389C", +",_+ c #33426E", +"'_+ c #4A484F", +")_+ c #484551", +"!_+ c #3F4C5E", +"~_+ c #0E72AF", +"{_+ c #385069", +"]_+ c #4A444F", +"^_+ c #464956", +"/_+ c #4B3F53", +"(_+ c #2A995A", +"__+ c #445F58", +":_+ c #3E4B61", +"<_+ c #0B84B3", +"[_+ c #296482", +"}_+ c #4B424D", +"|_+ c #494350", +"1_+ c #3D555F", +"2_+ c #306D73", +"3_+ c #297381", +"4_+ c #0F9FAC", +"5_+ c #434B58", +"6_+ c #484552", +"7_+ c #484855", +"8_+ c #41D380", +"9_+ c #12D86D", +"0_+ c #39D087", +"a_+ c #C2D1CA", +"b_+ c #605C69", +"c_+ c #3C534F", +"d_+ c #0DC04A", +"e_+ c #1E924A", +"f_+ c #484053", +"g_+ c #45C5BA", +"h_+ c #00FFE9", +"i_+ c #01FCDF", +"j_+ c #02FEE1", +"k_+ c #2CF8E0", +"l_+ c #A49E9E", +"m_+ c #939594", +"n_+ c #575762", +"o_+ c #434351", +"p_+ c #4A404B", +"q_+ c #4B3E4A", +"r_+ c #4B404A", +"s_+ c #4B4149", +"t_+ c #484652", +"u_+ c #494650", +"v_+ c #4A454E", +"w_+ c #4B454E", +"x_+ c #494751", +"y_+ c #4B3C48", +"z_+ c #2C8495", +"A_+ c #01BDF2", +"B_+ c #00B1FF", +"C_+ c #1F77B2", +"D_+ c #4B4249", +"E_+ c #464856", +"F_+ c #484654", +"G_+ c #177984", +"H_+ c #4B424F", +"I_+ c #484752", +"J_+ c #444659", +"K_+ c #4B484E", +"L_+ c #464655", +"M_+ c #49444E", +"N_+ c #196A9E", +"O_+ c #24608A", +"P_+ c #4B434C", +"Q_+ c #474654", +"R_+ c #4B3953", +"S_+ c #484151", +"T_+ c #434A57", +"U_+ c #117DA9", +"V_+ c #1F6F92", +"W_+ c #49444F", +"X_+ c #11A6A5", +"Y_+ c #258387", +"Z_+ c #34616F", +"`_+ c #0AA7B4", +" :+ c #3A5865", +".:+ c #494956", +"+:+ c #3C3C4A", +"@:+ c #83838A", +"#:+ c #8ECCA9", +"$:+ c #11D969", +"%:+ c #22DC7C", +"&:+ c #53937A", +"*:+ c #473D50", +"=:+ c #474954", +"-:+ c #464953", +";:+ c #4A3E54", +">:+ c #24874B", +",:+ c #0AC649", +"':+ c #365C4D", +"):+ c #4A4255", +"!:+ c #464A56", +"~:+ c #503D4C", +"{:+ c #45C5BC", +"]:+ c #01FCE2", +"^:+ c #00FFE4", +"/:+ c #02FEE4", +"(:+ c #2CF8E3", +"_:+ c #A39D9E", +"::+ c #939494", +"<:+ c #77777C", +"[:+ c #494955", +"}:+ c #474956", +"|:+ c #4B404C", +"1:+ c #346D82", +"2:+ c #14A6CC", +"3:+ c #1695CA", +"4:+ c #2E678F", +"5:+ c #4A444E", +"6:+ c #4B464E", +"7:+ c #4B464F", +"8:+ c #4A4650", +"9:+ c #43495A", +"0:+ c #3C4C64", +"a:+ c #35506F", +"b:+ c #2E537A", +"c:+ c #245787", +"d:+ c #1D578F", +"e:+ c #077BBD", +"f:+ c #0894C8", +"g:+ c #098ECA", +"h:+ c #009CFC", +"i:+ c #18A5DE", +"j:+ c #494750", +"k:+ c #474755", +"l:+ c #474854", +"m:+ c #494652", +"n:+ c #444C59", +"o:+ c #147989", +"p:+ c #3C5562", +"q:+ c #4A4551", +"r:+ c #474855", +"s:+ c #484852", +"t:+ c #454759", +"u:+ c #11399E", +"v:+ c #2B407C", +"w:+ c #4C494E", +"x:+ c #4C444D", +"y:+ c #2E5B7D", +"z:+ c #146FA7", +"A:+ c #464B54", +"B:+ c #494651", +"C:+ c #1A759C", +"D:+ c #1679A3", +"E:+ c #484753", +"F:+ c #474955", +"G:+ c #4A414E", +"H:+ c #1E8F92", +"I:+ c #189D9D", +"J:+ c #3A5966", +"K:+ c #0CA6B4", +"L:+ c #306A76", +"M:+ c #4B424E", +"N:+ c #50505B", +"O:+ c #3AD07C", +"P:+ c #0ADD6B", +"Q:+ c #1D9660", +"R:+ c #484452", +"S:+ c #4A4555", +"T:+ c #3F504F", +"U:+ c #1D9A4A", +"V:+ c #494253", +"W:+ c #454A56", +"X:+ c #45C5BE", +"Y:+ c #00FFF1", +"Z:+ c #01FCE6", +"`:+ c #00FFE8", +" <+ c #02FEE8", +".<+ c #2CF8E6", +"+<+ c #A29C9D", +"@<+ c #929393", +"#<+ c #55555F", +"$<+ c #4B404D", +"%<+ c #396677", +"&<+ c #01E3FD", +"*<+ c #00C1FD", +"=<+ c #00ABFF", +"-<+ c #1C76BA", +";<+ c #354B6A", +"><+ c #295480", +",<+ c #21578B", +"'<+ c #1B5A94", +")<+ c #155C9C", +"!<+ c #0F5DA1", +"~<+ c #0B5CA3", +"{<+ c #0A5BA1", +"]<+ c #0A5A9E", +"^<+ c #105491", +"/<+ c #086BAC", +"(<+ c #0093DF", +"_<+ c #07AFF7", +":<+ c #0CC3FF", +"<<+ c #2EAAC6", +"[<+ c #4B414B", +"}<+ c #464957", +"|<+ c #4A4552", +"1<+ c #3B5363", +"2<+ c #13788D", +"3<+ c #424E5D", +"4<+ c #44475A", +"5<+ c #11399F", +"6<+ c #2C407B", +"7<+ c #4C494F", +"8<+ c #474756", +"9<+ c #404D60", +"0<+ c #0F73B0", +"a<+ c #39516A", +"b<+ c #4B4550", +"c<+ c #474856", +"d<+ c #4B444E", +"e<+ c #256A8A", +"f<+ c #0F81AF", +"g<+ c #414D5D", +"h<+ c #4B404E", +"i<+ c #2A797F", +"j<+ c #0FADAC", +"k<+ c #3C5863", +"l<+ c #129CAA", +"m<+ c #257B89", +"n<+ c #4A4A57", +"o<+ c #94949A", +"p<+ c #91CEAB", +"q<+ c #05D864", +"r<+ c #0ABA62", +"s<+ c #3C5B58", +"t<+ c #4A4354", +"u<+ c #4B3F55", +"v<+ c #287F4B", +"w<+ c #0BC84A", +"x<+ c #34644D", +"y<+ c #4B4256", +"z<+ c #45C5C0", +"A<+ c #00FFF5", +"B<+ c #01FCEA", +"C<+ c #00FFEC", +"D<+ c #02FEEC", +"E<+ c #2CF8E9", +"F<+ c #A29C9C", +"G<+ c #919292", +"H<+ c #969695", +"I<+ c #474A57", +"J<+ c #4B3E4B", +"K<+ c #1CAEBE", +"L<+ c #0CF9FF", +"M<+ c #0DBFEA", +"N<+ c #03A8F0", +"O<+ c #019EFF", +"P<+ c #00A0FB", +"Q<+ c #0C66AE", +"R<+ c #0C599F", +"S<+ c #0B5A9F", +"T<+ c #0C5799", +"U<+ c #0F5593", +"V<+ c #165289", +"W<+ c #1E507E", +"X<+ c #284D73", +"Y<+ c #334C69", +"Z<+ c #414658", +"`<+ c #3C586E", +" [+ c #0C91E0", +".[+ c #12B2F8", +"+[+ c #1FC4ED", +"@[+ c #1572AC", +"#[+ c #3A465E", +"$[+ c #4B4852", +"%[+ c #4C4450", +"&[+ c #315A6D", +"*[+ c #16718B", +"=[+ c #484856", +"-[+ c #474857", +";[+ c #13399B", +">[+ c #4A454F", +",[+ c #1A6B9E", +"'[+ c #25618B", +")[+ c #4C444E", +"![+ c #2F607B", +"~[+ c #0B86B6", +"{[+ c #39556A", +"][+ c #4B4250", +"^[+ c #36646D", +"/[+ c #0BB4B2", +"([+ c #37626B", +"_[+ c #1B8E9C", +":[+ c #1B8C99", +"<[+ c #4A4450", +"[[+ c #595965", +"}[+ c #D6D6D7", +"|[+ c #BCBABD", +"1[+ c #10AD59", +"2[+ c #00D762", +"3[+ c #277A58", +"4[+ c #4C4254", +"5[+ c #494655", +"6[+ c #434B52", +"7[+ c #11B74A", +"8[+ c #18A349", +"9[+ c #474453", +"0[+ c #474B57", +"a[+ c #513E4D", +"b[+ c #46C5C2", +"c[+ c #00FFF9", +"d[+ c #01FCEE", +"e[+ c #00FFF0", +"f[+ c #02FEF0", +"g[+ c #2CF7EC", +"h[+ c #A19B9B", +"i[+ c #979796", +"j[+ c #707075", +"k[+ c #484955", +"l[+ c #484957", +"m[+ c #4A4651", +"n[+ c #10BFDB", +"o[+ c #05BAF0", +"p[+ c #0B87B8", +"q[+ c #078DCF", +"r[+ c #039BFF", +"s[+ c #11B5FE", +"t[+ c #166EA0", +"u[+ c #1C497A", +"v[+ c #274F77", +"w[+ c #314C6C", +"x[+ c #3B4B62", +"y[+ c #454959", +"z[+ c #4A4854", +"A[+ c #4C4852", +"B[+ c #4A4954", +"C[+ c #4B4650", +"D[+ c #494654", +"E[+ c #444F62", +"F[+ c #334C6A", +"G[+ c #0C64AF", +"H[+ c #155F9B", +"I[+ c #434857", +"J[+ c #484956", +"K[+ c #4D4651", +"L[+ c #27607B", +"M[+ c #1E6985", +"N[+ c #4C4753", +"O[+ c #4B4952", +"P[+ c #193B92", +"Q[+ c #2A417E", +"R[+ c #4D4A4F", +"S[+ c #484857", +"T[+ c #4D454E", +"U[+ c #2E5C7F", +"V[+ c #494855", +"W[+ c #4C4551", +"X[+ c #39576D", +"Y[+ c #305F79", +"Z[+ c #4C4550", +"`[+ c #4B4653", +" }+ c #41545F", +".}+ c #0DB0AF", +"+}+ c #2D777C", +"@}+ c #267C8A", +"#}+ c #119DAA", +"$}+ c #464C58", +"%}+ c #494754", +"&}+ c #4B4B57", +"*}+ c #A1A1A6", +"=}+ c #E1E1E0", +"-}+ c #E0E2E0", +";}+ c #7E7282", +">}+ c #00DF64", +",}+ c #0FA65A", +"'}+ c #464B56", +")}+ c #484A55", +"!}+ c #4C4156", +"~}+ c #2A794C", +"{}+ c #0ACA4A", +"]}+ c #326B4D", +"^}+ c #4C4256", +"/}+ c #464B57", +"(}+ c #513E4C", +"_}+ c #46C5C4", +":}+ c #00FFFE", +"<}+ c #01FCF2", +"[}+ c #00FFF4", +"}}+ c #02FEF4", +"|}+ c #2CF7EF", +"1}+ c #A09A9A", +"2}+ c #909191", +"3}+ c #929291", +"4}+ c #585862", +"5}+ c #4A4A56", +"6}+ c #494854", +"7}+ c #4B4954", +"8}+ c #0E83C4", +"9}+ c #006FB3", +"0}+ c #037EB9", +"a}+ c #0593E5", +"b}+ c #08AAFF", +"c}+ c #1ECDF6", +"d}+ c #425C6C", +"e}+ c #4C4953", +"f}+ c #4B4853", +"g}+ c #4A4752", +"h}+ c #4D464F", +"i}+ c #2D5175", +"j}+ c #0B6AB5", +"k}+ c #1D598C", +"l}+ c #494752", +"m}+ c #4B4854", +"n}+ c #1C6486", +"o}+ c #27617E", +"p}+ c #4B4953", +"q}+ c #183B93", +"r}+ c #2A407D", +"s}+ c #4D4A50", +"t}+ c #4B4752", +"u}+ c #3E4F64", +"v}+ c #0E74B0", +"w}+ c #3A5269", +"x}+ c #4C4651", +"y}+ c #4B4753", +"z}+ c #405061", +"A}+ c #0E83B1", +"B}+ c #256B8B", +"C}+ c #14A3A3", +"D}+ c #228B8D", +"E}+ c #2F6C7A", +"F}+ c #0CA6B3", +"G}+ c #3F5562", +"H}+ c #4B4552", +"I}+ c #65656F", +"J}+ c #484653", +"K}+ c #0EB55B", +"L}+ c #00D460", +"M}+ c #326655", +"N}+ c #4C4456", +"O}+ c #4A4856", +"P}+ c #444952", +"Q}+ c #14B14A", +"R}+ c #14AB49", +"S}+ c #454852", +"T}+ c #494856", +"U}+ c #474B58", +"V}+ c #46C5C6", +"W}+ c #01FCF5", +"X}+ c #00FEF7", +"Y}+ c #02FEF7", +"Z}+ c #2DF8F2", +"`}+ c #8F9090", +" |+ c #848486", +".|+ c #265B8C", +"+|+ c #0C5088", +"@|+ c #015896", +"#|+ c #0081DF", +"$|+ c #10C0FF", +"%|+ c #20DAFF", +"&|+ c #3994A8", +"*|+ c #484A58", +"=|+ c #484A57", +"-|+ c #4C4750", +";|+ c #265580", +">|+ c #0A6BB6", +",|+ c #26537D", +"'|+ c #4C4751", +")|+ c #4B4251", +"!|+ c #156590", +"~|+ c #35546C", +"{|+ c #4D4751", +"]|+ c #4B4A53", +"^|+ c #183C94", +"/|+ c #2B417C", +"(|+ c #4E4A50", +"_|+ c #186DA2", +":|+ c #26618A", +"<|+ c #4D454F", +"[|+ c #157CA6", +"}|+ c #1B759B", +"||+ c #4A4753", +"1|+ c #4C4350", +"2|+ c #208D90", +"3|+ c #16A1A1", +"4|+ c #346571", +"5|+ c #366470", +"6|+ c #4C4451", +"7|+ c #6D6D77", +"8|+ c #504358", +"9|+ c #2C7253", +"0|+ c #00E564", +"a|+ c #189659", +"b|+ c #4C4356", +"c|+ c #474D57", +"d|+ c #484B56", +"e|+ c #4D4157", +"f|+ c #30724E", +"g|+ c #09CB4A", +"h|+ c #2E734D", +"i|+ c #484B55", +"j|+ c #484C59", +"k|+ c #523F4D", +"l|+ c #46C6C8", +"m|+ c #01FCF9", +"n|+ c #00FFFB", +"o|+ c #01FEFB", +"p|+ c #29F4F2", +"q|+ c #9C9697", +"r|+ c #454553", +"s|+ c #494A57", +"t|+ c #4A4956", +"u|+ c #4C4954", +"v|+ c #265F90", +"w|+ c #0E5187", +"x|+ c #11436C", +"y|+ c #145D9C", +"z|+ c #2171B2", +"A|+ c #2C8AB7", +"B|+ c #426979", +"C|+ c #4B434F", +"D|+ c #1F5A8C", +"E|+ c #0A69B3", +"F|+ c #314F6F", +"G|+ c #4E4851", +"H|+ c #494B59", +"I|+ c #4A4855", +"J|+ c #4D4952", +"K|+ c #21B1BB", +"L|+ c #00C1F8", +"M|+ c #2C6893", +"N|+ c #494B58", +"O|+ c #494957", +"P|+ c #4B4B56", +"Q|+ c #1A3B91", +"R|+ c #4D4B53", +"S|+ c #494A58", +"T|+ c #4E4650", +"U|+ c #2B5E83", +"V|+ c #1E7397", +"W|+ c #127FAA", +"X|+ c #464C5B", +"Y|+ c #4B4955", +"Z|+ c #4E4351", +"`|+ c #2E767C", +" 1+ c #0EB0AD", +".1+ c #36656F", +"+1+ c #10A0AE", +"@1+ c #2A7784", +"#1+ c #4E4350", +"$1+ c #4C4C58", +"%1+ c #72727B", +"&1+ c #A9A9AD", +"*1+ c #4B4C58", +"=1+ c #0BB858", +"-1+ c #02CD5A", +";1+ c #405151", +">1+ c #513B52", +",1+ c #494A56", +"'1+ c #15AB4A", +")1+ c #444C53", +"!1+ c #4B4857", +"~1+ c #474C59", +"{1+ c #46C5CA", +"]1+ c #01FBFC", +"^1+ c #00FDFE", +"/1+ c #01FCFE", +"(1+ c #23EDF0", +"_1+ c #767077", +":1+ c #90908F", +"<1+ c #5C5C65", +"[1+ c #266090", +"}1+ c #0E5388", +"|1+ c #12436A", +"11+ c #115F9E", +"21+ c #40516A", +"31+ c #504348", +"41+ c #4C414B", +"51+ c #4B4A56", +"61+ c #196098", +"71+ c #0D66AB", +"81+ c #3A4C63", +"91+ c #4C4A55", +"01+ c #4D444E", +"a1+ c #4E4953", +"b1+ c #4A4656", +"c1+ c #2B6B8B", +"d1+ c #01B7DB", +"e1+ c #02A2DF", +"f1+ c #0CADEB", +"g1+ c #494E59", +"h1+ c #4E484E", +"i1+ c #183F99", +"j1+ c #204190", +"k1+ c #504A4C", +"l1+ c #484958", +"m1+ c #4C4853", +"n1+ c #3F5065", +"o1+ c #0E74B1", +"p1+ c #3B536B", +"q1+ c #4D4752", +"r1+ c #286988", +"s1+ c #0D84B3", +"t1+ c #3F5264", +"u1+ c #494B57", +"v1+ c #4D4452", +"w1+ c #39626B", +"x1+ c #0BB4B1", +"y1+ c #307178", +"z1+ c #1794A2", +"A1+ c #1E8895", +"B1+ c #4C4552", +"C1+ c #BDBDBF", +"D1+ c #61616C", +"E1+ c #4B4B58", +"F1+ c #484C57", +"G1+ c #4F3E53", +"H1+ c #258864", +"I1+ c #00FCA9", +"J1+ c #0AE0A6", +"K1+ c #279D79", +"L1+ c #4B4755", +"M1+ c #4D4358", +"N1+ c #316C4D", +"O1+ c #297C4C", +"P1+ c #4E4258", +"Q1+ c #52404E", +"R1+ c #46C4CA", +"S1+ c #01F8FC", +"T1+ c #28F0F4", +"U1+ c #58525F", +"V1+ c #75767A", +"W1+ c #4D4D5A", +"X1+ c #4A4A58", +"Y1+ c #266292", +"Z1+ c #0E568A", +"`1+ c #124369", +" 2+ c #10609E", +".2+ c #395778", +"+2+ c #484B5B", +"@2+ c #494C5A", +"#2+ c #4D4A55", +"$2+ c #42495B", +"%2+ c #1463A2", +"&2+ c #0483C0", +"*2+ c #0AAADB", +"=2+ c #2578A7", +"-2+ c #29527B", +";2+ c #125D95", +">2+ c #105991", +",2+ c #0483C7", +"'2+ c #06C9FF", +")2+ c #2D9EBD", +"!2+ c #494A59", +"~2+ c #4D4750", +"{2+ c #355A87", +"]2+ c #0179FD", +"^2+ c #0461F5", +"/2+ c #394B7A", +"(2+ c #4D4951", +"_2+ c #26628B", +":2+ c #4E4652", +"<2+ c #32607A", +"[2+ c #0A87B8", +"}2+ c #355C74", +"|2+ c #4C4755", +"12+ c #43535E", +"22+ c #0EAEAD", +"32+ c #298084", +"42+ c #218593", +"52+ c #1597A5", +"62+ c #4C4C5A", +"72+ c #3F3F4E", +"82+ c #7F7F87", +"92+ c #9A9AA0", +"02+ c #4A4955", +"a2+ c #10DBBE", +"b2+ c #06FFEB", +"c2+ c #06FBD3", +"d2+ c #299971", +"e2+ c #4E3E54", +"f2+ c #494C58", +"g2+ c #4A4B58", +"h2+ c #4A4556", +"i2+ c #1AA44C", +"j2+ c #10B84A", +"k2+ c #435053", +"l2+ c #4C4858", +"m2+ c #494D5A", +"n2+ c #53414E", +"o2+ c #46C2CA", +"p2+ c #01F4FC", +"q2+ c #01F6FE", +"r2+ c #28EDF4", +"s2+ c #5C5662", +"t2+ c #8F8F8E", +"u2+ c #4B4A57", +"v2+ c #4D4954", +"w2+ c #266493", +"x2+ c #0D598C", +"y2+ c #124468", +"z2+ c #10609C", +"A2+ c #395878", +"B2+ c #4A4B59", +"C2+ c #51434E", +"D2+ c #2B758B", +"E2+ c #00A6DB", +"F2+ c #03A5E6", +"G2+ c #00AFFD", +"H2+ c #146398", +"I2+ c #2E4F70", +"J2+ c #3D5E7B", +"K2+ c #357999", +"L2+ c #4D4B54", +"M2+ c #4B4855", +"N2+ c #1677D5", +"O2+ c #097FFA", +"P2+ c #0059F1", +"Q2+ c #155BDA", +"R2+ c #4E4B52", +"S2+ c #4A4A59", +"T2+ c #4F4751", +"U2+ c #2C5F84", +"V2+ c #1470A7", +"W2+ c #4E4853", +"X2+ c #3C576B", +"Y2+ c #2C6682", +"Z2+ c #4B4956", +"`2+ c #179FA0", +" 3+ c #1E9495", +".3+ c #297986", +"+3+ c #0EA3B0", +"@3+ c #435461", +"#3+ c #4D4855", +"$3+ c #4F4F5B", +"%3+ c #C6C6C8", +"&3+ c #575763", +"*3+ c #4C4756", +"=3+ c #45575D", +"-3+ c #05F1C7", +";3+ c #0CFFDA", +">3+ c #13EFBD", +",3+ c #03F59D", +"'3+ c #1AC88C", +")3+ c #4F4054", +"!3+ c #4A4D58", +"~3+ c #4A4C57", +"{3+ c #4E4559", +"]3+ c #36664F", +"^3+ c #0AC94A", +"/3+ c #25854B", +"(3+ c #4E4358", +"_3+ c #484D5A", +":3+ c #46C0CA", +"<3+ c #01F0FC", +"[3+ c #00F3FF", +"}3+ c #01F2FE", +"|3+ c #27E9F3", +"13+ c #5E5864", +"23+ c #424352", +"33+ c #5E5F68", +"43+ c #5F5F68", +"53+ c #4C4C59", +"63+ c #4D4955", +"73+ c #266593", +"83+ c #0D5B8E", +"93+ c #134466", +"03+ c #10609A", +"a3+ c #4F4750", +"b3+ c #494B5A", +"c3+ c #494D5B", +"d3+ c #4F3F4C", +"e3+ c #2B8EA1", +"f3+ c #00D0FC", +"g3+ c #05B4F5", +"h3+ c #14C2F6", +"i3+ c #495C68", +"j3+ c #504650", +"k3+ c #4B4C59", +"l3+ c #4E424C", +"m3+ c #4A4B5A", +"n3+ c #4F494E", +"o3+ c #1A63C6", +"p3+ c #0054E6", +"q3+ c #0454DD", +"r3+ c #2A6FCD", +"s3+ c #4E494F", +"t3+ c #405166", +"u3+ c #0E75B1", +"v3+ c #3B556D", +"w3+ c #4C4956", +"x3+ c #454F5F", +"y3+ c #1081AE", +"z3+ c #207194", +"A3+ c #4D4854", +"B3+ c #4A4C59", +"C3+ c #4E4452", +"D3+ c #24888C", +"E3+ c #13A7A5", +"F3+ c #2E717D", +"G3+ c #3A616E", +"H3+ c #4E4653", +"I3+ c #4D4D5B", +"J3+ c #40404E", +"K3+ c #8D8D94", +"L3+ c #10D7A2", +"M3+ c #00FFB4", +"N3+ c #03EC8E", +"O3+ c #01E68A", +"P3+ c #2CA282", +"Q3+ c #4F4155", +"R3+ c #494D59", +"S3+ c #4B4556", +"T3+ c #1B9D4B", +"U3+ c #0EBE4A", +"V3+ c #405652", +"W3+ c #4D4759", +"X3+ c #4B4B59", +"Y3+ c #53424F", +"Z3+ c #46BECA", +"`3+ c #01EDFC", +" 4+ c #01EFFE", +".4+ c #27E6F4", +"+4+ c #5D5764", +"@4+ c #707076", +"#4+ c #919190", +"$4+ c #888889", +"%4+ c #8A8A89", +"&4+ c #4F4F5C", +"*4+ c #4D4A56", +"=4+ c #266694", +"-4+ c #0E5E90", +";4+ c #134465", +">4+ c #0E629B", +",4+ c #325E85", +"'4+ c #504750", +")4+ c #4C4955", +"!4+ c #445568", +"~4+ c #1098DB", +"{4+ c #19BDEE", +"]4+ c #407E8C", +"^4+ c #4D4350", +"/4+ c #4A4C5A", +"(4+ c #4A4D5B", +"_4+ c #4D4A52", +":4+ c #404E74", +"<4+ c #0541C1", +"[4+ c #184EB3", +"}4+ c #4B5669", +"|4+ c #4B4B5A", +"14+ c #186EA3", +"24+ c #285D88", +"34+ c #52434D", +"44+ c #494D5C", +"54+ c #187AA3", +"64+ c #187AA2", +"74+ c #4F4453", +"84+ c #31737A", +"94+ c #0EB1AE", +"04+ c #2F727C", +"a4+ c #0FA2B0", +"b4+ c #2F707E", +"c4+ c #4F4553", +"d4+ c #C5C5C7", +"e4+ c #4D4556", +"f4+ c #3F6763", +"g4+ c #0EDC8C", +"h4+ c #04E785", +"i4+ c #01E87C", +"j4+ c #24885A", +"k4+ c #504257", +"l4+ c #4A4D59", +"m4+ c #4A4C58", +"n4+ c #4E465A", +"o4+ c #3B6052", +"p4+ c #0CC74B", +"q4+ c #238C4C", +"r4+ c #4E4459", +"s4+ c #4A4E5B", +"t4+ c #54434F", +"u4+ c #47BDCA", +"v4+ c #01E9FC", +"w4+ c #00ECFF", +"x4+ c #01EBFE", +"y4+ c #27E4F3", +"z4+ c #5E5863", +"A4+ c #818183", +"B4+ c #8E8E8D", +"C4+ c #514851", +"D4+ c #2C648B", +"E4+ c #0D6193", +"F4+ c #144565", +"G4+ c #0F6198", +"H4+ c #316087", +"I4+ c #504952", +"J4+ c #4B4C5A", +"K4+ c #4C4B58", +"L4+ c #4C4A58", +"M4+ c #4D4652", +"N4+ c #504C52", +"O4+ c #1D3E90", +"P4+ c #233E86", +"Q4+ c #504B50", +"R4+ c #504851", +"S4+ c #2F5E81", +"T4+ c #0F8BBA", +"U4+ c #415D6E", +"V4+ c #4F4651", +"W4+ c #4E4954", +"X4+ c #227295", +"Y4+ c #1083AF", +"Z4+ c #445162", +"`4+ c #4B4D59", +" 5+ c #4F4755", +".5+ c #3D606A", +"+5+ c #0DB3B0", +"@5+ c #2B7C82", +"#5+ c #1599A7", +"$5+ c #238490", +"%5+ c #4F4653", +"&5+ c #4B4D5A", +"*5+ c #A6A6AA", +"=5+ c #4E4E5B", +"-5+ c #4E4556", +";5+ c #4D4B58", +">5+ c #415D5B", +",5+ c #0BBF5E", +"'5+ c #01D260", +")5+ c #3F5857", +"!5+ c #4F4859", +"~5+ c #4B4D58", +"{5+ c #4E4558", +"]5+ c #20974C", +"^5+ c #0DC34A", +"/5+ c #3C5D51", +"(5+ c #4F485A", +"_5+ c #544350", +":5+ c #47BBCA", +"<5+ c #00F1FF", +"[5+ c #01E5FC", +"}5+ c #00E7FF", +"|5+ c #01E7FE", +"15+ c #00EAFF", +"25+ c #27E0F4", +"35+ c #5D5864", +"45+ c #62626B", +"55+ c #504853", +"65+ c #306184", +"75+ c #0F6292", +"85+ c #144665", +"95+ c #0F6094", +"05+ c #306086", +"a5+ c #504953", +"b5+ c #4C4B59", +"c5+ c #4B4D5B", +"d5+ c #4D4C58", +"e5+ c #1A3E96", +"f5+ c #22418D", +"g5+ c #4F4D56", +"h5+ c #4A4E5C", +"i5+ c #50404F", +"j5+ c #2B97A1", +"k5+ c #01D7FB", +"l5+ c #346A8A", +"m5+ c #4F4752", +"n5+ c #4B4C5B", +"o5+ c #4F4854", +"p5+ c #2C6886", +"q5+ c #0C87B6", +"r5+ c #3D586D", +"s5+ c #4F4955", +"t5+ c #4D4A58", +"u5+ c #46525F", +"v5+ c #11ABAA", +"w5+ c #238B8E", +"x5+ c #1C8E9C", +"y5+ c #1894A1", +"z5+ c #4B4A58", +"A5+ c #4E4E5C", +"B5+ c #40404F", +"C5+ c #E4E4E2", +"D5+ c #B9B9BC", +"E5+ c #4A4D5A", +"F5+ c #523F58", +"G5+ c #317459", +"H5+ c #00E665", +"I5+ c #189858", +"J5+ c #4E4458", +"K5+ c #4F475B", +"L5+ c #3C5C51", +"M5+ c #0CC44A", +"N5+ c #20954C", +"O5+ c #554450", +"P5+ c #47B9CB", +"Q5+ c #00EDFF", +"R5+ c #01E2FC", +"S5+ c #00E4FF", +"T5+ c #01E3FE", +"U5+ c #00E6FF", +"V5+ c #27DDF4", +"W5+ c #4C4D5A", +"X5+ c #6B6B71", +"Y5+ c #52525E", +"Z5+ c #316285", +"`5+ c #0F6695", +" 6+ c #144765", +".6+ c #0D6295", +"+6+ c #2C658E", +"@6+ c #514952", +"#6+ c #4E4D58", +"$6+ c #1B3E95", +"%6+ c #22418C", +"&6+ c #504D55", +"*6+ c #4B4E5B", +"=6+ c #4F4452", +"-6+ c #16D2D5", +";6+ c #0EF4FE", +">6+ c #03C1F3", +",6+ c #14B0DA", +"'6+ c #4F4A55", +")6+ c #504954", +"!6+ c #385D75", +"~6+ c #0B88B8", +"{6+ c #32627D", +"]6+ c #504854", +"^6+ c #4D4956", +"/6+ c #1B9A9B", +"(6+ c #1B9B9B", +"_6+ c #248390", +":6+ c #11A0AD", +"<6+ c #4E4A58", +"[6+ c #82828B", +"}6+ c #70707A", +"|6+ c #4C4E5A", +"16+ c #4D4758", +"26+ c #11B65E", +"36+ c #00D760", +"46+ c #51475A", +"56+ c #4B4E5A", +"66+ c #4F4459", +"76+ c #258F4E", +"86+ c #0CC64A", +"96+ c #386350", +"06+ c #50475B", +"a6+ c #4B4E5C", +"b6+ c #554550", +"c6+ c #47B7CB", +"d6+ c #01DEFC", +"e6+ c #00E0FF", +"f6+ c #01E0FE", +"g6+ c #00E2FF", +"h6+ c #27DBF4", +"i6+ c #5F5965", +"j6+ c #878786", +"k6+ c #767679", +"l6+ c #4C4D5B", +"m6+ c #514953", +"n6+ c #316486", +"o6+ c #0E6897", +"p6+ c #144865", +"q6+ c #0E6191", +"r6+ c #286995", +"s6+ c #4F4C58", +"t6+ c #4F4D58", +"u6+ c #1B3F95", +"v6+ c #514E56", +"w6+ c #4C4C5B", +"x6+ c #4C4E5C", +"y6+ c #514450", +"z6+ c #1FAABC", +"A6+ c #00D1FF", +"B6+ c #03A6E1", +"C6+ c #2F95AF", +"D6+ c #4C4E5B", +"E6+ c #4F4A56", +"F6+ c #415669", +"G6+ c #0D86B4", +"H6+ c #286C8B", +"I6+ c #514654", +"J6+ c #288589", +"K6+ c #12ABA8", +"L6+ c #26818B", +"M6+ c #0EA4B1", +"N6+ c #3F5E6B", +"O6+ c #504956", +"P6+ c #ADADB1", +"Q6+ c #51465A", +"R6+ c #347058", +"S6+ c #00E164", +"T6+ c #0DA95A", +"U6+ c #4E4C5A", +"V6+ c #4F4A5B", +"W6+ c #415854", +"X6+ c #0FC04B", +"Y6+ c #1C9E4B", +"Z6+ c #4D4859", +"`6+ c #4A4E5D", +" 7+ c #554551", +".7+ c #47B5CB", +"+7+ c #01DAFC", +"@7+ c #00DCFF", +"#7+ c #01DCFE", +"$7+ c #00DEFF", +"%7+ c #27D7F4", +"&7+ c #5E5965", +"*7+ c #555561", +"=7+ c #65656D", +"-7+ c #484858", +";7+ c #514954", +">7+ c #316587", +",7+ c #0E6B99", +"'7+ c #144966", +")7+ c #0F608D", +"!7+ c #276994", +"~7+ c #4F4B58", +"{7+ c #4D4C59", +"]7+ c #4F4D59", +"^7+ c #504E56", +"/7+ c #4B5060", +"(7+ c #247CA8", +"_7+ c #098CCA", +":7+ c #3C5670", +"<7+ c #504955", +"[7+ c #4C4D5C", +"}7+ c #4E4B59", +"|7+ c #475060", +"17+ c #1381AC", +"27+ c #1D779C", +"37+ c #4D4B59", +"47+ c #504655", +"57+ c #347078", +"67+ c #287F88", +"77+ c #0FA3B1", +"87+ c #326F7C", +"97+ c #514755", +"07+ c #5F5F6B", +"a7+ c #D3D3D4", +"b7+ c #62626E", +"c7+ c #14B05D", +"d7+ c #00DB62", +"e7+ c #277B59", +"f7+ c #51465B", +"g7+ c #50455B", +"h7+ c #25894D", +"i7+ c #0BC94B", +"j7+ c #376952", +"k7+ c #50475C", +"l7+ c #4B4F5D", +"m7+ c #564651", +"n7+ c #47B4CB", +"o7+ c #00E1FF", +"p7+ c #01D7FC", +"q7+ c #00D8FF", +"r7+ c #01D8FE", +"s7+ c #00DAFF", +"t7+ c #28D4F4", +"u7+ c #5F5A65", +"v7+ c #63636B", +"w7+ c #555560", +"x7+ c #316687", +"y7+ c #0E6E9B", +"z7+ c #144A66", +"A7+ c #0E608C", +"B7+ c #266C95", +"C7+ c #504B57", +"D7+ c #4D4C5A", +"E7+ c #4F4E59", +"F7+ c #4E4C59", +"G7+ c #53454E", +"H7+ c #1A6EA3", +"I7+ c #246894", +"J7+ c #514A54", +"K7+ c #1A7AA0", +"L7+ c #147FA8", +"M7+ c #4A4F5E", +"N7+ c #405F69", +"O7+ c #0FB1AE", +"P7+ c #23898F", +"Q7+ c #129EAC", +"R7+ c #287F8C", +"S7+ c #52525F", +"T7+ c #C8C8CA", +"U7+ c #96969D", +"V7+ c #434352", +"W7+ c #4F4F5D", +"X7+ c #4C4F5A", +"Y7+ c #51475B", +"Z7+ c #376D58", +"`7+ c #00DA62", +" 8+ c #08B85E", +".8+ c #405B5A", +"+8+ c #504A5B", +"@8+ c #4F4B5C", +"#8+ c #445455", +"$8+ c #11BB4C", +"%8+ c #17A74B", +"&8+ c #4B4958", +"*8+ c #4F4B5B", +"=8+ c #4C4F5B", +"-8+ c #4C4F5D", +";8+ c #564652", +">8+ c #47B2CB", +",8+ c #00DDFF", +"'8+ c #01D3FC", +")8+ c #00D5FF", +"!8+ c #01D5FE", +"~8+ c #00D6FF", +"{8+ c #28D2F4", +"]8+ c #5F5A66", +"^8+ c #747478", +"/8+ c #888887", +"(8+ c #838382", +"_8+ c #4D4E5C", +":8+ c #524A55", +"<8+ c #326787", +"[8+ c #0E709C", +"}8+ c #144B67", +"|8+ c #0F5F88", +"18+ c #1F72A0", +"28+ c #4D505F", +"38+ c #4D4D5C", +"48+ c #504E59", +"58+ c #22428D", +"68+ c #524F57", +"78+ c #4E4D5B", +"88+ c #514C57", +"98+ c #2E6287", +"08+ c #1276B0", +"a8+ c #4B4E5D", +"b8+ c #4F4D5A", +"c8+ c #514A57", +"d8+ c #266F90", +"e8+ c #0D86B3", +"f8+ c #425669", +"g8+ c #504C58", +"h8+ c #4F4C5A", +"i8+ c #49525F", +"j8+ c #14A7A6", +"k8+ c #1C9799", +"l8+ c #1E8E9A", +"m8+ c #4F4A58", +"n8+ c #BABABD", +"o8+ c #4D4E5B", +"p8+ c #4D4F5C", +"q8+ c #16AA5C", +"r8+ c #00DA63", +"s8+ c #1C925C", +"t8+ c #4E4B5B", +"u8+ c #4D4F5B", +"v8+ c #52465D", +"w8+ c #2C8250", +"x8+ c #0BC647", +"y8+ c #307951", +"z8+ c #504C5D", +"A8+ c #4B4F5E", +"B8+ c #564752", +"C8+ c #47B0CB", +"D8+ c #00D9FF", +"E8+ c #01D0FC", +"F8+ c #01D1FE", +"G8+ c #00D2FF", +"H8+ c #28CFF4", +"I8+ c #50505E", +"J8+ c #67676E", +"K8+ c #524955", +"L8+ c #326888", +"M8+ c #0E739D", +"N8+ c #144D68", +"O8+ c #0F5F86", +"P8+ c #1F729E", +"Q8+ c #4C5060", +"R8+ c #4D4E5D", +"S8+ c #1B4095", +"T8+ c #514F57", +"U8+ c #435369", +"V8+ c #0D79B7", +"W8+ c #375A78", +"X8+ c #514B56", +"Y8+ c #4C4E5D", +"Z8+ c #524A56", +"`8+ c #306681", +" 9+ c #0A89B8", +".9+ c #376078", +"+9+ c #514A56", +"@9+ c #1F9597", +"#9+ c #16A3A2", +"$9+ c #1C8F9B", +"%9+ c #149BA8", +"&9+ c #49515F", +"*9+ c #A6A6AC", +"=9+ c #51485C", +"-9+ c #386A58", +";9+ c #03D461", +">9+ c #05C361", +",9+ c #336E5C", +"'9+ c #52485B", +")9+ c #4C4F5C", +"!9+ c #4F4C5D", +"~9+ c #475255", +"{9+ c #0CD062", +"]9+ c #01F97D", +"^9+ c #06EE70", +"/9+ c #328B5E", +"(9+ c #51455B", +"_9+ c #4C4F5E", +":9+ c #574752", +"<9+ c #47AFCB", +"[9+ c #01CDFC", +"}9+ c #00CEFF", +"|9+ c #01CEFE", +"19+ c #00CFFF", +"29+ c #28CCF4", +"39+ c #605B67", +"49+ c #585863", +"59+ c #534A55", +"69+ c #326A89", +"79+ c #0E769F", +"89+ c #144E68", +"99+ c #105E83", +"09+ c #1F739D", +"a9+ c #4D5160", +"b9+ c #4F4C59", +"c9+ c #4D4F5D", +"d9+ c #504F5A", +"e9+ c #1B4096", +"f9+ c #23428D", +"g9+ c #524F58", +"h9+ c #1A71A5", +"i9+ c #216B99", +"j9+ c #524B56", +"k9+ c #524B57", +"l9+ c #3A5E75", +"m9+ c #0A89B7", +"n9+ c #2E6986", +"o9+ c #524756", +"p9+ c #2B8186", +"q9+ c #10AEAB", +"r9+ c #1C8F99", +"s9+ c #10A2AF", +"t9+ c #425C69", +"u9+ c #93939A", +"v9+ c #C7C7C9", +"w9+ c #545462", +"x9+ c #50505D", +"y9+ c #4E4F5C", +"z9+ c #4F4A5A", +"A9+ c #19A55B", +"B9+ c #01D763", +"C9+ c #13A661", +"D9+ c #48535B", +"E9+ c #504D5C", +"F9+ c #4D505C", +"G9+ c #406D61", +"H9+ c #02FE8E", +"I9+ c #0CFE97", +"J9+ c #05FF83", +"K9+ c #01F965", +"L9+ c #43665B", +"M9+ c #50495C", +"N9+ c #574853", +"O9+ c #48ADCB", +"P9+ c #01C9FC", +"Q9+ c #01CAFE", +"R9+ c #28C9F4", +"S9+ c #605C67", +"T9+ c #767678", +"U9+ c #4E4F5E", +"V9+ c #326B8A", +"W9+ c #0E79A1", +"X9+ c #145069", +"Y9+ c #105D80", +"Z9+ c #187AA7", +"`9+ c #4B5465", +" 0+ c #514C58", +".0+ c #4F4E5C", +"+0+ c #4E4E5D", +"@0+ c #514F5B", +"#0+ c #535058", +"$0+ c #534B56", +"%0+ c #2F6286", +"&0+ c #1078B3", +"*0+ c #4A5161", +"=0+ c #504E5B", +"-0+ c #4E4F5D", +";0+ c #514D5A", +">0+ c #445668", +",0+ c #0F85B1", +"'0+ c #227496", +")0+ c #514C59", +"!0+ c #4E505E", +"~0+ c #534958", +"{0+ c #386E76", +"]0+ c #0FB2AF", +"^0+ c #1D8F97", +"/0+ c #396977", +"(0+ c #534A58", +"_0+ c #81818A", +":0+ c #5F5F6C", +"<0+ c #51515F", +"[0+ c #4E505C", +"}0+ c #52495D", +"|0+ c #396A59", +"10+ c #06CE60", +"20+ c #06C864", +"30+ c #288460", +"40+ c #4E505D", +"50+ c #4E515D", +"60+ c #53455B", +"70+ c #3A7C63", +"80+ c #10FB8D", +"90+ c #10EC76", +"00+ c #03ED5F", +"a0+ c #3E7E64", +"b0+ c #52455B", +"c0+ c #4C505F", +"d0+ c #48ABCB", +"e0+ c #00CDFF", +"f0+ c #01C5FC", +"g0+ c #00C6FF", +"h0+ c #01C6FE", +"i0+ c #00C7FF", +"j0+ c #28C6F4", +"k0+ c #6B6B70", +"l0+ c #4D505E", +"m0+ c #544955", +"n0+ c #39657E", +"o0+ c #0E7BA3", +"p0+ c #14516A", +"q0+ c #105D7E", +"r0+ c #177AA5", +"s0+ c #47586B", +"t0+ c #4D4F5E", +"u0+ c #514F5A", +"v0+ c #23428C", +"w0+ c #514D59", +"x0+ c #445469", +"y0+ c #0D7AB8", +"z0+ c #385C7A", +"A0+ c #534C57", +"B0+ c #167FA7", +"C0+ c #187CA3", +"D0+ c #514B5A", +"E0+ c #435D69", +"F0+ c #10AEAC", +"G0+ c #1A979B", +"H0+ c #0FA2AF", +"I0+ c #534957", +"J0+ c #444453", +"K0+ c #75757F", +"L0+ c #6C6C77", +"M0+ c #1BA15B", +"N0+ c #03D362", +"O0+ c #0EB666", +"P0+ c #3F615C", +"Q0+ c #524A5D", +"R0+ c #4F4C5C", +"S0+ c #4A575C", +"T0+ c #0BE66D", +"U0+ c #00FF66", +"V0+ c #02F55A", +"W0+ c #05D051", +"X0+ c #435D59", +"Y0+ c #524B5E", +"Z0+ c #584954", +"`0+ c #48A9CC", +" a+ c #00C9FF", +".a+ c #01C1FC", +"+a+ c #01C3FE", +"@a+ c #28C3F4", +"#a+ c #615C68", +"$a+ c #5A5A65", +"%a+ c #7E7E7D", +"&a+ c #68686E", +"*a+ c #4F4F5E", +"=a+ c #4E505F", +"-a+ c #544A56", +";a+ c #3D637B", +">a+ c #127B9F", +",a+ c #14546D", +"'a+ c #125B7B", +")a+ c #48586B", +"!a+ c #524C58", +"~a+ c #1A4099", +"{a+ c #214291", +"]a+ c #52505B", +"^a+ c #1B71A5", +"/a+ c #226C9B", +"(a+ c #534C58", +"_a+ c #4F505E", +":a+ c #514E5B", +"b+ c #4D4A59", +",b+ c #1A9E49", +"'b+ c #0DC64B", +")b+ c #2E6B4A", +"!b+ c #544A5F", +"~b+ c #584A55", +"{b+ c #48A6CC", +"]b+ c #00C1FF", +"^b+ c #01BAFC", +"/b+ c #00BBFF", +"(b+ c #01BBFE", +"_b+ c #28BDF4", +":b+ c #615D69", +"c+ c #10B1AE", +",c+ c #159EA5", +"'c+ c #10A2B0", +")c+ c #3C6876", +"!c+ c #534E5C", +"~c+ c #ACACB0", +"{c+ c #B0B0B4", +"]c+ c #504D5D", +"^c+ c #1EA05C", +"/c+ c #09C75F", +"(c+ c #0CBF69", +"_c+ c #278B62", +":c+ c #534A5D", +"d+ c #564B57", +",d+ c #4F5261", +"'d+ c #51505F", +")d+ c #505060", +"!d+ c #4D5065", +"~d+ c #524F5D", +"{d+ c #495468", +"]d+ c #326183", +"^d+ c #554E59", +"/d+ c #4F5161", +"(d+ c #4E5261", +"_d+ c #197DA5", +":d+ c #1580A9", +"e+ c #5A858E", +",e+ c #1A95AE", +"'e+ c #1C6B7C", +")e+ c #1E6173", +"!e+ c #1789A3", +"~e+ c #4D8492", +"{e+ c #796F6C", +"]e+ c #6C6D6F", +"^e+ c #545461", +"/e+ c #53525E", +"(e+ c #15419E", +"_e+ c #1C4399", +":e+ c #515261", +"f+ c #888890", +",f+ c #464656", +"'f+ c #525161", +")f+ c #52515F", +"!f+ c #13D688", +"~f+ c #02FA7B", +"{f+ c #03D067", +"]f+ c #0BC16A", +"^f+ c #259164", +"/f+ c #525060", +"(f+ c #505363", +"_f+ c #5B4F57", +":f+ c #4999CD", +"g+ c #56515E", +",g+ c #54515F", +"'g+ c #4B5769", +")g+ c #1383AC", +"!g+ c #1A7DA3", +"~g+ c #525462", +"{g+ c #544F5E", +"]g+ c #4A6370", +"^g+ c #05F3F4", +"/g+ c #00F7F3", +"(g+ c #03D9D5", +"_g+ c #06BDC5", +":g+ c #149FAC", +"h+ c #525464", +",h+ c #585159", +"'h+ c #2D69A7", +")h+ c #007BF7", +"!h+ c #0368F0", +"~h+ c #365898", +"{h+ c #585359", +"]h+ c #535463", +"^h+ c #56515D", +"/h+ c #2170A1", +"(h+ c #1975AB", +"_h+ c #535260", +":h+ c #545362", +"i+ c #249465", +",i+ c #554F61", +"'i+ c #5D5259", +")i+ c #4990CD", +"!i+ c #018EFC", +"~i+ c #008EFF", +"{i+ c #018EFE", +"]i+ c #008CFF", +"^i+ c #289AF4", +"/i+ c #65626D", +"(i+ c #4F5060", +"_i+ c #525665", +":i+ c #535564", +"j+ c #0056DF", +",j+ c #0253CE", +"'j+ c #157EF7", +")j+ c #50617A", +"!j+ c #2270A0", +"~j+ c #1777AF", +"{j+ c #555463", +"]j+ c #535665", +"^j+ c #584F5E", +"/j+ c #43697B", +"(j+ c #04CDDF", +"_j+ c #08D4E3", +":j+ c #3A8294", +"k+ c #594F63", +",k+ c #535664", +"'k+ c #525566", +")k+ c #5E545B", +"!k+ c #498BCE", +"~k+ c #0182FC", +"{k+ c #0082FF", +"]k+ c #0183FE", +"^k+ c #0080FF", +"/k+ c #2890F4", +"(k+ c #555565", +"_k+ c #2CA4AC", +":k+ c #00FEFE", +"l+ c #11A6A7", +",l+ c #11A5B2", +"'l+ c #1E909D", +")l+ c #9F9FA6", +"!l+ c #898992", +"~l+ c #545764", +"{l+ c #595065", +"]l+ c #426C60", +"^l+ c #08D363", +"/l+ c #02C65B", +"(l+ c #208E5E", +"_l+ c #575465", +":l+ c #555664", +"m+ c #286D99", +",m+ c #595360", +"'m+ c #565565", +")m+ c #555767", +"!m+ c #5A4F5E", +"~m+ c #4A5E73", +"{m+ c #1188B2", +"]m+ c #1A7BA2", +"^m+ c #515567", +"/m+ c #575665", +"(m+ c #5B5162", +"_m+ c #3A757D", +":m+ c #0DB2AF", +"n+ c #00ECF1", +",n+ c #00C5CA", +"'n+ c #69D1D3", +")n+ c #36D4D6", +"!n+ c #6BF2F4", +"~n+ c #2DFDFD", +"{n+ c #32FFFF", +"]n+ c #96A6AE", +"^n+ c #8F8E98", +"/n+ c #868691", +"(n+ c #5F5F65", +"_n+ c #5F5F66", +":n+ c #18449F", +"o+ c #595969", +",o+ c #565465", +"'o+ c #15B761", +")o+ c #00E263", +"!o+ c #198E55", +"~o+ c #595467", +"{o+ c #555768", +"]o+ c #61595E", +"^o+ c #4A7FCF", +"/o+ c #0067FF", +"(o+ c #0168FC", +"_o+ c #0169FE", +":o+ c #0064FF", +"p+ c #565868", +",p+ c #5C5563", +"'p+ c #3F6280", +")p+ c #0C80C0", +"!p+ c #3C6383", +"~p+ c #5C5562", +"{p+ c #5B5564", +"]p+ c #297696", +"^p+ c #0D8AB6", +"/p+ c #3F677F", +"(p+ c #515162", +"_p+ c #767682", +":p+ c #D7CFD0", +"q+ c #137681", +",q+ c #17606A", +"'q+ c #12949F", +")q+ c #3C7786", +"!q+ c #695E6D", +"~q+ c #B9BDC3", +"{q+ c #A4A5AD", +"]q+ c #9797A0", +"^q+ c #A5A5AD", +"/q+ c #B9B9BF", +"(q+ c #666674", +"_q+ c #63636A", +":q+ c #5A5967", +"r+ c #4B76CF", +",r+ c #0053FF", +"'r+ c #0256FC", +")r+ c #0156FE", +"!r+ c #0051FF", +"~r+ c #286DF5", +"{r+ c #6A6872", +"]r+ c #595A6A", +"^r+ c #5B5565", +"/r+ c #506777", +"(r+ c #179FAE", +"_r+ c #156873", +":r+ c #166772", +"s+ c #175F6A", +",s+ c #14707C", +"'s+ c #1A9AA9", +")s+ c #556273", +"!s+ c #5B5767", +"~s+ c #606069", +"{s+ c #6A6A6E", +"]s+ c #60606C", +"^s+ c #5B5A69", +"/s+ c #244997", +"(s+ c #0E40A7", +"_s+ c #3C5185", +":s+ c #5E5B65", +"t+ c #737372", +",t+ c #707073", +"'t+ c #686870", +")t+ c #58586A", +"!t+ c #5C5B6A", +"~t+ c #254A98", +"{t+ c #3D5284", +"]t+ c #605C66", +"^t+ c #595A6C", +"/t+ c #5A5B6C", +"(t+ c #5F5865", +"_t+ c #107FBC", +":t+ c #4F5E74", +"u+ c #187CB3", +",u+ c #1F75A9", +"'u+ c #5D5666", +")u+ c #545567", +"!u+ c #535365", +"~u+ c #C3C3C4", +"{u+ c #CAC7C6", +"]u+ c #B3C0C5", +"^u+ c #33A0C4", +"/u+ c #31A1C5", +"(u+ c #AFC0C6", +"_u+ c #CECAC9", +":u+ c #C7C8C8", +"v+ c #00F8FE", +",v+ c #00E6F9", +"'v+ c #41BCE1", +")v+ c #C9C6C6", +"!v+ c #CBCBC9", +"~v+ c #C3C5C6", +"{v+ c #D2CAC7", +"]v+ c #77B0C3", +"^v+ c #1D9CC6", +"/v+ c #65ACC4", +"(v+ c #D0CAC8", +"_v+ c #B3B3B7", +":v+ c #7E7E8A", +"w+ c #84848D", +",w+ c #9D9DA2", +"'w+ c #B1B1B3", +")w+ c #C5BFBF", +"!w+ c #29F2F2", +"~w+ c #10B8DF", +"{w+ c #00ACEC", +"]w+ c #40CDEF", +"^w+ c #CEC3BE", +"/w+ c #C1C3C4", +"(w+ c #C9C7C6", +"_w+ c #B8C1C4", +":w+ c #38A1C3", +"x+ c #6E6E79", +",x+ c #616171", +"'x+ c #5F5E6D", +")x+ c #264C9B", +"!x+ c #325091", +"~x+ c #63606B", +"{x+ c #5D5E6F", +"]x+ c #919198", +"^x+ c #A6A6A9", +"/x+ c #BFBFBE", +"(x+ c #BEBDBD", +"_x+ c #C0BEBE", +":x+ c #C1BFC0", +"y+ c #2148FA", +",y+ c #35A3B2", +"'y+ c #585D70", +")y+ c #5E5D6E", +"!y+ c #5C5C6E", +"~y+ c #959594", +"{y+ c #999998", +"]y+ c #929294", +"^y+ c #85858B", +"/y+ c #7B7B84", +"(y+ c #626272", +"_y+ c #616172", +":y+ c #6A6976", +"z+ c #3F7982", +",z+ c #0DABB1", +"'z+ c #0FADBB", +")z+ c #318694", +"!z+ c #63596A", +"~z+ c #5D5F70", +"{z+ c #5C5D71", +"]z+ c #686667", +"^z+ c #4D5AD1", +"/z+ c #0013FF", +"(z+ c #021BFD", +"_z+ c #001AFF", +":z+ c #011BFE", +"A+ c #2A39F4", +",A+ c #706F79", +"'A+ c #A3A4A6", +")A+ c #AFABA5", +"!A+ c #AAABAB", +"~A+ c #AAAAAE", +"{A+ c #7B7B87", +"]A+ c #676776", +"^A+ c #2078AA", +"/A+ c #167CB3", +"(A+ c #556379", +"_A+ c #625F6E", +":A+ c #605F70", +"B+ c #10B6B5", +",B+ c #0CACB6", +"'B+ c #13ABB8", +")B+ c #447483", +"!B+ c #606072", +"~B+ c #5D6376", +"{B+ c #269FB2", +"]B+ c #228284", +"^B+ c #246666", +"/B+ c #1F8A8F", +"(B+ c #359FA7", +"_B+ c #6E6D6E", +":B+ c #646474", +"C+ c #626071", +",C+ c #537084", +"'C+ c #179AB5", +")C+ c #186577", +"!C+ c #195C6D", +"~C+ c #1289A0", +"{C+ c #358BA3", +"]C+ c #665C6D", +"^C+ c #5D5D70", +"/C+ c #6E6E7B", +"(C+ c #777782", +"_C+ c #7F7F88", +":C+ c #89898F", +"D+ c #616274", +",D+ c #68606B", +"'D+ c #456C9B", +")D+ c #0C86F8", +"!D+ c #0A64D4", +"~D+ c #0759C6", +"{D+ c #307ED3", +"]D+ c #67616B", +"^D+ c #616375", +"/D+ c #626373", +"(D+ c #67606E", +"_D+ c #376F95", +":D+ c #636171", +"E+ c #3A5797", +",E+ c #0B45B1", +"'E+ c #134AAF", +")E+ c #565C7B", +"!E+ c #666371", +"~E+ c #626275", +"{E+ c #68616F", +"]E+ c #0D81BD", +"^E+ c #416C8D", +"/E+ c #686170", +"(E+ c #676171", +"_E+ c #4E6B82", +":E+ c #1488B2", +"F+ c #696571", +",F+ c #43598F", +"'F+ c #1445A7", +")F+ c #1445A8", +"!F+ c #465A8D", +"~F+ c #696271", +"{F+ c #387096", +"]F+ c #0E81BE", +"^F+ c #426D8E", +"/F+ c #696172", +"(F+ c #41718D", +"_F+ c #128BB7", +":F+ c #1E83AA", +"G+ c #696674", +",G+ c #525E85", +"'G+ c #1244A9", +")G+ c #3B5697", +"!G+ c #6A6672", +"~G+ c #6A6372", +"{G+ c #397096", +"]G+ c #0D82BF", +"^G+ c #416E90", +"/G+ c #696373", +"(G+ c #347898", +"_G+ c #287EA1", +":G+ c #666475", +" , ' ) ! ' ' ' ' ' ' ' ' ' ' ' ' ' ' ' ' ' ' ' ' ' ' ' ' ' ' ' ' ' ' ' ' ' ' ' ' ' ' ' ' ' ' ' ' ' ' ' ' ' ' ' ' ' ' ' ' ' ~ { ] ^ / ( _ : < ' [ [ ' ' ' ' ' ' ' ' ' ' ' ' ' ' ' ' ' ' ' ' ' ' ' ' ' ' ' ' ' ' ' ' ' ' ' ' ' ' ' ' ' ' ' ' ' ' ' ' ' ' ' ' ' ' ' ' ' ' ' ' ' ' ' ' ' ' ' ' ' ' ' ' ' ' ' ' ' ' ' ' ' ' ' ' ' ' ' ' ' ' ' ' ' ' ' ' ' ' ' ' ' ' ' ' ' ' ' ' ' ' ' ' ' ' ' ' ' ' ' ' ' ' ' ' ' ' ' ' ' ' ' ' ' ' ' ' ' ' ' ' ' ' ' ' ' ' ' ' ' ' ' ' ' ' ' ' ' ' ' ' ' ' ' ' ' ' ' ' ' ' ' ' ' ' ' ' ' ' ' ' ' ' ' ' ' ' ' ' ' ' ' ' ' ' ' ' ' ' ' ' ' ' ' ' ' ' ' ' ' ' ' ' ' ' ", +"} | 1 2 3 4 5 6 7 8 9 9 0 a b [ ' ! ' ' ' ' ' ' ' ' ' ' ' ' ' ' ' ' ' ' ' ' ' ' ' ' ' ' ' ' ' ' ' ' ' ' ' ' ' ' ' ' ' ' ' ' ' ' ' ' ' ' ' ' ' ' ' ' ' ' c d e f g h i j [ ' [ ' ' ' ' ' ' ' ' ' ' ' ' ' ' ' ' ' ' ' ' ' ' ' ' ' ' ' ' ' ' ' ' ' ' ' ' ' ' ' ' ' ' ' ' ' ' ' ' ' ' ' ' ' ' ' ' ' ' ' ' ' ' ' ' ' ' ' ' ' ' ' ' ' ' ' ' ' ' ' ' ' ' ' ' ' ' ' ' ' ' ' ' ' ' ' ' ' ' ' ' ' ' ' ' ' ' ' ' ' ' ' ' ' ' ' ' ' ' ' ' ' ' ' ' ' ' ' ' ' ' ' ' ' ' ' ' ' ' ' ' ' ' ' ' ' ' ' ' ' ' ' ' ' ' ' ' ' ' ' ' ' ' ' ' ' ' ' ' ' ' ' ' ' ' ' ' ' ' ' ' ' ' ' ' ' ' ' ' ' ' ' ' ' ' ' ' ' ' ' ' ' ' ' ' ' ' ' ' ' ' ' ' ' ", +"k l m n o p q r s t u v w x y z A ' ! [ ' ' ' ' ' ' ' ' ' ' ' ' ' ' ' ' ' ' ' ' ' ' ' ' ' ' ' ' ' ' ' ' ' ' ' ' ' ' ' ' ' ' ' ' ' ' ' ' ' ' ' ' ' ' ' B ' ' C D E F G H I J ' [ [ [ K K L B ' ' ' ' ' ' ' ' ' ' ' ' ' ' ' ' ' ' ' ' ' ' ' ' ' ' ' ' ' ' ' ' ' ' ' ' ' ' ' ' ' ' ' ' ' ' ' ' ' ' ' ' ' ' ' ' ' ' ' ' ' ' ' ' ' ' ' ' ' ' ' ' ' ' ' ' ' ' ' ' ' ' ' ' ' ' ' ' ' ' ' ' ' ' ' ' ' ' ' ' ' ' ' ' ' ' ' ' ' ' ' ' ' ' ' ' ' ' ' ' ' ' ' ' ' ' ' ' ' ' ' ' ' ' ' ' ' ' ' ' ' ' ' ' ' ' ' ' ' ' ' ' ' ' ' ' ' ' ' ' ' ' ' ' ' ' ' ' ' ' ' ' ' ' ' ' ' ' ' ' ' ' ' ' ' ' ' ' ' ' ' ' ' ' ' ' ' ' ' ' ' ' ' ' ' ' ", +"M N O | P Q R S T U V W X Y Z ` . .. ) +. @. [ B B B B B B B B B B B B B B B B B B B B B B B B B B B B B B B B B B B B B B B B B B B B B B B B B B B B B B #. #. ' $. %. &. *. =. -. ;. >. ,. ' [ +. +. ' #. L ' B B B B B B B B B B B B B B B B B B B B B B B B B B B B B B B B B B B B B B B B B B B B B B B B B B B B B B B B B B B B B B B B B B B B B B B B B B B B B B B B B B B B B B B B B B B B B B B B B B B B B B B B B B B B B B B B B B B B B B B B B B B B B B B B B B B B B B B B B B B B B B B B B B B B B B B B B B B B B B B B B B B B B B B B B B B B B B B B B B B B B B B B B B B B B B B B B B B B B B B B B B B B ", +"'. ). !. ~. {. ]. ^. /. (. _. :. <. [. }. |. 1. 2. 3. 4. 5. +. 6. @. [ B B B B B B B B B B B B B B B B B B B B B B B B B B B B B B B B B B B B B B B B B B B B B B B B B B B B ' [ 7. [ +. 8. 9. 0. a. b. c. d. e. f. g. h. i. j. +. 7. ' [ B B B B B B B B B B B B B B B B B B B B B B B B B B B B B B B B B B B B B B B B B B B B B B B B B B B B B B B B B B B B B B B B B B B B B B B B B B B B B B B B B B B B B B B B B B B B B B B B B B B B B B B B B B B B B B B B B B B B B B B B B B B B B B B B B B B B B B B B B B B B B B B B B B B B B B B B B B B B B B B B B B B B B B B B B B B B B B B B B B B B B B B B B B B B B B B B B B B B B B B B B B ", +"k. l. m. n. o. p. q. r. s. t. u. v. w. x. y. z. A. B. C. D. E. F. +. G. G. H. H. H. H. H. H. H. H. H. H. H. H. H. H. H. H. H. H. H. H. H. H. H. H. H. H. H. H. H. H. H. H. H. H. H. H. H. H. H. H. H. H. H. H. H. H. H. H. H. H. H. H. H. H. I. J. +. K. L. M. c. N. O. P. Q. R. S. T. U. V. +. J. H. H. H. H. H. H. H. H. H. H. H. H. H. H. H. H. H. H. H. H. H. H. H. H. H. H. H. H. H. H. H. H. H. H. H. H. H. H. H. H. H. H. H. H. H. H. H. H. H. H. H. H. H. H. H. H. H. H. H. H. H. H. H. H. H. H. H. H. H. H. H. H. H. H. H. H. H. H. H. H. H. H. H. H. H. H. H. H. H. H. H. H. H. H. H. H. H. H. H. H. H. H. H. H. H. H. H. H. H. H. H. H. H. H. H. H. H. H. H. H. H. H. H. H. H. H. H. H. H. H. H. H. H. H. H. H. H. H. H. H. H. H. H. H. H. H. H. H. H. H. H. H. H. H. H. H. H. H. H. H. H. H. H. H. H. H. H. H. H. H. H. H. H. H. H. H. H. H. H. H. H. H. H. H. H. H. H. H. H. H. H. H. H. H. H. H. H. H. H. H. H. H. H. ", +"W. X. Y. Z. `. + .+ ++ @+ #+ $+ %+ &+ Z *+ =+ -+ ;+ >+ ,+ '+ )+ !+ ~+ {+ ]+ ^+ {+ /+ /+ /+ /+ /+ /+ /+ /+ /+ /+ /+ /+ /+ /+ /+ /+ /+ /+ /+ /+ /+ /+ /+ /+ /+ /+ /+ /+ /+ /+ /+ /+ /+ /+ /+ /+ /+ /+ /+ /+ /+ /+ /+ /+ /+ /+ /+ /+ /+ /+ /+ /+ {+ (+ ^+ ~+ _+ :+ <+ [+ }+ |+ 1+ 2+ 3+ 4+ 5+ 6+ ~+ (+ /+ /+ /+ /+ /+ /+ /+ /+ /+ /+ /+ /+ /+ /+ /+ /+ /+ /+ /+ /+ /+ /+ /+ /+ /+ /+ /+ /+ /+ /+ /+ /+ /+ /+ /+ /+ /+ /+ /+ /+ /+ /+ /+ /+ /+ /+ /+ /+ /+ /+ /+ /+ /+ /+ /+ /+ /+ /+ /+ /+ /+ /+ /+ /+ /+ /+ /+ /+ /+ /+ /+ /+ /+ /+ /+ /+ /+ /+ /+ /+ /+ /+ /+ /+ /+ /+ /+ /+ /+ /+ /+ /+ /+ /+ /+ /+ /+ /+ /+ /+ /+ /+ /+ /+ /+ /+ /+ /+ /+ /+ /+ /+ /+ /+ /+ /+ /+ /+ /+ /+ /+ /+ /+ /+ /+ /+ /+ /+ /+ /+ /+ /+ /+ /+ /+ /+ /+ /+ /+ /+ /+ /+ /+ /+ /+ /+ /+ /+ /+ /+ /+ /+ /+ /+ /+ /+ /+ /+ /+ /+ /+ /+ /+ /+ /+ /+ /+ /+ /+ /+ /+ /+ /+ /+ /+ /+ /+ /+ /+ /+ /+ /+ /+ /+ /+ /+ /+ /+ /+ /+ /+ /+ /+ /+ /+ /+ /+ /+ /+ /+ /+ /+ ", +"7+ 8+ 9+ 0+ a+ b+ c+ d+ e+ f+ g+ h+ i+ j+ 2. B. k+ l+ m+ n+ o+ p+ q+ r+ s+ ~+ G. ]+ I. I. I. I. I. I. I. I. I. I. I. I. I. I. I. I. I. I. I. I. I. I. I. I. I. I. I. I. I. I. I. I. I. I. I. I. I. I. I. I. I. I. I. I. I. I. I. I. I. I. I. I. I. I. G. t+ {+ ~+ u+ v+ w+ x+ y+ z+ A+ B+ C+ D+ +. E+ I. I. I. I. I. I. I. I. I. I. I. I. I. I. I. I. I. I. I. I. I. I. I. I. I. I. I. I. I. I. I. I. I. I. I. I. I. I. I. I. I. I. I. I. I. I. I. I. I. I. I. I. I. I. I. I. I. I. I. I. I. I. I. I. I. I. I. I. I. I. I. I. I. I. I. I. I. I. I. I. I. I. I. I. I. I. I. I. I. I. I. I. I. I. I. I. I. I. I. I. I. I. I. I. I. I. I. I. I. I. I. I. I. I. I. I. I. I. I. I. I. I. I. I. I. I. I. I. I. I. I. I. I. I. I. I. I. I. I. I. I. I. I. I. I. I. I. I. I. I. I. I. I. I. I. I. I. I. I. I. I. I. I. I. I. I. I. I. I. I. I. I. I. I. I. I. I. I. I. I. I. I. I. I. I. I. I. I. I. I. I. I. I. I. I. I. I. I. I. I. I. I. ", +"F+ G+ H+ I+ J+ K+ L+ M+ N+ O+ P+ +. Q+ R+ S+ T+ U+ V+ W+ X+ Y+ Z+ `+ @ .@ +@ {+ ~+ @@ #@ ^+ #@ #@ #@ #@ #@ #@ #@ #@ #@ #@ #@ #@ #@ #@ #@ #@ #@ #@ #@ #@ #@ #@ #@ #@ #@ #@ #@ #@ #@ #@ #@ #@ #@ #@ #@ #@ #@ #@ #@ #@ #@ #@ #@ #@ #@ #@ #@ #@ #@ #@ #@ #@ ^+ #@ $@ ~+ %@ &@ *@ =@ -@ ;@ >@ ,@ '@ ' E+ #@ #@ #@ #@ #@ #@ #@ #@ #@ #@ #@ #@ #@ #@ #@ #@ #@ #@ #@ #@ #@ #@ #@ #@ #@ #@ #@ #@ #@ #@ #@ #@ #@ #@ #@ #@ #@ #@ #@ #@ #@ #@ #@ #@ #@ #@ #@ #@ #@ #@ #@ #@ #@ #@ #@ #@ #@ #@ #@ #@ #@ #@ #@ #@ #@ #@ #@ #@ #@ #@ #@ #@ #@ #@ #@ #@ #@ #@ #@ #@ #@ #@ #@ #@ #@ #@ #@ #@ #@ #@ #@ #@ #@ #@ #@ #@ #@ #@ #@ #@ #@ #@ #@ #@ #@ #@ #@ #@ #@ #@ #@ #@ #@ #@ #@ #@ #@ #@ #@ #@ #@ #@ #@ #@ #@ #@ #@ #@ #@ #@ #@ #@ #@ #@ #@ #@ #@ #@ #@ #@ #@ #@ #@ #@ #@ #@ #@ #@ #@ #@ #@ #@ #@ #@ #@ #@ #@ #@ #@ #@ #@ #@ #@ #@ #@ #@ #@ #@ #@ #@ #@ #@ #@ #@ #@ #@ #@ #@ #@ #@ #@ #@ #@ #@ #@ #@ #@ #@ #@ #@ #@ #@ #@ #@ #@ #@ #@ #@ #@ #@ #@ #@ ", +")@ !@ ~@ {@ ]@ ^@ /@ (@ +. _@ :@ <@ [@ }@ |@ 1@ 2@ 3@ 4@ 5@ 6@ 7@ 8@ 9@ 0@ a@ b@ c@ }@ d@ e@ [@ [@ [@ [@ [@ [@ [@ [@ [@ [@ [@ [@ [@ [@ [@ [@ [@ [@ [@ [@ [@ [@ [@ [@ [@ [@ [@ [@ [@ [@ [@ [@ [@ [@ [@ [@ [@ [@ [@ [@ [@ [@ [@ [@ [@ [@ [@ [@ [@ [@ [@ [@ [@ [@ [@ d@ f@ g@ h@ i@ j@ k@ l@ m@ n@ ' o@ [@ [@ [@ [@ [@ [@ [@ [@ [@ [@ [@ [@ [@ [@ [@ [@ [@ [@ [@ [@ [@ [@ [@ [@ [@ [@ [@ [@ [@ [@ [@ [@ [@ [@ [@ [@ [@ [@ [@ [@ [@ [@ [@ [@ [@ [@ [@ [@ [@ [@ [@ [@ [@ [@ [@ [@ [@ [@ [@ [@ [@ [@ [@ [@ [@ [@ [@ [@ [@ [@ [@ [@ [@ [@ [@ [@ [@ [@ [@ [@ [@ [@ [@ [@ [@ [@ [@ [@ [@ [@ [@ [@ [@ [@ [@ [@ [@ [@ [@ [@ [@ [@ [@ [@ [@ [@ [@ [@ [@ [@ [@ [@ [@ [@ [@ [@ [@ [@ [@ [@ [@ [@ [@ [@ [@ [@ [@ [@ [@ [@ [@ [@ [@ [@ [@ [@ [@ [@ [@ [@ [@ [@ [@ [@ [@ [@ [@ [@ [@ [@ [@ [@ [@ [@ [@ [@ [@ [@ [@ [@ [@ [@ [@ [@ [@ [@ [@ [@ [@ [@ [@ [@ [@ [@ [@ [@ [@ [@ [@ [@ [@ [@ [@ [@ [@ [@ [@ [@ [@ [@ [@ [@ [@ [@ [@ [@ [@ [@ [@ [@ [@ [@ ", +"p@ q@ r@ s@ t@ u@ v@ w@ x@ y@ z@ A@ e@ B@ A@ }@ C@ D@ E@ F@ G@ H@ I@ J@ K@ L@ M@ N@ O@ P@ }@ $@ @@ #@ #@ #@ #@ #@ #@ #@ #@ #@ #@ #@ #@ #@ #@ #@ #@ #@ #@ #@ Q@ #@ Q@ Q@ #@ #@ Q@ R@ #@ #@ #@ R@ #@ S@ Q@ Q@ #@ #@ #@ #@ #@ Q@ Q@ Q@ Q@ #@ #@ #@ #@ #@ #@ #@ #@ Q@ T@ }@ U@ T. V@ W@ X@ Y@ Z@ `@ ' # #@ #@ #@ #@ #@ #@ #@ #@ #@ #@ #@ #@ #@ #@ #@ #@ #@ #@ #@ #@ #@ #@ #@ #@ #@ #@ #@ #@ #@ #@ #@ #@ #@ #@ #@ #@ #@ #@ #@ #@ #@ #@ #@ #@ R@ R@ R@ #@ #@ #@ #@ #@ #@ #@ #@ #@ #@ #@ #@ #@ #@ #@ #@ #@ #@ #@ #@ #@ #@ #@ #@ #@ #@ #@ #@ #@ #@ #@ #@ #@ #@ #@ #@ #@ #@ #@ #@ #@ #@ #@ #@ #@ #@ #@ #@ #@ #@ #@ #@ #@ #@ #@ #@ #@ #@ #@ #@ #@ #@ #@ #@ #@ #@ #@ #@ #@ #@ #@ #@ #@ #@ #@ #@ #@ #@ #@ #@ #@ #@ #@ #@ #@ #@ #@ #@ #@ #@ #@ #@ #@ #@ #@ #@ #@ #@ #@ #@ #@ #@ #@ #@ #@ #@ #@ #@ #@ #@ #@ #@ #@ #@ #@ #@ #@ #@ #@ #@ #@ #@ #@ #@ #@ #@ #@ #@ #@ #@ #@ #@ #@ #@ #@ #@ #@ #@ #@ #@ #@ #@ #@ #@ #@ #@ #@ #@ #@ #@ #@ #@ #@ #@ #@ ", +".# +# @# u@ ## $# %# &# *# =# -# ;# }@ [@ ># ,# z@ '# )# !# ~# {# ]# ^# /# (# _# :# <# [# }# }@ d@ ,# Q@ [@ [@ [@ [@ [@ [@ [@ [@ [@ [@ [@ [@ [@ [@ [@ [@ [@ #@ [@ [@ [@ [@ [@ #@ [@ [@ [@ [@ [@ Q@ H. #@ [@ [@ [@ [@ [@ [@ #@ [@ [@ #@ [@ [@ [@ [@ [@ [@ [@ Q@ #@ 7. }@ |# 1# 2# 3# 4# 5# 6# 7# 8# Q@ [@ [@ [@ [@ [@ [@ [@ [@ [@ [@ [@ [@ [@ [@ [@ [@ [@ [@ [@ [@ [@ [@ [@ [@ [@ [@ [@ [@ [@ [@ [@ [@ [@ [@ [@ [@ [@ [@ Q@ Q@ 9# 0# a# b# a# 0# a# a# a# a# a# a# a# a# 0# S@ S@ S@ 9# Q@ Q@ Q@ Q@ [@ Q@ Q@ [@ [@ [@ [@ [@ [@ [@ [@ [@ [@ [@ [@ [@ [@ [@ [@ [@ [@ [@ [@ [@ [@ [@ [@ [@ [@ [@ [@ [@ [@ [@ [@ [@ [@ [@ [@ [@ [@ [@ [@ [@ [@ [@ [@ [@ [@ [@ [@ [@ [@ [@ [@ [@ [@ [@ [@ [@ [@ [@ [@ [@ [@ [@ [@ [@ [@ [@ [@ [@ [@ [@ [@ [@ [@ [@ [@ [@ [@ [@ [@ [@ [@ [@ [@ [@ [@ [@ [@ [@ [@ [@ [@ [@ [@ [@ [@ [@ [@ [@ [@ [@ [@ [@ [@ [@ [@ [@ [@ [@ [@ [@ [@ [@ [@ [@ [@ [@ [@ [@ [@ [@ [@ [@ [@ [@ [@ [@ [@ [@ [@ [@ [@ [@ [@ [@ [@ ", +"c# d# e# f# g# h# i# j# k# l# m# n# o# p# q# 9# <@ 9# r# s# t# u# v# w# x# y# z# A# B# C# D# E# F# r# G# ># H# 9# 9# 9# 9# 9# 9# 9# 9# 9# 9# 9# 9# 9# 9# Q@ Q@ 9# 9# Q@ 9# 9# 9# 9# 9# 9# 9# 9# I. I# J# I. 9# 9# 9# 9# Q@ 9# 9# 9# 9# Q@ 9# 9# 9# 9# 9# 9# ^+ K# L# M# r# N# O# P# Q# R# S# T# r# # 9# 9# 9# 9# 9# 9# 9# 9# 9# 9# 9# 9# 9# 9# 9# 9# 9# 9# 9# 9# 9# 9# 9# 9# 9# 9# 9# 9# 9# 9# 9# 9# 9# S@ a# b# U# b# 0# #@ B ' ' ' ' ' ' ' ' ' ' ' ' ' ' ' ' ' H. #@ #@ ^+ 9# a# 0# 0# a# b# b# b# b# b# b# 0# 9# 9# 9# 9# 9# 9# 9# 9# 9# 9# 9# 9# 9# 9# 9# 9# 9# 9# 9# 9# 9# 9# 9# 9# 9# 9# 9# 9# 9# 9# 9# 9# 9# 9# 9# 9# 9# 9# 9# 9# 9# 9# 9# 9# 9# 9# 9# 9# 9# 9# 9# 9# 9# 9# 9# 9# 9# 9# 9# 9# 9# 9# 9# 9# 9# 9# 9# 9# 9# 9# 9# 9# 9# 9# 9# 9# 9# 9# 9# 9# 9# 9# 9# 9# 9# 9# 9# 9# 9# 9# 9# 9# 9# 9# 9# 9# 9# 9# 9# 9# 9# 9# 9# 9# 9# 9# 9# 9# 9# 9# 9# 9# 9# 9# 9# 9# 9# 9# 9# 9# 9# 9# 9# 9# 9# 9# 9# 9# ", +"q# V# W# X# Y# Z# }@ `# $ .$ +$ @$ #$ $$ %$ &$ *$ # o@ =$ r# -$ ;$ >$ ,$ '$ )$ !$ ~$ {$ ]$ ^$ /$ ($ r# &$ # ,# _$ _$ _$ _$ _$ _$ _$ _$ _$ _$ _$ _$ S@ ' :$ Q@ <$ [$ ' R@ }$ |$ #@ a# Q@ 1$ #@ 2$ 3$ 4$ ' 1$ S@ a# ' 5$ 6$ 7$ 8$ ' 9$ S@ S@ U# S@ a# Q@ 0$ a$ b$ c$ ' d$ e$ f$ g$ h$ i$ j$ }@ # _$ _$ _$ _$ _$ _$ _$ _$ _$ _$ _$ _$ _$ _$ _$ _$ _$ _$ _$ _$ _$ _$ _$ _$ S@ S@ a# U# U# U# a# _$ k$ ' ' ' ' ' 1$ 0$ l$ m$ n$ o$ p$ q$ r$ s$ t$ u$ v$ w$ x$ y$ z$ A$ B$ C$ 1$ D$ 9$ 9# ' ' ' ' ' ' ' ' ' ' ' Q@ U# a# S@ S@ _$ _$ _$ _$ _$ _$ _$ _$ _$ _$ _$ _$ _$ _$ _$ _$ _$ _$ _$ _$ _$ _$ _$ _$ _$ _$ _$ _$ _$ _$ _$ _$ _$ _$ _$ _$ _$ _$ _$ _$ _$ _$ _$ _$ _$ _$ _$ _$ _$ _$ _$ _$ _$ _$ _$ _$ _$ _$ _$ _$ _$ _$ _$ _$ _$ _$ _$ _$ _$ _$ _$ _$ _$ _$ _$ _$ _$ _$ _$ _$ _$ _$ _$ _$ _$ _$ _$ _$ _$ _$ _$ _$ _$ _$ _$ _$ _$ _$ _$ _$ _$ _$ _$ _$ _$ _$ _$ _$ _$ _$ _$ _$ _$ _$ _$ _$ _$ _$ _$ _$ _$ _$ _$ ", +"E$ G# r# r# }@ F$ G$ H$ *$ I$ J$ K$ L$ M$ N$ O$ P$ q# H$ Q$ R$ +. S$ T$ U$ V$ W$ X$ Y$ Z$ `$ % .% +% @% #% r# S@ M# 9# S@ S@ S@ S@ S@ S@ S@ S@ S@ S@ $% ' %% &% *% =% ' ' -% 0$ ' Q@ a# ' b# ' [$ ;% ' U# ^+ 1$ ' >% ,% '% )% ' [@ [@ 9# ' #@ H. ' b# ' !% ~% ' {% ]% ' ^% /% (% _% :% S@ S@ S@ S@ S@ S@ S@ S@ S@ S@ S@ S@ S@ S@ S@ S@ S@ S@ S@ S@ a# U# $% 1$ U# S@ I. ' ' ' ' ' ^+ |$ <% [% }% |% 1% 2% 3% 4% 5% 6% 7% 8% 8% 9% 8% 0% a% b% c% c% d% e% e% e% f% g% h% i% j% 2$ k% l% m% s$ n% o% p% q% r% &% Q@ ' ' H. S@ U# b# 0# S@ S@ S@ S@ S@ S@ S@ S@ S@ S@ S@ S@ S@ S@ S@ S@ S@ S@ S@ S@ S@ S@ S@ S@ S@ S@ S@ S@ S@ S@ S@ S@ S@ S@ S@ S@ S@ S@ S@ S@ S@ S@ S@ S@ S@ S@ S@ S@ S@ S@ S@ S@ S@ S@ S@ S@ S@ S@ S@ S@ S@ S@ S@ S@ S@ S@ S@ S@ S@ S@ S@ S@ S@ S@ S@ S@ S@ S@ S@ S@ S@ S@ S@ S@ S@ S@ S@ S@ S@ S@ S@ S@ S@ S@ S@ S@ S@ S@ S@ S@ S@ S@ S@ S@ S@ S@ S@ S@ S@ S@ S@ S@ S@ S@ S@ S@ S@ S@ S@ S@ ", +"0# a# s% t% u% v% w% v% v% x% x% y% z% A% B% C% D% E% F% d$ G% H% I% J% K% L% M% N% O% P% Q% R% S% T% U% V% W% F$ X% ]% a# w% 0# 0# 0# 0# 0# 0# 0# 0# D$ ' Y% Z% |% l$ `% & .& +& q% @& ' #& @& ' $& %& B J# |$ U# ' && *& o% =& ' u$ a# @& -& D$ A$ ;& >& a# ,& *& S@ '& )& !& ~& {& ]& ^& /& (& _& 0# 0# 0# 0# 0# 0# 0# 0# 0# 0# 0# 0# 0# a# 1$ 1$ U# Q@ H. ' ' ' ' #@ J# B$ w$ :& <& [& }& |& 9% 1& 2& 3& 6% 8% 4& 5& 6& d% d% |& 3% 7& 8& 8& 9& 9& 0& e% e% 0& e% a& e% 9& 0& e% 0& 8& 9& 0& 9& b& 0& 0& a& c& d& e& f& g& h& i& #@ ' ' #@ b# 1$ U# a# 0# 0# 0# 0# 0# 0# 0# 0# 0# 0# 0# 0# 0# 0# 0# 0# 0# 0# 0# 0# 0# 0# 0# 0# 0# 0# 0# 0# 0# 0# 0# 0# 0# 0# 0# 0# 0# 0# 0# 0# 0# 0# 0# 0# 0# 0# 0# 0# 0# 0# 0# 0# 0# 0# 0# 0# 0# 0# 0# 0# 0# 0# 0# 0# 0# 0# 0# 0# 0# 0# 0# 0# 0# 0# 0# 0# 0# 0# 0# 0# 0# 0# 0# 0# 0# 0# 0# 0# 0# 0# 0# 0# 0# 0# 0# 0# 0# 0# 0# 0# 0# 0# 0# 0# 0# 0# 0# 0# 0# 0# 0# 0# 0# 0# 0# 0# ", +"S@ S@ S@ S@ S@ S@ S@ S@ S@ j& M# x% H# k& l& m& n& o& p& q& r& s& t& u& v& w& w& x& u& y& z& A& B& C& D& E& F& G& H& I& w% J& S@ S@ S@ S@ S@ S@ S@ S@ 1$ ' K& L& M& }% f% *% l% N& 2% O& P& 8& Q& R& <& }$ S& T& U& ' ' V& W& X& Y& =% Z& =% n% `& * .* +* 3$ $& @* *& #* l$ R& $* %* &* ** =* -* ;* >* M# S@ S@ S@ S@ S@ S@ S@ S@ S@ a# U# 1$ [@ ' ' B 9$ &% h& ,* '* f& )* |& 9% V& && !* V& >% 7% a% b% c% ~* ~* c% ~* ~* ~* 5& {* {* 6& d% |& 3% 3% 7& 8& 9& 0& e% e% a& c& d& ]* +* ^* /* (* f% _* )* }& }& :* e& e& :* f% +* (* <* [* -& }* >& H. ' ' #@ U# 1$ U# a# S@ S@ S@ S@ S@ S@ S@ S@ S@ S@ S@ S@ S@ S@ S@ S@ S@ S@ S@ S@ S@ S@ S@ S@ S@ S@ S@ S@ S@ S@ S@ S@ S@ S@ S@ S@ S@ S@ S@ S@ S@ S@ S@ S@ S@ S@ S@ S@ S@ S@ S@ S@ S@ S@ S@ S@ S@ S@ S@ S@ S@ S@ S@ S@ S@ S@ S@ S@ S@ S@ S@ S@ S@ S@ S@ S@ S@ S@ S@ S@ S@ S@ S@ S@ S@ S@ S@ S@ S@ S@ S@ S@ S@ S@ S@ S@ S@ S@ S@ S@ S@ S@ S@ S@ S@ S@ S@ S@ S@ S@ S@ S@ ", +"a# a# a# a# a# a# a# a# a# a# a# |* a# x% |* 1* 2* 3* 4* ~# 5* 6* 7* 8* 9* 0* 0* a* u& b* z& c* d* e* f* g* h* i* j* k* G$ I& _& ]% a# a# a# a# a# a# 1$ ' l* m* n* l% L& @* o* p* q* o$ r* s* t* u* v* ;& *% [* w* ' ' 7& x* 9& 6& y* u$ }$ z* A* B* .& C* a$ D* Q& x$ E* <% F* G* H* I* J* K* L* M* N* _& a# a# a# a# a# a# a# U# D$ a# ' ' O* P* E* 5$ 7& 9% && Q* R* S* T* 3& 6% 9% 4% a% a% a% a% a% U* U* 4& b% b% c% ~* ~* 5& {* {* 6& d% |& 3% 3% 7& 8& 9& 9& 0& e% a& c& c& d& ]* +* +* ^* /* (* f% f% _* )* }& }& e& F* V* i% F* )* (* }& W* X* Y* P& J# ' ' ' Q@ U# 1$ U# a# a# a# a# a# a# a# a# a# a# a# a# a# a# a# a# a# a# a# a# a# a# a# a# a# a# a# a# a# a# a# a# a# a# a# a# a# a# a# a# a# a# a# a# a# a# a# a# a# a# a# a# a# a# a# a# a# a# a# a# a# a# a# a# a# a# a# a# a# a# a# a# a# a# a# a# a# a# a# a# a# a# a# a# a# a# a# a# a# a# a# a# a# a# a# a# a# a# a# a# a# a# a# a# a# a# a# a# a# ", +"U# U# U# U# U# U# U# U# U# U# U# U# U# Z* `* = .= += @= #= $= %= &= *= == -= -= ;= 8* >= ,= '= )= U% != ~= {= ]= ^= /= (= _= (& >* := U# U# U# U# U# U# B @& d% S& j% e% <= [& /* )& [= 2% i& [@ o* }= #& Y* 5& w$ ' #@ h% f% U* |= 1= m$ F* n% p% 2= 3= 4= o* D* a$ 5= E* 6= c% 1= 7= 8= 9= 0= a= b= c= d= e= U# U# U# U# D$ D$ I. ' a# }* W& |= f= f= Q* && V& >% 6% 5% 5% 5% 5% 5% 7% 7% 9% 8% 8% 4% a% a% U* 4& 4& b% c% ~* ~* 5& {* {* 6& d% |& 3% 3% 7& 8& 9& 9& 0& e% a& c& c& d& ]* +* ^* ^* /* (* f% f% _* )* }& :* :* e& F* 5$ V* Y& <* <* i% e& }& 5$ [& y* 7= g= O* B ' H. a# 1$ D$ 1$ U# U# U# U# U# U# U# U# U# U# U# U# U# U# U# U# U# U# U# U# U# U# U# U# U# U# U# U# U# U# U# U# U# U# U# U# U# U# U# U# U# U# U# U# U# U# U# U# U# U# U# U# U# U# U# U# U# U# U# U# U# U# U# U# U# U# U# U# U# U# U# U# U# U# U# U# U# U# U# U# U# U# U# U# U# U# U# U# U# U# U# U# U# U# U# U# U# U# U# U# U# U# U# U# U# ", +"h= h= h= h= h= h= h= h= h= h= h= h= h= a# ]% := i= j= k= l= m= n= o= p= q= r= r= s= t= u= v= w= x= y= E& z= A= B= C= D= E= F= G= H= (& ]% I= U# a# h= U# 1$ ' J= y* X* K= ' m* L= M= B* }& z$ ' N= 3$ O= v$ P= Q= #@ a# E* R= S= %& T= m$ 1% U= <$ V= W= X= Y= Z= Q& [% `= - d& *% m$ .- +- @- #- $- %- (& := U# &- D$ Q@ ' ' z$ w* +* Q* *- S* 3& 1& 1& 3& 1& 1& 1& >% =- =- 6% 5% 5% 7% 9% 9% 8% 4% a% a% U* 4& 4& b% c% ~* ~* 5& {* 6& d% d% |& 3% 7& 7& 8& 9& 0& 0& e% a& c& c& d& ]* +* ^* ^* /* (* f% f% _* )* }& :* e& e& F* 5$ V* i% Y& Y& <* %& -- -- <* V* 5$ )% Y= *% ;- B$ D$ ' ' I. a# 1$ 1$ U# a# h= h= h= h= h= h= h= h= h= h= h= h= h= h= h= h= h= h= h= h= h= h= h= h= h= h= h= h= h= h= h= h= h= h= h= h= h= h= h= h= h= h= h= h= h= h= h= h= h= h= h= h= h= h= h= h= h= h= h= h= h= h= h= h= h= h= h= h= h= h= h= h= h= h= h= h= h= h= h= h= h= h= h= h= h= h= h= h= h= h= h= h= h= h= h= h= h= h= h= h= ", +"U# U# U# U# U# U# U# U# U# U# U# U# U# U# U# U# e= >- i= = ,- '- )- t= !- ~- ~- {- ]- ^- /- ~+ (- _- :- <- [- }- |- 1- 2- 3- 4- 5- 6- 7- X% M# &- U# U# 8- ' 9% 9- n$ 0- 9- a$ V= a- [* W& b- c- Y= * d- e- J= a# 1$ a# E* f- g- h- i- W= O& j- }= :$ O& ,* 2= W= k- ,* }$ 3= V* X* W= l- b$ m- n- o- p- q- r- s- B ' t- p% u- V& v- w- x- 2& V& x- V& V& 2& 3& 3& 1& >% =- =- 6% 5% 5% 7% 9% 9% 8% 4% 4% a% U* 4& b% ~* 5& {* {* 5& c% b% c% d% |& |& 7& 9& 0& e% a& c& d& d& ]* +* +* ^* ^* /* (* (* (* f% _* )* )* }& :* e& F* F* 5$ V* i% Y& g% g% <* )% %& -- y- !% !% -- g% g% !% k% d- ,% z- U# ' B e= D$ e= U# U# U# U# U# U# U# U# U# U# U# U# U# U# U# U# U# U# U# U# U# U# U# U# U# U# U# U# U# U# U# U# U# U# U# U# U# U# U# U# U# U# U# U# U# U# U# U# U# U# U# U# U# U# U# U# U# U# U# U# U# U# U# U# U# U# U# U# U# U# U# U# U# U# U# U# U# U# U# U# U# U# U# U# U# U# U# U# U# U# U# U# U# U# U# U# U# U# U# ", +"$% $% $% $% $% $% $% $% $% $% $% $% $% $% $% $% $% $% 1$ A- B- C- D- E- F- G- G- H- I- J- K- #@ L- M- N- O- P- Q- R- S- T- U- V- W- X- Y- Z- `- J. L- $% 9$ ' o% ; .; L= +; <$ @; %% #; $; }& %; &; g= m% *; (* ' 9$ b# X= `% ;% v$ Z% _* ; w$ =; W= r% -; 9- ;- Z% N& 7= ,& ;; ,% >; ,; '; ); !; ~; {; ]; H. 9# h& [* a% v- ^; S= V& x- T* T* x- x- V& V& 2& 3& 3& 1& >% >% =- 6% 6% 5% 7% 9% 8% 4% U* 4& b% 4& U* 8% 5% =- >% /; b% e% _* /* |& |& 3% (; b% c% ~* c% c% ~* 5& 6& d% |& 7& e% a& a& ]* /* (* (* )* :* e& F* F* F* 5$ 5$ V* i% Y& g% <* <* )% %& -- _; _; y- W* X& :; X& !% -- %& j% q$ %; l$ S@ ' 1$ D$ 1$ $% $% $% $% $% $% $% $% $% $% $% $% $% $% $% $% $% $% $% $% $% $% $% $% $% $% $% $% $% $% $% $% $% $% $% $% $% $% $% $% $% $% $% $% $% $% $% $% $% $% $% $% $% $% $% $% $% $% $% $% $% $% $% $% $% $% $% $% $% $% $% $% $% $% $% $% $% $% $% $% $% $% $% $% $% $% $% $% $% $% $% $% $% $% $% $% $% ", +"e= e= e= e= e= e= e= e= e= e= e= e= e= e= e= e= e= e= e= e= <; [; }; |; 1; 2; 2; 3; 4; 5; 6; #@ 7; 8; 9; 0; a; b; c; d; e; f; g; h; i; j; k; l; m; n; o; I= &- Q@ U# a# #@ Q@ Q@ a# I. Q@ U# [@ #@ Q@ U# ' p; k- ' q; e= Q@ S@ [@ S@ S@ I. D$ ' r; }= ' D$ Q@ S@ Q@ S@ Q@ H. Q@ a# #@ a# U# M# ~+ s; t; u; v; w; x; y; w- T* T* !* && !* !* T* x- x- V& V& 2& 2& 3& 1& >% =- 6% 7% 9% 8% 8% 9% 5% >% 2& x- 2& =- b% ]* )% Y% n$ z; A; B; q; >& e- C; D; ; E; l* F; ,* t$ -& b- j- h- j- U& r* W* x* <* )* e& F* /* +* ]* d& G; e& i% Y& Y& Y& Y& g% <* )% )% %& -- _; y- !% !% W* @* X& :; [& H; [& X& I; @* T= l$ S@ B 1$ J; 1$ e= e= e= e= e= e= e= e= e= e= e= e= e= e= e= e= e= e= e= e= e= e= e= e= e= e= e= e= e= e= e= e= e= e= e= e= e= e= e= e= e= e= e= e= e= e= e= e= e= e= e= e= e= e= e= e= e= e= e= e= e= e= e= e= e= e= e= e= e= e= e= e= e= e= e= e= e= e= e= e= e= e= e= e= e= e= e= e= e= e= e= e= e= e= e= ", +"&- &- &- &- &- &- &- &- &- &- &- &- &- &- &- &- &- &- &- &- K; [; L; M; N; O; O; P; Q; R; S; T; U; V; W; X; Y; (- Z; `; > .> +> @> #> $> %> &> *> => -> (- ;> q; D$ D$ 9$ J; 9$ J; 8- 9$ D$ 9$ 9$ 9$ >> ' Y% }% ' q; &- 9$ 9$ q; J; J; q; 9$ e= a$ [$ ' '& 9$ 9$ 9$ J; 9$ q; 8- q; t- J; B B ,> '> )> !> ~> {> ]> ^> && S= && && !* !* !* T* T* x- x- V& 3& >% =- =- =- 1& V& !* S* S* T* 6% 5& /> [& 8$ +; (> _> t- Q@ ' ' ' I. _$ U# h= #@ :> #@ I. ' ' ' ' ' ' ' ' ' ' I. &- &- U# )& &% <> Q= ; l$ r% w* [> V* /* /* }& i% <* )% )% )% %& -- -- _; y- !% W* W* @* X& :; j% j% [& }> f& f& :; :; y* l$ |> B e= 9$ &- &- &- &- &- &- &- &- &- &- &- &- &- &- &- &- &- &- &- &- &- &- &- &- &- &- &- &- &- &- &- &- &- &- &- &- &- &- &- &- &- &- &- &- &- &- &- &- &- &- &- &- &- &- &- &- &- &- &- &- &- &- &- &- &- &- &- &- &- &- &- &- &- &- &- &- &- &- &- &- &- &- &- &- &- &- &- &- &- &- &- &- &- &- ", +"D$ D$ D$ D$ D$ D$ D$ D$ D$ D$ D$ D$ D$ D$ D$ D$ D$ D$ D$ D$ 1> [; 2> 3> 4> 5> 5> 6> 2; 7> 8> 9> 0> a> b> c> d> L- e> f> g> h> i> j> k> l> m> n> o> p> q> r> s> L- J; t> D$ D$ D$ D$ D$ D$ D$ D$ D$ D$ D$ 1$ `% u> U# D$ D$ D$ D$ D$ D$ D$ 9$ I. v> `= J# U# D$ D$ D$ D$ D$ D$ q; q; #@ ' U# w> Y= x> y> z> A> B> C> D> E> S* S= S= && && !* !* T* T* V& 3& V& S* w- F> R* && 7% 7& V* k% G> T& H> Q= D$ B ' ' ' #@ U# D$ q; q; q; 9$ D$ D$ D$ 9$ 9$ 9$ 9$ q; q; q; q; q; q; q; q; 9$ q; 9$ 1$ 1$ D$ U# S@ S@ S@ I. B ' ' U# @& I> d- J> <* )* )* 5$ <* _; y- _; y- y- !% W* @* X& X& :; j% [& H; H; }> u* Y= [> K> [& '* L> q; B 1$ 9$ D$ D$ D$ D$ D$ D$ D$ D$ D$ D$ D$ D$ D$ D$ D$ D$ D$ D$ D$ D$ D$ D$ D$ D$ D$ D$ D$ D$ D$ D$ D$ D$ D$ D$ D$ D$ D$ D$ D$ D$ D$ D$ D$ D$ D$ D$ D$ D$ D$ D$ D$ D$ D$ D$ D$ D$ D$ D$ D$ D$ D$ D$ D$ D$ D$ D$ D$ D$ D$ D$ D$ D$ D$ D$ D$ D$ D$ D$ D$ D$ D$ D$ D$ D$ D$ D$ D$ D$ D$ D$ D$ D$ ", +"&- &- &- &- &- &- &- &- &- &- &- &- &- &- &- &- &- &- &- M> N> O> P> Q> R> S> S> T> 3> U> V> W> X> Y> Z> `> , ., ;> +, @, #, $, %, &, *, =, -, ;, >, ,, ', ), s> !, ~, ;> &- M> M> &- &- &- &- &- &- &- J; ^+ e= J; &- &- &- &- &- &- &- &- J; |> ' &- J; &- M> &- J; {, |> ' B ], 3= ^, /, (, _, R* && :, <, [, }, |, 1, S* S= && && && T* V& V& S* *- S= 2, W* D* 4$ F; D; 3, R@ ' ' ' k$ |> &- 8- {, {, 8- 8- J; J; &- &- &- &- &- &- &- &- &- &- &- &- &- &- &- &- &- &- M> M> M> J; J; J; J; J; J; J; J; 8- 8- 8- {, J; _$ B ' e= 4, F; t$ U& u- F* 5$ <* y- W* @* @* @* X& :; :; j% [& H; }> }> u* f& Y= Q& B* u* H; <& v$ 8- k$ &- 8- J; &- &- &- &- &- &- &- &- &- &- &- &- &- &- &- &- &- &- &- &- &- &- &- &- &- &- &- &- &- &- &- &- &- &- &- &- &- &- &- &- &- &- &- &- &- &- &- &- &- &- &- &- &- &- &- &- &- &- &- &- &- &- &- &- &- &- &- &- &- &- &- &- &- &- &- &- &- &- &- &- &- &- &- &- &- &- &- &- &- ", +"D$ D$ D$ D$ D$ D$ D$ D$ D$ D$ D$ D$ D$ D$ D$ D$ D$ D$ D$ D$ 5, 6, 7, 8, 9, 0, 0, a, Q> b, c, d, e, f, g, h, i, j, k, 7; l, ' m, n, o, p, q, r, s, t, u, v, w, x, y, z, L- A, B, B, B, J; D$ D$ D$ D$ D$ D$ {, 9$ D$ D$ D$ D$ D$ D$ D$ D$ D$ D$ 9$ >> 9$ D$ D$ D$ '& D$ ' C, 4$ :* w- D, y; R* Q* R* E, F, G, H, I, J, K, L, S= S= && T* x- S= M, f= N, q$ L> 8- ' ' ' ' Q@ 1$ 9$ '& '& {, q; 9$ J; D$ D$ D$ D$ D$ D$ D$ D$ D$ D$ D$ D$ D$ D$ D$ D$ D$ D$ D$ D$ D$ D$ D$ D$ D$ D$ D$ D$ D$ D$ D$ D$ D$ D$ D$ D$ D$ D$ D$ D$ J; 9$ q; {, J; S@ B ' 1$ @& r% w* l% _; i% O, -- @* j% [& [& [& [& H; }> u* f& Y= Y= [> Q& J> P, [> u* z* (> q; I. D$ q; J; D$ D$ D$ D$ D$ D$ D$ D$ D$ D$ D$ D$ D$ D$ D$ D$ D$ D$ D$ D$ D$ D$ D$ D$ D$ D$ D$ D$ D$ D$ D$ D$ D$ D$ D$ D$ D$ D$ D$ D$ D$ D$ D$ D$ D$ D$ D$ D$ D$ D$ D$ D$ D$ D$ D$ D$ D$ D$ D$ D$ D$ D$ D$ D$ D$ D$ D$ D$ D$ D$ D$ D$ D$ D$ D$ D$ D$ D$ D$ D$ D$ D$ D$ D$ D$ D$ D$ ", +"9$ 9$ 9$ 9$ 9$ 9$ 9$ 9$ 9$ 9$ 9$ 9$ 9$ 9$ 9$ 9$ 9$ 9$ 9$ 9$ m; Q, R, S, T, S, S, U, V, W, X, Y, Z, `, ' .' +' @' #' $' '& ' %' &' ' *' =' -' ;' >' ,' '' )' !' ~' {' ]' z, N* N* z, ^' 9$ 9$ 9$ 9$ 9$ 9$ 9$ 9$ 9$ 9$ 9$ 9$ 9$ 9$ 9$ 9$ 9$ 9$ 9$ 9$ 9$ J; q; >> B D$ y* x- D, /' _, R* w- F> w- w- R* (' _' :' <' [' }' |' 1' T* S= *- /, 6% [= 7= J# ' I. D$ '& >> >> '& q; 9$ 9$ 9$ 9$ 9$ 9$ 9$ 9$ 9$ 9$ 9$ 9$ 9$ 9$ 9$ 9$ 9$ 9$ 9$ 9$ 9$ 9$ 9$ 9$ 9$ 9$ 9$ 9$ 9$ 9$ 9$ 9$ 9$ 9$ 9$ 9$ 9$ 9$ 9$ 9$ 9$ 9$ 9$ 9$ 9$ 9$ 9$ 9$ 9$ 9$ 9$ 9$ 9$ q; '& '& 9$ a# k$ k$ q; D; [% o% 2$ @* )% %& W* [& }> u* u* u* f& Y= [> Q& Q& B* J> P, 2$ B* Y= T= 2' q; :> D$ {, 9$ 9$ 9$ 9$ 9$ 9$ 9$ 9$ 9$ 9$ 9$ 9$ 9$ 9$ 9$ 9$ 9$ 9$ 9$ 9$ 9$ 9$ 9$ 9$ 9$ 9$ 9$ 9$ 9$ 9$ 9$ 9$ 9$ 9$ 9$ 9$ 9$ 9$ 9$ 9$ 9$ 9$ 9$ 9$ 9$ 9$ 9$ 9$ 9$ 9$ 9$ 9$ 9$ 9$ 9$ 9$ 9$ 9$ 9$ 9$ 9$ 9$ 9$ 9$ 9$ 9$ 9$ 9$ 9$ 9$ 9$ 9$ 9$ 9$ 9$ 9$ 9$ 9$ 9$ 9$ 9$ 9$ 9$ 9$ 9$ 9$ ", +"3' 3' 3' 3' 3' 3' 3' 3' 3' 3' 3' 3' 3' 3' 3' 3' 3' 3' 3' 3' m; 4' 5' 6' 7' 6' 6' 8' 9' 0' a' |> b' c' d' e' `> f' g' h' i' j' k' l' ' m' n' o' p' q' r' s' t' u' v' w' x' y' z' A' B' N* C' 3' 3' 3' 3' 3' 3' 3' 3' 3' 3' 3' 3' 3' 3' 3' 3' 3' 3' 3' 8- D' e= ' w> |& E' F' F> F> f= f= f= F> F> w- w- G' H' I' J' K' L' M' J= N' S= O' P' 4, ' B &- >> {, 8- 3' 3' 3' 3' 3' 3' 3' 3' 3' 3' 3' 3' 3' 3' 3' 3' 3' 3' 3' 3' 3' 3' 3' 3' 3' 3' 3' 3' 3' 3' 3' 3' 3' 3' 3' 3' 3' 3' 3' 3' 3' 3' 3' 3' 3' 3' 3' 3' 3' 3' 3' 3' 3' 3' 3' 3' 3' 3' 3' 3' 3' 8- 8- {, {, J; |> k$ :> {, B$ l* b- h- [& y- W* u* Y= Y= Y= [> Q& B* J> l% l% P, 2$ o$ l% Q& y* Q' {, R' J; {, 8- 3' 3' 3' 3' 3' 3' 3' 3' 3' 3' 3' 3' 3' 3' 3' 3' 3' 3' 3' 3' 3' 3' 3' 3' 3' 3' 3' 3' 3' 3' 3' 3' 3' 3' 3' 3' 3' 3' 3' 3' 3' 3' 3' 3' 3' 3' 3' 3' 3' 3' 3' 3' 3' 3' 3' 3' 3' 3' 3' 3' 3' 3' 3' 3' 3' 3' 3' 3' 3' 3' 3' 3' 3' 3' 3' 3' 3' 3' 3' 3' 3' 3' 3' ", +"8- 8- 8- 8- 8- 8- 8- 8- 8- 8- 8- 8- 8- 8- 8- 8- 8- 8- 8- 8- S' Q, T' U' V' U' U' W' X' Y' a' w% q; ^' Z' c' d' `' ) .) +) @) #) $) %) &) *) =) -) ;) >) ,) ') )) !) ~) {) ]) ^) /) () _) N* :) 8- 8- 8- 8- 8- 8- 8- 8- 8- 8- 8- 8- 8- 8- 8- 8- 9$ >> '& ' 0$ [= <) (, F> *- *- *- _, _, f= f= F> w- w- w- [) D> }) |) 1) 2) 3) 4) A; Q@ ' a# O* O* q; 8- 8- 8- 8- 8- 8- 8- 8- 8- 8- 8- 8- 8- 8- 8- 8- 8- 8- 8- 8- 8- 8- 8- 8- 8- 8- 8- 8- 8- 8- 8- 8- 8- 8- 8- 8- 8- 8- 8- 8- 8- 8- 8- 8- 8- 8- 8- 8- 8- 8- 8- 8- 8- 8- 8- 8- 8- 8- 8- 8- 8- 8- 8- 8- 8- 8- 8- 8- 8- {, '& '& 9$ |> I. :> {, B$ r% o% }> @* Y= Q& Q& Q& B* J> l% P, k% k% 2$ o$ #* 2$ J> *% Z% '& R@ D$ '& q; 8- 8- 8- 8- 8- 8- 8- 8- 8- 8- 8- 8- 8- 8- 8- 8- 8- 8- 8- 8- 8- 8- 8- 8- 8- 8- 8- 8- 8- 8- 8- 8- 8- 8- 8- 8- 8- 8- 8- 8- 8- 8- 8- 8- 8- 8- 8- 8- 8- 8- 8- 8- 8- 8- 8- 8- 8- 8- 8- 8- 8- 8- 8- 8- 8- 8- 8- 8- 8- 8- 8- 8- 8- 8- 8- 8- 8- 8- 8- 8- 8- ", +"q; q; q; q; q; q; q; q; q; q; q; q; q; q; q; q; q; q; q; q; 5) 6) 7) 8) 9) 8) 8) 0) a) b) c) a# d) q; q; e) f) g) h) i) j) k) l) m) n) o) p) q) r) s) t) u) v) w) x) y) z) A) B) C) D) E) F) G) f) q; q; q; q; q; q; q; q; q; q; q; q; q; 8- {, 3, Q@ #@ c- x- H) *- f= J= J= *- *- _, f= f= f= F> w- I) S* F> <) _, J) K) L) M) ' N) >> J# '& q; q; q; q; q; q; q; q; q; q; q; q; q; q; q; q; q; q; q; q; q; q; q; q; q; q; q; q; q; q; q; q; q; q; q; q; q; q; q; q; q; q; q; q; q; q; q; q; q; q; q; q; q; q; q; q; q; q; q; q; q; q; q; q; q; q; q; q; q; q; q; q; q; q; q; {, '& >> >> 8- h= R@ R@ 6$ r$ f& j% Q& J> J> J> l% P, k% 2$ W& o$ o$ #* q$ o$ O) U= Z% P) _$ J; >> {, q; q; q; q; q; q; q; q; q; q; q; q; q; q; q; q; q; q; q; q; q; q; q; q; q; q; q; q; q; q; q; q; q; q; q; q; q; q; q; q; q; q; q; q; q; q; q; q; q; q; q; q; q; q; q; q; q; q; q; q; q; q; q; q; q; q; q; q; q; q; q; q; q; q; q; q; q; q; q; ", +"8- 8- 8- 8- 8- 8- 8- 8- 8- 8- 8- 8- 8- 8- 8- 8- 8- 8- 8- 8- 5) 6) Q) R) S) R) R) T) U) V) W) X) d) 8- 8- 8- 8- Z' Y) Z) `) ! .! +! @! #! $! %! &! G) *! =! -! ;! >! ,! '! )! !! ~! {! ]! ^! /! f) 8- 8- 8- 8- 8- 8- 8- 8- 8- 8- 8- 8- 8- t- 8- ' (! _! :! > >> h= R@ D; -& [> H; J> P, P, k% k% 2$ W& o$ h- #* #* q$ M& #* W& 7! [% 8! _$ J; >> {, 8- 8- 8- 8- 8- 8- 8- 8- 8- 8- 8- 8- 8- 8- 8- 8- 8- 8- 8- 8- 8- 8- 8- 8- 8- 8- 8- 8- 8- 8- 8- 8- 8- 8- 8- 8- 8- 8- 8- 8- 8- 8- 8- 8- 8- 8- 8- 8- 8- 8- 8- 8- 8- 8- 8- 8- 8- 8- 8- 8- 8- 8- 8- 8- 8- 8- 8- 8- 8- 8- 8- 8- 8- 8- 8- 8- 8- ", +"{, {, {, {, {, {, {, {, {, {, {, {, {, {, {, {, {, {, {, {, 9! 0! a! b! c! d! d! e! f! g! c) h! >> {, {, {, {, {, {, !& {, i! l, j! k! l! m! n! o! b' p! q! r! s! t! u! v! w! x! y! z! A! B! C! {, {, {, {, {, {, {, {, {, {, {, {, O* 3, B J# R& /, D! *- J= v- J= v- J= *- J= *- _, w- F> y; D, *- ]* G> C; B E! r- F! G! H! I! J! K! {, {, {, {, {, {, {, {, {, {, {, {, {, {, {, {, {, {, {, {, {, {, {, {, {, {, {, {, {, {, {, {, {, {, {, {, {, {, {, {, {, {, {, {, {, {, {, {, {, {, {, {, {, {, {, {, {, {, {, {, {, {, {, {, {, {, {, {, {, {, {, {, {, {, {, {, {, {, {, {, {, {, {, {, {, >> t- e= _$ 6$ [$ B* u* P, W& 2$ W& o$ o$ h- #* |% q$ q$ M& $& S& L! 0- l* 8! _$ 8- >> {, {, {, {, {, {, {, {, {, {, {, {, {, {, {, {, {, {, {, {, {, {, {, {, {, {, {, {, {, {, {, {, {, {, {, {, {, {, {, {, {, {, {, {, {, {, {, {, {, {, {, {, {, {, {, {, {, {, {, {, {, {, {, {, {, {, {, {, {, {, {, {, {, {, {, {, ", +">> >> >> >> >> >> >> >> >> >> >> >> >> >> >> >> >> >> >> >> M! N! O! P! Q! R! R! S! d! T! U! U# V! >> >> >> >> >> >> >> >> C! d) @, W! X! Y! Z! `! ~ .~ +~ q! @~ #~ $~ %~ &~ *~ =~ -~ ;~ >~ ,~ '~ d) >> >> >> >> >> >> >> '& >> P) e= B m$ g- )~ F' *- /, /, v- J= v- J= J= J= f= J= !~ ~~ 4& D* {~ e= ' e= 3, ]~ ^~ /~ (~ _~ :~ 5, D' >> >> >> >> >> >> >> >> >> >> >> >> >> >> >> >> >> >> >> >> >> >> >> >> >> >> >> >> >> >> >> >> >> >> >> >> >> >> >> >> >> >> >> >> >> >> >> >> >> >> >> >> >> >> >> >> >> >> >> >> >> >> >> >> >> >> >> >> >> >> >> >> >> >> >> >> >> >> >> >> >> >> >> >> >> >> >> t- t- e= |> D; #& l% [> 2$ h- o$ h- #* #* |% q$ S& M& M& n* z* $& |% <~ l* [~ e= t- >> >> >> >> >> >> >> >> >> >> >> >> >> >> >> >> >> >> >> >> >> >> >> >> >> >> >> >> >> >> >> >> >> >> >> >> >> >> >> >> >> >> >> >> >> >> >> >> >> >> >> >> >> >> >> >> >> >> >> >> >> >> >> >> >> >> >> >> >> >> >> >> >> >> >> ", +"}~ }~ }~ }~ }~ }~ }~ }~ }~ }~ }~ }~ }~ }~ }~ }~ }~ }~ }~ }~ |~ 0! 1~ 2~ 3~ 4~ 4~ 5~ R! 6~ U! h! V! }~ }~ }~ }~ }~ }~ }~ }~ {, f) C! 7~ p! 8~ 9~ 0~ a~ b~ c~ d~ e~ f~ g~ h~ i~ j~ k~ l~ m~ n~ o~ p~ f) {, }~ }~ }~ }~ }~ {, 3, >> ' q~ r~ D! D, *- /, /, v- /, v- v- J= v- _, f= !~ s~ m* m$ >> ' _$ D' P) t- }~ {, t~ u~ v~ _~ w~ x~ y~ t~ {, }~ }~ }~ }~ }~ }~ }~ }~ }~ }~ }~ }~ }~ }~ }~ }~ }~ }~ }~ }~ }~ }~ }~ }~ }~ }~ }~ }~ }~ }~ }~ }~ }~ }~ }~ }~ }~ }~ }~ }~ }~ }~ }~ }~ }~ }~ }~ }~ }~ }~ }~ }~ }~ }~ }~ }~ }~ }~ }~ }~ }~ }~ }~ }~ }~ }~ }~ }~ }~ }~ }~ }~ }~ }~ }~ }~ }~ }~ }~ }~ }~ }~ }~ }~ }~ }~ {, t- t- e= |> D; z~ k% Q& W& |% #* |% q$ q$ S& M& $& n* G* z* T= z* q$ <= A~ |> t- >> {, }~ }~ }~ }~ }~ }~ }~ }~ }~ }~ }~ }~ }~ }~ }~ }~ }~ }~ }~ }~ }~ }~ }~ }~ }~ }~ }~ }~ }~ }~ }~ }~ }~ }~ }~ }~ }~ }~ }~ }~ }~ }~ }~ }~ }~ }~ }~ }~ }~ }~ }~ }~ }~ }~ }~ }~ }~ }~ }~ }~ }~ }~ }~ }~ }~ }~ }~ }~ }~ }~ }~ }~ ", +">> >> >> >> >> >> >> >> >> >> >> >> >> >> >> >> >> >> >> >> B~ N! C~ D~ E~ F~ F~ G~ 4~ H~ I~ J~ t- >> >> >> >> >> >> >> >> >> >> >> K~ L~ M~ N~ O~ P~ Q~ R~ S~ T~ U~ V~ W~ X~ Y~ Z~ `~ { .{ +{ @{ 5! D' >> >> >> >> t- [~ Q@ U# w* w- #{ /, v- F' /, /, /, v- /, v- J= f= > P) 3, D' >> >> >> >> D' D' p~ &{ *{ ={ -{ '& K~ >> >> >> >> >> >> >> >> >> >> >> >> >> >> >> >> >> >> >> >> >> >> >> >> >> >> >> >> >> >> >> >> >> >> >> >> >> >> >> >> >> >> >> >> >> >> >> >> >> >> >> >> >> >> >> >> >> >> >> >> >> >> >> >> >> >> >> >> >> >> >> >> >> >> >> >> >> >> >> >> >> >> >> >> >> >> >> >> >> t- 3, &- h= 6$ X= q$ J> #* S& q$ S& M& $& $& n* G* z* z* T= y* G* z* h& h= >> ;{ >> >> >> >> >> >> >> >> >> >> >> >> >> >> >> >> >> >> >> >> >> >> >> >> >> >> >> >> >> >> >> >> >> >> >> >> >> >> >> >> >> >> >> >> >> >> >> >> >> >> >> >> >> >> >> >> >> >> >> >> >> >> >> >> >> >> >> >> >> >> >> >> ", +"O* O* O* O* O* O* O* O* O* O* O* O* O* O* O* O* O* O* O* t- >{ ,{ '{ ){ !{ ~{ ~{ {{ F~ ]{ ^{ 1$ /{ O* O* O* O* O* O* O* O* O* O* O* O* O* K~ L~ ({ N~ _{ :{ <{ [{ }{ |{ 1{ 2{ 3{ 4{ 5{ 6{ 7{ 8{ 9{ 0{ a{ V! O* O* [~ {, ' v$ 3% )~ <) J= F' y; F' /, F' /, v- /, *- *- E' >% 9- R@ U# [~ P) t- O* O* O* O* O* O* O* O* L~ b{ c{ d{ e{ f{ g{ a{ O* O* O* O* O* O* O* O* O* O* O* O* O* O* O* O* O* O* O* O* O* O* O* O* O* O* O* O* O* O* O* O* O* O* O* O* O* O* O* O* O* O* O* O* O* O* O* O* O* O* O* O* O* O* O* O* O* O* O* O* O* O* O* O* O* O* O* O* O* O* O* O* O* O* O* O* O* O* O* O* O* O* O* O* O* O* O* O* O* O* O* J# 3, J; |> <> <$ M& k% q$ $& M& $& n* G* G* z* h{ T= h{ m% h{ S& i{ >> J; 3, >> O* O* O* O* O* O* O* O* O* O* O* O* O* O* O* O* O* O* O* O* O* O* O* O* O* O* O* O* O* O* O* O* O* O* O* O* O* O* O* O* O* O* O* O* O* O* O* O* O* O* O* O* O* O* O* O* O* O* O* O* O* O* O* O* O* O* O* O* O* O* ", +"D' D' D' D' D' D' D' D' D' D' D' D' D' D' D' D' D' D' D' D' j{ k{ l{ m{ n{ o{ o{ p{ ~{ q{ ^{ &- r{ D' D' D' D' D' D' D' D' D' D' D' D' D' D' D' 5! a{ s{ t{ u{ v{ w{ x{ y{ z{ A{ B{ C{ D{ E{ F{ G{ H{ I{ a{ J{ P) B K{ a$ (, L{ v- y; y; F' y; F' /, /, F' v- _, D, (, :$ M{ k$ P) J{ D' D' D' D' D' D' D' D' D' D' D' D' a{ N{ O{ P{ Q{ R{ S{ 5! D' D' D' D' D' D' D' D' D' D' D' D' D' D' D' D' D' D' D' D' D' D' D' D' D' D' D' D' D' D' D' D' D' D' D' D' D' D' D' D' D' D' D' D' D' D' D' D' D' D' D' D' D' D' D' D' D' D' D' D' D' D' D' D' D' D' D' D' D' D' D' D' D' D' D' D' D' D' D' D' D' D' D' D' D' D' D' D' D' D' D' D' ;{ J{ 8- T{ <> 7= n* W& M& G* G* G* z* h{ h{ h{ T= h{ h{ T= U{ s$ V{ W{ J{ t- D' D' D' D' D' D' D' D' D' D' D' D' D' D' D' D' D' D' D' D' D' D' D' D' D' D' D' D' D' D' D' D' D' D' D' D' D' D' D' D' D' D' D' D' D' D' D' D' D' D' D' D' D' D' D' D' D' D' D' D' D' D' D' D' D' D' D' D' D' ", +";{ ;{ ;{ ;{ ;{ ;{ ;{ ;{ ;{ ;{ ;{ ;{ ;{ ;{ ;{ ;{ ;{ ;{ ;{ ;{ j{ X{ Y{ Z{ `{ ] ] .] +] @] #] $] 3, ;{ ;{ ;{ ;{ ;{ ;{ ;{ ;{ ;{ ;{ ;{ ;{ ;{ ;{ ;{ ;{ ;{ %] &] *] T. =] -] ;] >] &] @~ ,] '] )] !] ~] {] ]] ^] /] _$ (] 1& _] P* z* h- n* h{ h{ h{ T= h{ T= h{ z* h{ T= S& m% ; e= 3, 3, t- ;{ ;{ ;{ ;{ ;{ ;{ ;{ ;{ ;{ ;{ ;{ ;{ ;{ ;{ ;{ ;{ ;{ ;{ ;{ ;{ ;{ ;{ ;{ ;{ ;{ ;{ ;{ ;{ ;{ ;{ ;{ ;{ ;{ ;{ ;{ ;{ ;{ ;{ ;{ ;{ ;{ ;{ ;{ ;{ ;{ ;{ ;{ ;{ ;{ ;{ ;{ ;{ ;{ ;{ ;{ ;{ ;{ ;{ ;{ ;{ ;{ ;{ ;{ ;{ ;{ ;{ ;{ ", +"3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 7] X{ 8] 9] 0] a] a] b] ] c] d] D$ e] 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, ]~ |] f] g] h] i] j] k] l] m] n] o] p] !] q] r] s] I& t] 2% u] v] /, > R@ 8! P) t- 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, /{ w] x] y] z] A] B] C] D] 3, /{ 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, P) {, e= <> m$ T= q$ z* m% h{ T= h{ z* h{ z* G* h{ n* q$ 5= J; >> P) t- 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, ", +";{ ;{ ;{ ;{ ;{ ;{ ;{ ;{ ;{ ;{ ;{ ;{ ;{ ;{ ;{ ;{ ;{ ;{ ;{ E] F] G] H] I] J] K] K] L] a] M] #] J; N] ;{ ;{ ;{ ;{ ;{ ;{ ;{ ;{ ;{ ;{ ;{ ;{ ;{ ;{ ;{ ;{ ;{ ;{ w] O] |] P] Q] R] S] T] U] J{ V] W] X] Y] Z] `] ^ .^ +^ y; ^ v= ;; 7! $& m% T= h{ z* z* z* z* G* G* G* #* P' ,^ M> ;^ E] ;{ ;{ ;{ ;{ ;{ ;{ ;{ ;{ ;{ ;{ ;{ ;{ ;{ ;{ ;{ ;{ ;{ ;{ ;{ ;{ ;{ ;{ ;{ ;{ ;{ ;{ ;{ ;{ ;{ ;{ ;{ ;{ ;{ ;{ ;{ ;{ ;{ ;{ ;{ ;{ ;{ ;{ ;{ ;{ ;{ ;{ ;{ ;{ ;{ ;{ ;{ ;{ ;{ ;{ ;{ ;{ ;{ ;{ ;{ ;{ ;{ ;{ ;{ ;{ ;{ ", +"3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, '^ )^ !^ ~^ {^ ]^ ]^ ^^ /^ (^ d] `) P) 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, _^ ]~ :^ =^ <^ [^ }^ |^ 1^ 2^ 3^ 4^ 5^ 6^ 7^ 8^ 9^ 0^ a^ <) ~~ >^ K{ P) 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, b^ c^ d^ e^ f^ g^ h^ i^ j^ b^ 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, P) [~ >> &- <> u$ S& h{ h{ z* z* G* z* G* n* G* z* h- k^ l^ >^ ;^ P) 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, ", +"P) _^ m^ P) P) P) P) P) P) P) P) P) P) P) P) P) P) P) P) P) n^ )^ o^ p^ q^ ~^ ~^ r^ s^ t^ u^ 8- v^ P) P) P) P) P) P) P) P) P) P) P) P) P) P) P) P) P) P) P) N] P) w^ x^ y^ z^ A^ B^ C^ D^ E^ F^ G^ H^ I^ J^ K^ L^ <) ~~ <) ~~ > U^ <] $& G* T= G* z* G* n* G* n* $& G* q$ S& Q' J; 3, [~ J{ P) P) P) P) P) P) P) P) P) P) P) P) P) P) P) P) P) P) P) P) P) P) P) P) P) P) P) P) P) P) P) P) P) P) P) P) P) P) P) P) P) P) P) P) P) P) P) P) P) P) P) P) P) P) P) P) P) P) P) P) P) P) ", +";^ V^ W^ X^ m] ;^ Y^ ;^ ;^ ;^ ;^ ;^ ;^ ;^ ;^ ;^ ;^ ;^ ;^ ;^ n^ Z^ `^ / ./ p^ p^ +/ @/ #/ $/ 8- v^ ;^ ;^ ;^ ;^ ;^ ;^ ;^ ;^ ;^ ;^ ;^ ;^ ;^ ;^ ;^ ;^ ;^ ;^ ;^ ;^ ;^ ;^ b^ N] J{ %/ &/ */ =/ B -/ ;/ >/ ,/ '/ )/ !/ ~/ a^ <) ~~ ~~ /, ~~ {/ Z& <] ]/ }~ ,^ ;^ ^/ ;^ ;^ ;^ ;^ ;^ ;^ ;^ ;^ ;^ ;^ ;^ ;^ ;^ ;^ ;^ ;^ ;^ ;^ ;^ ;^ ;^ ;^ b^ // (/ _/ :/ #^ m% S& h{ G* n* G* n* $& n* $& n* M& o$ ,* J{ }~ [] J{ ;^ ;^ ;^ ;^ ;^ ;^ ;^ ;^ ;^ ;^ ;^ ;^ ;^ ;^ ;^ ;^ ;^ ;^ ;^ ;^ ;^ ;^ ;^ ;^ ;^ ;^ ;^ ;^ ;^ ;^ ;^ ;^ ;^ ;^ ;^ ;^ ;^ ;^ ;^ ;^ ;^ ;^ ;^ ;^ ;^ ;^ ;^ ;^ ;^ ;^ ;^ ;^ ;^ ;^ ;^ ;^ ;^ ;^ ;^ ;^ ;^ ", +"3/ 4/ 5/ 6/ 7/ 8/ 8/ ;^ ;^ ;^ ;^ ;^ ;^ ;^ ;^ ;^ ;^ ;^ ;^ ;^ 9/ 0/ a/ b/ c/ / / d/ e/ f/ g/ q; [~ ;^ ;^ ;^ ;^ ;^ ;^ ;^ ;^ ;^ ;^ ;^ ;^ ;^ ;^ ;^ ;^ ;^ ;^ ;^ ;^ ;^ ;^ P) h/ i/ j/ k/ l/ m/ n/ o/ p/ q/ r/ s/ t/ u/ v/ ~/ a^ w/ F' P= C, 8! P) ;^ ;^ ;^ ;^ ;^ ;^ ;^ ;^ ;^ ;^ ;^ ;^ ;^ ;^ ;^ ;^ ;^ ;^ ;^ ;^ ;^ ;^ ;^ ;^ 8/ x/ y/ z/ A/ B/ C/ D/ E/ &] F/ ;^ ;^ ;^ ;^ ;^ ;^ ;^ ;^ ;^ ;^ ;^ ;^ ;^ ;^ ;^ ;^ ;^ ;^ ;^ ;^ ;^ ;^ ;^ ;^ ;^ ;^ ;^ ;^ ;^ ;^ ;^ ;^ ;^ ;^ ;^ ;^ ;^ ;^ ;^ ;^ ;^ ;^ ;^ ;^ ;^ ;^ ;^ ;^ ;^ ;^ ;^ ;^ ;^ ;^ ;^ ;^ ;^ ;^ ;^ ;^ ;^ ;^ ;^ ;^ ;^ ;^ ;^ ;^ ;^ ;^ ;^ ;^ ;^ ;^ ;^ ;^ ;^ ;^ ;^ ;^ ;^ ;^ ;^ ;^ ;^ ;^ ;^ ;^ ;^ ;^ ;^ ;^ ;^ ;^ ;^ ;^ ;^ ;^ ;^ ;^ [~ 8! 8- @& K& |% z* G* n* n* $& n* $& M& $& $& W& G/ z$ J; 8! [~ P) ;^ ;^ ;^ ;^ ;^ ;^ ;^ ;^ ;^ ;^ ;^ ;^ ;^ ;^ ;^ ;^ ;^ ;^ ;^ ;^ ;^ ;^ ;^ ;^ ;^ ;^ ;^ ;^ ;^ ;^ ;^ ;^ ;^ ;^ ;^ ;^ ;^ ;^ ;^ ;^ ;^ ;^ ;^ ;^ ;^ ;^ ;^ ;^ ;^ ;^ ;^ ;^ ;^ ;^ ;^ ;^ ;^ ;^ ;^ ", +"H/ I/ J/ K/ L/ M/ h/ [~ [~ [~ [~ [~ [~ [~ [~ [~ [~ [~ [~ [~ N/ O/ P/ Q/ R/ S/ S/ T/ U/ V/ W/ {, X/ [~ [~ [~ [~ [~ [~ [~ [~ [~ [~ [~ [~ [~ [~ [~ [~ [~ [~ [~ [~ [~ [~ [~ v^ Y/ Z/ `/ ( .( +( @( #( $( %( &( *( =( -( ;( >( ,( {/ '( )( N^ ;^ ,^ ;^ [~ [~ [~ [~ [~ [~ [~ [~ [~ [~ [~ [~ [~ [~ [~ [~ [~ [~ [~ [~ [~ [~ [~ [~ [~ [~ [] !( ~( {( ]( ^( /( (( _( :( <( [~ [~ [~ [~ [~ [~ [~ [~ [~ [~ [~ [~ [~ [~ [~ [~ [~ [~ [~ [~ [~ [~ [~ [~ [~ [~ [~ [~ [~ [~ [~ [~ [~ [~ [~ [~ [~ [~ [~ [~ [~ [~ [~ [~ [~ [~ [~ [~ [~ [~ [~ [~ [~ [~ [~ [~ [~ [~ [~ [~ [~ [~ [~ [~ [~ [~ [~ [~ [~ [~ [~ [~ [~ [~ [~ [~ [~ [~ [~ [~ [~ [~ [~ [~ [~ [~ [~ [~ [~ [~ [~ [~ [~ [~ [~ [~ [~ [~ [~ [~ [~ ;^ [( ;{ J{ }( |% n* G* $& n* $& M& $& M& S& $& L! G* {~ |( [] [] ;^ [~ [~ [~ [~ [~ [~ [~ [~ [~ [~ [~ [~ [~ [~ [~ [~ [~ [~ [~ [~ [~ [~ [~ [~ [~ [~ [~ [~ [~ [~ [~ [~ [~ [~ [~ [~ [~ [~ [~ [~ [~ [~ [~ [~ [~ [~ [~ [~ [~ [~ [~ [~ [~ [~ [~ [~ [~ [~ ", +"1( 2( 3( 4( 5( 6( 7( 6/ v^ [~ [~ [~ [~ [~ [~ [~ [~ [~ [~ [~ N/ O/ 8( 9( 0( a( a( b( c( d( W/ {, X/ [~ [~ [~ [~ [~ [~ [~ [~ [~ [~ [~ [~ [~ [~ [~ [~ [~ [~ [~ [~ [~ [~ [~ ;^ [] e( f( g( h( i( j( k( ~/ l( m( n( o( p( q( r( I) s( >^ M> t( [] ;^ [~ [~ [~ [~ [~ [~ [~ [~ [~ [~ [~ [~ [~ [~ [~ [~ [~ [~ [~ [~ [~ [~ [~ [~ [~ [~ [~ [~ e( u( v( w( x( y( z( A( )& B( [~ [~ [~ [~ [~ [~ [~ [~ [~ [~ [~ [~ [~ [~ [~ [~ [~ [~ [~ [~ [~ [~ [~ [~ [~ [~ [~ [~ [~ [~ [~ [~ [~ [~ [~ [~ [~ [~ [~ [~ [~ [~ [~ [~ [~ [~ [~ [~ [~ [~ [~ [~ [~ [~ [~ [~ [~ [~ [~ [~ [~ [~ [~ [~ [~ [~ [~ [~ [~ [~ [~ [~ [~ [~ [~ [~ [~ [~ [~ [~ [~ [~ [~ [~ [~ [~ [~ [~ [~ [~ [~ [~ [~ [~ [~ [~ [~ [~ [~ [~ [~ [~ ;^ 8! ;^ C( D( n* q$ G* $& M& $& M& S& M& S& M& |% o$ z; D' J{ [( ;^ [~ [~ [~ [~ [~ [~ [~ [~ [~ [~ [~ [~ [~ [~ [~ [~ [~ [~ [~ [~ [~ [~ [~ [~ [~ [~ [~ [~ [~ [~ [~ [~ [~ [~ [~ [~ [~ [~ [~ [~ [~ [~ [~ [~ [~ [~ [~ [~ [~ [~ [~ [~ [~ [~ [~ [~ [~ ", +"E( F( G( H( I( J( K( L( M( N( [] [] [] [] [] [] [] [] [] [] O( P( Q( R( S( T( T( U( V( W( X( >> [( [] [] [] [] [] [] [] [] [] [] [] [] [] [] [] [] [] [] [] [] [] [] [] K{ C, Y( Z( `( _ ._ +_ @_ #_ F' $_ %_ &_ *_ =_ -_ ;_ >_ ,^ ,^ [] [] [] [] [] [] [] [] [] [] [] [] [] [] [] [] [] [] [] [] [] [] [] [] [] [] [] [] [] [] [] [] <( ,_ '_ )_ !_ ~_ {_ ]_ <( [] [] [] [] [] [] [] [] [] [] [] [] [] [] [] [] [] [] [] [] [] [] [] [] [] [] [] [] [] [] [] [] [] [] [] [] [] [] [] [] [] [] [] [] [] [] [] [] [] [] [] [] [] [] [] [] [] [] [] [] [] [] [] [] [] [] [] [] [] [] [] [] [] [] [] [] [] [] [] [] [] [] [] [] [] [] [] [] [] [] [] [] [] [] [] [] [] [] [] [] [] [] [] [] 8! K{ U^ l^ ^_ /_ n* $& M& M& S& M& S& q$ S& S& P, (_ M{ >> ,^ [] [] [] [] __ :_ <_ [] [] [] [] [] [] [] [] [] [] [] [] [] [] [] [] [] [] [] [] [] [] [] [] [] [] [] [] [] [] [] [] [] [] [] [] [] [] [] [] [] [] [] [] [] [] [] [] [] [] ", +"[_ }_ |_ 1_ 2_ 3_ 4_ 5_ 6_ 7_ 8_ <( N( [( [( [( [( [( [( [( 9_ 0_ a_ b_ c_ d_ d_ e_ f_ g_ X( >> h_ [( [( [( [( [( [( [( [( [( [( [( [( [( [( [( [( [( [( [( [( [( [] ,^ i_ N^ :$ j_ k_ l_ m_ n_ o_ p_ q_ r_ s_ t_ u_ v_ w_ x_ y_ z_ [] [( [( [( [( [( [( [( [( [( [( [( [( [( [( [( [( [( [( [( [( [( [( [( [( [( [( [( [( [( [( [( [( X/ <( A_ B_ C_ D_ E_ F_ X/ N( [( [( [( [( [( [( [( [( [( [( [( [( [( [( [( [( [( [( [( [( [( [( [( [( [( [( [( [( [( [( [( [( [( [( [( [( [( [( [( [( [( [( [( [( [( [( [( [( [( [( [( [( [( [( [( [( [( [( [( [( [( [( [( [( [( [( [( [( [( [( [( [( [( [( [( [( [( [( [( [( [( [( [( [( [( [( [( [( [( [( [( [( [( [( [( [( [( [( [( [( [( [( [( i_ [( ,^ D' ,^ 4$ G_ $& $& S& M& S& q$ S& q$ q$ S& 2$ T= H_ 3' ,^ [( [] 8_ I_ J_ K_ 8_ L_ [( [( [( [( [( [( [( [( [( [( [( [( [( [( [( [( [( [( [( [( [( [( [( [( [( [( [( [( [( [( [( [( [( [( [( [( [( [( [( [( [( [( [( [( [( [( [( [( ", +"M_ N_ O_ P_ Q_ R_ S_ T_ U_ V_ 6_ W_ A_ 8_ <( N( [( [( [( [( 9_ 0_ X_ Y_ Z_ `_ `_ : .: +: X( >> h_ [( [( [( [( [( [( [( [( [( [( [( [( [( [( [( [( [( [( [( [( [] ,^ J{ D' @: #: $: %: &: *: =: -: ;: >: ,: ': ): !: ~: {: ]: F_ A_ N( X/ [( [( [( [( [( [( [( [( [( [( [( [( [( [( [( [( [( [( [( [( [( [( [( [( [( [( [( [( [( [( [( [( X/ ^: z_ <( /: (: _: ]_ z_ 8! [( [( [( [( [( [( [( [( [( [( [( [( [( [( [( [( [( [( [( [( [( [( [( [( [( [( [( [( [( [( [( [( [( [( [( [( [( [( [( [( [( [( [( [( [( [( [( [( [( [( [( [( [( [( [( [( [( [( [( [( [( [( [( [( [( [( [( [( [( [( [( [( [( [( [( [( [( [( [( [( [( [( [( [( [( [( [( [( [( [( [( [( [( [( [( [( [( [( [( [( [( [( [( [( [] ,^ ;^ D' :: |% |% $& S& q$ S& q$ |% q$ |% q$ W& #* <: [: [] }: |: 1: 2: 3: 4: 8_ [( [( [( [( [( [( [( [( [( [( [( [( [( [( [( [( [( [( [( [( [( [( [( [( [( [( [( [( [( [( [( [( [( [( [( [( [( [( [( [( [( [( [( [( [( [( [( [( ", +"5: 6: 7: 8: 9: 0: a: b: c: d: e: f: g: h: i: j: k: }: l: [( m: n: o: p: q: r: r: s: t: u: v: t- ,^ [( [( [( [( [( [( [( [( [( [( [( [( [( [( [( [( [( [( [( [( t( [] D' /> w: ~~ /' /' ,( @_ x: y: z: A: B: C: D: E: F: G: H: I: J: k: [( [( [( [( [( [( [( [( [( [( [( [( [( [( [( [( [( [( [( [( [( [( [( [( [( [( [( [( [( [( [( [( [( [( [( K: L: M: N: O: l: h_ l: [( [( [( [( [( [( [( [( [( [( [( [( [( [( [( [( [( [( [( [( [( [( [( [( [( [( [( [( [( [( [( [( [( [( [( [( [( [( [( [( [( [( [( [( [( [( [( [( [( [( [( [( [( [( [( [( [( [( [( [( [( [( [( [( [( [( [( [( [( [( [( [( [( [( [( [( [( [( [( [( [( [( [( [( [( [( [( [( [( [( [( [( [( [( [( [( [( [( [( [( [( [( [( [( [( [( ,^ ,^ [: P: T= o$ M& S& q$ |% q$ |% |% #* q$ h- l% Q: h/ R: S: T: U: V: W: X: [( [( [( [( [( [( [( [( [( [( [( [( [( [( [( [( [( [( [( [( [( [( [( [( [( [( [( [( [( [( [( [( [( [( [( [( [( [( [( [( [( [( [( [( [( [( [( [( ", +"Y: Z: `: < .< +< @< #< $< %< &< *< =< -< ;< >< i: h: h_ k: .; n: ,< '< )< !< !< ~< {< ]< v: t- ^< [( [( [( [( [( [( [( [( [( [( [( [( [( [( [( [( [( K{ [( M{ [] D' _! /< ~~ D, D, D, (< _< :< << [< }< |< 1< 2< 3< 4< 5< 6< 7< 8< 9< K: h_ 0< [( [( [( [( [( [( [( [( [( [( [( [( [( [( [( [( [( [( [( [( [( [( [( [( [( [( [( [( [( [( [( 0< l: h_ l: a< b< c< d< k: [( [( [( [( [( [( [( [( [( [( [( [( [( [( [( [( [( [( [( [( [( [( [( [( [( [( [( [( [( [( [( [( [( [( [( [( [( [( [( [( [( [( [( [( [( [( [( [( [( [( [( [( [( [( [( [( [( [( [( [( [( [( [( [( [( [( [( [( [( [( [( [( [( [( [( [( [( [( [( [( [( [( [( [( [( [( [( [( [( [( [( [( [( [( [( [( [( [( [( [( [( [( [( [( [( K{ [( ,^ t( D' e< b- k% X* q$ |% |% |% #* |% #* #* |% B* f< g< h< i< j< k< K_ l< m< h_ 0< [( [( [( [( [( [( [( [( [( [( [( [( [( [( [( [( [( [( [( [( [( [( [( [( [( [( [( [( [( [( [( [( [( [( [( [( [( [( [( [( [( [( [( [( [( ", +"n< o< p< q< r< s< t< u< v< w< x< y< z< A< B< C< D< E< F< G< H< I< J< K< L< M< M< N< O< P< Q< r{ t( ,^ ,^ ,^ ,^ ,^ ,^ ,^ ,^ ,^ ,^ ,^ ,^ ,^ ,^ ,^ ,^ ,^ R< S< E] }~ _! /< T< k( k( D, D, D, U< V< W< X< Y< Z< `< [ .[ +[ @[ #[ $[ %[ &[ *[ K: ,^ ,^ ,^ ,^ ,^ ,^ ,^ ,^ ,^ ,^ ,^ ,^ ,^ ,^ ,^ ,^ ,^ ,^ ,^ ,^ ,^ ,^ ,^ ,^ ,^ ,^ ,^ ,^ ,^ ,^ ,^ ,^ ,^ ,^ K: =[ -[ ;[ >[ ,[ '[ ,^ ,^ ,^ ,^ ,^ ,^ ,^ ,^ ,^ ,^ ,^ ,^ ,^ ,^ ,^ ,^ ,^ ,^ ,^ ,^ ,^ ,^ ,^ ,^ ,^ ,^ ,^ ,^ ,^ ,^ ,^ ,^ ,^ ,^ ,^ ,^ ,^ ,^ ,^ ,^ ,^ ,^ ,^ ,^ ,^ ,^ ,^ ,^ ,^ ,^ ,^ ,^ ,^ ,^ ,^ ,^ ,^ ,^ ,^ ,^ ,^ ,^ ,^ ,^ ,^ ,^ ,^ ,^ ,^ ,^ ,^ ,^ ,^ ,^ ,^ ,^ ,^ ,^ ,^ ,^ ,^ ,^ ,^ ,^ ,^ ,^ ,^ ,^ ,^ ,^ ,^ ,^ ,^ ,^ ,^ ,^ ,^ ,^ ,^ ,^ ,^ ,^ ,^ ,^ ,^ ,^ ,^ ,^ ,^ )[ ![ ![ ~[ W& #* S& |% #* |% #* h- #* h- |% {[ ][ ^[ /[ ([ _[ :[ X: <[ m< [[ ,^ ,^ ,^ ,^ ,^ ,^ ,^ ,^ ,^ ,^ ,^ ,^ ,^ ,^ ,^ ,^ ,^ ,^ ,^ ,^ ,^ ,^ ,^ ,^ ,^ ,^ ,^ ,^ ,^ ,^ ,^ ,^ ,^ ,^ ,^ ,^ ,^ ,^ ,^ ,^ ,^ ,^ ,^ ,^ ,^ ", +"}[ |[ 1[ 0< 2[ 3[ ^< 4[ 5[ 6[ 7[ 8[ 9[ 0[ a[ b[ c[ d[ e[ f[ g[ h[ i[ j[ k[ l[ l[ m[ n[ o[ p[ 3, q[ t( t( t( t( t( t( t( t( t( t( t( t( t( t( t( t( ,^ r[ D' s[ t[ u[ <) k( k( D, k( D, D, /' v[ w[ x[ y[ z[ A[ ,^ B[ C[ D[ E[ F[ G[ H[ I[ ^< I[ J[ t( t( t( t( t( t( t( t( t( t( t( t( t( t( t( t( t( t( t( t( t( t( t( t( t( t( t( t( t( t( t( t( I[ K[ L[ M[ N[ O[ P[ Q[ J[ t( t( t( t( t( t( t( t( t( t( t( t( t( t( t( t( t( t( t( t( t( t( t( t( t( t( t( t( t( t( t( t( t( t( t( t( t( t( t( t( t( t( t( t( t( t( t( t( t( t( t( t( t( t( t( t( t( t( t( t( t( t( t( t( t( t( t( t( t( t( t( t( t( t( t( t( t( t( t( t( t( t( t( t( t( t( t( t( t( t( t( t( t( t( t( t( t( t( t( t( t( t( t( t( t( t( t( ,^ t( t( R[ S[ S& W& q$ |% #* h- #* h- h- o$ T[ U[ V[ W[ X[ Y[ Z[ `[ } .} +} '[ t( t( t( t( t( t( t( t( t( t( t( t( t( t( t( t( t( t( t( t( t( t( t( t( t( t( t( t( t( t( t( t( t( t( t( t( t( t( t( t( t( t( t( t( ", +"@} #} $} J[ %} '[ I[ &} &} ^< 4[ 5[ >< *} =} -} ;} >} ,} '} )} !} ~} {} ]} ^} ^} /} ^} (} p[ 3, q[ '[ '[ '[ '[ '[ '[ '[ '[ '[ '[ '[ '[ '[ '[ t( ,^ r[ D' s[ .* _} <) k( k( D, k( D, k( D, <) _} :} <} [} }} |} 1} 2} ,[ 3} 4} 5} 6} 7} 8} 9} 0} '[ '[ '[ '[ '[ '[ '[ '[ '[ '[ '[ '[ '[ '[ '[ '[ '[ '[ '[ '[ '[ '[ '[ '[ '[ '[ '[ '[ '[ '[ '[ '[ '[ '[ 0} a} b} c} d} e} I[ I[ '[ '[ '[ '[ '[ '[ '[ '[ '[ '[ '[ '[ '[ '[ '[ '[ '[ '[ '[ '[ '[ '[ '[ '[ '[ '[ '[ '[ '[ '[ '[ '[ '[ '[ '[ '[ '[ '[ '[ '[ '[ '[ '[ '[ '[ '[ '[ '[ '[ '[ '[ '[ '[ '[ '[ '[ '[ '[ '[ '[ '[ '[ '[ '[ '[ '[ '[ '[ '[ '[ '[ '[ '[ '[ '[ '[ '[ '[ '[ '[ '[ '[ '[ '[ '[ '[ '[ '[ '[ '[ '[ '[ '[ '[ '[ '[ '[ '[ '[ '[ '[ '[ '[ '[ '[ '[ '[ '[ '[ t( M{ D' f} 3$ g} q$ #* h- h- h- o$ h} i} j} k} l} m} n} l< o} p} q} r} s} I[ '[ '[ '[ '[ '[ '[ '[ '[ '[ '[ '[ '[ '[ '[ '[ '[ '[ '[ '[ '[ '[ '[ '[ '[ '[ '[ '[ '[ '[ '[ '[ '[ '[ '[ '[ '[ '[ '[ '[ '[ '[ '[ '[ ", +")[ t} t} )[ t( t( t( t( t( )[ 2} 2} J[ u} $} v} w} x} y} z} A} B} C} D} E} j[ j[ F} {} G} H} I} S< t( t( t( t( t( t( t( t( t( t( t( t( t( )[ '[ J} K} L} .* u[ <) !~ k( D, k( D, k( D, /' u[ -% M} L( N} O} P} Q} R} ^< S} T} U} V} W} p] X} R} L[ t( t( t( t( t( t( t( t( t( t( t( t( t( t( t( t( t( t( t( t( t( t( t( t( t( t( t( t( t( t( t( t( t( )[ ^< Y} Z} `} | .| 0} t( t( t( t( t( t( t( t( t( t( t( t( t( t( t( t( t( t( t( t( t( t( t( t( t( t( t( t( t( t( t( t( t( t( t( t( t( t( t( t( t( t( t( t( t( t( t( t( t( t( t( t( t( t( t( t( t( t( t( t( t( t( t( t( t( t( t( t( t( t( t( t( t( t( t( t( t( t( t( t( t( t( t( t( t( t( t( t( t( t( t( t( t( t( t( t( t( t( t( t( t( t( t( t( t( t( t( t( t( t( t( S< ![ )[ +| g} h- #* o$ o$ @| #| $| %| &| *| =| -| ;| >| ,| '| )| !| 3[ t( t( t( t( t( t( t( t( t( t( t( t( t( t( t( t( t( t( t( t( t( t( t( t( t( t( t( t( t( t( t( t( t( t( t( t( t( t( t( t( t( t( t( ", +"~| ~| ~| ~| ~| ~| ~| ~| ~| ~| ~| ~| t} 3[ 3[ q[ u} {| v} ]| ^| /| (| _| :| _| _| <| _| [| }| || 1| %} %} t} ~| ~| ~| ~| ~| ~| ~| ~| ~| ~| t( v= }~ 2| .* u[ 3| !~ k( !~ k( D, k( D, /' 4| 5| T{ M{ 6| R} 7| 8| 9| 0| a| .| b| c| d| e| f| g| h| i| j| q[ ~| ~| ~| ~| ~| ~| ~| ~| ~| ~| ~| ~| ~| ~| ~| ~| ~| ~| ~| ~| ~| ~| ~| ~| ~| ~| ~| ~| ~| ~| ~| q[ k| l| m| n| o| p| j| ~| ~| ~| ~| ~| ~| ~| ~| ~| ~| ~| ~| ~| ~| ~| ~| ~| ~| ~| ~| ~| ~| ~| ~| ~| ~| ~| ~| ~| ~| ~| ~| ~| ~| ~| ~| ~| ~| ~| ~| ~| ~| ~| ~| ~| ~| ~| ~| ~| ~| ~| ~| ~| ~| ~| ~| ~| ~| ~| ~| ~| ~| ~| ~| ~| ~| ~| ~| ~| ~| ~| ~| ~| ~| ~| ~| ~| ~| ~| ~| ~| ~| ~| ~| ~| ~| ~| ~| ~| ~| ~| ~| ~| ~| ~| ~| ~| ~| ~| ~| ~| ~| ~| ~| ~| ~| ~| ~| ~| ~| ~| t( 1< t( ;{ <] W& o$ h- W& q| r| s| t| u| v| w| x| y| z| r} A| B| C| D| 3[ E| q[ ~| ~| ~| ~| ~| ~| ~| ~| ~| ~| ~| ~| ~| ~| ~| ~| ~| ~| ~| ~| ~| ~| ~| ~| ~| ~| ~| ~| ~| ~| ~| ~| ~| ~| ~| ~| ~| ~| ~| ~| ", +")[ )[ )[ )[ )[ )[ )[ )[ )[ )[ )[ )[ )[ )[ )[ t} %} %} q[ F| G| H| I| J| K| L| L| M| N| O| P| Q| R| S| T| q[ %} %} t} )[ )[ )[ )[ )[ M{ )[ U| M> V| Q* {/ (, !~ k( k( !~ k( k( /' (, 4| 5| W| r[ S< )[ k| X| Y| Z| `| )[ S< 1 .1 +1 @1 #1 $1 %1 i| M{ t} )[ )[ )[ )[ )[ )[ )[ )[ )[ )[ )[ )[ )[ )[ )[ )[ )[ )[ )[ )[ )[ )[ )[ )[ )[ )[ )[ )[ )[ )[ )[ )[ j| &1 *1 =1 -1 ;1 >1 j| )[ )[ )[ )[ )[ )[ )[ )[ )[ )[ )[ )[ )[ )[ )[ )[ )[ )[ )[ )[ )[ )[ )[ )[ )[ )[ )[ )[ )[ )[ )[ )[ )[ )[ )[ )[ )[ )[ )[ )[ )[ )[ )[ )[ )[ )[ )[ )[ )[ )[ )[ )[ )[ )[ )[ )[ )[ )[ )[ )[ )[ )[ )[ )[ )[ )[ )[ )[ )[ )[ )[ )[ )[ )[ )[ )[ )[ )[ )[ )[ )[ )[ )[ )[ )[ )[ )[ )[ )[ )[ )[ )[ )[ )[ )[ )[ )[ )[ )[ )[ )[ )[ )[ )[ )[ )[ )[ )[ )[ )[ )[ )[ M{ 1< R[ ,1 2$ W& W& 2$ '1 )1 !1 ~1 {1 ]1 ^1 /1 (1 _1 !| :1 <1 [1 .} }1 3[ )[ )[ )[ )[ )[ )[ )[ )[ )[ )[ )[ )[ )[ )[ )[ )[ )[ )[ )[ )[ )[ )[ )[ )[ )[ )[ )[ )[ )[ )[ )[ )[ )[ )[ )[ )[ )[ )[ )[ )[ ", +"S< S< S< S< S< S< S< S< S< S< S< S< S< S< S< S< S< S< S< %} |1 11 21 31 41 51 51 61 71 81 91 01 a1 b1 c1 d1 e1 f1 M{ k| k| S< S< S< )[ e< |( g1 F' _] (, !~ k( !~ !~ k( !~ D, k( /< h1 i1 J} S< M{ S< S< M{ J[ j1 k1 l1 m1 S< j| n1 o1 p1 q1 $1 r1 s1 t1 M{ S< S< S< S< S< S< S< S< S< S< S< S< S< S< S< S< S< S< S< S< S< S< S< S< S< S< S< S< S< S< S< M{ t1 u1 m| v1 w1 >1 x1 S< S< S< S< S< S< S< S< S< S< S< S< S< S< S< S< S< S< S< S< S< S< S< S< S< S< S< S< S< S< S< S< S< S< S< S< S< S< S< S< S< S< S< S< S< S< S< S< S< S< S< S< S< S< S< S< S< S< S< S< S< S< S< S< S< S< S< S< S< S< S< S< S< S< S< S< S< S< S< S< S< S< S< S< S< S< S< S< S< S< S< S< S< S< S< S< S< S< S< S< S< S< S< S< S< S< S< S< S< S< S< S< S< S< J} R[ y1 z1 k- A1 B1 C1 D1 E1 F1 G1 H1 I1 J1 m< K1 L1 M1 N1 O1 P1 Q1 R1 S1 S< S< S< S< S< S< S< S< S< S< S< S< S< S< S< S< S< S< S< S< S< S< S< S< S< S< S< S< S< S< S< S< S< S< S< S< S< S< ", +"1< 1< 1< 1< 1< 1< 1< 1< 1< 1< 1< 1< 1< 1< 1< 1< 1< 1< 1< 1< T1 U1 V1 W1 X1 J| J| Y1 Z1 `1 2 j* .2 +2 @2 #2 $2 %2 M{ H< &2 1< *2 =2 e< 3' g1 F' u] /' D! !~ k( !~ k( !~ D, D! #{ -2 M> v= 1< M{ 1< 1< ;2 *2 >2 ,2 '2 )2 !2 ~2 {2 ]2 ^2 /2 (2 _2 f| :2 <2 *2 ;2 1< 1< 1< 1< 1< 1< 1< 1< 1< 1< 1< 1< 1< 1< 1< 1< 1< 1< 1< 1< 1< 1< 1< 1< 1< 1< 1< 1< 1< 1< 1< =2 [2 }2 |2 12 22 32 42 1< 1< 1< 1< 1< 1< 1< 1< 1< 1< 1< 1< 1< 1< 1< 1< 1< 1< 1< 1< 1< 1< 1< 1< 1< 1< 1< 1< 1< 1< 1< 1< 1< 1< 1< 1< 1< 1< 1< 1< 1< 1< 1< 1< 1< 1< 1< 1< 1< 1< 1< 1< 1< 1< 1< 1< 1< 1< 1< 1< 1< 1< 1< 1< 1< 1< 1< 1< 1< 1< 1< 1< 1< 1< 1< 1< 1< 1< 1< 1< 1< 1< 1< 1< 1< 1< 1< 1< 1< 1< 1< 1< 1< 1< 1< 1< 1< 1< 1< 1< 1< 1< 1< 1< 1< 1< 1< 1< 1< 1< 1< 1< 1< 1< r[ J{ }( 52 62 72 82 92 02 a2 b2 c2 d2 e2 f2 g2 h2 f2 i2 j2 k2 l2 m2 g2 ;| 1< 1< 1< 1< 1< 1< 1< 1< 1< 1< 1< 1< 1< 1< 1< 1< 1< 1< 1< 1< 1< 1< 1< 1< 1< 1< 1< 1< 1< 1< 1< 1< 1< 1< 1< 1< 1< ", +"S< S< S< S< S< S< S< S< S< S< S< S< S< S< S< S< S< S< S< S< n2 o2 p2 q2 r2 31 31 s2 31 t2 u2 v2 w2 x2 y2 z2 A2 B2 C2 D2 E2 &1 F2 G2 H2 I2 J2 u] /' D! !~ D! !~ k( !~ D, D! P= K2 L2 M2 N2 S< S< S< S< S< S< O2 P2 Q2 R2 S2 T2 ;| U2 V2 W2 X2 Y2 Z2 `2 3 1| 42 S< S< S< S< S< S< S< S< S< S< S< S< S< S< S< S< S< S< S< S< S< S< S< S< S< S< S< S< S< S< S< S< O2 .3 +3 @3 #3 $3 %3 S< S< S< S< S< S< S< S< S< S< S< S< S< S< S< S< S< S< S< S< S< S< S< S< S< S< S< S< S< S< S< S< S< S< S< S< S< S< S< S< S< S< S< S< S< S< S< S< S< S< S< S< S< S< S< S< S< S< S< S< S< S< S< S< S< S< S< S< S< S< S< S< S< S< S< S< S< S< S< S< S< S< S< S< S< S< S< S< S< S< S< S< S< S< S< S< S< S< S< S< S< S< S< S< S< S< S< S< S< S< S< S< S< S< N2 N2 i_ &3 *3 =3 -3 ;3 >3 ,3 Q& '3 )3 !3 ~3 {3 ]3 K1 ^3 /3 (3 _3 :3 <3 K1 S< S< S< S< S< S< S< S< S< S< S< S< S< S< S< S< S< S< S< S< S< S< S< S< S< S< S< S< S< S< S< S< S< S< S< S< S< ", +"1< 1< 1< 1< 1< 1< 1< 1< 1< 1< 1< 1< 1< 1< 1< 1< 1< 1< 1< 1< [3 o2 }3 |3 13 W1 W1 23 W1 33 43 53 63 S< 73 83 93 03 a3 b3 c3 d3 e3 f3 g3 h3 i3 ,( j3 k3 l3 m3 n3 n3 o3 H) P= p3 q3 r3 N2 1< 1< 1< 1< 1< 1< 1< 1< s3 t3 u3 v3 w3 x3 s3 >2 y3 z3 A3 A3 B3 C3 ~2 s3 N2 1< 1< 1< 1< 1< 1< 1< 1< 1< 1< 1< 1< 1< 1< 1< 1< 1< 1< 1< 1< 1< 1< 1< 1< 1< 1< 1< 1< 1< 1< 1< N2 ;2 D3 E3 F3 G3 H3 N2 1< 1< 1< 1< 1< 1< 1< 1< 1< 1< 1< 1< 1< 1< 1< 1< 1< 1< 1< 1< 1< 1< 1< 1< 1< 1< 1< 1< 1< 1< 1< 1< 1< 1< 1< 1< 1< 1< 1< 1< 1< 1< 1< 1< 1< 1< 1< 1< 1< 1< 1< 1< 1< 1< 1< 1< 1< 1< 1< 1< 1< 1< 1< 1< 1< 1< 1< 1< 1< 1< 1< 1< 1< 1< 1< 1< 1< 1< 1< 1< 1< 1< 1< 1< 1< 1< 1< 1< 1< 1< 1< 1< 1< 1< 1< 1< 1< 1< 1< 1< 1< 1< 1< 1< 1< 1< 1< 1< 1< 1< 1< 1< 1< 1< r[ S< t} I3 J3 K3 L3 M3 N3 O3 Y= P3 Q3 R3 S3 T3 ]3 U3 V3 W3 X3 Y3 Z3 `3 ]3 1< 1< 1< 1< 1< 1< 1< 1< 1< 1< 1< 1< 1< 1< 1< 1< 1< 1< 1< 1< 1< 1< 1< 1< 1< 1< 1< 1< 1< 1< 1< 1< 1< 1< 1< 1< ", +"r[ r[ r[ r[ r[ r[ r[ r[ r[ r[ r[ r[ r[ r[ r[ r[ r[ r[ r[ r[ 4 .4 +4 @4 #4 q2 q2 $4 q2 %4 &4 l: *4 r[ =4 -4 1< ;4 >4 ,4 '4 )4 !4 ~4 {4 ]4 ^4 #( /4 (4 _4 :4 <4 [4 /4 }4 K2 >^ |4 N2 r[ r[ r[ r[ r[ r[ r[ r[ r[ s3 14 s3 24 R2 34 44 54 64 74 84 94 04 H: a4 b4 c4 54 r[ r[ r[ r[ r[ r[ r[ r[ r[ r[ r[ r[ r[ r[ r[ r[ r[ r[ r[ r[ r[ r[ r[ r[ r[ r[ r[ r[ r[ r[ r[ c4 d4 e4 f4 g4 h4 c4 r[ r[ r[ r[ r[ r[ r[ r[ r[ r[ r[ r[ r[ r[ r[ r[ r[ r[ r[ r[ r[ r[ r[ r[ r[ r[ r[ r[ r[ r[ r[ r[ r[ r[ r[ r[ r[ r[ r[ r[ r[ r[ r[ r[ r[ r[ r[ r[ r[ r[ r[ r[ r[ r[ r[ r[ r[ r[ r[ r[ r[ r[ r[ r[ r[ r[ r[ r[ r[ r[ r[ r[ r[ r[ r[ r[ r[ r[ r[ r[ r[ r[ r[ r[ r[ r[ r[ r[ r[ r[ r[ r[ r[ r[ r[ r[ r[ r[ r[ r[ r[ r[ r[ r[ r[ r[ r[ r[ r[ r[ r[ r[ r[ r[ N2 v= E| i4 j4 k4 l4 m4 n4 o4 p4 *3 q4 r4 s4 t4 u4 v4 ]3 w4 S< x4 y4 z4 A4 ]3 B4 B4 r[ r[ r[ r[ r[ r[ r[ r[ r[ r[ r[ r[ r[ r[ r[ r[ r[ r[ r[ r[ r[ r[ r[ r[ r[ r[ r[ r[ r[ r[ r[ r[ r[ ", +"C4 C4 C4 C4 C4 C4 C4 C4 C4 C4 C4 C4 C4 C4 C4 C4 C4 C4 C4 C4 D4 E4 F4 G4 H4 I4 I4 J4 |3 K4 &4 R< J} s3 s3 c4 L4 =4 63 N2 M4 N4 O4 P4 Q4 R4 S4 T4 U4 V4 W4 X4 Y4 Z4 `4 5 .5 r3 N2 C4 C4 C4 C4 C4 C4 C4 C4 C4 C4 N2 c4 +5 @5 #5 $5 %5 &5 +5 *5 =5 -5 ;5 >5 ,5 '5 +5 c4 N2 C4 C4 C4 C4 C4 C4 C4 C4 C4 C4 C4 C4 C4 C4 C4 C4 C4 C4 C4 C4 C4 C4 C4 C4 C4 C4 C4 C4 C4 C4 s3 )5 !5 ~5 {5 ]5 ^5 s3 C4 C4 C4 C4 C4 C4 C4 C4 C4 C4 C4 C4 C4 C4 C4 C4 C4 C4 C4 C4 C4 C4 C4 C4 C4 C4 C4 C4 C4 C4 C4 C4 C4 C4 C4 C4 C4 C4 C4 C4 C4 C4 C4 C4 C4 C4 C4 C4 C4 C4 C4 C4 C4 C4 C4 C4 C4 C4 C4 C4 C4 C4 C4 C4 C4 C4 C4 C4 C4 C4 C4 C4 C4 C4 C4 C4 C4 C4 C4 C4 C4 C4 C4 C4 C4 C4 C4 C4 C4 C4 C4 C4 C4 C4 C4 C4 C4 C4 C4 C4 C4 C4 C4 C4 C4 C4 C4 C4 C4 C4 C4 C4 C4 C4 N2 /5 (5 _5 :5 <5 [5 }5 p4 Y= *3 |5 15 25 35 45 55 v4 65 75 85 95 05 a5 ^3 w4 b5 65 C4 C4 C4 C4 C4 C4 C4 C4 C4 C4 C4 C4 C4 C4 C4 C4 C4 C4 C4 C4 C4 C4 C4 C4 C4 C4 C4 C4 C4 C4 C4 C4 ", +"J} J} J} J} J} J} J} J} J} J} J} J} J} J} J} J} J} J} J} J} c5 .4 d5 e5 f5 g5 g5 h5 @4 i5 &4 h_ v= J} J} J} J} j5 k5 r[ l5 m5 n5 o5 p5 q5 r5 s5 t5 u5 v5 w5 x5 () y5 z5 A5 B5 r[ J} J} J} J} J} J} J} J} J} J} J} r[ C5 G| D5 E5 F5 G5 J} 44 H5 I5 J5 94 K5 L5 c4 j5 M5 J} r[ J} J} J} J} J} J} J} J} J} J} J} J} J} J} J} J} J} J} J} J} J} J} J} J} J} J} J} J} r[ N5 d4 O5 @3 +3 h4 N5 r[ J} J} J} J} J} J} J} J} J} J} J} J} J} J} J} J} J} J} J} J} J} J} J} J} J} J} J} J} J} J} J} J} J} J} J} J} J} J} J} J} J} J} J} J} J} J} J} J} J} J} J} J} J} J} J} J} J} J} J} J} J} J} J} J} J} J} J} J} J} J} J} J} J} J} J} J} J} J} J} J} J} J} J} J} J} J} J} J} J} J} J} J} J} J} J} J} J} J} J} J} J} J} J} J} J} J} J} J} J} J} J} J} J} J} P5 Q5 R5 S5 T5 U5 o4 Y= f& f& V5 W5 X5 Y5 Z5 `5 6 v4 65 J} ^3 .6 +6 @6 #6 $6 %6 j5 r[ J} J} J} J} J} J} J} J} J} J} J} J} J} J} J} J} J} J} J} J} J} J} J} J} J} J} J} J} J} J} ", +"v= v= v= v= v= v= v= v= v= v= v= v= v= v= v= v= v= v= v= v= &6 *6 =6 -6 ;6 >6 >6 ,6 G4 '6 )6 ^< e< v= v= v= v= v= v= U| k5 !6 ~6 {6 ]6 ^6 /6 (6 _6 :6 <6 [6 }6 |6 16 26 36 46 56 v= v= v= v= v= v= v= v= v= v= v= v= v= B5 66 76 86 96 66 06 14 a6 D[ b6 c6 d6 e6 f6 g6 h6 B5 i6 v= v= v= v= v= v= v= v= v= v= v= v= v= v= v= v= v= v= v= v= v= v= v= v= v= v= v= v= k5 j6 k6 l6 m6 n6 o6 k5 v= v= v= v= v= v= v= v= v= v= v= v= v= v= v= v= v= v= v= v= v= v= v= v= v= v= v= v= v= v= v= v= v= v= v= v= v= v= v= v= v= v= v= v= v= v= v= v= v= v= v= v= v= v= v= v= v= v= v= v= v= v= v= v= v= v= v= v= v= v= v= v= v= v= v= v= v= v= v= v= v= v= v= v= v= v= v= v= v= v= v= v= v= v= v= v= v= v= v= v= v= v= v= v= v= v= v= v= v= v= v= v= *4 v= L4 p6 q6 r6 s6 t6 u6 f& f& u* }> v6 w6 x6 y6 z6 A6 B6 U| v4 56 C6 D6 E6 F6 G6 H6 I6 J6 v= v= v= v= v= v= v= v= v= v= v= v= v= v= v= v= v= v= v= v= v= v= v= v= v= v= v= v= v= v= ", +"J} J} J} J} J} J} J} J} J} J} J} J} J} J} J} J} J} J} J} J} K6 *6 L6 M6 N6 O6 O6 P6 e5 Q6 R6 ,^ U| J} J} J} J} J} J} S6 C( T6 U6 (< m3 E' V6 W6 ^6 X6 Y6 Z6 `6 7 .7 +7 @7 #7 B5 J} J} J} J} J} J} J} J} J} J} J} J} J} k5 h6 $7 %7 &7 *7 =7 -7 ;7 >7 ,7 '7 )7 !7 ~7 {7 ]7 ^7 B5 J} J} J} J} J} J} J} J} J} J} J} J} J} J} J} J} J} J} J} J} J} J} J} J} J} J} J} J} J} /7 (7 _7 @3 :7 <7 /7 J} J} J} J} J} J} J} J} J} J} J} J} J} J} J} J} J} J} J} J} J} J} J} J} J} J} J} J} J} J} J} J} J} J} J} J} J} J} J} J} J} J} J} J} J} J} J} J} J} J} J} J} J} J} J} J} J} J} J} J} J} J} J} J} J} J} J} J} J} J} J} J} J} J} J} J} J} J} J} J} J} J} J} J} J} J} J} J} J} J} J} J} J} J} J} J} J} J} J} J} J} J} J} J} J} J} J} J} J} J} k5 k5 [7 56 }7 |7 17 27 37 47 57 a$ u* }> }> H; H; 67 77 87 97 07 a7 b7 *4 J6 c7 d7 e7 f7 g7 h7 L4 k5 J} J} J} J} J} J} J} J} J} J} J} J} J} J} J} J} J} J} J} J} J} J} J} J} J} J} J} J} J} ", +"U| U| U| U| U| U| U| U| U| U| U| U| U| U| U| U| U| U| U| U| i7 j7 k7 l7 m7 n7 n7 o7 p7 q7 )6 t( M2 U| U| U| U| U| S6 R[ r7 u[ !~ D! D! D! m3 m3 s7 t7 u7 v7 w7 x7 y7 z7 h6 U| U| U| U| U| U| U| U| U| U| U| U| U| U| U| U| A7 B7 C7 D7 E7 F7 i6 G7 H7 D[ I7 J7 K7 L7 () M7 N7 O7 U| U| U| U| U| U| U| U| U| U| U| U| U| U| U| U| U| U| U| U| U| U| U| U| U| U| U| U| U| O7 j6 P7 Q7 R7 /7 i6 U| U| U| U| U| U| U| U| U| U| U| U| U| U| U| U| U| U| U| U| U| U| U| U| U| U| U| U| U| U| U| U| U| U| U| U| U| U| U| U| U| U| U| U| U| U| U| U| U| U| U| U| U| U| U| U| U| U| U| U| U| U| U| U| U| U| U| U| U| U| U| U| U| U| U| U| U| U| U| U| U| U| U| U| U| U| U| U| U| U| U| U| U| U| U| U| U| U| U| U| U| U| U| U| U| U| U| U| U| U| S7 T7 U7 V7 W7 X7 Y7 Z7 `7 8 d- .8 N= H; H; [& [& [& +8 @8 #8 $8 %8 &8 b7 *8 =8 -8 ;8 >8 ,8 '8 U| U| U| U| U| U| U| U| U| U| U| U| U| U| U| U| U| U| U| U| U| U| U| U| U| U| U| U| U| U| U| ", +"M2 M2 M2 M2 M2 M2 M2 M2 M2 M2 M2 M2 M2 M2 M2 M2 M2 M2 M2 M2 )8 !8 ~8 {8 ]8 ^8 ^8 /8 M6 (8 _8 }1 :8 M2 M2 M2 M2 r3 S< <8 [8 u] !~ H) D! H) D! H) ,( }8 |8 18 28 38 48 58 68 78 M2 M2 M2 M2 M2 M2 M2 M2 M2 M2 M2 M2 M2 M2 M2 88 98 08 a8 b8 c8 d8 e8 f8 g8 h8 i8 j8 k8 l8 m8 n8 o8 p8 M2 M2 M2 M2 M2 M2 M2 M2 M2 M2 M2 M2 M2 M2 M2 M2 M2 M2 M2 M2 M2 M2 M2 M2 M2 M2 M2 M2 M2 98 q8 r8 s8 t8 u8 v8 88 M2 M2 M2 M2 M2 M2 M2 M2 M2 M2 M2 M2 M2 M2 M2 M2 M2 M2 M2 M2 M2 M2 M2 M2 M2 M2 M2 M2 M2 M2 M2 M2 M2 M2 M2 M2 M2 M2 M2 M2 M2 M2 M2 M2 M2 M2 M2 M2 M2 M2 M2 M2 M2 M2 M2 M2 M2 M2 M2 M2 M2 M2 M2 M2 M2 M2 M2 M2 M2 M2 M2 M2 M2 M2 M2 M2 M2 M2 M2 M2 M2 M2 M2 M2 M2 M2 M2 M2 M2 M2 M2 M2 M2 M2 M2 M2 M2 M2 M2 M2 M2 M2 M2 M2 M2 M2 M2 w8 x8 y8 z8 A8 B8 C8 D8 E8 F8 56 U| l- W* u* [& [& j% j% :; G8 H8 I8 J8 K8 L8 M8 L8 N8 O8 P8 Q8 R8 S8 M2 M2 M2 M2 M2 M2 M2 M2 M2 M2 M2 M2 M2 M2 M2 M2 M2 M2 M2 M2 M2 M2 M2 M2 M2 M2 M2 M2 M2 M2 ", +"U| U| U| U| U| U| U| U| U| U| U| U| U| U| U| U| U| U| U| O7 T8 !8 U8 V8 W8 X8 X8 Y8 l7 Z8 _8 t( M2 U| U| O7 U| S6 [: `8 9 D, H) D! H) D! H) k( #: .9 +9 @9 #9 $9 %9 &9 *9 08 98 U| U| U| U| U| U| U| U| U| U| U| U| U| U| U| 06 06 =9 -9 Z| ;9 >9 M2 ,9 '9 )9 !9 ~9 {9 ]9 ^9 /9 78 O7 U| U| U| U| U| U| U| U| U| U| U| U| U| U| U| U| U| U| U| U| U| U| U| U| U| U| U| U| A7 (9 _9 :9 <9 [9 }9 98 U| O7 U| U| U| U| U| U| U| U| U| U| U| U| U| U| U| U| U| U| U| U| U| U| U| U| U| U| U| U| U| U| U| U| U| U| U| U| U| U| U| U| U| U| U| U| U| U| U| U| U| U| U| U| U| U| U| U| U| U| U| U| U| U| U| U| U| U| U| U| U| U| U| U| U| U| U| U| U| U| U| U| U| U| U| U| U| U| U| U| U| U| U| U| U| U| U| U| U| U| U| U| U| U| U| U| w8 |9 19 29 39 49 59 69 79 89 99 4, S< 09 i- @* H; j% j% :; X& X& a9 b9 c9 d9 e9 <> f9 g9 h9 i9 j9 56 88 06 U| U| U| U| U| U| U| U| U| U| U| U| U| U| U| U| U| U| U| U| U| U| U| U| U| U| U| U| U| ", +"M2 M2 M2 M2 M2 M2 M2 M2 M2 M2 M2 M2 M2 M2 M2 M2 M2 M2 M2 M2 k9 l9 m9 n9 o9 p9 p9 q9 r9 s9 t9 M{ r3 M2 M2 M2 u9 v9 w9 4| k( H) D! H) H) D! D! H) D! x9 y9 z9 A9 B9 C9 D9 E9 F9 G9 e8 M2 M2 M2 M2 M2 M2 M2 M2 M2 M2 M2 M2 M2 M2 M2 78 H9 I9 J9 K9 L9 l5 M9 N9 O9 P9 Q9 R9 S9 T9 G9 e8 M2 M2 M2 M2 M2 M2 M2 M2 M2 M2 M2 M2 M2 M2 M2 M2 M2 M2 M2 M2 M2 M2 M2 M2 M2 M2 M2 M2 M2 M2 e8 U9 V9 W9 X9 Y9 Z9 e8 M2 M2 M2 M2 M2 M2 M2 M2 M2 M2 M2 M2 M2 M2 M2 M2 M2 M2 M2 M2 M2 M2 M2 M2 M2 M2 M2 M2 M2 M2 M2 M2 M2 M2 M2 M2 M2 M2 M2 M2 M2 M2 M2 M2 M2 M2 M2 M2 M2 M2 M2 M2 M2 M2 M2 M2 M2 M2 M2 M2 M2 M2 M2 M2 M2 M2 M2 M2 M2 M2 M2 M2 M2 M2 M2 M2 M2 M2 M2 M2 M2 M2 M2 M2 M2 M2 M2 M2 M2 M2 M2 M2 M2 M2 M2 M2 M2 M2 M2 M2 M2 M2 M2 M2 M2 M2 `9 0 .0 +0 @0 #0 $0 %0 &0 *0 :8 S6 )[ =0 }> X& j% :; X& X& @* @* -0 ;0 >0 ,0 '0 )0 !0 ~0 {0 ]0 ^0 /0 (0 M2 M2 M2 M2 M2 M2 M2 M2 M2 M2 M2 M2 M2 M2 M2 M2 M2 M2 M2 M2 M2 M2 M2 M2 M2 M2 M2 M2 M2 ", +":8 :8 :8 :8 :8 :8 :8 :8 :8 :8 :8 :8 :8 :8 :8 :8 :8 :8 :8 r3 _0 :0 <0 [0 }0 |0 |0 10 V8 20 30 ;2 |4 :8 M2 S6 )[ 40 ~~ P= !~ H) H) H) D! H) D, 50 60 70 L} 78 80 90 M9 00 a0 b0 G9 78 r3 :8 :8 :8 :8 :8 :8 :8 :8 :8 :8 :8 :8 :8 :8 c0 p8 d0 e0 f0 g0 h0 l5 i0 j0 k0 l0 m0 n0 o0 p0 q0 78 :8 :8 :8 :8 :8 :8 :8 :8 :8 :8 :8 :8 :8 :8 :8 :8 :8 :8 :8 :8 :8 :8 :8 :8 :8 :8 :8 :8 :8 80 r0 s0 t0 u0 v0 w0 x0 y0 :8 :8 :8 :8 :8 :8 :8 :8 :8 :8 :8 :8 :8 :8 :8 :8 :8 :8 :8 :8 :8 :8 :8 :8 :8 :8 :8 :8 :8 :8 :8 :8 :8 :8 :8 :8 :8 :8 :8 :8 :8 :8 :8 :8 :8 :8 :8 :8 :8 :8 :8 :8 :8 :8 :8 :8 :8 :8 :8 :8 :8 :8 :8 :8 :8 :8 :8 :8 :8 :8 :8 :8 :8 :8 :8 :8 :8 :8 :8 :8 :8 :8 :8 :8 :8 :8 :8 :8 :8 :8 :8 :8 :8 :8 :8 :8 :8 :8 :8 :8 :8 :8 :8 :8 :8 z0 A0 B0 C0 D0 E0 F0 G0 H0 A7 :8 M2 I0 '[ J0 .8 :; :; X& @* W* W* K0 L0 M0 N0 O0 P0 Q0 R0 S0 T0 U0 V0 (0 :8 :8 :8 :8 :8 :8 :8 :8 :8 :8 :8 :8 :8 :8 :8 :8 :8 :8 :8 :8 :8 :8 :8 :8 :8 :8 :8 :8 :8 ", +"W0 W0 W0 W0 W0 W0 W0 W0 W0 W0 W0 W0 W0 W0 W0 W0 W0 W0 W0 W0 z$ X0 Y0 Z0 `0 a a .a +a @a 30 S< #a W0 r3 S6 $a %a &a D, H) D! H) D! H) k( 4| *a )[ #a r3 W0 W0 e8 =a -a ;a >a ,a 'a y0 W0 W0 W0 W0 W0 W0 W0 W0 W0 W0 W0 W0 W0 W0 W0 W0 y0 )a !a ~a {a ]a ^a /a (a _a :a b ,b 'b )b !b ~b {b ]b S6 Pa #a #a Ja $a p3 ^b X& W* !% !% y- /b (b _b :b c u[ k( H) D! H) D! H) D, _} ,c 'c )c #a #a #a #a #a #a #a !c gb ~c {c ]c ^c kb Ka #a #a #a #a #a #a #a #a #a #a #a #a #a #a #a /c (c /a _c :c d ,d 'd )d !d ~d {d ]d ^d /d (d _d :d r3 e ,e 'e )e `d yc Ja Ja Ja Ja Ja Ja Ja Ja Ja Ja Ja Ja Ja Ja Ja Ja Ja Ja Ja Ja Ja Ja Ja Ja Ja Ja ", +"!e ~e {e ]e ^e /e (e ia _e 0d 9d 0d :e _e f ,f 'f )f !f ~f {f ]f ^f /f (f _f :f :f g ,g 'g )g !g Vd ~g {g {g ]g ^g /g (g _g :g h ,h 'h Vd )h ^g ^g !h ~h {h ]h ^h /h (h T. _h :h i ,i 'i v7 )i j ,j 'j )j !j ~j {j ]j ^j /j (j _j {i Gi Gg Gg Gg Gg Gg Gg Gg Gg Gg Gg Gg Gg Gg Gg Gg Gg Gg Gg Gg Gg Gg Gg Gg Gg Gg Gg Gg Sh Gi Sh :j k ,k 'k mh Gg )c )c )c )c mi bj )k !k ~k {k ]k ^k /k (k i% 5$ 5$ F* _k :k l Gg Gg Gg Gg Gg Gg Gg Gg Gg Gg Gg Gg Gg Gg Gg Gg Gg Gg Gg Gg Gg Gg Gg ", +"09 09 09 09 09 09 09 09 09 09 09 09 09 09 09 09 09 09 09 be _> ,l 'l Vd )l !l !l ~l !l {l ]l ^l /l (l _l :l Kl Ll yj Ml Nl Nl Ol Nl Pl Ql Rl Sl Tl Ul Vl Wl Xl Yl Zl Ek 6k 'j 'j 'j 'j 'j 'j 'j 'j 'j 'j 'j 'j 'j 'j 'j 'j 'j 'j 'j 'j 'j `l m .m +m @m #m $m Ek 'j 'j 'j 'j 'j 'j 'j 'j 'j 'j 'j 'j 'j 'j 'j 'j `l %m &m *m =m -m ;m >m Wj ,m 'm )m !m hg ~m %m `l 'j 'j 'j 'j 'j 'j 'j 'j 'j 'j 'j 'j 'j 'j 'j 'j 'j 'j 'j 'j 'j 'j 'j 'j 'j 'j 'j 'j {m ]m ^m /m (m _m {m 'j 'j 'j 'j 'j 'j 'j 'j 'j 'j 'j 'j 'j 'j 'j 'j 'j 'j 'j 'j 'j 'j 'j 'j 'j 'j 'j 'j 'j 'j 'j 'j 'j 'j 'j 'j 'j 'j 'j 'j 'j 'j 'j 'j 'j 'j 'j 'j 'j 'j 'j 'j 'j 'j 'j 'j 'j 'j 'j 'j 'j 'j 'j 'j 'j 'j 'j 'j 'j 'j 'j 'j 'j 'j 'j 'j 'j 'j 'j 'j 'j 'j 'j 'j 'j 'j 'j 'j 'j 'j 'j Ic :m n ,n 'n )n !n ~n {n 2h qm qm qm qm qm qm qm qm ]n ^n /n (n _n :n o ;o ,o Ql v] gn k( )~ 'o )o !o ~o {o ]o ^o Zl Im /o qm qm qm qm qm qm qm qm qm qm qm qm qm qm qm qm qm qm qm /o Im (o _o :o n ko lo mo no oo po qo qm qm qm qm qm qm qm qm qm Hm ro so to uo vo wo xo f% )* _* (k yo zo Ao Bo Co Do Eo Fo Go Ho Io qm qm qm qm qm qm qm qm qm qm qm qm qm qm qm qm qm qm qm qm qm ", +"2h 2h 2h 2h 2h 2h 2h 2h 2h 2h 2h 2h 2h 2h 2h 2h 2h 2h 2h 2h Jo Ko Lo vm Mo No No Oo No Po Qo Ro So /' _} To Uo Vo $/ Wo {o Xo Yo Zo |l 2h 2h 2h 2h 2h 2h 2h 2h 2h 2h 2h 2h 2h 2h 2h 2h 2h 2h 2h 2h 2h `o p .p +p @p p `o 2h 2h 2h 2h 2h 2h 2h 2h 2h 2h 2h 2h 2h 2h 2h 2h |l Zo #p $p %p &p *p =p -p |i ;p >p ,p 'p )p !p ~p `o 2h 2h 2h 2h 2h 2h 2h 2h 2h 2h 2h 2h 2h 2h 2h 2h 2h 2h 2h 2h 2h 2h 2h 2h 2h 2h 2h |l =p Im @n {p ]p rn ^p 2h 2h 2h 2h 2h 2h 2h 2h 2h 2h 2h 2h 2h 2h 2h 2h 2h 2h 2h 2h 2h 2h 2h 2h 2h 2h 2h 2h 2h 2h 2h 2h 2h 2h 2h 2h 2h 2h 2h 2h 2h 2h 2h 2h 2h 2h 2h 2h 2h 2h 2h 2h 2h 2h 2h 2h 2h 2h 2h 2h 2h 2h 2h 2h 2h 2h 2h 2h 2h 2h 2h 2h 2h 2h 2h 2h 2h 2h 2h 2h 2h 2h 2h 2h 2h 2h 2h 2h 2h /p (p _p :p

q ,q 'q )q !q ~q {q 8e Lj Lj Lj Lj Lj Lj Lj Lj Lj Lj Lj Lj Lj Lj Lj Lj Lj Lj Lj Lj ", +"]q ]q ]q ]q ]q ]q ]q ]q ]q ]q ]q ]q ]q ]q ]q ]q ]q ]q ]q )o ], ^q /q ;o (q _q _q :q r ,r 'r )r !r ~r @r Lj )o )o )o )o )o )o )o )o )o )o )o )o )o )o )o )o )o )o )o )o )o )o )o )o )o yq )o {r ]r ^r /r (r _r rp )o )o )o )o )o )o )o )o )o )o )o )o )o )o )o )o )o )o )o )o )o )o )o )o )o )o )o )o )o )o )o )o )o )o )o )o )o )o )o )o )o )o )o )o )o )o )o )o )o )o )o )o )o )o )o )o )o )o )o )o )o )o )o )o )o )o )o )o )o )o )o )o )o )o )o )o )o )o )o )o )o )o )o )o )o )o )o :r s 8f ,s 's )s !s ~s 7r 8f 8f 8f 8f 8f 8f 8f 8f 8f 8f 8f 8f 8f @r {s ]s ^s /s (s _s /* +* :s r xs ys Wr s Ar )o )o )o )o )o )o )o )o )o )o )o )o )o )o )o )o )o )o )o )o )o )o )o )o )o zs As Bs Cs Ds Es ~r .s Hr )o )o )o )o )o )o )o )o )o )o )o )o )o )o )o )o )o )o )o )o )o )o )o )o )o )o )o )o )o )o )o )o )o )o )o )o )o )o )o )o )o )o )o )o )o )o )o )o )o )o )o )o )o )o )o )o )o )o )o )o )o )o )o )o )o )o )o )o )o )o )o )o )o )o )o )o )o )o )o )o )o )o )o )o )o )o 8f Fs Gs Hs ;s yq 8f 8f 8f Is Js Ks Ls Ms 6r Ns )o )o )o )o )o )o )o )o )o )o )o )o )o pr Os Ps Qs Rs Ss Ts 8& ^* ]* Us Vs Ws Xs Ys Zs `s t .t +t @t yq yq )o )o )o )o )o )o )o )o )o )o )o )o )o )o )o )o )o ", +" s s s s s s s s s s s s s s s s s s s s #t $t %t &t *t =t =t -t ;t >t ,t 't ^> Dh )o Xq s s s s s )t !t ~t {t ]t ^t /t (t Ns s s s s s s s s s s s s s s s s s s s s _t :t u ,u 'u Q< |t )u ,m !u !t |t ~u {u ]u ^u /u (t 7t 2q 2q 2q 2q 2q 2q 2q 2q 2q 2q 2q 2q 2q 2q 2q 2q 2q 2q 2q 2q 2q 2q 2q 7t (u Xq _u :u v ,v )t s s s s s s s s s s s s s s s s s ", +"2q 2q 2q 2q 2q 2q 2q 2q 2q 2q 2q 2q 2q 2q 2q 2q 2q 2q 2q is 'k 'v )v !v ~v {v {v ]v ^v /v (v _v :v Wt 2q 2q 2q 2q 2q 2q 2q 2q 2q 2q w ,w 4v &w yu yu yu yu yu yu yu yu yu yu yu yu yu yu yu yu 4v p[ 'w )w T. !w y7 ~w {w ]w yu yu yu yu yu yu yu yu yu yu yu yu yu yu yu &w u (w _w :w gv x ,x 'x 4v is is )x !x ~x {x ]x ^x !x )x is is is is is is is is is is is is is is is is uv Iv /x (x _x :x ap 8& e% y {* e% ,y 'y )y !y ~y {y ]y ^y /y (y uw %w x Nw Nw Nw Nw Nw Nw Nw Nw Nw Nw Nw Nw Nw Nw Nw ", +"Nw Nw Nw Nw Nw Nw Nw Nw Nw Nw Nw Nw Nw Nw Nw Nw Nw Nw hx _y :y z ,z ,z 'z }y )z !z )o 0y %w %w %w %w %w %w %w %w %w %w %w %w %w %w Tx hy ~z {z ]t ]z ^z /z 5y Tx %w %w %w %w %w %w %w %w %w %w %w %w %w %w %w %w %w 5y (z _z :z A ,A 'A %w %w %w %w %w %w %w %w %w %w %w %w %w %w %w %w %w %w 0y )A !A 1z ~A {A ]A &A ^A /A (A _A :A u =B ,A -B ;B >B ,B D) 'B )B !B ~B {B ]B ^B /B (B _B +A :B &A 0y ZA }z }z }z }z }z }z }z }z }z }z }z }z }z }z }z 0y *A C ,C 'C )C !C ~C {C ]C ^C $z $z $z $z $z $z $z $z $z $z $z $z $z $z $z $z Wt /C =A (C _C :C D ,D 'D )D !D $C ~D {D ]D $z $z $z $z $z $z Wt QB ]D QB MC QB $z $z $z $z Wt YC ^D /D (D _D YC $z $z $z $z $z $z $z $z $z $z $z $z $z $z $z $z $z $z $z $z $z $z $z $z $z $z $z QB MC :D D, DD IB ED FD GD HC HC HD ID JD KD (t BD $z $z $z $z $z $z $z $z $z $z $z $z $z $z $z $z $z $z LD &4 TC MD ND lx OD PD QD LD $z $z $z $z $z $z $z $z $z $z $z $z $z $z $z QD RD SD YB TD UD QD $z $z $z $z $z $z $z $z $z $z $z $z $z $z $z $z $z $z YC cD VD WD XD () YD ZD `D 2u E .E +E @E #E $E %E &E *E =E -E ;E >E ,E 'E $z QB $z QD 'E $z YC $z )E RB YC $z $z $z $z $z $z 43 !E ~E {E ]E ^E $z $z $z $z $z $z $z $z $z $z $z $z $z $z $z $z $z $z $z $z $z $z $z $z $z $z $z $z QB QB /E (E _E A SE QD hx hx hx hx hx hx hx hx hx hx hx hx hx hx hx hx hx hx BD LD TE UE VE WE XE YE ZE `E F .F +F @F #F $F %F &F OC *F =F -F ;F >F ,F TE hx 'F )F !F &4 LD lD ~F {F ]F BD hx hx hx hx BD 43 ^F /F (F _F :F 43 hx hx hx hx hx hx hx hx hx hx hx hx hx hx hx hx hx hx hx hx hx hx hx hx hx hx hx hx BD BD TE G ,G 'G )G !G ~G {G *G ]G ^G /G (G _G :G wF NF Rz Rz TE H ,H 'H )H !H ~H {H ]H ^H /H (H _H :H OF [G I ,I 'I )I OE !I ~I Rz Rz Rz Rz Rz Rz Rz Rz Rz Rz Rz Rz EB NF SF WC {I 'G NF EB Rz Rz Rz Rz Rz Rz Rz Rz Rz Rz Rz Rz Rz Rz Rz Rz Rz Rz Rz 'G ]I ^I /I (I _I :I F 8I 9I 0I aI bI cI dI eI fI gI hI iI jI kI lI ~I Rz Rz EB mI nI oI pI qI 3G Rz Rz Rz Rz Rz Rz Rz Rz Rz Rz Rz Rz Rz Rz Rz Rz Rz Rz Rz Rz Rz Rz Rz Rz Rz Rz Rz Rz Rz EB NF HH rI rI HH sI tI uI aG vI wI xI yI zI AI BI CI DI EI FI GI mG Rz Rz Rz Rz Rz Rz Rz Rz Rz Rz Rz Rz Rz Rz Rz Rz Rz Rz Rz Rz Rz Rz Rz Rz Rz Rz Rz Rz Rz Rz nG HI II JI rG EB Rz Rz gH KI LI MI NI MI OI EB Rz Rz Rz Rz Rz Rz Rz Rz Rz Rz Rz Rz Rz Rz Rz Rz Rz Rz Rz Rz Rz mG PI QI RI SI TI UI ~* VI WI XI YI ZI cD GI `I J .J +J NG Rz Rz Rz Rz Rz Rz Rz Rz Rz Rz Rz ", +"yE yE @J #J $J %J &J *J =J -J ;J >J ,J 'J hF QB )J !J xr ~J {J ]J ^J /J (J _J _J :J K ,K YF yE yE yE yE yE yE yE yE yE yE yE yE yE yE yE yE yE yE yE yE yE yE yE @K 'K )K !K LH OH ~* ~K {K ]K ^K /K (K x @K _K :K L ,L CK EB EB EB EB EB EB EB EB EB EB EB EB EB EB EB EB EB EB EB EB EB EB EB EB EB EB EB EB EB EB HF 'L PJ vI )L !L ~L {L ]L ^L /L (L _L :L M ,M 'M )M !M ~M {M ]M ^M pv 0E /M xG (M _M :M N ,N ,N 'N FL )N !N ~N {N ]N ^N /N (N _N :N O rN ;O ,O 'O )O !O ~O {O ]O hL yM xF xF xF xF xF xF xF xF xF xF xF xF xF xF xF xF xF xF xF xF xF xF xF xF xF xF xF xF ^O /O (O _O :O QL xF xF xF xF #K P ,P 'P )P !P ~P {P ]P M M M M M M M M M M M M PN rN YN ^P /P YN rN PN M M M M M M M M M M M M M M M xG PN 1M (P _P :P

Q ,Q 'Q )Q !Q ~Q {Q ]Q ^Q /Q (Q _Q :Q R ,R Fa xF xF xF xF 'R 'R xF 'R 'R xF xF xF xF xF xF xF xF xF xF xF xF xF xF xF xF xF xF xF xF xF xF rP )R !R ~R {R ]R ^R /R (R _R :R S 5# ,S 'S )S !S .R ~S PA PA PA PA PA PA PA PA PA PA PA @Q {S ]S ^S /S (S GQ PA PA PA PA PA PA PA PA PA PA PA PA PA ~S .R _S :S T ,T QP 'T )T !T ~T {T ]T PA PA PA PA PA PA PA PA ", +"^T /T (T _T :T U ,U 'U )U !U ~U {U ]U CS wS ^U /U ]U GQ ES cb ~S 'R 'R 'R 'R 'R 'R 'R 'R 'R 'R 'R 'R 'R 'R 'R 'R 'R 'R 'R @Q (U ^R _U :U V +O DS +V +V +V +V +V +V +V +V +V +V ,V 'V EQ )V !V ~V +O +V +V +V +V +V +V +V +V +V +V +V +V ,V {V ]V ^V /V (V AQ DS +V +V +V +V ,V _V :V W ,W 'W )W !W ~W {W ]W fR +V +V +V +V +V +V +V ", +"^W /W (W _W :W V @V wW xW zV yW zW AW BW CW DW EW FW GW HW IW JW KW LW MW NW OW PW QW RW SW TW UW VW WW XW YW ZW `W X .X +X @X #X $X %X &X *X =X -X ;X >X ,X 'X )X !X gW ~X pW pW 5W 5W 5W 5W 5W 5W 5W 5W 5W 5W 5W 5W 5W {X ]X ^X /X (X _X :X Y ,Y 'Y )Y !Y ~Y {Y ]Y ^Y /Y (Y _Y :Y Z ,Z 'Z 5W 5W )Z )Z )Z JX 5W !Z }z ~Z LX v- /, /, /, MX 8W {Z ]Z ^Z SX SX /Z (Z _Z :Z EB ` ,` '` )` !` ~` {` ]` ^` /` 4W (` FX 5W 5W 5W 5W 5W 5W 5W 5W 5W 5W 5W 5W 5W 5W 5W 5W 5W 5W 5W 5W 5W 5W )Z _` :` <` [` }` |` 1` 2` 3` fW fW 4` 5` 6` 7` TY 8` 5W 5W 5W 5W 5W 5W 5W 5W 5W 5W 5W 5W 5W 5W 5W 5W 5W 5W 5W 5W 5W 5W 5W 5W 5W 5W 5W 5W JX ., .' .) .! .~ .{ .] .^ ./ .( ._ .: .< .[ .} .| .1 .2 .3 .4 .5 .6 .7 .8 .9 .0 .a .b .c .d .e .f .g .h .i .j .k .l ...,..x` x` '..)..!..~..~I +W &..&..&..&..&..&..&..&..&..&..&..&..&..&..&..&..&..&..&..&..&..&..&..&..&..&..&..&..&..&..{..]..^../..(.._..:..<..[..7Z n` [Z JX &..&..&..&..&..&..&..}..|..1..DQ 2..3..{..&..&..&..&..&..&..&..[Z 4..5..6..7..8..9..3..}..&..&..&..&..[Z JX 0..a..b..c..d..e..f..g..h..i..j..k..l..m..n..o..p..q..r..s..t..u..v..w..x..y..z..A..B..C..D..E..F..G..H..I..J..K..L..M..N..O..P..Q..R..S..T..U..V..W..X..Y..Z..`..9 . +..+.++.@+.#+.$+.[Z )Z n` JX [Z &..[Z N` %+.&+.n .*+.=+.[Z -+.o .;+.>+.,+.'+.)+.!+.AY ~+.{+.]+.^+./+.(+.zY &+.JX &..&..&..&..&..&..&..&..&..&..&..&..&..&..&..&..&..&..&..&..&..[Z &..JX _+.:+.<+.[+.}+.|+.1+.Q .h` 2+.3+.4+.5+.6+.h` &..&..&..&..&..&..&..&..&..&..&..&..&..&..&..&..&..&..&..&..&..&..&..&..&..&..&..&..&..&..*..7+.8+.9+.0+.a+.b+.c+.X .d+.e+.f+.g+.h+.i+.j+.k+.l+.m+.n+.o+.4W &..&..&..&..", +"A` @.,@.'@.)@.!@.~@.{@.]@.^@./@.(@._@.:@.<@.[@.}@.|@.1@.2@.3@.4@.5@.6@.W..7@.8@.9@.0@.a@.b@.c@.d@.e@.f@.g@.h@.i@.j@.k@.N` l@.m@.k@.6Z #.,#.'#.A` $.o@.,$.'$.)$.!$.o@.&$.~$.{$.]$.^$./$.($._$.:$.<$.&$.!Z !Z !Z !Z !Z !Z !Z !Z !Z !Z !Z !Z !Z !Z !Z !Z !Z !Z !Z !Z !Z &$.[$.}$.|$.1$.2$.3$.4$.5$.6$.YY 7$.8$.9$.0$.a$.U@.!Z !Z !Z !Z !Z !Z !Z !Z !Z !Z !Z !Z !Z !Z !Z !Z !Z !Z !Z !Z !Z !Z !Z !Z !Z !Z !Z !Z !Z !Z !Z b$.Hx c$.d$.=W e$. Z f$.g$.h$.i$.j$.k$.l$.m$.n$.o$.p$.q$.r$.s$.t$.u$.!Z !Z !Z ", +"+W +W +W +W +W +W +W +W +W +W +W *..v$.w$.y; *- J= J= J= v- ~#.x$.y$.z$.A$._#._#.B$.C$.D$.E$.PN )#.+W +W +W +W +W +W +W +W +W +W +W +W +W +W +W +W +W +W +W +W +W +W +W +W +W +W +W +W +W +W +W P+.P+.k#.F$.D` G$.H$.I$.6#.7#.J$.K$.P+.P+.+W +W +W +W +W +W P+.g#.L$.M$.5H N$.O$.+W +W +W P+.P$.Q$.R$.S$.T$.U$.V$.W$.X$.V$.}#.P+.Y$.Z$.`$. %..%.+%.@%.#%.$%.%%.q#.q#.q#.&%.*%.=%.-%.;%.>%.q#.q#.q#.,%.'%.)%.!%.~%.{%.q#.q#.q#.q#.q#.q#.]%.^%./%.(%._%.:%.<%.[%.}%.|%.1%.2%.3%.4%.5%.6%.7%.8%.9%.0%.a%.b%.c%.d%.e%.f%.g%.h%.i%.j%.k%.l%.m%.n%.o%.p%.q%.r%.s%.p%.t%.u%.v%.w%.x%.P+.y%.z%.A%.B%.C%.D%.E%.w@.F@.F%.G%.H%.I%.J%.K%.L%.M%.A` j#.+W +W +W +W +W +W +W +W +W +W +W +W +W +W +W +W +W +W +W A` N` N%.O%.P%.Q%.R%.S%.T%.U%.V%.j#.k@.W%.X%.Y%.A` A` +W +W +W +W +W +W +W +W +W +W +W +W +W +W +W +W +W +W +W +W +W +W +W +W +W +W +W +W +W +W +W *..Z%.`%. &..&.+&.@&.#&.$&.%&.2& &&.*&.=&.k` -&.;&.>&.,&.'&.)&.!&.YY +W +W +W ", +")#.)#.)#.)#.)#.)#.)#.)#.)#.)#.)#.~&.7+.{&.D, f= *- J= J= J= ]&.{#.^&./&.(&.C$.C$._&.:&.<&.[&.$Q *..)#.)#.)#.)#.)#.)#.)#.)#.)#.)#.)#.)#.)#.)#.)#.)#.)#.)#.)#.)#.)#.)#.)#.)#.)#.)#.)#.)#.)#.)#.)#.)#.}&.a#.|&.2#.1&.2&.3&.4&.5&.6&.7&.8&.}&.)#.)#.)#.)#.)#.)#.)#.}&.8&.9&.0&.a&.V$.b#.)#.[#.b&.c&.d&.e&.f&.}#.}&.g&.h&.i&.j&.k&.)#.l&.m&.n&.o&.p&.q&.r&.s&.t&.u&.q#.q#.q#.v&.w&.x&.y&.z&.A&.q#.q#.q#.B&.C&.D&.E&.F&.G&.q#.q#.q#.q#.q#.q#.H&.I&.J&.K&.L&.M&.N&.O&.P&.Q&.R&.S&.T&.U&.V&.W&.X&.Y&.Z&.`&. *..*.+*.@*.#*.$*.%*.&*.**.=*.-*.;*.>*.,*.'*.)*.)#.!*.~*.{*.]*.^*./*.(*._*.:*.<*.^*.[*.}*.|*.1*.2*.3*.4*.5*.6*.7*.8*.9*.0*.a*.b*.c*.d*.)#.)#.)#.)#.)#.)#.)#.)#.)#.)#.)#.)#.)#.)#.)#.)#.)#.)#.)#.e*.f*.g*.h*.i*.j*.k*.l*.m*.n*.o*.p*.q*.r*.s*.t*.[#.)#.)#.)#.)#.)#.)#.)#.)#.)#.)#.)#.)#.)#.)#.)#.)#.)#.)#.)#.)#.)#.)#.)#.)#.)#.)#.)#.)#.)#.)#.)#.)#.u*.v*.~Z 1& w*.x*.y*.z*.A*.B*.C*.D*.E*.F*.G*.H*.I*.J*.K*.L*.Pz }S M*.[#.)#.)#.", +"*..*..*..*..*..*..*..*..*..*..*..N*.Hx -..Ro f= J= J= J= *- ~#.O*.P*.Q*.R*.:&.:&.S*.T*.U*.V*.@Q W*.*..*..*..*..*..*..*..*..*..*..*..*..*..*..*..*..*..*..*..*..*..*..*..*..*..*..*..*..*..*..*..*..}&.X*.}&.Y*.Z*.m#.*..`*. =..=.ZX JT +=.]*.}&.*..*..*..*..*..]*.3&.@=.#=.$=.%=.&=.*=.==.-=.;=.U~ >=.,=.K+.K+.'=.)=.!=.~=.{=.]=.^=./=.(=._=.:=.<=.[=.}=.|=.1=.q#.q#.q#.2=.3=.4=.5=.6=.7=.q#.q#.q#.8=.9=.0=.a=.b=.c=.d=.e=.f=.g=.h=.i=.j=.k=.l=.m=.n=.o=.p=.q=.r=.s=.t=.u=.v=.w=.x=.y=.z=.A=.B=.C=.D=.E=.F=.G=.H=.I=.J=.H=.K=.L=.M=.N=.O=.P=.Q=.R=.S=.T=.U=.V=.W=.X=.Y=.Z=.`=. -..-.+-.@-.@-.#-.^*.Y=.$-.%-.&-.*-.=-.--.;-.>-.,-.'-.e*.)-.M*.*..*..*..*..*..*..*..*..*..*..*..*..*..*..*..*..*..*..!-.~-.{-.]-.^-./-.(-._-.:-.<-.[-.}-.|-.1-.2-.e*.*..*..*..*..*..*..*..*..*..*..*..*..*..*..*..*..*..*..*..*..*..*..*..*..*..*..*..*..*..*..*..*..*..*..+V 3-.4-.5-.+#.6-.@&.7-.8-.9-.0-.a-.b-.c-.d-.e-.M*.f-.g-.h-.i-.j-.W*.[#.*..", +"k-.k-.k-.k-.k-.k-.k-.k-.k-.k-.*..*..'R l-.~~ f= *- *- *- *- m-.n-.o-.p-.q-.r-.r-.s-.p-.t-.[&.@Q *..k-.k-.k-.k-.k-.k-.k-.k-.k-.k-.k-.k-.k-.k-.k-.k-.k-.k-.k-.k-.k-.k-.k-.k-.k-.k-.k-.k-.k-.k-.k-.k-.k-.K+.'=.u-.2#.v-.w-.x-.y-.z-.A-.B-.C-.D-.]*.}&.k-.k-.k-.k-.}&.E-.F-.G-.H-.I-.J-.K-.L-.M-.N-.O-.P-.k#.}&.K+.Q-.R-.S-.'=.T-.U-.V-.W-.X-.Y-.p&.Z-.`-. ;..;.+;.q#.q#.q#.@;.u&.#;.$;.%;.&;.q#.q#.q#.*;.=;.-;.;;.>;.,;.';.);.!;.~;.{;.];.^;./;.(;._;.:;.<;.[;.};.|;.1;.2;.3;.4;.5;.6;.7;.8;.9;.0;.a;.b;.c;.d;.e;.f;.g;.h;.i;.j;.k;.$*.l;.m;.n;.o;.p;.q;.r;.s;.t;.u;.v;.w;.x;.y;.z;.A;.B;.C;.D;.E;.C;.&-.F;.G;.H;.I;.J;.K;.L;.M;.N;.b*.}&.X*.k-.k-.k-.k-.k-.k-.k-.k-.k-.k-.k-.k-.k-.k-.k-.k-.k-.k-.O;.P;.Q;.R;.S;.T;.U;.V;.)-.b*.W;.X;.Y;.Z;.`;. >.o` k-.k-.k-.k-.k-.k-.k-.k-.k-.k-.k-.k-.k-.k-.k-.k-.k-.k-.k-.k-.k-.k-.k-.k-.k-.k-.k-.k-.k-.k-.k-.k-.k-.*..JX .>.Z& =- +>.@>.#>.z*.$>.%>.&>.*>.=>.->.;>.>>.[#.,>.JX '>.)>.CB [$.W*.[#.", +"*..*..*..*..*..*..*..*..*..*..b$.+W !>.~>.v- _, _, _, _, f= {>.]>.^>.p-./>./&./&.(>._>.:>.<>..V b$.*..*..*..*..*..*..*..*..*..*..*..*..*..*..*..*..*..*..*..*..*..*..*..*..*..*..*..*..*..*..*..*..*..[>.*..}>.|>.1>.2>.*..x-.3>.4>.A-.B-.5>.6>.7>.[>.*..*..*..8>.9>.0>.a>.b>.c>.d>.e>.f>.g>.h>.i>.j>.k>.*..l>.m>.n>.o>.p>.q>.r>.s>.t>.u>.v>.w>.x>.y>.z>.A>.B>.q#.q#.q#.C>.D>.E>.F>.G>.H>.q#.q#.q#.I>.J>.K>.L>.q#.q#.q#.q#.q#.M>.N>.O>.P>.Q>.R>.S>.T>.U>.V>.W>.X>.Y>.Z>.`>. ,..,.+,.@,.#,.$,.%,.&,.*,.=,.-,.;,.>,.,,.',.a=.),.!,.~,.{,.],.^,./,.(,._,.:,.<,.[,.},.|,.1,.2,.3,.4,.5,.6,.4,.7,.4,.8,.G;.9,.0,.a,.b,.c,.d,.e,.f,.g,.h,.i,.*..*..*..*..*..*..*..*..*..*..*..*..*..*..*..*..*..[>.j,.k,.l,.m,.n,.o,.p,.q,.r,.s,.)-.t,.u,.v,.w,.x,.y,.[>.*..*..*..*..*..*..*..*..*..*..*..*..*..*..*..*..*..*..*..*..*..*..*..*..*..*..*..*..*..*..*..*..*..[>.*..[>.z,.3& A,.B,.C,.D,.E,.F,.G,.H,.I,.J,.K,.L,.M*.y,.M,. T,.U,.V,.W,.X,.W,.W,.Y,.Z,.`,.<>..V '.u*.u*.u*.u*.u*.u*.u*.u*.u*.u*.u*.u*.u*.u*.u*.u*.u*.u*.u*.u*.u*.u*.u*.u*.u*.u*.u*.u*.u*.u*.u*.u*.u*.u*.l>.3>..'.+'.@'.3>.l>.l>.#'.4>.A-.mW 5>.#'.$'.%'.u*.u*.l>.f&.&'.*'.='.-'.;'.>'.,'.''.)'.!'.~'.R,.b$.%'.{'.]'.^'./'.('._'.:'.<'.['.}'.|'.1'.z>.Z-.2'.3'.q#.q#.q#.4'.5'.6'.7'.8'.9'.q#.q#.q#.0'.a'.b'.c'.q#.q#.q#.q#.q#.q#.q#.d'.e'.f'.g'.h'.i'.j'.k'.l'.m'.n'.o'.p'.q'.r'.s'.t'.u'.v'.w'.x'.y'.z'.A'.B'.C'.D'.E'.F'.G'.H'.I'.J'.K'.L'.M'.N'.O'.P'.Q'.R'.S'.T'.U'.V'.W'.X'.Y'.Z'.`'.L . )..).8,.+).@).#).$).%).&).*).=).-).D%.;).`'.>).u*.u*.u*.u*.u*.u*.u*.u*.u*.u*.u*.u*.u*.u*.>).j,.,).').)).!).~).{).]).^)./).y,.u*.()._).:).<).[).}).^-.>).u*.u*.u*.u*.u*.u*.u*.u*.u*.u*.u*.u*.u*.u*.u*.u*.u*.u*.u*.u*.u*.u*.u*.u*.u*.u*.u*.u*.u*.u*.u*.u*.b$.b$.+W |).2& 7% +>.@>.1).2).3).4).IS 5).6).7).8).9).0).a).b).c).d).e).f).g).", +"[>.[>.[>.[>.[>.[>.[>.[>.[>.[>.h).v*.i).j).F> _, _, _, _, F> T,.k).l).m).n).m).m).o).p).q).<>..V b$.[>.[>.[>.[>.[>.[>.[>.[>.[>.[>.[>.[>.[>.[>.[>.[>.[>.[>.[>.[>.[>.[>.[>.[>.[>.[>.[>.[>.[>.[>.[>.[>.[>.[>.%'.>).x-.r).s).t).[>.%'.k>.#'.4>.A-.u).v).~=.l>.[>.[>.[>.k>.'=.w).x).y).z).A).k>.B).C).D).E).7>.%'.[>.F).G).H)._'.I).J).K).L).M).N).O).v>.P).Q).R).S).q#.q#.q#.q#.q#.q#.q#.q#.q#.q#.q#.q#.T).U).V).W).X).Y).Z).`). !.q#.q#.q#..!.+!.@!.#!.$!.%!.&!.*!.=!.-!.;!.>!.,!.'!.)!.!!.~!.{!.]!.^!./!.(!._!.:!..[>.[>.[>.[>.[>.[>.[>.[>.[>.[>.[>.[>.[>.[>.b$.y!.z!.A!.B!.C!.D!.E!.F!.G!.,>.y,.H!.I!.J!.K!.L!.M!.N!.O!.R,.[>.[>.[>.[>.[>.[>.[>.[>.[>.[>.[>.[>.[>.[>.[>.[>.[>.[>.[>.[>.[>.[>.[>.[>.[>.[>.[>.[>.[>.[>.[>.[>.[>.h).v*.P!.T* 7% 6% Q!.R!.S!.T!.U!.V!.W!.X!.Y!.Z!.`!. ~.^-.^-..~.+~.@~.#~.$~.", +"$'.$'.$'.$'.$'.$'.$'.$'.$'.$'.%~.*L &~.*~.F> f= f= f= f= w- =~.-~.;~.>~.,~.'~.'~.)~.!~.~~.{~.)Z N*.$'.$'.$'.$'.$'.$'.$'.$'.$'.$'.$'.$'.$'.$'.$'.$'.$'.$'.$'.$'.$'.$'.$'.$'.$'.$'.$'.$'.$'.$'.$'.$'.$'.$'.$'.]~.^~./~.(~._~.{'.:~.$'.]~.<~.4>.A-.[~.}~.|~.8>.$'.$'.b$.:~.1~.2~.3~.4~.5~.<~.6~.7~.8~.{'.:~.9~.0~.a~.b~.c~.d~.e~.f~.g~.h~.i~.j~.k~.l~.m~.n~.o~.p~.q#.q#.q#.q~.r~.s~.t~.u~.v~.q#.q#.q#.w~.x~.y~.z~.A~.B~.C~.D~.E~.F~.G~.q#.H~.I~.J~.K~.L~.M~.N~.O~.P~.Q~.R~.S~.T~.U~.V~.W~.X~.Y~.Z~.`~. {..{.+{.@{.#{.${.%{.&{.*{.${.={.-{.;{.>{.,{.'{.){.!{.~{.{{.]{.^{./{.({._{.:{.<{.[{.}{.|{.1{.2{.1{.3{.4{.5{.6{.7{.8{.9{.0{.a{.b{.c{.d{.$'.$'.$'.$'.$'.$'.$'.$'.$'.$'.$'.$'.$'.$'.$'.e{.f{.g{.h{.i{.j{.k{.l{.m{.n{.d{. '.o{.p{.q{.r{.s{.t{.u{.v{.w{.x{.$'.$'.$'.$'.$'.$'.$'.$'.$'.$'.$'.$'.$'.$'.$'.$'.$'.$'.$'.$'.$'.$'.$'.$'.$'.$'.$'.$'.$'.$'.$'.$'.%~.v*.y{.z{.5% =- A{.B{.#>.C{.D{.E{.F{.;8 G{.H{.I{.J{.K{.$'.L{.M{.N{.O{.P{.", +"N*.N*.N*.N*.N*.N*.N*.N*.N*.N*.%~.*L Q{.F' w- f= f= f= f= [8 R{.S{.T{.U{.V{.W{.W{.X{.Y{.Z{.{~.)Z N*.N*.N*.N*.N*.N*.N*.N*.N*.N*.N*.N*.N*.N*.N*.N*.N*.N*.N*.N*.N*.N*.N*.N*.N*.N*.N*.N*.N*.N*.N*.N*.N*.N*.N*.N*.x{.`{.,'. ]..].<{.N*.N*.N*.]~.+].@].A-.#].$].<~.]~.N*.N*.%].&].*].+].=].-].;].>].,].'].)].x{.!].~].{].]].^]./].(]._].:].<].[].}].|].1].2].3].4].5].q#.q#.q#.6].7].8].9].0].a].q#.q#.q#.b].c].d].e].f].g].h].i].j].k].l].m].n].o].p].q].r].s].t].u].v].w].x].y].z].A].B].C].D].E].F].G].H].I].J].K].L].M].N].O].P].Q].R].S].T].U].V].W].X].s~.Y].Z].`]. ^..^.+^.@^.#^.$^.%^.&^.*^.=^.-^.-^.;^.>^.,^.'^.)^.!^.~^.{^.]^.^^./^.(^.N*.N*.N*.N*.N*.N*.N*.N*.N*.N*.N*.N*.N*.N*.N*.N*._^.:^.<^.[^.}^.|^.1^.2^.3^._^.o{.4^.5^.6^.().7^.8^.9^.0^.a^.b^.~&.N*.N*.N*.N*.N*.N*.N*.N*.N*.N*.N*.N*.N*.N*.N*.N*.N*.N*.N*.N*.N*.N*.N*.N*.N*.N*.N*.N*.N*.N*.N*.c^.v$.Jj d^.7% 6% 6% Q!.R!.e^.f^.g^.h^.i^.j^.k^.l^.m^.n^.(^.%].b^.o^.i` p^.", +"$'.$'.$'.$'.$'.$'.$'.$'.$'.$'.q^.r^.Q{.wu w- F> F> F> F> R* s^.S{.t^.u^.v^.w^.w^.x^.y^.z^.A^.[Z h).$'.$'.$'.$'.$'.$'.$'.$'.$'.$'.$'.$'.$'.$'.$'.$'.$'.$'.$'.$'.$'.$'.$'.$'.$'.$'.$'.$'.$'.$'.$'.$'.$'.$'.$'.$'.B^.C^.D^.E^.F^.)].B^.$'.$'.B^.G^.H^.I^.J^.K^.C^.B^.$'.x{.$'.:~.%].k>.L^.M^.N^.O^.P^.Q^.&].R^.S^.T^.U^.V^.W^.X^.Y^.Z^.`^. /../.+/.@/.|'.#/.$/.%/.q#.q#.q#.&/.*/.=/.-/.;/.>/.q#.q#.q#.,/.'/.)/.!/.~/.{/.]/.^/.//.(/._/.:/.(.,(.!* 5% =- =- '(.)(.1).!(.~(.{(.](.^(./(.((._(.:(.r{.0~.x{.h).i,.<(.", +"N*.N*.N*.N*.N*.N*.N*.N*.N*.N*.c^.mP Q{./, R* w- F> F> F> I) [(.S{.}(.|(.1(.2(.2(.3(.4(.5(.6(.A` %~.N*.N*.N*.N*.N*.N*.N*.N*.N*.N*.N*.N*.N*.N*.N*.N*.N*.N*.N*.N*.N*.N*.N*.N*.N*.N*.N*.N*.N*.N*.N*.N*.N*.N*.N*.N*.7(.8(.9(.0(.a(.b(.7(.N*.N*.N*.c(.d(.e(.A-.#].f(.g(.h(.i(.j(.N*.c(.k(.l(.m(.n(.o(.p(.q(.r(.s(.t(.u(.v(.w(.x(.y(.z(.A(.B(.C(.D(.E(.F(.G(.H(.I(.J(.q#.q#.q#.K(.L(.M(.N(.O(.P(.q#.q#.q#.Q(.R(.S(.$,.T(.U(.V(.W(.X(.Y(.Z(.`(. _.._.+_.@_.#_.$_.%_.&_.*_.=_.-_.;_.>_.,_.'_.)_.!_.~_.{_.]_.^_./_.(_.__.:_.<_.[_.}_.|_.1_.2_.3_.4_.5_.6_.7_.8_.9_.0_.a_.b_.c_.d_.e_.f_.g_.h_.i_.7(.j_.k_.l_.m_.n_.o_.H/.p_.q_.r_.s_.t_.u_.v_.w{.h).N*.N*.N*.N*.N*.N*.N*.N*.N*.N*.N*.N*.N*.N*.N*.N*.j_.w_.x_.y_.z_.A_.B_.C_.D_.n{.E_.F_.G_.H_.I_.N*.J_.K_.L_.M_.N_.O_.!].N*.N*.N*.N*.N*.N*.N*.N*.N*.N*.N*.N*.N*.N*.N*.N*.N*.N*.N*.N*.N*.N*.N*.N*.N*.N*.N*.N*.N*.N*.c^. M P_.z{.6% >% >% >% Q_.R_.S_.T_.|X U_.V_.W_.X_.Y_.Z_.W*.`_. :. :.`_..:.", +"%~.%~.%~.%~.%~.%~.%~.%~.%~.%~.+:.mP @:.#:.R* w- w- w- w- Q* $:.%:.&:.*:.=:.-:.-:.;:.>:.,:.':.P+.q^.%~.%~.%~.%~.%~.%~.%~.%~.%~.%~.%~.%~.%~.%~.%~.%~.%~.%~.%~.%~.%~.%~.%~.%~.%~.%~.%~.%~.%~.%~.%~.%~.%~.%~.%~.%~.%~.j(.):.!:.~:.{:.b(.c(.%~.%~.%~.j(.]:.e(.^:./:.(:._:.::.<:.c(.`_.j(.[:.}:.|:.1:.2:.3:.4:.5:.6:.7:.8:.9:.0:.a:.b:.c:.d:.e:.f:.g:.h:.i:.j:.k:.l:.q#.q#.q#.m:.n:.o:.p:.q:.r:.q#.q#.q#.s:.t:.u:.v:.w:.x:.y:.z:.A:.B:.C:.D:.E:.F:.G:.H:.I:.J:.K:.L:.M:.J:.N:.O:.P:.=_.Q:.R:.S:.T:.U:.V:.W:.X:.Y:.Z:.`:. <..<.+<.N].@<.#<.$<.%<.&<.*<.=<.-<.;<.><.,<.'<.)<.!<.~<.{<.]<.^<./<.(<._<.:<.<<.[<.m_.}<.|<.1<.2<.3<.4<.5<.6<.7<.8<.9<.7(.%~.%~.%~.%~.%~.%~.%~.%~.%~.%~.%~.%~.%~.%~.7(.0<.a<.b<.c<.d<.e<.f<.g<.h<.i<.j<.k<.l<.m<.%~.%~.7(.n<.o<.p<.q<.`'.r<.s<.`_.%~.%~.%~.%~.%~.%~.%~.%~.%~.%~.%~.%~.%~.%~.%~.%~.%~.%~.%~.%~.%~.%~.%~.%~.%~.%~.%~.%~.c^.JX ~Z 3& =- =- =- =- t<.u<.v<.w<.x<.n^.s<.n<.y<.z<.A<.B<.C<.n<.7(.7(.%~.", +"D<.D<.D<.D<.D<.D<.D<.D<.D<.D<.+:.E<.@:.v- Q* R* w- w- w- s~ {J %:.F<.G<.H<.I<.I<.J<.K<.L<.M<.P+.q^.D<.D<.D<.D<.D<.D<.D<.D<.D<.D<.D<.D<.D<.D<.D<.D<.D<.D<.D<.D<.D<.D<.D<.D<.D<.D<.D<.D<.D<.D<.D<.D<.D<.D<.D<.D<.D<.N<.O<.P<.Q<.UF q(.N<.D<.D<.D<.D<.j(.R<.e(.S<.T<.U<.V<.W<.)].j(.N<.N<.X<.Y<.Z<.`<. [..[.+[.@[.#[.$[.%[.&[.*[.=[.-[.;[.>[.,[.'[.)[.![.~[.{[.][.q#.q#.q#.^[./[.([._[.:[.<[.q#.q#.q#.[[.}[.|[.1[.q#.q#.q#.2[.3[.4[.5[.6[.7[.8[.9[.0[.a[.b[.c[.d[.e[.f[.g[.h[.i[.j[.k[.l[.m[.n[.o[.n[.p[.q[.r[.s[.t[.u[.v[.w[.x[.y[.z[.A[.B[.C[.D[.E[.F[.G[.H[.I[.J[.K[.$/.L[.M[.N[.O[.P[.Q[.R[.S[.T[.U[.V[.W[.X[.Y[.Z[.`[. }..}.+}.@}.#}.$}.s<.D<.D<.D<.D<.D<.D<.D<.D<.D<.D<.D<.D<.D<.D<.J_.%}.&}.*}.=}.yz -}.;}.>}.,}.'}.)}.!}.~}.%~.D<.D<.{}.c(.]}.^}./}.(}.;).q^.N<.D<.D<.D<.D<.D<.D<.D<.D<.D<.D<.D<.D<.D<.D<.D<.D<.D<.D<.D<.D<.D<.D<.D<.D<.D<.D<.D<.D<.+:.A%._}.=- >% =- >% >% >% :}.<}.[}.}}.n!.|}.J_.{}.%'.1}.2}.3}.4}.J_.D<.N<.", +"%~.%~.%~.%~.%~.%~.%~.%~.%~.%~.5}.6}.i).J= Q* R* R* R* R* s~ 7}.%:.8}.9}.0}.a}.a}.b}.c}.d}.e}.[#.c^.%~.%~.%~.%~.%~.%~.%~.%~.%~.%~.%~.%~.%~.%~.%~.%~.%~.%~.%~.%~.%~.%~.%~.%~.%~.%~.%~.%~.%~.%~.%~.%~.%~.%~.%~.%~.%~.%~.f}.g}.h}.~:.i}.j}.k}.%~.%~.%~.%~.f}.l}.m}.n}.o}.p}.q}.r}.s}.t}.f}.u}.v}.w}.x}.y}.z}.A}.B}.C}.D}.E}.F}.G}.H}.6:.I}.r<.J}.K}.L}.M}.N}.q#.q#.q#.q#.q#.q#.q#.O}.P}.q#.q#.q#.q#.q#.q#.q#.Q}.R}.S}.T}.U}.n].V}.W}.X}.Y}.#_.Z}.`}. |..|.+|.@|.#|.$|.+|.%|.&|.*|.b[.b[.=|.-|.;|.>|.,|.'|.)|.!|.~|.{|.]|.^|./|.(|._|.:|.<|.[|.}|.||.1|.2|.3|.4|.5|.6|.7|.8|.9|.0|.a|.b|.c|.d|.e|.f|.g|.h|.i|.j|.k|.l|.m|.n|.o|.p|.q|.r|.F%.s|.)J %~.%~.%~.%~.%~.%~.%~.%~.%~.%~.%~.%~.q^.t|.u|.v|.w|.x|.y|.z|.A|.B|.C|.D|.E|.F|.G|.t|.%~.%~.%~.%~.%~.H|.I|.J|.K|.L|.M|.t_.%~.%~.%~.%~.%~.%~.%~.%~.%~.%~.%~.%~.%~.%~.%~.%~.%~.%~.%~.%~.%~.%~.%~.%~.%~.%~.%~.%~.c^.$'.N|.4& 2& >% >% 1& 1& t<.O|.P|.Q|.R|.n^.t_.)J S|.T|.U|.V|.W|.X|.)J q^.", +"c^.c^.c^.c^.c^.c^.c^.c^.c^.c^.Y|.TV i).M, s~ Q* Q* Q* Q* S* Z|.%:.`|. 1..1.K<.K<.+1.@1.#1.$1.}&.+:.c^.c^.c^.c^.c^.c^.c^.c^.c^.c^.c^.c^.c^.c^.c^.c^.c^.c^.c^.c^.c^.c^.c^.c^.c^.c^.c^.c^.c^.c^.c^.c^.c^.c^.c^.c^.c^.c^.%1.&1.*1.=1.-1.;1.t}.c^.c^.c^.c^.%1.q^.>1.,1.'1.)1.!1.~1.{1.]1.%1.^1./1.(1._1.:1.<1.[1.}1.|1.11.21.31.41.51.61.71.81.91.01.a1.b1.c1.d1.e1.f1.g1.h1.i1.j1.k1.l1.m1.n1.o1.p1.q1.r1.s1.t1.u1.v1.w1.x1.y1.z1.A1.B1.C1.D1.E1.F1.G1.H1.I1.J1.K1.L1.M1.N1.O1.O1.P1.Q1.R1.S1.T1.U1.V1.W1.X1.Y1.Z1.`1. 2..2.+2.@2.#2.$2.%2.&2.*2.=2.-2.;2.>2.,2.'2.)2.!2.~2.{2.]2.^2./2.(2._2.:2.<2.[2.}2.|2.12.12.22.32.42.52.k}.62.72.82.92.a<.c^.c^.c^.c^.c^.c^.c^.c^.c^.c^.c^.02.a2.b2.c2.d2.e2.f2.g2.h2.i2.j2.k2.l2.m2.n2.o2.p2.k}.c^.c^.c^.c^.c^.t_.q2.r2.s2.t2.u2.v2.02.c^.c^.c^.c^.c^.c^.c^.c^.c^.c^.c^.c^.c^.c^.c^.c^.c^.c^.c^.c^.c^.c^.c^.c^.c^.c^.+:.q^.Y|.^, x- >% 1& 1& w2.=- x2.y2.z2.A2.B2.C2.t_.a<.D2.E2.F2.G2.H2.I2.t_.", +"q^.q^.q^.q^.q^.q^.q^.q^.q^.q^.Y|.TV @:.*- J2.Q* Q* Q* Q* S* m-.%:.K2.L2.M2.c}.c}.N2.O2.P2.$1.}&.+:.q^.q^.q^.q^.q^.q^.q^.q^.q^.q^.q^.q^.q^.q^.q^.q^.q^.q^.q^.q^.q^.q^.q^.q^.q^.q^.q^.q^.q^.q^.q^.q^.q^.q^.q^.q^.q^.q^.q^.t}.Q2.R2.S2.T2.U2.%1.q^.q^.q^.%1.%1.V2.W2.X2.Y2.Z2.`2. 3..3.+3.c^.@3.#3.$3.%3.&3.*3.=3.-3.;3.>3.,3.'3.)3.!3.~3.{3.]3.^3./3.(3._3.:3.<3.[3.}3.|3.13.23.33.43.53.63.73.83.93.03.a3.b3.c3.d3.e3.f3.g3.h3.i3.j3.k3.l3.m3.n3.o3.p3.q3.r3.M1.s3.t3.u3.v3.w3.x3.y3.z3.A3.B3.C3.D3.E3.F3.G3.H3.I3.J3.K3.L3.M3.N3.O3.P3.Q3.R3.S3.T3.U3.V3.W3.X3.Y3.Z3.`3. 4..4.+4.@4.#4.$4.%4.&4.*4.=4.-4.;4.>4.,4.Z[.'4.)4.!4.92.~4.{4.]4.t_.q^.q^.q^.q^.q^.q^.q^.q^.q^.q^.q^.^4./4.(4._4.:4.<4.[4.}4.|4.14.24.34.44.54.64.74.M|.v2.q^.q^.q^.q^.q^.%1.02.84.94.04.a4.b4.v2.02.q^.q^.q^.q^.q^.q^.q^.q^.q^.q^.q^.q^.q^.q^.q^.q^.q^.q^.q^.q^.q^.q^.q^.q^.q^.+:.Y|.A%.c4.z{.=- >% >% >% =- d4.e4.f4.g4.h4.i4.f}.q^.a<.X|.j4.k4.l4.m4.n4.", +"+:.+:.+:.+:.+:.+:.+:.+:.+:.+:.o4.nd i).p4.S* s~ s~ s~ s~ S= m-.q4.r4.s4.t4.u4.u4.v4.w4.x4.y4.W*.Y|.+:.+:.+:.+:.+:.+:.+:.+:.+:.+:.+:.+:.+:.+:.+:.+:.+:.+:.+:.+:.+:.+:.+:.+:.+:.+:.+:.+:.+:.+:.+:.+:.+:.+:.+:.+:.+:.+:.+:.z4.A4.B4.C4.D4.E4.z4.+:.+:.+:.+:.F4.G4.H4.I4.J4.K4.L4.M4.N4.O4.P4.Q4.R4.S4.T4.U4.V4.W4.X4.Y4.Z4.`4. 5..5.+5.@5.#5.$5.%5.&5.*5.=5.-5.;5.>5.,5.'5.)5.!5.~5.{5.]5.^5./5.(5._5.:5.<5.[5.}5.|5.15.25.d[.35.45.55.65.75.85.95.05.a5.b5.r3.c5.d5.e5.f5.g5.h5.i5.j5.k5.l5.m5.n5.o5.p5.q5.r5.s5.t5.u5.v5.w5.x5.y5.z5.A5.B5.C5.D5.E5.F5.G5.H5.I5.J5.K5.L5.M5.#5.N5.O5.P5.Q5.R5.S5.T5.U5.V5.W5.X5.Y5.Z5.`5. 6..6.+6.@6.#6.$6.%6.P4.+:.+:.+:.+:.+:.+:.+:.+:.+:.+:.&6.*6.=6._#.-6.;6.>6.,6.'6.)6.!6.~6.{6.]6.^6./6.(6._6.:6.+:.+:.+:.+:.+:.P4.<6.[6.}6.|6.16.26.:6.+:.+:.+:.+:.+:.+:.+:.+:.+:.+:.+:.+:.+:.+:.+:.+:.+:.+:.+:.+:.+:.+:.+:.+:.+:.+:.36.&..46.S= >% 1& 1& 1& >% x- VI 56.66.76.86.96.P4.+:.P4.X|.06.a6.b6.r<.", +"Y|.Y|.Y|.Y|.Y|.Y|.Y|.Y|.Y|.Y|.o4.&..c6._, S= s~ s~ s~ s~ S= d6.e6.f6.g6.h6.i6.i6.j6.g6.k6.l6.%'.Y|.Y|.Y|.Y|.Y|.Y|.Y|.Y|.Y|.Y|.Y|.Y|.Y|.Y|.Y|.Y|.Y|.Y|.Y|.Y|.Y|.Y|.Y|.Y|.Y|.Y|.Y|.Y|.Y|.Y|.Y|.Y|.Y|.Y|.Y|.Y|.Y|.Y|.Y|.Y|.m6.F4.n6.o6.p6.4|.q6.z4.Y|.Y|.Y|.r6.F4.s6.t6.u6.v6.w6.x6.y6.z6.A6.B6.C6.D6.E6.F6.kZ G6.H6.I6.J6.K6.L6.M6.N6.O6.P6.Q6.*5.R6.S6.T6.U6.V6.W6.X6.Y6.Z6.`6. 7..7.+7.@7.#7.$7.%7.&7.*7.=7.-7.;7.>7.,7.'7.)7.!7.~7.j[.{7.]7.^7./7.(7._7.{7.:7.<7.[7.}7.|7.17.27.37.47.57.67.77.87.97.07.a7.b7.c7.d7.e7.f7.g7.h7.i7.`6.j7.k7.l7.m7.n7.o7.p7.q7.r7.s7.t7.u7.v7.w7.x7.y7.z7.A7.W5.B7.C7.D7.E7.F7.G7.H7.I7.J7.K7.L7.M7.N7.O7.P7.:6.Y|.Y|.Y|.Y|.Y|.Y|.Y|.Y|.Y|.Y|.Y|.>1.Q7.R7.S7.T7.U7.V7.W7.X7.Y7.Z7.`7. 8..8.+8.@8.#8.$8.%8.m6.Y|.Y|.Y|.m6.%8.&8.*8.=8.-8.m<.;8.>8.r6.Y|.Y|.Y|.Y|.Y|.Y|.Y|.Y|.Y|.Y|.Y|.Y|.Y|.Y|.Y|.Y|.Y|.Y|.Y|.Y|.Y|.Y|.Y|.Y|.,8.E<.'8.)8.>% 3& 3& 3& 1& 2& !8.~8.{8.]8.^8./8.%8.Y|.^1.Y|.0<.!W (8._8.", +"Y|.Y|.Y|.Y|.Y|.Y|.Y|.Y|.Y|.Y|.o4.&..i).:8.S= S* S* S* S* && d6.<8.[8.}8.|8.18.18.28.38.48.58.%'.Y|.Y|.Y|.Y|.Y|.Y|.Y|.Y|.Y|.Y|.Y|.Y|.Y|.Y|.Y|.Y|.Y|.Y|.Y|.Y|.Y|.Y|.Y|.Y|.Y|.Y|.Y|.Y|.Y|.Y|.Y|.Y|.Y|.Y|.Y|.Y|.Y|.Y|.Y|.Y|.Y|.z4.q6.68.S2.d..n6.F4.Y|.Y|.Y|.Y|.r6.78.88.98.08.a8.b8.c8.d8.e8.f8.g8.h8.i8.j8.k8.l8.m8.n8.o8.p8.q8.r8.s8.t8.u8.v8.w8.x8.y8.z8.A8.B8.C8.D8.E8.F8.G8.H8.I8.J8.K8.L8.M8.N8.O8.P8.Q8.R8.S8.T8.U8.V8.O1.W8.X8.Y8.Z8.`8. 9.h[..9.+9.47.@9.#9.$9.%9.&9.*9.=9.-9.;9.l5.>9.,9.'9.)9.!9.~9.{9.]9.^9./9.(9._9.:9.<9.[9.}9.|9.19.29.39.49.59.69.79.89.99.09.a9.b9.c9.d9.e9.f9.&5.g9.h9.i9.j9.k9.l9.m9.n9.o9.p9.q9.r9.s9.t9.u9.:6.Y|.Y|.Y|.Y|.Y|.Y|.Y|.Y|.Y|.Y|.Y|.P4.v9.w9.x9.y9.z9.A9.W7.B9.C9.D9.E9.>1.>8.F9.G9.H9.k}.m6.z4.Y|.Y|.Y|.Y|.z4.5}.I9.J9.K9.L9.M9.N9.%8.r6.Y|.Y|.Y|.Y|.Y|.Y|.Y|.Y|.Y|.Y|.Y|.Y|.Y|.Y|.Y|.Y|.Y|.Y|.Y|.Y|.Y|.Y|.Y|.,8.O9.P9.Q9.6% >% >% >% >% 1& R9.S9.T9.U9.uo L .V9.P4.m6.P4.r9.`'.W9.X9.", +"Y|.Y|.Y|.Y|.Y|.Y|.Y|.Y|.Y|.Y|.,8.A%.c6.Y9.&& S= S* S* S* Z9.`9. 0..0.+0.@0.#0.#0.$0.%0.&0.*0.x{.o4.Y|.Y|.Y|.Y|.Y|.Y|.Y|.Y|.Y|.Y|.Y|.Y|.Y|.Y|.Y|.Y|.Y|.Y|.Y|.Y|.Y|.Y|.Y|.Y|.Y|.Y|.Y|.Y|.Y|.Y|.Y|.Y|.Y|.Y|.Y|.Y|.Y|.Y|.Y|.Y|.Y|.=0.-0.;0.>0.,0.36.'0.Y|.Y|.Y|.Y|.Y|.=0.)0.F4.!0.~0.{0.]0.^0./0.(0._0.:0.<0.[0.}0.|0.10.20.30.40.50.60.70.80.90.00.a0.b0.c0.d0.J5.e0.f0.g0.h0.i0.j0.k0.l0.m0.n0.o0.p0.q0.r0.s0.t0.u0.v0.w0.x0.y0.z0.A0.B0.C0.t3.D0.E0.F0.17.G0.H0.I0.J0.K0.L0.M0.N0.O0.P0.Q0.R0.J:.S0.T0.U0.V0.W0.X0.Y0.Z0.`0. a..a.+a.@a.#a.$a.%a.&a.*a.=a.-a.;a.>a.,a.'a.)a.!a.~a.{a.]a.^a./a.(a._a.:a..&& && && && !* f= Aa.Ba.Ca.g4.^8.I2.Da.9a.Ea.Da.Fa.Ga.Ha.", +"36.36.36.36.36.36.36.36.36.36.,8.A%.c6.F> && S= S= S= S= !* Ia.e6.Ja.g6.Ka.g6.g6.La.g6.Ma.Na.x{.o4.36.36.36.36.36.36.36.36.36.36.36.36.36.36.36.36.36.36.36.36.36.36.36.36.36.36.36.36.36.36.36.36.36.36.36.36.36.36.36.36.36.'0.Oa.Pa.Qa.Ra.Sa.=0.'0.Ea.36.Ea.9a.Ea.Ta.Ua.Va.Wa.Xa.>1.Ya.Za.`a. b..b.+b.@b.#b._a.$b.%b.&b.*b.=b.-b.;b.>b.,b.'b.)b.!b.~b.{b.]b.^b./b.(b._b.:b.c.,c.'c.)c.!c.~c.{c.]c.^c./c.KX Y|.Ea.pa.(c._c./6.:c.oa..ic.e6.jc.g6.kc.lc.lc.mc.g6.nc.Na.x{.o4.o4.o4.o4.o4.o4.o4.o4.o4.o4.o4.o4.o4.o4.o4.o4.o4.o4.o4.o4.o4.o4.o4.o4.o4.o4.o4.o4.o4.o4.o4.o4.o4.o4.o4.o4.o4.o4.o4.o4.o4.o4.o4.=0.oc.pc.qc.rc.sc.tc.'0.o4.o4.ka.pa.d.,d.'d.)d.!d.~d.{d.]d.G0.#9.^d./d.%9.(d._d.h5.:d. _, _, _, _, M, R* %e.:~.&e.*e.=e.-e.;e.o4.'0.o4.ka.pa.>e.", +",e.,e.,e.,e.,e.,e.,e.,e.,e.,e.7c.'e.)e.w- !* && && && && T* !e.e6.~e.{e.]e.^e.^e./e.g6.(e._e.7(.,8.,e.,e.,e.,e.,e.,e.,e.,e.,e.,e.,e.,e.,e.,e.,e.,e.,e.,e.,e.,e.,e.,e.,e.,e.,e.,e.,e.,e.,e.,e.,e.,e.,e.,e.,e.,e.,e.,e.,e.,e.,e.,e.:e.f.,f.'f.)f.!f.~f.{f.]f.^f./f.(f._f.:f.g.,g.'g.)g.!g.~g.{g.]g.^g./g.(g._g.:g.h.,h.'h.)h.[g.!h.~h.{h.]h.Dd.^h./h.(h._h.ff.Qf.,8.,8.,8.,8.,8.,e.:h..mh.~~ f= _, _, _, f= y; nh.o4.o4.,8.oh.ph.qh.rh.4a.ke.Td.0h.4e.,8.", +",8.,8.,8.,8.,8.,8.,8.,8.,8.,8.sh.'e.th.uh.T* !* !* !* !* x- vh.e6.wh.xh.yh.zh.zh.Ah.^e.Bh.Ch.N<.lh.,8.,8.,8.,8.,8.,8.,8.,8.,8.,8.,8.,8.,8.,8.,8.,8.,8.,8.,8.,8.,8.,8.,8.,8.,8.,8.,8.,8.,8.,8.,8.,8.,8.,8.,8.,8.,8.,8.,8.,8.,8.,8.Dh.Eh.Fh.T. Wa Gh.Hh.Ih.:e.,8.0h.Jh.,8.0h.=g.Kh.Lh.Mh.Nh.Oh.Ph.Qh.Rh.Sh.Th.Uh.ie.Vh.Wh.Xh.8f.Yh.9f.Zh.`h. i..i.+i.@i.#i.$i.%i.&i.*i.=i.-i.;i.>i.,i.'i.)i.!i.~i.{i.]i.^i./i.(i._i.:i.e.&j.*j.=j.-j.Jh.0h.,8.,8.,8.;j.>j.,j.'j.)j.!j.~j.{j.)0.,8.,8.,8.,8.,8.,8.,8.,8.,8.,8.,8.,8.,8.,8.,8.,8.,8.,8.,8.lh.,e.sh.]j.*~._, *- *- *- f= ^j./j.(j.sh.lh.uf.Mf._j.:j.k.,k.'k.)k.!k.~k.{k.]k.^k./k.(k._k.:k.:k.l.,l.'l.pk.)l.!l.~l.Fk.lh.{l.]l.^l./l.(l._l.:l.m.,m.'m.)m.!m.~m.{m.]m.pk.Lk.^m./m.cf.(m._m.:m.n.,n.'n.q#.q#.q#.)n.!n.~n.{n.]n.q#.q#.^n./n.(n._n.:n.j.sh.sh.sh.sh.]m.%o.&o.*o.{j.=o.-o.0h.sh.sh.sh.sh.sh.sh.sh.sh.sh.sh.sh.sh.sh.sh.sh.sh.sh.sh.sh. l.;o.>o./, *- *- J= *- *- f= ,o.'o.7e )o.sh.!o.~o.{o.]o.^o./o.(o._o.:o.p.,p.'p.q#.q#.)p.#f.!p.~p.{p.]p.^p./p.(p._p.:p.q.,q.,q.'q.)q.!q.9o.z4. l.sh.sh.sh.sh.sh.sh.sh.sh.sh.sh.sh.sh.sh.sh.sh.sh.sh.sh.sh.sh.sh.sh.sh.sh.sh.sh.sh.sh.sh.sh.sh.sh.sh.sh.sh.sh.sh.sh.sh.sh.sh.sh.sh.sh.sh.sh.sh.sh.0o.~q.{q.]q.^q./q.(q._q.:q.r.,r.'r.)r.!r.~r.{r.]r.^r./r.Am.sh.sh.Am.(r._r.:r.JE s.,s.'s.)s.!s.~s.{s.]s.^s./s.q#.q#.q#.(s._s.:s.t.Np.,t.'t.)t.!t.Cr.hr.>t.~t.{t.]t.^t./t.(t._t.hr.}j.}j.}j.}j.}j.}j.}j.}j.}j.}j.}j.}j.}j.}j.}j.}j.:t.7e u.,u.'u.)u.!u.~u.{u.]u.Yl.^u./u.(u._u.:u.% v..v.+v.@v.#v.N7.N7.$v.%v.&v.dt.'0.)o.Zu.Zu.Zu.Zu.Zu.Zu.Zu.Zu.Zu.Zu.Zu.Zu.Zu.Zu.Zu.Zu.Zu.Zu.Zu.Zu.Zu.Zu.Zu.Zu.Zu.Zu.Zu.Zu.Zu.Zu.Zu.Zu.Zu.Zu.Zu.Zu.Zu.Zu.Zu.Zu.Zu.Zu.Zu.Zu.Zu.Zu.Zu.Zu.Zu.Zu.*v.)o.=v.-v.;v.>v.,v.'v.)v.!v.~v.{v.]v.^v./v.(v._v.:v.w.,w.'w.)w.!w.~w.{w.]w.^w./w.(w._w.:w.% vw.ww.xw.yw.zw.Aw.Aw.Bw.@v.Cw.dt.'0.Dw.nm.nm.nm.nm.nm.nm.nm.nm.nm.nm.nm.nm.nm.nm.nm.nm.nm.nm.nm.nm.nm.nm.nm.nm.nm.nm.nm.nm.nm.nm.nm.nm.nm.nm.nm.nm.nm.nm.nm.nm.nm.nm.nm.nm.nm.nm.nm.nm.nm.nm.nm.*v.)o.fj.Ew.Fw.Gw.Hw.Iw.Jw.Kw.Lw.Mw.Nw.Ow.Pw.Qw.Rw.Sw.Tw.Uw.Vw.Ww.Xw.Yw.Zw.`w. x..x.+x.@x.#x.$x.%x.&x.*x.=x.-x.T. ;x.q#.q#.q#.>x.,x.qs.'x.)x.!x.~x.{x.]x.^x./x.(x._x.:x.y.,y.Aj.9w.cu.nm.nm.nm.nm.nm.nm.nm.nm.nm.nm.nm.nm.nm.)o.)o.,e.'y.<) *- v- v- v- *- ^j.)y.sh.)o.)o.nm.nm.nm.nm.nm.nm.nm.!y.du.'^.~y.", +"tr.tr.tr.tr.tr.tr.tr.tr.tr.tr.:t.lh.{y.5% ]y.1& 1& 1& 1& ~6 ^y./y.(y._y.:y.z.,z.'z.)z.!z.~z.{z.]z.^z./z.(z._z.:z.% >% ~6 Sz.Tz.Uz.Vz.Wz.Xz.Xz.Yz._y.Zz.1y.4e.:t.)o.)o.)o.)o.)o.)o.)o.)o.)o.)o.)o.)o.)o.)o.)o.)o.)o.)o.)o.)o.)o.)o.)o.)o.)o.)o.)o.)o.)o.)o.)o.)o.)o.)o.)o.)o.)o.)o.)o.)o.)o.)o.)o.)o.)o.)o.)o.)o.)o.)o.)o.)o.)o.`z. A..A.+A.@A.#A.$A.%A.ky.&A.*A.=A.-A.;A.>A.,A.'A.)A.ny.!A.~A.{A.py.]A.^A.5z./A.9v.9v.6z.(A._A.$x.:A.B.,B.'B.)B.4z.4z.!B.~B.{B.]B.^B./B.(B._B.:B.8z.)o.)o.)o.)o.)o.)o.)o.)o.)o.)o.)o.)o.:t.sh.% >% >% =- 3B.4B.5B.C.,C.'C.)C.!C.~C.{C.]C.^C./C.(C._C.:C.D.,D.TC.'D.yB.'D.uy.)D.!D.~D.{D.]D.^D./D.(D._D.q#.q#.q#.:D.E.,E.'E.-E.yB.)E.!E.~E.{E.]E.^E./E.(E.`D.PD.Nz.Nz.Nz.Nz.Nz.Nz.Nz.Nz.Nz.Nz.Nz.JC._E.:E.c 6% 6% 6% 6% |E.1E.2E.QC.3E.4E.4E.5E.6E.7E.8E.0j.Nz.}E.}E.}E.}E.}E.}E.}E.}E.}E.}E.}E.}E.}E.}E.}E.}E.}E.}E.}E.}E.}E.}E.}E.}E.}E.}E.}E.}E.}E.}E.}E.}E.}E.}E.}E.}E.}E.}E.}E.}E.}E.}E.}E.}E.}E.}E.}E.}E.}E.}E.}E.}E.aB.9E.0E.aE.bE.cE.dE.eE.fE.gE.hE.iE.jE.kE.lE.mE.nE.oE.pE.qE.rE.iB.sE.tE.aB.uy.uE.yB.yB.vE.wE.xE.yE.zE.AE.BE.CE.DE.q#.q#.q#.EE.FE.GE.HE.IE.JE.KE.LE.ME.NE.q#.q#.q#.gv.OE.PE.q#.q#.QE.RE.SE.TE.q#.q#.q#.UE.VE.WE.XE.YE.ZE.`E. F.q#.q#..F.+F.@F.#F.$F.%F.&F.*F.=F.-F.;F.>F.,F.'F.)F.!F.~F.{F.]F.^F./F.(F._F.:F.% 5% 6% 6% 6% h$.DF.EF.6E.FF.GF.GF.HF.IF.JF.SC.*l.YA.Nz.Nz.Nz.Nz.Nz.Nz.Nz.Nz.Nz.Nz.Nz.Nz.Nz.Nz.Nz.Nz.Nz.Nz.Nz.Nz.Nz.Nz.Nz.Nz.Nz.Nz.Nz.Nz.Nz.Nz.Nz.Nz.Nz.Nz.Nz.Nz.Nz.Nz.Nz.Nz.Nz.Nz.Nz.Nz.Nz.Nz.Nz.Nz.Nz.Nz.Nz.Nz.Nz.KF.LF.MF.NF.OF.PF.QF.0E.RF.SF.TF.UF.VF.WF.XF.YF.ZF.`F. G..G.+G.@G.-E.TC.#G.Nz.Nz.$G.%G.&G.*G.=G.-G.;G.>G.q#.q#.q#.q#.q#.q#.q#.,G.'G.)G.!G.~G.{G.]G.^G./G.(G._G.:G.XE.H.,H.'H.)H.-E.Nz.Nz.Nz.Nz.Nz.Nz.Nz.Nz.Nz.Nz.!H.~H.{H.v] *- v- v- /, v- v- ~~ ]H.Jd.^H.Nz.Nz.Nz.Nz.Nz.Nz.Nz.Nz.Nz.Nz.Nz.Nz.", +"Lf.Lf.Lf.Lf.Lf.Lf.Lf.Lf.Lf.Lf.Lf.JC.JC.)o./H.]y.7% 5% 5% 5% (H._H.:H.IF.I.,I.'I.)I.!I.~I.{I.]I.~I.^I./I.(I._I.:I.J.,J.'J.)J.!J.~J.{J.]J.^J./J.(J._J.:J.K.,K.'K.,H.)K.!K.~K.$G.$G.$G.$G.$G.$G.$G.$G.$G.BI.`u.{K.gn J= F' /, /, /, y; Q* CF.)o.JC.$G.$G.$G.$G.$G.$G.$G.$G.$G.$G.$G.$G.", +"^H.^H.^H.^H.^H.^H.^H.^H.^H.^H.^H.^H.BI.]K.^K.GI.8% 7% 7% 7% /K.(K._K.qm.:K.L.,L.'L.)L.!L.~L.{L.]L.^L./L.nK.nK.~K.(L._L.:L.M.,M.'M.)M.!M.~M.{M.]M.^M./M.(M._M.:M.N.,N.'N.pw.pw.pw.pw.pw.pw.pw.[E.[E.)o.)N./' v- /, /, /, v- /' )N.)o.[E.[E.pw.pw.pw.pw.pw.pw.pw.pw.pw.pw.pw.pw.", +"^H.^H.^H.^H.^H.^H.^H.^H.^H.^H.^H.^H.!H.}E.CF.|= 5% 8% 8% 8% +Z !N.~N.O.,O.DL.^H.^H.bN.^H. M.'O.)O.!O.~O.{O.]O.^O.+H./O.(O._O.:O.P.,P.'P.)P.!P.~P.{P.]P.^P./P.(P._P.:P.K.RP.SP.TP.UP.VP.WP. M.[E.[E.[E.[E.[E.[E.[E.[E.[E.[E.[E.[E.[E.[E.[E.[E.[E.[E.!H.XP.YP.rF.ZP.,N.RP.`P. Q..Q.PI.DO.+Q.@Q.#Q.$Q.%Q..N.[E.[E.[E.[E.[E.[E.BI.:t.HC.f= y; /, /, /, /, J= gn &Q.ja.qO.[E.[E.[E.[E.[E.[E.[E.[E.[E.[E.[E.[E.[E.", +"BI.BI.BI.BI.BI.BI.BI.BI.BI.BI.BI.BI.BI.qO.qL.Q.,Q.,Q.'Q.yO.)Q.!Q.3y.sO.BI.BI.BI.BI.BI.BI.BI.BI.BI.BI.BI.BI.BI.BI.BI.BI.BI.BI.BI.BI.BI.BI.BI.BI.BI.BI.BI.BI.BI.BI.BI.BI.BI.BI.BI.BI.BI.BI.BI.BI.BI.BI.BI.BI.BI.BI.BI.BI.BI.BI.BI.BI.BI.BI.~Q.{Q.]Q.{Q.^Q./Q.(Q._Q.:Q.R.,R.'R.+Q.)R.!R.~R.{R.]R.^R./R.(R._R.:R.S.,S.'S.)S.!S.~S.{S.]S.^S./S.(S._S.GQ.:S.T.,T.,T.'T.BR.)T.!Q.yB.$T.BI.BI.BI.BI.BI.BI.BI.BI.BI.BI.BI.BI.BI.BI.BI.BI.BI.BI.BI.BI.BI.BI.BI.BI.BI.BI.BI.BI.BI.BI.BI.BI.BI.BI.BI.BI.BI.BI.BI.BI.BI.BI.BI.BI.BI.BI.BI.BI.BI.BI.BI.BI.BI.|R.!T.~T.BI.BI.{T.sO.]T.^T./T.(T.OR._T.NR.:T.U.,U.'U.)U.!U.~U.OS.LS.~T.{U.]U.^U./U.]h BI.BI.BI.BI.BI.BI.BI.BI.BI.BI.BI.BI.BI.BI.BI.BI.BI.BI.BI.BI.BI.BI.BI.dR.eR.(U.gR._U.{T.:U.V.,V.'V.)V.!V.HU.$T.jU.~V.{V.]V.HU.$T.$T.$T.$T.$T.$T.HU.|U.^V./V.(V._V.:V.W.,W.'W.)W.!W.~W.-W.{W.]W.^W./W.(W._W.:W.X.,X.'X.)X.!X.~X.{X.]X.^X./X.(X._X.:X.Y.,Y.'Y.)Y.!Y.~Y.~Y.{Y.]Y.^Y./Y.ZJ.#T.#T.#T.#T.#T.#T.#T.#T.#T.#T.#T.#T.#T.#T.#T.#T.#T.#T.#T.#T.#T.#T.#T.#T.#T.#T.#T.#T.#T.#T.#T.#T.#T.#T.#T.#T.#T.#T.#T.#T.#T.#T.#T.#T.#T.#T.#T.#T.#T.#T.#T.#T.#T.#T.#T.#T.#T.(Y._Y.:Y.;X.Z.,Z.'Z.)Z.FY.!Z.~Z.{Z.]Z.^Z.%Z.&Y.PW.-Y./Z.k( y; `.,`._Y.hZ.]X.ZV.ZV.ZV.ZV.ZV.ZV.ZV.ZV.ZV.ZV.ZV.ZV.ZV.ZV.ZV.ZV.ZV.ZV.ZV.ZV.ZV.ZV.ZV.ZV.ZV.ZV.ZV.ZV.]X.VX.YX.'`.)`.!`.wS.~`.{`.]`.hZ.]X.(Y.DO.^`./`.ZT.rX.(`.Ad._`.:`.F' ~~ ~~ +, +' +) +! +~ +{ +] +^ +/ +( +FY.#T.(Y.PW._ +: +< +[ +#T.#T.#T.#T.#T.#T.#T.#T.#T.#T.#T.#T.#T.#T.#T.#T.#T.#T.#T.#T.#T.#T.#T.#T.#T.#T.#T.#T.#T.#T.XY.} +| +1 +2 +3 +4 +5 +6 +7 +XY.yU.8 +9 +0 +a +b +yU.#T.c +Ro y; .+,.+'.+).+!.+~.+{.+].+^.+/.+(.+_.+:.+<.+[.+}.+|.+1.+2.+#T.sL.p`.< +3.+4.+( +p`.sL.sL.sL.sL.sL.sL.sL.sL.sL.sL.sL.sL.sL.sL.sL.sL.sL.sL.sL.sL.sL.sL.sL.sL.sL.sL.sL.sL.sL.sL.sL.[ +o +&Y.5.+6.+} +7.+8.+9.+0.+a.+[ +PW.b.+c.+d.+e.+f.+g.+D, h.+~~ ~~ |.V.+W.+Q +[`.Q +X.+Y.+Z.+U +Q +[`.Q +`.+ ++.+++++Q +z`.@++#++$++%++W +&++*++W +P`.o +=++-++;++>++,++'++(Y.Q`.)++!++~++{++]++^++/++(++_++:++<++[++{.+].+}++|++1++2++3++4++5++6++7++8++9++P`.p`.0++a++b++o +o +P`.[`.[`.[`.[`.[`.[`.[`.[`.[`.[`.[`.[`.[`.[`.[`.[`.[`.[`.[`.[`.[`.[`.[`.[`.[`.[`.[`.[`.[`.[`.[`.[`.a.+c++d++1 +e++f++g++h++i++j++P`.a.+b +k++l++m++n++o++P= y; <) <) ~~ ~~ *Y.:`.p++q++j.+[`.[`.[`.[`.[`.[`.[`.[`.[`.[`.[`.[`.[`.[`.[`.[`.", +"r++r++r++r++r++r++r++r++r++r++r++r++r++r++r++j.+(Z.s++t++{* u++v++w++x++y++z++z++A++B++C++D++8Q.(`.r++r++r++r++r++r++r++r++r++r++r++r++r++r++r++r++r++r++r++r++r++r++r++r++r++r++r++r++r++r++r++r++r++r++r++r++r++r++r++r++r++r++r++r++r++r++r++r++r++r++r++r++r++r++r++r++r++E++F++G++H++I++J++K++L++M++L++N++O++P++Q++R++S++T++T++N++U++V++W++X++V +Y++Z++H++PW.r++r++r++r++r++r++r++r++r++r++r++r++r++r++r++r++r++r++r++r++r++r++r++r++r++r++r++r++r++r++r++r++`++ @+.@++@+@@+#@+Z++r++Z++$@+%@+Z.+$@+Z++r++H++&@+*@+=@+-@+Z++H++;@+>@+,@+;@+'@+)@+!@+~@+{@+J +]@+^@+/@+(@+_@+:@+{@+` +<@+[@+}@+|@+1@+2@+3@+4@+5@+6@+7@+8@+9@+0@+a@+b@+c@+$C d@+e@+f@+g@+h@+i@+G++G++j@+k@+l@+m@+n@+G++r++r++r++r++r++r++r++r++r++r++r++r++r++r++r++r++r++r++r++r++r++r++r++r++r++r++r++r++r++r++r++r++r++H++o@+p`.p@+q@+r@+s@+t@+u@+v@+` +PW.H++w@+x@+y@+3K.z@+A@+#+J +H++(`.H++Y++,#+'#+)#+!#+~#+{#+]#+M@+^#+/#+(#+_#+:#+<#+Z++H++[#+}#+|#+1#+2#+3#+4#+5#+6#+7#+8#+9#+9@+0#+a#+b#+$C c#+d#+e#+T. f#+g#+h#+i#+G++j#+k#+l#+m#+N++o@+e +e +e +e +e +e +e +e +e +e +e +e +e +e +e +e +e +e +e +e +e +e +e +e +e +e +e +e +e +e +e +e +e +e +^#+<@+n#+o#+p#+q#+r#+s#+[ +o@+H++N++t#+u#+v#+w#+x#+y#+z#+<) ~~ ~~ ~~ /' A#+B#+#T.(`.e +e +e +e +e +e +e +e +e +e +e +e +e +e +e +e +", +"r++r++r++r++r++r++r++r++r++r++r++r++r++r++r++C#+r++D#+E#+F#+G#+H#+I#+J#+K#+L#+L#+M#+= N#+O#+fQ.C#+r++r++r++r++r++r++r++r++r++r++r++r++r++r++r++r++r++r++r++r++r++r++r++r++r++r++r++r++r++r++r++r++r++r++r++r++r++r++r++r++r++r++r++r++r++r++r++r++r++r++r++r++r++r++r++r++r++o@+^#+P#+Q#+P#+R#+S#+S#+T#+Y@+U#+V#+W#+W@+X#+X@+P#+E++Y@+Z++Y#+Z#+`#+ $+.$+Z++r++r++r++r++r++r++r++r++r++r++r++r++r++r++r++r++r++r++r++r++r++r++r++r++r++r++r++r++r++r++r++r++r++r++Z++r++e ++$+@$+#$+$$+r++%$+&$+*$+=$+-$+$$+r++r++Z++;$+>$+,$+Y++Z++'$+)$+!$+~$+{$+]$+^$+/$+'$+Z++.$+($+_$+:$+<$+[$+M@+Z++o@+}$+|$+1$+2$+3$+4$+5$+6$+7$+8$+9$+0$+0@+a$+b$+c$+d$+e$+f$+g$+h$+i$+j$+0#+k$+l$+m$+n$+H++H++r++r++r++r++r++r++r++r++r++r++r++r++r++r++r++r++r++r++r++r++r++r++r++r++r++r++r++r++r++r++r++r++r++r++r++H++o$+a.+p@+p$+q$+r$+s$+t$+[#+i#+r++i#+u$+v$+w$+x$+y$+<) <) <) <) i.+:`.z$+CV.D#+r++r++r++r++r++r++r++r++r++r++r++r++r++r++r++r++r++", +"(`.(`.(`.(`.(`.(`.(`.(`.(`.(`.(`.(`.(`.(`.(`.(`.D#+!H.$e.4& A$+B$+C$+D$+E$+F$+F$+G$+D$+H$+I$+HU.j.+(`.(`.(`.(`.(`.(`.(`.(`.(`.(`.(`.(`.(`.(`.(`.(`.(`.(`.(`.(`.(`.(`.(`.(`.(`.(`.(`.(`.(`.(`.(`.(`.(`.(`.(`.(`.(`.(`.(`.(`.(`.(`.(`.(`.(`.(`.(`.(`.(`.(`.(`.(`.(`.(`.(`.J$+K$+L$+M$+N$+O$+P$+Q$+R$+S$+T$+C#+U$+V$+W$+X$+X$+Y$+Z$+X$+`$+ %+.%++%+@%+#%+$%+%%+(`.(`.(`.(`.(`.(`.(`.(`.(`.(`.(`.(`.(`.(`.(`.(`.(`.(`.(`.(`.(`.(`.(`.(`.(`.(`.(`.(`.(`.(`.(`.(`.(`.(`.&%+-@+*%+=%+-%+;%+C#+%%+o@+>%+,%+'%+&$+&%+(`.%%+)%+!%+~%+{%+]%+^%+%%+/%+(%+_%+:%+<%+[%+%%+(`.C#+}%+|%+1%+2%+3%+4%+5%+&%+6%+7%+8%+9%+0%+a%+b%+c%+d%+e%+f%+g%+h%+i%+j%+k%+l%+m%+n%+o%+p%+q%+r%+s%+t%+u%+v%+w%+x%+M$+(`.(`.(`.(`.(`.(`.(`.(`.(`.(`.(`.(`.(`.(`.(`.(`.(`.(`.(`.(`.(`.(`.(`.(`.(`.(`.(`.(`.(`.(`.(`.(`.(`.(`.(`.(`.(`. %+y%+z%+A%+B%+C%+D%+E%+F%+6%+(`.M$+G%+H%+I%+J%+K%+L%+(, (, (, &+,&+'&+)&+&%+!&+~&+{&+]&+^&+&%+j.+%%+C#+%e./&+(&+_&+:&+j.+<&+[&+}&+|&+1&+Y +2&+3&+<&+4&+5&+6&+7&+8&+9&+0&+&%+6%+a&+b&+c&+d&+e&+f&+g&+h&+i&+j&+k&+l&+m&+n&+o&+p&+q&+r&+s&+t&+u&+v&+^%+w&+x&+y&+z&+L$+A&+j.+j.+j.+j.+j.+j.+j.+j.+j.+j.+j.+j.+j.+j.+j.+j.+j.+j.+j.+j.+j.+j.+j.+j.+j.+j.+j.+j.+j.+j.+j.+j.+j.+j.+j.+j.+j.+%%+A&+^#+B&+C&+r@+D&+E&+F&+G&+%%+D#+]h H&+I&+J&+K&+L&+M&+<) <) /' N&+O&+ZV.D#+j.+j.+j.+j.+j.+j.+j.+j.+j.+j.+j.+j.+j.+j.+j.+j.+j.+", +")&+)&+)&+)&+)&+)&+)&+)&+)&+)&+)&+)&+)&+)&+)&+)&+D#+C#+P&+Vk.D@+Q&+R&+S&+T&+U&+U&+V&+W&+X&+Y&+&R.D#+)&+)&+)&+)&+)&+)&+)&+)&+)&+)&+)&+)&+)&+)&+)&+)&+)&+)&+)&+)&+)&+)&+)&+)&+)&+)&+)&+)&+)&+)&+)&+)&+)&+)&+)&+)&+)&+)&+)&+)&+)&+)&+)&+)&+)&+)&+)&+)&+)&+)&+)&+)&+)&+)&+)&+)&+)&+)&+&%+Z&+%&+%&+`&+ *+`$+.*++*+@*+@*+#*+$*+W$+%*+&*+$&+**+=*+-*+;*+>*+-&+,*+&%+&%+)&+)&+)&+)&+)&+)&+)&+)&+)&+)&+)&+)&+)&+)&+)&+)&+)&+)&+)&+)&+)&+)&+)&+)&+)&+)&+)&+)&+)&+)&+)&+)&+)&+C#+'*+)*+!*+~*+)*+:&+)&+&%+{*+]*+^*+/*+&%+&%+(*+:&+_*+:*+<*+[*+&%+)&+:&+}*+|*+1*+2*+3*+4*+5*+6*+7#+7*+8*+9*+0*+a*+(`.A&+&%+b*+c*+d*+e*+f*+g*+h*+i*+j*+k*+l*+m*+n*+o*+p*+q*+r*+s*+t*+u*+v*+&&+w*+x*+y*+z*+%%+&%+)&+)&+)&+)&+)&+)&+)&+)&+)&+)&+)&+)&+)&+)&+)&+)&+)&+)&+)&+)&+)&+)&+)&+)&+)&+)&+)&+)&+)&+)&+)&+)&+)&+)&+)&+)&+)&+)&+)&+<&+A*+B*+C*+D*+E*+F*+G*+H*+<&+I*+J*+K*+L*+M*+N*+O*+L%+(, ~~ :`.P*+Q*+P&+)&+)&+)&+)&+)&+)&+)&+)&+)&+)&+)&+)&+)&+)&+)&+)&+)&+)&+", +"j.+j.+j.+j.+j.+j.+j.+j.+j.+j.+j.+j.+j.+j.+j.+j.+j.+R*+M%+KC.>Y.S*+T*+U*+V*+W*+W*+X*+U*+Y*+Z*+rX.}`.j.+j.+j.+j.+j.+j.+j.+j.+j.+j.+j.+j.+j.+j.+j.+j.+j.+j.+j.+j.+j.+j.+j.+j.+j.+j.+j.+j.+j.+j.+j.+j.+j.+j.+j.+j.+j.+j.+j.+j.+j.+j.+j.+j.+j.+j.+j.+j.+j.+j.+j.+j.+j.+j.+j.+j.+j.+j.+j.+j.+`*+ =+.=++=+@=+#&+#=+$=+%=+&=+*=+==+-=+;=+>=+,=+'=+$=+)=+!=+~=+{=+]=+^=+j.+j.+j.+j.+j.+j.+j.+j.+j.+j.+j.+j.+j.+j.+j.+j.+j.+j.+j.+j.+j.+j.+j.+j.+j.+j.+j.+j.+j.+j.+j.+j.+j.+D#+/=+(=+_=+:=+<=+[=+}=+j.+/=+|=+1=+2=+3=+D#+}*+4=+/=+`*+5=+6=+7=+D#+]=+[*+8=+9=+0=+a=+b=+c=+d=+e=+f=+g=+9*+h=+i=+j=+k=+(*+^=+l=+m=+n=+o=+p=+q=+r=+s=+t=+u=+v=+w=+x=+y=+z=+A=+B=+C=+D=+E=+F=+G=+H=+I=+Z&+`*+j.+j.+j.+j.+j.+j.+j.+j.+j.+j.+j.+j.+j.+j.+j.+j.+j.+j.+j.+j.+j.+j.+j.+j.+j.+j.+j.+j.+j.+j.+j.+j.+j.+j.+j.+j.+j.+j.+j.+j.+`*+J=+P$+B&+K=+e.+L=+M=+J$+J=+R*+(Z.N=+O=+P=+Q=+R=+S=+T=+~~ )~ U=+CV.V=+j.+j.+j.+j.+j.+j.+j.+j.+j.+j.+j.+j.+j.+j.+j.+j.+j.+j.+", +"}`.}`.}`.}`.}`.}`.}`.}`.}`.}`.}`.}`.}`.}`.}`.}`.}`.P&+r++W=+X=+Y=+Z=+5( `=+ -+ -+.-+5( +-+@-+^X.P&+}`.}`.}`.}`.}`.}`.}`.}`.}`.}`.}`.}`.}`.}`.}`.}`.}`.}`.}`.}`.}`.}`.}`.}`.}`.}`.}`.}`.}`.}`.}`.}`.}`.}`.}`.}`.}`.}`.}`.}`.}`.}`.}`.}`.}`.}`.}`.}`.}`.}`.}`.}`.}`.}`.}`.}`.}`.}`.}`.}`.J=+J=+J=+]=+ =+#-+$-+%-+ =+&-+*-+=-+--+;-+>-+,-+'-+)-+!-+~-+{-+]-+^-+,-+]=+}`.}`.}`.}`.}`.}`.}`.}`.}`.}`.}`.}`.}`.}`.}`.}`.}`.}`.}`.}`.}`.}`.}`.}`.}`.}`.}`.}`.}`.}`.}`.}`.]=+/-+(-+_-+:-+<-+[-+}-+}`.|-+1-+2-+FJ 3-+4-+5-+6-+D#+7-+8-+9-+0-+a-+/=+^=+b-+c-+d-+o@+e-+/=+f-+g-+h-+i-+j-+:%+k-+l-+m-+d=+n-+o-+p-+q-+r-+s-+t-+u-+v-+w-+x-+y-+z-+A-+B-+C-+D-+E-+F-+G-+H-+I-+J-+K-+L-+M-+J=+}`.}`.}`.}`.}`.}`.}`.}`.}`.}`.}`.}`.}`.}`.}`.}`.}`.}`.}`.}`.}`.}`.}`.}`.}`.}`.}`.}`.}`.}`.}`.}`.}`.}`.}`.}`.}`.}`.}`.}`.}`.#-+N-+c&+O-+P-+Q-+R-+S-+T-+Q`.W=+U-+V-+W-+X-+Y-+Z-+`-+/' (, ;+ZV.R*+}`.}`.}`.}`.}`.}`.}`.}`.}`.}`.}`.}`.}`.}`.}`.}`.}`.}`.", +"}`.}`.}`.}`.}`.}`.}`.}`.}`.}`.}`.}`.}`.}`.}`.}`.}`.D#+I*+.;++;+@;+#;+$;+%;+tL tL &;+$;+*;+I$+P`.P&+}`.}`.}`.}`.}`.}`.}`.}`.}`.}`.}`.}`.}`.}`.}`.}`.}`.}`.}`.}`.}`.}`.}`.}`.}`.}`.}`.}`.}`.}`.}`.}`.}`.}`.}`.}`.}`.}`.}`.}`.}`.}`.}`.}`.}`.}`.}`.}`.}`.}`.}`.}`.}`.}`.}`.}`.}`.}`.}`.}`./=+@=+=;+-;+;;+>;+h&++=+h&+,;++=+>-+';+;;+)-+);+!-+,-+!;+~;+{-+{;+/=+^-+/=+J=+}`.}`.}`.}`.}`.}`.}`.}`.}`.}`.}`.}`.}`.}`.}`.}`.}`.}`.}`.}`.}`.}`.}`.}`.}`.}`.}`.}`.}`.}`.}`.}`.];+^;+/;+(;+_;+:;+}`.}`.|-+<;+[;+};+|;+1;+2;+3;+4;+5;+6;+7;+8;+a-+P&+/=+9;+0;+a;+b;+c;+d;+e;+f;+g;+h;+i;+j;+k;+l;+m;+n;+o;+p;+q;+r;+s;+t;+u;+v;+w;+n;+x;+y;+z;+A;+B;+C;+D;+E;+F;+G;+H;+I;+J;+K;+#-+L;+}`.}`.}`.}`.}`.}`.}`.}`.}`.}`.}`.}`.}`.}`.}`.}`.}`.}`.}`.}`.}`.}`.}`.}`.}`.}`.}`.}`.}`.}`.}`.}`.}`.}`.}`.}`.}`.}`.}`.}`.}`.}`.]=+L;+6%+B&+M;+N;+O;+P;+Q;+vE.R;+zF L%+S;+T;+U;+V;+W;+X;+Y;+ZV.P&+P&+}`.}`.}`.}`.}`.}`.}`.}`.}`.}`.}`.}`.}`.}`.}`.}`.}`.}`.", +"P&+P&+P&+P&+P&+P&+P&+P&+P&+P&+P&+P&+P&+P&+P&+P&+P&+P&+I*+[`.Z;+`;+ >+.>++>+@>+@>+#>+$>+%>+&>+fQ.V=+P&+P&+P&+P&+P&+P&+P&+P&+P&+P&+P&+P&+P&+P&+P&+P&+P&+P&+P&+P&+P&+P&+P&+P&+P&+P&+P&+P&+P&+P&+P&+P&+P&+P&+P&+P&+P&+P&+P&+P&+P&+P&+P&+P&+P&+P&+P&+P&+P&+P&+P&+P&+P&+P&+P&+P&+P&+P&+P&+P&+P&+P&+P&+*>+*>+=>+->+;>+>>+,>+'>+)>+)>+->+)>+!>+~>+{>+P&+]>+^>+/>+(>+b-+*>+_>+P&+P&+P&+P&+P&+P&+P&+P&+P&+P&+P&+P&+P&+P&+P&+P&+P&+P&+P&+P&+P&+P&+P&+P&+P&+P&+P&+P&+P&+P&+P&+P&+:>+<>+[>+}>+|>+1>+P&+P&+P&+_>+2>+3>+4>+5>+6>+7>+8>+9>+0>+a>+*>+P&+P&+P&+_>+m-+b>+c>+d>+e>+f>+g>+h>+i>+_*+j>+k>+l>+m>+n>+o>+p>+q>+r>+s>+t>+u>+v>+w>+x>+y>+z>+A>+B>+C>+D>+E>+F>+G>+H>+I>+J>+K>+L>+_>+P&+P&+P&+P&+P&+P&+P&+P&+P&+P&+P&+P&+P&+P&+P&+P&+P&+P&+P&+P&+P&+P&+P&+P&+P&+P&+P&+P&+P&+P&+P&+P&+P&+P&+P&+P&+P&+P&+P&+P&+P&+P&+P&+P&+;>+M>+N>+O>+P>+Q>+R>+S>+qH.T>+zF U>+V>+W>+X>+Y>+Z>+`>+ ,+f.+.,+P&+P&+P&+P&+P&+P&+P&+P&+P&+P&+P&+P&+P&+P&+P&+P&+P&+P&+P&+", +"I*+I*+I*+I*+I*+I*+I*+I*+I*+I*+I*+I*+I*+I*+I*+I*+I*+I*+I*+I*+EY.+,+@,+#,+$,+%,+%,+&,+*,+=,+-,+ZG.;,+I*+I*+I*+I*+I*+I*+I*+I*+I*+I*+I*+I*+I*+I*+I*+I*+I*+I*+I*+I*+I*+I*+I*+I*+I*+I*+I*+I*+I*+I*+I*+I*+I*+I*+I*+I*+I*+I*+I*+I*+I*+I*+I*+I*+I*+I*+I*+I*+I*+I*+I*+I*+I*+I*+I*+I*+I*+I*+I*+I*+I*+I*+>,+,,+>,+,,+',+),+!,+',+~,+S>+S>+S>+!,+!,+{,+',+],+^,+/,+(,+1>+,,+*>+>,+I*+I*+I*+I*+I*+I*+I*+I*+I*+I*+I*+I*+I*+I*+I*+I*+I*+I*+I*+I*+I*+I*+I*+I*+I*+I*+I*+I*+I*+I*+I*+_,+:,+<,+[,+},+|,+_,+I*+I*+I*+1>+I*+1,+2,+3,+4,+5,+6,+7,+R*+8,+9,+0,+,,+I*+a,+b,+c,+d,+e,+f,+g,+h,+i,+j,+k,+l,+m,+n,+o,+p,+q,+r,+s,+t,+u,+v,+w,+x,+y,+z,+A,+B,+C,+D,+E,+F,+G,+H,+I,+J,+K,+L,+M,+F,+,,+I*+I*+I*+I*+I*+I*+I*+I*+I*+I*+I*+I*+I*+I*+I*+I*+I*+I*+I*+I*+I*+I*+I*+I*+I*+I*+I*+I*+I*+I*+I*+I*+I*+I*+I*+I*+I*+I*+I*+I*+I*+I*+I*+I*+,,+>,+#-+B&+N,+O,+P,+Q,+R,+S,+D! /' y#+T,+U,+V,+W,+X,+Y,+Z,+;,+I*+I*+I*+I*+I*+I*+I*+I*+I*+I*+I*+I*+I*+I*+I*+I*+I*+I*+I*+", +"I*+I*+I*+I*+I*+I*+I*+I*+I*+I*+I*+I*+I*+I*+I*+I*+I*+I*+I*+;,+`,+ '+.'++'+@'+#'+#'+$'+%'+&'+*'+='+&%+I*+I*+I*+I*+I*+I*+I*+I*+I*+I*+I*+I*+I*+I*+I*+I*+I*+I*+I*+I*+I*+I*+I*+I*+I*+I*+I*+I*+I*+I*+I*+I*+I*+I*+I*+I*+I*+I*+I*+I*+I*+I*+I*+I*+I*+I*+I*+I*+I*+I*+I*+I*+I*+I*+I*+I*+I*+I*+I*+I*+I*+I*+I*+I*+*>+F,+-'+;'+>'+)>+,'+''+)'+',+~>+>'+-'+!'+~'+{'+^>+]'+^'+),+/'+F,+*>+I*+I*+I*+I*+I*+I*+I*+I*+I*+I*+I*+I*+I*+I*+I*+I*+I*+I*+I*+I*+I*+I*+I*+I*+I*+I*+I*+I*+I*+I*+('+_'+:'+<'+['+}'+1>+,,+I*+I*+R*+,,+a,+1>+|'+1'+2'+3'+4'+5'+6'+7'+8'+L>+*>+,,+9'+0'+yY.a'+b'+c'+d'+e'+a,+_>+,,+f'+g'+h'+i'+j'+F,+`*+k'+l'+m'+n'+o'+p'+q'+r'+x=+s'+t'+x=+u'+v'+w'+x'+y'+z'+A'+B'+),+,,+I*+I*+I*+I*+I*+I*+I*+I*+I*+I*+I*+I*+I*+I*+I*+I*+I*+I*+I*+I*+I*+I*+I*+I*+I*+I*+I*+I*+I*+I*+I*+I*+I*+I*+I*+I*+I*+I*+I*+I*+I*+I*+I*+I*+>,+F,+C'+N>+A%+D'+E'+F'+G'+H'+/' D, I'+J'+K'+L'+M'+N'+I*+P&+I*+I*+I*+I*+I*+I*+I*+I*+I*+I*+I*+I*+I*+I*+I*+I*+I*+I*+I*+I*+", +"I*+I*+I*+I*+I*+I*+I*+I*+I*+I*+I*+I*+I*+I*+I*+I*+I*+I*+I*+;,+O'+P'+Q'+R'+S'+T'+T'+U'+V'+W'+X'+Y'+tZ.Z'+I*+I*+I*+I*+I*+I*+I*+I*+I*+I*+I*+I*+I*+I*+I*+I*+I*+I*+I*+I*+I*+I*+I*+I*+I*+I*+I*+I*+I*+I*+I*+I*+I*+I*+I*+I*+I*+I*+I*+I*+I*+I*+I*+I*+I*+I*+I*+I*+I*+I*+I*+I*+I*+I*+I*+I*+I*+I*+I*+I*+I*+I*+I*+I*+I*+`'+ )+.)++)+@)+ )+#)+$)+ )+%)+&)+*)+`'+=)+-)+;)+>)+.)+,)+')+))+I*+I*+I*+I*+I*+I*+I*+I*+I*+I*+I*+I*+I*+I*+I*+I*+I*+I*+I*+I*+I*+I*+I*+I*+I*+I*+I*+I*+I*+I*+!)+~)+{)+])+^)+/)+E,+E,+I*+I*+I*+I*+I*+()+_)+:)+<)+[)+})+|)+1)+2)+3)+4)+5)+')+6)+7)+8)+}X.9)+0)+a)+b)+c)+()+d)+e)+f)+g)+h)+4)+()+`'+i)+j)+k)+l)+m)+n)+o)+p)+q)+r)+s)+D>+t)+u)+v)+w)+x)+y)+z)+A)+B)+()+I*+I*+I*+I*+I*+I*+I*+I*+I*+I*+I*+I*+I*+I*+I*+I*+I*+I*+I*+I*+I*+I*+I*+I*+I*+I*+I*+I*+I*+I*+I*+I*+I*+I*+I*+I*+I*+I*+I*+I*+I*+I*+I*+I*+I*+))+o)+;>+C)+D)+E)+F)+G)+H)+(< k( k( I)+J)+K)+L)+M)+N)++)+I*+I*+I*+I*+I*+I*+I*+I*+I*+I*+I*+I*+I*+I*+I*+I*+I*+I*+I*+I*+", +"V=+V=+V=+V=+V=+V=+V=+V=+V=+V=+V=+V=+V=+V=+V=+V=+V=+V=+V=+V=+O)+P)+Q)+R)+S)+T)+T)+U)+R'+V)+W)+X)+Y)+I*+;,+V=+V=+V=+V=+V=+V=+V=+V=+V=+V=+V=+V=+V=+V=+V=+V=+V=+V=+V=+V=+V=+V=+V=+V=+V=+V=+V=+V=+V=+V=+V=+V=+V=+V=+V=+V=+V=+V=+V=+V=+V=+V=+V=+V=+V=+V=+V=+V=+V=+V=+V=+V=+V=+V=+V=+V=+V=+V=+V=+V=+V=+V=+V=+V=+))+')+')+')+')+()++)+Z)+Z)++)+`)+ !++)+.!++!+})+@!+')+()+')+V=+V=+V=+V=+V=+V=+V=+V=+V=+V=+V=+V=+V=+V=+V=+V=+V=+V=+V=+V=+V=+V=+V=+V=+V=+V=+V=+V=+V=+V=+V=+()+#!+$!+%!+&!+/)+()+V=+V=+V=+V=+V=+V=+')+5)+*!+=!+-!+;!+>!+,!+'!+)!+!!+~!+{!+_)+]!+^!+/!+(!+_!+:!+~+,~+'~+)~+!~+~~+{~+]~+^~+*!+/~+(~+_~+:~+n-+<~+[~+}~+|~+1~+2~+3~+4~+5~+6~+7~+8~+9~+0~+_,+a~+b~+c~+q!+;,+;,+;,+;,+;,+;,+;,+;,+;,+;,+;,+;,+;,+;,+;,+;,+;,+;,+;,+;,+;,+;,+;,+;,+;,+;,+;,+;,+;,+;,+;,+;,+;,+;,+;,+;,+;,+;,+;,+;,+;,+;,+;,+;,+;,+;,+()+o)+,-+d~+e~+f~+g~+h~+i~+Vq D, j~+k~+l~+m~+n~+o~+p~+.)+o)+;,+;,+;,+;,+;,+;,+;,+;,+;,+;,+;,+;,+;,+;,+;,+;,+;,+;,+", +"q~+q~+q~+q~+q~+q~+q~+q~+q~+q~+q~+q~+q~+q~+q~+q~+q~+q~+q~+q~+{!+r~+s~+t~+u~+v~+v~+w~+R)+x~+y~+_s z~+/-+Z'+q~+q~+q~+q~+q~+q~+q~+q~+q~+q~+q~+q~+q~+q~+q~+q~+q~+q~+q~+q~+q~+q~+q~+q~+q~+q~+q~+q~+q~+q~+q~+q~+q~+q~+q~+q~+q~+q~+q~+q~+q~+q~+q~+q~+q~+q~+q~+q~+q~+q~+q~+q~+q~+q~+q~+q~+q~+q~+q~+q~+q~+q~+q~+q~+q~+q~+q~+q~+q~+q~+A~+A~+B~+C~+D~+E~+F~+G~+H~+I~+J~+K~+L~+A~+q~+q~+q~+q~+q~+q~+q~+q~+q~+q~+q~+q~+q~+q~+q~+q~+q~+q~+q~+q~+q~+q~+q~+q~+q~+q~+q~+q~+q~+q~+q~+q~+M~+N~+O~+P~+Q~+q~+q~+q~+q~+q~+q~+q~+q~+R~+S~+T~+U~+V~+W~+X~+Y~+Z~+`~+ {+.{++{+@{+#{+${+%{+&{+_e.*{+={+-'+-{+;{+>{+,{+'{+){+!{+~{+{{+]{+A~+^{+/{+({+Q;+_{+:{+<{+[{+}{+|{+1{+2{+3{+4{+V=+5{+6{+7{+8{+q~+q~+q~+q~+q~+q~+q~+q~+q~+q~+q~+q~+q~+q~+q~+q~+q~+q~+q~+q~+q~+q~+q~+q~+q~+q~+q~+q~+q~+q~+q~+q~+q~+q~+q~+q~+q~+q~+q~+q~+q~+q~+q~+q~+q~+q~+q~+9{+0{+a{+b{+c{+d{+e{+f{+g{+k( k( (< h{+i{+j{+k{+ =+l{+^{+q~+q~+q~+q~+q~+q~+q~+q~+q~+q~+q~+q~+q~+q~+q~+q~+q~+q~+", +";,+;,+;,+;,+;,+;,+;,+;,+;,+;,+;,+;,+;,+;,+;,+;,+;,+;,+;,+Z'+J~+r~+m{+n{+o{+p{+p{+j{.q{+r{+y~+s{+t{+u{+D#+Z'+.,+;,+;,+;,+;,+;,+;,+;,+;,+;,+;,+;,+;,+;,+;,+;,+;,+;,+;,+;,+;,+;,+;,+;,+;,+;,+;,+;,+;,+;,+;,+;,+;,+;,+;,+;,+;,+;,+;,+;,+;,+;,+;,+;,+;,+;,+;,+;,+;,+;,+;,+;,+;,+;,+;,+;,+;,+;,+;,+;,+;,+;,+;,+;,+;,+;,+;,+^{+B~+A~+v{+B~+K~+w{+x{+y{+z{+A{+B{+R~+L~+A~+B~+;,+;,+;,+;,+;,+;,+;,+;,+;,+;,+;,+;,+;,+;,+;,+;,+;,+;,+;,+;,+;,+;,+;,+;,+;,+;,+;,+;,+;,+;,+;,+q~+6U.C{+D{+E{+F{+q~+q~+;,+;,+;,+;,+;,+A~+A~+y4.G{+H{+I{+J{+*!+K{+R~+L{+M{+N{+O{+P{+Q{+R{+S{+T{+9{+9{+9{+U{+V{+W{+X{+Y{+Z{+`{+ ]+.]++]+9{+B~+l{+@]+#]+9{+x{+x{+x{+x{+$]+$]+%]+&]+*]+=]+-]+;]+>]+V=+B~+A~+;,+;,+;,+;,+;,+;,+;,+;,+;,+;,+;,+;,+;,+;,+;,+;,+;,+;,+;,+;,+;,+;,+;,+;,+;,+;,+;,+;,+;,+;,+;,+;,+;,+;,+;,+;,+;,+;,+;,+;,+;,+;,+;,+;,+;,+^{+^{+,]+i#+']+)]+!]+~]+{]+Rl k3 !~ /' ]]+^]+/]+(]+_]+:]+x{+l{+;,+;,+;,+;,+;,+;,+;,+;,+;,+;,+;,+;,+;,+;,+;,+;,+;,+", +"Z'+Z'+Z'+Z'+Z'+Z'+Z'+Z'+Z'+Z'+Z'+Z'+Z'+Z'+Z'+Z'+Z'+Z'+Z'+Z'+<]+r~+[]+}]+|]+1]+1]+2]+1]+3]+4]+5]+0p 6]+7]+8]+Z'+Z'+Z'+Z'+Z'+Z'+Z'+Z'+Z'+Z'+Z'+Z'+Z'+Z'+Z'+Z'+Z'+Z'+Z'+Z'+Z'+Z'+Z'+Z'+Z'+Z'+Z'+Z'+Z'+Z'+Z'+Z'+Z'+Z'+Z'+Z'+Z'+Z'+Z'+Z'+Z'+Z'+Z'+Z'+Z'+Z'+Z'+Z'+Z'+Z'+Z'+Z'+Z'+Z'+Z'+Z'+Z'+Z'+Z'+Z'+Z'+Z'+Z'+Z'+Z'+Z'+Z'+Z'+Z'+Z'+l{+Z'+R~+9]+0]+a]+T. b]+c]+l{+8{+Z'+Z'+Z'+Z'+Z'+Z'+Z'+Z'+Z'+Z'+Z'+Z'+Z'+Z'+Z'+Z'+Z'+Z'+Z'+Z'+Z'+Z'+Z'+Z'+Z'+Z'+Z'+Z'+Z'+Z'+Z'+Z'+Z'+8{+d]+e]+f]+g]+h]+i]+Z'+Z'+Z'+Z'+Z'+Z'+j]+8{+k]+l]+m]+n]+o]+B)+p]+Z'+q]+r]+s]+t]+~!+<]+u]+v]+w]+x]+y]+8{+R~+z]+A]+B]+C]+D]+;S E]+F]+R~+j]+Z'+Z'+w{+8{+Z'+Z'+Z'+Z'+Z'+Z'+Z'+R~+G]+H]+I]+J]+K]+L]+M]+={+8{+Z'+Z'+Z'+Z'+Z'+Z'+Z'+Z'+Z'+Z'+Z'+Z'+Z'+Z'+Z'+Z'+Z'+Z'+Z'+Z'+Z'+Z'+Z'+Z'+Z'+Z'+Z'+Z'+Z'+Z'+Z'+Z'+Z'+Z'+Z'+Z'+Z'+Z'+Z'+Z'+Z'+Z'+Z'+Z'+Z'+Z'+8]+zZ.N]+O]+P]+Q]+R]+S]+T]+!i D, #{ U]+V]+W]+X]+Y]+Z]+`]+A~+Z'+Z'+Z'+Z'+Z'+Z'+Z'+Z'+Z'+Z'+Z'+Z'+Z'+Z'+Z'+Z'+Z'+", +" ^+ ^+ ^+ ^+ ^+ ^+ ^+ ^+ ^+ ^+ ^+ ^+ ^+ ^+ ^+ ^+ ^+ ^+ ^+ ^+.^++^+@^+#^+$^+%^+%^+&^+n{+*^+=^+-^+;^+2% >^+E,+,^+ ^+ ^+ ^+ ^+ ^+ ^+ ^+ ^+ ^+ ^+ ^+ ^+ ^+ ^+ ^+ ^+ ^+ ^+ ^+ ^+ ^+ ^+ ^+ ^+ ^+ ^+ ^+ ^+ ^+ ^+ ^+ ^+ ^+ ^+ ^+ ^+ ^+ ^+ ^+ ^+ ^+ ^+ ^+ ^+ ^+ ^+ ^+ ^+ ^+ ^+ ^+ ^+ ^+ ^+ ^+ ^+ ^+ ^+ ^+ ^+ ^+ ^+ ^+ ^+ ^+ ^+ ^+ ^+ ^+'^+ ^+)^+!^+~^+{^+]^+^^+/^+(^+'^+ ^+ ^+ ^+ ^+ ^+ ^+ ^+ ^+ ^+ ^+ ^+ ^+ ^+ ^+ ^+ ^+ ^+ ^+ ^+ ^+ ^+ ^+ ^+ ^+ ^+ ^+ ^+ ^+ ^+ ^+ ^+ ^+ ^+_^+:^+<^+[^+}^+|^+1^+'^+ ^+ ^+ ^+ ^+ ^+)^+2^+3^+4^+5^+6^+B~+ ^+'^+ ^+)^+7^+8^+9^+'^+'^+0^+a^+b^+c^+d^+9j.)^+7^+e^+f^+g^+h^+i^+j^+k^+l^+'^+ ^+ ^+ ^+ ^+ ^+ ^+ ^+ ^+ ^+ ^+ ^+'^+m^+n^+o^+p^+q^+r^+s^+t^+u^+ ^+ ^+ ^+ ^+ ^+ ^+ ^+ ^+ ^+ ^+ ^+ ^+ ^+ ^+ ^+ ^+ ^+ ^+ ^+ ^+ ^+ ^+ ^+ ^+ ^+ ^+ ^+ ^+ ^+ ^+ ^+ ^+ ^+ ^+ ^+ ^+ ^+ ^+ ^+ ^+ ^+ ^+ ^+ ^+ ^+Z'+v^+^X.w^+X;+x^+y^+z^+A^+B^+g{+C^+yr D^+YR.E^+F^+G^+H^+I^+J^+)^+ ^+ ^+ ^+ ^+ ^+ ^+ ^+ ^+ ^+ ^+ ^+ ^+ ^+ ^+ ^+ ^+", +"j]+j]+j]+j]+j]+j]+j]+j]+j]+j]+j]+j]+j]+j]+j]+j]+j]+j]+j]+,^+.^++^+K^+L^+M^+N^+N^+O^+N^+P^+Q^+R^+-^+S^+BF.T^+v^+j]+j]+j]+j]+j]+j]+j]+j]+j]+j]+j]+j]+j]+j]+j]+j]+j]+j]+j]+j]+j]+j]+j]+j]+j]+j]+j]+j]+j]+j]+j]+j]+j]+j]+j]+j]+j]+j]+j]+j]+j]+j]+j]+j]+j]+j]+j]+j]+j]+j]+j]+j]+j]+j]+j]+j]+j]+j]+j]+'^+j]+j]+j]+j]+j]+j]+j]+j]+j]+j]+j]+j]+2^+U^+V^+W^+X^+Y^+u^+j]+j]+j]+j]+j]+j]+j]+j]+j]+j]+j]+j]+j]+j]+j]+j]+j]+j]+j]+j]+j]+j]+j]+j]+j]+j]+j]+j]+j]+j]+j]+j]+j]+j]+2^+Z^+`^+ /+./++/+@/+_^+j]+j]+j]+j]+j]+j]+,]+_^+#/+$/+%/+&/+*/+2^+j]+'^+,]+u^+!^+,]+=/+-/+;/+T. >/+,/+'/+)/+!/+~/+{/+]/+^/+//+(/+_/+=/+'^+j]+j]+j]+j]+j]+j]+j]+j]+j]+j]+j]+'^+2^+:/+(+u^+8]+8]+8]+8]+8]+8]+8]+8]+8]+8]+8]+8]+8]+8]+8]+8]+", +"B#+B#+B#+B#+B#+B#+B#+B#+B#+B#+B#+B#+B#+B#+B#+B#+B#+B#+B#+B#+,(+'(+)(+!(+~(+L^+L^+{(+L^+](+^(+/(+-^+_* ((+_(+/-+:(+B#+B#+B#+B#+B#+B#+B#+B#+B#+B#+B#+B#+B#+B#+B#+B#+B#+B#+B#+B#+B#+B#+B#+B#+B#+B#+B#+B#+B#+B#+B#+B#+B#+B#+B#+B#+B#+B#+B#+B#+B#+B#+<(+<(+B#+B#+B#+B#+B#+B#+B#+B#+B#+B#+[(+<(+[(+}(+|(+1(+B#+<(+[(+B#+B#+B#+B#+B#+B#+B#+B#+2(+3(+, +4(+5(+<(+6(+B#+B#+B#+B#+B#+B#+B#+B#+B#+B#+B#+B#+B#+B#+B#+B#+B#+B#+B#+B#+B#+B#+B#+B#+B#+B#+B#+B#+B#+B#+B#+B#+B#+B#+8]+7(+8(+9(+0(+a(+b(+[(+B#+B#+B#+B#+B#+B#+B#+B#+b(+c(+d(+e(+,^+[(+<(+B#+B#+B#+B#+B#+[(+<(+[(+f(+t^+g(+h(+i(+j(+k(+XW.l(+m(+n(+o(+p(+b(+B#+B#+B#+B#+B#+B#+B#+B#+B#+B#+B#+B#+B#+q(+r(+s(+t(+u(+v(+w(+x(+v^+<(+B#+B#+B#+B#+B#+B#+B#+B#+B#+B#+B#+B#+B#+B#+B#+B#+B#+B#+B#+B#+B#+B#+B#+B#+B#+B#+B#+B#+B#+B#+B#+B#+B#+B#+B#+B#+B#+B#+B#+B#+B#+B#+,^+y(+tZ.z(+yr D, g{+A(+B(+C(+D(+E(+F(+G(+M!+H(+,^+[(+2(+I(+J(+K(+L(+M(+N(+B#+B#+B#+B#+B#+B#+B#+B#+B#+B#+B#+B#+B#+B#+B#+", +"8]+8]+8]+8]+8]+8]+8]+8]+8]+8]+8]+8]+8]+8]+8]+8]+8]+8]+8]+v^+O(+P(+Q(+R(+S(+j/+j/+T(+j/+U(+V(+W(+f% @^ X(+Y(+q~+2/+v^+8]+8]+8]+8]+8]+8]+8]+8]+8]+8]+8]+8]+8]+8]+8]+8]+8]+8]+8]+8]+8]+8]+8]+8]+8]+8]+8]+8]+8]+8]+8]+8]+8]+8]+8]+8]+8]+8]+8]+Z(+`(+`(+`(+ _+<(+8]+8]+8]+<(+b(+b(+b(+._+._+8]++_+@_+#_+$_+%_+Z(+b(+8]+8]+8]+8]+8]+8]+8]+8]+b(+&_+*_+=_+g(+b(+8]+8]+8]+8]+8]+8]+8]+8]+8]+8]+8]+8]+8]+8]+8]+8]+8]+8]+8]+8]+8]+8]+8]+8]+8]+8]+8]+8]+8]+8]+8]+8]+8]+8]+8]+-_+B#+;_+>_+,_+'_+-_+8]+8]+8]+8]+8]+8]+8]+8]+8]+b(+)_+!_+~_+{_+]_+b(+8]+8]+8]+8]+8]+8]+8]+b(+^_+q(+b(+q(+Z(+/_+<(+(_+__+:_+<_+[_+}_+._+8]+8]+8]+8]+8]+8]+8]+8]+8]+8]+8]+8]+8]+b(+|_+1_+=]+2_+3_+4_+5_+6_+b(+8]+8]+8]+8]+8]+8]+8]+8]+8]+8]+8]+8]+8]+8]+8]+8]+8]+8]+8]+8]+8]+8]+8]+8]+8]+8]+8]+8]+8]+8]+8]+8]+8]+8]+8]+8]+8]+8]+8]+8]+8]+8]+2/+8]+7_+[8 P= k( k3 7f ~J 8_+9_+0_+a_+b_+:&+7_+8]+8]+<(+M(+c_+d_+e_+f_+2(+8]+8]+8]+8]+8]+8]+8]+8]+8]+8]+8]+8]+8]+8]+8]+", +"v^+v^+v^+v^+v^+v^+v^+v^+v^+v^+v^+v^+v^+v^+v^+v^+v^+v^+v^+2/+O(+P(+g_+h_+i_+!(+!(+j_+!(+k_+l_+m_+_* _* )* f% n_+o_+2/+v^+v^+v^+v^+v^+v^+v^+v^+v^+v^+v^+v^+v^+v^+v^+v^+v^+v^+v^+v^+v^+v^+v^+v^+v^+v^+v^+v^+v^+v^+v^+v^+v^+v^+v^+v^+v^+v^+Z(+`(+p_+q_+r_+s_+b(+._+._+b(+v^+t_+u_+v_+w_+x_+y_+z_+FJ A_+B_+C_+D_+E_+2/+v^+v^+v^+v^+v^+v^+2/+Z(+F_+G_+o!+H_+q(+v^+v^+v^+v^+v^+v^+v^+v^+v^+v^+v^+v^+v^+v^+v^+v^+v^+v^+v^+v^+v^+v^+v^+v^+v^+v^+v^+v^+v^+v^+v^+v^+v^+v^+v^+b(+I_+J_+9(+nT.K_+L_+v^+v^+v^+v^+v^+v^+v^+v^+v^+2/+b(+M_+N_+O_+P_+._+v^+v^+v^+v^+v^+v^+v^+v^+v^+v^+v^+v^+2/+q(+Q_+R_+S_+T_+U_+V_+W_+b(+2/+v^+v^+v^+v^+v^+v^+v^+v^+v^+v^+v^+v^+b(+Z(+p/+X_+Y_+Z_+`_+ :+|_+q(+v^+v^+v^+v^+v^+v^+v^+v^+v^+v^+v^+v^+v^+v^+v^+v^+v^+v^+v^+v^+v^+v^+v^+v^+v^+v^+v^+v^+v^+v^+v^+v^+v^+v^+v^+v^+v^+v^+v^+v^+v^+v^+.:++:+@:+pd D, D! D! Rl X,+#:+$:+%:+&:+*:+=:+v^+v^+v^+v^+-:+;:+>:+,:+':+):+2(+v^+v^+v^+v^+v^+v^+v^+v^+v^+v^+v^+v^+v^+v^+", +"H(+H(+H(+H(+H(+H(+H(+H(+H(+H(+H(+H(+H(+H(+H(+H(+H(+H(+H(+H(+!:+~:+{:+$[.]:+^:+^:+/:+R(+(:+_:+::+/(+)* :* /* <:+];+[:+2/+H(+H(+H(+H(+H(+H(+H(+H(+H(+H(+H(+H(+H(+H(+H(+H(+H(+H(+H(+H(+H(+H(+H(+H(+H(+H(+H(+H(+H(+H(+H(+H(+H(+H(+H(+H(+&(+}:+|:+1:+2:+3:+4:+5:+6:+7:+8:+&(+9:+0:+a:+b:+c:+d:+e:+f:+g:+h:+i:+j:+k:+l:+H(+H(+H(+H(+H(+H(+l:+m:+n:+o:+p:+q:+r:+H(+H(+H(+H(+H(+H(+H(+H(+H(+H(+H(+H(+H(+H(+H(+H(+H(+H(+H(+H(+H(+H(+H(+H(+H(+H(+H(+H(+H(+H(+H(+H(+H(+H(+H(+2/+s:+t:+u:+v:+w:+k:+H(+H(+H(+H(+H(+H(+H(+H(+H(+H(+r:+x:+y:+z:+v^+&(+l:+H(+H(+H(+H(+H(+H(+H(+H(+H(+H(+H(+H(+&(+l:+A:+=:+B:+C:+D:+2/+E:+l:+H(+H(+H(+H(+H(+H(+H(+H(+H(+H(+H(+H(+l:+F:+G:+H:+I:+J:+K:+L:+M:+F:+H(+H(+H(+H(+H(+H(+H(+H(+H(+H(+H(+H(+H(+H(+H(+H(+H(+H(+H(+H(+H(+H(+H(+H(+H(+H(+H(+H(+H(+H(+H(+H(+H(+H(+H(+H(+H(+H(+H(+H(+H(+7_+j]+N:+F' E' !~ !~ !~ !~ H) z#+O:+P:+Q:+R:+H(+l:+H(+H(+H(+l:+S:+T:+d/+U:+V:+=:+l:+H(+H(+H(+H(+H(+H(+H(+H(+H(+H(+H(+H(+H(+", +"k:+k:+k:+k:+k:+k:+k:+k:+k:+k:+k:+k:+k:+k:+k:+k:+k:+k:+k:+7_+W:+~:+X:+Y:+Z:+`:+`:+ <+h_+.<++<+@<+)* }& }& }& :* #<+3)+7_+k:+k:+k:+k:+k:+k:+k:+k:+k:+k:+k:+k:+k:+k:+k:+k:+k:+k:+k:+k:+k:+k:+k:+k:+k:+k:+k:+k:+k:+k:+k:+k:+k:+k:+k:+k:+}:+$<+%<+&<+'!+*<+=<+-<+;<+><+,<+'<+)<+!<+~<+{<+]<+^<+/<+(<+_<+:<+<<+[<+}<+7_+k:+k:+k:+k:+k:+k:+r:+|<+1<+2<+3<+m:+r:+k:+k:+k:+k:+k:+k:+k:+k:+k:+k:+k:+k:+k:+k:+k:+k:+k:+k:+k:+k:+k:+k:+k:+k:+k:+k:+k:+k:+k:+k:+k:+k:+k:+k:+k:+k:+:(+4<+5<+6<+7<+8<+k:+k:+k:+k:+k:+k:+k:+k:+k:+k:+r:+m:+9<+0<+a<+b<+c<+k:+k:+k:+k:+k:+k:+k:+k:+k:+k:+k:+k:+k:+k:+k:+c<+d<+e<+f<+g<+m:+r:+k:+k:+k:+k:+k:+k:+k:+k:+k:+k:+k:+k:+k:+}:+h<+i<+j<+k<+l<+m<+3(+}:+k:+k:+k:+k:+k:+k:+k:+k:+k:+k:+k:+k:+k:+k:+k:+k:+k:+k:+k:+k:+k:+k:+k:+k:+k:+k:+k:+k:+k:+k:+k:+k:+k:+k:+k:+k:+k:+k:+k:+k:+2/+n<+%(+o<+pd D, D! !~ D! D! Rl X,+p<+q<+r<+s<+t<+r:+k:+k:+k:+k:+=:+u<+v<+w<+x<+y<+=:+k:+k:+k:+k:+k:+k:+k:+k:+k:+k:+k:+k:+k:+", +"7_+7_+7_+7_+7_+7_+7_+7_+7_+7_+7_+7_+7_+7_+7_+7_+7_+7_+7_+7_+!:+~:+z<+A<+B<+C<+C<+D<+$[.E<+F<+G<+}& :* :* e& H<+Y(+2/+H(+7_+7_+7_+7_+7_+7_+7_+7_+7_+7_+7_+7_+7_+7_+7_+7_+7_+7_+7_+7_+7_+7_+7_+7_+7_+7_+7_+7_+7_+7_+7_+7_+7_+7_+7_+7_+I<+J<+K<+L<+M<+N<+O<+P<+Q<+R<+S<+T<+U<+V<+W<+X<+Y<+Z<+`<+ [+.[++[+@[+#[+$[+c<+H(+7_+7_+7_+7_+7_+r:+%[+&[+*[+=[+&(+7_+7_+7_+7_+7_+7_+7_+7_+7_+7_+7_+7_+7_+7_+7_+7_+7_+7_+7_+7_+7_+7_+7_+7_+7_+7_+7_+7_+7_+7_+7_+7_+7_+7_+7_+7_+r:+:(+-[+;[+v:+7<+8<+7_+7_+7_+7_+7_+7_+7_+7_+7_+7_+7_+r:+>[+,[+'[+x:+c<+7_+7_+7_+7_+7_+7_+7_+7_+7_+7_+7_+7_+7_+7_+7_+}:+)[+![+~[+{[+b<+c<+7_+7_+7_+7_+7_+7_+7_+7_+7_+7_+7_+7_+7_+}:+][+^[+/[+([+_[+:[+<[+r:+7_+7_+7_+7_+7_+7_+7_+7_+7_+7_+7_+7_+7_+7_+7_+7_+7_+7_+7_+7_+7_+7_+7_+7_+7_+7_+7_+7_+7_+7_+7_+7_+7_+7_+7_+7_+7_+7_+7_+7_+.:+E,+[[+}[+D! !~ !~ D! D! So k( u] |[+1[+2[+3[+4[+F:+7_+7_+7_+7_+l:+5[+6[+7[+8[+9[+7_+H(+7_+7_+7_+7_+7_+7_+7_+7_+7_+7_+7_+7_+", +"[:+[:+[:+[:+[:+[:+[:+[:+[:+[:+[:+[:+[:+[:+[:+[:+[:+[:+[:+[:+0[+a[+b[+c[+d[+e[+e[+f[+Y:+g[+h[+G<+::+:* e& e& 5$ i[+j[+o_+n<+7_+[:+[:+[:+[:+[:+[:+[:+[:+[:+[:+[:+[:+[:+[:+[:+[:+[:+[:+[:+[:+[:+[:+[:+[:+[:+[:+[:+[:+[:+[:+[:+[:+[:+k[+l[+m[+n[+o[+p[+q[+r[+s[+t[+u[+v[+w[+x[+y[+z[+A[+A[+B[+C[+D[+E[+F[+G[+H[+I[+z[+J[+[:+[:+[:+[:+[:+J[+K[+L[+M[+N[+J[+k[+[:+[:+[:+[:+[:+[:+[:+[:+[:+[:+[:+[:+[:+[:+[:+[:+[:+[:+[:+[:+[:+[:+[:+[:+[:+[:+[:+[:+[:+[:+[:+[:+[:+[:+[:+k[+=[+O[+P[+Q[+R[+S[+[:+[:+[:+[:+[:+[:+[:+[:+[:+[:+[:+l[+T[+U[+z:+7_+V[+J[+[:+[:+[:+[:+[:+[:+[:+[:+[:+[:+[:+[:+[:+[:+J[+W[+X[+~[+Y[+Z[+l[+[:+[:+[:+[:+[:+[:+[:+[:+[:+[:+[:+[:+[:+J[+`[+ }+.}++}+@}+#}+$}+%}+J[+[:+[:+[:+[:+[:+[:+[:+[:+[:+[:+[:+[:+[:+[:+[:+[:+[:+[:+[:+[:+[:+[:+[:+[:+[:+[:+[:+[:+[:+[:+[:+[:+[:+[:+[:+[:+[:+[:+7_+&}+)&+*}+=}+D, D! D! D! !~ D! #_ -}+;}+st.>}+,}+'}+V[+k[+[:+[:+[:+V[+)}+!}+~}+{}+]}+^}+)}+V[+[:+[:+[:+[:+[:+[:+[:+[:+[:+[:+[:+", +"7_+7_+7_+7_+7_+7_+7_+7_+7_+7_+7_+7_+7_+7_+7_+7_+7_+7_+7_+7_+/}+(}+_}+:}+<}+[}+[}+}}+A<+|}+1}+2}+:* e& F* F* F* 5$ 3}+4}+j]+5}+7_+7_+7_+7_+7_+7_+7_+7_+7_+7_+7_+7_+7_+7_+7_+7_+7_+7_+7_+7_+7_+7_+7_+7_+7_+7_+7_+7_+7_+7_+7_+7_+V[+J[+6}+7}+8}+9}+0}+a}+b}+c}+d}+5(+e}+A[+f}+6}+=[+J[+J[+=[+l[+J[+g}+h}+i}+j}+k}+l}+.:+=[+7_+7_+7_+7_+J[+m}+n}+o}+K[+J[+7_+7_+7_+7_+7_+7_+7_+7_+7_+7_+7_+7_+7_+7_+7_+7_+7_+7_+7_+7_+7_+7_+7_+7_+7_+7_+7_+7_+7_+7_+7_+7_+7_+7_+7_+7_+=[+=[+p}+q}+r}+s}+S[+7_+7_+7_+7_+7_+7_+7_+7_+7_+7_+7_+J[+t}+u}+v}+w}+x}+J[+7_+7_+7_+7_+7_+7_+7_+7_+7_+7_+7_+7_+7_+7_+J[+y}+z}+A}+B}+Z[+l[+7_+7_+7_+7_+7_+7_+7_+7_+7_+7_+7_+7_+7_+J[+V[+F:+C}+D}+E}+F}+G}+H}+J[+7_+7_+7_+7_+7_+7_+7_+7_+7_+7_+7_+7_+7_+7_+7_+7_+7_+7_+7_+7_+7_+7_+7_+7_+7_+7_+7_+7_+7_+7_+7_+7_+7_+7_+7_+7_+7_+7_+n<+1>+I}+P= !~ !~ !~ D! D! D! k( h{+a/+o_+J}+K}+L}+M}+N}+)}+7_+7_+7_+7_+k[+O}+P}+Q}+R}+S}+T}+k[+7_+7_+7_+7_+7_+7_+7_+7_+7_+7_+7_+", +".:+.:+.:+.:+.:+.:+.:+.:+.:+.:+.:+.:+.:+.:+.:+.:+.:+.:+.:+.:+U}+a[+V}+T. W}+X}+X}+Y}+c[+Z}+1}+`}+e& F* F* 5$ 5$ V* F* |+n<+7_+.:+.:+.:+.:+.:+.:+.:+.:+.:+.:+.:+.:+.:+.:+.:+.:+.:+.:+.:+.:+.:+.:+.:+.:+.:+.:+.:+.:+.:+.:+.:+.:+l[+V[+f}+.|++|+@|+#|+$|+%|+&|+}_+*|+l[+l[+J[+.:+.:+.:+.:+.:+.:+.:+l[+=|+-|+;|+>|+,|+'|+l[+.:+.:+.:+=|+D[+)|+!|+~|+{|+l[+.:+.:+.:+.:+.:+.:+.:+.:+.:+.:+.:+.:+.:+.:+.:+.:+.:+.:+.:+.:+.:+.:+.:+.:+.:+.:+.:+.:+.:+.:+.:+.:+.:+.:+.:+.:+.:+.:+]|+^|+/|+(|+l[+.:+.:+.:+.:+.:+.:+.:+.:+.:+.:+.:+.:+.:+g}+_|+:|+<|+l[+.:+.:+.:+.:+.:+.:+.:+.:+.:+.:+.:+.:+.:+.:+.:+V[+I<+[|+}|+||+.:+.:+.:+.:+.:+.:+.:+.:+.:+.:+.:+.:+.:+.:+.:+=|+1|+2|+3|+4|+K:+5|+6|+=|+.:+.:+.:+.:+.:+.:+.:+.:+.:+.:+.:+.:+.:+.:+.:+.:+.:+.:+.:+.:+.:+.:+.:+.:+.:+.:+.:+.:+.:+.:+.:+.:+.:+.:+.:+.:+.:+.:+n<+q~+Y;+yr k( !~ !~ D! !~ !~ k( u] 7|+d=+8|+9|+0|+a|+b|+c|+.:+.:+.:+.:+.:+d|+e|+f|+g|+h|+e|+i|+.:+.:+.:+.:+.:+.:+.:+.:+.:+.:+.:+", +"n<+n<+n<+n<+n<+n<+n<+n<+n<+n<+n<+n<+n<+n<+n<+n<+n<+n<+n<+n<+j|+k|+l|+T. m|+n|+n|+o|+:}+p|+q|+`}+F* 5$ 5$ 5$ V* V* Y& Ig KC.r|+&}+n<+n<+n<+n<+n<+n<+n<+n<+n<+n<+n<+n<+n<+n<+n<+n<+n<+n<+n<+n<+n<+n<+n<+n<+n<+n<+n<+n<+n<+5}+s|+t|+u|+v|+w|+x|+y|+z|+A|+B|+C|+s|+s|+n<+n<+n<+n<+n<+n<+n<+n<+n<+n<+n<+s|+n<+t}+D|+E|+F|+G|+s|+H|+*|+I|+J|+K|+L|+M|+T[+N|+n<+n<+n<+n<+n<+n<+n<+n<+n<+n<+n<+n<+n<+n<+n<+n<+n<+n<+n<+n<+n<+n<+n<+n<+n<+n<+n<+n<+n<+n<+n<+n<+n<+n<+n<+n<+n<+O|+P|+Q|+XB.R|+O|+n<+n<+n<+n<+n<+n<+n<+n<+n<+n<+n<+n<+S|+T|+U|+z:+.:+t|+s|+n<+n<+n<+n<+n<+n<+n<+n<+n<+n<+n<+n<+n<+n<+s|+N[+V|+W|+X|+Y|+s|+n<+n<+n<+n<+n<+n<+n<+n<+n<+n<+n<+n<+n<+N|+Z|+`|+ 1+.1++1+@1+#1+N|+n<+n<+n<+n<+n<+n<+n<+n<+n<+n<+n<+n<+n<+n<+n<+n<+n<+n<+n<+n<+n<+n<+n<+n<+n<+n<+n<+n<+n<+n<+n<+n<+n<+n<+n<+n<+n<+$1+/-+%1+=}+!~ H) D! D! !~ D! D, =}+&1+];+*1+n<+2/+=1+-1+;1+>1+s|+s|+n<+n<+n<+,1+n<+l:+'1+k{+)1+!1+,1+n<+n<+n<+n<+n<+n<+n<+n<+n<+n<+", +".:+.:+.:+.:+.:+.:+.:+.:+.:+.:+.:+.:+.:+.:+.:+.:+.:+.:+.:+O|+~1+k|+{1+T. ]1+^1+^1+/1+T. (1+_1++l 5$ 5$ V* V* i% i% Y& g% :1+<1+r|+&}+.:+.:+.:+.:+.:+.:+.:+.:+.:+.:+.:+.:+.:+.:+.:+.:+.:+.:+.:+.:+.:+.:+.:+.:+.:+.:+O|+.:+s|+t|+e}+[1+}1+|1+11+21+31+41+C|+N|+s|+.:+.:+.:+.:+.:+.:+.:+.:+.:+.:+.:+.:+.:+s|+51+r:+61+71+81+91+01+a1+b1+c1+d1+e1+f1+g1+I|+s|+.:+.:+.:+.:+.:+.:+.:+.:+.:+.:+.:+.:+.:+.:+.:+.:+.:+.:+.:+.:+.:+.:+.:+.:+.:+.:+.:+.:+.:+.:+.:+.:+.:+.:+.:+.:+s|+h1+i1+j1+k1+l1+.:+.:+.:+.:+.:+.:+.:+.:+.:+.:+.:+.:+s|+m1+n1+o1+p1+q1+s|+.:+.:+.:+.:+.:+.:+.:+.:+.:+.:+.:+.:+.:+.:+S|+K[+r1+s1+t1+N[+s|+.:+.:+.:+.:+.:+.:+.:+.:+.:+.:+.:+.:+.:+u1+v1+w1+x1+y1+z1+A1+B1+s|+O|+.:+.:+.:+.:+.:+.:+.:+.:+.:+.:+.:+.:+.:+.:+.:+.:+.:+.:+.:+.:+.:+.:+.:+.:+.:+.:+.:+.:+.:+.:+.:+.:+.:+.:+O|+n<+n<+7_+C1+u] !~ H) H) D! D! !~ !~ D! D1+q~+E1+F1+G1+H1+I1+J1+K1+L1+O|+s|+.:+.:+O|+d|+M1+N1+g|+O1+P1+d|+O|+.:+.:+.:+.:+.:+.:+.:+.:+.:+", +"n<+n<+n<+n<+n<+n<+n<+n<+n<+n<+n<+n<+n<+n<+n<+n<+n<+n<+n<+n<+j|+Q1+R1+T. S1+rb rb 4H Uc T1+U1+V1+|n i% V* i% i% Y& Y& g% Y& |+W1+O|+X1+n<+n<+n<+n<+n<+n<+n<+n<+n<+n<+n<+n<+n<+n<+n<+n<+n<+n<+n<+n<+n<+n<+n<+n<+n<+n<+S|+t|+u|+Y1+Z1+`1+ 2+.2+{|++2+@2+H|+n<+n<+n<+n<+n<+n<+n<+n<+n<+n<+n<+n<+n<+n<+n<+n<+S|+#2+$2+%2+&2+*2+=2+-2+;2+>2+,2+'2+)2+m1+S|+X1+n<+n<+n<+n<+n<+n<+n<+n<+n<+n<+n<+n<+n<+n<+n<+n<+n<+n<+n<+n<+n<+n<+n<+n<+n<+n<+n<+n<+n<+n<+n<+n<+n<+n<+n<+!2+~2+{2+]2+^2+/2+(2+!2+n<+n<+n<+n<+n<+n<+n<+n<+n<+n<+n<+n<+X1+m}+_|+_2+T|+!2+n<+n<+n<+n<+n<+n<+n<+n<+n<+n<+n<+n<+n<+n<+H|+:2+<2+[2+}2+:2+H|+n<+n<+n<+n<+n<+n<+n<+n<+n<+n<+n<+n<+n<+S|+|2+12+22+32+42+52+O|+n<+X1+n<+n<+n<+n<+n<+n<+n<+n<+n<+n<+n<+n<+n<+n<+n<+n<+n<+n<+n<+n<+n<+n<+n<+n<+n<+n<+n<+n<+n<+n<+n<+n<+n<+n<+n<+62+72+82+}q k( H) D! D! H) H) k( }q 92+72+62+n<+X1+02+a2+b2+c2+%,+d2+e2+f2+n<+n<+n<+n<+g2+h2+i2+j2+k2+l2+s|+n<+n<+n<+n<+n<+n<+n<+n<+n<+", +"&}+&}+&}+&}+&}+&}+&}+&}+&}+&}+&}+&}+&}+&}+&}+&}+&}+&}+&}+&}+m2+n2+o2+T. p2+|e.|e.q2+rb r2+s2+s|+-% 5$ Y& Y& Y& g% g% <* )% t2+P9.2/+E1+&}+&}+&}+&}+&}+&}+&}+&}+&}+&}+&}+&}+&}+&}+&}+&}+&}+&}+&}+&}+&}+&}+&}+&}+&}+g2+u2+v2+w2+x2+y2+z2+A2+0K B2+&}+&}+&}+&}+&}+&}+&}+&}+&}+&}+&}+&}+&}+&}+&}+&}+&}+&}+&}+&}+@2+C2+D2+E2+F2+G2+H2+I2+l[+J2+K2+L2+M2+g2+&}+&}+&}+&}+&}+&}+&}+&}+&}+&}+&}+&}+&}+&}+&}+&}+&}+&}+&}+&}+&}+&}+&}+&}+&}+&}+&}+&}+&}+&}+&}+&}+&}+&}+&}+E1+B2+~2+N2+O2+P2+Q2+R2+S2+E1+&}+&}+&}+&}+&}+&}+&}+&}+&}+&}+&}+B2+T2+U2+V2+n<+u2+g2+&}+&}+&}+&}+&}+&}+&}+&}+&}+&}+&}+&}+&}+g2+W2+X2+~[+Y2+T2+B2+&}+&}+&}+&}+&}+&}+&}+&}+&}+&}+&}+&}+&}+g2+&}+Z2+`2+ 3+.3++3+@3+#3+g2+&}+&}+&}+&}+&}+&}+&}+&}+&}+&}+&}+&}+&}+&}+&}+&}+&}+&}+&}+&}+&}+&}+&}+&}+&}+&}+&}+&}+&}+&}+&}+&}+&}+&}+E1+.:+$3+%3+EC 1g D! H) H) D! D! #{ i.+&3+7_+E1+g2+*3+=3+-3+;3+>3+,3+'3+)3+!3+&}+&}+&}+&}+~3+{3+]3+^3+/3+(3+~3+&}+&}+&}+&}+&}+&}+&}+&}+&}+", +"X1+X1+X1+X1+X1+X1+X1+X1+X1+X1+X1+X1+X1+X1+X1+X1+X1+X1+X1+X1+_3+n2+:3+Uc <3+[3+[3+}3+;S |3+13+23+33+5$ h% g% g% g% <* <* )% %& O, 43+L_+53+X1+X1+X1+X1+X1+X1+X1+X1+X1+X1+X1+X1+X1+X1+X1+X1+X1+X1+X1+X1+X1+X1+X1+B2+u2+63+73+83+93+03+A2+a3+b3+X1+X1+X1+X1+X1+X1+X1+X1+X1+X1+X1+X1+X1+X1+X1+X1+X1+X1+X1+X1+X1+c3+d3+e3+f3+g3+h3+i3+j3+k3+{|+l3+X1+g2+X1+X1+X1+X1+X1+X1+X1+X1+X1+X1+X1+X1+X1+X1+X1+X1+X1+X1+X1+X1+X1+X1+X1+X1+X1+X1+X1+X1+X1+X1+X1+X1+X1+X1+X1+X1+X1+m3+n3+o3+p3+q3+r3+s3+m3+X1+X1+X1+X1+X1+X1+X1+X1+X1+X1+X1+X1+B2+63+t3+u3+v3+63+B2+X1+X1+X1+X1+X1+X1+X1+X1+X1+X1+X1+X1+X1+g2+w3+x3+y3+z3+A3+B2+X1+X1+X1+X1+X1+X1+X1+X1+X1+X1+X1+X1+X1+X1+B3+C3+D3+E3+F3+K:+G3+H3+B2+X1+X1+X1+X1+X1+X1+X1+X1+X1+X1+X1+X1+X1+X1+X1+X1+X1+X1+X1+X1+X1+X1+X1+X1+X1+X1+X1+X1+X1+X1+X1+X1+X1+X1+I3+J3+K3+&a k( H) D! H) D! H) k( &a K3+72+W1+X1+g2+B2+|2+L3+M3+N3+O3+P3+Q3+R3+X1+X1+X1+X1+X1+E1+S3+T3+U3+V3+W3+g2+X1+X1+X1+X1+X1+X1+X1+X1+", +"X3+X3+X3+X3+X3+X3+X3+X3+X3+X3+X3+X3+X3+X3+X3+X3+X3+X3+X3+X3+c3+Y3+Z3+hk `3+q}.q}. 4+^V .4++4+l[+L_+@4+#4+p* <* <* )% )% %& $4+%4+.& &4+O|+X3+X3+X3+X3+X3+X3+X3+X3+X3+X3+X3+X3+X3+X3+X3+X3+X3+X3+X3+X3+X3+X3+X3+g2+*4+=4+-4+;4+>4+,4+'4+m3+X3+X3+X3+X3+X3+X3+X3+X3+X3+X3+X3+X3+X3+X3+X3+X3+X3+X3+X3+X3+X3+X3+B2+)4+!4+~4+{4+]4+^4+c3+X3+/4+(4+X3+X3+X3+X3+X3+X3+X3+X3+X3+X3+X3+X3+X3+X3+X3+X3+X3+X3+X3+X3+X3+X3+X3+X3+X3+X3+X3+X3+X3+X3+X3+X3+X3+X3+X3+X3+X3+X3+X3+m3+_4+:4+<4+[4+}4+Y|+|4+X3+X3+X3+X3+X3+X3+X3+X3+X3+X3+X3+X3+X3+X3+)4+14+24+34+44+E1+X3+X3+X3+X3+X3+X3+X3+X3+X3+X3+X3+X3+X3+E1+B2+54+64+g2+E1+X3+X3+X3+X3+X3+X3+X3+X3+X3+X3+X3+X3+X3+X3+/4+74+84+94+04+a4+b4+c4+/4+X3+X3+X3+X3+X3+X3+X3+X3+X3+X3+X3+X3+X3+X3+X3+X3+X3+X3+X3+X3+X3+X3+X3+X3+X3+X3+X3+X3+X3+X3+X3+X3+X3+62+k:+&3+3| E' D! D! H) H) H) !~ )~ d4+I3+X1+X3+X3+X3+B3+e4+f4+g4+h4+i4+j4+k4+l4+X3+X3+X3+X3+X3+m4+n4+o4+p4+q4+r4+B3+X3+X3+X3+X3+X3+X3+X3+X3+", +"$1+$1+$1+$1+$1+$1+$1+$1+$1+$1+$1+$1+$1+$1+$1+$1+$1+$1+$1+$1+s4+t4+u4+;S v4+w4+w4+x4+2# y4+z4+J[+53+53+A4+B4+)% )% )% %& %& -- _; ^b P9..:+53+$1+$1+$1+$1+$1+$1+$1+$1+$1+$1+$1+$1+$1+$1+$1+$1+$1+$1+$1+$1+k3+k3+C4+D4+E4+F4+G4+H4+I4+J4+53+$1+$1+$1+$1+$1+$1+$1+$1+$1+$1+$1+$1+$1+$1+$1+$1+$1+$1+$1+$1+$1+$1+K4+k3+63+1H.L4+M4+k3+K4+$1+$1+$1+$1+$1+$1+$1+$1+$1+$1+$1+$1+$1+$1+$1+$1+$1+$1+$1+$1+$1+$1+$1+$1+$1+$1+$1+$1+$1+$1+$1+$1+$1+$1+$1+$1+$1+$1+$1+$1+$1+$1+$1+k3+N4+O4+P4+Q4+J4+K4+$1+$1+$1+$1+$1+$1+$1+$1+$1+$1+$1+$1+$1+J4+R4+S4+T4+U4+V4+k3+$1+$1+$1+$1+$1+$1+$1+$1+$1+$1+$1+$1+53+k3+W4+X4+Y4+Z4+*4+k3+$1+$1+$1+$1+$1+$1+$1+$1+$1+$1+$1+$1+$1+`4+ 5+.5++5+@5+#5+$5+%5+&5+$1+$1+$1+$1+$1+$1+$1+$1+$1+$1+$1+$1+$1+$1+$1+$1+$1+$1+$1+$1+$1+$1+$1+$1+$1+$1+$1+$1+$1+$1+$1+$1+53+W1+o_+*5+pd k( H) H) H) D! H) }[+#: 82+1>+=5+E1+$1+$1+K4+`4+-5+;5+>5+,5+'5+)5+!5+~5+$1+$1+$1+$1+$1+`4+{5+]5+^5+/5+(5+~5+$1+$1+$1+$1+$1+$1+$1+", +"X3+X3+X3+X3+X3+X3+X3+X3+X3+X3+X3+X3+X3+X3+X3+X3+X3+X3+X3+X3+c3+_5+:5+<5+[5+}5+}5+|5+15+25+35+c<+I3+S[+&3+<* )% %& %& -- -- _; _; r* %4+45+8<+W1+X3+X3+X3+X3+X3+X3+X3+X3+X3+X3+X3+X3+X3+X3+X3+X3+X3+X3+J4+J4+55+65+75+85+95+05+a5+J4+J4+X3+X3+X3+X3+X3+X3+X3+X3+X3+X3+X3+X3+X3+X3+X3+X3+X3+X3+X3+X3+X3+X3+X3+X3+X3+J4+J4+b5+c5+X3+X3+X3+X3+X3+X3+X3+X3+X3+X3+X3+X3+X3+X3+X3+X3+X3+X3+X3+X3+X3+X3+X3+X3+X3+X3+X3+X3+X3+X3+X3+X3+X3+X3+X3+X3+X3+X3+X3+X3+X3+X3+X3+X3+X3+X3+d5+e5+f5+g5+|4+X3+X3+X3+X3+X3+X3+X3+X3+X3+X3+X3+X3+X3+X3+h5+i5+j5+T. k5+l5+m5+c5+X3+X3+X3+X3+X3+X3+X3+X3+X3+X3+X3+X3+n5+o5+p5+q5+r5+s5+J4+X3+X3+X3+X3+X3+X3+X3+X3+X3+X3+X3+X3+X3+J4+t5+u5+v5+w5+x5+y5+z5+b5+k3+X3+X3+X3+X3+X3+X3+X3+X3+X3+X3+X3+X3+X3+X3+X3+X3+X3+X3+X3+X3+X3+X3+X3+X3+X3+X3+X3+X3+X3+X3+X3+A5+B5+o<+C5+k( H) H) D! H) H) !~ yr D5+L_+W1+53+X3+X3+X3+X3+b5+&5+E5+F5+G5+H5+I5+J5+&5+X3+X3+X3+X3+X3+k3+K5+L5+M5+N5+{3+`4+X3+X3+X3+X3+X3+X3+X3+", +"53+53+53+53+53+53+53+53+53+53+53+53+53+53+53+53+53+53+53+62+h5+O5+P5+Q5+R5+S5+S5+T5+U5+V5+13+l[+W5+W1+8<+X5+B4+u- -- -- _; _; y- !% I; @* Y5+X1+W1+53+53+53+53+53+53+53+53+53+53+53+53+53+53+53+53+62+J4+a5+Z5+`5+ 6+.6++6+@6+J4+62+53+53+53+53+53+53+53+53+53+53+53+53+53+53+53+53+53+53+53+53+53+53+53+53+53+53+53+62+62+53+53+53+53+53+53+53+53+53+53+53+53+53+53+53+53+53+53+53+53+53+53+53+53+53+53+53+53+53+53+53+53+53+53+53+53+53+53+53+53+53+53+53+53+53+62+62+#6+$6+%6+&6+J4+53+53+53+53+53+53+53+53+53+53+53+53+53+62+*6+=6+-6+;6+>6+,6+'6+J4+62+53+53+53+53+53+53+53+53+53+53+53+c5+)6+!6+~6+{6+]6+c5+53+53+53+53+53+53+53+53+53+53+53+53+53+62+62+^6+/6+(6+_6+:6+u5+<6+62+53+53+53+53+53+53+53+53+53+53+53+53+53+53+53+53+53+53+53+53+53+53+53+53+53+53+53+53+62+53+&4+B5+[6+yr !~ D! H) H) H) D! D! 1g )~ }6+r|+=5+53+53+53+53+53+53+53+W5+|6+16+26+36+M}+46+`4+53+53+53+53+53+56+66+76+86+96+06+`4+53+53+53+53+53+53+", +"W1+W1+W1+W1+W1+W1+W1+W1+W1+W1+W1+W1+W1+W1+W1+W1+W1+W1+W1+W1+a6+b6+c6+FJ d6+e6+e6+f6+g6+h6+i6+l[+I3+W1+W1+E1+Kc <* _; _; y- y- !% !% W* j6+k6+X3+W1+W1+W1+W1+W1+W1+W1+W1+W1+W1+W1+W1+W1+W1+W1+W1+W5+l6+m6+n6+o6+p6+q6+r6+s6+62+W5+W1+W1+W1+W1+W1+W1+W1+W1+W1+W1+W1+W1+W1+W1+W1+W1+W1+W1+W1+W1+W1+W1+W1+W1+W1+W1+W1+W1+W1+W1+W1+W1+W1+W1+W1+W1+W1+W1+W1+W1+W1+W1+W1+W1+W1+W1+W1+W1+W1+W1+W1+W1+W1+W1+W1+W1+W1+W1+W1+W1+W1+W1+W1+W1+W1+W1+W1+W1+W1+W1+W1+W1+W1+W1+W1+W1+62+t6+u6+%6+v6+w6+W1+W1+W1+W1+W1+W1+W1+W1+W1+W1+W1+W1+W1+W1+x6+y6+z6+A6+B6+C6+55+D6+W1+W1+W1+W1+W1+W1+W1+W1+W1+W1+W1+W1+l6+E6+F6+G6+H6+)6+l6+W1+W1+W1+W1+W1+W1+W1+W1+W1+W1+W1+W1+W1+W1+D6+I6+J6+K6+L6+M6+N6+O6+l6+W1+W1+W1+W1+W1+W1+W1+W1+W1+W1+W1+W1+W1+W1+W1+W1+W1+W1+W1+W1+W1+W1+W1+W1+W1+W1+W1+W1+62+&4+3)+}6+:`.E' D! H) D! D! H) H) k( =}+P6+o_+&4+W1+W1+W1+W1+W1+W1+W1+W1+W1+56+Q6+R6+S6+T6+g1+U6+W5+W1+W1+W1+W1+W5+V6+W6+X6+Y6+Z6+W1+W5+W1+W1+W1+W1+W1+", +"w6+w6+w6+w6+w6+w6+w6+w6+w6+w6+w6+w6+w6+w6+w6+w6+w6+w6+w6+w6+`6+ 7+.7+!1.+7+@7+@7+#7+$7+%7+&7+l1+I3+w6+I3+S2+*7+y- _; y- y- !% !% W* W* X& j6+=7+-7+I3+w6+w6+w6+w6+w6+w6+w6+w6+w6+w6+w6+w6+w6+l6+l6+;7+>7+,7+'7+)7+!7+~7+{7+l6+62+w6+w6+w6+w6+w6+w6+w6+w6+w6+w6+w6+w6+w6+w6+w6+w6+w6+w6+w6+w6+w6+w6+w6+w6+w6+w6+w6+w6+w6+w6+w6+w6+w6+w6+w6+w6+w6+w6+w6+w6+w6+w6+w6+w6+w6+w6+w6+w6+w6+w6+w6+w6+w6+w6+w6+w6+w6+w6+w6+w6+w6+w6+w6+w6+w6+w6+w6+w6+w6+w6+w6+w6+w6+w6+w6+w6+w6+]7+u6+f5+^7+w6+w6+w6+w6+w6+w6+w6+w6+w6+w6+w6+w6+w6+w6+w6+l6+;5+/7+(7+_7+:7+<7+[7+w6+w6+w6+w6+w6+w6+w6+w6+w6+w6+w6+w6+l6+}7+|7+17+27+37+l6+w6+w6+w6+w6+w6+w6+w6+w6+w6+w6+w6+w6+w6+w6+a6+47+57+94+67+77+87+97+a6+w6+w6+w6+w6+w6+w6+w6+w6+w6+w6+w6+w6+w6+w6+w6+w6+w6+w6+w6+w6+w6+w6+w6+w6+w6+w6+w6+62+A5+8<+07+a7+P= !~ H) D! H) H) D! D! H) H) b7+=[+A5+w6+w6+w6+w6+w6+w6+w6+w6+w6+l6+l6+W3+c7+d7+e7+f7+*6+w6+w6+w6+w6+w6+|6+g7+h7+i7+j7+k7+56+w6+w6+w6+w6+w6+", +"I3+I3+I3+I3+I3+I3+I3+I3+I3+I3+I3+I3+I3+I3+I3+I3+I3+I3+I3+I3+l7+m7+n7+o7+p7+q7+q7+r7+s7+t7+u7+S|+=5+I3+W1+=5+O|+v7+%4+!% !% W* W* @* @* X& X& :; w7+X3+=5+W1+I3+I3+I3+I3+I3+I3+I3+I3+I3+W1+I3+l6+;7+x7+y7+z7+A7+B7+C7+D7+I3+W1+I3+I3+I3+I3+I3+I3+I3+I3+I3+I3+I3+I3+I3+I3+I3+I3+I3+I3+I3+I3+I3+I3+I3+I3+I3+I3+I3+I3+I3+I3+I3+I3+I3+I3+I3+I3+I3+I3+I3+I3+I3+I3+I3+I3+I3+I3+I3+I3+I3+I3+I3+I3+I3+I3+I3+I3+I3+I3+I3+I3+I3+I3+I3+I3+I3+I3+I3+I3+I3+I3+I3+I3+I3+I3+I3+I3+I3+I3+E7+u6+f5+v6+l6+I3+I3+I3+I3+I3+I3+I3+I3+I3+I3+I3+I3+I3+I3+W1+I3+F7+G7+H7+I7+J7+x6+I3+I3+I3+I3+I3+I3+I3+I3+I3+I3+I3+I3+I3+W1+D7+K7+L7+M7+F7+I3+I3+I3+I3+I3+I3+I3+I3+I3+I3+I3+I3+I3+I3+D6+gU.N7+O7+P7+Q7+R7+97+x6+I3+I3+I3+I3+I3+I3+I3+I3+I3+I3+I3+I3+I3+I3+I3+I3+I3+I3+I3+I3+I3+I3+I3+I3+I3+I3+W1+A5+X1+S7+T7+zF }[+H) D! H) H) D! H) k( }q U7+V7+W7+W1+I3+I3+I3+I3+I3+I3+I3+I3+I3+I3+X7+Y7+Z7+`7+ 8+.8++8+D6+I3+I3+I3+I3+|6+@8+#8+$8+%8+&8+*8+=8+I3+I3+I3+I3+", +"=5+=5+=5+=5+=5+=5+=5+=5+=5+=5+=5+=5+=5+=5+=5+=5+=5+=5+=5+=5+-8+;8+>8+,8+'8+)8+)8+!8+~8+{8+]8+!2+A5+=5+=5+=5+A5+X3+^8+/8+1% W* @* @* X& X& [= (8+k6+I3+I3+A5+=5+=5+=5+=5+=5+=5+=5+=5+=5+_8+_8+:8+<8+[8+}8+|8+18+28+F7+_8+=5+=5+=5+=5+=5+=5+=5+=5+=5+=5+=5+=5+=5+=5+=5+=5+=5+=5+=5+=5+=5+=5+=5+=5+=5+=5+=5+=5+=5+=5+=5+=5+=5+=5+=5+=5+=5+=5+=5+=5+=5+=5+=5+=5+=5+=5+=5+=5+=5+=5+=5+=5+=5+=5+=5+=5+=5+=5+=5+=5+=5+=5+=5+=5+=5+=5+=5+=5+=5+=5+=5+=5+=5+=5+=5+=5+=5+=5+=5+38+48+u6+58+68+38+=5+=5+=5+=5+=5+=5+=5+=5+=5+=5+=5+=5+=5+=5+=5+78+-8+88+98+08+a8+b8+_8+=5+=5+=5+=5+=5+=5+=5+=5+=5+=5+=5+=5+_8+c8+d8+e8+f8+g8+_8+=5+=5+=5+=5+=5+=5+=5+=5+=5+=5+=5+=5+=5+_8+h8+i8+j8+k8+0I l8+m8+_8+=5+=5+=5+=5+=5+=5+=5+=5+=5+=5+=5+=5+=5+=5+=5+=5+=5+=5+=5+=5+=5+=5+=5+=5+=5+=5+&4+W1+X3+n8+yr k( H) D! H) H) D! H) #_ &a &1+-_+&4+A5+=5+=5+=5+=5+=5+=5+=5+=5+=5+=5+=5+o8+p8+(5+q8+r8+s8+t8+A5+o8+=5+=5+=5+=5+u8+v8+w8+x8+y8+z8+f7+_8+78+=5+=5+", +"I3+I3+I3+I3+I3+I3+I3+I3+I3+I3+I3+I3+I3+I3+I3+I3+I3+I3+I3+I3+A8+B8+C8+D8+E8+A6+A6+F8+G8+H8+]8+!2+A5+I3+I3+I3+A5+w6+I8+[= !% @* @* X& X& :; j% [& (8+J8+S2+A5+I3+I3+I3+I3+I3+I3+I3+I3+_8+_8+K8+L8+M8+N8+O8+P8+Q8+s6+R8+I3+I3+I3+I3+I3+I3+I3+I3+I3+I3+I3+I3+I3+I3+I3+I3+I3+I3+I3+I3+I3+I3+I3+I3+I3+I3+I3+I3+I3+I3+I3+I3+I3+I3+I3+I3+I3+I3+I3+I3+I3+I3+I3+I3+I3+I3+I3+I3+I3+I3+I3+I3+I3+I3+I3+I3+I3+I3+I3+I3+I3+I3+I3+I3+I3+I3+I3+I3+I3+I3+I3+I3+I3+I3+I3+I3+I3+I3+I3+38+38+48+S8+58+T8+38+I3+I3+I3+I3+I3+I3+I3+I3+I3+I3+I3+I3+I3+I3+I3+I3+_8+g8+U8+V8+W8+X8+R8+I3+I3+I3+I3+I3+I3+I3+I3+I3+I3+I3+I3+Y8+Z8+`8+ 9+.9++9+Y8+I3+I3+I3+I3+I3+I3+I3+I3+I3+I3+I3+I3+I3+38+_8+gU.@9+#9+$9+%9+&9+h8+_8+I3+I3+I3+I3+I3+I3+I3+I3+I3+I3+I3+I3+I3+I3+I3+I3+I3+I3+I3+I3+I3+I3+I3+I3+A5+A5+L_+*9+u[ k( H) D! H) H) D! H) k( #: X/+I3+62+A5+I3+I3+I3+I3+I3+I3+I3+I3+I3+I3+I3+I3+I3+=8+=9+-9+;9+>9+,9+'9+)9+I3+I3+I3+I3+o8+!9+~9+{9+]9+^9+/9+(9+p8+I3+I3+", +"A5+A5+A5+A5+A5+A5+A5+A5+A5+A5+A5+A5+A5+A5+A5+A5+A5+A5+A5+A5+_9+:9+<9+)8+[9+}9+}9+|9+19+29+39+B2+W7+A5+A5+A5+A5+W7+X3+43+I; X& X& :; :; j% j% [& H; [& 49+62+&4+A5+A5+A5+A5+A5+A5+A5+_8+59+69+79+89+99+09+a9+b9+c9+A5+A5+A5+A5+A5+A5+A5+A5+A5+A5+A5+A5+A5+A5+A5+A5+A5+A5+A5+A5+A5+A5+A5+A5+A5+A5+A5+A5+A5+A5+A5+A5+A5+A5+A5+A5+A5+A5+A5+A5+A5+A5+A5+A5+A5+A5+A5+A5+A5+A5+A5+A5+A5+A5+A5+A5+A5+A5+A5+A5+A5+A5+A5+A5+A5+A5+A5+A5+A5+A5+A5+A5+A5+A5+A5+A5+A5+A5+A5+A5+A5+A5+d9+e9+f9+g9+R8+A5+A5+A5+A5+A5+A5+A5+A5+A5+A5+A5+A5+A5+A5+A5+A5+A5+A5+s6+h9+i9+j9+c9+A5+A5+A5+A5+A5+A5+A5+A5+A5+A5+A5+A5+c9+k9+l9+m9+n9+Z8+c9+A5+A5+A5+A5+A5+A5+A5+A5+A5+A5+A5+A5+A5+A5+c9+o9+p9+q9+r9+s9+t9+u.+c9+A5+A5+A5+A5+A5+A5+A5+A5+A5+A5+A5+A5+A5+A5+A5+A5+A5+A5+A5+A5+A5+A5+A5+A5+I8+r|+u9+&a k( H) D! H) H) D! H) }[+zF v9+w9+X1+x9+A5+A5+A5+A5+A5+A5+A5+A5+A5+A5+A5+A5+A5+A5+A5+y9+z9+A9+B9+C9+D9+E9+y9+A5+A5+A5+F9+Y7+G9+H9+I9+J9+K9+L9+M9+p8+A5+", +"W7+W7+W7+W7+W7+W7+W7+W7+W7+W7+W7+W7+W7+W7+W7+W7+W7+W7+W7+W7+28+N9+O9+A6+P9+S^ S^ Q9+]( R9+S9+m3+W7+W7+W7+W7+W7+W7+W7+|4+^K..8 j% :; j% j% [& H; }> K> T9+W7+A5+W7+W7+W7+W7+W7+W7+U9+k9+V9+W9+X9+Y9+Z9+`9+ 0+U9+.0+W7+W7+W7+W7+W7+W7+W7+W7+W7+W7+W7+W7+W7+W7+W7+W7+W7+W7+W7+W7+W7+W7+W7+W7+W7+W7+W7+W7+W7+W7+W7+W7+W7+W7+W7+W7+W7+W7+W7+W7+W7+W7+W7+W7+W7+W7+W7+W7+W7+W7+W7+W7+W7+W7+W7+W7+W7+W7+W7+W7+W7+W7+W7+W7+W7+W7+W7+W7+W7+W7+W7+W7+W7+W7+W7+W7+W7+W7+W7+W7+W7++0+@0+e9+f9+#0++0+W7+W7+W7+W7+W7+W7+W7+W7+W7+W7+W7+W7+W7+W7+W7+W7+W7+U9+$0+%0+&0+*0+=0+-0+W7+W7+W7+W7+W7+W7+W7+W7+W7+W7+W7+-0+;0+>0+,0+'0+)0+-0+W7+W7+W7+W7+W7+W7+W7+W7+W7+W7+W7+W7+W7+W7+!0+~0+{0+]0+^0+77+/0+(0+!0+W7+W7+W7+W7+W7+W7+W7+W7+W7+W7+W7+W7+W7+W7+W7+W7+W7+W7+W7+W7+W7+W7+A5+S7+V7+_0+pd !~ D! H) D! H) D! H) !~ #{ C^+:0+O|+<0+A5+W7+W7+W7+W7+W7+W7+W7+W7+W7+W7+W7+W7+W7+W7+W7+[0+}0+|0+10+20+30+'9+40+W7+W7+W7+50+60+70+k +80+90+00+a0+b0+50+W7+", +"A5+A5+A5+A5+A5+A5+A5+A5+A5+A5+A5+A5+A5+A5+A5+A5+A5+A5+A5++0+c0+N9+d0+e0+f0+g0+g0+h0+i0+j0+39+m3+W7+A5+A5+A5+A5+A5+W7+A5+W7+o* X& m* [& [& H; H; }> u* K> k0+62+W7+W7+A5+A5+A5+l0+m0+n0+o0+p0+q0+r0+s0+ 0+t0+.0++0+A5+A5+A5+A5+A5+A5+A5+A5+A5+A5+A5+A5+A5+A5+A5+A5+A5+A5+A5+A5+A5+A5+A5+A5+A5+A5+A5+A5+A5+A5+A5+A5+A5+A5+A5+A5+A5+A5+A5+A5+A5+A5+A5+A5+A5+A5+A5+A5+A5+A5+A5+A5+A5+A5+A5+A5+A5+A5+A5+A5+A5+A5+A5+A5+A5+A5+A5+A5+A5+A5+A5+A5+A5+A5+A5+A5+A5+A5+A5+A5++0++0+u0+S8+v0+#0++0+A5+A5+A5+A5+A5+A5+A5+A5+A5+A5+A5+A5+A5+A5+A5+A5+A5+-0+w0+x0+y0+z0+A0+t0+A5+A5+A5+A5+A5+A5+A5+A5+A5+A5+A5+-0+.0+c0+B0+C0+c9+.0+-0+A5+A5+A5+A5+A5+A5+A5+A5+A5+A5+A5+A5+A5+-0+D0+E0+F0+G0+H0+-~+I0+l0+A5+A5+A5+A5+A5+A5+A5+A5+A5+A5+A5+A5+A5+A5+A5+A5+A5+A5+A5+A5++0+A5+<0+J0+K0+:] H) D! H) D! H) D! H) 1g E' H) L0+8<+<0+A5++0+A5+A5+A5+A5+A5+A5+A5+A5+A5+A5+A5+A5+A5+A5+A5+y9+-0+*8+M0+N0+O0+P0+Q0+[0+A5+A5+-0+R0+S0+T0+U0+V0+W0+X0+Y0+y9++0+", +"W7+W7+W7+W7+W7+W7+W7+W7+W7+W7+W7+W7+W7+W7+W7+W7+W7+W7+W7+W7+28+Z0+`0+ a+.a+#s #s +a+#s @a+#a+n5+I8+W7+W7+W7+W7+W7+W7+I8+38+$a+:; [& [& H; H; }> u* u* f& %a+&a+38+W7+*a+W7+=a+-a+;a+>a+,a+'a+54+)a+!a+=a+W7+W7+W7+W7+W7+W7+W7+W7+W7+W7+W7+W7+W7+W7+W7+W7+W7+W7+W7+W7+W7+W7+W7+W7+W7+W7+W7+W7+W7+W7+W7+W7+W7+W7+W7+W7+W7+W7+W7+W7+W7+W7+W7+W7+W7+W7+W7+W7+W7+W7+W7+W7+W7+W7+W7+W7+W7+W7+W7+W7+W7+W7+W7+W7+W7+W7+W7+W7+W7+W7+W7+W7+W7+W7+W7+W7+W7+W7+W7+W7+W7+W7+W7+*a+W7+I8+~a+{a+]a+*a+W7+W7+W7+W7+W7+W7+W7+W7+W7+W7+W7+W7+W7+W7+W7+W7+W7+W7+*a+;0+^a+/a+(a+_a+W7+W7+W7+W7+W7+W7+W7+W7+W7+W7+W7+W7+*a+:a+ H; }> u* u* f& f& a$ va+wa+38+W7+xa+ya+za+Aa+Ba+Ca+Da+Ea+(a+Fa+|a+x9+x9+x9+x9+x9+x9+x9+x9+x9+x9+x9+x9+x9+x9+x9+x9+x9+x9+x9+x9+x9+x9+x9+x9+x9+x9+x9+x9+x9+x9+x9+x9+x9+x9+x9+x9+x9+x9+x9+x9+x9+x9+x9+x9+x9+x9+x9+x9+x9+x9+x9+x9+x9+x9+x9+x9+x9+x9+x9+x9+x9+x9+x9+x9+x9+x9+x9+x9+x9+x9+x9+x9+x9+x9+x9+x9+x9+x9+x9+x9+x9+x9+x9+_a+Ga+Ha+Ia+Ja+Ka+x9+_a+x9+x9+x9+x9+x9+x9+x9+x9+x9+x9+x9+x9+x9+x9+x9+x9+x9+La+Ma+Na+Oa+Pa+Qa+_a+x9+x9+x9+x9+x9+x9+x9+x9+x9+x9+x9+La+(a+Ra+Sa+Ta+Ua+_a+x9+x9+x9+x9+x9+x9+x9+x9+x9+x9+x9+x9+x9+x9+Va+Wa+Xa+Ya+Za+`a+!0+|a+_a+x9+x9+x9+x9+x9+x9+x9+x9+x9+x9+x9+x9+x9+x9+x9+x9+x9+x9+W7+<0+I3+ b+.b+)~ #_ D! D! H) D! D! D! k( }q +b+J0+aa+W7+x9+x9+x9+x9+x9+x9+x9+x9+x9+x9+x9+x9+x9+x9+x9+x9+x9+x9+x9+@b+I8+R0+#b+$b+%b+&b+*b+=b+x9+x9+|a+Va+-b+;b+>b+,b+'b+)b+!b+50+", +"*a+*a+*a+*a+*a+*a+*a+*a+*a+*a+*a+*a+*a+*a+*a+*a+*a+*a+*a+*a+a9+~b+{b+]b+^b+/b+/b+(b+/b+_b+:b+n5+Ka+*a+*a+*a+*a+*a+*a+*a+I8+I8++0+ Q& 52 wa+28+}b+za+|b+1b+2b+3b+4b+(a+5b+6b+*a+*a+*a+*a+*a+*a+*a+*a+*a+*a+*a+*a+*a+*a+*a+*a+*a+*a+*a+*a+*a+*a+*a+*a+*a+*a+*a+*a+*a+*a+*a+*a+*a+*a+*a+*a+*a+*a+*a+*a+*a+*a+*a+*a+*a+*a+*a+*a+*a+*a+*a+*a+*a+*a+*a+*a+*a+*a+*a+*a+*a+*a+*a+*a+*a+*a+*a+*a+*a+*a+*a+*a+*a+*a+*a+*a+*a+*a+*a+*a+*a+*a+*a+*a+*a+7b+8b+Ia+9b+Ka+6b+*a+*a+*a+*a+*a+*a+*a+*a+*a+*a+*a+*a+*a+*a+*a+*a+*a+*a+La+0b+ab+bb+cb+db+=a+*a+*a+*a+*a+*a+*a+*a+*a+*a+*a+*a+=a+eb+fb+gb+hb+eb+=a+*a+*a+*a+*a+*a+*a+*a+*a+*a+*a+*a+*a+*a+*a+Fa+ib+jb+O7+kb+lb+mb+nb+_a+*a+*a+*a+*a+*a+*a+*a+*a+*a+*a+*a+*a+*a+*a+*a+*a+*a+*a+Ka+W7+38+ob+h{+D, D! !~ !~ D! H) H) #_ &a pb+L_+qb+I8+*a+*a+*a+*a+*a+*a+*a+*a+*a+*a+*a+*a+*a+*a+*a+*a+*a+*a+*a+*a+*a+=b+rb+ca+sb+tb+ub+vb+wb+_a+*a+*a+6b+Va+xb+yb+zb+Ab+Bb+Cb+Db+", +"Ka+Ka+Ka+Ka+Ka+Ka+Ka+Ka+Ka+Ka+Ka+Ka+Ka+Ka+Ka+Ka+Ka+Ka+Ka+Ka+Eb+Fb+Gb+Hb+Ib+Jb+Jb+Kb+Lb+Mb+Nb+[7+<0+Ka+Ka+Ka+Ka+Ka+Ka+Ka+Ka+<0++0+&3+}> u* f& f& Y= Y= [> [> Q& E* Ob+Pb+Qb+Rb+Sb+Tb+Ub+Vb+Wb+Xb+I8+Ka+Ka+Ka+Ka+Ka+Ka+Ka+Ka+Ka+Ka+Ka+Ka+Ka+Ka+Ka+Ka+Ka+Ka+Ka+Ka+Ka+Ka+Ka+Ka+Ka+Ka+Ka+Ka+Ka+Ka+Ka+Ka+Ka+Ka+Ka+Ka+Ka+Ka+Ka+Ka+Ka+Ka+Ka+Ka+Ka+Ka+Ka+Ka+Ka+Ka+Ka+Ka+Ka+Ka+Ka+Ka+Ka+Ka+Ka+Ka+Ka+Ka+Ka+Ka+Ka+Ka+Ka+Ka+Ka+Ka+Ka+Ka+Ka+Ka+Ka+Ka+Ka+Ka+Ka+Ka+Ka+Ka+Ka+Ka+Ka+Ka+Yb+Zb+`b+9b+ c+I8+Ka+Ka+Ka+Ka+Ka+Ka+Ka+Ka+Ka+Ka+Ka+Ka+Ka+Ka+Ka+Ka+Ka+Ka+Ka+Ka+0b+.c++c+@c+#c+Ka+Ka+Ka+Ka+Ka+Ka+Ka+Ka+Ka+Ka+Ka+Xb+$c+%c+&c+*c+=c+Xb+Ka+Ka+Ka+Ka+Ka+Ka+Ka+Ka+Ka+Ka+Ka+Ka+Ka+Ka+Xb+-c+;c+>c+,c+'c+)c+!c+Xb+Ka+Ka+Ka+Ka+Ka+Ka+Ka+Ka+Ka+Ka+Ka+Ka+Ka+Ka+Ka+Ka+Ka+<0+<0+7a+~c+yr D, D! !~ D! D! !~ D! k( pd {c+w6+I8+<0+Ka+Ka+Ka+Ka+Ka+Ka+Ka+Ka+Ka+Ka+Ka+Ka+Ka+Ka+Ka+Ka+Ka+Ka+Ka+Ka+Ka+Ka+Ka+#c+]c+^c+/c+(c+_c+:c+ Y= Y= Y= [> Q& Q& B* dc+ec+fc+gc+hc+ic+jc+kc+lc+mc+3c+3c+3c+3c+3c+3c+3c+3c+3c+3c+3c+3c+3c+3c+3c+3c+3c+3c+3c+3c+3c+3c+3c+3c+3c+3c+3c+3c+3c+3c+3c+3c+3c+3c+3c+3c+3c+3c+3c+3c+3c+3c+3c+3c+3c+3c+3c+3c+3c+3c+3c+3c+3c+3c+3c+3c+3c+3c+3c+3c+3c+3c+3c+3c+3c+3c+3c+3c+3c+3c+3c+3c+3c+3c+3c+3c+3c+3c+3c+3c+3c+3c+3c+3c+3c+3c+3c+#c+nc+Zb+oc+9b+<0+3c+#c+3c+3c+3c+3c+3c+3c+3c+3c+3c+3c+3c+3c+3c+3c+3c+3c+3c+3c+ c+pc+qc+rc+sc+tc+#c+3c+3c+3c+3c+3c+3c+3c+3c+3c+3c+#c+uc+vc+wc+xc+Yb+<0+#c+3c+3c+3c+3c+3c+3c+3c+3c+3c+3c+3c+3c+3c+#c+!c+yc+zc+Ac+Bc+Cc+Dc+Ec+3c+3c+3c+3c+3c+3c+3c+3c+3c+3c+3c+3c+3c+3c+3c+3c+<0+aa+8<+Fc+Tt #_ D! !~ D! D! !~ D! D, zF U]+Gc+A5+aa+I8+3c+3c+3c+3c+3c+3c+3c+3c+3c+3c+3c+3c+3c+3c+3c+3c+3c+3c+3c+3c+3c+3c+3c+Hc+Ic+Jc+Kc+Lc+Mc+Nc+Oc+Hc+3c+3c+3c+3c+Pc+Qc+Rc+Sc+1c+Tc+", +"Ka+Ka+Ka+Ka+Ka+Ka+Ka+Ka+Ka+Ka+Ka+Ka+Ka+Ka+Ka+Ka+Ka+Ka+Ka+Ka+Eb+Uc+Vc+v0 Wc+Xc+Xc+Yc+Zc+`c+ d+.d+qb+Ka+Ka+Ka+Ka+Ka+Ka+Ka+Ka+Ka+Ka+qb++d+@d+#d+[> [> Q& Q& B* dc+$d+%d+&d+*d+=d+-d+;d+>d+,d+'d+Ka+Ka+Ka+Ka+Ka+Ka+Ka+Ka+Ka+Ka+Ka+Ka+Ka+Ka+Ka+Ka+Ka+Ka+Ka+Ka+Ka+Ka+Ka+Ka+Ka+Ka+Ka+Ka+Ka+Ka+Ka+Ka+Ka+Ka+Ka+Ka+Ka+Ka+Ka+Ka+Ka+Ka+Ka+Ka+Ka+Ka+Ka+Ka+Ka+Ka+Ka+Ka+Ka+Ka+Ka+Ka+Ka+Ka+Ka+Ka+Ka+Ka+Ka+Ka+Ka+Ka+Ka+Ka+Ka+Ka+Ka+Ka+Ka+Ka+Ka+Ka+Ka+Ka+Ka+Ka+Ka+Ka+Ka+Ka+Ka+Ka+Ka+)d+3c+!d+`b+9b+qb+'d+Ka+Ka+Ka+Ka+Ka+Ka+Ka+Ka+Ka+Ka+Ka+Ka+Ka+Ka+Ka+Ka+Ka+Ka+Ka+ c+~d+{d+rc+]d+^d+/d+Ka+Ka+Ka+Ka+Ka+Ka+Ka+Ka+Ka+Ka+ c+'d+(d+_d+:d+e+,e+'e+)e+!e+~e+{e+]e+^e+Ka+aa+aa+aa+aa+aa+aa+aa+aa+aa+aa+aa+aa+aa+aa+aa+aa+aa+aa+aa+aa+aa+aa+aa+aa+aa+aa+aa+aa+aa+aa+aa+aa+aa+aa+aa+aa+aa+aa+aa+aa+aa+aa+aa+aa+aa+aa+aa+aa+aa+aa+aa+aa+aa+aa+aa+aa+aa+aa+aa+aa+aa+aa+aa+aa+aa+aa+aa+aa+aa+aa+aa+aa+aa+aa+aa+aa+aa+aa+aa+aa+aa+aa+aa+aa+aa+aa+aa+aa+qb+/e+xd+(e+_e+ad+aa+zd+aa+aa+aa+aa+aa+aa+aa+aa+aa+aa+aa+aa+aa+aa+aa+aa+aa+aa+aa+:e+f+,f+=f+qb+ad+te+te+te+te+te+te+te+te+te+te+te+te+te+te+te+te+te+te+te+te+te+te+te+te+te+te+:e+'f+)f+!f+= ~f+{f+]f+^f+Oc+6e+te+:e+te+te+'f+zd+ad+/f+", +"ad+ad+ad+ad+ad+ad+ad+ad+ad+ad+ad+ad+ad+ad+ad+ad+ad+ad+ad+ad+(f+_f+:f+xe+g+%g+Gc+Gc+Gc+Gc+Gc+Gc+Gc+Gc+Gc+%g+,g+'g+)g+!g+&g+Rf+%g+Gc+Gc+Gc+Gc+Gc+Gc+Gc+Gc+Gc+Gc+Gc+Gc+~g+{g+]g+^g+/g+(g+_g+:g+h+,h+'h+)h+!h+~h+{h+>h+6d+6d+6d+6d+6d+6d+6d+6d+6d+6d+6d+6d+6d+6d+6d+6d+6d+6d+6d+6d+6d+]h+^h+/h+(h+_h+:h+6d+6d+6d+6d+6d+6d+6d+6d+6d+6d+]h+h+Oh+Ph+Qh+Rh+Sh+]h+=f+=f+=f+=f+=f+=f+=f+=f+=f+Nh+Th+Uh+Vh+Wh+Sh+Nh+=f+=f+=f+=f+=f+=f+=f+=f+=f+=f+=f+=f+=f+=f+:h+Xh+Yh+Zh+`h+ i+.i++i+@i+]h+=f+=f+6d+=f+#i+-f+$i+N&+EC (, D, k( k( !~ !~ k( !~ k( #{ i.+%i+*a+#i+6d+=f+=f+=f+=f+=f+=f+=f+=f+=f+=f+=f+=f+=f+=f+=f+=f+=f+=f+=f+=f+=f+=f+=f+=f+=f+=f+=f+=f+=f+=f+=f+=f+=f+=f+=f+=f+=f+&i+*i+=i+-i+;i+>i+,i+&i+]h+=f+=f+=f+=f+", +"6d+6d+6d+6d+6d+6d+6d+6d+6d+6d+6d+6d+6d+6d+6d+6d+6d+6d+6d+=f+Tg+'i+)i+<'+!i+~i+~i+{i+]i+^i+/i+(i+=f+6d+6d+6d+6d+kh+:h+]h+_i+:i+h+6d+6d+6d+6d+6d+6d+6d+6d+6d+]h+ni+oi+pi+qi+ri+si+:h+]h+6d+6d+6d+6d+6d+6d+6d+6d+6d+6d+6d+6d+6d+th+ti+ui+vi+Gg+wi+xi+yi+th+=f+6d+#i+ad+0d+zi+L{ !~ (, k( D, D, k( k( !~ !~ /' E' H) Ai+9h+Bi+6d+=f+6d+6d+6d+6d+6d+6d+6d+6d+6d+6d+6d+6d+6d+6d+6d+6d+6d+6d+6d+6d+6d+6d+6d+6d+6d+6d+6d+6d+6d+6d+6d+6d+6d+6d+6d+6d+:h+kh+Ci+Di+Ei+Fi+Gi+Hi+Ii+ch+:h+6d+6d+6d+", +"=f+=f+=f+=f+=f+=f+=f+=f+=f+=f+=f+=f+=f+=f+=f+=f+=f+=f+=f+=f+si+Ji+Ki+]i+Li+Mi+Mi+Ni+Oi+Pi+Qi+Ri+#i+=f+=f+=f+=f+=f+Si+Ti+Ui+Vi+Wi+Xi+Yi+Zi+`i+ j+.j++j+@j+#j+$j+de+Bh+%j+&j+`f+q$ S& S& M& $& $& n* G* z* *j+wr.Bh+de+=f+=f+=f+=f+=f+=f+=f+=f+=f+=f+=f+=f+=f+=f+=f+=f+=f+=f+=f+=f+=f+=f+=f+=f+=f+=f+=f+=f+=f+=f+=f+=f+=f+=f+=f+=f+=f+=f+=f+=f+=f+=f+=f+=f+=f+=f+=f+=f+=f+=f+=f+=f+=f+=f+=f+=f+=f+=f+=f+=f+=f+=f+=f+=f+=f+=f+=f+=f+=f+=f+=f+=f+=f+=f+=f+=f+=f+=f+Si+=j+-j+;j+>j+,j+'j+)j+ug+$j+=f+=f+=f+=f+=f+=f+=f+=f+=f+=f+=f+=f+=f+=f+=f+=f+=f+=f+=f+=f+=f+Si+Sh+!j+~j+Bg+{j+4i+=f+=f+=f+=f+=f+=f+=f+=f+]j+^j+/j+(j+_j+:j+k+,k+{j+de+de+", +"4i+4i+4i+4i+4i+4i+4i+4i+4i+4i+4i+4i+4i+4i+4i+4i+4i+4i+4i+#i+'k+)k+!k+mj+~k+{k+{k+]k+^k+/k+oj+Ri+(k+4i+4i+4i+Si+Ti+Vi+_k+T. :k+:k+:k+T. l+,l+'l+=l+)l+L{ (, <) /' (, (, /' D, D, D, 3| L{ k( !l+0d+#i+5j+#i+(k+(k+(k+(k+(k+(k+(k+(k+(k+(k+(k+(k+(k+(k+(k+(k+(k+(k+(k+(k+(k+(k+(k+(k+(k+(k+(k+(k+(k+(k+(k+(k+(k+(k+(k+(k+(k+(k+(k+(k+(k+(k+(k+(k+(k+~l+{l+]l+^l+/l+(l+_l+:l+(k+(k+", +"8h+8h+8h+8h+8h+8h+8h+8h+8h+8h+8h+8h+8h+8h+8h+8h+8h+8h+8h+8h+m+,m+Wk+Bi+Bi+Bi+Bi+Bi+Bi+Bi+'m+)m+!m+~m+{m+]m+^m+/m+Wk+Bi+Bi+Bi+Bi+Bi+Bi+Bi+Bi+Bi+Bi+Bi+Bi+Bi+Bi+Bi+Mk+(m+_m+:m+n+,n+'n+)n+!n+~n+{n+]n+^n+/n+2g+tm+Sl+Sl+Sl+Sl+Sl+Sl+Sl+Sl+Sl+5j+Sl+Sl+(n+#m+m% y* m% 7! m% T= T= h{ T= h{ l- *j+*j+_n+5j+*m+5j+5j+Sl+Sl+Sl+Sl+Sl+Sl+Sl+Sl+Sl+Sl+Sl+Sl+Sl+Sl+Sl+Sl+Sl+Sl+Sl+Sl+Sl+Sl+Sl+Sl+Sl+Sl+Sl+Sl+Sl+Sl+Sl+Sl+Sl+Sl+Sl+Sl+Sl+Sl+Sl+Sl+Sl+Sl+Sl+Sl+Sl+Sl+Sl+Sl+Sl+Sl+Sl+Sl+Sl+Sl+Sl+Sl+Sl+Sl+Sl+Sl+Sl+Sl+Sl+Sl+Sl+Sl+Sl+Sl+xm+ym+:n+Am+Bm+xm+Sl+Sl+Sl+Sl+Sl+Sl+Sl+Sl+Sl+Sl+Sl+Sl+Sl+Sl+Sl+Sl+Sl+Sl+Sl+Sl+Sl+Sl+Sl+Sl+Sl+)m++(, (, <) ~~ :`.dn+en+fn+tm+=n+Sl+5j+Sl+Sl+Sl+Sl+Sl+Sl+Sl+Sl+Sl+Sl+Sl+Sl+Sl+Sl+Sl+Sl+Sl+Sl+Sl+Sl+Sl+Sl+Sl+Sl+Sl+Sl+Sl+Sl+Sl+Sl+Sl+Sl+Sl+Sl+Sl+Sl+Sl+Sl+Sl+Sl+Sl+Sl+Sl+Sl+Sl+Sl+Sl+Sl+Sl+Sl+Sl+gn+hn+in+jn+kn+ln+mn+nn+", +"=n+=n+=n+=n+=n+=n+=n+=n+=n+=n+=n+=n+=n+=n+=n+=n+=n+=n+=n+=n+on+pn+qn+rn+sn+&n+&n+tn+un+vn+wn+Dj+=n+=n+=n+gn+xn+yn+zn+An+Bn+Cn+Dn+En+Fn+Gn+Hn+In+Jn+2g+5m+=n+=n+=n+=n+=n+=n+=n+=n+=n+=n+=n+=n+Kn+fl+Ln+y* 7! m% T= T= T= T= h{ h{ z* O& G* Mn+Nn+On+Sl+Sl+=n+=n+=n+=n+=n+=n+=n+=n+=n+=n+=n+=n+=n+=n+=n+=n+=n+=n+=n+=n+=n+=n+=n+=n+=n+=n+=n+=n+=n+=n+=n+=n+=n+=n+=n+=n+=n+=n+=n+=n+=n+=n+=n+=n+=n+=n+=n+=n+=n+=n+=n+=n+=n+=n+=n+=n+=n+=n+=n+=n+=n+=n+=n+=n+=n+=n+=n+Cm+Pn+Qn+Rn+Sn+Bm+Pn+Kn+=n+=n+=n+=n+=n+=n+=n+=n+=n+=n+=n+=n+=n+=n+=n+=n+=n+=n+=n+=n+=n+=n+=n+=n+Cm+Tn+Un+;m+Vn+o+=n+=n+=n+=n+=n+=n+=n+=n+=n+=n+=n+=n+=n+=n+=n+=n+=n+=n+=n+=n+=n+=n+=n+=n+=n+=n+=n+=n+=n+=n+=n+=n+=n+=n+=n+=n+=n+=n+=n+=n+=n+=n+=n+=n+=n+=n+=n+=n+=n+=n+=n+=n+=n+=n+=n+=n+.k+=n+,o+'o+)o+!o+~o+", +"5j+5j+5j+5j+5j+5j+5j+5j+5j+5j+5j+5j+5j+5j+5j+5j+5j+5j+5j+bh+{o+]o+^o+/o+(o+un+un+_o+:o++o+=n+=n+=n+=n+=n+=n+=n+=n+=n+=n+=n+=n+tm+tm+%p+wm+2s 2k+T= W= T= h{ h{ z* G* G* G* n* n* n* Ok+$& 43+=n+=n+tm+tm+=n+=n+=n+=n+=n+=n+=n+=n+=n+=n+=n+=n+=n+=n+=n+=n+=n+=n+=n+=n+=n+=n+=n+=n+=n+=n+=n+=n+=n+=n+=n+=n+=n+=n+=n+=n+=n+=n+=n+=n+=n+=n+=n+=n+=n+=n+=n+=n+=n+=n+=n+=n+=n+=n+=n+=n+=n+=n+=n+=n+=n+=n+=n+%p+&p+*p+=p+-p+;p+%p+=n+=n+=n+=n+=n+=n+=n+=n+=n+=n+=n+=n+=n+=n+=n+=n+=n+=n+=n+=n+=n+=n+=n+=n+=n+>p+,p+'p+)p+!p+~p+>p+=n+=n+=n+=n+=n+=n+=n+}o+eo+{p+]p+^p+/p+,p+>p+=n+=n+=n+=n+=n+=n+tm+>o+5m+(p+Rl+_p+{c+Ro o+tm+tm+tm+tm+tm+tm+tm+tm+tm+tm+tm+tm+tm+tm+tm+%p+%p+d +T= #m+h{ l- z* G* G* G* G* n* n* $& Z= M& wp+GB xp+Kn+tm+5m+tm+tm+tm+tm+tm+tm+tm+tm+tm+tm+tm+tm+tm+tm+tm+tm+tm+tm+tm+tm+tm+tm+tm+tm+tm+tm+tm+tm+tm+tm+tm+tm+tm+tm+tm+tm+tm+tm+tm+tm+tm+tm+tm+tm+tm+tm+tm+tm+tm+tm+tm+tm+tm+tm+tm+tm+tm+tm+tm+tm+tm+5m+%p+yp+zp+Ap+Bp+Cp+%p+tm+tm+tm+tm+tm+tm+tm+tm+tm+tm+tm+tm+tm+tm+tm+tm+tm+tm+tm+tm+tm+tm+tm+tm+tm+eo+Dp+Ep+Fp+Gp+Hp+eo+5m+tm+tm+tm+tm+tm+tm+tm+Ip+,p+Jp+Kp+Lp+,p+eo+5m+tm+5m+tm+5m+>o+5m+Mp+Sl+en+Np+Uk.,o./, y; q+,q+'q+)q+!q+~q+{q+]q+]q+^q+/q+(q+(k+6j+5m+5m+5m+5m+5m+5m+5m+5m+5m+5m+5m+5m+5m+5m+5m+6j+6j+5m+Bo+um+Cj+Cj+z* z* G* n* n* $& $& $& $& M& M& wp+q$ _q+5m+%p+6j+6j+5m+5m+5m+5m+5m+5m+5m+5m+5m+5m+5m+5m+5m+5m+5m+5m+5m+5m+5m+5m+5m+5m+5m+5m+5m+5m+5m+5m+5m+5m+5m+5m+5m+5m+5m+5m+5m+5m+5m+5m+5m+5m+5m+5m+5m+5m+5m+5m+5m+5m+5m+5m+5m+5m+5m+5m+5m+5m+5m+5m+5m+:q+o+sq+tq+uq+vq+wq+xq+yq+zq+Ro+Aq+Bq+Cq+Cq+Bq+Aq+4i+>o+|q+|q+|q+|q+|q+|q+|q+|q+|q+|q+|q+|q+|q+|q+|q+|q+|q+|q+6j+|q+|q+Dq+l- *j+G* <& G* n* n* $& M& M& S& S& S& q$ `f+Eq+Fq+%p+5m+>o+|q+|q+|q+|q+|q+|q+|q+|q+|q+|q+|q+|q+|q+|q+|q+|q+|q+|q+|q+|q+|q+|q+|q+|q+|q+|q+|q+|q+|q+|q+|q+|q+|q+|q+|q+|q+|q+|q+|q+|q+|q+|q+|q+|q+|q+|q+|q+|q+|q+|q+|q+|q+|q+|q+|q+|q+|q+|q+|q+|q+Gq+o+(p+=n+Wq+ah+Uk.~~ Xq+v- /, F' y; y; y; Yq+Zq+`q+ r+.r++r+@r+#r+$r+%r+5m+|q+|q+|q+|q+|q+|q+|q+|q+|q+|q+|q+|q+|q+|q+|q+|q+|q+|q+|q+|q+|q+|q+|q+|q+|q+|q+|q+|q+|q+|q+|q+|q+|q+|q+|q+|q+|q+|q+|q+|q+|q+|q+|q+|q+|q+|q+|q+|q+|q+|q+|q+|q+|q+|q+|q+|q+|q+|q+|q+|q+|q+|q+|q+|q+&r+gq+*r+=r+", +"6j+6j+6j+6j+6j+6j+6j+6j+6j+6j+6j+6j+6j+6j+6j+6j+6j+6j+6j+>o+-r+;r+>r+,r+'r+qq+qq+)r+!r+~r+{r+*m+]r+^r+/r+(r+_r+:r+o+>o+>o+6j+6j+6j+6j+6j+6j+6j+6j+6j+6j+6j+6j+6j+6j+6j+6j+6j+6j+6j+6j+6j+6j+6j+6j+6j+6j+6j+6j+6j+6j+6j+6j+6j+6j+6j+6j+6j+6j+6j+6j+6j+6j+6j+6j+6j+6j+6j+6j+6j+6j+6j+6j+6j+6j+6j+>o+1q+:q+o+>o+6j+6j+6j+6j+6j+6j+6j+1q+9r+0r+ar+br+cr+gp+(p+=n+dr+X/+^j.o+6j+6j+6j+6j+6j+6j+6j+6j+6j+6j+6j+6j+6j+6j+6j+6j+6j+6j+6j+6j+6j+6j+6j+6j+6j+6j+6j+6j+6j+6j+6j+6j+6j+6j+6j+6j+6j+6j+6j+6j+6j+6j+6j+6j+6j+6j+6j+6j+6j+6j+6j+6j+6j+6j+6j+6j+6j+6j+6j+6j+6j+6j+6j+6j+6j+6j+>o+Om+", +"Xp+Xp+Xp+Xp+Xp+Xp+Xp+Xp+Xp+Xp+Xp+Xp+Xp+Xp+Xp+Xp+Xp+Xp+Xp+Xp+mr+nr+or+pr+qr+!r+!r+rr+T0.sr+tr+Kn+%r+ur+vr+wr+wq+xr+yr+kr+zr+Ar+3m+Vq+Vq+Vq+Vq+3m+>o+Xp+Xp+Xp+Xp+Xp+Xp+Xp+Xp+Xp+Xp+Xp+Xp+Xp+Xp+Xp+Xp+Xp+Xp+Xp+Xp+Xp+Xp+Xp+>o+Br+Cr+Dr+Er+el+$& $& M& S& S& q$ q$ q$ |% |% |% L! R& 45+>o+|q+>o+Vq+Xp+Xp+Xp+Xp+Xp+Xp+Xp+Xp+Xp+Xp+Xp+Xp+Xp+Xp+Xp+Xp+Xp+Xp+Xp+Xp+Xp+Xp+Xp+Xp+Xp+Xp+Xp+Xp+Xp+Xp+Xp+Xp+Xp+Xp+Xp+Xp+Xp+Xp+Xp+Xp+Xp+Xp+Xp+Xp+Xp+Xp+Xp+Xp+Xp+Xp+Xp+Xp+Xp+Xp+-q+Br+Fr+Gr+Hr+Ir+Jr+Br+Xp+Xp+Xp+Xp+Xp+Xp+Xp+Xp+Xp+Xp+Xp+Xp+Xp+Xp+Xp+Xp+Xp+Xp+Xp+Xp+Xp+Xp+Xp+Xp+Xp+Xp+Xp+Kr+Lr+Mr+Nr+Or+Pr+]r+Xp+Xp+Xp+Xp+Xp+Xp+Xp+lr+Qr+Rr+Sr+Tr+Yh+Ur+Vr+Wr+LX *~._, DI.J= v- /, /, /, /, F' y; *~.F' N' Xr+Yr+Zr+`r+ s+.s+Om+Xp+-q+Xp+Xp+Xp+Xp+Xp+Xp+Xp+Xp+Xp+Xp+Xp+Xp+Xp+Xp+Xp+Xp+Xp+Xp+Xp+Xp+Xp+Xp+Xp+Xp+Xp+Xp+Xp+Xp+Xp+Xp+Xp+Xp+Xp+Xp+Xp+Xp+Xp+Xp+Xp+Xp+Xp+Xp+Xp+Xp+Xp+Xp+Xp+Xp+Xp+Xp+Xp+Xp+Xp+Xp+Xp+Xp+Xp+Xp+Xp+Xp+Xp+Xp+Xp+Xp+Xp+Xp+-q+Xp+", +">o+>o+>o+>o+>o+>o+>o+>o+>o+>o+>o+>o+>o+>o+>o+>o+>o+>o+>o+Br+mr+nr++s+@s+#s+$s+$s+%s+&s+*s+tr+=s+kr+-s+;s+>s+,s+'s+)s+!s+]r+>o+>o+>o+>o+>o+>o+>o+>o+>o+>o+>o+>o+>o+>o+>o+>o+>o+>o+>o+>o+>o+>o+>o+>o+>o+>o+>o+>o+>o+>o+>o+Xp+Xp+Br+Br+~s+8$ Ok+Z= M& S& S& S& q$ |% |% #* #* #* h- G_ {s+]s+3m+|q+|q+Br+Vq+Vq+>o+>o+>o+>o+>o+>o+>o+>o+>o+>o+>o+>o+>o+>o+>o+>o+>o+>o+>o+>o+>o+>o+>o+>o+>o+>o+>o+>o+>o+>o+>o+>o+>o+>o+>o+>o+>o+>o+>o+>o+>o+>o+>o+>o+>o+>o+>o+>o+>o+>o+Br+Br+^s+/s+(s+_s+:s+Uq+>o+>o+>o+>o+>o+>o+>o+>o+>o+>o+>o+>o+>o+>o+>o+>o+>o+>o+>o+>o+>o+>o+>o+>o+>o+>o+>o+lr+o+>o+>o+>o+>o+>o+>o+]r+2s+3s+4s+5s+6s+7s+j).wu f= ow.*- J= v- v- v- v- /, F' /, /, /, Uk.Ro 8s+9s+0s+as+bs+cs+ds+es+]r+>o+>o+>o+>o+>o+>o+>o+>o+>o+>o+>o+>o+>o+>o+>o+>o+>o+>o+>o+>o+>o+>o+>o+>o+>o+>o+>o+>o+>o+>o+>o+>o+>o+>o+>o+>o+>o+>o+>o+>o+>o+>o+>o+>o+>o+>o+>o+>o+>o+>o+>o+>o+>o+>o+>o+>o+>o+>o+>o+>o+>o+>o+>o+>o+>o+>o+>o+-q+", +"Vq+Vq+Vq+Vq+Vq+Vq+Vq+Vq+Vq+Vq+Vq+Vq+Vq+Vq+Vq+Vq+Vq+Vq+Vq+Vq+fs+gs+hs+Q1.is+js+js+ks+,9.ls+ms+ns+os+ps+qs+>s+ET rs+ss+%r+Vq+Vq+Vq+Vq+Vq+Vq+Vq+Vq+Vq+Vq+Vq+Vq+Vq+Vq+Vq+Vq+Vq+Vq+Vq+Vq+Vq+Vq+Vq+Vq+Vq+Vq+Vq+Vq+Vq+Vq+Vq+Vq+Vq+Vq+Vq+Vq+Br+3m+,(.-h+-h+S& D* q$ |% |% |% |% #* #* h- h- G_ ts+k- uR.:0+Br+|q+>o+Vq+Vq+Vq+Vq+Vq+Vq+Vq+Vq+Vq+Vq+Vq+Vq+Vq+Vq+Vq+Vq+Vq+Vq+Vq+Vq+Vq+Vq+Vq+Vq+Vq+Vq+Vq+Vq+Vq+Vq+Vq+Vq+Vq+Vq+Vq+Vq+Vq+Vq+Vq+Vq+Vq+Vq+Vq+Vq+Vq+Vq+Vq+Vq+Vq+Vq+Vq+]r+^s+/s+us+vs+ws+xs+Vq+Vq+Vq+Vq+Vq+Vq+Vq+Vq+Vq+Vq+Vq+Vq+Vq+Vq+Vq+Vq+Vq+Vq+Vq+Vq+Vq+Vq+Vq+Vq+Vq+Vq+Vq+]r+^s+ys+6r+zs+As+Vq+Vq+Vq+Vq+Vq+Vq+Vq+Bs+>o+Cs+Ds+Es+Fs+Gs+Hs+Is+vr._, *- J= J= J= J= v- /, /, v- v- fs ,o.-o+Js+Ks+Ls+Ms+Ns+Os+Ps+jr+Qs+%r+Vq+Vq+Vq+Vq+Vq+Vq+Vq+Vq+Vq+Vq+Vq+Vq+Vq+Vq+Vq+Vq+Vq+Vq+Vq+Vq+Vq+Vq+Vq+Vq+Vq+Vq+Vq+Vq+Vq+Vq+Vq+Vq+Vq+Vq+Vq+Vq+Vq+Vq+Vq+Vq+Vq+Vq+Vq+Vq+Vq+Vq+Vq+Vq+Vq+Vq+Vq+Vq+Vq+Vq+Vq+Vq+Vq+Vq+Vq+Vq+Vq+Vq+Vq+Vq+Vq+Vq+Vq+Vq+", +"Rs+Rs+Rs+Rs+Rs+Rs+Rs+Rs+Rs+Rs+Rs+Rs+Rs+Rs+Rs+Rs+Rs+Rs+Rs+Rs+Ss+Ts+Us+Vs+Ws+Xs+Xs+Ys+Zs+`s+ t+.t++t+@t+#t+$t+%t+&t+Vq+*t+Rs+Rs+Rs+Rs+Rs+Rs+Rs+Rs+Rs+Rs+Rs+Rs+Rs+Rs+Rs+Rs+Rs+Rs+Rs+Rs+Rs+Rs+Rs+Rs+Rs+Rs+Rs+Rs+Rs+Rs+Rs+Rs+Rs+Rs+Rs+Rs+Rs+=t+=t+-t+;t+U{ S& q$ q$ |% #* #* h- h- h- o$ k- W& >t+g} g} ,t+'t+:0+Br+)t+Vq+Rs+Rs+Rs+Rs+Rs+Rs+Rs+Rs+Rs+Rs+Rs+Rs+Rs+Rs+Rs+Rs+Rs+Rs+Rs+Rs+Rs+Rs+Rs+Rs+Rs+Rs+Rs+Rs+Rs+Rs+Rs+Rs+Rs+Rs+Rs+Rs+Rs+Rs+Rs+Rs+Rs+Rs+Rs+Rs+Rs+Rs+Rs+*t+=t+!t+~t+us+{t+]t+^t+Rs+Rs+Rs+Rs+Rs+Rs+Rs+Rs+Rs+Rs+Rs+Rs+Rs+Rs+Rs+Rs+Rs+Rs+Rs+Rs+Rs+Rs+Rs+Rs+Rs+Rs+Rs+Rs+/t+(t+Mr+_t+:t+ z1 B* rt+$(+st+|q+Br+Vq+Rs+Rs+Vq+Vq+Vq+Vq+Vq+Vq+Vq+Vq+Vq+Vq+Vq+Vq+Vq+Vq+Vq+Vq+Vq+Vq+Vq+Vq+Vq+Vq+Vq+Vq+Vq+Vq+Vq+Vq+Vq+Vq+Vq+Vq+Vq+Vq+Vq+Vq+Vq+Vq+Vq+Vq+Vq+Vq+=t+=t+tt+~t+ut+{t+vt+Kr+Vq+Vq+Vq+Vq+Vq+Vq+Vq+Vq+Vq+Vq+Vq+Vq+Vq+Vq+Vq+Vq+Vq+Vq+Vq+Vq+Vq+Vq+Vq+Vq+Vq+Vq+Vq+Vq+%r+wt+xt+yt+zt+wt+/t+[t+[t+|q+Dj+At+Bt+c +Ct+Dt+Et+Ft+Gt+Ht+_, It+*- _, *- J= J= *- *- LX fs Jt+8t+5m+Dj+Rs+[t+Vq+*t+es+Kt+Lt+Mt+Nt+Ot+Pt+*t+Vq+Vq+Vq+Vq+Vq+Vq+Vq+Vq+Vq+Vq+Vq+Vq+Vq+Vq+Vq+Vq+Vq+Vq+Vq+Vq+Vq+Vq+Vq+Vq+Vq+Vq+Vq+Vq+Vq+Vq+Vq+Vq+Vq+Vq+Vq+Vq+Vq+Vq+Vq+Vq+Vq+Vq+Vq+Vq+Vq+Vq+Vq+Vq+Vq+Vq+Vq+Vq+Vq+Vq+Vq+Vq+Vq+Vq+Vq+Vq+Vq+Vq+Vq+Vq+Vq+Vq+Vq+", +"Rs+Rs+Rs+Rs+Rs+Rs+Rs+Rs+Rs+Rs+Rs+Rs+Rs+Rs+Rs+Rs+Rs+Rs+Rs+Rs+Qt+Rt+St+95.Tt+X8.X8.Ut+,d.Vt+Wt+Xt+Yt+Zt+`t+ u+.u++u+Rs+Rs+Rs+Rs+Rs+Rs+Rs+Rs+Rs+Rs+Rs+Rs+Rs+Rs+Rs+Rs+Rs+Rs+Rs+Rs+Rs+Rs+Rs+Rs+Rs+Rs+Rs+Rs+Rs+Rs+Rs+Rs+Rs+Rs+Rs+Rs+Rs+Rs+Rs+Rs+Rs+Rs+Rs+xs+:0+@u+`f+#* #* h- h- o$ o$ o$ W& 2$ k% P, l% l% J> B* #u+52 :$ j[+$u+[t+)t+Br+Rs+%u+Rs+Rs+Rs+Rs+Rs+Rs+Rs+Rs+Rs+Rs+Rs+Rs+Rs+Rs+Rs+Rs+Rs+Rs+Rs+Rs+Rs+Rs+Rs+Rs+Rs+Rs+Rs+Rs+Rs+Rs+Rs+Rs+Rs+Rs+Rs+Rs+Rs+Rs+Rs+Rs+Rs+*t+!t+~t+&u+*u+S9+=u+Rs+Rs+Rs+Rs+Rs+Rs+Rs+Rs+Rs+Rs+Rs+Rs+Rs+Rs+Rs+Rs+Rs+Rs+Rs+Rs+Rs+Rs+Rs+Rs+Rs+Rs+Rs+Rs+/t+-u+;u+>u+,u+'u+Uq+)u+!u+At+u9+Z9.#:.f= ~u+{u+]u+^u+/u+(u+_u+:u+_, *- *- _, _, j).^j.Wr+8t+|q+Ro+%u+ B* Q& Q& [> f& hu+%a+iu+ju+ku+Rs+Br+Rs+[t+[t+[t+Bs+Bs+Bs+Bs+Bs+Bs+Bs+Bs+Bs+Bs+Bs+Bs+Bs+Bs+Bs+Bs+Bs+Bs+Bs+Bs+Bs+Bs+Bs+Bs+Bs+Bs+Bs+Bs+Bs+Bs+Bs+Bs+Bs+Bs+Bs+Bs+gu+%u+lu+mu+&u+nu+ou+/t+Bs+Bs+Bs+Bs+Bs+Bs+Bs+Bs+Bs+Bs+Bs+Bs+Bs+Bs+Bs+Bs+Bs+Bs+Bs+Bs+Bs+Bs+Bs+Bs+Bs+Bs+[t+[t+pu+qu+ru+su+tu+uu+vu+wu+xu+~>.^; w- s~ R* R* w- yu+zu+Au+Bu+Cu+7t+_, f= f= *~.LX a/+8t+>o+Ro+[t+pu+[t+Bs+Bs+Bs+Bs+gu+Du+Eu+Fu+Gu+Hu+Iu+Ju+Ku+gu+Bs+Bs+Bs+Bs+Bs+Bs+Bs+Bs+Bs+Bs+Bs+Bs+Bs+Bs+Bs+Bs+Bs+Bs+Bs+Bs+Bs+Bs+Bs+Bs+Bs+Bs+Bs+Bs+Bs+Bs+Bs+Bs+Bs+Bs+Bs+Bs+Bs+Bs+Bs+Bs+Bs+Bs+Bs+Bs+Bs+Bs+Bs+Bs+Bs+Bs+Bs+Bs+Bs+Bs+Bs+Bs+Bs+Bs+Bs+Bs+Bs+Bs+Bs+Bs+Bs+Bs+", +"%u+%u+%u+%u+%u+%u+%u+%u+%u+%u+%u+%u+%u+%u+%u+%u+%u+%u+%u+%u+Lu+3u+Mu+Nu+Ou+Pu+Pu+Qu+jb.Ru+Su+Tu+Uu+Vu+Wu+Xu+Yu+%u+%u+%u+%u+%u+%u+%u+%u+%u+%u+%u+%u+%u+%u+%u+%u+%u+%u+%u+%u+%u+%u+%u+%u+%u+%u+%u+%u+%u+%u+%u+%u+%u+%u+%u+%u+%u+%u+%u+%u+%u+%u+%u+%u+%u+[t+%u+=u+Zu+`u+L! o$ Y% o$ W& 2$ k% P, l% l% J> B* Q& [> Y= N= f& u* H; v+j% .v++v+@v+=t+Br+Rs+[t+[t+[t+%u+%u+%u+%u+%u+%u+%u+%u+%u+%u+%u+%u+%u+%u+%u+%u+%u+%u+%u+%u+%u+%u+%u+%u+%u+%u+%u+%u+%u+%u+%u+%u+%u+%u+%u+lu+#v+=p+$v+%v+&v+%u+%u+%u+%u+%u+%u+%u+%u+%u+%u+%u+%u+%u+%u+%u+%u+%u+%u+%u+%u+%u+%u+[t+[t+pu+pu+Rs+%p+*v+=v+-v+;v+>v+,v+'v+)v+!v+R* S* Q* R* R* w- ~v+{v+]v+^v+/v+(v+S,+f= *~.j)._v+:v+Br+*v+[t+pu+[t+%u+%u+%u+%u+%u+%u+%u+ B* Q& Q& [> Y= f& u* }> 2= H; [& ua+kv+x* lv+mv+Ds+xs+=t+t+&w+P, P, l% J> B* Q& [> Y= Y= f& u* }> H; [& j% j% :; @* I; j6+%% w+,w+'w+!* uh.)8.)w+!w+L<+~w+{w+]w+^w+/w+!J Q* R* Q* R* R* (w+_w+:w+ Y= f& u* }> }> H; [& j% :; X& @* @* W* y- ow+ow+T6 pw+qw+rw+sw+Kv+%u+xs+xs+xs+=u+%u+ &x+#u+[> Y= f& u* }> H; [& [& j% :; X& @* W* !% r* y- _; %4+*x+O, O, p* =x+Y(+-x+;x+>x+(q+,x+fv+=u+xs+xs+=t+%u+% /x+z{.x- 2& 3& |o.V& x- (x+T* _x+:x+ H; [& j% :; :; X& @* W* !% y- _; -- -- %& )% <* g% i% :1+3}+Ig Ig 3}+=& vx+wx+xx+yx+zx+(q+Ax+% =- >% 1& 3& 2& V& V& x- x- T* ^> Jx+Kx+Lx+Mx+Nx+Ox+E> J2.S* s~ p4.Y9.Px+Qx+Rx+Sx+Tx+Ux+Vx+Wx+Xx+Kv+Kv+Kv+Kv+Kv+Kv+Kv+Kv+Kv+Kv+Kv+Kv+Kv+Kv+Kv+Kv+Xx+Yx+Zx+`x+ y+.y++y+@y+#y+Xx+Kv+Kv+Kv+Kv+Kv+Kv+Kv+Kv+Kv+Kv+Kv+Kv+Kv+Kv+Kv+Kv+Kv+Kv+Kv+Kv+Kv+Kv+Kv+Kv+Kv+Kv+Kv+Kv+Kv+Kv+Kv+Kv+Kv+Kv+Kv+Kv+Kv+Kv+Kv+Kv+Kv+Kv+Kv+Kv+Kv+Kv+Kv+Kv+Kv+Kv+Kv+Kv+Kv+Kv+Kv+Kv+Kv+Kv+Kv+Kv+Kv+Kv+Kv+Kv+", +"$y+$y+$y+$y+$y+$y+$y+$y+$y+$y+$y+$y+$y+$y+$y+$y+$y+$y+$y+$y+fx+%y+&y+*y+=y+ x+ x+-y+;y+>y+,y+'y+)y+{x+$y+$y+$y+$y+$y+$y+$y+$y+$y+$y+$y+$y+$y+$y+$y+$y+$y+$y+$y+$y+$y+$y+$y+$y+$y+$y+$y+$y+$y+$y+$y+$y+$y+$y+$y+$y+$y+$y+$y+$y+$y+$y+$y+$y+$y+$y+$y+$y+$y+$y+$y+$y+$y+$y+$y+$y+$y+$y+$y+$y+tv+tv+fv+!y+fv+;o++v+Ut %a+[b+[& [& j% :; X& @* W* W* !% y- _; -- %& )% <* <* g% Y& Y& i% V* 5$ F* Ig ~y+i[+G; {y+(* 2% ]y+2B.^y+/y+Ai+;w+At+tv+hv+xs+xs+hv+c =- >% 1& 1& 3& 3& 2& 2& V& x- x- T* T* 0y+ay+by+cy+dy+ay+QA Q* p4.hc.Px+ey+)t+)t+fy+gy+hy+iy+jy+ky+ex+$y+$y+$y+$y+$y+$y+$y+$y+$y+$y+$y+$y+$y+$y+$y+$y+$y+{x+ly+my+ny+oy+py+qy+ry+ex+$y+$y+$y+$y+$y+$y+$y+$y+$y+$y+$y+$y+$y+$y+$y+$y+$y+$y+$y+$y+$y+$y+$y+$y+$y+$y+$y+$y+$y+$y+$y+$y+$y+$y+$y+$y+$y+$y+$y+$y+$y+$y+$y+$y+$y+$y+$y+$y+$y+$y+$y+$y+$y+$y+$y+$y+$y+$y+$y+$y+$y+$y+$y+$y+", +"Kv+Kv+Kv+Kv+Kv+Kv+Kv+Kv+Kv+Kv+Kv+Kv+Kv+Kv+Kv+Kv+Kv+Kv+Kv+tv+sy+ty+uy+vy+wy+xy+xy+yy+zy+Ay+By+Cy+Dy+Kv+Kv+Kv+Kv+Kv+Kv+Kv+Kv+Kv+Kv+Kv+Kv+Kv+Kv+Kv+Kv+Kv+Kv+Kv+Kv+Kv+Kv+Kv+Kv+Kv+Kv+Kv+Kv+Kv+Kv+Kv+Kv+Kv+Kv+Kv+Kv+Kv+Kv+Kv+Kv+Kv+Kv+Kv+Kv+Kv+Kv+Kv+Kv+Kv+Kv+Kv+Kv+Kv+Kv+Kv+Kv+Kv+Kv+Kv+Kv+Kv+Kv+Kv+tv+tv+tv+fv+!y+tv+wf+Ey+V= v+ua+:; x* @* W* !% y- y- _; -- %& )% <* <* g% Y& i% V* 5$ 5$ F* e& e& :* }& `8 _* f% /* +* Fy+Gy+S^+t{+Hy+Iy+Jy+Ky+Ly+My+Iy+Iy+&Q.Ny+2, Oy+Py+Qy+Ry+Sy+Ty+e` t++Uy+0% &T.Vy+Wy+Wy+/; /; 7% /; 7% 9% 9% 7% 5% 6% =- =- >% >% 1& 3& 3& 2& 2& V& V& x- x- T* Xy+Yy+zw+Zy+`y+ z+.z++z+@z+_p+)t+Br+#z+#z+{x+$z+%z+&z+*z+=z+-z+Kv+Kv+Kv+Kv+Kv+Kv+Kv+Kv+Kv+Kv+Kv+Kv+Kv+Kv+Kv+Kv+Kv+-z+;z+>z+Ov+,z+'z+)z+!z+~z+Kv+Kv+Kv+Kv+Kv+Kv+Kv+Kv+Kv+Kv+Kv+Kv+Kv+Kv+Kv+Kv+Kv+Kv+Kv+Kv+Kv+Kv+Kv+Kv+Kv+Kv+Kv+Kv+Kv+Kv+Kv+Kv+Kv+Kv+Kv+Kv+Kv+Kv+Kv+Kv+Kv+Kv+Kv+Kv+Kv+Kv+Kv+Kv+Kv+Kv+Kv+Kv+Kv+Kv+Kv+Kv+Kv+Kv+Kv+Kv+Kv+Kv+Kv+Kv+", +"Bx+Bx+Bx+Bx+Bx+Bx+Bx+Bx+Bx+Bx+Bx+Bx+Bx+Bx+Bx+Bx+Bx+Bx+Bx+Bx+{z+]z+^z+/z+(z+_z+_z+:z+% >% 1& 1& 3& 2& 2& 2& =; =; Tk.!* cz+dz+ez+fz+gz+hz+iz+jz+xs+xs+Ax+Ax+Bx+Bx+~z+kz+lz+mz+nz+tv+Bx+8x+Bx+Bx+Bx+Bx+Bx+Bx+Bx+Bx+Bx+Bx+Bx+Bx+Bx+Bx+Bx+Bx+Dy+oz+pz+`x+ y+qz+rz+sz+fy+Dy+Bx+Bx+Bx+Bx+Bx+Bx+Bx+Bx+Bx+Bx+Bx+Bx+Bx+Bx+Bx+Bx+Bx+Bx+Bx+Bx+Bx+Bx+Bx+Bx+Bx+Bx+Bx+Bx+Bx+Bx+Bx+Bx+Bx+Bx+Bx+Bx+Bx+Bx+Bx+Bx+Bx+Bx+Bx+Bx+Bx+Bx+Bx+Bx+Bx+Bx+Bx+Bx+Bx+Bx+Bx+Bx+Bx+Bx+Bx+Bx+Bx+Bx+Bx+", +"tv+tv+tv+tv+tv+tv+tv+tv+tv+tv+tv+tv+tv+tv+tv+tv+tv+tv+tv+tz+{z+]z+uz+vz+wz+xz+xz+yz+vz+zz+Az+hv+#z+tv+tv+tv+tv+tv+tv+tv+tv+tv+tv+tv+tv+tv+tv+tv+tv+tv+tv+tv+tv+tv+tv+tv+tv+tv+tv+tv+tv+tv+tv+tv+tv+tv+tv+tv+tv+tv+tv+tv+tv+tv+tv+tv+tv+tv+tv+tv+tv+tv+tv+tv+tv+tv+tv+tv+tv+tv+tv+tv+tv+tv+tv+tv+tv+tv+tv+tv+tv+tz+#z+#z+tv+!y+$y+Bz+Cz+Dz+!% /8+_; Ez+_; $4+%& )% <* g% Y& i% i% V* 5$ F* F* e& :* }& )* )* _* f% (* /* /* ^* +* ]* d& d& c& >; a& e% 0& 9& 8& 7& 7& Fz+Gz+Hz+Iz+Jz+Kz+bz+~* ~* c% b% 4& 4& U* a% 4% 4% 8% 9% 9% 7% 5% 5% 6% 6% =- >% >% 1& 1& 1& 1& 3& V& z{.cz+Q9.Kf.Lz+Mz+Nz+Oz+Pz+Qz+Rz+$y+Sz+Ax+tz+tv+tv+tv+Dy+Tz+Uz+Vz+Wz+Xz+oz+Dy+tv+tv+tv+tv+tv+tv+tv+tv+tv+tv+tv+tv+tv+tv+tv+tv+tz+Dy+Yz+Zz+`z+ A+.A++A+@A+~z+tv+tv+tv+tv+tv+tv+tv+tv+tv+tv+tv+tv+tv+tv+tv+tv+tv+tv+tv+tv+tv+tv+tv+tv+tv+tv+tv+tv+tv+tv+tv+tv+tv+tv+tv+tv+tv+tv+tv+tv+tv+tv+tv+tv+tv+tv+tv+tv+tv+tv+tv+tv+tv+tv+tv+tv+tv+tv+tv+tv+tv+tv+tv+", +"#z+#z+#z+#z+#z+#z+#z+#z+#z+#z+#z+#z+#z+#z+#z+#z+#z+#z+#z+#z+#A+$A+%A+&A+*A+=A+-A+;A+&A+>A+,A+hv+Ax+#z+#z+#z+#z+#z+#z+#z+#z+#z+#z+#z+#z+#z+#z+#z+#z+#z+#z+#z+#z+#z+#z+#z+#z+#z+#z+#z+#z+#z+#z+#z+#z+#z+#z+#z+#z+#z+#z+#z+#z+#z+#z+#z+#z+#z+#z+#z+#z+#z+#z+#z+#z+#z+#z+#z+#z+#z+#z+#z+#z+#z+#z+#z+#z+#z+#z+#z+#z+#z+#z+#z+#z+Ax+Ax+tv+!y+tv+(q+D^+T6 ow+^b )% )% )% <* r~ h% Y& i% V* 5$ F* e& e& :* }& )* _* _* f% (* /* ^* ^* +* ]* d& c& c& a& e% 0& 9& 9& 8& 7& 3% 'A+)A+Hz+Iz+Jz+Kz+N, !A+~* c% b% 4& 4& U* a% 4% 4% 8% 9% 9% 7% 5% 5% 6% 6% =- =- =- =- 3& Rz.d^.z{.Kf.~A+U7+{A+]A+% Lz+kA+lA+mA+tv+xs+=u+tv+Sz+_y+nA+oA+pA+qA+rA+oA+sA+Sz+Sz+Sz+Sz+Sz+Sz+tA+uA+vA+wA+xA+uA+tA+Sz+Sz+Sz+Sz+Sz+Sz+Sz+Sz+Sz+Sz+Sz+Sz+Sz+Sz+Sz+Sz+Sz+tA+yA+zA+AA+BA+CA+DA+EA+FA+tA+Sz+Sz+Sz+Sz+Sz+Sz+Sz+Sz+Sz+Sz+Sz+Sz+Sz+Sz+Sz+Sz+Sz+Sz+Sz+Sz+Sz+Sz+Sz+Sz+Sz+Sz+Sz+Sz+Sz+Sz+Sz+Sz+Sz+Sz+Sz+Sz+Sz+Sz+Sz+Sz+Sz+Sz+Sz+Sz+Sz+Sz+Sz+Sz+Sz+Sz+Sz+Sz+Sz+Sz+Sz+Sz+Sz+Sz+Sz+Sz+Sz+Sz+", +"#z+#z+#z+#z+#z+#z+#z+#z+#z+#z+#z+#z+#z+#z+#z+#z+#z+#z+#z+#z+GA+HA+IA+JA+KA+LA+MA+NA+OA+PA+QA+$y+Sz+#z+#z+#z+#z+#z+#z+#z+#z+#z+#z+#z+#z+#z+#z+#z+#z+#z+#z+#z+#z+#z+#z+#z+#z+#z+#z+#z+#z+#z+#z+#z+#z+#z+#z+#z+#z+#z+#z+#z+#z+#z+#z+#z+#z+#z+#z+#z+#z+#z+#z+#z+#z+#z+#z+#z+#z+#z+#z+#z+#z+#z+#z+#z+#z+#z+#z+#z+#z+#z+#z+#z+#z+#z+#z+#z+#z+#z+Sz+Sz+#z+$y+$y+,x+Gx+RA+SA+fA+TA+z~+h% 5$ Ig UA+~y+~y+}& }& `8 )* _* f% (* /* ^* +* +* ]* d& c& a& a& e% 0& 9& 9& 8& 7& 3% mh.VA+WA+XA+YA+ZA+N, 5& ~* c% b% b% 4& U* U* a% 4% 4% 4-.8% uL.7% =- ]y. &.6% 'y.U7+`A+ B+tv+xs+=u+fv+Sz+_y+,x+Sz+.B+#z+tA++B+@B+#B+$B+%B+tA+.B+#z+#z+#z+#z+#z+1A+uA+&B+iy+*B+=B+:A+tA+#z+#z+#z+#z+#z+#z+#z+#z+#z+#z+#z+#z+#z+#z+#z+#z+#z+tA+-B+;B+>B+,B+'B+)B+3A+1A+#z+#z+#z+#z+#z+#z+#z+#z+#z+#z+#z+#z+#z+#z+#z+#z+#z+#z+#z+#z+#z+#z+#z+#z+#z+#z+#z+#z+#z+#z+#z+#z+#z+#z+#z+#z+#z+#z+#z+#z+#z+#z+#z+#z+#z+#z+#z+#z+#z+#z+#z+#z+#z+#z+#z+#z+#z+#z+#z+#z+#z+#z+", +"Sz+Sz+Sz+Sz+Sz+Sz+Sz+Sz+Sz+Sz+Sz+Sz+Sz+Sz+Sz+Sz+Sz+Sz+Sz+!B+FA+~B+{B+]B+^B+/B+(B+_B+_B+{s+.B+Sz+Sz+Sz+Sz+Sz+Sz+Sz+Sz+Sz+Sz+Sz+Sz+Sz+Sz+Sz+Sz+Sz+Sz+Sz+Sz+Sz+Sz+Sz+Sz+Sz+Sz+Sz+Sz+Sz+Sz+Sz+Sz+Sz+Sz+Sz+Sz+Sz+Sz+Sz+Sz+Sz+Sz+Sz+Sz+Sz+Sz+Sz+Sz+Sz+Sz+Sz+Sz+Sz+Sz+Sz+Sz+Sz+Sz+Sz+Sz+Sz+Sz+Sz+Sz+Sz+Sz+Sz+Sz+Sz+Sz+Sz+Sz+Sz+Sz+Sz+Sz+Sz+Sz+Sz+Sz+Sz+Sz+_y+_y+Sz+.B+tz+$y+$y+tz+Sz+:B+RA+SA+w+VB+WB+hv+hv+tv+Sz+XB+XB+_y+_y+,x+,x+,x+,x+,x+,x+,x+,x+,x+,x+YB+ZB+pA+`B+ C+ZB+lB+,x+,x+,x+,x+,x+.C+_y++C+@C+#C+$C+%C+lB+,x+,x+,x+,x+,x+,x+,x+,x+,x+,x+,x+,x+,x+,x+,x+,x+,x+.C+&C+*C+AA+=C+-C+DA+;C+>C+.C+,x+,x+,x+,x+,x+,x+,x+,x+,x+,x+,x+,x+,x+,x+,x+,x+,x+,x+,x+,x+,x+,x+,x+,x+,x+,x+,x+,x+,x+,x+,x+,x+,x+,x+,x+,x+,x+,x+,x+,x+,x+,x+,x+,x+,x+,x+,x+,x+,x+,x+,x+,x+,x+,x+,x+,x+,x+,x+,x+,x+,x+", +"!B+!B+!B+!B+!B+!B+!B+!B+!B+!B+!B+!B+!B+!B+!B+!B+!B+!B+nA+uA+,C+'C+)C+!C+~C+{C+]C+tB+_y+_y+!B+!B+!B+!B+!B+!B+!B+!B+!B+!B+!B+!B+!B+!B+!B+!B+!B+!B+!B+!B+!B+!B+!B+!B+!B+!B+!B+!B+!B+!B+!B+!B+!B+!B+!B+!B+!B+!B+!B+!B+!B+!B+!B+!B+!B+!B+!B+!B+!B+!B+!B+!B+!B+!B+!B+!B+!B+!B+!B+!B+!B+!B+!B+!B+!B+!B+!B+!B+!B+!B+!B+!B+!B+!B+!B+!B+!B+!B+!B+!B+!B+!B+!B+!B+!B+!B+!B+!B+!B+!B+!B+_y+_y+_y+_y+_y+_y+_y+Sz+.B+^C+$y+$y+tz+XB+]A+/C+(C+_C+:C+; [C+>; /H.&Q.}C+|C+1C+2C+Zg+3C+4C+:o+5C+6C+7C+8j+8C+9C+0C+aC+XB+!B+_y+.B+!y+bC+hv+$y+Sz+XB+XB+_y+_y+!B+!B+!B+!B+!B+!B+!B+!B+!B+!B+!B+!B+!B+!B+nA+cC+dC+#B+eC+fC+.C+!B+!B+!B+!B+!B+!B+YB+gC+hC+iC+jC+fC+.C+!B+!B+!B+!B+!B+!B+!B+!B+!B+!B+!B+!B+!B+!B+!B+!B+!B+!B+.C+kC+lC+>B+mC+nC+oC+pC+YB+!B+!B+!B+!B+!B+!B+!B+!B+!B+!B+!B+!B+!B+!B+!B+!B+!B+!B+!B+!B+!B+!B+!B+!B+!B+!B+!B+!B+!B+!B+!B+!B+!B+!B+!B+!B+!B+!B+!B+!B+!B+!B+!B+!B+!B+!B+!B+!B+!B+!B+!B+!B+!B+!B+!B+!B+!B+!B+!B+!B+!B+", +"qC+qC+qC+qC+qC+qC+qC+qC+qC+qC+qC+qC+qC+qC+qC+qC+qC+qC+qC+rC+sC+tC+uC+vC+wC+xC+fB+yC+qC+qC+qC+qC+qC+qC+qC+qC+qC+qC+qC+qC+qC+qC+qC+qC+qC+qC+qC+qC+qC+qC+qC+qC+qC+qC+qC+qC+qC+qC+qC+qC+qC+qC+qC+qC+qC+qC+qC+qC+qC+qC+qC+qC+qC+qC+qC+qC+qC+qC+qC+qC+qC+qC+qC+qC+qC+qC+qC+qC+qC+qC+qC+qC+qC+qC+qC+qC+qC+qC+qC+qC+qC+qC+qC+qC+qC+qC+qC+qC+qC+qC+qC+qC+qC+qC+qC+qC+qC+qC+qC+qC+qC+qC+qC+qC+qC+qC+qC+qC+qC+XB+XB+XB+XB+XB+_y+!B+zC+^C+^C+tz+_y+AC+BC+uv+0C+AC+CC+AC+Sz+DC+EC+FC+GC+HC+IC+JC+un+KC+LC+MC+$y+^C+.B+.B+.B+_y+qC+_y+qC+XB+XB+NC+XB+qC+qC+qC+qC+qC+qC+qC+qC+qC+qC+qC+qC+qC+qC+qC+qC+qC+qC+qC+qC+OC+YB+^A+PC+QC+RC+qC+qC+qC+qC+qC+qC+SC+TC+UC+VC+WC+XC+YC+qC+qC+qC+qC+qC+qC+qC+qC+qC+qC+qC+qC+qC+qC+qC+qC+qC+qC+SC+ZC+`C+oB+ D+.D++D+@D+SC+qC+qC+qC+qC+qC+qC+qC+qC+qC+qC+qC+qC+qC+qC+qC+qC+qC+qC+qC+qC+qC+qC+qC+qC+qC+qC+qC+qC+qC+qC+qC+qC+qC+qC+qC+qC+qC+qC+qC+qC+qC+qC+qC+qC+qC+qC+qC+qC+qC+qC+qC+qC+qC+qC+qC+qC+qC+qC+qC+qC+qC+", +"(y+(y+(y+(y+(y+(y+(y+(y+(y+(y+(y+(y+(y+(y+(y+(y+(y+#D+$D+%D+&D+*D+=D+-D+;D+$D+#D+(y+(y+(y+(y+(y+(y+(y+(y+(y+(y+(y+(y+(y+(y+(y+(y+(y+(y+(y+(y+(y+(y+(y+(y+(y+(y+(y+(y+(y+(y+(y+(y+(y+(y+(y+(y+(y+(y+(y+(y+(y+(y+(y+(y+(y+(y+(y+(y+(y+(y+(y+(y+(y+(y+(y+(y+(y+(y+(y+(y+(y+(y+(y+(y+(y+(y+(y+(y+(y+(y+(y+(y+(y+(y+(y+(y+(y+(y+(y+(y+(y+(y+(y+(y+(y+(y+(y+(y+(y+(y+(y+(y+(y+(y+(y+(y+(y+(y+(y+(y+(y+(y+(y+(y+(y+(y+(y+XB+XB+XB+XB+WB+XB+(y+_y+.B+#z+Sz+_y+!B+_y+XB+>D+,D+'D+<'+)D+!D+~D+ei+{D+]D+^D+/D+XB+XB+XB+XB+XB+XB+XB+XB+(y+(y+(y+(y+(y+(y+(y+(y+(y+(y+(y+(y+(y+(y+(y+(y+(y+(y+(y+(y+(y+(y+(y+(y+SC+(D+_D+`B+ C+(D+SC+(y+(y+(y+(y+(y+yC+:D+D+&C+9D+0D+aD+bD+cD+dD+eD+qC+yC+qC+qC+qC+qC+qC+qC+qC+qC+qC+qC+qC+qC+qC+qC+qC+qC+qC+qC+qC+qC+qC+qC+qC+qC+qC+qC+qC+qC+qC+qC+qC+qC+qC+qC+qC+qC+qC+qC+qC+qC+qC+qC+qC+qC+qC+qC+qC+qC+qC+qC+qC+qC+qC+qC+qC+qC+qC+qC+qC+qC+qC+qC+qC+qC+qC+qC+qC+qC+qC+qC+qC+qC+qC+qC+qC+qC+qC+qC+qC+qC+qC+qC+qC+qC+qC+qC+qC+qC+qC+qC+qC+qC+qC+qC+qC+qC+qC+qC+qC+qC+qC+qC+qC+qC+qC+qC+qC+qC+qC+qC+qC+qC+qC+XB+XB+NC+NC+NC+XB+XB+XB+qC+>D+8D+fD+gD+hD+iD+jD+kD+lD+mD+nD+qC+qC+qC+qC+qC+qC+qC+qC+qC+qC+qC+qC+qC+qC+qC+qC+qC+qC+qC+qC+qC+qC+qC+qC+qC+qC+qC+qC+qC+qC+qC+qC+qC+>D+oD+pD+qD+rD+YC+>D+qC+qC+qC+qC+qC+qC+>D+RC+sD+#C+tD+uD+vD+qC+qC+qC+qC+qC+qC+qC+qC+qC+qC+qC+qC+qC+qC+qC+qC+qC+qC+>D+wD+xD+yD+zD+nC+AD+ZC+vD+qC+qC+qC+qC+qC+qC+qC+qC+qC+qC+qC+qC+qC+qC+qC+qC+qC+qC+qC+qC+qC+qC+qC+qC+qC+qC+qC+qC+qC+qC+qC+qC+qC+qC+qC+qC+qC+qC+qC+qC+qC+qC+qC+qC+qC+qC+qC+qC+qC+qC+qC+qC+qC+qC+qC+qC+qC+qC+qC+qC+", +"XB+XB+XB+XB+XB+XB+XB+XB+XB+XB+XB+XB+XB+XB+NC+XB+^D+BD+CD+DD+bD+ED+FD+GD+HD+^D+XB+XB+XB+XB+XB+XB+XB+XB+XB+XB+XB+XB+XB+XB+XB+XB+XB+XB+XB+XB+XB+XB+XB+XB+XB+XB+XB+XB+XB+XB+XB+XB+XB+XB+XB+XB+XB+XB+XB+XB+XB+XB+XB+XB+XB+XB+XB+XB+XB+XB+XB+XB+XB+XB+XB+XB+XB+XB+XB+XB+XB+XB+XB+XB+XB+XB+XB+XB+XB+XB+XB+XB+XB+XB+XB+XB+XB+XB+XB+XB+XB+XB+XB+XB+XB+XB+XB+XB+XB+XB+XB+XB+XB+XB+XB+XB+XB+XB+XB+XB+XB+XB+XB+XB+XB+XB+XB+XB+XB+XB+XB+XB+XB+XB+XB+XB+XB+XB+XB+XB+XB+XB+XB+XB+nD+]D+ID+JD+KD+LD+MD+ND+>D+NC+XB+XB+XB+XB+XB+XB+XB+XB+XB+XB+XB+XB+XB+XB+XB+XB+XB+XB+XB+XB+XB+XB+XB+XB+XB+XB+XB+XB+XB+XB+XB+XB+XB+NC+OD+SC+PD+QD+RD+SD+NC+XB+XB+XB+XB+XB+TD+UD+VD+WD+XD+yC+XB+NC+XB+XB+XB+XB+XB+XB+XB+XB+XB+XB+XB+XB+XB+XB+XB+XB+XB+TD+YD+ZD+Ov+`D+ E+.E++E+@E+NC+XB+XB+XB+XB+XB+XB+XB+XB+XB+XB+XB+XB+XB+XB+XB+XB+XB+XB+XB+XB+XB+XB+XB+XB+XB+XB+XB+XB+XB+XB+XB+XB+XB+XB+XB+XB+XB+XB+XB+XB+XB+XB+XB+XB+XB+XB+XB+XB+XB+XB+XB+XB+XB+XB+XB+XB+XB+XB+XB+", +"#E+#E+#E+#E+#E+#E+#E+#E+#E+#E+#E+#E+#E+#E+#E+$E+TC+%E+&E+*E+!C+=E+-E+uD+^D+#E+#E+#E+#E+#E+#E+#E+#E+#E+#E+#E+#E+#E+#E+#E+#E+#E+#E+#E+#E+#E+#E+#E+#E+#E+#E+#E+#E+#E+#E+#E+#E+#E+#E+#E+#E+#E+#E+#E+#E+#E+#E+#E+#E+#E+#E+#E+#E+#E+#E+#E+#E+#E+#E+#E+#E+#E+#E+#E+#E+#E+#E+#E+#E+#E+#E+#E+#E+#E+#E+#E+#E+#E+#E+#E+#E+#E+#E+#E+#E+#E+#E+#E+#E+#E+#E+#E+#E+#E+#E+#E+#E+#E+#E+#E+#E+#E+#E+#E+#E+#E+#E+#E+#E+#E+#E+#E+#E+#E+#E+#E+#E+#E+#E+#E+#E+#E+#E+#E+#E+#E+#E+#E+#E+#E+#E+nD+;E+>E+,E+'E+)E+!E+~E+#E+#E+#E+#E+#E+#E+#E+#E+#E+#E+#E+#E+#E+#E+#E+#E+#E+#E+#E+#E+#E+#E+#E+#E+#E+#E+#E+#E+#E+#E+#E+#E+#E+#E+#E+^D+{E+_D+]E+^E+/E+^D+#E+#E+#E+#E+#E+@E+(E+_E+:E+F+,F+'F+)F+!F+>F+;F++F++F++F++F++F++F++F++F++F++F++F++F++F++F++F++F++F++F++F++F++F++F++F++F++F++F++F++F++F++F++F++F++F++F++F++F+yE+~F+{F+]F+^F+~F+yE++F++F++F++F++F+yE+/F+(F+_F+:F+F+eF+)F+fF+gF+>F+;F+7E+7E+7E+7E+7E+7E+7E+7E+7E+7E+7E+7E+7E+7E+7E+7E+7E+7E+7E+7E+7E+7E+7E+7E+7E+7E+7E+7E+7E+7E+7E+7E+7E+7E+7E+7E+@F+hF+iF+jF+kF+lF+@F+mF+7E+7E+7E+7E+@F+nF+oF+pF+qF+rF+sF+@F+7E+7E+7E+7E+7E+7E+7E+7E+7E+7E+7E+7E+7E+7E+7E+7E+7E+@F+@F+tF+uF+vF+WD wF+xF+WE+yE+7E+7E+7E+7E+7E+7E+7E+7E+7E+7E+7E+7E+7E+7E+7E+7E+7E+7E+7E+7E+7E+7E+7E+7E+7E+7E+7E+7E+7E+7E+7E+7E+7E+7E+7E+7E+7E+7E+7E+7E+7E+7E+7E+7E+7E+7E+7E+7E+7E+7E+7E+7E+7E+7E+7E+7E+7E+7E+", +"yF+yF+yF+yF+yF+yF+yF+yF+yF+yF+yF+yF+zF+AF+BF+CF+DF+EF+FF+GF+HF+zF+yF+yF+yF+yF+yF+yF+yF+yF+yF+yF+yF+yF+yF+yF+yF+yF+yF+yF+yF+yF+yF+yF+yF+yF+yF+yF+yF+yF+yF+yF+yF+yF+yF+yF+yF+yF+yF+yF+yF+yF+yF+yF+yF+yF+yF+yF+yF+yF+yF+yF+yF+yF+yF+yF+yF+yF+yF+yF+yF+yF+yF+yF+yF+yF+yF+yF+yF+yF+yF+yF+yF+yF+yF+yF+yF+yF+yF+yF+yF+yF+yF+yF+yF+yF+yF+yF+yF+yF+yF+yF+yF+yF+yF+yF+yF+yF+yF+yF+yF+yF+yF+yF+yF+yF+yF+yF+yF+yF+yF+yF+yF+yF+yF+yF+yF+yF+yF+yF+yF+yF+yF+yF+yF+yF+yF+yF+yF+yF+yF+IF+fp+JF+KF+LF+MF+fp+IF+yF+yF+yF+yF+yF+yF+yF+yF+yF+yF+yF+yF+yF+yF+yF+yF+yF+yF+yF+yF+yF+yF+yF+yF+yF+yF+yF+yF+yF+yF+yF+yF+yF+yF+yF+yF+yF+NF+yE+NE+OF+PF+QF+yF+yF+yF+yF+yF+yF+-F+RF+SF+TF+UF+VF+zF+yF+yF+yF+yF+yF+yF+yF+yF+yF+yF+yF+yF+yF+yF+yF+yF+yF+yF+WF+XF+YF+oB+ZF+`F+ G+}F+.G+yF+yF+yF+yF+yF+yF+yF+yF+yF+yF+yF+yF+yF+yF+yF+yF+yF+yF+yF+yF+yF+yF+yF+yF+yF+yF+yF+yF+yF+yF+yF+yF+yF+yF+yF+yF+yF+yF+yF+yF+yF+yF+yF+yF+yF+yF+yF+yF+yF+yF+yF+yF+yF+yF+yF+yF+yF+yF+", +"+G++G++G++G++G++G++G++G++G++G++G+@G+-F+#G+$G+%G+&G+*G+=G+-G+nF+@G++G++G++G++G++G++G++G++G++G++G++G++G++G++G++G++G++G++G++G++G++G++G++G++G++G++G++G++G++G++G++G++G++G++G++G++G++G++G++G++G++G++G++G++G++G++G++G++G++G++G++G++G++G++G++G++G++G++G++G++G++G++G++G++G++G++G++G++G++G++G++G++G++G++G++G++G++G++G++G++G++G++G++G++G++G++G++G++G++G++G++G++G++G++G++G++G++G++G++G++G++G++G++G++G++G++G++G++G++G++G++G++G++G++G++G++G++G++G++G++G++G++G++G++G++G++G++G++G++G+;G+>G+,G+JE+'G+)G+!G+IF++G++G++G++G++G++G++G++G++G++G++G++G++G++G++G++G++G++G++G++G++G++G++G++G++G++G++G++G++G++G++G++G++G++G++G++G++G+zF+~G+{G+]G+^G+~G+zF++G++G++G++G++G+@G+/G+(G+UE+_G+:G+@G+@G++G++G++G++G++G++G++G++G++G++G++G++G++G++G++G++G++G+@G+

Xv zpIdY^VxD8yI=OZ_;)KO>yn0w4qtfS2uqqgP?^ne!l2x*1$a5olISpwksTE6nKgFL zmS)j#yp&YgBwH}$HM2yJs7Nuq5P41v>MgxJI9AmXyfpq;i z5Cq#7q;J&Uu;iWOFep^5&?>YrtVk}DHW!=waT~&r(a89F1NBdzV)OBBJF3u0QM)}& z>Yf70zlS*9539QgsiZmDe0|oX+k14laNMtLe*!S~E)$m9_`W5?MKqHf2D{12mg~AW zcTt(8I9u1Fy}wlUN#)YPQ|hNSN|ch&1k{lhaIx6^R&E_8mBEF(?aV1-uFRS!m-UNg zsnRXGkJ3cuNpw;Cy;u}XCcSavlAasE%ql+g`7NW=*IL$uh&!1M6V+WzatPMWezbyKKQ-6P++w7%xS4i~|`3SMw7a|TYH z%_|O=P`kO33-K8ndttR`2MW~n!xcvtS<=jF>a6o5JliV31{5-FEzd09T(7?ho+69a zBR3*7l7(OzM0lEg;u+-!UmfgeO=?bFYrj@;9E56QmZz&Z7Cor4eixza)$L7a`fa6; zKqxAcZc2r8@YhdPDj_q)IbRjAIGL%%cHfj0b^eUmdT0G`nota+z9DZ$JdV;!wgKd5 zEnX^%_phaEgB4{b-M1E%64>pasQ;xOTiUY)ON6y)frl{4^=L_sw51Pe^?o ziLzzi3r?-$6|8Zl zR2Y1He0@9MLY3AJxY}lqg|C!vObE&iVt~G(L zqFBkHjyFtE`mSX|4a`>7$5{h_`J>Z;#|n3jb-JzX*9^FLER`%cU=T~6AjESgxb__^ z(5)u6+R$&cujJxSxJq*@&d=&M`TE~-h>5im2>)2jG0rmvH&#he$Fsy&{CpzyJInoi zms*3`W|=-~S-NxAbw1rFeUiaAukNdA##3;pX*X@|%WZm)&JT(4ZP(GU20C7-*lMjE z98t=~wV{PDkP(ifm|!BK%fP05i{YwlrAsG-2)tP(5^2@&Jo9jo`6aJkvVf;xQ-By$ zr_0T4!m06A9e!oIS*bZC26XM&Z0+sbeGKaVq!Y&cleTYgpJ}DN58df_%>=cs(fN2S zHu!mRe0-cLU|DeA7)@+lM^ml>vg3vKpd6wt5 zWRkgyHw_MORnAwkzb;a=#kw%}^+mcnQ`nB|qO|l=3&e}t zMu0be8d=Ilv(MogRrKTO_}9l4WpDQk49rdse^aupc#@F6ohOZRZT=|V)@QvW9l2*{Mt;8SobE^eHTdcGL&*(0;&;Ju5WNxtyxdYy*q`7Z5fEc=vu zdUK!W<+)kKSLVz(m;7r~asCLW&tW(2Fy`)+I{xy&t1|Y63K_vn1RK?0a>mL))od@{ z>*zNV4Hx^gEr&T*94cSVo5e{qb7=k|lwDlQMe+aJ)UbtrRwwsIpPeO?yX=Z&!i?LQ z3Y?w%9uqmjUKx1EF1tNFdsl7c31>O6?*{*^cT`7c|6P3K>Z3ZbFv$l`E+*xj`x@Nx z<-wCFkJ+7e%m4n}z4o(m@|>erxnJ#Ev$Eo@bFluKr;iyg^2gWM>*=k{U3)1y&D_Rp z)yzc`3%u4v-$|Z2p<=d@;F_QF4$3~OwyNynool1%o9QJEvP{DEifoeM;;gksr>;HT z+qc8+1OMrr|31o|_nRjnu-$R1YTm+g-;1p0&a8Htwe8043#X#KcTD}BpQ*Y1eYMZb zIYleCJr79+E`q4mIL2B2RJ5ylijdIFV3nrQ6?aY+wV!g$?|Uz}S5i=L5qzyFKAiMFrUE4wal#tVUqwflCLZ4WPw&2l?`+u3?f zW;k$vbP0l+XkKTkd%T literal 0 HcmV?d00001 diff --git a/doc/tetrahedron_refinements/4-edges/edge_01-12-20-23_refined/01-12-20-23.png b/doc/tetrahedron_refinements/4-edges/edge_01-12-20-23_refined/01-12-20-23.png new file mode 100644 index 0000000000000000000000000000000000000000..66192be2c1ad8f79264187e4e443077e50a8cb2e GIT binary patch literal 11374 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 + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/doc/tetrahedron_refinements/4-edges/edge_01-12-20-23_refined/01-12-20-23.txt b/doc/tetrahedron_refinements/4-edges/edge_01-12-20-23_refined/01-12-20-23.txt new file mode 100644 index 0000000..90a7c8a --- /dev/null +++ b/doc/tetrahedron_refinements/4-edges/edge_01-12-20-23_refined/01-12-20-23.txt @@ -0,0 +1,25 @@ +TET no. 0: +0.0, 0.0, 0.0 +0.5, 0.5, 0.0 +1.0, 0.0, 0.0 +0.5, 0.0, 0.5 +TET no. 1: +0.0, 0.0, 0.0 +0.0, 1.0, 0.0 +0.5, 0.5, 0.0 +0.0, 0.5, 0.5 +TET no. 2: +0.0, 0.0, 0.0 +0.0, 0.5, 0.5 +0.5, 0.5, 0.0 +0.5, 0.0, 0.5 +TET no. 3: +0.0, 0.0, 0.0 +0.0, 0.0, 0.5 +0.0, 0.5, 0.5 +0.5, 0.0, 0.5 +TET no. 4: +0.0, 0.0, 0.5 +0.0, 0.5, 0.5 +0.5, 0.0, 0.5 +0.0, 0.0, 1.0 diff --git a/doc/tetrahedron_refinements/4-edges/edge_01-12-20-23_refined/01-12-20-23.vtk b/doc/tetrahedron_refinements/4-edges/edge_01-12-20-23_refined/01-12-20-23.vtk new file mode 100644 index 0000000..ac0b1d9 --- /dev/null +++ b/doc/tetrahedron_refinements/4-edges/edge_01-12-20-23_refined/01-12-20-23.vtk @@ -0,0 +1,37 @@ +# vtk DataFile Version 2.0 +VTK LEGACY FILE FORMAT ASCII - tetrahedral sample file for H5FED test +ASCII +DATASET UNSTRUCTURED_GRID + +POINTS 8 DOUBLE +0.0 0.0 0.0 +0.5 0.5 0.0 +1.0 0.0 0.0 +0.5 0.0 0.5 +0.0 1.0 0.0 +0.0 0.5 0.5 +0.0 0.0 0.5 +0.0 0.0 1.0 + +CELLS 5 25 +4 0 1 2 3 +4 0 4 1 5 +4 0 5 1 3 +4 0 6 5 3 +4 6 5 3 7 + +CELL_TYPES 5 +10 +10 +10 +10 +10 + +CELL_DATA 5 +SCALARS cell_attribute_data float 1 +LOOKUP_TABLE default +0 +1 +2 +3 +4 diff --git a/doc/tetrahedron_refinements/4-edges/edge_01-12-20-23_refined/01-12-20-23_small.png b/doc/tetrahedron_refinements/4-edges/edge_01-12-20-23_refined/01-12-20-23_small.png new file mode 100644 index 0000000000000000000000000000000000000000..095cadb7de51215db54aa99c1e491460548dc68d GIT binary patch literal 11466 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 literal 0 HcmV?d00001 diff --git a/doc/tetrahedron_refinements/4-edges/edge_01-12-20-30_refined/01-12-20-30.pvsm b/doc/tetrahedron_refinements/4-edges/edge_01-12-20-30_refined/01-12-20-30.pvsm new file mode 100644 index 0000000..d57155f --- /dev/null +++ b/doc/tetrahedron_refinements/4-edges/edge_01-12-20-30_refined/01-12-20-30.pvsm @@ -0,0 +1,2021 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/doc/tetrahedron_refinements/4-edges/edge_01-12-20-30_refined/01-12-20-30.txt b/doc/tetrahedron_refinements/4-edges/edge_01-12-20-30_refined/01-12-20-30.txt new file mode 100644 index 0000000..73fe4d8 --- /dev/null +++ b/doc/tetrahedron_refinements/4-edges/edge_01-12-20-30_refined/01-12-20-30.txt @@ -0,0 +1,25 @@ +TET no. 0: +0.0, 0.0, 0.0 +0.0, 0.5, 0.5 +0.0, 1.0, 0.0 +0.5, 0.5, 0.0 +TET no. 1: +0.0, 0.0, 0.0 +0.0, 0.0, 1.0 +0.0, 0.5, 0.5 +0.5, 0.0, 0.5 +TET no. 2: +0.0, 0.0, 0.0 +0.5, 0.0, 0.5 +0.0, 0.5, 0.5 +0.5, 0.5, 0.0 +TET no. 3: +0.0, 0.0, 0.0 +0.5, 0.0, 0.0 +0.5, 0.0, 0.5 +0.5, 0.5, 0.0 +TET no. 4: +0.5, 0.0, 0.0 +0.5, 0.0, 0.5 +0.5, 0.5, 0.0 +1.0, 0.0, 0.0 diff --git a/doc/tetrahedron_refinements/4-edges/edge_01-12-20-30_refined/01-12-20-30.vtk b/doc/tetrahedron_refinements/4-edges/edge_01-12-20-30_refined/01-12-20-30.vtk new file mode 100644 index 0000000..dd352ee --- /dev/null +++ b/doc/tetrahedron_refinements/4-edges/edge_01-12-20-30_refined/01-12-20-30.vtk @@ -0,0 +1,37 @@ +# vtk DataFile Version 2.0 +VTK LEGACY FILE FORMAT ASCII - tetrahedral sample file for H5FED test +ASCII +DATASET UNSTRUCTURED_GRID + +POINTS 8 DOUBLE +0.0 0.0 0.0 +0.0 0.5 0.5 +0.0 1.0 0.0 +0.5 0.5 0.0 +0.0 0.0 1.0 +0.5 0.0 0.5 +0.5 0.0 0.0 +1.0 0.0 0.0 + +CELLS 5 25 +4 0 1 2 3 +4 0 4 1 5 +4 0 5 1 3 +4 0 6 5 3 +4 6 5 3 7 + +CELL_TYPES 5 +10 +10 +10 +10 +10 + +CELL_DATA 5 +SCALARS cell_attribute_data float 1 +LOOKUP_TABLE default +0 +1 +2 +3 +4 diff --git a/doc/tetrahedron_refinements/4-edges/edge_01-12-20-30_refined/01-12-20-30_small.png b/doc/tetrahedron_refinements/4-edges/edge_01-12-20-30_refined/01-12-20-30_small.png new file mode 100644 index 0000000000000000000000000000000000000000..7013cb49506933ca6f4e5328d4b4bda937813663 GIT binary patch literal 11643 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