diff --git a/.github/workflows/setup.yml b/.github/workflows/setup.yml new file mode 100644 index 0000000..c48ef93 --- /dev/null +++ b/.github/workflows/setup.yml @@ -0,0 +1,63 @@ +name: jigsaw-python tester + +on: + workflow_dispatch: + pull_request: + push: + +jobs: + build: + runs-on: ${{ matrix.os }} + strategy: + fail-fast: false + matrix: + os: [ubuntu-latest, macos-latest, windows-latest] + python-version: ["3.10"] + + steps: + - uses: actions/checkout@v3 + + - name: Print environment + run: | + echo github.event.action: ${{ github.event.action }} + echo github.event_name: ${{ github.event_name }} + + - name: Set up Python ${{ matrix.python-version }} + uses: actions/setup-python@v4 + with: + python-version: ${{ matrix.python-version }} + + - name: Install dependencies on win + if: startsWith(matrix.os, 'windows') + run: | + choco install ninja cmake + ninja --version + cmake --version + + - name: Install dependencies on unx + if: startsWith(matrix.os, 'ubuntu') + run: | + sudo apt-get update + sudo apt-get install ninja-build cmake + ninja --version + cmake --version + g++ --version + + - name: Install dependencies on osx + if: startsWith(matrix.os, 'macos') + run: | + brew install ninja cmake llvm libomp + ninja --version + cmake --version + clang++ --version + + - name: Install dependencies + run: | + python -m pip install --upgrade pip + pip install -r requirements.txt + + - name: Build jigsaw-python + run: python setup.py build_external install + + - name: Eval. jigsaw-python + run: python example.py --IDnumber=-1 diff --git a/.travis.yml b/.travis.yml deleted file mode 100644 index ca8ba42..0000000 --- a/.travis.yml +++ /dev/null @@ -1,30 +0,0 @@ -language: python -python: - - 3.7 - - 3.8 - - 3.9 - -os: linux -addons: - apt: - sources: - - ubuntu-toolchain-r-test - packages: - - gcc-8 - - g++-8 - -script: - - export CC=gcc-8 - - export CXX=g++-8 - - python3 -m pip install --force-reinstall numpy scipy - - python3 setup.py build_external - - python3 setup.py install - - python3 example.py --IDnumber=0 - - python3 example.py --IDnumber=1 - - python3 example.py --IDnumber=2 - - python3 example.py --IDnumber=3 - - python3 example.py --IDnumber=4 - - python3 example.py --IDnumber=5 - - python3 example.py --IDnumber=6 - - python3 example.py --IDnumber=7 - - python3 example.py --IDnumber=8 diff --git a/LICENSE.md b/LICENSE.md index 37a1b22..84a0e6b 100644 --- a/LICENSE.md +++ b/LICENSE.md @@ -2,4 +2,11 @@ This program may be freely redistributed under the condition that the copyright notices (including this entire header) are not removed, and no compensation is received through use of the software. Private, research, and institutional use is free. You may distribute modified versions of this code `UNDER THE CONDITION THAT THIS CODE AND ANY MODIFICATIONS MADE TO IT IN THE SAME FILE REMAIN UNDER COPYRIGHT OF THE ORIGINAL AUTHOR, BOTH SOURCE AND OBJECT CODE ARE MADE FREELY AVAILABLE WITHOUT CHARGE, AND CLEAR NOTICE IS GIVEN OF THE MODIFICATIONS`. Distribution of this code as part of a commercial system is permissible `ONLY BY DIRECT ARRANGEMENT WITH THE AUTHOR`. (If you are not directly supplying this code to a customer, and you are instead telling them how they can obtain it for free, then you are not required to make any arrangement with me.) -`DISCLAIMER`: Neither I nor: Columbia University, the Massachusetts Institute of Technology, the University of Sydney, nor the National Aeronautics and Space Administration warrant this code in any way whatsoever. This code is provided "as-is" to be used at your own risk. +`DISCLAIMER`: Neither I nor `THE CONTRIBUTORS` warrant this code in any way whatsoever. This code is provided "as-is" to be used at your own risk. + +`THE CONTRIBUTORS` include: +(a) The University of Sydney +(b) The Massachusetts Institute of Technology +(c) Columbia University +(d) The National Aeronautics & Space Administration +(e) Los Alamos National Laboratory diff --git a/README.md b/README.md index e91e98d..bc667e6 100644 --- a/README.md +++ b/README.md @@ -64,7 +64,14 @@ Run `python3 example.py --IDnumber=N` to call the `N-th` example. `*.vtk` output This program may be freely redistributed under the condition that the copyright notices (including this entire header) are not removed, and no compensation is received through use of the software. Private, research, and institutional use is free. You may distribute modified versions of this code `UNDER THE CONDITION THAT THIS CODE AND ANY MODIFICATIONS MADE TO IT IN THE SAME FILE REMAIN UNDER COPYRIGHT OF THE ORIGINAL AUTHOR, BOTH SOURCE AND OBJECT CODE ARE MADE FREELY AVAILABLE WITHOUT CHARGE, AND CLEAR NOTICE IS GIVEN OF THE MODIFICATIONS`. Distribution of this code as part of a commercial system is permissible `ONLY BY DIRECT ARRANGEMENT WITH THE AUTHOR`. (If you are not directly supplying this code to a customer, and you are instead telling them how they can obtain it for free, then you are not required to make any arrangement with me.) -`DISCLAIMER`: Neither I nor: Columbia University, the Massachusetts Institute of Technology, the University of Sydney, nor the National Aeronautics and Space Administration warrant this code in any way whatsoever. This code is provided "as-is" to be used at your own risk. +`DISCLAIMER`: Neither I nor `THE CONTRIBUTORS` warrant this code in any way whatsoever. This code is provided "as-is" to be used at your own risk. + +`THE CONTRIBUTORS` include: +(a) The University of Sydney +(b) The Massachusetts Institute of Technology +(c) Columbia University +(d) The National Aeronautics & Space Administration +(e) Los Alamos National Laboratory ### `References` diff --git a/example.py b/example.py index e3d9bec..8ec6246 100755 --- a/example.py +++ b/example.py @@ -53,6 +53,9 @@ def example(IDnumber=0): elif (IDnumber == +8): case_8_(src_path, dst_path) + elif (IDnumber == -1): + for i in range(9): example(i) + return @@ -61,7 +64,7 @@ def example(IDnumber=0): description=__doc__, formatter_class=argparse.RawTextHelpFormatter) parser.add_argument("--IDnumber", dest="IDnumber", type=int, - required=True, help="Run example with ID = (0-9).") + required=True, help="Run example with ID = (0-8).") args = parser.parse_args() diff --git a/external/jigsaw/.github/workflows/cmake.yml b/external/jigsaw/.github/workflows/cmake.yml new file mode 100644 index 0000000..92293f1 --- /dev/null +++ b/external/jigsaw/.github/workflows/cmake.yml @@ -0,0 +1,114 @@ +name: CMake Build Matrix + +on: + workflow_dispatch: + pull_request: + push: + +env: + BUILD_TYPE: Debug + +jobs: + build: + name: ${{ matrix.config.name }} + runs-on: ${{ matrix.config.os }} + strategy: + fail-fast: false + matrix: + config: + - { + name: "Windows Latest MSVC", artifact: "Windows-MSVC.tar.xz", + os: windows-latest, + cc: "cl", cxx: "cl" + } + - { + name: "Ubuntu Latest GCC", artifact: "Linux.tar.xz", + os: ubuntu-latest, + cc: "gcc", cxx: "g++" + } + - { + name: "macOS Latest Clang", artifact: "macOS.tar.xz", + os: macos-latest, + cc: "clang", cxx: "clang++" + } + + steps: + - uses: actions/checkout@v3 + + - name: Print environment + run: | + echo github.event.action: ${{ github.event.action }} + echo github.event_name: ${{ github.event_name }} + + - name: Install dependencies on win + if: startsWith(matrix.config.os, 'windows') + run: | + choco install ninja cmake + ninja --version + cmake --version + + - name: Install dependencies on unx + if: startsWith(matrix.config.name, 'ubuntu') + run: | + sudo apt-get update + sudo apt-get install ninja-build cmake + ninja --version + cmake --version + g++ --version + + - name: Install dependencies on osx + if: startsWith(matrix.config.os, 'macos') + run: | + brew install ninja cmake llvm libomp + ninja --version + cmake --version + clang++ --version + + - name: Configure jigsaw + run: | + mkdir ${{github.workspace}}/build + cd ${{github.workspace}}/build + cmake .. -DCMAKE_BUILD_TYPE=${{env.BUILD_TYPE}} + + - name: Build jigsaw + run: | + cd ${{github.workspace}}/build + cmake --build . --config ${{env.BUILD_TYPE}} --target install + + - name: Clean jigsaw + run: rm -r ${{github.workspace}}/build + + - name: Configure tests for jigsaw + run: | + mkdir ${{github.workspace}}/uni/build + cd ${{github.workspace}}/uni/build + cmake .. -DCMAKE_BUILD_TYPE=${{env.BUILD_TYPE}} + + - name: Build tests for jigsaw + run: | + cd ${{github.workspace}}/uni/build + cmake --build . --config ${{env.BUILD_TYPE}} --target install + + - name: Prep. tests for jigsaw + if: startsWith(matrix.config.os, 'windows') + run: | + cd ${{github.workspace}}/uni + cp ../lib/jigsaw.dll . + + - name: Eval. tests for jigsaw + run: | + cd ${{github.workspace}}/uni + ./test_all + + - name: Extra tests for jigsaw + run: | + cd ${{github.workspace}} + ./bin/jigsaw example.jig + ./bin/jigsaw geo/airfoil.jig + ./bin/jigsaw geo/bunny.jig + ./bin/jigsaw geo/parts.jig + ./bin/jigsaw geo/earth.jig + ./bin/jigsaw geo/lakes.jig + + - name: Clean tests for jigsaw + run: rm -r ${{github.workspace}}/uni/build diff --git a/external/jigsaw/.travis.yml b/external/jigsaw/.travis.yml deleted file mode 100644 index 5eef8d5..0000000 --- a/external/jigsaw/.travis.yml +++ /dev/null @@ -1,85 +0,0 @@ -language: cpp -matrix: - include: - - os: linux - addons: - apt: - sources: - - ubuntu-toolchain-r-test - packages: - - gcc-8 - - g++-8 - script: - - export CC=gcc-8 - - export CXX=g++-8 - - mkdir build - - cd build - - cmake .. -DCMAKE_BUILD_TYPE=Release - - cmake --build . --config Release --target install - - cd .. - - ./bin/jigsaw example.jig - - cd uni - - mkdir build - - cd build - - cmake .. -DCMAKE_BUILD_TYPE=Debug - - cmake --build . --config Debug --target install - - cd .. - - ./test_1 - - ./test_2 - - ./test_3 - - ./test_4 - - ./test_5 - - ./test_6 - - ./test_7 - - ./test_8 - - ./test_9 - - - os: osx - osx_image: xcode11 - script: - - mkdir build - - cd build - - cmake .. -DCMAKE_BUILD_TYPE=Release - - cmake --build . --config Release --target install - - cd .. - - ./bin/jigsaw example.jig - - cd uni - - mkdir build - - cd build - - cmake .. -DCMAKE_BUILD_TYPE=Debug - - cmake --build . --config Debug --target install - - cd .. - - ./test_1 - - ./test_2 - - ./test_3 - - ./test_4 - - ./test_5 - - ./test_6 - - ./test_7 - - ./test_8 - - ./test_9 - - - os: windows - script: - - mkdir build - - cd build - - cmake .. -DCMAKE_BUILD_TYPE=Release - - cmake --build . --config Release --target install - - cd .. - - ./bin/jigsaw.exe example.jig - - cp lib/jigsaw.dll uni - - cd uni - - mkdir build - - cd build - - cmake .. -DCMAKE_BUILD_TYPE=Debug - - cmake --build . --config Debug --target install - - cd .. - - ./test_1.exe - - ./test_2.exe - - ./test_3.exe - - ./test_4.exe - - ./test_5.exe - - ./test_6.exe - - ./test_7.exe - - ./test_8.exe - - ./test_9.exe diff --git a/external/jigsaw/LICENSE.md b/external/jigsaw/LICENSE.md index 37a1b22..84a0e6b 100644 --- a/external/jigsaw/LICENSE.md +++ b/external/jigsaw/LICENSE.md @@ -2,4 +2,11 @@ This program may be freely redistributed under the condition that the copyright notices (including this entire header) are not removed, and no compensation is received through use of the software. Private, research, and institutional use is free. You may distribute modified versions of this code `UNDER THE CONDITION THAT THIS CODE AND ANY MODIFICATIONS MADE TO IT IN THE SAME FILE REMAIN UNDER COPYRIGHT OF THE ORIGINAL AUTHOR, BOTH SOURCE AND OBJECT CODE ARE MADE FREELY AVAILABLE WITHOUT CHARGE, AND CLEAR NOTICE IS GIVEN OF THE MODIFICATIONS`. Distribution of this code as part of a commercial system is permissible `ONLY BY DIRECT ARRANGEMENT WITH THE AUTHOR`. (If you are not directly supplying this code to a customer, and you are instead telling them how they can obtain it for free, then you are not required to make any arrangement with me.) -`DISCLAIMER`: Neither I nor: Columbia University, the Massachusetts Institute of Technology, the University of Sydney, nor the National Aeronautics and Space Administration warrant this code in any way whatsoever. This code is provided "as-is" to be used at your own risk. +`DISCLAIMER`: Neither I nor `THE CONTRIBUTORS` warrant this code in any way whatsoever. This code is provided "as-is" to be used at your own risk. + +`THE CONTRIBUTORS` include: +(a) The University of Sydney +(b) The Massachusetts Institute of Technology +(c) Columbia University +(d) The National Aeronautics & Space Administration +(e) Los Alamos National Laboratory diff --git a/external/jigsaw/README.md b/external/jigsaw/README.md index 375b75c..a59cf25 100644 --- a/external/jigsaw/README.md +++ b/external/jigsaw/README.md @@ -11,7 +11,7 @@ This package provides the underlying `c++` source for `JIGSAW`; defining a basic command-line interface and a `c`-format `API`. Higher-level scripting interfaces, supporting a range of additional facilities for file I/O, mesh visualisation and post-processing operations are also available, including for `MATLAB` / `OCTAVE` here and for `PYTHON` here. -`JIGSAW` has been compiled and tested on various `64-bit` `Linux`, `Windows` and `MacOS` based platforms. +`JIGSAW` is compiled and tested on various `64-bit` `Linux`, `Windows` and `MacOS` platforms using the `g++`, `clang++` and `msvc` compilers. ### `Code Structure` @@ -47,10 +47,12 @@ The full `JIGSAW` src can be found in `../jigsaw/src/`< * Make a new temporary directory BUILD. * cd build * cmake .. -DCMAKE_BUILD_TYPE=BUILD_MODE - * cmake --build . --config BUILD_MODE --target install + * cmake --build . --config BUILD_MODE --target install EXTRAS * Delete the temporary BUILD directory. -This process will build a series of executables and shared libraries: `jigsaw` itself - the main command-line meshing utility, `tripod` - `JIGSAW`'s tessellation infrastructure, `marche` - a fast-marching solver designed to optimise mesh-spacing configurations, as well as `libjigsaw` - `JIGSAW`'s shared `API`. `BUILD_MODE` can be used to select different compiler configurations and should generally either be `Release` or `Debug`. +This process will build a series of executables and shared libraries: `jigsaw` itself - the main command-line meshing utility, `tripod` - `JIGSAW`'s tessellation infrastructure, `marche` - a fast-marching solver designed to optimise mesh-spacing configurations, as well as `libjigsaw` - `JIGSAW`'s shared `API`. + +`BUILD_MODE` can be used to select different compiler configurations and should generally either be `Release` or `Debug`. `EXTRAS` can be used to pass additional compile-time arguments, for example `-- -j 4` will build in parallel on supported architectures. See `example.jig` for documentation on calling the command-line executables, and the headers in `../jigsaw/inc/` for details on the `API`. @@ -92,16 +94,29 @@ The unit-tests can be built using the `cmake` u * Make a new temporary directory BUILD. * cd build * cmake .. -DCMAKE_BUILD_TYPE=BUILD_MODE - * cmake --build . --config BUILD_MODE --target install + * cmake --build . --config BUILD_MODE --target install EXTRAS * Delete the temporary BUILD directory. -This process will build the unit-tests as a series of executables in `../jigsaw/uni/`. `BUILD_MODE` is a compiler configuration flag: either `Release` or `Debug`. +This process will build the unit-tests as a series of executables in `../jigsaw/uni/`. `BUILD_MODE` is a compiler configuration flag: either `Release` or `Debug`. `EXTRAS` can be used to pass additional compile-time arguments. + +### `Contributors` + +1. [@dengwirda](https://github.com/dengwirda) is `JIGSAW`'s developer and maintainer --- this work was originally the focus of my PhD at the University of Sydney. +2. [@xylar](https://github.com/xylar) contributed the `cmake` build system and `conda` environment. +3. [@tunnellm](https://github.com/tunnellm) extended the sequential optimisation algorithms to support thread-parallelism. ### `License` This program may be freely redistributed under the condition that the copyright notices (including this entire header) are not removed, and no compensation is received through use of the software. Private, research, and institutional use is free. You may distribute modified versions of this code `UNDER THE CONDITION THAT THIS CODE AND ANY MODIFICATIONS MADE TO IT IN THE SAME FILE REMAIN UNDER COPYRIGHT OF THE ORIGINAL AUTHOR, BOTH SOURCE AND OBJECT CODE ARE MADE FREELY AVAILABLE WITHOUT CHARGE, AND CLEAR NOTICE IS GIVEN OF THE MODIFICATIONS`. Distribution of this code as part of a commercial system is permissible `ONLY BY DIRECT ARRANGEMENT WITH THE AUTHOR`. (If you are not directly supplying this code to a customer, and you are instead telling them how they can obtain it for free, then you are not required to make any arrangement with me.) -`DISCLAIMER`: Neither I nor: Columbia University, the Massachusetts Institute of Technology, the University of Sydney, nor the National Aeronautics and Space Administration warrant this code in any way whatsoever. This code is provided "as-is" to be used at your own risk. +`DISCLAIMER`: Neither I nor `THE CONTRIBUTORS` warrant this code in any way whatsoever. This code is provided "as-is" to be used at your own risk. + +`THE CONTRIBUTORS` include: +(a) The University of Sydney +(b) The Massachusetts Institute of Technology +(c) Columbia University +(d) The National Aeronautics & Space Administration +(e) Los Alamos National Laboratory ### `References` diff --git a/external/jigsaw/example.jig b/external/jigsaw/example.jig index d168a19..2507603 100644 --- a/external/jigsaw/example.jig +++ b/external/jigsaw/example.jig @@ -142,7 +142,7 @@ # value. Interpreted based on SCAL setting. # -# HFUN_HMAX = 0.03 + HFUN_HMAX = 0.05 # ---> HFUN_HMIN - {default=0.00} min. mesh-size function @@ -305,13 +305,48 @@ # cases a hybrid formulation is employed, using a # "blend" of the ODT/CVT updates, and gradients of a # "fall-back" mesh quality function Q. +# # OPTM_KERN = CVT+DQDX +# ---> OPTM_COST - {default='area-len'} mesh optimisation +# cost metric, choice of area-length (COST='area-len') +# or skewed-cosine (COST='skew-cos') functions. +# The area-length metric is symmetric wrt. both small +# and large cell angles, and is typically appropriate +# for simplex-only meshes. The skewed-cosine metric is +# based on an asymmetric penalisation of large cell +# angles, and may be useful for staggered primal-dual +# tessellations. +# + +# OPTM_COST = SKEW-COS + + +# ---> OPTM_BETA - {default=0.4950} "momentum"-type weight +# for gradient descent updates, such that +# DX' = BETA * DX(K-1) + (1-BETA) * DX(K). +# Momentum typically improves the convergence of mesh +# optimisation. +# + +# OPTM_BETA = 0.3750 + + +# ---> OPTM_ZETA - {default=0.8250} "momentum"-type weight +# for search direction updates, such that +# DX* = ZETA * DX' (K) + (1-ZETA) * DX(K). +# Momentum typically improves the convergence of mesh +# optimisation. +# + +# OPTM_ZETA = 0.7500 + + # ---> OPTM_ITER - {default=16} max. number of mesh optim- # isation iterations. Set ITER=N to see progress after -# N iterations. +# N iterations. # # OPTM_ITER = 32 @@ -374,4 +409,12 @@ # VERBOSITY = 1 +# ---> NUMTHREAD - {default=0} control for thread-parallel +# implementations. Set NUMTHREAD <= 0 to autodetect a +# machine's max-thread allocation. +# + +# NUMTHREAD = 4 + + diff --git a/external/jigsaw/geo/airfoil.jig b/external/jigsaw/geo/airfoil.jig new file mode 100644 index 0000000..b3fc055 --- /dev/null +++ b/external/jigsaw/geo/airfoil.jig @@ -0,0 +1,26 @@ + +# +# AIRFOIL.JIG: simple airfoil +# + +# To run on WIN platforms: +# +# bin\jigsaw.exe geo\airfoil.jig +# +# To run on LNX platforms: +# +# bin/jigsaw geo/airfoil.jig +# +# from jigsaw root folder. +# + + GEOM_FILE = geo/airfoil.msh + MESH_FILE = out/airfoil.msh + VERBOSITY = 1 + GEOM_FEAT = TRUE + MESH_TOP1 = TRUE + MESH_DIMS = 2 + HFUN_HMAX = 0.02 + + + diff --git a/external/jigsaw/geo/bunny.jig b/external/jigsaw/geo/bunny.jig new file mode 100644 index 0000000..7b08709 --- /dev/null +++ b/external/jigsaw/geo/bunny.jig @@ -0,0 +1,24 @@ + +# +# BUNNY.JIG: stanford bunny +# + +# To run on WIN platforms: +# +# bin\jigsaw.exe geo\bunny.jig +# +# To run on LNX platforms: +# +# bin/jigsaw geo/bunny.jig +# +# from jigsaw root folder. +# + + GEOM_FILE = geo/bunny.msh + MESH_FILE = out/bunny.msh + VERBOSITY = 1 + MESH_DIMS = 2 + HFUN_HMAX = 0.05 + + + diff --git a/external/jigsaw/geo/earth.jig b/external/jigsaw/geo/earth.jig new file mode 100644 index 0000000..84fec7f --- /dev/null +++ b/external/jigsaw/geo/earth.jig @@ -0,0 +1,25 @@ + +# +# EARTH.JIG: mesh coastlines +# + +# To run on WIN platforms: +# +# bin\jigsaw.exe geo\earth.jig +# +# To run on LNX platforms: +# +# bin/jigsaw geo/earth.jig +# +# from jigsaw root folder. +# + + GEOM_FILE = geo/earth.msh + MESH_FILE = out/earth.msh + VERBOSITY = 1 + MESH_DIMS = 1 + GEOM_SEED = 160 + HFUN_HMAX = 0.01 + + + diff --git a/external/jigsaw/geo/earth.msh b/external/jigsaw/geo/earth.msh new file mode 100644 index 0000000..b499a6d --- /dev/null +++ b/external/jigsaw/geo/earth.msh @@ -0,0 +1,16634 @@ +# earth.msh; created by JIGSAW's MATLAB interface +MSHID=3;ELLIPSOID-MESH +RADII=6371.000000;6371.000000;6371.000000 +NDIMS=2 +POINT=8314 +3.141592653589793;1.135336678422311;0 +3.134262270731417;1.133067750394719;0 +3.118379774538268;1.128704427264733;0 +3.097959422289935;1.130100690666328;0 +3.097959422289935;1.122770307807952;0 +3.112445655081488;1.122770307807952;0 +3.116808978211473;1.117010721276371;0 +3.12117230134146;1.108284075016399;0 +3.128502684199836;1.099557428756428;0 +3.135833067058211;1.093797842224846;0 +3.12413936106985;1.08646745936647;0 +3.109653128278297;1.090830782496456;0 +3.089232776029963;1.090830782496456;0 +3.076142806640006;1.08646745936647;0 +3.060085777521658;1.08350039963808;0 +3.046995808131701;1.077740813106498;0 +3.033905838741743;1.076344549704903;0 +3.020815869351785;1.070410430248122;0 +3.007725899961828;1.064650843716541;0 +2.993239667170275;1.05889125718496;0 +2.978753434378722;1.054527934054974;0 +2.972819314921941;1.045801287795002;0 +2.96409266866197;1.051560874326584;0 +2.952573495598807;1.055924197456569;0 +2.936516466480459;1.057320460858165;0 +2.923426497090502;1.054527934054974;0 +2.91173279110214;1.050164610924988;0 +2.900213618038977;1.042834228066612;0 +2.900213618038977;1.052957137728179;0 +2.885552852322225;1.050164610924988;0 +2.875429942660658;1.044230491468207;0 +2.86530703299909;1.047197551196598;0 +2.850646267282339;1.044230491468207;0 +2.847853740479147;1.037074641535031;0 +2.843490417349162;1.029744258676654;0 +2.833192974762395;1.022413875818278;0 +2.826037124829218;1.015258025885101;0 +2.82882965163241;1.007927643026725;0 +2.837556297892381;1.010894702755116;0 +2.847853740479147;1.00653137962513;0 +2.839127094219176;0.9992009967667536;0 +2.839127094219176;0.9918706139083775;0 +2.846282944152353;0.9890780871051865;0 +2.849250003880743;0.980351440845215;0 +2.841919621022367;0.9773843811168246;0 +2.83476377108919;0.9817477042468103;0 +2.826037124829218;0.97878064451842;0 +2.820103005372438;0.9716247945852433;0 +2.821673801699232;0.9628981483252715;0 +2.82882965163241;0.9555677654668955;0 +2.82882965163241;0.9555677654668955;0 +2.821673801699232;0.9512044423369095;0 +2.81294715543926;0.9526007057385051;0 +2.799857186049303;0.9498081789353141;0 +2.791130539789332;0.9438740594785334;0 +2.789559743462537;0.9351474132185617;0 +2.791130539789332;0.9279915632853851;0 +2.778040570399374;0.9279915632853851;0 +2.767743127812608;0.9220574438286042;0 +2.764950601009417;0.9119345341670372;0 +2.756223954749445;0.90181162450547;0 +2.745926512162679;0.8944812416470939;0 +2.734407339099516;0.8887216551155126;0 +2.731440279371125;0.8944812416470939;0 +2.731440279371125;0.90181162450547;0 +2.73004401596953;0.9105382707654417;0 +2.72410989651275;0.9206611804270088;0 +2.722713633111154;0.9307840900885759;0 +2.719746573382764;0.9410815326753426;0 +2.716954046579573;0.9482373826085192;0 +2.713986986851182;0.9569640288684909;0 +2.712590723449587;0.9642944117268671;0 +2.713986986851182;0.9744173213884341;0 +2.718350309981168;0.9831439676484057;0 +2.722713633111154;0.9918706139083775;0 +2.734407339099516;0.9948376736367678;0 +2.740166925631097;1.002168056495144;0 +2.737199865902707;1.007927643026725;0 +2.748893571891069;1.007927643026725;0 +2.761983541281027;1.012290966156711;0 +2.775073510670984;1.019621349015087;0 +2.786767216659346;1.026777198948264;0 +2.793923066592523;1.03410758180664;0 +2.808583832309275;1.041437964665016;0 +2.820103005372438;1.048593814598193;0 +2.826037124829218;1.054527934054974;0 +2.839127094219176;1.05889125718496;0 +2.853613327010729;1.061683783988151;0 +2.857976650140714;1.067617903444931;0 +2.860943709869105;1.077740813106498;0 +2.863736236672296;1.08646745936647;0 +2.875429942660658;1.090830782496456;0 +2.869670356129077;1.093797842224846;0 +2.849250003880743;1.090830782496456;0 +2.843490417349162;1.08350039963808;0 +2.843490417349162;1.076344549704903;0 +2.8317967113608;1.074773753378108;0 +2.821673801699232;1.069014166846527;0 +2.80998009571087;1.063254580314946;0 +2.795493862919317;1.057320460858165;0 +2.791130539789332;1.063254580314946;0 +2.789559743462537;1.069014166846527;0 +2.798286389722509;1.079137076508094;0 +2.783800156930956;1.076344549704903;0 +2.772106450942594;1.079137076508094;0 +2.756223954749445;1.077740813106498;0 +2.738770662229502;1.074773753378108;0 +2.728473219642735;1.067617903444931;0 +2.718350309981168;1.060287520586555;0 +2.705260340591211;1.054527934054974;0 +2.696533694331239;1.047197551196598;0 +2.690774107799657;1.038470904936626;0 +2.702293280862821;1.037074641535031;0 +2.708227400319601;1.032711318405045;0 +2.687807048071268;1.03114052207825;0 +2.676113342082906;1.032711318405045;0 +2.668957492149728;1.029744258676654;0 +2.652900463031381;1.026777198948264;0 +2.641206757043019;1.026777198948264;0 +2.636843433913033;1.03114052207825;0 +2.647140876499799;1.035503845208236;0 +2.641206757043019;1.039867168338221;0 +2.632480110783047;1.038470904936626;0 +2.620960937719884;1.039867168338221;0 +2.609267231731522;1.042834228066612;0 +2.600540585471551;1.041437964665016;0 +2.599144322069955;1.037074641535031;0 +2.597573525743161;1.03410758180664;0 +2.586054352679998;1.035503845208236;0 +2.57296438329004;1.03410758180664;0 +2.556907354171693;1.037074641535031;0 +2.546784444510125;1.032711318405045;0 +2.540850325053345;1.035503845208236;0 +2.524967828860196;1.035503845208236;0 +2.507514536340253;1.035503845208236;0 +2.49006124382031;1.03410758180664;0 +2.478367537831948;1.029744258676654;0 +2.472607951300366;1.023984672145073;0 +2.460914245312004;1.019621349015087;0 +2.453583862453629;1.013687229558307;0 +2.447824275922047;1.007927643026725;0 +2.43770136626048;1.003564319896739;0 +2.426007660272118;0.9978047333651582;0 +2.417281014012147;0.9918706139083775;0 +2.407158104350579;0.9831439676484057;0 +2.395464398362217;0.9759881177152292;0 +2.383770692373855;0.9700539982584483;0 +2.372251519310693;0.9628981483252715;0 +2.359161549920735;0.9585348251952858;0 +2.360557813322331;0.9541715020653;0 +2.360557813322331;0.9541715020653;0 +2.372251519310693;0.9512044423369095;0 +2.38534148870065;0.9526007057385051;0 +2.38534148870065;0.9454448558053283;0 +2.38534148870065;0.938114472946952;0 +2.392497338633827;0.9454448558053283;0 +2.402794781220593;0.9468411192069237;0 +2.402794781220593;0.9395107363485476;0 +2.396860661763813;0.9337511498169663;0 +2.412917690882161;0.9367182095453567;0 +2.423040600543728;0.9454448558053283;0 +2.43473430653209;0.9454448558053283;0 +2.446428012520451;0.9424777960769379;0 +2.447824275922047;0.938114472946952;0 +2.456550922182019;0.9337511498169663;0 +2.466673831843586;0.9293878266869805;0 +2.4623105087136;0.9220574438286042;0 +2.4623105087136;0.9149015938954275;0 +2.466673831843586;0.9105382707654417;0 +2.4623105087136;0.904604151308661;0 +2.456550922182019;0.8974483013754843;0 +2.452187599052033;0.890117918517108;0 +2.450791335650437;0.8813912722571364;0 +2.452187599052033;0.8726646259971648;0 +2.452187599052033;0.8625417163355976;0 +2.449220539323643;0.8552113334772214;0 +2.446428012520451;0.8464846872172498;0 +2.43473430653209;0.8377580409572781;0 +2.426007660272118;0.8290313946973066;0 +2.417281014012147;0.8217010118389303;0 +2.412917690882161;0.8115781021773631;0 +2.407158104350579;0.8042477193189871;0 +2.399827721492203;0.7970918693858103;0 +2.389704811830636;0.7897614865274341;0 +2.37940736924387;0.7810348402674625;0 +2.367888196180707;0.7737044574090862;0 +2.364921136452316;0.7665486074759096;0 +2.356194490192345;0.7578219612159379;0 +2.344500784203983;0.7534586380859521;0 +2.334377874542416;0.7475245186291712;0 +2.322684168554054;0.7447319918259805;0 +2.309594199164096;0.7490953149559663;0 +2.309594199164096;0.7548549014875475;0 +2.299471289502529;0.7548549014875475;0 +2.295107966372544;0.7504915783575616;0 +2.289348379840962;0.7431611954991855;0 +2.283414260384181;0.7431611954991855;0 +2.28062173358099;0.7374016089676042;0 +2.270324290994224;0.7344345492392138;0 +2.261597644734252;0.7257079029792421;0 +2.263168441061047;0.7213445798492564;0 +2.263168441061047;0.7126179335892847;0 +2.255838058202671;0.7098254067860938;0 +2.247111411942699;0.7038912873293131;0 +2.238384765682728;0.6995279641993273;0 +2.231054382824351;0.6967354373961363;0 +2.22232773656438;0.6951646410693415;0 +2.22529479629277;0.6908013179393555;0 +2.22232773656438;0.6850417314077742;0 +2.231054382824351;0.6806784082777885;0 +2.238384765682728;0.6749188217462072;0 +2.242748088812713;0.667588438887831;0 +2.248507675344295;0.6618288523562498;0 +2.254441794801075;0.6544984694978736;0 +2.257234321604266;0.6457718232379019;0 +2.258805117931061;0.6370451769779303;0 +2.258805117931061;0.6283185307179586;0 +2.257234321604266;0.6209881478595823;0 +2.252870998474281;0.6138322979264057;0 +2.242748088812713;0.6094689747964199;0 +2.229658119422756;0.6078981784696249;0 +2.219535209761189;0.605105651666434;0 +2.209237767174422;0.5991715322096532;0 +2.204874444044437;0.6078981784696249;0 +2.204874444044437;0.6166248247295966;0 +2.212204826902813;0.6239552075879728;0 +2.207841503772827;0.6340781172495399;0 +2.202081917241245;0.6443755598363065;0 +2.212204826902813;0.6457718232379019;0 +2.209237767174422;0.6531022060962781;0 +2.200511120914451;0.6588617926278594;0 +2.187421151524493;0.657465529226264;0 +2.177298241862926;0.6646213791594406;0 +2.181661564992912;0.6719517620178169;0 +2.184628624721302;0.6792821448761931;0 +2.188991947851288;0.6880087911361648;0 +2.183057828394507;0.6908013179393555;0 +2.175901978461331;0.6923721142661505;0 +2.165604535874564;0.6951646410693415;0 +2.155481626212997;0.693768377667746;0 +2.146754979953025;0.6908013179393555;0 +2.136632070291458;0.6880087911361648;0 +2.130697950834678;0.682074671679384;0 +2.121971304574706;0.6777113485493982;0 +2.114815454641529;0.6763150851478027;0 +2.123542100901501;0.6836454680061789;0 +2.11760798144472;0.6894050545377601;0 +2.12057504117311;0.693768377667746;0 +2.127905424031487;0.6981317007977318;0 +2.133665010563068;0.7054620836561081;0 +2.133665010563068;0.7054620836561081;0 +2.127905424031487;0.7126179335892847;0 +2.116211718043124;0.7141887299160796;0 +2.108881335184748;0.7082546104592988;0 +2.101725485251571;0.7010987605261222;0 +2.0929988389916;0.6981317007977318;0 +2.084272192731628;0.693768377667746;0 +2.081305133003238;0.6880087911361648;0 +2.076941809873252;0.6836454680061789;0 +2.066818900211685;0.682074671679384;0 +2.059488517353309;0.6850417314077742;0 +2.053728930821728;0.6792821448761931;0 +2.052158134494933;0.6733480254194123;0 +2.058092253951713;0.667588438887831;0 +2.06524810388489;0.6632251157578452;0 +2.073974750144862;0.6588617926278594;0 +2.075545546471657;0.6515314097694832;0 +2.082701396404834;0.6471680866394973;0 +2.09003177926321;0.6471680866394973;0 +2.094395102393195;0.6515314097694832;0 +2.100154688924777;0.655894732899469;0 +2.108881335184748;0.6588617926278594;0 +2.114815454641529;0.6544984694978736;0 +2.121971304574706;0.6531022060962781;0 +2.130697950834678;0.6531022060962781;0 +2.139424597094649;0.6515314097694832;0 +2.135061273964663;0.6428047635095115;0 +2.129301687433082;0.6457718232379019;0 +2.12057504117311;0.6414085001079162;0 +2.108881335184748;0.6384414403795257;0 +2.106088808381557;0.631285590446349;0 +2.097362162121586;0.6269222673163631;0 +2.088635515861614;0.6209881478595823;0 +2.084272192731628;0.6152285613280011;0 +2.079908869601642;0.6078981784696249;0 +2.09003177926321;0.6035348553396391;0 +2.100154688924777;0.5991715322096532;0 +2.103121748653167;0.5904448859496816;0 +2.106088808381557;0.5832890360165049;0 +2.108881335184748;0.5759586531581288;0 +2.110452131511543;0.5686282702997525;0 +2.116211718043124;0.5658357434965617;0 +2.123542100901501;0.5599016240397809;0 +2.126334627704692;0.5527457741066042;0 +2.116211718043124;0.5527457741066042;0 +2.126334627704692;0.5454153912482279;0 +2.127905424031487;0.5396558047166468;0 +2.12057504117311;0.5380850083898517;0 +2.114815454641529;0.5352924815866609;0 +2.110452131511543;0.5309291584566751;0 +2.101725485251571;0.5293583621298801;0 +2.107485071783153;0.5265658353266892;0 +2.11760798144472;0.5279620987282847;0 +2.123542100901501;0.5249950389998943;0 +2.130697950834678;0.5235987755982988;0 +2.129301687433082;0.519235452468313;0 +2.127905424031487;0.5091125428067459;0 +2.123542100901501;0.5091125428067459;0 +2.12057504117311;0.5003858965467743;0 +2.121971304574706;0.4960225734167885;0 +2.119178777771515;0.4916592502868026;0 +2.113244658314734;0.4916592502868026;0 +2.108881335184748;0.4857251308300219;0 +2.104518012054762;0.4785692808968452;0 +2.100154688924777;0.471238898038469;0 +2.094395102393195;0.4654793115068877;0 +2.088635515861614;0.4668755749084831;0 +2.09003177926321;0.4595451920501069;0 +2.088635515861614;0.4537856055185257;0 +2.084272192731628;0.4464552226601495;0 +2.079908869601642;0.4406956361285682;0 +2.073974750144862;0.4363323129985824;0 +2.071182223341671;0.4290019301402062;0 +2.062455577081699;0.4290019301402062;0 +2.062455577081699;0.4232423436086249;0 +2.056521457624918;0.4188790204786391;0 +2.049365607691742;0.4131194339470578;0 +2.042035224833366;0.408756110817072;0 +2.033308578573394;0.4028219913602912;0 +2.024581932313422;0.3984586682303054;0 +2.015855286053451;0.39706240482871;0 +2.007128639793479;0.3956661414271145;0 +1.998401993533507;0.3956661414271145;0 +1.992642407001926;0.3883357585687384;0 +1.983915760741954;0.3956661414271145;0 +1.980948701013564;0.3869394951671429;0 +1.973618318155188;0.3926990816987241;0 +1.972222054753592;0.3839724354387525;0 +1.963495408493621;0.3810053757103621;0 +1.954768762233649;0.3796091123087666;0 +1.946042115973677;0.3752457891787808;0 +1.93591920631211;0.3738495257771854;0 +1.927192560052139;0.370882466048795;0 +1.924225500323748;0.3651228795172138;0 +1.928588823453734;0.3577924966588375;0 +1.924225500323748;0.3548254369304472;0 +1.918465913792167;0.3548254369304472;0 +1.915498854063777;0.3621558197888234;0 +1.914102590662181;0.3665191429188092;0 +1.915498854063777;0.3738495257771854;0 +1.915498854063777;0.3738495257771854;0 +1.909739267532195;0.3738495257771854;0 +1.902408884673819;0.3782128489071713;0 +1.893682238413847;0.3782128489071713;0 +1.884955592153876;0.3752457891787808;0 +1.8776252092955;0.370882466048795;0 +1.868898563035528;0.3665191429188092;0 +1.861742713102351;0.360759556387228;0 +1.857379389972365;0.3534291735288517;0 +1.848652743712394;0.3476695869972705;0 +1.845685683984003;0.3403392041388942;0 +1.842718624255613;0.3316125578789226;0 +1.848652743712394;0.3214896482173555;0 +1.855808593645571;0.3155555287605747;0 +1.857379389972365;0.3097959422289935;0 +1.864535239905542;0.3024655593706173;0 +1.870469359362323;0.2953097094374406;0 +1.879196005622294;0.2879793265790644;0 +1.886351855555471;0.2822197400474831;0 +1.892285975012252;0.2748893571891069;0 +1.899441824945429;0.2675589743307307;0 +1.902408884673819;0.2574360646691636;0 +1.905375944402209;0.2487094184091919;0 +1.906772207803805;0.2399827721492203;0 +1.906772207803805;0.2312561258892487;0 +1.906772207803805;0.2239257430308725;0 +1.905375944402209;0.2124065699677099;0 +1.905375944402209;0.2050761871093337;0 +1.902408884673819;0.1993166005777524;0 +1.893682238413847;0.1949532774477666;0 +1.886351855555471;0.1905899543177808;0 +1.879196005622294;0.1862266311877949;0 +1.871865622763919;0.1818633080578091;0 +1.861742713102351;0.1818633080578091;0 +1.861742713102351;0.1715658654710426;0 +1.855808593645571;0.1644100155378658;0 +1.847081947385599;0.1628392192110709;0 +1.839926097452422;0.1570796326794897;0 +1.832595714594046;0.1513200461479084;0 +1.829628654865656;0.1584758960810851;0 +1.829628654865656;0.1672025423410568;0 +1.832595714594046;0.1759291886010284;0 +1.823869068334074;0.1788962483294187;0 +1.819505745204089;0.1846558348610001;0 +1.809382835542521;0.1846558348610001;0 +1.802052452684145;0.1905899543177808;0 +1.797689129554159;0.1977458042509575;0 +1.794722069825769;0.2050761871093337;0 +1.790358746695783;0.210835773640915;0 +1.784599160164202;0.2138028333693054;0 +1.777268777305826;0.2211332162276816;0 +1.770112927372649;0.2211332162276816;0 +1.761386281112677;0.222529479629277;0 +1.761386281112677;0.2326523892908441;0 +1.752659634852706;0.2356194490192345;0 +1.74532925199433;0.2326523892908441;0 +1.743932988592734;0.222529479629277;0 +1.743932988592734;0.210835773640915;0 +1.740965928864344;0.2036799237077382;0 +1.737998869135953;0.1949532774477666;0 +1.733635546005968;0.1890191579909859;0 +1.730843019202776;0.1788962483294187;0 +1.730843019202776;0.1687733386678517;0 +1.733635546005968;0.16004669240788;0 +1.742362192265939;0.1614429558094755;0 +1.743932988592734;0.1497492498211135;0 +1.749692575124315;0.1439896632895322;0 +1.752659634852706;0.1352630170295605;0 +1.755452161655897;0.1251401073679934;0 +1.761386281112677;0.1207767842380076;0 +1.771509190774244;0.1192059879112127;0 +1.777268777305826;0.112050137978036;0 +1.784599160164202;0.1061160185212552;0 +1.791929543022578;0.1003564319896739;0 +1.799085392955755;0.09459684545809266;0 +1.805019512412536;0.08587019919812101;0 +1.805019512412536;0.07714355293814937;0 +1.805019512412536;0.06841690667817771;0 +1.805019512412536;0.05969026041820607;0 +1.805019512412536;0.05096361415823442;0 +1.810779098944117;0.0450294947014537;0 +1.816538685475698;0.03490658503988659;0 +1.819505745204089;0.02478367537831948;0 +1.806415775814131;0.02478367537831948;0 +1.80065618928255;0.0291469985083053;0 +1.793325806424174;0.03351032163829112;0 +1.784599160164202;0.03787364476827695;0 +1.778839573632621;0.04363323129985824;0 +1.770112927372649;0.04939281783143952;0 +1.768542131045854;0.05811946409141117;0 +1.761386281112677;0.06544984694978735;0 +1.755452161655897;0.07417649320975901;0 +1.757022957982692;0.08290313946973064;0 +1.752659634852706;0.08866272600131195;0 +1.751088838525911;0.09896016858807849;0 +1.751088838525911;0.1061160185212552;0 +1.746725515395925;0.1164134611080218;0 +1.740965928864344;0.1221730476396031;0 +1.735206342332762;0.1279326341711844;0 +1.729272222875982;0.136659280431156;0 +1.729272222875982;0.136659280431156;0 +1.722116372942805;0.1439896632895322;0 +1.717753049812819;0.1410226035611418;0 +1.714785990084429;0.148352986419518;0 +1.714785990084429;0.1570796326794897;0 +1.719149313214414;0.1672025423410568;0 +1.719149313214414;0.1774999849278233;0 +1.719149313214414;0.1862266311877949;0 +1.7235126363444;0.1919862177193762;0 +1.7235126363444;0.1993166005777524;0 +1.719149313214414;0.2080432468377241;0 +1.7235126363444;0.2181661564992912;0 +1.72054557661601;0.2282890661608583;0 +1.714785990084429;0.2385865087476248;0 +1.711818930356038;0.2487094184091919;0 +1.709026403552848;0.2574360646691636;0 +1.707455607226053;0.2675589743307307;0 +1.706059343824457;0.2762856205907024;0 +1.703092284096067;0.285012266850674;0 +1.697332697564486;0.2923426497090502;0 +1.691573111032904;0.2953097094374406;0 +1.688606051304514;0.2893755899806598;0 +1.679879405044542;0.285012266850674;0 +1.672549022186166;0.2806489437206882;0 +1.666789435654585;0.2748893571891069;0 +1.659459052796208;0.2748893571891069;0 +1.653699466264627;0.2762856205907024;0 +1.644972820004656;0.2806489437206882;0 +1.647939879733046;0.2893755899806598;0 +1.650732406536237;0.2996730325674264;0 +1.649336143134641;0.3097959422289935;0 +1.646369083406251;0.3199188518905606;0 +1.64357655660306;0.3286454981505322;0 +1.637642437146279;0.3286454981505322;0 +1.633279114016293;0.3359758810089085;0 +1.636246173744684;0.3403392041388942;0 +1.631882850614698;0.3476695869972705;0 +1.626123264083117;0.3476695869972705;0 +1.621759940953131;0.3534291735288517;0 +1.614429558094755;0.360759556387228;0 +1.608669971563174;0.3679154063204046;0 +1.605702911834783;0.3752457891787808;0 +1.604306648433188;0.3825761720371571;0 +1.601339588704797;0.3897320219703337;0 +1.595580002173216;0.39706240482871;0 +1.586853355913244;0.3913028182971287;0 +1.580919236456464;0.3869394951671429;0 +1.575159649924882;0.3810053757103621;0 +1.566433003664911;0.3796091123087666;0 +1.557706357404939;0.3782128489071713;0 +1.548979711144967;0.3766420525803763;0 +1.541649328286591;0.3752457891787808;0 +1.5388568014834;0.3853686988403479;0 +1.53588974175501;0.3796091123087666;0 +1.528559358896634;0.3766420525803763;0 +1.519832712636662;0.3738495257771854;0 +1.517040185833471;0.3679154063204046;0 +1.518436449235067;0.3621558197888234;0 +1.514073126105081;0.3548254369304472;0 +1.5083135395735;0.3476695869972705;0 +1.499586893313528;0.3447025272688801;0 +1.492256510455152;0.3433062638672846;0 +1.484926127596776;0.3373721444105038;0 +1.48056280446679;0.3316125578789226;0 +1.474803217935208;0.3242821750205464;0 +1.467472835076832;0.3185225884889651;0 +1.460316985143656;0.3155555287605747;0 +1.454382865686875;0.3111922056305889;0 +1.448623279155294;0.3040363556974122;0 +1.441292896296917;0.2996730325674264;0 +1.436929573166932;0.296705972839036;0 +1.435533309765336;0.2893755899806598;0 +1.43116998663535;0.285012266850674;0 +1.422443340375378;0.2836160034490786;0 +1.416683753843797;0.2822197400474831;0 +1.413716694115407;0.2748893571891069;0 +1.40359378445384;0.2762856205907024;0 +1.399230461323854;0.2691297706575256;0 +1.397659664997059;0.2617993877991494;0 +1.399230461323854;0.2516764781375823;0 +1.400626724725449;0.2413790355508158;0 +1.402022988127045;0.2312561258892487;0 +1.400626724725449;0.2211332162276816;0 +1.396263401595464;0.2124065699677099;0 +1.391900078465478;0.2050761871093337;0 +1.391900078465478;0.1963495408493621;0 +1.393296341867073;0.1890191579909859;0 +1.393296341867073;0.1788962483294187;0 +1.384569695607102;0.1788962483294187;0 +1.37881010907552;0.1701696020694471;0 +1.37881010907552;0.1614429558094755;0 +1.371479726217144;0.16004669240788;0 +1.364323876283967;0.1556833692778942;0 +1.361356816555577;0.1453859266911277;0 +1.354026433697201;0.1410226035611418;0 +1.346870583764024;0.1439896632895322;0 +1.340936464307243;0.1497492498211135;0 +1.335176877775662;0.1570796326794897;0 +1.332209818047272;0.1672025423410568;0 +1.329417291244081;0.1774999849278233;0 +1.329417291244081;0.1774999849278233;0 +1.32645023151569;0.1862266311877949;0 +1.3234831717873;0.1949532774477666;0 +1.319119848657314;0.2021091273809433;0 +1.313360262125733;0.2094395102393195;0 +1.308996938995747;0.2167698930976957;0 +1.306029879267357;0.2268928027592629;0 +1.303237352464166;0.2356194490192345;0 +1.300270292735775;0.2443460952792061;0 +1.29887402933418;0.2530727415391778;0 +1.292939909877399;0.2617993877991494;0 +1.287180323345818;0.2705260340591211;0 +1.282817000215832;0.2792526803190927;0 +1.279849940487442;0.2865830631774689;0 +1.278453677085846;0.296705972839036;0 +1.277057413684251;0.3054326190990077;0 +1.274090353955861;0.3155555287605747;0 +1.27112329422747;0.3258529713473414;0 +1.274090353955861;0.3316125578789226;0 +1.27112329422747;0.3359758810089085;0 +1.268330767424279;0.3447025272688801;0 +1.269727030825875;0.3534291735288517;0 +1.27112329422747;0.3635520831904188;0 +1.266759971097484;0.370882466048795;0 +1.265363707695889;0.3782128489071713;0 +1.266759971097484;0.3869394951671429;0 +1.262396647967498;0.3883357585687384;0 +1.259604121164308;0.3810053757103621;0 +1.258033324837513;0.370882466048795;0 +1.250877474904336;0.3651228795172138;0 +1.242150828644364;0.3621558197888234;0 +1.231853386057598;0.3621558197888234;0 +1.223126739797626;0.3665191429188092;0 +1.215970889864449;0.3738495257771854;0 +1.210036770407669;0.3796091123087666;0 +1.205673447277683;0.3883357585687384;0 +1.215970889864449;0.3883357585687384;0 +1.224697536124421;0.3913028182971287;0 +1.227490062927612;0.4000294645571004;0 +1.217367153266045;0.39706240482871;0 +1.207244243604478;0.39706240482871;0 +1.198517597344506;0.4028219913602912;0 +1.192583477887725;0.4101523742186675;0 +1.185427627954549;0.4145156973486533;0 +1.176700981694577;0.4174827570770436;0 +1.175130185367782;0.4246386070102203;0 +1.172337658564591;0.4319689898685966;0 +1.16640353910781;0.4363323129985824;0 +1.162040215977824;0.4420918995301636;0 +1.153313569717853;0.4436626958569586;0 +1.144586923457881;0.4420918995301636;0 +1.137431073524705;0.4406956361285682;0 +1.128704427264733;0.4392993727269727;0 +1.121374044406357;0.4406956361285682;0 +1.114043661547981;0.4436626958569586;0 +1.108284075016399;0.4406956361285682;0 +1.098161165354832;0.4406956361285682;0 +1.08943451909486;0.4392993727269727;0 +1.079137076508094;0.4377285764001778;0 +1.067617903444931;0.4392993727269727;0 +1.060287520586555;0.4406956361285682;0 +1.050164610924988;0.4420918995301636;0 +1.041437964665016;0.4420918995301636;0 +1.032711318405045;0.4436626958569586;0 +1.022413875818278;0.4464552226601495;0 +1.012290966156711;0.4480260189869444;0 +1.000597260168349;0.4494222823885398;0 +0.9978047333651582;0.4581489286485115;0 +0.9962339370383633;0.4654793115068877;0 +0.9904743505067819;0.471238898038469;0 +0.9817477042468103;0.471238898038469;0 +0.9730210579868387;0.4682718383100786;0 +0.9656906751284625;0.4654793115068877;0 +0.9555677654668955;0.4611159883769019;0 +0.9482373826085192;0.4654793115068877;0 +0.9395107363485476;0.4639085151800928;0 +0.9337511498169663;0.4698426346368736;0 +0.9250245035569946;0.471238898038469;0 +0.9176941206986184;0.4785692808968452;0 +0.9105382707654417;0.482932604026831;0 +0.8988445647770796;0.4857251308300219;0 +0.8944812416470939;0.4930555136883981;0 +0.8915141819187034;0.5017821599483697;0 +0.8843583319855268;0.5105088062083414;0 +0.878424212528746;0.5206317158699084;0 +0.8726646259971648;0.5265658353266892;0 +0.8653342431387886;0.5235987755982988;0 +0.8595746566072072;0.5279620987282847;0 +0.8538150700756261;0.5323254218582705;0 +0.8478809506188453;0.5235987755982988;0 +0.8435176274888594;0.5162683927399226;0 +0.8333947178272924;0.5134758659367318;0 +0.8407251006856686;0.5105088062083414;0 +0.8435176274888594;0.5017821599483697;0 +0.8478809506188453;0.4930555136883981;0 +0.8522442737488312;0.4857251308300219;0 +0.8595746566072072;0.4785692808968452;0 +0.8669050394655835;0.471238898038469;0 +0.8740608893987601;0.4654793115068877;0 +0.8770279491271507;0.4581489286485115;0 +0.8770279491271507;0.4581489286485115;0 +0.8756316857255551;0.4508185457901353;0 +0.8813912722571364;0.4436626958569586;0 +0.8843583319855268;0.4392993727269727;0 +0.890117918517108;0.4464552226601495;0 +0.8915141819187034;0.4537856055185257;0 +0.8958775050486893;0.4551818689201211;0 +0.9002408281786752;0.4494222823885398;0 +0.90181162450547;0.4406956361285682;0 +0.9002408281786752;0.4319689898685966;0 +0.8944812416470939;0.4232423436086249;0 +0.90181162450547;0.4232423436086249;0 +0.904604151308661;0.4188790204786391;0 +0.9149015938954275;0.4174827570770436;0 +0.9206611804270088;0.4218460802070295;0 +0.9293878266869805;0.4218460802070295;0 +0.9395107363485476;0.4202752838802346;0 +0.9468411192069237;0.4218460802070295;0 +0.9512044423369095;0.4290019301402062;0 +0.9599310885968813;0.434936049596987;0 +0.9656906751284625;0.4406956361285682;0 +0.9716247945852433;0.4464552226601495;0 +0.97878064451842;0.4508185457901353;0 +0.9817477042468103;0.456752665246916;0 +0.9861110273767961;0.4551818689201211;0 +0.9847147639752007;0.4508185457901353;0 +0.9847147639752007;0.4420918995301636;0 +0.9847147639752007;0.4319689898685966;0 +0.9918706139083775;0.4246386070102203;0 +0.9992009967667536;0.4188790204786391;0 +1.007927643026725;0.4145156973486533;0 +1.016654289286697;0.4131194339470578;0 +1.026777198948264;0.4101523742186675;0 +1.03114052207825;0.4028219913602912;0 +1.037074641535031;0.3956661414271145;0 +1.044230491468207;0.3913028182971287;0 +1.039867168338221;0.3825761720371571;0 +1.035503845208236;0.3738495257771854;0 +1.029744258676654;0.3694862026471996;0 +1.025380935546669;0.3635520831904188;0 +1.021017612416683;0.3563962332572421;0 +1.013687229558307;0.3563962332572421;0 +1.009323906428321;0.3490658503988659;0 +1.007927643026725;0.3403392041388942;0 +1.010894702755116;0.3330088212805181;0 +1.003564319896739;0.3302162944773271;0 +0.9962339370383633;0.3286454981505322;0 +0.9904743505067819;0.3242821750205464;0 +0.9875072907783917;0.3155555287605747;0 +0.9831439676484057;0.3127630019573839;0 +0.9759881177152292;0.3111922056305889;0 +0.9672614714552574;0.308399678827398;0 +0.9642944117268671;0.2996730325674264;0 +0.9569640288684909;0.2953097094374406;0 +0.9498081789353141;0.296705972839036;0 +0.9410815326753426;0.2953097094374406;0 +0.9323548864153709;0.2909463863074548;0 +0.9236282401553992;0.2879793265790644;0 +0.9149015938954275;0.2836160034490786;0 +0.9119345341670372;0.2778564169174972;0 +0.9119345341670372;0.2719222974607165;0 +0.9032078879070654;0.2691297706575256;0 +0.8944812416470939;0.2661627109291352;0 +0.8857545953871222;0.2631956512007449;0 +0.8770279491271507;0.260403124397554;0 +0.8669050394655835;0.2574360646691636;0 +0.8581783932056118;0.2530727415391778;0 +0.8522442737488312;0.2457423586808016;0 +0.8435176274888594;0.2429498318776107;0 +0.8347909812288877;0.2429498318776107;0 +0.827635131295711;0.2370157124208299;0 +0.8217010118389303;0.2326523892908441;0 +0.8129743655789586;0.2312561258892487;0 +0.8042477193189871;0.2326523892908441;0 +0.7970918693858103;0.2326523892908441;0 +0.7927285462558246;0.2268928027592629;0 +0.7840018999958529;0.2239257430308725;0 +0.7752752537358811;0.222529479629277;0 +0.7665486074759096;0.2211332162276816;0 +0.7592182246175333;0.222529479629277;0 +0.7534586380859521;0.2312561258892487;0 +0.7548549014875475;0.2399827721492203;0 +0.751887841759157;0.2443460952792061;0 +0.7490953149559663;0.2544690049407732;0 +0.7461282552275759;0.2647664475275398;0 +0.7447319918259805;0.2734930937875114;0 +0.7461282552275759;0.2806489437206882;0 +0.7447319918259805;0.2879793265790644;0 +0.7403686686959947;0.296705972839036;0 +0.7344345492392138;0.3054326190990077;0 +0.7286749627076327;0.3097959422289935;0 +0.7243116395776468;0.3171263250873697;0 +0.7199483164476609;0.3258529713473414;0 +0.715584993317675;0.334579617607313;0 +0.7112216701876892;0.3433062638672846;0 +0.7038912873293131;0.3504621138004613;0 +0.6923721142661505;0.3534291735288517;0 +0.6894050545377601;0.359188760060433;0 +0.6836454680061789;0.3651228795172138;0 +0.682074671679384;0.3752457891787808;0 +0.682074671679384;0.3752457891787808;0 +0.6806784082777885;0.3825761720371571;0 +0.682074671679384;0.3883357585687384;0 +0.6806784082777885;0.39706240482871;0 +0.6763150851478027;0.4057890510886816;0 +0.6705554986162214;0.4145156973486533;0 +0.6632251157578452;0.4202752838802346;0 +0.6544984694978736;0.4246386070102203;0 +0.6501351463678877;0.433365253270192;0 +0.6471680866394973;0.4420918995301636;0 +0.6414085001079162;0.4508185457901353;0 +0.6356489135763349;0.456752665246916;0 +0.6297147941195541;0.4654793115068877;0 +0.6239552075879728;0.4742059577668594;0 +0.619591884457987;0.481361807700036;0 +0.6138322979264057;0.4886921905584123;0 +0.605105651666434;0.4886921905584123;0 +0.6078981784696249;0.4974188368183839;0 +0.6108652381980153;0.5061454830783556;0 +0.6108652381980153;0.5148721293383272;0 +0.605105651666434;0.5047492196767601;0 +0.6007423285364483;0.4944517770899935;0 +0.6007423285364483;0.4872959271568168;0 +0.5963790054064624;0.4843288674284265;0 +0.5890486225480862;0.4900884539600077;0 +0.5832890360165049;0.4960225734167885;0 +0.5803219762881145;0.5017821599483697;0 +0.5759586531581288;0.507541746479951;0 +0.571595330028143;0.5162683927399226;0 +0.5686282702997525;0.5235987755982988;0 +0.5642649471697667;0.5206317158699084;0 +0.5686282702997525;0.5134758659367318;0 +0.5701990666265475;0.5061454830783556;0 +0.5745623897565333;0.4988151002199793;0 +0.5803219762881145;0.4916592502868026;0 +0.5860815628196958;0.4857251308300219;0 +0.5876523591464908;0.4785692808968452;0 +0.5920156822764766;0.4726351614400644;0 +0.5934119456780721;0.4654793115068877;0 +0.5991715322096532;0.456752665246916;0 +0.6021385919380436;0.4494222823885398;0 +0.6065019150680295;0.4406956361285682;0 +0.6108652381980153;0.433365253270192;0 +0.6152285613280011;0.4246386070102203;0 +0.6209881478595823;0.4188790204786391;0 +0.619591884457987;0.4115486376202628;0 +0.6209881478595823;0.4057890510886816;0 +0.6253514709895682;0.39706240482871;0 +0.631285590446349;0.3926990816987241;0 +0.6384414403795257;0.3883357585687384;0 +0.6443755598363065;0.3853686988403479;0 +0.6443755598363065;0.3752457891787808;0 +0.6501351463678877;0.3679154063204046;0 +0.6501351463678877;0.3621558197888234;0 +0.6487388829662923;0.3534291735288517;0 +0.6501351463678877;0.3433062638672846;0 +0.6515314097694832;0.3359758810089085;0 +0.655894732899469;0.3258529713473414;0 +0.6646213791594406;0.3214896482173555;0 +0.6733480254194123;0.3141592653589793;0 +0.6777113485493982;0.3068288825006031;0 +0.682074671679384;0.2981022362406315;0 +0.6836454680061789;0.2879793265790644;0 +0.6850417314077742;0.2792526803190927;0 +0.6894050545377601;0.2719222974607165;0 +0.6951646410693415;0.2705260340591211;0 +0.6995279641993273;0.2617993877991494;0 +0.7098254067860938;0.2574360646691636;0 +0.7185520530460655;0.2544690049407732;0 +0.7257079029792421;0.2457423586808016;0 +0.7344345492392138;0.2385865087476248;0 +0.7403686686959947;0.2312561258892487;0 +0.7475245186291712;0.2239257430308725;0 +0.7548549014875475;0.2167698930976957;0 +0.7578219612159379;0.2080432468377241;0 +0.7490953149559663;0.2036799237077382;0 +0.7548549014875475;0.1993166005777524;0 +0.7606144880191288;0.1933824811209717;0 +0.7665486074759096;0.1862266311877949;0 +0.7723081940074908;0.1818633080578091;0 +0.7810348402674625;0.1802925117310143;0 +0.7897614865274341;0.1832595714594046;0 +0.7984881327874057;0.1876228945893904;0 +0.8086110424489729;0.1862266311877949;0 +0.8173376887089445;0.1876228945893904;0 +0.827635131295711;0.1933824811209717;0 +0.8377580409572781;0.1933824811209717;0 +0.8464846872172498;0.1963495408493621;0 +0.8552113334772214;0.1949532774477666;0 +0.8653342431387886;0.1977458042509575;0 +0.8756316857255551;0.2007128639793479;0 +0.8827875356587318;0.2080432468377241;0 +0.8930849782454985;0.2050761871093337;0 +0.8915141819187034;0.1919862177193762;0 +0.890117918517108;0.1818633080578091;0 +0.8857545953871222;0.1745329251994329;0 +0.8857545953871222;0.1644100155378658;0 +0.879995008855541;0.1556833692778942;0 +0.8756316857255551;0.148352986419518;0 +0.8712683625955693;0.1425933998879367;0 +0.8712683625955693;0.1425933998879367;0 +0.868301302867179;0.1338667536279651;0 +0.8639379797371932;0.1265363707695889;0 +0.8595746566072072;0.1178097245096172;0 +0.8566075968788169;0.1104793416512411;0 +0.8538150700756261;0.1003564319896739;0 +0.8464846872172498;0.09459684545809266;0 +0.8407251006856686;0.08866272600131195;0 +0.8363617775556828;0.07993607974134029;0 +0.831998454425697;0.07278022980816354;0 +0.8246680715673207;0.06544984694978735;0 +0.8189084850357394;0.05969026041820607;0 +0.8115781021773631;0.05235987755982988;0 +0.805818515645782;0.0450294947014537;0 +0.7984881327874057;0.03926990816987241;0 +0.7911577499290294;0.03351032163829112;0 +0.7824311036690579;0.03054326190990077;0 +0.7752752537358811;0.02478367537831948;0 +0.767944870877505;0.0174532925199433;0 +0.7606144880191288;0.01308996938995747;0 +0.7534586380859521;0.007330382858376183;0 +0.7490953149559663;0;0 +0.7403686686959947;-0.007330382858376183;0 +0.7344345492392138;-0.01605702911834783;0 +0.7286749627076327;-0.02181661564992912;0 +0.7243116395776468;-0.03054326190990077;0 +0.7169812567192706;-0.03630284844148206;0 +0.7098254067860938;-0.04363323129985824;0 +0.7024950239277176;-0.04223696789826277;0 +0.7024950239277176;-0.05235987755982988;0 +0.6967354373961363;-0.062482787221397;0 +0.6908013179393555;-0.07278022980816354;0 +0.6864379948093697;-0.07993607974134029;0 +0.682074671679384;-0.08866272600131195;0 +0.6792821448761931;-0.09738937226128359;0 +0.6763150851478027;-0.1061160185212552;0 +0.6836454680061789;-0.1148426647812269;0 +0.6908013179393555;-0.1235693110411985;0 +0.6864379948093697;-0.1322959573011702;0 +0.6864379948093697;-0.1425933998879367;0 +0.6880087911361648;-0.1541125729510993;0 +0.6923721142661505;-0.1644100155378658;0 +0.6951646410693415;-0.1731366617978375;0 +0.7010987605261222;-0.1774999849278233;0 +0.7068583470577035;-0.1832595714594046;0 +0.7068583470577035;-0.1919862177193762;0 +0.7054620836561081;-0.2007128639793479;0 +0.7068583470577035;-0.2094395102393195;0 +0.7068583470577035;-0.2167698930976957;0 +0.7054620836561081;-0.2268928027592629;0 +0.7082546104592988;-0.2370157124208299;0 +0.7082546104592988;-0.2457423586808016;0 +0.7112216701876892;-0.2560398012675681;0 +0.7098254067860938;-0.2647664475275398;0 +0.7054620836561081;-0.2719222974607165;0 +0.6995279641993273;-0.2792526803190927;0 +0.693768377667746;-0.285012266850674;0 +0.6850417314077742;-0.2923426497090502;0 +0.6792821448761931;-0.2981022362406315;0 +0.667588438887831;-0.2996730325674264;0 +0.6602580560294549;-0.3024655593706173;0 +0.6515314097694832;-0.3054326190990077;0 +0.6457718232379019;-0.3127630019573839;0 +0.6400122367063207;-0.3199188518905606;0 +0.6326818538479444;-0.3286454981505322;0 +0.6253514709895682;-0.3316125578789226;0 +0.619591884457987;-0.3389429407372988;0 +0.6138322979264057;-0.3433062638672846;0 +0.6065019150680295;-0.3490658503988659;0 +0.605105651666434;-0.3577924966588375;0 +0.6108652381980153;-0.3635520831904188;0 +0.6138322979264057;-0.3738495257771854;0 +0.6166248247295966;-0.3853686988403479;0 +0.619591884457987;-0.3926990816987241;0 +0.619591884457987;-0.4028219913602912;0 +0.6181956210563916;-0.4101523742186675;0 +0.619591884457987;-0.4188790204786391;0 +0.6152285613280011;-0.4276056667386107;0 +0.6094689747964199;-0.4319689898685966;0 +0.6007423285364483;-0.434936049596987;0 +0.5890486225480862;-0.4392993727269727;0 +0.5832890360165049;-0.4420918995301636;0 +0.5745623897565333;-0.445058959258554;0 +0.5686282702997525;-0.4551818689201211;0 +0.5745623897565333;-0.4581489286485115;0 +0.5745623897565333;-0.4639085151800928;0 +0.5745623897565333;-0.471238898038469;0 +0.571595330028143;-0.4799655442984406;0 +0.5686282702997525;-0.4900884539600077;0 +0.5658357434965617;-0.4988151002199793;0 +0.5585053606381855;-0.5031784233499651;0 +0.5497787143782138;-0.5091125428067459;0 +0.5454153912482279;-0.5162683927399226;0 +0.5396558047166468;-0.5235987755982988;0 +0.5352924815866609;-0.5323254218582705;0 +0.5309291584566751;-0.5396558047166468;0 +0.5235987755982988;-0.5468116546498234;0 +0.5162683927399226;-0.5527457741066042;0 +0.5105088062083414;-0.5585053606381855;0 +0.5031784233499651;-0.5658357434965617;0 +0.5031784233499651;-0.5658357434965617;0 +0.4974188368183839;-0.571595330028143;0 +0.4900884539600077;-0.5759586531581288;0 +0.4799655442984406;-0.58171823968971;0 +0.4726351614400644;-0.5876523591464908;0 +0.4639085151800928;-0.5890486225480862;0 +0.4537856055185257;-0.5890486225480862;0 +0.4494222823885398;-0.5934119456780721;0 +0.4377285764001778;-0.5934119456780721;0 +0.4319689898685966;-0.5977752688080579;0 +0.4232423436086249;-0.5963790054064624;0 +0.4131194339470578;-0.5934119456780721;0 +0.4057890510886816;-0.5963790054064624;0 +0.3956661414271145;-0.5948082090796675;0 +0.3853686988403479;-0.5963790054064624;0 +0.3796091123087666;-0.6007423285364483;0 +0.3679154063204046;-0.6007423285364483;0 +0.3577924966588375;-0.6021385919380436;0 +0.3520329101272563;-0.6065019150680295;0 +0.3417354675404897;-0.6065019150680295;0 +0.334579617607313;-0.6007423285364483;0 +0.3272492347489368;-0.5948082090796675;0 +0.3214896482173555;-0.5977752688080579;0 +0.3214896482173555;-0.5904448859496816;0 +0.3185225884889651;-0.5832890360165049;0 +0.3111922056305889;-0.5729915934297384;0 +0.3155555287605747;-0.5729915934297384;0 +0.3199188518905606;-0.5686282702997525;0 +0.3185225884889651;-0.5585053606381855;0 +0.3127630019573839;-0.5483824509766184;0 +0.3068288825006031;-0.5410520681182421;0 +0.3024655593706173;-0.533721685259866;0 +0.2996730325674264;-0.5235987755982988;0 +0.2953097094374406;-0.5162683927399226;0 +0.2923426497090502;-0.5061454830783556;0 +0.2865830631774689;-0.4988151002199793;0 +0.2778564169174972;-0.4930555136883981;0 +0.2734930937875114;-0.4857251308300219;0 +0.2675589743307307;-0.4799655442984406;0 +0.2661627109291352;-0.471238898038469;0 +0.2631956512007449;-0.4611159883769019;0 +0.260403124397554;-0.4523893421169303;0 +0.2588323280707591;-0.445058959258554;0 +0.2588323280707591;-0.4363323129985824;0 +0.2544690049407732;-0.4262094033370153;0 +0.2530727415391778;-0.4188790204786391;0 +0.2530727415391778;-0.4101523742186675;0 +0.2516764781375823;-0.4000294645571004;0 +0.2530727415391778;-0.3926990816987241;0 +0.2501056818107875;-0.3853686988403479;0 +0.2429498318776107;-0.3782128489071713;0 +0.2399827721492203;-0.370882466048795;0 +0.234223185617639;-0.3635520831904188;0 +0.2312561258892487;-0.3534291735288517;0 +0.2254965393576674;-0.3447025272688801;0 +0.2211332162276816;-0.3359758810089085;0 +0.2167698930976957;-0.3286454981505322;0 +0.210835773640915;-0.322885911618951;0 +0.2064724505109292;-0.3127630019573839;0 +0.2050761871093337;-0.3040363556974122;0 +0.2050761871093337;-0.296705972839036;0 +0.2064724505109292;-0.2879793265790644;0 +0.2064724505109292;-0.2792526803190927;0 +0.210835773640915;-0.2705260340591211;0 +0.2124065699677099;-0.2617993877991494;0 +0.2151990967709008;-0.2530727415391778;0 +0.2181661564992912;-0.2429498318776107;0 +0.2211332162276816;-0.2326523892908441;0 +0.2268928027592629;-0.2254965393576674;0 +0.234223185617639;-0.2211332162276816;0 +0.2385865087476248;-0.2138028333693054;0 +0.2413790355508158;-0.2064724505109292;0 +0.2429498318776107;-0.1963495408493621;0 +0.2413790355508158;-0.1862266311877949;0 +0.2370157124208299;-0.1802925117310143;0 +0.2326523892908441;-0.1731366617978375;0 +0.2298598624876532;-0.1644100155378658;0 +0.2268928027592629;-0.16004669240788;0 +0.234223185617639;-0.1513200461479084;0 +0.2312561258892487;-0.1425933998879367;0 +0.2268928027592629;-0.1352630170295605;0 +0.2254965393576674;-0.1265363707695889;0 +0.2211332162276816;-0.1178097245096172;0 +0.2167698930976957;-0.112050137978036;0 +0.2151990967709008;-0.1047197551196598;0 +0.2124065699677099;-0.1003564319896739;0 +0.2124065699677099;-0.09302604913129776;0 +0.2080432468377241;-0.08587019919812101;0 +0.2021091273809433;-0.07853981633974483;0 +0.1977458042509575;-0.07120943348136864;0 +0.1919862177193762;-0.06544984694978735;0 +0.1862266311877949;-0.05969026041820607;0 +0.1802925117310143;-0.05375614096142535;0 +0.1715658654710426;-0.04799655442984406;0 +0.1658062789394613;-0.03926990816987241;0 +0.16004669240788;-0.03193952531149623;0 +0.1570796326794897;-0.02321287905152459;0 +0.1527163095495038;-0.01448623279155293;0 +0.1614429558094755;-0.008726646259971648;0 +0.1628392192110709;0;0 +0.1628392192110709;0;0 +0.1628392192110709;0.008726646259971648;0 +0.1672025423410568;0.01605702911834783;0 +0.1614429558094755;0.01884955592153876;0 +0.1658062789394613;0.02617993877991494;0 +0.1687733386678517;0.03351032163829112;0 +0.1701696020694471;0.04363323129985824;0 +0.1731366617978375;0.05375614096142535;0 +0.1672025423410568;0.06108652381980154;0 +0.1628392192110709;0.06841690667817771;0 +0.1556833692778942;0.06981317007977318;0 +0.1541125729510993;0.07853981633974483;0 +0.1469567230179225;0.07853981633974483;0 +0.1396263401595464;0.07714355293814937;0 +0.1308996938995747;0.07714355293814937;0 +0.1221730476396031;0.07557275661135446;0 +0.1134464013796314;0.07417649320975901;0 +0.1047197551196598;0.07417649320975901;0 +0.09459684545809266;0.07993607974134029;0 +0.0916297857297023;0.0916297857297023;0 +0.08726646259971647;0.1033234917180643;0 +0.07853981633974483;0.1104793416512411;0 +0.06981317007977318;0.1134464013796314;0 +0.05969026041820607;0.1134464013796314;0 +0.04939281783143952;0.112050137978036;0 +0.04066617157146788;0.112050137978036;0 +0.04066617157146788;0.112050137978036;0 +0.03193952531149623;0.1104793416512411;0 +0.02181661564992912;0.1076868148480501;0 +0.0174532925199433;0.1017526953912694;0 +0.005759586531581288;0.1017526953912694;0 +-0.004363323129985824;0.09599310885968812;0 +-0.01169370598836201;0.0916297857297023;0 +-0.01884955592153876;0.09023352232810683;0 +-0.02757620218151041;0.08726646259971647;0 +-0.03490658503988659;0.08290313946973064;0 +-0.0450294947014537;0.08726646259971647;0 +-0.05375614096142535;0.08866272600131195;0 +-0.06684611035138281;0.0916297857297023;0 +-0.07557275661135446;0.0916297857297023;0 +-0.08290313946973064;0.09023352232810683;0 +-0.09302604913129776;0.08866272600131195;0 +-0.1033234917180643;0.08726646259971647;0 +-0.1104793416512411;0.0815068760681352;0 +-0.1207767842380076;0.07993607974134029;0 +-0.1295034304979792;0.07417649320975901;0 +-0.136659280431156;0.07557275661135446;0 +-0.1453859266911277;0.07853981633974483;0 +-0.1556833692778942;0.08587019919812101;0 +-0.1644100155378658;0.0916297857297023;0 +-0.1715658654710426;0.09738937226128359;0 +-0.1802925117310143;0.1061160185212552;0 +-0.1919862177193762;0.112050137978036;0 +-0.1993166005777524;0.1192059879112127;0 +-0.2080432468377241;0.1235693110411985;0 +-0.2167698930976957;0.1279326341711844;0 +-0.2254965393576674;0.136659280431156;0 +-0.2282890661608583;0.1439896632895322;0 +-0.2298598624876532;0.1513200461479084;0 +-0.2312561258892487;0.16004669240788;0 +-0.2370157124208299;0.1672025423410568;0 +-0.2443460952792061;0.1745329251994329;0 +-0.2516764781375823;0.1788962483294187;0 +-0.2560398012675681;0.1862266311877949;0 +-0.2617993877991494;0.1933824811209717;0 +-0.2691297706575256;0.1963495408493621;0 +-0.2705260340591211;0.2080432468377241;0 +-0.2778564169174972;0.2064724505109292;0 +-0.285012266850674;0.210835773640915;0 +-0.2923426497090502;0.2151990967709008;0 +-0.2923426497090502;0.2254965393576674;0 +-0.2909463863074548;0.234223185617639;0 +-0.2923426497090502;0.2443460952792061;0 +-0.296705972839036;0.2530727415391778;0 +-0.3040363556974122;0.2574360646691636;0 +-0.296705972839036;0.2617993877991494;0 +-0.2923426497090502;0.2691297706575256;0 +-0.2865830631774689;0.2762856205907024;0 +-0.2865830631774689;0.2879793265790644;0 +-0.2836160034490786;0.296705972839036;0 +-0.2806489437206882;0.3054326190990077;0 +-0.2792526803190927;0.3141592653589793;0 +-0.2792526803190927;0.322885911618951;0 +-0.2822197400474831;0.3316125578789226;0 +-0.2879793265790644;0.3403392041388942;0 +-0.2822197400474831;0.3460987906704755;0 +-0.2822197400474831;0.3548254369304472;0 +-0.2893755899806598;0.3621558197888234;0 +-0.296705972839036;0.3679154063204046;0 +-0.2953097094374406;0.3766420525803763;0 +-0.2937389131106456;0.3853686988403479;0 +-0.2879793265790644;0.3897320219703337;0 +-0.2836160034490786;0.39706240482871;0 +-0.2792526803190927;0.408756110817072;0 +-0.2748893571891069;0.4159119607502487;0 +-0.2691297706575256;0.4232423436086249;0 +-0.2617993877991494;0.4305727264670011;0 +-0.2574360646691636;0.4406956361285682;0 +-0.2544690049407732;0.4480260189869444;0 +-0.2516764781375823;0.456752665246916;0 +-0.2473131550075965;0.4611159883769019;0 +-0.2385865087476248;0.4654793115068877;0 +-0.234223185617639;0.471238898038469;0 +-0.2312561258892487;0.4799655442984406;0 +-0.2254965393576674;0.4872959271568168;0 +-0.2124065699677099;0.4886921905584123;0 +-0.2007128639793479;0.4930555136883981;0 +-0.1949532774477666;0.5003858965467743;0 +-0.1846558348610001;0.5047492196767601;0 +-0.1774999849278233;0.5119050696099369;0 +-0.1715658654710426;0.519235452468313;0 +-0.1672025423410568;0.5293583621298801;0 +-0.1715658654710426;0.5352924815866609;0 +-0.1715658654710426;0.5497787143782138;0 +-0.1658062789394613;0.5541420375081997;0 +-0.1614429558094755;0.5614724203665757;0 +-0.1614429558094755;0.5672320068981571;0 +-0.1541125729510993;0.5729915934297384;0 +-0.148352986419518;0.5803219762881145;0 +-0.1396263401595464;0.5846852994181003;0 +-0.1295034304979792;0.5876523591464908;0 +-0.1192059879112127;0.5934119456780721;0 +-0.1148426647812269;0.6007423285364483;0 +-0.1104793416512411;0.6078981784696249;0 +-0.1076868148480501;0.6152285613280011;0 +-0.1033234917180643;0.6239552075879728;0 +-0.1033234917180643;0.6239552075879728;0 +-0.09459684545809266;0.6253514709895682;0 +-0.09023352232810683;0.619591884457987;0 +-0.07853981633974483;0.6138322979264057;0 +-0.07120943348136864;0.6152285613280011;0 +-0.05969026041820607;0.6152285613280011;0 +-0.05235987755982988;0.6166248247295966;0 +-0.04223696789826277;0.6122615015996108;0 +-0.03351032163829112;0.6138322979264057;0 +-0.02181661564992912;0.6181956210563916;0 +-0.0174532925199433;0.6239552075879728;0 +-0.008726646259971648;0.6253514709895682;0 +0;0.6269222673163631;0 +0.008726646259971648;0.6326818538479444;0 +0.0174532925199433;0.6370451769779303;0 +0.03054326190990077;0.6384414403795257;0 +0.04223696789826277;0.6400122367063207;0 +0.05096361415823442;0.6428047635095115;0 +0.05969026041820607;0.6428047635095115;0 +0.06684611035138281;0.6443755598363065;0 +0.07714355293814937;0.6443755598363065;0 +0.08726646259971647;0.6428047635095115;0 +0.09302604913129776;0.6400122367063207;0 +0.1017526953912694;0.6414085001079162;0 +0.1090830782496456;0.6457718232379019;0 +0.1221730476396031;0.6428047635095115;0 +0.1295034304979792;0.6457718232379019;0 +0.1425933998879367;0.6428047635095115;0 +0.1513200461479084;0.6443755598363065;0 +0.1584758960810851;0.6487388829662923;0 +0.1672025423410568;0.6501351463678877;0 +0.1759291886010284;0.6487388829662923;0 +0.1802925117310143;0.6400122367063207;0 +0.1919862177193762;0.6443755598363065;0 +0.1876228945893904;0.6370451769779303;0 +0.1818633080578091;0.6340781172495399;0 +0.1846558348610001;0.6239552075879728;0 +0.1905899543177808;0.6209881478595823;0 +0.1919862177193762;0.6138322979264057;0 +0.1876228945893904;0.6065019150680295;0 +0.1802925117310143;0.6007423285364483;0 +0.1745329251994329;0.5963790054064624;0 +0.1759291886010284;0.5890486225480862;0 +0.1832595714594046;0.5860815628196958;0 +0.1905899543177808;0.5876523591464908;0 +0.1933824811209717;0.5803219762881145;0 +0.2036799237077382;0.5759586531581288;0 +0.2124065699677099;0.5729915934297384;0 +0.2239257430308725;0.5729915934297384;0 +0.2370157124208299;0.571595330028143;0 +0.2473131550075965;0.5701990666265475;0 +0.2574360646691636;0.5658357434965617;0 +0.2675589743307307;0.5628686837681712;0 +0.2675589743307307;0.5541420375081997;0 +0.2719222974607165;0.5497787143782138;0 +0.2806489437206882;0.5454153912482279;0 +0.2909463863074548;0.5440191278466325;0 +0.3054326190990077;0.5410520681182421;0 +0.3171263250873697;0.5352924815866609;0 +0.3258529713473414;0.5293583621298801;0 +0.334579617607313;0.5279620987282847;0 +0.3417354675404897;0.5309291584566751;0 +0.3476695869972705;0.5352924815866609;0 +0.3504621138004613;0.5424483315198376;0 +0.3490658503988659;0.5497787143782138;0 +0.3460987906704755;0.5555383009097951;0 +0.3504621138004613;0.5614724203665757;0 +0.360759556387228;0.5686282702997525;0 +0.370882466048795;0.571595330028143;0 +0.3810053757103621;0.5729915934297384;0 +0.3926990816987241;0.571595330028143;0 +0.4028219913602912;0.5686282702997525;0 +0.4043927876870862;0.5614724203665757;0 +0.4145156973486533;0.5599016240397809;0 +0.4246386070102203;0.55710909723659;0 +0.434936049596987;0.55710909723659;0 +0.4392993727269727;0.5497787143782138;0 +0.4494222823885398;0.5511749777798092;0 +0.4595451920501069;0.5497787143782138;0 +0.4698426346368736;0.5483824509766184;0 +0.4769984845700502;0.5454153912482279;0 +0.4857251308300219;0.5424483315198376;0 +0.4960225734167885;0.5424483315198376;0 +0.5061454830783556;0.5380850083898517;0 +0.5148721293383272;0.5396558047166468;0 +0.5235987755982988;0.5440191278466325;0 +0.533721685259866;0.5483824509766184;0 +0.5440191278466325;0.5497787143782138;0 +0.5555383009097951;0.5483824509766184;0 +0.5541420375081997;0.5424483315198376;0 +0.5614724203665757;0.5396558047166468;0 +0.5642649471697667;0.5454153912482279;0 +0.5701990666265475;0.5410520681182421;0 +0.5803219762881145;0.5424483315198376;0 +0.5934119456780721;0.5440191278466325;0 +0.5991715322096532;0.5497787143782138;0 +0.605105651666434;0.5585053606381855;0 +0.6078981784696249;0.5672320068981571;0 +0.6108652381980153;0.5759586531581288;0 +0.6152285613280011;0.5846852994181003;0 +0.6152285613280011;0.5846852994181003;0 +0.619591884457987;0.5948082090796675;0 +0.6253514709895682;0.6021385919380436;0 +0.6239552075879728;0.6108652381980153;0 +0.6239552075879728;0.6225589441863774;0 +0.6269222673163631;0.6283185307179586;0 +0.6239552075879728;0.6340781172495399;0 +0.6297147941195541;0.6400122367063207;0 +0.6283185307179586;0.6443755598363065;0 +0.619591884457987;0.6384414403795257;0 +0.6138322979264057;0.6384414403795257;0 +0.6021385919380436;0.6428047635095115;0 +0.5948082090796675;0.6370451769779303;0 +0.5860815628196958;0.631285590446349;0 +0.5789257128865191;0.631285590446349;0 +0.571595330028143;0.6283185307179586;0 +0.5628686837681712;0.631285590446349;0 +0.5585053606381855;0.6370451769779303;0 +0.5454153912482279;0.6414085001079162;0 +0.5352924815866609;0.6428047635095115;0 +0.5323254218582705;0.6356489135763349;0 +0.519235452468313;0.631285590446349;0 +0.5105088062083414;0.6340781172495399;0 +0.4988151002199793;0.6414085001079162;0 +0.4886921905584123;0.6414085001079162;0 +0.4916592502868026;0.6457718232379019;0 +0.482932604026831;0.6457718232379019;0 +0.4742059577668594;0.6457718232379019;0 +0.4799655442984406;0.6515314097694832;0 +0.4726351614400644;0.655894732899469;0 +0.4742059577668594;0.6618288523562498;0 +0.4668755749084831;0.6646213791594406;0 +0.4581489286485115;0.667588438887831;0 +0.4595451920501069;0.6733480254194123;0 +0.4654793115068877;0.6689847022894264;0 +0.4698426346368736;0.6705554986162214;0 +0.4668755749084831;0.6749188217462072;0 +0.4654793115068877;0.6850417314077742;0 +0.4682718383100786;0.6894050545377601;0 +0.4537856055185257;0.6880087911361648;0 +0.456752665246916;0.6981317007977318;0 +0.4639085151800928;0.7038912873293131;0 +0.4742059577668594;0.7038912873293131;0 +0.4843288674284265;0.7038912873293131;0 +0.4960225734167885;0.7038912873293131;0 +0.5061454830783556;0.7038912873293131;0 +0.5047492196767601;0.7082546104592988;0 +0.5134758659367318;0.7098254067860938;0 +0.5031784233499651;0.715584993317675;0 +0.4916592502868026;0.715584993317675;0 +0.4785692808968452;0.7141887299160796;0 +0.4726351614400644;0.7098254067860938;0 +0.4639085151800928;0.7038912873293131;0 +0.456752665246916;0.6981317007977318;0 +0.456752665246916;0.7024950239277176;0 +0.4639085151800928;0.7082546104592988;0 +0.4551818689201211;0.7068583470577035;0 +0.4494222823885398;0.7126179335892847;0 +0.4392993727269727;0.7141887299160796;0 +0.4319689898685966;0.7126179335892847;0 +0.4232423436086249;0.7141887299160796;0 +0.4188790204786391;0.7098254067860938;0 +0.4101523742186675;0.7098254067860938;0 +0.4145156973486533;0.7054620836561081;0 +0.4115486376202628;0.7010987605261222;0 +0.4028219913602912;0.7010987605261222;0 +0.3940953451003196;0.7082546104592988;0 +0.3926990816987241;0.6981317007977318;0 +0.3984586682303054;0.6908013179393555;0 +0.4043927876870862;0.6850417314077742;0 +0.407185314490277;0.6792821448761931;0 +0.4131194339470578;0.6749188217462072;0 +0.4202752838802346;0.6719517620178169;0 +0.4218460802070295;0.6661921754862357;0 +0.4290019301402062;0.6632251157578452;0 +0.4188790204786391;0.6661921754862357;0 +0.4188790204786391;0.655894732899469;0 +0.4101523742186675;0.6618288523562498;0 +0.4000294645571004;0.6632251157578452;0 +0.3940953451003196;0.6689847022894264;0 +0.3810053757103621;0.667588438887831;0 +0.3679154063204046;0.6689847022894264;0 +0.360759556387228;0.6763150851478027;0 +0.3548254369304472;0.6850417314077742;0 +0.3504621138004613;0.6908013179393555;0 +0.3447025272688801;0.6981317007977318;0 +0.3373721444105038;0.7024950239277176;0 +0.3373721444105038;0.7112216701876892;0 +0.3389429407372988;0.7213445798492564;0 +0.3403392041388942;0.7286749627076327;0 +0.3316125578789226;0.7330382858376184;0 +0.322885911618951;0.7387978723691996;0 +0.3127630019573839;0.7431611954991855;0 +0.3024655593706173;0.7504915783575616;0 +0.2893755899806598;0.7578219612159379;0 +0.2792526803190927;0.7592182246175333;0 +0.2748893571891069;0.7635815477475191;0 +0.2647664475275398;0.767944870877505;0 +0.2647664475275398;0.7737044574090862;0 +0.260403124397554;0.7780677805390721;0 +0.260403124397554;0.7780677805390721;0 +0.2588323280707591;0.7853981633974483;0 +0.2473131550075965;0.7911577499290294;0 +0.2457423586808016;0.7853981633974483;0 +0.2399827721492203;0.7824311036690579;0 +0.2356194490192345;0.7867944267990437;0 +0.234223185617639;0.7927285462558246;0 +0.2370157124208299;0.7970918693858103;0 +0.2282890661608583;0.7984881327874057;0 +0.2195624199008867;0.7941248096574199;0 +0.2124065699677099;0.7941248096574199;0 +0.210835773640915;0.7883652231258387;0 +0.2151990967709008;0.7840018999958529;0 +0.2124065699677099;0.7780677805390721;0 +0.2138028333693054;0.7723081940074908;0 +0.2211332162276816;0.7665486074759096;0 +0.2282890661608583;0.7621852843459237;0 +0.2370157124208299;0.7578219612159379;0 +0.2413790355508158;0.7504915783575616;0 +0.2429498318776107;0.7431611954991855;0 +0.2473131550075965;0.7387978723691996;0 +0.2560398012675681;0.7344345492392138;0 +0.2661627109291352;0.730071226109228;0 +0.2806489437206882;0.730071226109228;0 +0.2762856205907024;0.7243116395776468;0 +0.285012266850674;0.7213445798492564;0 +0.2953097094374406;0.7169812567192706;0 +0.3040363556974122;0.7126179335892847;0 +0.3127630019573839;0.7082546104592988;0 +0.3214896482173555;0.7010987605261222;0 +0.3185225884889651;0.6951646410693415;0 +0.3127630019573839;0.6967354373961363;0 +0.3111922056305889;0.7024950239277176;0 +0.3024655593706173;0.7038912873293131;0 +0.2953097094374406;0.7068583470577035;0 +0.2909463863074548;0.7010987605261222;0 +0.2879793265790644;0.6923721142661505;0 +0.296705972839036;0.6880087911361648;0 +0.296705972839036;0.6806784082777885;0 +0.2879793265790644;0.6777113485493982;0 +0.2879793265790644;0.6705554986162214;0 +0.2822197400474831;0.6661921754862357;0 +0.2792526803190927;0.6618288523562498;0 +0.2734930937875114;0.6618288523562498;0 +0.2734930937875114;0.6661921754862357;0 +0.2762856205907024;0.6733480254194123;0 +0.2806489437206882;0.6777113485493982;0 +0.2792526803190927;0.6850417314077742;0 +0.2748893571891069;0.6923721142661505;0 +0.2734930937875114;0.6981317007977318;0 +0.2617993877991494;0.7010987605261222;0 +0.2574360646691636;0.7082546104592988;0 +0.2516764781375823;0.7098254067860938;0 +0.2443460952792061;0.7141887299160796;0 +0.2370157124208299;0.7199483164476609;0 +0.2254965393576674;0.7199483164476609;0 +0.2167698930976957;0.7243116395776468;0 +0.2094395102393195;0.7316420224360229;0 +0.2007128639793479;0.7387978723691996;0 +0.1919862177193762;0.7387978723691996;0 +0.1905899543177808;0.7447319918259805;0 +0.1818633080578091;0.751887841759157;0 +0.1774999849278233;0.7592182246175333;0 +0.1759291886010284;0.767944870877505;0 +0.1658062789394613;0.7693411342791004;0 +0.16004669240788;0.7723081940074908;0 +0.1513200461479084;0.7737044574090862;0 +0.1439896632895322;0.7709119306058954;0 +0.1396263401595464;0.7649778111491147;0 +0.1295034304979792;0.7621852843459237;0 +0.1192059879112127;0.7578219612159379;0 +0.112050137978036;0.751887841759157;0 +0.1017526953912694;0.7504915783575616;0 +0.0916297857297023;0.7548549014875475;0 +0.07993607974134029;0.756251164889143;0 +0.06981317007977318;0.7592182246175333;0 +0.062482787221397;0.7548549014875475;0 +0.05235987755982988;0.7504915783575616;0 +0.05375614096142535;0.7417649320975901;0 +0.05532693728822025;0.7316420224360229;0 +0.0466002910282486;0.7272786993060371;0 +0.03630284844148206;0.7213445798492564;0 +0.02617993877991494;0.7185520530460655;0 +0.0174532925199433;0.715584993317675;0 +0.008726646259971648;0.7054620836561081;0 +0;0.6967354373961363;0 +-0.005759586531581288;0.6894050545377601;0 +-0.004363323129985824;0.682074671679384;0 +0.004363323129985824;0.6763150851478027;0 +-0.005759586531581288;0.6705554986162214;0 +-0.01169370598836201;0.6646213791594406;0 +-0.01448623279155293;0.657465529226264;0 +-0.02321287905152459;0.657465529226264;0 +-0.03193952531149623;0.6487388829662923;0 +-0.03787364476827695;0.6414085001079162;0 +-0.04799655442984406;0.6414085001079162;0 +-0.05811946409141117;0.6414085001079162;0 +-0.06841690667817771;0.6414085001079162;0 +-0.07853981633974483;0.6400122367063207;0 +-0.08726646259971647;0.6370451769779303;0 +-0.08726646259971647;0.6370451769779303;0 +-0.09599310885968812;0.6297147941195541;0 +-0.1047197551196598;0.6326818538479444;0 +-0.1104793416512411;0.6414085001079162;0 +-0.1134464013796314;0.6457718232379019;0 +-0.1221730476396031;0.6501351463678877;0 +-0.1295034304979792;0.6501351463678877;0 +-0.136659280431156;0.6471680866394973;0 +-0.1453859266911277;0.6487388829662923;0 +-0.1556833692778942;0.6471680866394973;0 +-0.1527163095495038;0.6544984694978736;0 +-0.1527163095495038;0.6632251157578452;0 +-0.1513200461479084;0.6719517620178169;0 +-0.1584758960810851;0.6719517620178169;0 +-0.1628392192110709;0.6777113485493982;0 +-0.1614429558094755;0.6864379948093697;0 +-0.1556833692778942;0.6923721142661505;0 +-0.1541125729510993;0.7024950239277176;0 +-0.1513200461479084;0.7112216701876892;0 +-0.1497492498211135;0.7185520530460655;0 +-0.1527163095495038;0.7272786993060371;0 +-0.1541125729510993;0.7330382858376184;0 +-0.1527163095495038;0.7403686686959947;0 +-0.16004669240788;0.7504915783575616;0 +-0.1556833692778942;0.7548549014875475;0 +-0.1453859266911277;0.756251164889143;0 +-0.1396263401595464;0.7635815477475191;0 +-0.1265363707695889;0.7592182246175333;0 +-0.1148426647812269;0.7592182246175333;0 +-0.1017526953912694;0.7606144880191288;0 +-0.08866272600131195;0.7592182246175333;0 +-0.07714355293814937;0.756251164889143;0 +-0.062482787221397;0.7592182246175333;0 +-0.04799655442984406;0.7578219612159379;0 +-0.03787364476827695;0.756251164889143;0 +-0.0291469985083053;0.7578219612159379;0 +-0.02478367537831948;0.7621852843459237;0 +-0.02181661564992912;0.7723081940074908;0 +-0.02042035224833365;0.7796385768658669;0 +-0.01884955592153876;0.7897614865274341;0 +-0.0174532925199433;0.7998843961890013;0 +-0.02181661564992912;0.8072147790473774;0 +-0.03054326190990077;0.8115781021773631;0 +-0.03490658503988659;0.8159414253073491;0 +-0.03351032163829112;0.8203047484373349;0 +-0.04066617157146788;0.8260643349689161;0 +-0.04363323129985824;0.8290313946973066;0 +-0.05532693728822025;0.830427658098902;0 +-0.06544984694978735;0.8347909812288877;0 +-0.07417649320975901;0.8347909812288877;0 +-0.0815068760681352;0.8377580409572781;0 +-0.08290313946973064;0.8464846872172498;0 +-0.07278022980816354;0.8478809506188453;0 +-0.06405358354819189;0.8508480103472356;0 +-0.05235987755982988;0.8522442737488312;0 +-0.0466002910282486;0.8464846872172498;0 +-0.03490658503988659;0.8478809506188453;0 +-0.02478367537831948;0.8478809506188453;0 +-0.02757620218151041;0.8581783932056118;0 +-0.03351032163829112;0.8669050394655835;0 +-0.02321287905152459;0.8669050394655835;0 +-0.01884955592153876;0.8595746566072072;0 +-0.01012290966156711;0.8609709200088027;0 +0;0.8595746566072072;0 +0.002967059728390361;0.8669050394655835;0 +0.01012290966156711;0.8696975662687744;0 +0.01884955592153876;0.8712683625955693;0 +0.02617993877991494;0.8740608893987601;0 +0.02757620218151041;0.8813912722571364;0 +0.03054326190990077;0.8871508587887176;0 +0.04066617157146788;0.890117918517108;0 +0.05235987755982988;0.8944812416470939;0 +0.062482787221397;0.8974483013754843;0 +0.06981317007977318;0.9032078879070654;0 +0.07557275661135446;0.9089674744386468;0 +0.07993607974134029;0.9149015938954275;0 +0.08290313946973064;0.9220574438286042;0 +0.08866272600131195;0.9236282401553992;0 +0.08866272600131195;0.9149015938954275;0 +0.09599310885968812;0.9119345341670372;0 +0.1033234917180643;0.9162978572970231;0 +0.1033234917180643;0.9206611804270088;0 +0.09599310885968812;0.9220574438286042;0 +0.09599310885968812;0.9293878266869805;0 +0.1061160185212552;0.9323548864153709;0 +0.1221730476396031;0.9323548864153709;0 +0.1279326341711844;0.9367182095453567;0 +0.1396263401595464;0.9367182095453567;0 +0.148352986419518;0.9337511498169663;0 +0.1497492498211135;0.9395107363485476;0 +0.1570796326794897;0.9438740594785334;0 +0.1513200461479084;0.9482373826085192;0 +0.1570796326794897;0.9512044423369095;0 +0.1513200461479084;0.9569640288684909;0 +0.1513200461479084;0.9656906751284625;0 +0.1425933998879367;0.9700539982584483;0 +0.1410226035611418;0.9773843811168246;0 +0.1410226035611418;0.9861110273767961;0 +0.1439896632895322;0.9918706139083775;0 +0.1513200461479084;0.9962339370383633;0 +0.1513200461479084;0.9962339370383633;0 +0.1644100155378658;0.9978047333651582;0 +0.1715658654710426;1.003564319896739;0 +0.1832595714594046;1.004960583298335;0 +0.1832595714594046;0.9992009967667536;0 +0.1788962483294187;0.9918706139083775;0 +0.1788962483294187;0.9861110273767961;0 +0.1890191579909859;0.9861110273767961;0 +0.1890191579909859;0.980351440845215;0 +0.1774999849278233;0.9773843811168246;0 +0.1701696020694471;0.9686577348568529;0 +0.1644100155378658;0.9599310885968813;0 +0.1745329251994329;0.9555677654668955;0 +0.1745329251994329;0.9512044423369095;0 +0.1905899543177808;0.9468411192069237;0 +0.1876228945893904;0.9410815326753426;0 +0.1977458042509575;0.9410815326753426;0 +0.2064724505109292;0.9454448558053283;0 +0.2138028333693054;0.9482373826085192;0 +0.2254965393576674;0.9498081789353141;0 +0.2326523892908441;0.9541715020653;0 +0.2385865087476248;0.9482373826085192;0 +0.2312561258892487;0.9454448558053283;0 +0.2413790355508158;0.9424777960769379;0 +0.2501056818107875;0.9410815326753426;0 +0.2647664475275398;0.9454448558053283;0 +0.2792526803190927;0.9468411192069237;0 +0.2909463863074548;0.9526007057385051;0 +0.3054326190990077;0.9555677654668955;0 +0.3199188518905606;0.9569640288684909;0 +0.3258529713473414;0.9482373826085192;0 +0.3359758810089085;0.9482373826085192;0 +0.3447025272688801;0.9512044423369095;0 +0.3490658503988659;0.9585348251952858;0 +0.3621558197888234;0.9628981483252715;0 +0.3679154063204046;0.9716247945852433;0 +0.3665191429188092;0.980351440845215;0 +0.3665191429188092;0.9904743505067819;0 +0.3722787294503905;0.9962339370383633;0 +0.3782128489071713;1.004960583298335;0 +0.3913028182971287;1.00653137962513;0 +0.4000294645571004;1.002168056495144;0 +0.4057890510886816;0.9962339370383633;0 +0.4159119607502487;0.9948376736367678;0 +0.4246386070102203;0.9992009967667536;0 +0.4246386070102203;1.007927643026725;0 +0.4246386070102203;1.016654289286697;0 +0.4145156973486533;1.018050552688292;0 +0.4101523742186675;1.025380935546669;0 +0.4101523742186675;1.032711318405045;0 +0.4218460802070295;1.037074641535031;0 +0.4363323129985824;1.038470904936626;0 +0.4523893421169303;1.039867168338221;0 +0.4682718383100786;1.037074641535031;0 +0.4872959271568168;1.037074641535031;0 +0.4944517770899935;1.041437964665016;0 +0.5091125428067459;1.047197551196598;0 +0.5265658353266892;1.044230491468207;0 +0.519235452468313;1.051560874326584;0 +0.507541746479951;1.050164610924988;0 +0.4944517770899935;1.057320460858165;0 +0.4742059577668594;1.057320460858165;0 +0.4581489286485115;1.054527934054974;0 +0.4420918995301636;1.051560874326584;0 +0.4262094033370153;1.048593814598193;0 +0.4101523742186675;1.047197551196598;0 +0.3940953451003196;1.050164610924988;0 +0.3853686988403479;1.054527934054974;0 +0.3722787294503905;1.05889125718496;0 +0.3722787294503905;1.064650843716541;0 +0.3782128489071713;1.073377489976513;0 +0.370882466048795;1.082104136236484;0 +0.3694862026471996;1.090830782496456;0 +0.3766420525803763;1.099557428756428;0 +0.3913028182971287;1.106887811614804;0 +0.4057890510886816;1.115614457874776;0 +0.4202752838802346;1.122770307807952;0 +0.4305727264670011;1.131496954067924;0 +0.4420918995301636;1.134464013796314;0 +0.4420918995301636;1.143190660056286;0 +0.4276056667386107;1.148950246587867;0 +0.4159119607502487;1.147553983186272;0 +0.4043927876870862;1.147553983186272;0 +0.3913028182971287;1.148950246587867;0 +0.3839724354387525;1.143190660056286;0 +0.3738495257771854;1.140223600327895;0 +0.3752457891787808;1.13586027719791;0 +0.3665191429188092;1.130100690666328;0 +0.3782128489071713;1.125737367536342;0 +0.3665191429188092;1.119977781004761;0 +0.360759556387228;1.114043661547981;0 +0.3460987906704755;1.109680338417995;0 +0.334579617607313;1.105317015288009;0 +0.3214896482173555;1.099557428756428;0 +0.3097959422289935;1.090830782496456;0 +0.3040363556974122;1.08646745936647;0 +0.3024655593706173;1.077740813106498;0 +0.2996730325674264;1.069014166846527;0 +0.3010692959690218;1.061683783988151;0 +0.3127630019573839;1.055924197456569;0 +0.3127630019573839;1.055924197456569;0 +0.3242821750205464;1.050164610924988;0 +0.3286454981505322;1.044230491468207;0 +0.3242821750205464;1.039867168338221;0 +0.3141592653589793;1.035503845208236;0 +0.3199188518905606;1.032711318405045;0 +0.3068288825006031;1.028347995275059;0 +0.2937389131106456;1.022413875818278;0 +0.2909463863074548;1.016654289286697;0 +0.2909463863074548;1.007927643026725;0 +0.2879793265790644;1.000597260168349;0 +0.285012266850674;0.9904743505067819;0 +0.2778564169174972;0.980351440845215;0 +0.2675589743307307;0.980351440845215;0 +0.2560398012675681;0.980351440845215;0 +0.2473131550075965;0.9730210579868387;0 +0.2487094184091919;0.9672614714552574;0 +0.2385865087476248;0.9672614714552574;0 +0.2268928027592629;0.9672614714552574;0 +0.2268928027592629;0.9730210579868387;0 +0.2211332162276816;0.980351440845215;0 +0.2254965393576674;0.9861110273767961;0 +0.2151990967709008;0.9934414102351724;0 +0.2094395102393195;1.002168056495144;0 +0.2036799237077382;1.012290966156711;0 +0.1977458042509575;1.021017612416683;0 +0.1933824811209717;1.03114052207825;0 +0.1846558348610001;1.035503845208236;0 +0.1788962483294187;1.029744258676654;0 +0.1701696020694471;1.029744258676654;0 +0.1570796326794897;1.022413875818278;0 +0.148352986419518;1.016654289286697;0 +0.1338667536279651;1.012290966156711;0 +0.1192059879112127;1.013687229558307;0 +0.1047197551196598;1.018050552688292;0 +0.09738937226128359;1.022413875818278;0 +0.09896016858807849;1.029744258676654;0 +0.1076868148480501;1.035503845208236;0 +0.09459684545809266;1.03410758180664;0 +0.0916297857297023;1.039867168338221;0 +0.09738937226128359;1.045801287795002;0 +0.08866272600131195;1.052957137728179;0 +0.08726646259971647;1.060287520586555;0 +0.08429940287132612;1.067617903444931;0 +0.0916297857297023;1.073377489976513;0 +0.08587019919812101;1.079137076508094;0 +0.09896016858807849;1.085071195964875;0 +0.1104793416512411;1.090830782496456;0 +0.1221730476396031;1.098161165354832;0 +0.1396263401595464;1.099557428756428;0 +0.148352986419518;1.105317015288009;0 +0.1556833692778942;1.112647398146385;0 +0.1658062789394613;1.108284075016399;0 +0.1759291886010284;1.115614457874776;0 +0.1862266311877949;1.122770307807952;0 +0.1977458042509575;1.133067750394719;0 +0.2124065699677099;1.1388273369263;0 +0.2195624199008867;1.147553983186272;0 +0.2268928027592629;1.154884366044648;0 +0.2326523892908441;1.162040215977824;0 +0.2413790355508158;1.169370598836201;0 +0.2560398012675681;1.176700981694577;0 +0.2617993877991494;1.183856831627754;0 +0.2822197400474831;1.192583477887725;0 +0.2617993877991494;1.19118721448613;0 +0.2443460952792061;1.189790951084534;0 +0.2254965393576674;1.183856831627754;0 +0.2385865087476248;1.19118721448613;0 +0.2617993877991494;1.19415427421452;0 +0.2516764781375823;1.198517597344506;0 +0.2675589743307307;1.202880920474492;0 +0.2822197400474831;1.208640507006073;0 +0.2778564169174972;1.199913860746102;0 +0.2893755899806598;1.204277183876087;0 +0.2909463863074548;1.198517597344506;0 +0.3068288825006031;1.204277183876087;0 +0.296705972839036;1.205673447277683;0 +0.296705972839036;1.211607566734464;0 +0.3155555287605747;1.214400093537654;0 +0.3302162944773271;1.223126739797626;0 +0.3520329101272563;1.223126739797626;0 +0.3752457891787808;1.226093799526016;0 +0.3897320219703337;1.233424182384393;0 +0.407185314490277;1.237787505514379;0 +0.4232423436086249;1.233424182384393;0 +0.433365253270192;1.239183768915974;0 +0.4480260189869444;1.242150828644364;0 +0.4464552226601495;1.231853386057598;0 +0.4639085151800928;1.237787505514379;0 +0.4682718383100786;1.230457122656002;0 +0.4843288674284265;1.240580032317569;0 +0.507541746479951;1.237787505514379;0 +0.5265658353266892;1.233424182384393;0 +0.5440191278466325;1.229060859254407;0 +0.5235987755982988;1.223126739797626;0 +0.5017821599483697;1.224697536124421;0 +0.5235987755982988;1.21876341666764;0 +0.5454153912482279;1.217367153266045;0 +0.5599016240397809;1.220334212994435;0 +0.5773549165597242;1.217367153266045;0 +0.5773549165597242;1.217367153266045;0 +0.5773549165597242;1.211607566734464;0 +0.6021385919380436;1.210036770407669;0 +0.6253514709895682;1.207244243604478;0 +0.6457718232379019;1.202880920474492;0 +0.6632251157578452;1.196946801017711;0 +0.6806784082777885;1.19118721448613;0 +0.6981317007977318;1.186823891356144;0 +0.7141887299160796;1.181064304824563;0 +0.7199483164476609;1.173733921966187;0 +0.7199483164476609;1.165007275706215;0 +0.7082546104592988;1.159247689174634;0 +0.6894050545377601;1.154884366044648;0 +0.6689847022894264;1.153313569717853;0 +0.6501351463678877;1.156280629446243;0 +0.6326818538479444;1.157676892847839;0 +0.6166248247295966;1.159247689174634;0 +0.5991715322096532;1.163611012304619;0 +0.5789257128865191;1.16640353910781;0 +0.5628686837681712;1.172337658564591;0 +0.5729915934297384;1.163611012304619;0 +0.5876523591464908;1.159247689174634;0 +0.605105651666434;1.151917306316258;0 +0.605105651666434;1.143190660056286;0 +0.605105651666434;1.13586027719791;0 +0.605105651666434;1.127133630937938;0 +0.6239552075879728;1.122770307807952;0 +0.6414085001079162;1.115614457874776;0 +0.6632251157578452;1.115614457874776;0 +0.6632251157578452;1.124341104134747;0 +0.6501351463678877;1.124341104134747;0 +0.6370451769779303;1.131496954067924;0 +0.6443755598363065;1.137431073524705;0 +0.6588617926278594;1.13586027719791;0 +0.6749188217462072;1.131496954067924;0 +0.6894050545377601;1.128704427264733;0 +0.7098254067860938;1.127133630937938;0 +0.7010987605261222;1.13586027719791;0 +0.6923721142661505;1.143190660056286;0 +0.7068583470577035;1.148950246587867;0 +0.7243116395776468;1.153313569717853;0 +0.7360053455660087;1.159247689174634;0 +0.7534586380859521;1.157676892847839;0 +0.7665486074759096;1.154884366044648;0 +0.7766715171374767;1.160643952576229;0 +0.7766715171374767;1.169370598836201;0 +0.7649778111491147;1.172337658564591;0 +0.7709119306058954;1.181064304824563;0 +0.7709119306058954;1.19118721448613;0 +0.7548549014875475;1.198517597344506;0 +0.7766715171374767;1.195550537616116;0 +0.7970918693858103;1.195550537616116;0 +0.8072147790473774;1.19118721448613;0 +0.8145451619057535;1.183856831627754;0 +0.7941248096574199;1.182460568226158;0 +0.7840018999958529;1.175130185367782;0 +0.7998843961890013;1.172337658564591;0 +0.8086110424489729;1.16640353910781;0 +0.8260643349689161;1.16640353910781;0 +0.8407251006856686;1.170766862237796;0 +0.8407251006856686;1.181064304824563;0 +0.8566075968788169;1.183856831627754;0 +0.8756316857255551;1.18822015475774;0 +0.890117918517108;1.192583477887725;0 +0.9089674744386468;1.195550537616116;0 +0.9250245035569946;1.199913860746102;0 +0.9410815326753426;1.204277183876087;0 +0.9424777960769379;1.195550537616116;0 +0.9569640288684909;1.189790951084534;0 +0.9628981483252715;1.195550537616116;0 +0.980351440845215;1.196946801017711;0 +0.9992009967667536;1.195550537616116;0 +1.015258025885101;1.201310124147697;0 +1.03114052207825;1.204277183876087;0 +1.03114052207825;1.19415427421452;0 +1.044230491468207;1.192583477887725;0 +1.044230491468207;1.198517597344506;0 +1.055924197456569;1.199913860746102;0 +1.066047107118136;1.204277183876087;0 +1.055924197456569;1.210036770407669;0 +1.050164610924988;1.215970889864449;0 +1.032711318405045;1.220334212994435;0 +1.022413875818278;1.224697536124421;0 +1.03114052207825;1.230457122656002;0 +1.050164610924988;1.223126739797626;0 +1.077740813106498;1.217367153266045;0 +1.099557428756428;1.215970889864449;0 +1.118406984677966;1.210036770407669;0 +1.13586027719791;1.208640507006073;0 +1.151917306316258;1.204277183876087;0 +1.170766862237796;1.201310124147697;0 +1.182460568226158;1.195550537616116;0 +1.196946801017711;1.19118721448613;0 +1.205673447277683;1.199913860746102;0 +1.192583477887725;1.204277183876087;0 +1.183856831627754;1.213003830136059;0 +1.167974335434605;1.215970889864449;0 +1.167974335434605;1.221730476396031;0 +1.175130185367782;1.229060859254407;0 +1.16640353910781;1.236216709187584;0 +1.16640353910781;1.236216709187584;0 +1.169370598836201;1.24354709204596;0 +1.19118721448613;1.249306678577541;0 +1.199913860746102;1.256637061435917;0 +1.202880920474492;1.265363707695889;0 +1.213003830136059;1.272694090554265;0 +1.223126739797626;1.279849940487442;0 +1.242150828644364;1.282817000215832;0 +1.250877474904336;1.277057413684251;0 +1.244943355447555;1.272694090554265;0 +1.27112329422747;1.268330767424279;0 +1.27112329422747;1.262396647967498;0 +1.263967444294293;1.255240798034322;0 +1.253670001707527;1.247910415175946;0 +1.268330767424279;1.240580032317569;0 +1.268330767424279;1.231853386057598;0 +1.268330767424279;1.223126739797626;0 +1.266759971097484;1.213003830136059;0 +1.266759971097484;1.204277183876087;0 +1.284213263617428;1.196946801017711;0 +1.277057413684251;1.189790951084534;0 +1.277057413684251;1.182460568226158;0 +1.265363707695889;1.175130185367782;0 +1.253670001707527;1.169370598836201;0 +1.230457122656002;1.163611012304619;0 +1.249306678577541;1.156280629446243;0 +1.265363707695889;1.160643952576229;0 +1.282817000215832;1.16640353910781;0 +1.291543646475804;1.173733921966187;0 +1.306029879267357;1.181064304824563;0 +1.300270292735775;1.19118721448613;0 +1.301666556137371;1.199913860746102;0 +1.317723585255719;1.204277183876087;0 +1.290147383074208;1.205673447277683;0 +1.285784059944223;1.215970889864449;0 +1.288576586747413;1.224697536124421;0 +1.297303233007385;1.231853386057598;0 +1.288576586747413;1.239183768915974;0 +1.277057413684251;1.244943355447555;0 +1.287180323345818;1.253670001707527;0 +1.303237352464166;1.256637061435917;0 +1.311963998724138;1.262396647967498;0 +1.310393202397343;1.268330767424279;0 +1.294510706204194;1.272694090554265;0 +1.300270292735775;1.275486617357456;0 +1.317723585255719;1.269727030825875;0 +1.322086908385705;1.261000384565903;0 +1.314756525527328;1.253670001707527;0 +1.314756525527328;1.244943355447555;0 +1.342507260634038;1.242150828644364;0 +1.370083462815548;1.239183768915974;0 +1.361356816555577;1.24354709204596;0 +1.336573141177257;1.247910415175946;0 +1.327846494917286;1.255240798034322;0 +1.342507260634038;1.258033324837513;0 +1.356993493425591;1.253670001707527;0 +1.367116403087158;1.256637061435917;0 +1.343903524035634;1.262396647967498;0 +1.356993493425591;1.266759971097484;0 +1.370083462815548;1.262396647967498;0 +1.387536755335492;1.262396647967498;0 +1.406386311257031;1.258033324837513;0 +1.423839603776974;1.250877474904336;0 +1.445656219426903;1.253670001707527;0 +1.434137046363741;1.261000384565903;0 +1.410749634387017;1.263967444294293;0 +1.410749634387017;1.272694090554265;0 +1.402022988127045;1.282817000215832;0 +1.43116998663535;1.284213263617428;0 +1.461713248545251;1.285784059944223;0 +1.487893187325166;1.288576586747413;0 +1.518436449235067;1.290147383074208;0 +1.509709802975095;1.297303233007385;0 +1.51110606637669;1.303237352464166;0 +1.527163095495038;1.308996938995747;0 +1.547583447743372;1.314756525527328;0 +1.580919236456464;1.319119848657314;0 +1.608669971563174;1.322086908385705;0 +1.627519527484712;1.327846494917286;0 +1.653699466264627;1.327846494917286;0 +1.6929693744345;1.332209818047272;0 +1.687209787902918;1.32645023151569;0 +1.735206342332762;1.329417291244081;0 +1.727875959474386;1.335176877775662;0 +1.762782544514273;1.335176877775662;0 +1.762782544514273;1.343903524035634;0 +1.788962483294188;1.35123390689401;0 +1.816538685475698;1.356993493425591;0 +1.851445270515585;1.35123390689401;0 +1.819505745204089;1.345299787437229;0 +1.850049007113989;1.345299787437229;0 +1.876228945893904;1.343903524035634;0 +1.857379389972365;1.335176877775662;0 +1.881988532425485;1.335176877775662;0 +1.887922651882266;1.339540200905648;0 +1.912531794335386;1.339540200905648;0 +1.940282529442096;1.338143937504052;0 +1.962099145092025;1.335176877775662;0 +1.980948701013564;1.329417291244081;0 +1.986708287545145;1.322086908385705;0 +1.986708287545145;1.322086908385705;0 +1.983915760741954;1.313360262125733;0 +1.963495408493621;1.307600675594152;0 +1.937315469713706;1.300270292735775;0 +1.914102590662181;1.294510706204194;0 +1.890715178685457;1.287180323345818;0 +1.870469359362323;1.284213263617428;0 +1.858775653373961;1.277057413684251;0 +1.8776252092955;1.277057413684251;0 +1.899441824945429;1.279849940487442;0 +1.922829236922153;1.282817000215832;0 +1.911135530933791;1.287180323345818;0 +1.922829236922153;1.291543646475804;0 +1.940282529442096;1.288576586747413;0 +1.954768762233649;1.285784059944223;0 +1.972222054753592;1.285784059944223;0 +1.969254995025202;1.292939909877399;0 +1.947438379375273;1.297303233007385;0 +1.956165025635245;1.300270292735775;0 +1.977981641285173;1.29887402933418;0 +1.969254995025202;1.292939909877399;0 +1.983915760741954;1.282817000215832;0 +2.004161580065089;1.285784059944223;0 +2.023185668911827;1.287180323345818;0 +2.046398547963351;1.284213263617428;0 +2.071182223341671;1.284213263617428;0 +2.068215163613281;1.277057413684251;0 +2.094395102393195;1.274090353955861;0 +2.129301687433082;1.272694090554265;0 +2.152514566484606;1.274090353955861;0 +2.143787920224635;1.279849940487442;0 +2.146754979953025;1.285784059944223;0 +2.178694505264521;1.285784059944223;0 +2.215171886631203;1.281420736814237;0 +2.244144352214309;1.278453677085846;0 +2.265960967864238;1.269727030825875;0 +2.260201381332656;1.261000384565903;0 +2.247111411942699;1.253670001707527;0 +2.258805117931061;1.244943355447555;0 +2.27468761412421;1.237787505514379;0 +2.290744643242558;1.234820445785988;0 +2.303834612632515;1.240580032317569;0 +2.308197935762501;1.247910415175946;0 +2.313957522294082;1.255240798034322;0 +2.33001455141243;1.247910415175946;0 +2.346071580530777;1.244943355447555;0 +2.356194490192345;1.249306678577541;0 +2.370680722983898;1.250877474904336;0 +2.38534148870065;1.247910415175946;0 +2.418677277413742;1.249306678577541;0 +2.446428012520451;1.247910415175946;0 +2.43770136626048;1.255240798034322;0 +2.431767246803699;1.261000384565903;0 +2.439097629662076;1.265363707695889;0 +2.463881305040395;1.265363707695889;0 +2.455154658780423;1.27112329422747;0 +2.485697920690324;1.269727030825875;0 +2.510307063143444;1.268330767424279;0 +2.535090738521764;1.266759971097484;0 +2.562666940703274;1.262396647967498;0 +2.591813939211579;1.262396647967498;0 +2.615026818263104;1.259604121164308;0 +2.617993877991494;1.250877474904336;0 +2.629687583979856;1.24651415177435;0 +2.645570080173005;1.24651415177435;0 +2.660230845889757;1.242150828644364;0 +2.660230845889757;1.236216709187584;0 +2.679080401811296;1.237787505514379;0 +2.697929957732835;1.237787505514379;0 +2.722713633111154;1.240580032317569;0 +2.748893571891069;1.239183768915974;0 +2.772106450942594;1.237787505514379;0 +2.786767216659346;1.233424182384393;0 +2.792526803190927;1.226093799526016;0 +2.783800156930956;1.21876341666764;0 +2.804220509179289;1.214400093537654;0 +2.8317967113608;1.214400093537654;0 +2.8623399732707;1.215970889864449;0 +2.891486971779005;1.214400093537654;0 +2.914699850830531;1.211607566734464;0 +2.926393556818892;1.215970889864449;0 +2.936516466480459;1.221730476396031;0 +2.956936818728793;1.21876341666764;0 +2.952573495598807;1.214400093537654;0 +2.936516466480459;1.214400093537654;0 +2.937912729882055;1.208640507006073;0 +2.955366022401998;1.205673447277683;0 +2.959729345531985;1.199913860746102;0 +2.974390111248736;1.201310124147697;0 +2.984513020910303;1.205673447277683;0 +2.977182638051928;1.213003830136059;0 +2.977182638051928;1.223126739797626;0 +3.001966313430247;1.221730476396031;0 +3.025179192481772;1.220334212994435;0 +3.048566604458495;1.21876341666764;0 +3.07474654323841;1.21876341666764;0 +3.096563158888339;1.214400093537654;0 +3.118379774538268;1.211607566734464;0 +3.137229330459808;1.207244243604478;0 +3.141592653589793;1.205673447277683;0 +3.141592653589793;1.135336678422311;0 +-1.397659664997059;0;0 +-1.396263401595464;0.01169370598836201;0 +-1.384569695607102;0.0174532925199433;0 +-1.37584304934713;0.02181661564992912;0 +-1.37881010907552;0.0291469985083053;0 +-1.371479726217144;0.03054326190990077;0 +-1.373050522543939;0.03787364476827695;0 +-1.367116403087158;0.0466002910282486;0 +-1.356993493425591;0.0466002910282486;0 +-1.352630170295605;0.05672320068981571;0 +-1.346870583764024;0.06405358354819189;0 +-1.352630170295605;0.06981317007977318;0 +-1.349663110567215;0.07853981633974483;0 +-1.35123390689401;0.08726646259971647;0 +-1.35123390689401;0.09599310885968812;0 +-1.352630170295605;0.1076868148480501;0 +-1.35123390689401;0.1148426647812269;0 +-1.356993493425591;0.1221730476396031;0 +-1.364323876283967;0.1295034304979792;0 +-1.368687199413953;0.1396263401595464;0 +-1.364323876283967;0.1453859266911277;0 +-1.370083462815548;0.1453859266911277;0 +-1.374446785945534;0.1527163095495038;0 +-1.381777168803911;0.1570796326794897;0 +-1.387536755335492;0.1570796326794897;0 +-1.391900078465478;0.1497492498211135;0 +-1.397659664997059;0.1453859266911277;0 +-1.404990047855435;0.1425933998879367;0 +-1.40359378445384;0.136659280431156;0 +-1.396263401595464;0.1308996938995747;0 +-1.404990047855435;0.1265363707695889;0 +-1.412320430713812;0.1251401073679934;0 +-1.413716694115407;0.1352630170295605;0 +-1.422443340375378;0.1352630170295605;0 +-1.426806663505364;0.1410226035611418;0 +-1.435533309765336;0.1439896632895322;0 +-1.444259956025308;0.1453859266911277;0 +-1.448623279155294;0.1425933998879367;0 +-1.452986602285279;0.1469567230179225;0 +-1.461713248545251;0.148352986419518;0 +-1.460316985143656;0.1570796326794897;0 +-1.466076571675237;0.1628392192110709;0 +-1.476199481336804;0.1687733386678517;0 +-1.48056280446679;0.1745329251994329;0 +-1.486496923923571;0.1687733386678517;0 +-1.489289450726761;0.1715658654710426;0 +-1.495223570183542;0.1731366617978375;0 +-1.498016096986733;0.1802925117310143;0 +-1.496619833585138;0.1876228945893904;0 +-1.496619833585138;0.1949532774477666;0 +-1.503950216443514;0.2007128639793479;0 +-1.51110606637669;0.2064724505109292;0 +-1.518436449235067;0.2138028333693054;0 +-1.524196035766648;0.2195624199008867;0 +-1.530130155223429;0.2268928027592629;0 +-1.524196035766648;0.2268928027592629;0 +-1.530130155223429;0.234223185617639;0 +-1.53292268202662;0.2298598624876532;0 +-1.543220124613386;0.2298598624876532;0 +-1.550375974546563;0.2298598624876532;0 +-1.559102620806535;0.234223185617639;0 +-1.566433003664911;0.234223185617639;0 +-1.570796326794897;0.2385865087476248;0 +-1.579522973054868;0.2429498318776107;0 +-1.58824961931484;0.2429498318776107;0 +-1.596976265574811;0.2457423586808016;0 +-1.605702911834783;0.2501056818107875;0 +-1.611462498366364;0.2560398012675681;0 +-1.618792881224741;0.2617993877991494;0 +-1.626123264083117;0.2691297706575256;0 +-1.630486587213103;0.2734930937875114;0 +-1.637642437146279;0.2778564169174972;0 +-1.644972820004656;0.2806489437206882;0 +-1.652303202863032;0.2822197400474831;0 +-1.661029849123004;0.2822197400474831;0 +-1.669756495382975;0.2778564169174972;0 +-1.679879405044542;0.2734930937875114;0 +-1.690002314706109;0.2762856205907024;0 +-1.700299757292876;0.2792526803190927;0 +-1.710422666954443;0.2806489437206882;0 +-1.710422666954443;0.2806489437206882;0 +-1.719149313214414;0.285012266850674;0 +-1.727875959474386;0.2893755899806598;0 +-1.736602605734358;0.2909463863074548;0 +-1.74532925199433;0.2953097094374406;0 +-1.754055898254301;0.2981022362406315;0 +-1.762782544514273;0.3010692959690218;0 +-1.77290545417584;0.308399678827398;0 +-1.780235837034216;0.3141592653589793;0 +-1.784599160164202;0.3141592653589793;0 +-1.794722069825769;0.3155555287605747;0 +-1.806415775814131;0.3199188518905606;0 +-1.812175362345712;0.3272492347489368;0 +-1.820902008605684;0.3330088212805181;0 +-1.831199451192451;0.3373721444105038;0 +-1.838355301125627;0.3460987906704755;0 +-1.844289420582408;0.3548254369304472;0 +-1.838355301125627;0.359188760060433;0 +-1.841322360854018;0.3635520831904188;0 +-1.835562774322437;0.3694862026471996;0 +-1.835562774322437;0.3752457891787808;0 +-1.841322360854018;0.3796091123087666;0 +-1.844289420582408;0.3913028182971287;0 +-1.850049007113989;0.39706240482871;0 +-1.857379389972365;0.4043927876870862;0 +-1.863138976503947;0.4101523742186675;0 +-1.870469359362323;0.4188790204786391;0 +-1.8776252092955;0.4246386070102203;0 +-1.884955592153876;0.4305727264670011;0 +-1.890715178685457;0.4406956361285682;0 +-1.902408884673819;0.445058959258554;0 +-1.909739267532195;0.4494222823885398;0 +-1.909739267532195;0.4537856055185257;0 +-1.906772207803805;0.4595451920501069;0 +-1.911135530933791;0.4654793115068877;0 +-1.915498854063777;0.4654793115068877;0 +-1.919862177193763;0.471238898038469;0 +-1.929985086855329;0.4785692808968452;0 +-1.929985086855329;0.4872959271568168;0 +-1.940282529442096;0.4886921905584123;0 +-1.949009175702068;0.4974188368183839;0 +-1.95773582196204;0.5061454830783556;0 +-1.962099145092025;0.5148721293383272;0 +-1.967858731623607;0.5222025121967034;0 +-1.969254995025202;0.5279620987282847;0 +-1.973618318155188;0.5366887449882564;0 +-1.973618318155188;0.5440191278466325;0 +-1.980948701013564;0.5468116546498234;0 +-1.986708287545145;0.5511749777798092;0 +-1.992642407001926;0.5497787143782138;0 +-2.002765316663493;0.5541420375081997;0 +-2.004161580065089;0.5483824509766184;0 +-2.002765316663493;0.5410520681182421;0 +-1.999798256935103;0.533721685259866;0 +-2.001369053261898;0.5265658353266892;0 +-1.997005730131912;0.5206317158699084;0 +-1.989675347273536;0.5162683927399226;0 +-1.983915760741954;0.5091125428067459;0 +-1.976585377883578;0.5017821599483697;0 +-1.970825791351997;0.4944517770899935;0 +-1.967858731623607;0.4857251308300219;0 +-1.96052834876523;0.4799655442984406;0 +-1.954768762233649;0.471238898038469;0 +-1.946042115973677;0.4625122517784973;0 +-1.943075056245287;0.4537856055185257;0 +-1.937315469713706;0.445058959258554;0 +-1.937315469713706;0.4392993727269727;0 +-1.931555883182125;0.433365253270192;0 +-1.934348409985315;0.4305727264670011;0 +-1.929985086855329;0.4232423436086249;0 +-1.922829236922153;0.4232423436086249;0 +-1.915498854063777;0.4145156973486533;0 +-1.909739267532195;0.407185314490277;0 +-1.919862177193763;0.3984586682303054;0 +-1.925621763725344;0.4101523742186675;0 +-1.934348409985315;0.4159119607502487;0 +-1.941678792843691;0.4232423436086249;0 +-1.949009175702068;0.4290019301402062;0 +-1.96052834876523;0.433365253270192;0 +-1.956165025635245;0.4392993727269727;0 +-1.956165025635245;0.4480260189869444;0 +-1.96052834876523;0.456752665246916;0 +-1.969254995025202;0.4611159883769019;0 +-1.975189114481983;0.4668755749084831;0 +-1.982344964415159;0.4668755749084831;0 +-1.989675347273536;0.471238898038469;0 +-1.995434933805117;0.4742059577668594;0 +-1.998401993533507;0.4799655442984406;0 +-2.007128639793479;0.4857251308300219;0 +-1.997005730131912;0.4843288674284265;0 +-1.989675347273536;0.4886921905584123;0 +-1.989675347273536;0.4960225734167885;0 +-1.995434933805117;0.5017821599483697;0 +-2.001369053261898;0.507541746479951;0 +-2.010095699521869;0.5148721293383272;0 +-2.018822345781841;0.5178391890667177;0 +-2.020218609183436;0.5279620987282847;0 +-2.024581932313422;0.5293583621298801;0 +-2.024581932313422;0.5366887449882564;0 +-2.030341518845003;0.5410520681182421;0 +-2.030341518845003;0.5410520681182421;0 +-2.030341518845003;0.5454153912482279;0 +-2.034704841974989;0.5511749777798092;0 +-2.03767190170338;0.5585053606381855;0 +-2.043431488234961;0.5672320068981571;0 +-2.046398547963351;0.5759586531581288;0 +-2.050761871093337;0.5832890360165049;0 +-2.059488517353309;0.5890486225480862;0 +-2.06524810388489;0.5890486225480862;0 +-2.066818900211685;0.5948082090796675;0 +-2.072578486743266;0.5948082090796675;0 +-2.081305133003238;0.5977752688080579;0 +-2.091428042664805;0.6007423285364483;0 +-2.104518012054762;0.6035348553396391;0 +-2.104518012054762;0.6122615015996108;0 +-2.113244658314734;0.6209881478595823;0 +-2.119178777771515;0.6283185307179586;0 +-2.127905424031487;0.6340781172495399;0 +-2.126334627704692;0.6384414403795257;0 +-2.126334627704692;0.6457718232379019;0 +-2.132268747161473;0.6457718232379019;0 +-2.136632070291458;0.6515314097694832;0 +-2.138028333693053;0.6588617926278594;0 +-2.130697950834678;0.6544984694978736;0 +-2.135061273964663;0.6618288523562498;0 +-2.132268747161473;0.6646213791594406;0 +-2.138028333693053;0.6661921754862357;0 +-2.138028333693053;0.6618288523562498;0 +-2.146754979953025;0.6632251157578452;0 +-2.14535871655143;0.6689847022894264;0 +-2.152514566484606;0.6733480254194123;0 +-2.158448685941387;0.6792821448761931;0 +-2.159844949342983;0.6864379948093697;0 +-2.159844949342983;0.6923721142661505;0 +-2.164208272472969;0.6981317007977318;0 +-2.16996785900455;0.7024950239277176;0 +-2.16996785900455;0.7068583470577035;0 +-2.165604535874564;0.715584993317675;0 +-2.164208272472969;0.7243116395776468;0 +-2.167175332201359;0.7330382858376184;0 +-2.171538655331345;0.7387978723691996;0 +-2.17293491873294;0.7475245186291712;0 +-2.168571595602955;0.7578219612159379;0 +-2.165604535874564;0.767944870877505;0 +-2.164208272472969;0.7766715171374767;0 +-2.164208272472969;0.7853981633974483;0 +-2.161241212744578;0.7927285462558246;0 +-2.162812009071373;0.7998843961890013;0 +-2.162812009071373;0.805818515645782;0 +-2.149722039681416;0.805818515645782;0 +-2.162812009071373;0.8086110424489729;0 +-2.164208272472969;0.8145451619057535;0 +-2.165604535874564;0.8203047484373349;0 +-2.16996785900455;0.8290313946973066;0 +-2.174331182134535;0.8363617775556828;0 +-2.177298241862926;0.8407251006856686;0 +-2.175901978461331;0.8450884238156544;0 +-2.161241212744578;0.8407251006856686;0 +-2.149722039681416;0.8407251006856686;0 +-2.139424597094649;0.8363617775556828;0 +-2.146754979953025;0.8290313946973066;0 +-2.139424597094649;0.831998454425697;0 +-2.138028333693053;0.8290313946973066;0 +-2.133665010563068;0.8377580409572781;0 +-2.139424597094649;0.8450884238156544;0 +-2.136632070291458;0.8478809506188453;0 +-2.142391656823039;0.8552113334772214;0 +-2.149722039681416;0.8595746566072072;0 +-2.149722039681416;0.868301302867179;0 +-2.159844949342983;0.8639379797371932;0 +-2.16996785900455;0.868301302867179;0 +-2.180265301591317;0.8740608893987601;0 +-2.190388211252884;0.879995008855541;0 +-2.203478180642841;0.8843583319855268;0 +-2.216568150032799;0.8871508587887176;0 +-2.229658119422756;0.8930849782454985;0 +-2.229658119422756;0.8988445647770796;0 +-2.236988502281132;0.904604151308661;0 +-2.241351825411118;0.9133307975686326;0 +-2.254441794801075;0.9176941206986184;0 +-2.264564704462642;0.9279915632853851;0 +-2.27468761412421;0.9323548864153709;0 +-2.282017996982586;0.9410815326753426;0 +-2.271895087321018;0.9454448558053283;0 +-2.276258410451004;0.9498081789353141;0 +-2.270324290994224;0.9585348251952858;0 +-2.282017996982586;0.9555677654668955;0 +-2.292140906644153;0.9599310885968813;0 +-2.299471289502529;0.9656906751284625;0 +-2.30523087603411;0.9730210579868387;0 +-2.303834612632515;0.97878064451842;0 +-2.312561258892487;0.97878064451842;0 +-2.321287905152458;0.9817477042468103;0 +-2.313957522294082;0.9744173213884341;0 +-2.30523087603411;0.9642944117268671;0 +-2.30523087603411;0.9541715020653;0 +-2.312561258892487;0.9613273519984766;0 +-2.322684168554054;0.9656906751284625;0 +-2.328618288010834;0.9700539982584483;0 +-2.33298161114082;0.9759881177152292;0 +-2.33298161114082;0.9759881177152292;0 +-2.33298161114082;0.9831439676484057;0 +-2.341708257400791;0.9817477042468103;0 +-2.344500784203983;0.9904743505067819;0 +-2.335774137944012;0.9962339370383633;0 +-2.321287905152458;0.9934414102351724;0 +-2.328618288010834;0.9992009967667536;0 +-2.334377874542416;1.004960583298335;0 +-2.338741197672401;0.9992009967667536;0 +-2.347467843932373;0.9948376736367678;0 +-2.347467843932373;1.002168056495144;0 +-2.351831167062359;1.010894702755116;0 +-2.350434903660763;1.016654289286697;0 +-2.356194490192345;1.023984672145073;0 +-2.359161549920735;1.016654289286697;0 +-2.367888196180707;1.016654289286697;0 +-2.356194490192345;1.010894702755116;0 +-2.356194490192345;1.002168056495144;0 +-2.351831167062359;0.9918706139083775;0 +-2.351831167062359;0.980351440845215;0 +-2.359161549920735;0.9904743505067819;0 +-2.364921136452316;0.9992009967667536;0 +-2.376614842440679;1.00653137962513;0 +-2.38237442897226;1.015258025885101;0 +-2.395464398362217;1.019621349015087;0 +-2.407158104350579;1.025380935546669;0 +-2.420248073740536;1.032711318405045;0 +-2.43473430653209;1.037074641535031;0 +-2.43770136626048;1.045801287795002;0 +-2.447824275922047;1.041437964665016;0 +-2.4623105087136;1.042834228066612;0 +-2.478367537831948;1.047197551196598;0 +-2.495820830351891;1.047197551196598;0 +-2.513274122871834;1.047197551196598;0 +-2.530727415391778;1.051560874326584;0 +-2.548180707911721;1.057320460858165;0 +-2.559874413900083;1.061683783988151;0 +-2.574360646691636;1.061683783988151;0 +-2.588846879483189;1.064650843716541;0 +-2.586054352679998;1.054527934054974;0 +-2.594780998939969;1.045801287795002;0 +-2.609267231731522;1.045801287795002;0 +-2.620960937719884;1.039867168338221;0 +-2.634050907109842;1.03410758180664;0 +-2.651504199629785;1.032711318405045;0 +-2.642777553369814;1.038470904936626;0 +-2.651504199629785;1.041437964665016;0 +-2.642777553369814;1.050164610924988;0 +-2.641206757043019;1.060287520586555;0 +-2.62532426084987;1.063254580314946;0 +-2.616597614589899;1.069014166846527;0 +-2.629687583979856;1.069014166846527;0 +-2.647140876499799;1.063254580314946;0 +-2.657263786161367;1.057320460858165;0 +-2.661627109291353;1.048593814598193;0 +-2.67175001895292;1.041437964665016;0 +-2.684839988342878;1.037074641535031;0 +-2.689203311472863;1.03114052207825;0 +-2.676113342082906;1.028347995275059;0 +-2.684839988342878;1.021017612416683;0 +-2.693566634602849;1.015258025885101;0 +-2.709623663721197;1.009323906428321;0 +-2.725680692839544;1.002168056495144;0 +-2.734407339099516;0.9948376736367678;0 +-2.751860631619459;0.9890780871051865;0 +-2.764950601009417;0.9847147639752007;0 +-2.770710187540998;0.9773843811168246;0 +-2.785196420332551;0.9744173213884341;0 +-2.801253449450899;0.9700539982584483;0 +-2.817310478569246;0.9672614714552574;0 +-2.827433388230814;0.9628981483252715;0 +-2.841919621022367;0.9599310885968813;0 +-2.856580386739119;0.9541715020653;0 +-2.875429942660658;0.9482373826085192;0 +-2.878397002389048;0.9526007057385051;0 +-2.860943709869105;0.9599310885968813;0 +-2.843490417349162;0.9642944117268671;0 +-2.833192974762395;0.9716247945852433;0 +-2.817310478569246;0.9759881177152292;0 +-2.801253449450899;0.9773843811168246;0 +-2.791130539789332;0.9861110273767961;0 +-2.775073510670984;0.9918706139083775;0 +-2.763379804682622;0.9992009967667536;0 +-2.751860631619459;1.004960583298335;0 +-2.748893571891069;1.015258025885101;0 +-2.747497308489473;1.025380935546669;0 +-2.757620218151041;1.023984672145073;0 +-2.769313924139403;1.025380935546669;0 +-2.773677247269388;1.019621349015087;0 +-2.785196420332551;1.028347995275059;0 +-2.80998009571087;1.028347995275059;0 +-2.820103005372438;1.025380935546669;0 +-2.826037124829218;1.032711318405045;0 +-2.821673801699232;1.038470904936626;0 +-2.830400447959204;1.048593814598193;0 +-2.844886680750757;1.041437964665016;0 +-2.85937291354231;1.041437964665016;0 +-2.868099559802282;1.048593814598193;0 +-2.878397002389048;1.057320460858165;0 +-2.88415658892063;1.066047107118136;0 +-2.88415658892063;1.066047107118136;0 +-2.897246558310587;1.073377489976513;0 +-2.888519912050616;1.085071195964875;0 +-2.876826206062253;1.093797842224846;0 +-2.874033679259062;1.099557428756428;0 +-2.860943709869105;1.103920751886413;0 +-2.844886680750757;1.099557428756428;0 +-2.8317967113608;1.106887811614804;0 +-2.80998009571087;1.108284075016399;0 +-2.805616772580885;1.117010721276371;0 +-2.814343418840856;1.124341104134747;0 +-2.80998009571087;1.131496954067924;0 +-2.826037124829218;1.128704427264733;0 +-2.839127094219176;1.124341104134747;0 +-2.856580386739119;1.127133630937938;0 +-2.878397002389048;1.125737367536342;0 +-2.903006144842168;1.128704427264733;0 +-2.908940264298949;1.134464013796314;0 +-2.903006144842168;1.140223600327895;0 +-2.919063173960516;1.14179439665469;0 +-2.929186083622084;1.144586923457881;0 +-2.91173279110214;1.151917306316258;0 +-2.892883235180601;1.156280629446243;0 +-2.874033679259062;1.160643952576229;0 +-2.85937291354231;1.160643952576229;0 +-2.857976650140714;1.153313569717853;0 +-2.830400447959204;1.153313569717853;0 +-2.823070065100828;1.159247689174634;0 +-2.836160034490785;1.16640353910781;0 +-2.853613327010729;1.172337658564591;0 +-2.8623399732707;1.181064304824563;0 +-2.88415658892063;1.186474825505745;0 +-2.900213618038977;1.192583477887725;0 +-2.897246558310587;1.201310124147697;0 +-2.876826206062253;1.202880920474492;0 +-2.853613327010729;1.205673447277683;0 +-2.844886680750757;1.212131165510062;0 +-2.839127094219176;1.220334212994435;0 +-2.820103005372438;1.227490062927612;0 +-2.799857186049303;1.229060859254407;0 +-2.775073510670984;1.236216709187584;0 +-2.750289835292665;1.236914840888381;0 +-2.728473219642735;1.244943355447555;0 +-2.702293280862821;1.241452696943566;0 +-2.693566634602849;1.236914840888381;0 +-2.661627109291353;1.236914840888381;0 +-2.644173816771409;1.230108056805604;0 +-2.623753464523076;1.230108056805604;0 +-2.600540585471551;1.229933523880404;0 +-2.574360646691636;1.225570200750418;0 +-2.551147767640111;1.225570200750418;0 +-2.532123678793373;1.221730476396031;0 +-2.513274122871834;1.223126739797626;0 +-2.492853770623501;1.223126739797626;0 +-2.475400478103558;1.21876341666764;0 +-2.460914245312004;1.215098225238452;0 +-2.43473430653209;1.214400093537654;0 +-2.414313954283756;1.209862237482469;0 +-2.396860661763813;1.204277183876087;0 +-2.373647782712288;1.199913860746102;0 +-2.372251519310693;1.207244243604478;0 +-2.359161549920735;1.213003830136059;0 +-2.341708257400791;1.214400093537654;0 +-2.32704749168404;1.210909435033666;0 +-2.313957522294082;1.215970889864449;0 +-2.289348379840962;1.221381410545632;0 +-2.265960967864238;1.226093799526016;0 +-2.258805117931061;1.21876341666764;0 +-2.242748088812713;1.221730476396031;0 +-2.234021442552742;1.231853386057598;0 +-2.210808563501217;1.223126739797626;0 +-2.202081917241245;1.214400093537654;0 +-2.187421151524493;1.211607566734464;0 +-2.171538655331345;1.221730476396031;0 +-2.16996785900455;1.211607566734464;0 +-2.155481626212997;1.210734902108467;0 +-2.146754979953025;1.21876341666764;0 +-2.11760798144472;1.21876341666764;0 +-2.098758425523181;1.212480231360461;0 +-2.073974750144862;1.208116908230475;0 +-2.050761871093337;1.204277183876087;0 +-2.024581932313422;1.203753585100489;0 +-2.001369053261898;1.199390261970503;0 +-1.991071610675131;1.192059879112127;0 +-2.008524903195074;1.189790951084534;0 +-2.01288822632506;1.183856831627754;0 +-1.992642407001926;1.183856831627754;0 +-1.972222054753592;1.181064304824563;0 +-1.947438379375273;1.183856831627754;0 +-1.924225500323748;1.186823891356144;0 +-1.906772207803805;1.182460568226158;0 +-1.887922651882266;1.179493508497768;0 +-1.881988532425485;1.186823891356144;0 +-1.902408884673819;1.19118721448613;0 +-1.889318915283862;1.196946801017711;0 +-1.866106036232337;1.199913860746102;0 +-1.844289420582408;1.202531854624093;0 +-1.82526533173567;1.192932543738124;0 +-1.797689129554159;1.187347490131742;0 +-1.77587251390423;1.182460568226158;0 +-1.77587251390423;1.182460568226158;0 +-1.74532925199433;1.179493508497768;0 +-1.7235126363444;1.181064304824563;0 +-1.722116372942805;1.19118721448613;0 +-1.710422666954443;1.196946801017711;0 +-1.737998869135953;1.204277183876087;0 +-1.72054557661601;1.210036770407669;0 +-1.709026403552848;1.21876341666764;0 +-1.682846464772932;1.210036770407669;0 +-1.66818569905618;1.199913860746102;0 +-1.691573111032904;1.193456142513722;0 +-1.690002314706109;1.183682298702554;0 +-1.672549022186166;1.178097245096172;0 +-1.666789435654585;1.186474825505745;0 +-1.661029849123004;1.186823891356144;0 +-1.644972820004656;1.195550537616116;0 +-1.652303202863032;1.204277183876087;0 +-1.64060949687467;1.211607566734464;0 +-1.669756495382975;1.21876341666764;0 +-1.688606051304514;1.229060859254407;0 +-1.679879405044542;1.238660170140376;0 +-1.672549022186166;1.247910415175946;0 +-1.658062789394613;1.252273738305931;0 +-1.658062789394613;1.261000384565903;0 +-1.658062789394613;1.268330767424279;0 +-1.662426112524599;1.277057413684251;0 +-1.66818569905618;1.284213263617428;0 +-1.661029849123004;1.291543646475804;0 +-1.626123264083117;1.294510706204194;0 +-1.59121667904323;1.291892712326203;0 +-1.573763386523287;1.288576586747413;0 +-1.582490032783259;1.284213263617428;0 +-1.594009205846421;1.277057413684251;0 +-1.604306648433188;1.269727030825875;0 +-1.624552467756322;1.269727030825875;0 +-1.64060949687467;1.266759971097484;0 +-1.631882850614698;1.261000384565903;0 +-1.64357655660306;1.255240798034322;0 +-1.631882850614698;1.24651415177435;0 +-1.617396617823145;1.239183768915974;0 +-1.604306648433188;1.233424182384393;0 +-1.594009205846421;1.224697536124421;0 +-1.613033294693159;1.217367153266045;0 +-1.594009205846421;1.213003830136059;0 +-1.582490032783259;1.205673447277683;0 +-1.569400063393301;1.196946801017711;0 +-1.551946770873358;1.208640507006073;0 +-1.53588974175501;1.199913860746102;0 +-1.53588974175501;1.192583477887725;0 +-1.5388568014834;1.183856831627754;0 +-1.522799772365053;1.173733921966187;0 +-1.509709802975095;1.176700981694577;0 +-1.509709802975095;1.183856831627754;0 +-1.490860247053556;1.189790951084534;0 +-1.490860247053556;1.199913860746102;0 +-1.492256510455152;1.210036770407669;0 +-1.492256510455152;1.21876341666764;0 +-1.470439894805222;1.21876341666764;0 +-1.447227015753698;1.215970889864449;0 +-1.444259956025308;1.210036770407669;0 +-1.419476280646988;1.207767842380076;0 +-1.419476280646988;1.196946801017711;0 +-1.438500369493726;1.192583477887725;0 +-1.438500369493726;1.183856831627754;0 +-1.416683753843797;1.179493508497768;0 +-1.421047076973783;1.169370598836201;0 +-1.442863692623712;1.162040215977824;0 +-1.461713248545251;1.154884366044648;0 +-1.484926127596776;1.157676892847839;0 +-1.492256510455152;1.162040215977824;0 +-1.514073126105081;1.160643952576229;0 +-1.500983156715123;1.154884366044648;0 +-1.518436449235067;1.143190660056286;0 +-1.518436449235067;1.134464013796314;0 +-1.531526418625024;1.125737367536342;0 +-1.544616388014982;1.117010721276371;0 +-1.570796326794897;1.117010721276371;0 +-1.582490032783259;1.106887811614804;0 +-1.580919236456464;1.098161165354832;0 +-1.598372528976407;1.095194105626442;0 +-1.614429558094755;1.092227045898051;0 +-1.614429558094755;1.08350039963808;0 +-1.626123264083117;1.080707872834889;0 +-1.634849910343088;1.073377489976513;0 +-1.64357655660306;1.064650843716541;0 +-1.647939879733046;1.057320460858165;0 +-1.652303202863032;1.050164610924988;0 +-1.653699466264627;1.039867168338221;0 +-1.653699466264627;1.03114052207825;0 +-1.647939879733046;1.023984672145073;0 +-1.636246173744684;1.025380935546669;0 +-1.624552467756322;1.023984672145073;0 +-1.617396617823145;1.013687229558307;0 +-1.617396617823145;1.00653137962513;0 +-1.611462498366364;0.9992009967667536;0 +-1.611462498366364;0.9934414102351724;0 +-1.601339588704797;0.9962339370383633;0 +-1.58824961931484;0.9992009967667536;0 +-1.570796326794897;0.9934414102351724;0 +-1.553343034274953;0.9904743505067819;0 +-1.553343034274953;0.9904743505067819;0 +-1.537286005156605;0.9847147639752007;0 +-1.527163095495038;0.9773843811168246;0 +-1.515469389506676;0.9744173213884341;0 +-1.500983156715123;0.9716247945852433;0 +-1.48352986419518;0.9642944117268671;0 +-1.466076571675237;0.9642944117268671;0 +-1.448623279155294;0.9642944117268671;0 +-1.434137046363741;0.9599310885968813;0 +-1.438500369493726;0.9468411192069237;0 +-1.434137046363741;0.9395107363485476;0 +-1.434137046363741;0.9323548864153709;0 +-1.436929573166932;0.9236282401553992;0 +-1.425410400103769;0.9162978572970231;0 +-1.418080017245393;0.9089674744386468;0 +-1.409353370985421;0.9032078879070654;0 +-1.40359378445384;0.8958775050486893;0 +-1.391900078465478;0.890117918517108;0 +-1.393296341867073;0.8958775050486893;0 +-1.37881010907552;0.90181162450547;0 +-1.368687199413953;0.9105382707654417;0 +-1.37584304934713;0.9192649170254134;0 +-1.37584304934713;0.9279915632853851;0 +-1.377413845673925;0.938114472946952;0 +-1.381777168803911;0.9454448558053283;0 +-1.387536755335492;0.9526007057385051;0 +-1.374446785945534;0.9569640288684909;0 +-1.361356816555577;0.9628981483252715;0 +-1.34826684716562;0.9700539982584483;0 +-1.339540200905648;0.9773843811168246;0 +-1.339540200905648;0.9890780871051865;0 +-1.343903524035634;0.9992009967667536;0 +-1.346870583764024;1.00653137962513;0 +-1.352630170295605;1.016654289286697;0 +-1.362753079957173;1.019621349015087;0 +-1.373050522543939;1.025380935546669;0 +-1.371479726217144;1.03114052207825;0 +-1.359960553153982;1.032711318405045;0 +-1.35123390689401;1.039867168338221;0 +-1.35123390689401;1.047197551196598;0 +-1.354026433697201;1.055924197456569;0 +-1.362753079957173;1.060287520586555;0 +-1.356993493425591;1.067617903444931;0 +-1.352630170295605;1.074773753378108;0 +-1.362753079957173;1.079137076508094;0 +-1.362753079957173;1.08646745936647;0 +-1.35123390689401;1.090830782496456;0 +-1.333780614374067;1.08943451909486;0 +-1.317723585255719;1.08646745936647;0 +-1.306029879267357;1.08646745936647;0 +-1.285784059944223;1.08943451909486;0 +-1.272694090554265;1.085071195964875;0 +-1.261000384565903;1.079137076508094;0 +-1.247910415175946;1.074773753378108;0 +-1.252273738305931;1.069014166846527;0 +-1.239183768915974;1.064650843716541;0 +-1.226093799526016;1.064650843716541;0 +-1.213003830136059;1.063254580314946;0 +-1.215970889864449;1.055924197456569;0 +-1.211607566734464;1.048593814598193;0 +-1.213003830136059;1.039867168338221;0 +-1.213003830136059;1.03410758180664;0 +-1.204277183876087;1.026777198948264;0 +-1.19415427421452;1.025380935546669;0 +-1.182460568226158;1.015258025885101;0 +-1.165007275706215;1.019621349015087;0 +-1.159247689174634;1.025380935546669;0 +-1.146157719784676;1.029744258676654;0 +-1.1388273369263;1.037074641535031;0 +-1.144586923457881;1.042834228066612;0 +-1.137431073524705;1.047197551196598;0 +-1.128704427264733;1.052957137728179;0 +-1.122770307807952;1.047197551196598;0 +-1.114043661547981;1.038470904936626;0 +-1.103920751886413;1.029744258676654;0 +-1.096590369028037;1.021017612416683;0 +-1.087863722768066;1.012290966156711;0 +-1.079137076508094;1.00653137962513;0 +-1.079137076508094;1.000597260168349;0 +-1.070410430248122;0.9962339370383633;0 +-1.077740813106498;0.9904743505067819;0 +-1.077740813106498;0.9817477042468103;0 +-1.070410430248122;0.9759881177152292;0 +-1.055924197456569;0.9716247945852433;0 +-1.052957137728179;0.9642944117268671;0 +-1.03410758180664;0.9628981483252715;0 +-1.028347995275059;0.9569640288684909;0 +-1.012290966156711;0.9555677654668955;0 +-1.003564319896739;0.9512044423369095;0 +-1.018050552688292;0.9454448558053283;0 +-1.000597260168349;0.9438740594785334;0 +-0.9992009967667536;0.9367182095453567;0 +-0.9861110273767961;0.9367182095453567;0 +-0.9744173213884341;0.9279915632853851;0 +-0.9773843811168246;0.9206611804270088;0 +-0.9716247945852433;0.9089674744386468;0 +-0.980351440845215;0.904604151308661;0 +-0.9918706139083775;0.8988445647770796;0 +-1.009323906428321;0.8974483013754843;0 +-1.023984672145073;0.8930849782454985;0 +-1.023984672145073;0.8930849782454985;0 +-1.03114052207825;0.8871508587887176;0 +-1.038470904936626;0.8813912722571364;0 +-1.047197551196598;0.8756316857255551;0 +-1.063254580314946;0.8756316857255551;0 +-1.076344549704903;0.8740608893987601;0 +-1.085071195964875;0.8770279491271507;0 +-1.096590369028037;0.8770279491271507;0 +-1.106887811614804;0.8770279491271507;0 +-1.117010721276371;0.878424212528746;0 +-1.130100690666328;0.8770279491271507;0 +-1.14179439665469;0.8770279491271507;0 +-1.151917306316258;0.8770279491271507;0 +-1.165007275706215;0.8740608893987601;0 +-1.172337658564591;0.868301302867179;0 +-1.175130185367782;0.8609709200088027;0 +-1.186823891356144;0.8609709200088027;0 +-1.198517597344506;0.8538150700756261;0 +-1.208640507006073;0.8478809506188453;0 +-1.215970889864449;0.8407251006856686;0 +-1.221730476396031;0.8347909812288877;0 +-1.229060859254407;0.8290313946973066;0 +-1.234820445785988;0.8232718081657252;0 +-1.242150828644364;0.8173376887089445;0 +-1.230457122656002;0.8203047484373349;0 +-1.223126739797626;0.8260643349689161;0 +-1.215970889864449;0.831998454425697;0 +-1.208640507006073;0.8391543043588735;0 +-1.198517597344506;0.8450884238156544;0 +-1.186823891356144;0.8494517469456402;0 +-1.176700981694577;0.8522442737488312;0 +-1.165007275706215;0.8566075968788169;0 +-1.151917306316258;0.8581783932056118;0 +-1.1388273369263;0.8595746566072072;0 +-1.127133630937938;0.8566075968788169;0 +-1.121374044406357;0.8522442737488312;0 +-1.121374044406357;0.8464846872172498;0 +-1.131496954067924;0.842121364087264;0 +-1.140223600327895;0.8391543043588735;0 +-1.157676892847839;0.8391543043588735;0 +-1.146157719784676;0.830427658098902;0 +-1.131496954067924;0.8333947178272924;0 +-1.134464013796314;0.8260643349689161;0 +-1.133067750394719;0.8159414253073491;0 +-1.127133630937938;0.8072147790473774;0 +-1.117010721276371;0.8042477193189871;0 +-1.103920751886413;0.7984881327874057;0 +-1.092227045898051;0.7970918693858103;0 +-1.082104136236484;0.7998843961890013;0 +-1.073377489976513;0.7984881327874057;0 +-1.073377489976513;0.805818515645782;0 +-1.064650843716541;0.8129743655789586;0 +-1.05889125718496;0.8203047484373349;0 +-1.054527934054974;0.8173376887089445;0 +-1.055924197456569;0.8086110424489729;0 +-1.044230491468207;0.8028514559173915;0 +-1.054527934054974;0.7970918693858103;0 +-1.064650843716541;0.7941248096574199;0 +-1.067617903444931;0.7883652231258387;0 +-1.082104136236484;0.7853981633974483;0 +-1.099557428756428;0.7810348402674625;0 +-1.11125113474479;0.7766715171374767;0 +-1.119977781004761;0.7766715171374767;0 +-1.125737367536342;0.7709119306058954;0 +-1.134464013796314;0.7649778111491147;0 +-1.143190660056286;0.7592182246175333;0 +-1.151917306316258;0.7635815477475191;0 +-1.154884366044648;0.7709119306058954;0 +-1.150521042914662;0.7780677805390721;0 +-1.140223600327895;0.7840018999958529;0 +-1.133067750394719;0.7867944267990437;0 +-1.121374044406357;0.7927285462558246;0 +-1.133067750394719;0.7911577499290294;0 +-1.131496954067924;0.7970918693858103;0 +-1.144586923457881;0.7911577499290294;0 +-1.156280629446243;0.7883652231258387;0 +-1.169370598836201;0.7883652231258387;0 +-1.169370598836201;0.7824311036690579;0 +-1.178097245096172;0.7780677805390721;0 +-1.186823891356144;0.7752752537358811;0 +-1.196946801017711;0.7723081940074908;0 +-1.201310124147697;0.7752752537358811;0 +-1.207244243604478;0.767944870877505;0 +-1.217367153266045;0.7649778111491147;0 +-1.226093799526016;0.7621852843459237;0 +-1.226093799526016;0.7592182246175333;0 +-1.231853386057598;0.7534586380859521;0 +-1.236216709187584;0.7475245186291712;0 +-1.234820445785988;0.7431611954991855;0 +-1.239183768915974;0.7387978723691996;0 +-1.233424182384393;0.7360053455660087;0 +-1.230457122656002;0.7286749627076327;0 +-1.221730476396031;0.7286749627076327;0 +-1.221730476396031;0.7330382858376184;0 +-1.221730476396031;0.7272786993060371;0 +-1.233424182384393;0.7243116395776468;0 +-1.233424182384393;0.7272786993060371;0 +-1.240580032317569;0.7243116395776468;0 +-1.244943355447555;0.7286749627076327;0 +-1.247910415175946;0.7229153761760513;0 +-1.247910415175946;0.7229153761760513;0 +-1.256637061435917;0.7199483164476609;0 +-1.265363707695889;0.7199483164476609;0 +-1.274090353955861;0.7199483164476609;0 +-1.282817000215832;0.7169812567192706;0 +-1.291543646475804;0.7126179335892847;0 +-1.297303233007385;0.7068583470577035;0 +-1.291543646475804;0.7038912873293131;0 +-1.294510706204194;0.6951646410693415;0 +-1.300270292735775;0.6864379948093697;0 +-1.308996938995747;0.6806784082777885;0 +-1.313360262125733;0.6864379948093697;0 +-1.319119848657314;0.6894050545377601;0 +-1.316327321854123;0.6806784082777885;0 +-1.308996938995747;0.6705554986162214;0 +-1.313360262125733;0.6661921754862357;0 +-1.319119848657314;0.6588617926278594;0 +-1.322086908385705;0.6501351463678877;0 +-1.32645023151569;0.6487388829662923;0 +-1.3234831717873;0.657465529226264;0 +-1.320690644984109;0.6632251157578452;0 +-1.32645023151569;0.6632251157578452;0 +-1.325053968114095;0.667588438887831;0 +-1.332209818047272;0.6705554986162214;0 +-1.329417291244081;0.6777113485493982;0 +-1.329417291244081;0.6836454680061789;0 +-1.32645023151569;0.6894050545377601;0 +-1.333780614374067;0.6864379948093697;0 +-1.336573141177257;0.6806784082777885;0 +-1.335176877775662;0.6719517620178169;0 +-1.333780614374067;0.6661921754862357;0 +-1.342507260634038;0.667588438887831;0 +-1.332209818047272;0.6618288523562498;0 +-1.333780614374067;0.6544984694978736;0 +-1.333780614374067;0.6487388829662923;0 +-1.32645023151569;0.6428047635095115;0 +-1.3234831717873;0.6370451769779303;0 +-1.322086908385705;0.6297147941195541;0 +-1.317723585255719;0.6239552075879728;0 +-1.322086908385705;0.6297147941195541;0 +-1.32645023151569;0.631285590446349;0 +-1.332209818047272;0.6297147941195541;0 +-1.339540200905648;0.6269222673163631;0 +-1.330813554645676;0.6269222673163631;0 +-1.3234831717873;0.6269222673163631;0 +-1.3234831717873;0.6209881478595823;0 +-1.32645023151569;0.6166248247295966;0 +-1.332209818047272;0.6166248247295966;0 +-1.340936464307243;0.6108652381980153;0 +-1.332209818047272;0.6108652381980153;0 +-1.336573141177257;0.6065019150680295;0 +-1.346870583764024;0.605105651666434;0 +-1.354026433697201;0.5991715322096532;0 +-1.361356816555577;0.5934119456780721;0 +-1.368687199413953;0.5920156822764766;0 +-1.377413845673925;0.5876523591464908;0 +-1.381777168803911;0.58171823968971;0 +-1.387536755335492;0.5759586531581288;0 +-1.396263401595464;0.5701990666265475;0 +-1.404990047855435;0.5658357434965617;0 +-1.413716694115407;0.5585053606381855;0 +-1.418080017245393;0.5497787143782138;0 +-1.422443340375378;0.5410520681182421;0 +-1.421047076973783;0.5323254218582705;0 +-1.419476280646988;0.5235987755982988;0 +-1.415112957517002;0.5148721293383272;0 +-1.412320430713812;0.5061454830783556;0 +-1.406386311257031;0.4974188368183839;0 +-1.406386311257031;0.4916592502868026;0 +-1.402022988127045;0.481361807700036;0 +-1.397659664997059;0.471238898038469;0 +-1.397659664997059;0.4611159883769019;0 +-1.399230461323854;0.4508185457901353;0 +-1.40359378445384;0.4420918995301636;0 +-1.407957107583826;0.4392993727269727;0 +-1.415112957517002;0.4377285764001778;0 +-1.418080017245393;0.445058959258554;0 +-1.425410400103769;0.4508185457901353;0 +-1.429773723233755;0.4595451920501069;0 +-1.434137046363741;0.4668755749084831;0 +-1.439896632895322;0.4726351614400644;0 +-1.441292896296917;0.4785692808968452;0 +-1.438500369493726;0.4872959271568168;0 +-1.444259956025308;0.4857251308300219;0 +-1.444259956025308;0.4916592502868026;0 +-1.442863692623712;0.4988151002199793;0 +-1.445656219426903;0.507541746479951;0 +-1.450019542556889;0.5091125428067459;0 +-1.457349925415265;0.519235452468313;0 +-1.464680308273641;0.5249950389998943;0 +-1.473406954533613;0.5235987755982988;0 +-1.48056280446679;0.519235452468313;0 +-1.489289450726761;0.5178391890667177;0 +-1.492256510455152;0.5249950389998943;0 +-1.500983156715123;0.5279620987282847;0 +-1.506742743246704;0.5323254218582705;0 +-1.515469389506676;0.5309291584566751;0 +-1.524196035766648;0.5293583621298801;0 +-1.53292268202662;0.5293583621298801;0 +-1.53588974175501;0.5352924815866609;0 +-1.53588974175501;0.5352924815866609;0 +-1.540253064884996;0.5309291584566751;0 +-1.548979711144967;0.5323254218582705;0 +-1.556310094003344;0.5323254218582705;0 +-1.565036740263315;0.5279620987282847;0 +-1.573763386523287;0.5323254218582705;0 +-1.578126709653273;0.5249950389998943;0 +-1.572192590196492;0.5235987755982988;0 +-1.565036740263315;0.5249950389998943;0 +-1.557706357404939;0.5249950389998943;0 +-1.559102620806535;0.5206317158699084;0 +-1.56346594393652;0.5178391890667177;0 +-1.56346594393652;0.5148721293383272;0 +-1.554739297676549;0.5091125428067459;0 +-1.557706357404939;0.5061454830783556;0 +-1.562069680534925;0.5105088062083414;0 +-1.567829267066506;0.5119050696099369;0 +-1.573763386523287;0.5091125428067459;0 +-1.583886296184854;0.507541746479951;0 +-1.592612942444826;0.5091125428067459;0 +-1.594009205846421;0.5148721293383272;0 +-1.602735852106393;0.5206317158699084;0 +-1.610066234964769;0.5162683927399226;0 +-1.618792881224741;0.5178391890667177;0 +-1.627519527484712;0.5206317158699084;0 +-1.637642437146279;0.519235452468313;0 +-1.644972820004656;0.5178391890667177;0 +-1.653699466264627;0.5134758659367318;0 +-1.653699466264627;0.5206317158699084;0 +-1.659459052796208;0.5178391890667177;0 +-1.655095729666223;0.5105088062083414;0 +-1.661029849123004;0.5061454830783556;0 +-1.666789435654585;0.5017821599483697;0 +-1.675516081914556;0.5003858965467743;0 +-1.684242728174528;0.4944517770899935;0 +-1.6929693744345;0.4886921905584123;0 +-1.698728960966081;0.482932604026831;0 +-1.700299757292876;0.4742059577668594;0 +-1.697332697564486;0.4654793115068877;0 +-1.697332697564486;0.456752665246916;0 +-1.69593643416289;0.4494222823885398;0 +-1.700299757292876;0.4420918995301636;0 +-1.703092284096067;0.433365253270192;0 +-1.706059343824457;0.4246386070102203;0 +-1.706059343824457;0.4159119607502487;0 +-1.706059343824457;0.407185314490277;0 +-1.706059343824457;0.3984586682303054;0 +-1.709026403552848;0.3913028182971287;0 +-1.706059343824457;0.3825761720371571;0 +-1.697332697564486;0.3766420525803763;0 +-1.700299757292876;0.370882466048795;0 +-1.697332697564486;0.3635520831904188;0 +-1.6929693744345;0.3577924966588375;0 +-1.687209787902918;0.3520329101272563;0 +-1.682846464772932;0.3433062638672846;0 +-1.678483141642947;0.3359758810089085;0 +-1.672549022186166;0.3286454981505322;0 +-1.663822375926194;0.3258529713473414;0 +-1.655095729666223;0.322885911618951;0 +-1.649336143134641;0.3171263250873697;0 +-1.64357655660306;0.3171263250873697;0 +-1.633279114016293;0.3199188518905606;0 +-1.623156204354726;0.3214896482173555;0 +-1.613033294693159;0.3258529713473414;0 +-1.602735852106393;0.3242821750205464;0 +-1.602735852106393;0.3214896482173555;0 +-1.592612942444826;0.3242821750205464;0 +-1.594009205846421;0.3286454981505322;0 +-1.58824961931484;0.3330088212805181;0 +-1.582490032783259;0.3359758810089085;0 +-1.582490032783259;0.3433062638672846;0 +-1.579522973054868;0.3490658503988659;0 +-1.578126709653273;0.3563962332572421;0 +-1.576555913326478;0.3665191429188092;0 +-1.570796326794897;0.3694862026471996;0 +-1.562069680534925;0.370882466048795;0 +-1.553343034274953;0.3722787294503905;0 +-1.544616388014982;0.3752457891787808;0 +-1.53588974175501;0.3766420525803763;0 +-1.528559358896634;0.3752457891787808;0 +-1.519832712636662;0.3752457891787808;0 +-1.515469389506676;0.3722787294503905;0 +-1.515469389506676;0.3651228795172138;0 +-1.522799772365053;0.3577924966588375;0 +-1.525766832093443;0.3490658503988659;0 +-1.527163095495038;0.3403392041388942;0 +-1.528559358896634;0.3316125578789226;0 +-1.530130155223429;0.3214896482173555;0 +-1.534493478353415;0.3127630019573839;0 +-1.5388568014834;0.3199188518905606;0 +-1.540253064884996;0.3054326190990077;0 +-1.540253064884996;0.296705972839036;0 +-1.544616388014982;0.285012266850674;0 +-1.553343034274953;0.2792526803190927;0 +-1.546012651416577;0.2762856205907024;0 +-1.5388568014834;0.2719222974607165;0 +-1.528559358896634;0.2762856205907024;0 +-1.518436449235067;0.2734930937875114;0 +-1.509709802975095;0.2748893571891069;0 +-1.500983156715123;0.2778564169174972;0 +-1.500983156715123;0.2778564169174972;0 +-1.492256510455152;0.2762856205907024;0 +-1.48352986419518;0.2778564169174972;0 +-1.477770277663599;0.2762856205907024;0 +-1.470439894805222;0.2748893571891069;0 +-1.463109511946846;0.2675589743307307;0 +-1.45595366201367;0.2647664475275398;0 +-1.452986602285279;0.2617993877991494;0 +-1.452986602285279;0.2487094184091919;0 +-1.457349925415265;0.2413790355508158;0 +-1.457349925415265;0.2312561258892487;0 +-1.457349925415265;0.222529479629277;0 +-1.460316985143656;0.2124065699677099;0 +-1.460316985143656;0.2036799237077382;0 +-1.463109511946846;0.1963495408493621;0 +-1.460316985143656;0.1890191579909859;0 +-1.45595366201367;0.1818633080578091;0 +-1.451590338883684;0.1745329251994329;0 +-1.444259956025308;0.1687733386678517;0 +-1.436929573166932;0.1644100155378658;0 +-1.434137046363741;0.1570796326794897;0 +-1.426806663505364;0.1570796326794897;0 +-1.421047076973783;0.1527163095495038;0 +-1.410749634387017;0.1556833692778942;0 +-1.402022988127045;0.1584758960810851;0 +-1.393296341867073;0.1614429558094755;0 +-1.388933018737087;0.1672025423410568;0 +-1.380206372477116;0.1672025423410568;0 +-1.373050522543939;0.1644100155378658;0 +-1.365720139685563;0.1628392192110709;0 +-1.358389756827187;0.1570796326794897;0 +-1.352630170295605;0.1513200461479084;0 +-1.346870583764024;0.1453859266911277;0 +-1.339540200905648;0.136659280431156;0 +-1.339540200905648;0.1497492498211135;0 +-1.330813554645676;0.1570796326794897;0 +-1.32645023151569;0.1644100155378658;0 +-1.319119848657314;0.1658062789394613;0 +-1.319119848657314;0.1745329251994329;0 +-1.317723585255719;0.1832595714594046;0 +-1.313360262125733;0.1890191579909859;0 +-1.306029879267357;0.1919862177193762;0 +-1.29887402933418;0.1905899543177808;0 +-1.294510706204194;0.1963495408493621;0 +-1.282817000215832;0.1949532774477666;0 +-1.274090353955861;0.1993166005777524;0 +-1.268330767424279;0.2036799237077382;0 +-1.261000384565903;0.2064724505109292;0 +-1.256637061435917;0.2124065699677099;0 +-1.250877474904336;0.2167698930976957;0 +-1.244943355447555;0.2151990967709008;0 +-1.242150828644364;0.210835773640915;0 +-1.24651415177435;0.2036799237077382;0 +-1.255240798034322;0.2007128639793479;0 +-1.250877474904336;0.1919862177193762;0 +-1.247910415175946;0.1846558348610001;0 +-1.252273738305931;0.1788962483294187;0 +-1.256637061435917;0.1701696020694471;0 +-1.252273738305931;0.1644100155378658;0 +-1.250877474904336;0.1570796326794897;0 +-1.240580032317569;0.16004669240788;0 +-1.240580032317569;0.1701696020694471;0 +-1.24651415177435;0.1802925117310143;0 +-1.24651415177435;0.1905899543177808;0 +-1.239183768915974;0.1933824811209717;0 +-1.231853386057598;0.1963495408493621;0 +-1.224697536124421;0.2007128639793479;0 +-1.227490062927612;0.2080432468377241;0 +-1.220334212994435;0.2124065699677099;0 +-1.217367153266045;0.2007128639793479;0 +-1.210036770407669;0.2007128639793479;0 +-1.201310124147697;0.1993166005777524;0 +-1.19415427421452;0.1949532774477666;0 +-1.192583477887725;0.1876228945893904;0 +-1.189790951084534;0.1818633080578091;0 +-1.179493508497768;0.1832595714594046;0 +-1.169370598836201;0.1832595714594046;0 +-1.162040215977824;0.1846558348610001;0 +-1.154884366044648;0.1846558348610001;0 +-1.151917306316258;0.1802925117310143;0 +-1.144586923457881;0.1774999849278233;0 +-1.134464013796314;0.1759291886010284;0 +-1.125737367536342;0.1788962483294187;0 +-1.117010721276371;0.1862266311877949;0 +-1.106887811614804;0.1862266311877949;0 +-1.095194105626442;0.1862266311877949;0 +-1.085071195964875;0.1862266311877949;0 +-1.099557428756428;0.1832595714594046;0 +-1.093797842224846;0.1774999849278233;0 +-1.087863722768066;0.1701696020694471;0 +-1.082104136236484;0.1715658654710426;0 +-1.074773753378108;0.1687733386678517;0 +-1.064650843716541;0.1658062789394613;0 +-1.061683783988151;0.1570796326794897;0 +-1.064650843716541;0.1469567230179225;0 +-1.051560874326584;0.1497492498211135;0 +-1.041437964665016;0.1439896632895322;0 +-1.032711318405045;0.1382300767579509;0 +-1.023984672145073;0.1322959573011702;0 +-1.021017612416683;0.1251401073679934;0 +-1.021017612416683;0.1251401073679934;0 +-1.022413875818278;0.1178097245096172;0 +-1.015258025885101;0.1192059879112127;0 +-1.00653137962513;0.1134464013796314;0 +-1.000597260168349;0.1090830782496456;0 +-0.9962339370383633;0.1033234917180643;0 +-0.9861110273767961;0.1017526953912694;0 +-0.9773843811168246;0.1017526953912694;0 +-0.9686577348568529;0.1033234917180643;0 +-0.9599310885968813;0.1033234917180643;0 +-0.9512044423369095;0.1017526953912694;0 +-0.9424777960769379;0.09896016858807849;0 +-0.9367182095453567;0.09738937226128359;0 +-0.9293878266869805;0.09459684545809266;0 +-0.9206611804270088;0.09023352232810683;0 +-0.9133307975686326;0.08429940287132612;0 +-0.904604151308661;0.07853981633974483;0 +-0.8988445647770796;0.07417649320975901;0 +-0.890117918517108;0.06544984694978735;0 +-0.890117918517108;0.05532693728822025;0 +-0.8843583319855268;0.04363323129985824;0 +-0.8813912722571364;0.03193952531149623;0 +-0.8712683625955693;0.03054326190990077;0 +-0.8726646259971648;0.0174532925199433;0 +-0.879995008855541;0.008726646259971648;0 +-0.8857545953871222;0.002967059728390361;0 +-0.8930849782454985;-0.002967059728390361;0 +-0.8958775050486893;-0.01169370598836201;0 +-0.8974483013754843;-0.02181661564992912;0 +-0.8871508587887176;-0.0174532925199433;0 +-0.8827875356587318;-0.0291469985083053;0 +-0.879995008855541;-0.0174532925199433;0 +-0.879995008855541;-0.007330382858376183;0 +-0.8726646259971648;-0.002967059728390361;0 +-0.8639379797371932;-0.004363323129985824;0 +-0.8552113334772214;-0.002967059728390361;0 +-0.8450884238156544;-0.005759586531581288;0 +-0.8478809506188453;-0.0174532925199433;0 +-0.8508480103472356;-0.02478367537831948;0 +-0.8464846872172498;-0.02757620218151041;0 +-0.8407251006856686;-0.01448623279155293;0 +-0.8347909812288877;-0.01169370598836201;0 +-0.8246680715673207;-0.01169370598836201;0 +-0.8145451619057535;-0.0174532925199433;0 +-0.805818515645782;-0.02042035224833365;0 +-0.7941248096574199;-0.02321287905152459;0 +-0.7911577499290294;-0.0291469985083053;0 +-0.7824311036690579;-0.02617993877991494;0 +-0.7796385768658669;-0.03351032163829112;0 +-0.7752752537358811;-0.04066617157146788;0 +-0.7780677805390721;-0.04939281783143952;0 +-0.767944870877505;-0.0466002910282486;0 +-0.7592182246175333;-0.04223696789826277;0 +-0.7504915783575616;-0.04363323129985824;0 +-0.7417649320975901;-0.04799655442984406;0 +-0.7330382858376184;-0.04799655442984406;0 +-0.7243116395776468;-0.05235987755982988;0 +-0.715584993317675;-0.05235987755982988;0 +-0.7068583470577035;-0.04939281783143952;0 +-0.6981317007977318;-0.04939281783143952;0 +-0.6894050545377601;-0.05532693728822025;0 +-0.6806784082777885;-0.06108652381980154;0 +-0.6719517620178169;-0.06684611035138281;0 +-0.6661921754862357;-0.07278022980816354;0 +-0.6602580560294549;-0.07853981633974483;0 +-0.6515314097694832;-0.08290313946973064;0 +-0.6457718232379019;-0.08866272600131195;0 +-0.6370451769779303;-0.09023352232810683;0 +-0.6283185307179586;-0.08866272600131195;0 +-0.6181956210563916;-0.0916297857297023;0 +-0.6138322979264057;-0.1017526953912694;0 +-0.6108652381980153;-0.112050137978036;0 +-0.6078981784696249;-0.1221730476396031;0 +-0.6065019150680295;-0.1308996938995747;0 +-0.6078981784696249;-0.1425933998879367;0 +-0.6122615015996108;-0.1513200461479084;0 +-0.6166248247295966;-0.16004669240788;0 +-0.6209881478595823;-0.1672025423410568;0 +-0.6283185307179586;-0.1745329251994329;0 +-0.6326818538479444;-0.1818633080578091;0 +-0.6414085001079162;-0.1876228945893904;0 +-0.6457718232379019;-0.1919862177193762;0 +-0.6515314097694832;-0.2007128639793479;0 +-0.655894732899469;-0.2094395102393195;0 +-0.6632251157578452;-0.2195624199008867;0 +-0.6705554986162214;-0.2268928027592629;0 +-0.6792821448761931;-0.2326523892908441;0 +-0.6806784082777885;-0.2443460952792061;0 +-0.682074671679384;-0.2530727415391778;0 +-0.6806784082777885;-0.2617993877991494;0 +-0.6806784082777885;-0.2705260340591211;0 +-0.6792821448761931;-0.2792526803190927;0 +-0.682074671679384;-0.2893755899806598;0 +-0.6836454680061789;-0.2996730325674264;0 +-0.6836454680061789;-0.308399678827398;0 +-0.6894050545377601;-0.3141592653589793;0 +-0.6908013179393555;-0.322885911618951;0 +-0.6908013179393555;-0.3316125578789226;0 +-0.6923721142661505;-0.3403392041388942;0 +-0.7010987605261222;-0.3490658503988659;0 +-0.7010987605261222;-0.3490658503988659;0 +-0.7038912873293131;-0.3577924966588375;0 +-0.7126179335892847;-0.3665191429188092;0 +-0.715584993317675;-0.3752457891787808;0 +-0.715584993317675;-0.3839724354387525;0 +-0.7243116395776468;-0.3883357585687384;0 +-0.7330382858376184;-0.3926990816987241;0 +-0.7330382858376184;-0.4000294645571004;0 +-0.7417649320975901;-0.4000294645571004;0 +-0.7504915783575616;-0.4014257279586957;0 +-0.7592182246175333;-0.4014257279586957;0 +-0.767944870877505;-0.4000294645571004;0 +-0.7796385768658669;-0.4014257279586957;0 +-0.7766715171374767;-0.407185314490277;0 +-0.7853981633974483;-0.407185314490277;0 +-0.7927285462558246;-0.4159119607502487;0 +-0.7984881327874057;-0.4131194339470578;0 +-0.8086110424489729;-0.4188790204786391;0 +-0.8173376887089445;-0.4218460802070295;0 +-0.8246680715673207;-0.4290019301402062;0 +-0.8333947178272924;-0.4363323129985824;0 +-0.8407251006856686;-0.4436626958569586;0 +-0.8478809506188453;-0.4508185457901353;0 +-0.8478809506188453;-0.4595451920501069;0 +-0.8478809506188453;-0.471238898038469;0 +-0.8464846872172498;-0.4799655442984406;0 +-0.8478809506188453;-0.4886921905584123;0 +-0.8508480103472356;-0.4974188368183839;0 +-0.8552113334772214;-0.5003858965467743;0 +-0.8625417163355976;-0.5061454830783556;0 +-0.8696975662687744;-0.5148721293383272;0 +-0.8756316857255551;-0.5235987755982988;0 +-0.878424212528746;-0.5323254218582705;0 +-0.8843583319855268;-0.5410520681182421;0 +-0.890117918517108;-0.5497787143782138;0 +-0.8988445647770796;-0.5555383009097951;0 +-0.9075712110370514;-0.5614724203665757;0 +-0.9149015938954275;-0.5672320068981571;0 +-0.9176941206986184;-0.5759586531581288;0 +-0.9250245035569946;-0.5846852994181003;0 +-0.9337511498169663;-0.5904448859496816;0 +-0.9351474132185617;-0.5963790054064624;0 +-0.9424777960769379;-0.6021385919380436;0 +-0.9512044423369095;-0.6065019150680295;0 +-0.9599310885968813;-0.6078981784696249;0 +-0.9716247945852433;-0.6065019150680295;0 +-0.9817477042468103;-0.6078981784696249;0 +-0.9918706139083775;-0.605105651666434;0 +-0.9978047333651582;-0.6007423285364483;0 +-1.009323906428321;-0.6007423285364483;0 +-1.018050552688292;-0.5934119456780721;0 +-1.021017612416683;-0.5991715322096532;0 +-1.018050552688292;-0.605105651666434;0 +-1.003564319896739;-0.6108652381980153;0 +-0.9978047333651582;-0.6166248247295966;0 +-1.002168056495144;-0.6253514709895682;0 +-0.9978047333651582;-0.6326818538479444;0 +-0.9904743505067819;-0.6340781172495399;0 +-0.9890780871051865;-0.6428047635095115;0 +-0.9948376736367678;-0.6515314097694832;0 +-1.002168056495144;-0.6588617926278594;0 +-1.004960583298335;-0.6661921754862357;0 +-1.015258025885101;-0.6705554986162214;0 +-1.023984672145073;-0.6733480254194123;0 +-1.035503845208236;-0.6763150851478027;0 +-1.047197551196598;-0.6777113485493982;0 +-1.055924197456569;-0.6792821448761931;0 +-1.069014166846527;-0.6806784082777885;0 +-1.082104136236484;-0.6806784082777885;0 +-1.08646745936647;-0.6763150851478027;0 +-1.087863722768066;-0.6836454680061789;0 +-1.082104136236484;-0.6894050545377601;0 +-1.085071195964875;-0.6951646410693415;0 +-1.08943451909486;-0.7038912873293131;0 +-1.08646745936647;-0.7082546104592988;0 +-1.087863722768066;-0.7141887299160796;0 +-1.099557428756428;-0.7185520530460655;0 +-1.114043661547981;-0.7185520530460655;0 +-1.122770307807952;-0.715584993317675;0 +-1.131496954067924;-0.7112216701876892;0 +-1.137431073524705;-0.715584993317675;0 +-1.134464013796314;-0.7243116395776468;0 +-1.134464013796314;-0.7344345492392138;0 +-1.125737367536342;-0.7387978723691996;0 +-1.112647398146385;-0.7344345492392138;0 +-1.109680338417995;-0.7431611954991855;0 +-1.11125113474479;-0.7475245186291712;0 +-1.119977781004761;-0.7475245186291712;0 +-1.125737367536342;-0.7417649320975901;0 +-1.134464013796314;-0.7475245186291712;0 +-1.122770307807952;-0.7504915783575616;0 +-1.134464013796314;-0.756251164889143;0 +-1.1388273369263;-0.7621852843459237;0 +-1.137431073524705;-0.767944870877505;0 +-1.137431073524705;-0.7766715171374767;0 +-1.144586923457881;-0.7796385768658669;0 +-1.144586923457881;-0.7853981633974483;0 +-1.154884366044648;-0.7853981633974483;0 +-1.16640353910781;-0.7897614865274341;0 +-1.172337658564591;-0.7941248096574199;0 +-1.172337658564591;-0.7941248096574199;0 +-1.178097245096172;-0.8028514559173915;0 +-1.176700981694577;-0.8115781021773631;0 +-1.169370598836201;-0.8173376887089445;0 +-1.160643952576229;-0.8232718081657252;0 +-1.147553983186272;-0.8232718081657252;0 +-1.146157719784676;-0.8290313946973066;0 +-1.148950246587867;-0.8377580409572781;0 +-1.157676892847839;-0.8435176274888594;0 +-1.169370598836201;-0.8494517469456402;0 +-1.178097245096172;-0.8552113334772214;0 +-1.181064304824563;-0.8639379797371932;0 +-1.183856831627754;-0.8726646259971648;0 +-1.195550537616116;-0.8756316857255551;0 +-1.204277183876087;-0.8813912722571364;0 +-1.207244243604478;-0.890117918517108;0 +-1.204277183876087;-0.8974483013754843;0 +-1.201310124147697;-0.904604151308661;0 +-1.192583477887725;-0.9133307975686326;0 +-1.204277183876087;-0.9119345341670372;0 +-1.213003830136059;-0.9119345341670372;0 +-1.214400093537654;-0.9162978572970231;0 +-1.221730476396031;-0.9162978572970231;0 +-1.234820445785988;-0.9206611804270088;0 +-1.237787505514379;-0.9293878266869805;0 +-1.237787505514379;-0.938114472946952;0 +-1.24354709204596;-0.9395107363485476;0 +-1.256637061435917;-0.9367182095453567;0 +-1.261000384565903;-0.9323548864153709;0 +-1.244943355447555;-0.9279915632853851;0 +-1.240580032317569;-0.9220574438286042;0 +-1.247910415175946;-0.9206611804270088;0 +-1.256637061435917;-0.9279915632853851;0 +-1.265363707695889;-0.9323548864153709;0 +-1.277057413684251;-0.9279915632853851;0 +-1.282817000215832;-0.9236282401553992;0 +-1.282817000215832;-0.9192649170254134;0 +-1.291543646475804;-0.9176941206986184;0 +-1.294510706204194;-0.9105382707654417;0 +-1.300270292735775;-0.9149015938954275;0 +-1.308996938995747;-0.9119345341670372;0 +-1.308996938995747;-0.9032078879070654;0 +-1.297303233007385;-0.904604151308661;0 +-1.294510706204194;-0.8988445647770796;0 +-1.297303233007385;-0.890117918517108;0 +-1.300270292735775;-0.8958775050486893;0 +-1.314756525527328;-0.9002408281786752;0 +-1.308996938995747;-0.8930849782454985;0 +-1.306029879267357;-0.8843583319855268;0 +-1.300270292735775;-0.8857545953871222;0 +-1.303237352464166;-0.879995008855541;0 +-1.300270292735775;-0.8726646259971648;0 +-1.314756525527328;-0.8857545953871222;0 +-1.314756525527328;-0.8756316857255551;0 +-1.308996938995747;-0.8712683625955693;0 +-1.317723585255719;-0.8696975662687744;0 +-1.316327321854123;-0.8625417163355976;0 +-1.319119848657314;-0.8581783932056118;0 +-1.316327321854123;-0.8478809506188453;0 +-1.316327321854123;-0.8407251006856686;0 +-1.314756525527328;-0.8347909812288877;0 +-1.307600675594152;-0.8333947178272924;0 +-1.300270292735775;-0.8435176274888594;0 +-1.300270292735775;-0.8347909812288877;0 +-1.29887402933418;-0.827635131295711;0 +-1.291543646475804;-0.8173376887089445;0 +-1.300270292735775;-0.8173376887089445;0 +-1.308996938995747;-0.8145451619057535;0 +-1.317723585255719;-0.8189084850357394;0 +-1.317723585255719;-0.8129743655789586;0 +-1.304633615865761;-0.805818515645782;0 +-1.308996938995747;-0.8014551925157961;0 +-1.300270292735775;-0.7998843961890013;0 +-1.303237352464166;-0.7955210730590153;0 +-1.300270292735775;-0.7897614865274341;0 +-1.297303233007385;-0.7853981633974483;0 +-1.300270292735775;-0.7780677805390721;0 +-1.29590696960579;-0.7709119306058954;0 +-1.288576586747413;-0.7649778111491147;0 +-1.282817000215832;-0.7709119306058954;0 +-1.285784059944223;-0.7752752537358811;0 +-1.284213263617428;-0.7796385768658669;0 +-1.288576586747413;-0.7853981633974483;0 +-1.285784059944223;-0.7883652231258387;0 +-1.284213263617428;-0.7941248096574199;0 +-1.279849940487442;-0.7853981633974483;0 +-1.281420736814237;-0.7796385768658669;0 +-1.274090353955861;-0.7752752537358811;0 +-1.277057413684251;-0.7709119306058954;0 +-1.27112329422747;-0.7635815477475191;0 +-1.274090353955861;-0.7578219612159379;0 +-1.269727030825875;-0.7504915783575616;0 +-1.269727030825875;-0.7387978723691996;0 +-1.265363707695889;-0.7360053455660087;0 +-1.269727030825875;-0.7330382858376184;0 +-1.265363707695889;-0.7272786993060371;0 +-1.274090353955861;-0.7243116395776468;0 +-1.277057413684251;-0.730071226109228;0 +-1.284213263617428;-0.7286749627076327;0 +-1.287180323345818;-0.7229153761760513;0 +-1.287180323345818;-0.7229153761760513;0 +-1.288576586747413;-0.715584993317675;0 +-1.285784059944223;-0.7082546104592988;0 +-1.285784059944223;-0.6981317007977318;0 +-1.278453677085846;-0.6894050545377601;0 +-1.279849940487442;-0.6806784082777885;0 +-1.281420736814237;-0.6733480254194123;0 +-1.281420736814237;-0.6661921754862357;0 +-1.285784059944223;-0.6588617926278594;0 +-1.282817000215832;-0.6487388829662923;0 +-1.275486617357456;-0.6487388829662923;0 +-1.275486617357456;-0.6400122367063207;0 +-1.27112329422747;-0.6370451769779303;0 +-1.268330767424279;-0.6283185307179586;0 +-1.265363707695889;-0.619591884457987;0 +-1.259604121164308;-0.6108652381980153;0 +-1.255240798034322;-0.6021385919380436;0 +-1.253670001707527;-0.5934119456780721;0 +-1.249306678577541;-0.5876523591464908;0 +-1.250877474904336;-0.5789257128865191;0 +-1.244943355447555;-0.5672320068981571;0 +-1.247910415175946;-0.5614724203665757;0 +-1.247910415175946;-0.5555383009097951;0 +-1.249306678577541;-0.5468116546498234;0 +-1.250877474904336;-0.5366887449882564;0 +-1.249306678577541;-0.5279620987282847;0 +-1.24354709204596;-0.5235987755982988;0 +-1.244943355447555;-0.5119050696099369;0 +-1.247910415175946;-0.5061454830783556;0 +-1.24354709204596;-0.4974188368183839;0 +-1.242150828644364;-0.4886921905584123;0 +-1.237787505514379;-0.4799655442984406;0 +-1.237787505514379;-0.471238898038469;0 +-1.231853386057598;-0.4595451920501069;0 +-1.234820445785988;-0.4494222823885398;0 +-1.230457122656002;-0.4436626958569586;0 +-1.230457122656002;-0.4363323129985824;0 +-1.231853386057598;-0.4276056667386107;0 +-1.230457122656002;-0.4188790204786391;0 +-1.230457122656002;-0.4101523742186675;0 +-1.230457122656002;-0.4014257279586957;0 +-1.226093799526016;-0.3926990816987241;0 +-1.224697536124421;-0.3839724354387525;0 +-1.223126739797626;-0.3752457891787808;0 +-1.224697536124421;-0.3665191429188092;0 +-1.224697536124421;-0.3577924966588375;0 +-1.223126739797626;-0.3490658503988659;0 +-1.226093799526016;-0.3373721444105038;0 +-1.227490062927612;-0.3272492347489368;0 +-1.227490062927612;-0.3185225884889651;0 +-1.236216709187584;-0.3111922056305889;0 +-1.242150828644364;-0.308399678827398;0 +-1.247910415175946;-0.3010692959690218;0 +-1.256637061435917;-0.296705972839036;0 +-1.265363707695889;-0.2909463863074548;0 +-1.27112329422747;-0.2893755899806598;0 +-1.282817000215832;-0.2836160034490786;0 +-1.291543646475804;-0.2762856205907024;0 +-1.300270292735775;-0.2748893571891069;0 +-1.311963998724138;-0.2675589743307307;0 +-1.317723585255719;-0.2617993877991494;0 +-1.3234831717873;-0.2560398012675681;0 +-1.330813554645676;-0.2473131550075965;0 +-1.329417291244081;-0.2385865087476248;0 +-1.335176877775662;-0.2268928027592629;0 +-1.338143937504052;-0.2181661564992912;0 +-1.343903524035634;-0.2124065699677099;0 +-1.346870583764024;-0.2064724505109292;0 +-1.352630170295605;-0.1977458042509575;0 +-1.355597230023996;-0.1890191579909859;0 +-1.364323876283967;-0.1774999849278233;0 +-1.367116403087158;-0.1687733386678517;0 +-1.370083462815548;-0.16004669240788;0 +-1.373050522543939;-0.1513200461479084;0 +-1.37881010907552;-0.1425933998879367;0 +-1.387536755335492;-0.136659280431156;0 +-1.390503815063882;-0.1265363707695889;0 +-1.396263401595464;-0.1192059879112127;0 +-1.402022988127045;-0.1134464013796314;0 +-1.410749634387017;-0.1090830782496456;0 +-1.416683753843797;-0.1047197551196598;0 +-1.410749634387017;-0.09896016858807849;0 +-1.416683753843797;-0.09023352232810683;0 +-1.419476280646988;-0.0815068760681352;0 +-1.419476280646988;-0.07417649320975901;0 +-1.410749634387017;-0.06684611035138281;0 +-1.402022988127045;-0.06108652381980154;0 +-1.396263401595464;-0.05811946409141117;0 +-1.393296341867073;-0.04939281783143952;0 +-1.390503815063882;-0.04363323129985824;0 +-1.397659664997059;-0.04363323129985824;0 +-1.399230461323854;-0.05235987755982988;0 +-1.406386311257031;-0.04363323129985824;0 +-1.412320430713812;-0.04066617157146788;0 +-1.409353370985421;-0.03787364476827695;0 +-1.409353370985421;-0.0291469985083053;0 +-1.412320430713812;-0.0174532925199433;0 +-1.404990047855435;-0.01448623279155293;0 +-1.404990047855435;-0.005759586531581288;0 +-1.397659664997059;0;0 +3.141592653589793;-1.569050997542902;0 +2.792526803190927;-1.569050997542902;0 +2.443460952792061;-1.569050997542902;0 +2.094395102393195;-1.569050997542902;0 +1.74532925199433;-1.569050997542902;0 +1.396263401595464;-1.569050997542902;0 +1.047197551196598;-1.569050997542902;0 +0.6981317007977318;-1.569050997542902;0 +0.3490658503988659;-1.569050997542902;0 +0;-1.569050997542902;0 +-0.3490658503988659;-1.569050997542902;0 +-0.6981317007977318;-1.569050997542902;0 +-1.047197551196598;-1.569050997542902;0 +-1.396263401595464;-1.569050997542902;0 +-1.74532925199433;-1.569050997542902;0 +-2.094395102393195;-1.569050997542902;0 +-2.443460952792061;-1.569050997542902;0 +-2.792526803190927;-1.569050997542902;0 +-3.141592653589793;-1.569050997542902;0 +-3.141592653589793;-1.463109511946846;0 +-3.106686068549907;-1.471836158206818;0 +-3.036872898470133;-1.474803217935208;0 +-2.96705972839036;-1.477770277663599;0 +-2.897246558310587;-1.482133600793585;0 +-2.844886680750757;-1.490860247053556;0 +-2.757620218151041;-1.490860247053556;0 +-2.652900463031381;-1.493652773856747;0 +-2.548180707911721;-1.489289450726761;0 +-2.565634000431665;-1.48056280446679;0 +-2.635447170511438;-1.474803217935208;0 +-2.679080401811296;-1.466076571675237;0 +-2.670353755551324;-1.457349925415265;0 +-2.687807048071268;-1.448623279155294;0 +-2.687807048071268;-1.439896632895322;0 +-2.687807048071268;-1.43116998663535;0 +-2.696533694331239;-1.422443340375378;0 +-2.670353755551324;-1.416683753843797;0 +-2.617993877991494;-1.413716694115407;0 +-2.556907354171693;-1.412320430713812;0 +-2.539454061651749;-1.407957107583826;0 +-2.583087292951608;-1.402022988127045;0 +-2.617993877991494;-1.396263401595464;0 +-2.661627109291353;-1.390503815063882;0 +-2.705260340591211;-1.383173432205506;0 +-2.740166925631097;-1.37584304934713;0 +-2.757620218151041;-1.370083462815548;0 +-2.734407339099516;-1.368687199413953;0 +-2.696533694331239;-1.370083462815548;0 +-2.696533694331239;-1.364323876283967;0 +-2.734407339099516;-1.362753079957173;0 +-2.757620218151041;-1.358389756827187;0 +-2.763379804682622;-1.352630170295605;0 +-2.769313924139403;-1.346870583764024;0 +-2.740166925631097;-1.343903524035634;0 +-2.687807048071268;-1.346870583764024;0 +-2.670353755551324;-1.354026433697201;0 +-2.626720524251466;-1.358389756827187;0 +-2.583087292951608;-1.355597230023996;0 +-2.548180707911721;-1.34826684716562;0 +-2.548180707911721;-1.339540200905648;0 +-2.553940294443303;-1.332209818047272;0 +-2.559874413900083;-1.325053968114095;0 +-2.513274122871834;-1.3234831717873;0 +-2.478367537831948;-1.319119848657314;0 +-2.455154658780423;-1.322086908385705;0 +-2.443460952792061;-1.316327321854123;0 +-2.414313954283756;-1.313360262125733;0 +-2.38534148870065;-1.308996938995747;0 +-2.364921136452316;-1.304633615865761;0 +-2.321287905152458;-1.304633615865761;0 +-2.303834612632515;-1.308996938995747;0 +-2.283414260384181;-1.316327321854123;0 +-2.263168441061047;-1.322086908385705;0 +-2.234021442552742;-1.32645023151569;0 +-2.216568150032799;-1.32645023151569;0 +-2.213601090304408;-1.320690644984109;0 +-2.204874444044437;-1.311963998724138;0 +-2.190388211252884;-1.303237352464166;0 +-2.17293491873294;-1.297303233007385;0 +-2.152514566484606;-1.288576586747413;0 +-2.158448685941387;-1.278453677085846;0 +-2.135061273964663;-1.278453677085846;0 +-2.11760798144472;-1.287180323345818;0 +-2.094395102393195;-1.291543646475804;0 +-2.094395102393195;-1.284213263617428;0 +-2.06524810388489;-1.285784059944223;0 +-2.036275638301784;-1.285784059944223;0 +-2.030341518845003;-1.288576586747413;0 +-2.053728930821728;-1.294510706204194;0 +-2.053728930821728;-1.303237352464166;0 +-2.030341518845003;-1.311963998724138;0 +-1.983915760741954;-1.313360262125733;0 +-1.96052834876523;-1.308996938995747;0 +-1.963495408493621;-1.300270292735775;0 +-1.966462468222011;-1.291543646475804;0 +-1.954768762233649;-1.285784059944223;0 +-1.946042115973677;-1.291543646475804;0 +-1.937315469713706;-1.300270292735775;0 +-1.925621763725344;-1.308996938995747;0 +-1.896649298142238;-1.311963998724138;0 +-1.893682238413847;-1.303237352464166;0 +-1.911135530933791;-1.300270292735775;0 +-1.911135530933791;-1.291543646475804;0 +-1.890715178685457;-1.291543646475804;0 +-1.884955592153876;-1.297303233007385;0 +-1.893682238413847;-1.303237352464166;0 +-1.876228945893904;-1.310393202397343;0 +-1.850049007113989;-1.310393202397343;0 +-1.823869068334074;-1.307600675594152;0 +-1.823869068334074;-1.301666556137371;0 +-1.791929543022578;-1.301666556137371;0 +-1.768542131045854;-1.304633615865761;0 +-1.74532925199433;-1.308996938995747;0 +-1.736602605734358;-1.304633615865761;0 +-1.768542131045854;-1.297303233007385;0 +-1.757022957982692;-1.291543646475804;0 +-1.771509190774244;-1.287180323345818;0 +-1.771509190774244;-1.282817000215832;0 +-1.74532925199433;-1.284213263617428;0 +-1.74532925199433;-1.284213263617428;0 +-1.727875959474386;-1.281420736814237;0 +-1.74532925199433;-1.275486617357456;0 +-1.768542131045854;-1.278453677085846;0 +-1.788962483294188;-1.269727030825875;0 +-1.768542131045854;-1.268330767424279;0 +-1.771509190774244;-1.274090353955861;0 +-1.739569665462748;-1.272694090554265;0 +-1.719149313214414;-1.279849940487442;0 +-1.710422666954443;-1.275486617357456;0 +-1.701696020694471;-1.281420736814237;0 +-1.701696020694471;-1.287180323345818;0 +-1.681275668446137;-1.287180323345818;0 +-1.675516081914556;-1.281420736814237;0 +-1.675516081914556;-1.275486617357456;0 +-1.701696020694471;-1.272694090554265;0 +-1.719149313214414;-1.265363707695889;0 +-1.739569665462748;-1.259604121164308;0 +-1.762782544514273;-1.255240798034322;0 +-1.742362192265939;-1.252273738305931;0 +-1.716182253486024;-1.256637061435917;0 +-1.6929693744345;-1.253670001707527;0 +-1.669756495382975;-1.258033324837513;0 +-1.669756495382975;-1.263967444294293;0 +-1.64060949687467;-1.266759971097484;0 +-1.610066234964769;-1.269727030825875;0 +-1.579522973054868;-1.272694090554265;0 +-1.548979711144967;-1.272694090554265;0 +-1.518436449235067;-1.272694090554265;0 +-1.492256510455152;-1.275486617357456;0 +-1.471836158206818;-1.272694090554265;0 +-1.448623279155294;-1.27112329422747;0 +-1.418080017245393;-1.272694090554265;0 +-1.387536755335492;-1.274090353955861;0 +-1.370083462815548;-1.278453677085846;0 +-1.373050522543939;-1.27112329422747;0 +-1.361356816555577;-1.263967444294293;0 +-1.335176877775662;-1.266759971097484;0 +-1.308996938995747;-1.27112329422747;0 +-1.291543646475804;-1.274090353955861;0 +-1.300270292735775;-1.282817000215832;0 +-1.274090353955861;-1.281420736814237;0 +-1.247910415175946;-1.279849940487442;0 +-1.221730476396031;-1.277057413684251;0 +-1.195550537616116;-1.275486617357456;0 +-1.178097245096172;-1.27112329422747;0 +-1.169370598836201;-1.262396647967498;0 +-1.169370598836201;-1.253670001707527;0 +-1.178097245096172;-1.247910415175946;0 +-1.178097245096172;-1.237787505514379;0 +-1.186823891356144;-1.229060859254407;0 +-1.195550537616116;-1.221730476396031;0 +-1.195550537616116;-1.211607566734464;0 +-1.175130185367782;-1.211607566734464;0 +-1.163611012304619;-1.205673447277683;0 +-1.175130185367782;-1.201310124147697;0 +-1.16640353910781;-1.195550537616116;0 +-1.16640353910781;-1.18822015475774;0 +-1.178097245096172;-1.182460568226158;0 +-1.178097245096172;-1.176700981694577;0 +-1.195550537616116;-1.182460568226158;0 +-1.208640507006073;-1.182460568226158;0 +-1.210036770407669;-1.175130185367782;0 +-1.198517597344506;-1.167974335434605;0 +-1.183856831627754;-1.163611012304619;0 +-1.181064304824563;-1.170766862237796;0 +-1.169370598836201;-1.169370598836201;0 +-1.157676892847839;-1.175130185367782;0 +-1.157676892847839;-1.16640353910781;0 +-1.143190660056286;-1.162040215977824;0 +-1.148950246587867;-1.156280629446243;0 +-1.134464013796314;-1.150521042914662;0 +-1.117010721276371;-1.143190660056286;0 +-1.117010721276371;-1.13586027719791;0 +-1.099557428756428;-1.137431073524705;0 +-1.093797842224846;-1.130100690666328;0 +-1.076344549704903;-1.128704427264733;0 +-1.073377489976513;-1.121374044406357;0 +-1.064650843716541;-1.117010721276371;0 +-1.041437964665016;-1.114043661547981;0 +-1.026777198948264;-1.109680338417995;0 +-1.012290966156711;-1.105317015288009;0 +-0.9978047333651582;-1.103920751886413;0 +-0.9890780871051865;-1.109680338417995;0 +-1.000597260168349;-1.109680338417995;0 +-1.015258025885101;-1.114043661547981;0 +-0.9992009967667536;-1.114043661547981;0 +-1.000597260168349;-1.124341104134747;0 +-1.015258025885101;-1.122770307807952;0 +-1.023984672145073;-1.117010721276371;0 +-1.029744258676654;-1.125737367536342;0 +-1.041437964665016;-1.122770307807952;0 +-1.055924197456569;-1.128704427264733;0 +-1.070410430248122;-1.134464013796314;0 +-1.082104136236484;-1.14179439665469;0 +-1.085071195964875;-1.147553983186272;0 +-1.087863722768066;-1.153313569717853;0 +-1.093797842224846;-1.160643952576229;0 +-1.108284075016399;-1.156280629446243;0 +-1.117010721276371;-1.160643952576229;0 +-1.117010721276371;-1.160643952576229;0 +-1.11125113474479;-1.167974335434605;0 +-1.128704427264733;-1.167974335434605;0 +-1.140223600327895;-1.175130185367782;0 +-1.143190660056286;-1.183856831627754;0 +-1.131496954067924;-1.18822015475774;0 +-1.140223600327895;-1.192583477887725;0 +-1.131496954067924;-1.199913860746102;0 +-1.11125113474479;-1.199913860746102;0 +-1.093797842224846;-1.205673447277683;0 +-1.087863722768066;-1.215970889864449;0 +-1.082104136236484;-1.224697536124421;0 +-1.073377489976513;-1.231853386057598;0 +-1.076344549704903;-1.237787505514379;0 +-1.064650843716541;-1.242150828644364;0 +-1.061683783988151;-1.249306678577541;0 +-1.076344549704903;-1.256637061435917;0 +-1.061683783988151;-1.262396647967498;0 +-1.064650843716541;-1.268330767424279;0 +-1.044230491468207;-1.274090353955861;0 +-1.050164610924988;-1.279849940487442;0 +-1.073377489976513;-1.281420736814237;0 +-1.064650843716541;-1.287180323345818;0 +-1.05889125718496;-1.297303233007385;0 +-1.076344549704903;-1.303237352464166;0 +-1.076344549704903;-1.310393202397343;0 +-1.099557428756428;-1.311963998724138;0 +-1.099557428756428;-1.320690644984109;0 +-1.11125113474479;-1.327846494917286;0 +-1.143190660056286;-1.335176877775662;0 +-1.175130185367782;-1.343903524035634;0 +-1.134464013796314;-1.346870583764024;0 +-1.090830782496456;-1.345299787437229;0 +-1.047197551196598;-1.345299787437229;0 +-1.00653137962513;-1.34826684716562;0 +-0.9773843811168246;-1.354026433697201;0 +-0.9367182095453567;-1.359960553153982;0 +-0.90181162450547;-1.365720139685563;0 +-0.8609709200088027;-1.370083462815548;0 +-0.831998454425697;-1.374446785945534;0 +-0.767944870877505;-1.37584304934713;0 +-0.715584993317675;-1.37584304934713;0 +-0.6719517620178169;-1.374446785945534;0 +-0.6340781172495399;-1.367116403087158;0 +-0.6108652381980153;-1.358389756827187;0 +-0.58171823968971;-1.352630170295605;0 +-0.5527457741066042;-1.346870583764024;0 +-0.5235987755982988;-1.340936464307243;0 +-0.4944517770899935;-1.335176877775662;0 +-0.471238898038469;-1.327846494917286;0 +-0.4537856055185257;-1.320690644984109;0 +-0.4188790204786391;-1.314756525527328;0 +-0.4131194339470578;-1.304633615865761;0 +-0.3897320219703337;-1.29887402933418;0 +-0.360759556387228;-1.292939909877399;0 +-0.3373721444105038;-1.287180323345818;0 +-0.308399678827398;-1.281420736814237;0 +-0.285012266850674;-1.275486617357456;0 +-0.2560398012675681;-1.272694090554265;0 +-0.2356194490192345;-1.27112329422747;0 +-0.2151990967709008;-1.266759971097484;0 +-0.1977458042509575;-1.261000384565903;0 +-0.1949532774477666;-1.255240798034322;0 +-0.2094395102393195;-1.250877474904336;0 +-0.2124065699677099;-1.244943355447555;0 +-0.2007128639793479;-1.24354709204596;0 +-0.1919862177193762;-1.249306678577541;0 +-0.1832595714594046;-1.24354709204596;0 +-0.1701696020694471;-1.239183768915974;0 +-0.1570796326794897;-1.242150828644364;0 +-0.1513200461479084;-1.24651415177435;0 +-0.148352986419518;-1.253670001707527;0 +-0.1279326341711844;-1.250877474904336;0 +-0.1338667536279651;-1.24651415177435;0 +-0.1279326341711844;-1.240580032317569;0 +-0.1338667536279651;-1.236216709187584;0 +-0.1192059879112127;-1.234820445785988;0 +-0.1017526953912694;-1.234820445785988;0 +-0.1017526953912694;-1.239183768915974;0 +-0.1047197551196598;-1.244943355447555;0 +-0.07853981633974483;-1.244943355447555;0 +-0.05235987755982988;-1.24354709204596;0 +-0.05235987755982988;-1.233424182384393;0 +-0.05811946409141117;-1.229060859254407;0 +-0.04363323129985824;-1.226093799526016;0 +-0.0291469985083053;-1.229060859254407;0 +-0.0174532925199433;-1.233424182384393;0 +-0.02617993877991494;-1.239183768915974;0 +-0.01169370598836201;-1.24354709204596;0 +0;-1.247910415175946;0 +0.02321287905152459;-1.24354709204596;0 +0.0466002910282486;-1.237787505514379;0 +0.06108652381980154;-1.231853386057598;0 +0.0815068760681352;-1.227490062927612;0 +0.1104793416512411;-1.227490062927612;0 +0.1279326341711844;-1.223126739797626;0 +0.1513200461479084;-1.223126739797626;0 +0.1745329251994329;-1.224697536124421;0 +0.1977458042509575;-1.223126739797626;0 +0.2211332162276816;-1.223126739797626;0 +0.2211332162276816;-1.223126739797626;0 +0.2501056818107875;-1.224697536124421;0 +0.2734930937875114;-1.224697536124421;0 +0.296705972839036;-1.224697536124421;0 +0.3199188518905606;-1.224697536124421;0 +0.3490658503988659;-1.227490062927612;0 +0.3752457891787808;-1.229060859254407;0 +0.4014257279586957;-1.231853386057598;0 +0.4305727264670011;-1.229060859254407;0 +0.4420918995301636;-1.224697536124421;0 +0.471238898038469;-1.224697536124421;0 +0.4944517770899935;-1.220334212994435;0 +0.5235987755982988;-1.21876341666764;0 +0.5468116546498234;-1.214400093537654;0 +0.5585053606381855;-1.213003830136059;0 +0.5846852994181003;-1.213003830136059;0 +0.58171823968971;-1.204277183876087;0 +0.5846852994181003;-1.198517597344506;0 +0.5991715322096532;-1.196946801017711;0 +0.6108652381980153;-1.202880920474492;0 +0.6283185307179586;-1.210036770407669;0 +0.6457718232379019;-1.213003830136059;0 +0.6689847022894264;-1.214400093537654;0 +0.6749188217462072;-1.223126739797626;0 +0.6864379948093697;-1.215970889864449;0 +0.6951646410693415;-1.213003830136059;0 +0.6951646410693415;-1.207244243604478;0 +0.6981317007977318;-1.201310124147697;0 +0.7213445798492564;-1.195550537616116;0 +0.7330382858376184;-1.189790951084534;0 +0.756251164889143;-1.183856831627754;0 +0.7766715171374767;-1.182460568226158;0 +0.8028514559173915;-1.182460568226158;0 +0.8203047484373349;-1.179493508497768;0 +0.8407251006856686;-1.181064304824563;0 +0.8464846872172498;-1.176700981694577;0 +0.8609709200088027;-1.176700981694577;0 +0.8696975662687744;-1.183856831627754;0 +0.8813912722571364;-1.179493508497768;0 +0.8756316857255551;-1.169370598836201;0 +0.8813912722571364;-1.160643952576229;0 +0.8988445647770796;-1.156280629446243;0 +0.9105382707654417;-1.150521042914662;0 +0.9367182095453567;-1.148950246587867;0 +0.9628981483252715;-1.150521042914662;0 +0.9773843811168246;-1.156280629446243;0 +0.9978047333651582;-1.159247689174634;0 +0.9978047333651582;-1.163611012304619;0 +0.9831439676484057;-1.165007275706215;0 +0.9948376736367678;-1.167974335434605;0 +1.012290966156711;-1.169370598836201;0 +1.029744258676654;-1.172337658564591;0 +1.035503845208236;-1.178097245096172;0 +1.05889125718496;-1.175130185367782;0 +1.076344549704903;-1.179493508497768;0 +1.093797842224846;-1.181064304824563;0 +1.11125113474479;-1.178097245096172;0 +1.134464013796314;-1.179493508497768;0 +1.157676892847839;-1.182460568226158;0 +1.181064304824563;-1.183856831627754;0 +1.198517597344506;-1.183856831627754;0 +1.213003830136059;-1.181064304824563;0 +1.213003830136059;-1.189790951084534;0 +1.221730476396031;-1.196946801017711;0 +1.230457122656002;-1.204277183876087;0 +1.213003830136059;-1.207244243604478;0 +1.21876341666764;-1.214400093537654;0 +1.21876341666764;-1.223126739797626;0 +1.233424182384393;-1.230457122656002;0 +1.250877474904336;-1.229060859254407;0 +1.239183768915974;-1.223126739797626;0 +1.262396647967498;-1.217367153266045;0 +1.282817000215832;-1.214400093537654;0 +1.300270292735775;-1.215970889864449;0 +1.317723585255719;-1.21876341666764;0 +1.329417291244081;-1.213003830136059;0 +1.346870583764024;-1.207244243604478;0 +1.361356816555577;-1.205673447277683;0 +1.367116403087158;-1.195550537616116;0 +1.37881010907552;-1.19118721448613;0 +1.404990047855435;-1.186823891356144;0 +1.425410400103769;-1.183856831627754;0 +1.439896632895322;-1.175130185367782;0 +1.460316985143656;-1.172337658564591;0 +1.48352986419518;-1.169370598836201;0 +1.506742743246704;-1.16640353910781;0 +1.530130155223429;-1.163611012304619;0 +1.544616388014982;-1.165007275706215;0 +1.565036740263315;-1.165007275706215;0 +1.58824961931484;-1.163611012304619;0 +1.605702911834783;-1.160643952576229;0 +1.623156204354726;-1.162040215977824;0 +1.64060949687467;-1.162040215977824;0 +1.658062789394613;-1.160643952576229;0 +1.675516081914556;-1.163611012304619;0 +1.6929693744345;-1.160643952576229;0 +1.704663080422862;-1.163611012304619;0 +1.719149313214414;-1.160643952576229;0 +1.733635546005968;-1.162040215977824;0 +1.74532925199433;-1.159247689174634;0 +1.74532925199433;-1.159247689174634;0 +1.757022957982692;-1.159247689174634;0 +1.771509190774244;-1.153313569717853;0 +1.791929543022578;-1.148950246587867;0 +1.815142422074103;-1.150521042914662;0 +1.832595714594046;-1.153313569717853;0 +1.850049007113989;-1.156280629446243;0 +1.867502299633933;-1.160643952576229;0 +1.884955592153876;-1.162040215977824;0 +1.902408884673819;-1.16640353910781;0 +1.911135530933791;-1.162040215977824;0 +1.925621763725344;-1.163611012304619;0 +1.931555883182125;-1.159247689174634;0 +1.931555883182125;-1.153313569717853;0 +1.949009175702068;-1.150521042914662;0 +1.966462468222011;-1.148950246587867;0 +1.983915760741954;-1.147553983186272;0 +1.998401993533507;-1.151917306316258;0 +2.015855286053451;-1.157676892847839;0 +2.033308578573394;-1.160643952576229;0 +2.053728930821728;-1.165007275706215;0 +2.076941809873252;-1.16640353910781;0 +2.100154688924777;-1.16640353910781;0 +2.12057504117311;-1.163611012304619;0 +2.138028333693053;-1.159247689174634;0 +2.152514566484606;-1.165007275706215;0 +2.16996785900455;-1.165007275706215;0 +2.178694505264521;-1.160643952576229;0 +2.196147797784465;-1.162040215977824;0 +2.207841503772827;-1.156280629446243;0 +2.216568150032799;-1.156280629446243;0 +2.22826185602116;-1.160643952576229;0 +2.239781029084323;-1.167974335434605;0 +2.251474735072685;-1.169370598836201;0 +2.260201381332656;-1.172337658564591;0 +2.268928027592628;-1.167974335434605;0 +2.268928027592628;-1.157676892847839;0 +2.283414260384181;-1.153313569717853;0 +2.303834612632515;-1.154884366044648;0 +2.32704749168404;-1.153313569717853;0 +2.344500784203983;-1.154884366044648;0 +2.361954076723926;-1.153313569717853;0 +2.37940736924387;-1.157676892847839;0 +2.396860661763813;-1.157676892847839;0 +2.414313954283756;-1.160643952576229;0 +2.431767246803699;-1.162040215977824;0 +2.452187599052033;-1.163611012304619;0 +2.478367537831948;-1.165007275706215;0 +2.48709418409192;-1.169370598836201;0 +2.501580416883473;-1.16640353910781;0 +2.519033709403416;-1.169370598836201;0 +2.519033709403416;-1.178097245096172;0 +2.530727415391778;-1.179493508497768;0 +2.548180707911721;-1.178097245096172;0 +2.562666940703274;-1.183856831627754;0 +2.565634000431665;-1.19118721448613;0 +2.588846879483189;-1.19415427421452;0 +2.600540585471551;-1.19118721448613;0 +2.623753464523076;-1.195550537616116;0 +2.635447170511438;-1.192583477887725;0 +2.644173816771409;-1.198517597344506;0 +2.664594169019743;-1.196946801017711;0 +2.693566634602849;-1.196946801017711;0 +2.705260340591211;-1.205673447277683;0 +2.722713633111154;-1.210036770407669;0 +2.731440279371125;-1.204277183876087;0 +2.748893571891069;-1.205673447277683;0 +2.769313924139403;-1.208640507006073;0 +2.792526803190927;-1.213003830136059;0 +2.80998009571087;-1.215970889864449;0 +2.80998009571087;-1.223126739797626;0 +2.81294715543926;-1.230457122656002;0 +2.821673801699232;-1.236216709187584;0 +2.830400447959204;-1.231853386057598;0 +2.833192974762395;-1.224697536124421;0 +2.850646267282339;-1.223126739797626;0 +2.847853740479147;-1.231853386057598;0 +2.874033679259062;-1.231853386057598;0 +2.897246558310587;-1.230457122656002;0 +2.920459437362112;-1.236216709187584;0 +2.943846849338835;-1.242150828644364;0 +2.96705972839036;-1.247910415175946;0 +2.970026788118751;-1.242150828644364;0 +2.984513020910303;-1.252273738305931;0 +2.970026788118751;-1.256637061435917;0 +2.975786374650331;-1.265363707695889;0 +2.961300141858779;-1.27112329422747;0 +2.940879789610445;-1.277057413684251;0 +2.914699850830531;-1.278453677085846;0 +2.914699850830531;-1.285784059944223;0 +2.908940264298949;-1.292939909877399;0 +2.885552852322225;-1.294510706204194;0 +2.885552852322225;-1.300270292735775;0 +2.868099559802282;-1.306029879267357;0 +2.844886680750757;-1.311963998724138;0 +2.839127094219176;-1.320690644984109;0 +2.839127094219176;-1.327846494917286;0 +2.844886680750757;-1.335176877775662;0 +2.850646267282339;-1.342507260634038;0 +2.856580386739119;-1.349663110567215;0 +2.856580386739119;-1.349663110567215;0 +2.856580386739119;-1.356993493425591;0 +2.874033679259062;-1.361356816555577;0 +2.897246558310587;-1.368687199413953;0 +2.8623399732707;-1.370083462815548;0 +2.818706741970842;-1.374446785945534;0 +2.792526803190927;-1.381777168803911;0 +2.792526803190927;-1.390503815063882;0 +2.792526803190927;-1.396263401595464;0 +2.798286389722509;-1.404990047855435;0 +2.798286389722509;-1.413716694115407;0 +2.80998009571087;-1.422443340375378;0 +2.833192974762395;-1.429773723233755;0 +2.8623399732707;-1.438500369493726;0 +2.897246558310587;-1.445656219426903;0 +2.940879789610445;-1.452986602285279;0 +2.993239667170275;-1.457349925415265;0 +3.07177948351002;-1.457349925415265;0 +3.141592653589793;-1.463109511946846;0 +3.141592653589793;-1.569050997542902;0 +2.010095699521869;-0.5963790054064624;0 +2.010095699521869;-0.5860815628196958;0 +2.017251549455046;-0.5846852994181003;0 +2.021614872585032;-0.5803219762881145;0 +2.020218609183436;-0.5745623897565333;0 +2.021614872585032;-0.5642649471697667;0 +2.021614872585032;-0.5541420375081997;0 +2.017251549455046;-0.5483824509766184;0 +2.014459022651855;-0.5410520681182421;0 +2.010095699521869;-0.5323254218582705;0 +2.007128639793479;-0.5235987755982988;0 +2.007128639793479;-0.5148721293383272;0 +2.005732376391884;-0.507541746479951;0 +1.999798256935103;-0.4988151002199793;0 +1.992642407001926;-0.4900884539600077;0 +1.992642407001926;-0.482932604026831;0 +1.98827908387194;-0.471238898038469;0 +1.980948701013564;-0.4654793115068877;0 +1.977981641285173;-0.456752665246916;0 +1.986708287545145;-0.4639085151800928;0 +1.980948701013564;-0.4480260189869444;0 +1.98531202414355;-0.4551818689201211;0 +1.992642407001926;-0.4611159883769019;0 +1.992642407001926;-0.4508185457901353;0 +1.98827908387194;-0.4436626958569586;0 +1.983915760741954;-0.4363323129985824;0 +1.980948701013564;-0.4262094033370153;0 +1.979552437611969;-0.4174827570770436;0 +1.986708287545145;-0.4101523742186675;0 +1.986708287545145;-0.4028219913602912;0 +1.983915760741954;-0.3956661414271145;0 +1.986708287545145;-0.3883357585687384;0 +1.991071610675131;-0.3810053757103621;0 +1.995434933805117;-0.3897320219703337;0 +1.999798256935103;-0.3825761720371571;0 +2.008524903195074;-0.3782128489071713;0 +2.015855286053451;-0.3752457891787808;0 +2.021614872585032;-0.3679154063204046;0 +2.028945255443408;-0.3635520831904188;0 +2.03767190170338;-0.360759556387228;0 +2.046398547963351;-0.360759556387228;0 +2.055125194223323;-0.360759556387228;0 +2.063851840483295;-0.3548254369304472;0 +2.072578486743266;-0.3548254369304472;0 +2.079908869601642;-0.3490658503988659;0 +2.09003177926321;-0.3490658503988659;0 +2.100154688924777;-0.3460987906704755;0 +2.110452131511543;-0.3447025272688801;0 +2.11760798144472;-0.3389429407372988;0 +2.123542100901501;-0.3330088212805181;0 +2.127905424031487;-0.3242821750205464;0 +2.135061273964663;-0.3171263250873697;0 +2.133665010563068;-0.3111922056305889;0 +2.132268747161473;-0.3040363556974122;0 +2.139424597094649;-0.296705972839036;0 +2.146754979953025;-0.2879793265790644;0 +2.151118303083011;-0.2981022362406315;0 +2.155481626212997;-0.3054326190990077;0 +2.162812009071373;-0.296705972839036;0 +2.156877889614592;-0.2909463863074548;0 +2.159844949342983;-0.2822197400474831;0 +2.16996785900455;-0.2865830631774689;0 +2.174331182134535;-0.2792526803190927;0 +2.175901978461331;-0.2705260340591211;0 +2.184628624721302;-0.2631956512007449;0 +2.186024888122898;-0.2560398012675681;0 +2.19771859411126;-0.2560398012675681;0 +2.200511120914451;-0.2501056818107875;0 +2.209237767174422;-0.2487094184091919;0 +2.213601090304408;-0.2429498318776107;0 +2.223898532891174;-0.2443460952792061;0 +2.231054382824351;-0.2516764781375823;0 +2.236988502281132;-0.2574360646691636;0 +2.236988502281132;-0.2661627109291352;0 +2.245715148541104;-0.260403124397554;0 +2.252870998474281;-0.260403124397554;0 +2.263168441061047;-0.2661627109291352;0 +2.265960967864238;-0.2588323280707591;0 +2.257234321604266;-0.2530727415391778;0 +2.264564704462642;-0.2457423586808016;0 +2.267531764191033;-0.2385865087476248;0 +2.276258410451004;-0.2370157124208299;0 +2.273291350722614;-0.2298598624876532;0 +2.2776546738526;-0.222529479629277;0 +2.287777583514167;-0.2151990967709008;0 +2.299471289502529;-0.2151990967709008;0 +2.311164995490891;-0.2151990967709008;0 +2.315528318620877;-0.2064724505109292;0 +2.309594199164096;-0.1993166005777524;0 +2.321287905152458;-0.2021091273809433;0 +2.33001455141243;-0.2080432468377241;0 +2.340137461073998;-0.2094395102393195;0 +2.350434903660763;-0.2124065699677099;0 +2.350434903660763;-0.2124065699677099;0 +2.360557813322331;-0.2151990967709008;0 +2.370680722983898;-0.2124065699677099;0 +2.375044046113884;-0.2195624199008867;0 +2.38237442897226;-0.210835773640915;0 +2.391101075232231;-0.2167698930976957;0 +2.38534148870065;-0.2239257430308725;0 +2.383770692373855;-0.2326523892908441;0 +2.373647782712288;-0.2326523892908441;0 +2.373647782712288;-0.2413790355508158;0 +2.373647782712288;-0.2487094184091919;0 +2.369284459582302;-0.2544690049407732;0 +2.366317399853912;-0.2617993877991494;0 +2.373647782712288;-0.2675589743307307;0 +2.380978165570664;-0.2705260340591211;0 +2.383770692373855;-0.2792526803190927;0 +2.396860661763813;-0.2792526803190927;0 +2.404191044622189;-0.285012266850674;0 +2.40995063115377;-0.2893755899806598;0 +2.420248073740536;-0.2937389131106456;0 +2.428974720000508;-0.296705972839036;0 +2.433338043130494;-0.3040363556974122;0 +2.443460952792061;-0.3111922056305889;0 +2.452187599052033;-0.3097959422289935;0 +2.460914245312004;-0.3054326190990077;0 +2.460914245312004;-0.296705972839036;0 +2.46527756844199;-0.2893755899806598;0 +2.469640891571976;-0.2806489437206882;0 +2.471037154973572;-0.2719222974607165;0 +2.472607951300366;-0.2631956512007449;0 +2.471037154973572;-0.2544690049407732;0 +2.471037154973572;-0.2457423586808016;0 +2.472607951300366;-0.2370157124208299;0 +2.474004214701962;-0.2268928027592629;0 +2.474004214701962;-0.2211332162276816;0 +2.474004214701962;-0.2124065699677099;0 +2.479763801233544;-0.2064724505109292;0 +2.479763801233544;-0.1963495408493621;0 +2.485697920690324;-0.1890191579909859;0 +2.492853770623501;-0.1933824811209717;0 +2.494424566950296;-0.2036799237077382;0 +2.497217093753487;-0.2124065699677099;0 +2.501580416883473;-0.2211332162276816;0 +2.505943740013458;-0.2312561258892487;0 +2.505943740013458;-0.2399827721492203;0 +2.508910799741848;-0.2501056818107875;0 +2.51467038627343;-0.2530727415391778;0 +2.523397032533402;-0.2501056818107875;0 +2.529331151990182;-0.2560398012675681;0 +2.536487001923359;-0.2617993877991494;0 +2.536487001923359;-0.2705260340591211;0 +2.539454061651749;-0.2792526803190927;0 +2.539454061651749;-0.2893755899806598;0 +2.545213648183331;-0.296705972839036;0 +2.549576971313317;-0.3024655593706173;0 +2.551147767640111;-0.3111922056305889;0 +2.549576971313317;-0.3199188518905606;0 +2.553940294443303;-0.3258529713473414;0 +2.555511090770097;-0.3316125578789226;0 +2.565634000431665;-0.3373721444105038;0 +2.574360646691636;-0.3389429407372988;0 +2.580120233223218;-0.3460987906704755;0 +2.588846879483189;-0.3520329101272563;0 +2.597573525743161;-0.3563962332572421;0 +2.597573525743161;-0.3635520831904188;0 +2.603507645199941;-0.3679154063204046;0 +2.606300172003133;-0.3738495257771854;0 +2.609267231731522;-0.3825761720371571;0 +2.613630554861508;-0.3913028182971287;0 +2.617993877991494;-0.3853686988403479;0 +2.62532426084987;-0.3913028182971287;0 +2.632480110783047;-0.3956661414271145;0 +2.632480110783047;-0.4043927876870862;0 +2.635447170511438;-0.4115486376202628;0 +2.641206757043019;-0.4174827570770436;0 +2.64993340330299;-0.4202752838802346;0 +2.655867522759771;-0.4290019301402062;0 +2.663023372692948;-0.4377285764001778;0 +2.667386695822934;-0.445058959258554;0 +2.67175001895292;-0.4551818689201211;0 +2.67175001895292;-0.4625122517784973;0 +2.673320815279714;-0.4726351614400644;0 +2.676113342082906;-0.481361807700036;0 +2.679080401811296;-0.4916592502868026;0 +2.682047461539686;-0.5003858965467743;0 +2.679080401811296;-0.5061454830783556;0 +2.6776841384097;-0.5148721293383272;0 +2.676113342082906;-0.5235987755982988;0 +2.67175001895292;-0.533721685259866;0 +2.67175001895292;-0.5410520681182421;0 +2.668957492149728;-0.5497787143782138;0 +2.665990432421338;-0.55710909723659;0 +2.661627109291353;-0.5642649471697667;0 +2.657263786161367;-0.571595330028143;0 +2.64993340330299;-0.5759586531581288;0 +2.644173816771409;-0.5832890360165049;0 +2.641206757043019;-0.5904448859496816;0 +2.636843433913033;-0.5991715322096532;0 +2.632480110783047;-0.6094689747964199;0 +2.628116787653062;-0.6152285613280011;0 +2.628116787653062;-0.6152285613280011;0 +2.62235720112148;-0.6239552075879728;0 +2.620960937719884;-0.6326818538479444;0 +2.617993877991494;-0.6414085001079162;0 +2.617993877991494;-0.6487388829662923;0 +2.616597614589899;-0.655894732899469;0 +2.607870968329927;-0.6602580560294549;0 +2.596177262341565;-0.6602580560294549;0 +2.586054352679998;-0.6618288523562498;0 +2.580120233223218;-0.6646213791594406;0 +2.56999732356165;-0.6705554986162214;0 +2.562666940703274;-0.6749188217462072;0 +2.555511090770097;-0.6836454680061789;0 +2.548180707911721;-0.6792821448761931;0 +2.540850325053345;-0.6749188217462072;0 +2.539454061651749;-0.667588438887831;0 +2.530727415391778;-0.6705554986162214;0 +2.527760355663387;-0.6602580560294549;0 +2.520604505730211;-0.667588438887831;0 +2.513274122871834;-0.6719517620178169;0 +2.504547476611863;-0.6777113485493982;0 +2.497217093753487;-0.6749188217462072;0 +2.49006124382031;-0.6705554986162214;0 +2.482730860961934;-0.6689847022894264;0 +2.474004214701962;-0.667588438887831;0 +2.46824462817038;-0.6705554986162214;0 +2.463881305040395;-0.6646213791594406;0 +2.455154658780423;-0.6632251157578452;0 +2.447824275922047;-0.657465529226264;0 +2.442064689390466;-0.6515314097694832;0 +2.439097629662076;-0.6457718232379019;0 +2.442064689390466;-0.6414085001079162;0 +2.43770136626048;-0.6340781172495399;0 +2.431767246803699;-0.6269222673163631;0 +2.423040600543728;-0.6209881478595823;0 +2.411521427480565;-0.6225589441863774;0 +2.415884750610551;-0.6181956210563916;0 +2.418677277413742;-0.6108652381980153;0 +2.415884750610551;-0.605105651666434;0 +2.40995063115377;-0.5977752688080579;0 +2.407158104350579;-0.6065019150680295;0 +2.404191044622189;-0.6138322979264057;0 +2.396860661763813;-0.6138322979264057;0 +2.389704811830636;-0.6152285613280011;0 +2.391101075232231;-0.6108652381980153;0 +2.398431458090607;-0.6078981784696249;0 +2.399827721492203;-0.6021385919380436;0 +2.401223984893799;-0.5934119456780721;0 +2.407158104350579;-0.5860815628196958;0 +2.405587308023785;-0.5729915934297384;0 +2.399827721492203;-0.5789257128865191;0 +2.395464398362217;-0.5876523591464908;0 +2.386737752102245;-0.5920156822764766;0 +2.37940736924387;-0.5977752688080579;0 +2.372251519310693;-0.6035348553396391;0 +2.367888196180707;-0.6108652381980153;0 +2.363524873050721;-0.6035348553396391;0 +2.360557813322331;-0.5963790054064624;0 +2.356194490192345;-0.5890486225480862;0 +2.353227430463955;-0.5803219762881145;0 +2.341708257400791;-0.5759586531581288;0 +2.344500784203983;-0.5686282702997525;0 +2.337344934270806;-0.5642649471697667;0 +2.328618288010834;-0.5614724203665757;0 +2.318320845424068;-0.5585053606381855;0 +2.308197935762501;-0.5585053606381855;0 +2.300867552904125;-0.5541420375081997;0 +2.292140906644153;-0.5511749777798092;0 +2.283414260384181;-0.5511749777798092;0 +2.27468761412421;-0.5511749777798092;0 +2.263168441061047;-0.5511749777798092;0 +2.252870998474281;-0.5527457741066042;0 +2.244144352214309;-0.5555383009097951;0 +2.234021442552742;-0.5599016240397809;0 +2.22529479629277;-0.5614724203665757;0 +2.215171886631203;-0.5628686837681712;0 +2.203478180642841;-0.5614724203665757;0 +2.196147797784465;-0.5642649471697667;0 +2.186024888122898;-0.5701990666265475;0 +2.177298241862926;-0.5729915934297384;0 +2.165604535874564;-0.5759586531581288;0 +2.164208272472969;-0.5846852994181003;0 +2.156877889614592;-0.5904448859496816;0 +2.148151243354621;-0.5904448859496816;0 +2.139424597094649;-0.5904448859496816;0 +2.127905424031487;-0.5904448859496816;0 +2.11760798144472;-0.5904448859496816;0 +2.107485071783153;-0.5904448859496816;0 +2.095791365794791;-0.5920156822764766;0 +2.09003177926321;-0.5934119456780721;0 +2.084272192731628;-0.6007423285364483;0 +2.076941809873252;-0.6007423285364483;0 +2.069611427014876;-0.6065019150680295;0 +2.06524810388489;-0.6108652381980153;0 +2.055125194223323;-0.6108652381980153;0 +2.045002284561756;-0.6108652381980153;0 +2.036275638301784;-0.6108652381980153;0 +2.025978195715017;-0.6078981784696249;0 +2.018822345781841;-0.5991715322096532;0 +2.010095699521869;-0.5963790054064624;0 +-1.274090353955861;1.364323876283967;0 +-1.262396647967498;1.371479726217144;0 +-1.227490062927612;1.374446785945534;0 +-1.198517597344506;1.379159174925919;0 +-1.146157719784676;1.382300767579509;0 +-1.125737367536342;1.391900078465478;0 +-1.134464013796314;1.397659664997059;0 +-1.181064304824563;1.397659664997059;0 +-1.165007275706215;1.405513646631034;0 +-1.134464013796314;1.412320430713812;0 +-1.112647398146385;1.416858286768997;0 +-1.079137076508094;1.415985622143;0 +-1.069014166846527;1.421047076973783;0 +-1.082104136236484;1.426806663505364;0 +-1.035503845208236;1.432566250036946;0 +-0.9512044423369095;1.436929573166932;0 +-0.8944812416470939;1.43116998663535;0 +-0.8813912722571364;1.439373034119724;0 +-0.8260643349689161;1.438500369493726;0 +-0.8115781021773631;1.445656219426903;0 +-0.767944870877505;1.452113937659282;0 +-0.6894050545377601;1.45595366201367;0 +-0.6283185307179586;1.459967919293257;0 +-0.5497787143782138;1.45874618881686;0 +-0.4769984845700502;1.458222590041262;0 +-0.433365253270192;1.452986602285279;0 +-0.4188790204786391;1.448274213304895;0 +-0.3782128489071713;1.446005285277302;0 +-0.3490658503988659;1.441118363371718;0 +-0.3869394951671429;1.436755040241732;0 +-0.4464552226601495;1.435009710989738;0 +-0.4930555136883981;1.435533309765336;0 +-0.5206317158699084;1.432391717111746;0 +-0.4420918995301636;1.432391717111746;0 +-0.4420918995301636;1.425584933028968;0 +-0.4131194339470578;1.426806663505364;0 +-0.4131194339470578;1.431693585410948;0 +-0.3782128489071713;1.432566250036946;0 +-0.3722787294503905;1.427679328131362;0 +-0.3839724354387525;1.424712268402971;0 +-0.4131194339470578;1.420174412347786;0 +-0.433365253270192;1.412320430713812;0 +-0.3926990816987241;1.415112957517002;0 +-0.3621558197888234;1.419301747721789;0 +-0.3403392041388942;1.423839603776974;0 +-0.3171263250873697;1.42209427452498;0 +-0.2865830631774689;1.427679328131362;0 +-0.2312561258892487;1.425584933028968;0 +-0.2036799237077382;1.419301747721789;0 +-0.2501056818107875;1.409353370985421;0 +-0.2762856205907024;1.40359378445384;0 +-0.2996730325674264;1.395739802819865;0 +-0.3155555287605747;1.38806035411109;0 +-0.322885911618951;1.381079037103113;0 +-0.3403392041388942;1.37584304934713;0 +-0.334579617607313;1.368687199413953;0 +-0.3433062638672846;1.359960553153982;0 +-0.3286454981505322;1.354026433697201;0 +-0.3171263250873697;1.345299787437229;0 +-0.3214896482173555;1.339540200905648;0 +-0.3548254369304472;1.342507260634038;0 +-0.3738495257771854;1.338143937504052;0 +-0.3752457891787808;1.331686219271673;0 +-0.3490658503988659;1.329940890019679;0 +-0.3389429407372988;1.321214243759708;0 +-0.3389429407372988;1.312487597499736;0 +-0.3504621138004613;1.303237352464166;0 +-0.3286454981505322;1.303237352464166;0 +-0.3359758810089085;1.29590696960579;0 +-0.3752457891787808;1.291543646475804;0 +-0.3548254369304472;1.288576586747413;0 +-0.3548254369304472;1.282293401440234;0 +-0.3766420525803763;1.281420736814237;0 +-0.3869394951671429;1.278453677085846;0 +-0.4014257279586957;1.274963018581858;0 +-0.3839724354387525;1.272694090554265;0 +-0.3796091123087666;1.263967444294293;0 +-0.3839724354387525;1.258033324837513;0 +-0.407185314490277;1.2618730491919;0 +-0.4290019301402062;1.265363707695889;0 +-0.4131194339470578;1.259604121164308;0 +-0.3940953451003196;1.253670001707527;0 +-0.3796091123087666;1.24651415177435;0 +-0.3796091123087666;1.239183768915974;0 +-0.3810053757103621;1.230457122656002;0 +-0.4028219913602912;1.229060859254407;0 +-0.4188790204786391;1.231853386057598;0 +-0.4188790204786391;1.231853386057598;0 +-0.4232423436086249;1.239183768915974;0 +-0.4276056667386107;1.244943355447555;0 +-0.445058959258554;1.242150828644364;0 +-0.4406956361285682;1.233424182384393;0 +-0.4595451920501069;1.229060859254407;0 +-0.4595451920501069;1.224697536124421;0 +-0.4377285764001778;1.229060859254407;0 +-0.4145156973486533;1.224697536124421;0 +-0.3926990816987241;1.223126739797626;0 +-0.4043927876870862;1.217367153266045;0 +-0.4232423436086249;1.211607566734464;0 +-0.4406956361285682;1.205673447277683;0 +-0.4581489286485115;1.201310124147697;0 +-0.4799655442984406;1.196946801017711;0 +-0.5017821599483697;1.19415427421452;0 +-0.5235987755982988;1.189790951084534;0 +-0.5468116546498234;1.189790951084534;0 +-0.5614724203665757;1.185427627954549;0 +-0.5759586531581288;1.178097245096172;0 +-0.5832890360165049;1.170766862237796;0 +-0.5920156822764766;1.163611012304619;0 +-0.6065019150680295;1.157676892847839;0 +-0.6225589441863774;1.151917306316258;0 +-0.6457718232379019;1.146157719784676;0 +-0.6719517620178169;1.146157719784676;0 +-0.6923721142661505;1.143190660056286;0 +-0.6981317007977318;1.13586027719791;0 +-0.715584993317675;1.137431073524705;0 +-0.7054620836561081;1.125737367536342;0 +-0.7068583470577035;1.117010721276371;0 +-0.7112216701876892;1.108284075016399;0 +-0.7243116395776468;1.099557428756428;0 +-0.7403686686959947;1.093797842224846;0 +-0.7330382858376184;1.082104136236484;0 +-0.7417649320975901;1.073377489976513;0 +-0.7461282552275759;1.064650843716541;0 +-0.7475245186291712;1.055924197456569;0 +-0.7548549014875475;1.047197551196598;0 +-0.7665486074759096;1.044230491468207;0 +-0.7883652231258387;1.050164610924988;0 +-0.7984881327874057;1.057320460858165;0 +-0.8145451619057535;1.060287520586555;0 +-0.8377580409572781;1.061683783988151;0 +-0.8552113334772214;1.071981226574917;0 +-0.8639379797371932;1.080707872834889;0 +-0.8740608893987601;1.090830782496456;0 +-0.878424212528746;1.096590369028037;0 +-0.8944812416470939;1.109680338417995;0 +-0.8958775050486893;1.117010721276371;0 +-0.9075712110370514;1.122770307807952;0 +-0.9075712110370514;1.133067750394719;0 +-0.9149015938954275;1.143190660056286;0 +-0.9337511498169663;1.151917306316258;0 +-0.9337511498169663;1.160643952576229;0 +-0.938114472946952;1.169370598836201;0 +-0.9367182095453567;1.179493508497768;0 +-0.9307840900885759;1.189790951084534;0 +-0.9176941206986184;1.196946801017711;0 +-0.890117918517108;1.196946801017711;0 +-0.8857545953871222;1.210036770407669;0 +-0.8944812416470939;1.220334212994435;0 +-0.9105382707654417;1.212480231360461;0 +-0.9367182095453567;1.20951317163207;0 +-0.9569640288684909;1.215970889864449;0 +-0.9526007057385051;1.226093799526016;0 +-0.9468411192069237;1.236216709187584;0 +-0.9220574438286042;1.235693110411985;0 +-0.8944812416470939;1.230457122656002;0 +-0.9002408281786752;1.239183768915974;0 +-0.9206611804270088;1.242150828644364;0 +-0.9307840900885759;1.252273738305931;0 +-0.9424777960769379;1.24651415177435;0 +-0.9642944117268671;1.24651415177435;0 +-0.9730210579868387;1.251052007829536;0 +-0.9656906751284625;1.259604121164308;0 +-0.9744173213884341;1.266759971097484;0 +-0.9686577348568529;1.277057413684251;0 +-0.9716247945852433;1.284213263617428;0 +-0.9861110273767961;1.291543646475804;0 +-0.9861110273767961;1.300270292735775;0 +-1.003564319896739;1.308473340220149;0 +-1.018050552688292;1.314581992602129;0 +-1.018050552688292;1.320690644984109;0 +-1.047197551196598;1.3233086388621;0 +-1.076344549704903;1.329417291244081;0 +-1.106887811614804;1.329417291244081;0 +-1.140223600327895;1.328719159543283;0 +-1.162040215977824;1.325053968114095;0 +-1.195550537616116;1.328719159543283;0 +-1.213003830136059;1.333082482673269;0 +-1.199913860746102;1.336922207027656;0 +-1.226093799526016;1.340412865531645;0 +-1.242150828644364;1.344252589886032;0 +-1.221730476396031;1.34826684716562;0 +-1.19415427421452;1.350012176417614;0 +-1.221730476396031;1.354026433697201;0 +-1.227490062927612;1.359960553153982;0 +-1.250877474904336;1.359087888527984;0 +-1.274090353955861;1.364323876283967;0 +2.283414260384181;-0.02321287905152459;0 +2.290744643242558;-0.01448623279155293;0 +2.300867552904125;-0.01169370598836201;0 +2.306801672360905;-0.005759586531581288;0 +2.318320845424068;-0.005759586531581288;0 +2.325651228282444;-0.01169370598836201;0 +2.337344934270806;-0.01169370598836201;0 +2.341708257400791;-0.02321287905152459;0 +2.338741197672401;-0.03193952531149623;0 +2.341708257400791;-0.04066617157146788;0 +2.348864107333969;-0.04363323129985824;0 +2.351831167062359;-0.05235987755982988;0 +2.359161549920735;-0.05811946409141117;0 +2.366317399853912;-0.05811946409141117;0 +2.370680722983898;-0.05096361415823442;0 +2.375044046113884;-0.0450294947014537;0 +2.38237442897226;-0.03787364476827695;0 +2.391101075232231;-0.03630284844148206;0 +2.395464398362217;-0.0291469985083053;0 +2.407158104350579;-0.02478367537831948;0 +2.415884750610551;-0.0291469985083053;0 +2.426007660272118;-0.03490658503988659;0 +2.426007660272118;-0.03490658503988659;0 +2.43473430653209;-0.03787364476827695;0 +2.443460952792061;-0.04066617157146788;0 +2.450791335650437;-0.04066617157146788;0 +2.460914245312004;-0.0450294947014537;0 +2.469640891571976;-0.04799655442984406;0 +2.478367537831948;-0.05096361415823442;0 +2.485697920690324;-0.05375614096142535;0 +2.495820830351891;-0.05811946409141117;0 +2.504547476611863;-0.05969026041820607;0 +2.513274122871834;-0.06405358354819189;0 +2.522000769131806;-0.06841690667817771;0 +2.530727415391778;-0.07417649320975901;0 +2.538057798250154;-0.07853981633974483;0 +2.543817384781735;-0.08587019919812101;0 +2.543817384781735;-0.09599310885968812;0 +2.552544031041707;-0.09738937226128359;0 +2.562666940703274;-0.1033234917180643;0 +2.57296438329004;-0.1017526953912694;0 +2.580120233223218;-0.1076868148480501;0 +2.580120233223218;-0.1164134611080218;0 +2.57296438329004;-0.1178097245096172;0 +2.565634000431665;-0.1192059879112127;0 +2.568601060160055;-0.1265363707695889;0 +2.577327706420026;-0.1352630170295605;0 +2.586054352679998;-0.1396263401595464;0 +2.587450616081593;-0.1497492498211135;0 +2.593210202613175;-0.1584758960810851;0 +2.604903908601536;-0.1570796326794897;0 +2.601936848873147;-0.1644100155378658;0 +2.610663495133118;-0.1672025423410568;0 +2.617993877991494;-0.1672025423410568;0 +2.613630554861508;-0.1731366617978375;0 +2.620960937719884;-0.1759291886010284;0 +2.631083847381452;-0.1774999849278233;0 +2.628116787653062;-0.1846558348610001;0 +2.617993877991494;-0.1862266311877949;0 +2.613630554861508;-0.1802925117310143;0 +2.604903908601536;-0.1788962483294187;0 +2.594780998939969;-0.1774999849278233;0 +2.584483556353203;-0.1759291886010284;0 +2.575756910093232;-0.1745329251994329;0 +2.57296438329004;-0.1687733386678517;0 +2.565634000431665;-0.1628392192110709;0 +2.556907354171693;-0.1556833692778942;0 +2.552544031041707;-0.148352986419518;0 +2.548180707911721;-0.1396263401595464;0 +2.540850325053345;-0.1382300767579509;0 +2.530727415391778;-0.1338667536279651;0 +2.524967828860196;-0.1308996938995747;0 +2.516241182600225;-0.1308996938995747;0 +2.510307063143444;-0.1382300767579509;0 +2.505943740013458;-0.1425933998879367;0 +2.498787890080282;-0.1453859266911277;0 +2.501580416883473;-0.1527163095495038;0 +2.498787890080282;-0.1570796326794897;0 +2.488490447493515;-0.1614429558094755;0 +2.478367537831948;-0.1584758960810851;0 +2.469640891571976;-0.1584758960810851;0 +2.460914245312004;-0.1570796326794897;0 +2.453583862453629;-0.1513200461479084;0 +2.447824275922047;-0.1453859266911277;0 +2.443460952792061;-0.1396263401595464;0 +2.433338043130494;-0.1410226035611418;0 +2.423040600543728;-0.1410226035611418;0 +2.412917690882161;-0.1453859266911277;0 +2.402794781220593;-0.1453859266911277;0 +2.408554367752175;-0.1352630170295605;0 +2.412917690882161;-0.1279326341711844;0 +2.421644337142133;-0.1265363707695889;0 +2.418677277413742;-0.1178097245096172;0 +2.415884750610551;-0.1076868148480501;0 +2.411521427480565;-0.09738937226128359;0 +2.405587308023785;-0.0916297857297023;0 +2.396860661763813;-0.08726646259971647;0 +2.386737752102245;-0.08429940287132612;0 +2.376614842440679;-0.07993607974134029;0 +2.366317399853912;-0.07714355293814937;0 +2.356194490192345;-0.07557275661135446;0 +2.348864107333969;-0.07120943348136864;0 +2.340137461073998;-0.06684611035138281;0 +2.33298161114082;-0.06108652381980154;0 +2.325651228282444;-0.06981317007977318;0 +2.318320845424068;-0.06981317007977318;0 +2.316924582022472;-0.062482787221397;0 +2.315528318620877;-0.05672320068981571;0 +2.308197935762501;-0.05096361415823442;0 +2.302438349230919;-0.04939281783143952;0 +2.306801672360905;-0.0466002910282486;0 +2.315528318620877;-0.04799655442984406;0 +2.322684168554054;-0.04363323129985824;0 +2.33298161114082;-0.04363323129985824;0 +2.335774137944012;-0.03490658503988659;0 +2.325651228282444;-0.03787364476827695;0 +2.316924582022472;-0.03926990816987241;0 +2.308197935762501;-0.03926990816987241;0 +2.300867552904125;-0.03490658503988659;0 +2.300867552904125;-0.02757620218151041;0 +2.293711702970948;-0.02617993877991494;0 +2.283414260384181;-0.02321287905152459;0 +-1.570796326794897;1.252273738305931;0 +-1.570796326794897;1.262396647967498;0 +-1.56346594393652;1.269727030825875;0 +-1.554739297676549;1.277057413684251;0 +-1.53588974175501;1.284213263617428;0 +-1.518436449235067;1.288576586747413;0 +-1.490860247053556;1.288576586747413;0 +-1.466076571675237;1.288052987971815;0 +-1.492256510455152;1.283340598991431;0 +-1.502379420116719;1.278453677085846;0 +-1.509709802975095;1.27112329422747;0 +-1.5083135395735;1.263967444294293;0 +-1.506742743246704;1.256637061435917;0 +-1.489289450726761;1.250877474904336;0 +-1.489289450726761;1.250877474904336;0 +-1.495223570183542;1.258033324837513;0 +-1.493652773856747;1.265363707695889;0 +-1.492256510455152;1.274090353955861;0 +-1.471836158206818;1.281420736814237;0 +-1.447227015753698;1.287180323345818;0 +-1.425410400103769;1.288576586747413;0 +-1.416683753843797;1.284213263617428;0 +-1.422443340375378;1.276359281983453;0 +-1.410749634387017;1.268330767424279;0 +-1.416683753843797;1.259604121164308;0 +-1.399230461323854;1.264840108920291;0 +-1.37881010907552;1.264840108920291;0 +-1.358389756827187;1.270599695451872;0 +-1.340936464307243;1.268854366199877;0 +-1.322086908385705;1.265363707695889;0 +-1.297303233007385;1.266759971097484;0 +-1.291543646475804;1.261000384565903;0 +-1.291543646475804;1.252273738305931;0 +-1.263967444294293;1.250877474904336;0 +-1.24354709204596;1.24651415177435;0 +-1.217367153266045;1.236216709187584;0 +-1.192583477887725;1.230457122656002;0 +-1.178097245096172;1.221730476396031;0 +-1.185427627954549;1.214400093537654;0 +-1.165007275706215;1.207244243604478;0 +-1.18822015475774;1.204277183876087;0 +-1.18822015475774;1.195550537616116;0 +-1.165007275706215;1.18822015475774;0 +-1.137431073524705;1.18822015475774;0 +-1.121374044406357;1.181064304824563;0 +-1.102524488484818;1.175130185367782;0 +-1.085071195964875;1.169370598836201;0 +-1.071981226574917;1.163611012304619;0 +-1.08350039963808;1.153313569717853;0 +-1.087863722768066;1.146157719784676;0 +-1.108284075016399;1.143190660056286;0 +-1.114043661547981;1.134464013796314;0 +-1.134464013796314;1.140223600327895;0 +-1.143190660056286;1.150521042914662;0 +-1.172337658564591;1.159247689174634;0 +-1.176700981694577;1.147553983186272;0 +-1.16640353910781;1.1388273369263;0 +-1.147553983186272;1.131496954067924;0 +-1.13586027719791;1.125737367536342;0 +-1.134464013796314;1.117010721276371;0 +-1.121374044406357;1.109680338417995;0 +-1.125737367536342;1.098161165354832;0 +-1.147553983186272;1.098161165354832;0 +-1.16640353910781;1.103920751886413;0 +-1.182460568226158;1.109680338417995;0 +-1.202880920474492;1.114043661547981;0 +-1.195550537616116;1.106887811614804;0 +-1.182460568226158;1.100953692158023;0 +-1.167974335434605;1.093797842224846;0 +-1.154884366044648;1.087863722768066;0 +-1.154884366044648;1.080707872834889;0 +-1.172337658564591;1.082104136236484;0 +-1.18822015475774;1.085071195964875;0 +-1.204277183876087;1.08943451909486;0 +-1.210036770407669;1.093797842224846;0 +-1.227490062927612;1.096590369028037;0 +-1.240580032317569;1.099557428756428;0 +-1.255240798034322;1.105317015288009;0 +-1.255240798034322;1.112647398146385;0 +-1.269727030825875;1.117010721276371;0 +-1.285784059944223;1.119977781004761;0 +-1.303237352464166;1.124341104134747;0 +-1.322086908385705;1.125737367536342;0 +-1.335176877775662;1.121374044406357;0 +-1.361356816555577;1.121374044406357;0 +-1.371479726217144;1.128704427264733;0 +-1.365720139685563;1.13586027719791;0 +-1.355597230023996;1.137431073524705;0 +-1.352630170295605;1.143190660056286;0 +-1.32645023151569;1.140223600327895;0 +-1.303237352464166;1.140223600327895;0 +-1.285784059944223;1.146157719784676;0 +-1.301666556137371;1.154884366044648;0 +-1.287180323345818;1.160643952576229;0 +-1.274090353955861;1.167974335434605;0 +-1.262396647967498;1.173733921966187;0 +-1.268330767424279;1.181064304824563;0 +-1.274090353955861;1.189790951084534;0 +-1.29590696960579;1.195550537616116;0 +-1.308996938995747;1.204277183876087;0 +-1.329417291244081;1.198517597344506;0 +-1.3234831717873;1.210036770407669;0 +-1.352630170295605;1.21876341666764;0 +-1.362753079957173;1.226093799526016;0 +-1.37881010907552;1.217367153266045;0 +-1.393296341867073;1.214400093537654;0 +-1.419476280646988;1.221730476396031;0 +-1.436929573166932;1.220334212994435;0 +-1.471836158206818;1.223126739797626;0 +-1.496619833585138;1.223126739797626;0 +-1.524196035766648;1.229060859254407;0 +-1.540253064884996;1.236216709187584;0 +-1.553343034274953;1.244943355447555;0 +-1.570796326794897;1.252273738305931;0 +-0.09738937226128359;0.8740608893987601;0 +-0.08726646259971647;0.879995008855541;0 +-0.07853981633974483;0.8857545953871222;0 +-0.07120943348136864;0.8930849782454985;0 +-0.06108652381980154;0.8930849782454985;0 +-0.05235987755982988;0.8930849782454985;0 +-0.0466002910282486;0.9002408281786752;0 +-0.05811946409141117;0.8958775050486893;0 +-0.06684611035138281;0.9002408281786752;0 +-0.07557275661135446;0.90181162450547;0 +-0.08726646259971647;0.9002408281786752;0 +-0.09023352232810683;0.904604151308661;0 +-0.07993607974134029;0.9089674744386468;0 +-0.07120943348136864;0.9119345341670372;0 +-0.07120943348136864;0.9206611804270088;0 +-0.0815068760681352;0.9206611804270088;0 +-0.07557275661135446;0.92642076695859;0 +-0.07853981633974483;0.9307840900885759;0 +-0.062482787221397;0.9293878266869805;0 +-0.05235987755982988;0.9307840900885759;0 +-0.05235987755982988;0.938114472946952;0 +-0.0466002910282486;0.9454448558053283;0 +-0.05532693728822025;0.9454448558053283;0 +-0.062482787221397;0.9512044423369095;0 +-0.05672320068981571;0.9585348251952858;0 +-0.06981317007977318;0.9555677654668955;0 +-0.08290313946973064;0.9526007057385051;0 +-0.08866272600131195;0.9585348251952858;0 +-0.0815068760681352;0.9686577348568529;0 +-0.08866272600131195;0.9744173213884341;0 +-0.09738937226128359;0.9672614714552574;0 +-0.09738937226128359;0.9730210579868387;0 +-0.1076868148480501;0.9730210579868387;0 +-0.09599310885968812;0.97878064451842;0 +-0.09459684545809266;0.9861110273767961;0 +-0.1047197551196598;0.9831439676484057;0 +-0.1047197551196598;0.9890780871051865;0 +-0.09738937226128359;0.9978047333651582;0 +-0.1090830782496456;0.9978047333651582;0 +-0.1164134611080218;1.002168056495144;0 +-0.1104793416512411;1.004960583298335;0 +-0.1017526953912694;1.002168056495144;0 +-0.1003564319896739;1.007927643026725;0 +-0.09302604913129776;1.013687229558307;0 +-0.08726646259971647;1.021017612416683;0 +-0.07120943348136864;1.021017612416683;0 +-0.05532693728822025;1.022413875818278;0 +-0.05235987755982988;1.018050552688292;0 +-0.06684611035138281;1.012290966156711;0 +-0.07278022980816354;1.004960583298335;0 +-0.05969026041820607;1.00653137962513;0 +-0.04799655442984406;1.00653137962513;0 +-0.03351032163829112;1.00653137962513;0 +-0.03193952531149623;1.000597260168349;0 +-0.03630284844148206;0.9948376736367678;0 +-0.04223696789826277;0.9875072907783917;0 +-0.04939281783143952;0.9817477042468103;0 +-0.05811946409141117;0.9773843811168246;0 +-0.0466002910282486;0.9773843811168246;0 +-0.03490658503988659;0.9744173213884341;0 +-0.0291469985083053;0.9686577348568529;0 +-0.02617993877991494;0.9599310885968813;0 +-0.02042035224833365;0.9526007057385051;0 +-0.008726646259971648;0.9498081789353141;0 +-0.004363323129985824;0.9424777960769379;0 +-0.001396263401595464;0.9367182095453567;0 +0.002967059728390361;0.9323548864153709;0 +0.005759586531581288;0.92642076695859;0 +0;0.9220574438286042;0 +0.004363323129985824;0.9192649170254134;0 +0.01012290966156711;0.9236282401553992;0 +0.0174532925199433;0.9236282401553992;0 +0.02757620218151041;0.9206611804270088;0 +0.03193952531149623;0.9149015938954275;0 +0.02757620218151041;0.9075712110370514;0 +0.0174532925199433;0.9032078879070654;0 +0.01012290966156711;0.8958775050486893;0 +0.02478367537831948;0.8944812416470939;0 +0.01605702911834783;0.8871508587887176;0 +0.001396263401595464;0.8843583319855268;0 +-0.01169370598836201;0.8843583319855268;0 +-0.02478367537831948;0.8857545953871222;0 +-0.03630284844148206;0.8813912722571364;0 +-0.04939281783143952;0.8843583319855268;0 +-0.06108652381980154;0.8827875356587318;0 +-0.06405358354819189;0.8756316857255551;0 +-0.07853981633974483;0.878424212528746;0 +-0.08866272600131195;0.8726646259971648;0 +-0.09738937226128359;0.8740608893987601;0 +0.8145451619057535;0.7810348402674625;0 +0.8145451619057535;0.7752752537358811;0 +0.8217010118389303;0.7723081940074908;0 +0.827635131295711;0.7635815477475191;0 +0.827635131295711;0.7578219612159379;0 +0.827635131295711;0.7504915783575616;0 +0.8347909812288877;0.7417649320975901;0 +0.842121364087264;0.7344345492392138;0 +0.8494517469456402;0.730071226109228;0 +0.8552113334772214;0.7229153761760513;0 +0.8581783932056118;0.715584993317675;0 +0.8669050394655835;0.7082546104592988;0 +0.8770279491271507;0.7054620836561081;0 +0.868301302867179;0.7038912873293131;0 +0.8625417163355976;0.6981317007977318;0 +0.8595746566072072;0.6894050545377601;0 +0.8581783932056118;0.6836454680061789;0 +0.8508480103472356;0.6836454680061789;0 +0.8522442737488312;0.6733480254194123;0 +0.8538150700756261;0.6646213791594406;0 +0.8552113334772214;0.655894732899469;0 +0.8639379797371932;0.6531022060962781;0 +0.8756316857255551;0.6515314097694832;0 +0.878424212528746;0.6471680866394973;0 +0.890117918517108;0.6414085001079162;0 +0.9002408281786752;0.6384414403795257;0 +0.9149015938954275;0.6414085001079162;0 +0.9279915632853851;0.6443755598363065;0 +0.9410815326753426;0.6428047635095115;0 +0.9424777960769379;0.6487388829662923;0 +0.938114472946952;0.6602580560294549;0 +0.938114472946952;0.6719517620178169;0 +0.9424777960769379;0.682074671679384;0 +0.9351474132185617;0.6836454680061789;0 +0.9323548864153709;0.6908013179393555;0 +0.9337511498169663;0.6981317007977318;0 +0.9206611804270088;0.6981317007977318;0 +0.9192649170254134;0.7038912873293131;0 +0.9236282401553992;0.7126179335892847;0 +0.9337511498169663;0.7098254067860938;0 +0.9454448558053283;0.7098254067860938;0 +0.9555677654668955;0.715584993317675;0 +0.9482373826085192;0.7213445798492564;0 +0.9410815326753426;0.7272786993060371;0 +0.9367182095453567;0.7344345492392138;0 +0.9250245035569946;0.7330382858376184;0 +0.9192649170254134;0.7272786993060371;0 +0.9206611804270088;0.7199483164476609;0 +0.9149015938954275;0.7286749627076327;0 +0.9133307975686326;0.7360053455660087;0 +0.9192649170254134;0.7431611954991855;0 +0.9162978572970231;0.7475245186291712;0 +0.904604151308661;0.7475245186291712;0 +0.8958775050486893;0.7534586380859521;0 +0.8930849782454985;0.7621852843459237;0 +0.8857545953871222;0.7709119306058954;0 +0.8756316857255551;0.7737044574090862;0 +0.8770279491271507;0.7780677805390721;0 +0.8887216551155126;0.7780677805390721;0 +0.8974483013754843;0.7766715171374767;0 +0.8930849782454985;0.7853981633974483;0 +0.9032078879070654;0.7911577499290294;0 +0.9162978572970231;0.7927285462558246;0 +0.92642076695859;0.7883652231258387;0 +0.9367182095453567;0.7897614865274341;0 +0.9468411192069237;0.7897614865274341;0 +0.9410815326753426;0.7941248096574199;0 +0.9395107363485476;0.8014551925157961;0 +0.9367182095453567;0.8101818387757678;0 +0.9279915632853851;0.8173376887089445;0 +0.9176941206986184;0.8232718081657252;0 +0.9089674744386468;0.8232718081657252;0 +0.8974483013754843;0.8232718081657252;0 +0.8887216551155126;0.8246680715673207;0 +0.8756316857255551;0.8173376887089445;0 +0.8639379797371932;0.8159414253073491;0 +0.8538150700756261;0.8129743655789586;0 +0.8552113334772214;0.8086110424489729;0 +0.8464846872172498;0.8072147790473774;0 +0.842121364087264;0.8014551925157961;0 +0.830427658098902;0.8042477193189871;0 +0.8260643349689161;0.7970918693858103;0 +0.8203047484373349;0.7883652231258387;0 +0.8145451619057535;0.7810348402674625;0 +2.073974750144862;-0.04939281783143952;0 +2.079908869601642;-0.04223696789826277;0 +2.082701396404834;-0.03351032163829112;0 +2.082701396404834;-0.02321287905152459;0 +2.085668456133224;-0.01605702911834783;0 +2.091428042664805;-0.01012290966156711;0 +2.091428042664805;-0.001396263401595464;0 +2.0929988389916;0.007330382858376183;0 +2.094395102393195;0.01308996938995747;0 +2.106088808381557;0.01308996938995747;0 +2.110452131511543;0.02321287905152459;0 +2.119178777771515;0.02042035224833365;0 +2.129301687433082;0.01884955592153876;0 +2.138028333693053;0.0174532925199433;0 +2.14535871655143;0.01448623279155293;0 +2.152514566484606;0.01605702911834783;0 +2.162812009071373;0.01605702911834783;0 +2.171538655331345;0.02042035224833365;0 +2.177298241862926;0.02617993877991494;0 +2.181661564992912;0.03054326190990077;0 +2.186024888122898;0.02617993877991494;0 +2.181661564992912;0.01884955592153876;0 +2.174331182134535;0.01012290966156711;0 +2.164208272472969;0.007330382858376183;0 +2.155481626212997;0.005759586531581288;0 +2.146754979953025;0.008726646259971648;0 +2.138028333693053;0.008726646259971648;0 +2.129301687433082;0.008726646259971648;0 +2.119178777771515;0.008726646259971648;0 +2.111848394913139;0.007330382858376183;0 +2.106088808381557;0.008726646259971648;0 +2.100154688924777;0.007330382858376183;0 +2.095791365794791;-0.001396263401595464;0 +2.095791365794791;-0.01169370598836201;0 +2.104518012054762;-0.01605702911834783;0 +2.106088808381557;-0.02321287905152459;0 +2.114815454641529;-0.02321287905152459;0 +2.121971304574706;-0.01605702911834783;0 +2.130697950834678;-0.01605702911834783;0 +2.139424597094649;-0.01308996938995747;0 +2.149722039681416;-0.01012290966156711;0 +2.155481626212997;-0.01605702911834783;0 +2.14535871655143;-0.01605702911834783;0 +2.138028333693053;-0.02321287905152459;0 +2.130697950834678;-0.0291469985083053;0 +2.12057504117311;-0.03351032163829112;0 +2.127905424031487;-0.04223696789826277;0 +2.132268747161473;-0.04799655442984406;0 +2.136632070291458;-0.05532693728822025;0 +2.130697950834678;-0.06108652381980154;0 +2.138028333693053;-0.06684611035138281;0 +2.143787920224635;-0.07557275661135446;0 +2.149722039681416;-0.08290313946973064;0 +2.149722039681416;-0.09302604913129776;0 +2.140995393421444;-0.09896016858807849;0 +2.135061273964663;-0.09302604913129776;0 +2.135061273964663;-0.07993607974134029;0 +2.129301687433082;-0.08429940287132612;0 +2.121971304574706;-0.0815068760681352;0 +2.123542100901501;-0.07120943348136864;0 +2.114815454641529;-0.06684611035138281;0 +2.110452131511543;-0.05969026041820607;0 +2.113244658314734;-0.05235987755982988;0 +2.113244658314734;-0.0466002910282486;0 +2.106088808381557;-0.0466002910282486;0 +2.098758425523181;-0.05235987755982988;0 +2.101725485251571;-0.06108652381980154;0 +2.101725485251571;-0.06981317007977318;0 +2.101725485251571;-0.07853981633974483;0 +2.100154688924777;-0.08726646259971647;0 +2.101725485251571;-0.09599310885968812;0 +2.0929988389916;-0.09738937226128359;0 +2.085668456133224;-0.09738937226128359;0 +2.084272192731628;-0.09023352232810683;0 +2.087064719534819;-0.07993607974134029;0 +2.088635515861614;-0.06981317007977318;0 +2.085668456133224;-0.06108652381980154;0 +2.076941809873252;-0.06108652381980154;0 +2.073974750144862;-0.04939281783143952;0 +2.284985056710976;0.5991715322096532;0 +2.293711702970948;0.6021385919380436;0 +2.300867552904125;0.6065019150680295;0 +2.309594199164096;0.6122615015996108;0 +2.316924582022472;0.619591884457987;0 +2.325651228282444;0.619591884457987;0 +2.338741197672401;0.6209881478595823;0 +2.350434903660763;0.6225589441863774;0 +2.360557813322331;0.6239552075879728;0 +2.367888196180707;0.619591884457987;0 +2.373647782712288;0.6225589441863774;0 +2.373647782712288;0.6297147941195541;0 +2.37940736924387;0.6356489135763349;0 +2.38534148870065;0.6428047635095115;0 +2.386737752102245;0.6501351463678877;0 +2.394068134960622;0.6544984694978736;0 +2.391101075232231;0.6471680866394973;0 +2.391101075232231;0.6414085001079162;0 +2.401223984893799;0.6457718232379019;0 +2.411521427480565;0.6487388829662923;0 +2.418677277413742;0.6531022060962781;0 +2.423040600543728;0.6602580560294549;0 +2.431767246803699;0.6646213791594406;0 +2.43473430653209;0.6733480254194123;0 +2.440493893063671;0.6806784082777885;0 +2.443460952792061;0.6880087911361648;0 +2.443460952792061;0.6967354373961363;0 +2.443460952792061;0.7038912873293131;0 +2.443460952792061;0.7098254067860938;0 +2.449220539323643;0.7185520530460655;0 +2.455154658780423;0.7141887299160796;0 +2.4623105087136;0.7141887299160796;0 +2.4623105087136;0.7185520530460655;0 +2.456550922182019;0.7185520530460655;0 +2.457947185583614;0.7243116395776468;0 +2.46824462817038;0.7213445798492564;0 +2.466673831843586;0.715584993317675;0 +2.46824462817038;0.7082546104592988;0 +2.474004214701962;0.7010987605261222;0 +2.476971274430352;0.6923721142661505;0 +2.475400478103558;0.682074671679384;0 +2.469640891571976;0.6763150851478027;0 +2.469640891571976;0.6689847022894264;0 +2.4623105087136;0.6689847022894264;0 +2.459517981910409;0.6646213791594406;0 +2.460914245312004;0.655894732899469;0 +2.459517981910409;0.6457718232379019;0 +2.455154658780423;0.6414085001079162;0 +2.453583862453629;0.631285590446349;0 +2.456550922182019;0.6239552075879728;0 +2.450791335650437;0.619591884457987;0 +2.449220539323643;0.6138322979264057;0 +2.439097629662076;0.6094689747964199;0 +2.440493893063671;0.619591884457987;0 +2.436130569933685;0.6152285613280011;0 +2.427403923673714;0.6152285613280011;0 +2.423040600543728;0.6035348553396391;0 +2.420248073740536;0.6122615015996108;0 +2.40995063115377;0.6035348553396391;0 +2.395464398362217;0.6035348553396391;0 +2.386737752102245;0.6108652381980153;0 +2.38237442897226;0.605105651666434;0 +2.386737752102245;0.5991715322096532;0 +2.376614842440679;0.5920156822764766;0 +2.369284459582302;0.5832890360165049;0 +2.363524873050721;0.5846852994181003;0 +2.359161549920735;0.5920156822764766;0 +2.359161549920735;0.5991715322096532;0 +2.364921136452316;0.6065019150680295;0 +2.354798226790749;0.6065019150680295;0 +2.347467843932373;0.6078981784696249;0 +2.337344934270806;0.6035348553396391;0 +2.33001455141243;0.6021385919380436;0 +2.319891641750862;0.5991715322096532;0 +2.309594199164096;0.5977752688080579;0 +2.303834612632515;0.5920156822764766;0 +2.295107966372544;0.5934119456780721;0 +2.284985056710976;0.5920156822764766;0 +2.284985056710976;0.5991715322096532;0 +1.901012621272224;0.0174532925199433;0 +1.903805148075415;0.02757620218151041;0 +1.911135530933791;0.03490658503988659;0 +1.919862177193763;0.03054326190990077;0 +1.929985086855329;0.0291469985083053;0 +1.938711733115301;0.02757620218151041;0 +1.943075056245287;0.03926990816987241;0 +1.946042115973677;0.04939281783143952;0 +1.954768762233649;0.05096361415823442;0 +1.964891671895216;0.05235987755982988;0 +1.973618318155188;0.05811946409141117;0 +1.977981641285173;0.06544984694978735;0 +1.98531202414355;0.07120943348136864;0 +1.994038670403522;0.0815068760681352;0 +2.002765316663493;0.08587019919812101;0 +2.014459022651855;0.08587019919812101;0 +2.014459022651855;0.09302604913129776;0 +2.024581932313422;0.1017526953912694;0 +2.027548992041813;0.1090830782496456;0 +2.036275638301784;0.1148426647812269;0 +2.042035224833366;0.1221730476396031;0 +2.046398547963351;0.1178097245096172;0 +2.055125194223323;0.112050137978036;0 +2.055125194223323;0.1033234917180643;0 +2.063851840483295;0.1003564319896739;0 +2.072578486743266;0.09459684545809266;0 +2.081305133003238;0.09023352232810683;0 +2.072578486743266;0.08726646259971647;0 +2.063851840483295;0.08429940287132612;0 +2.069611427014876;0.07714355293814937;0 +2.058092253951713;0.07417649320975901;0 +2.056521457624918;0.06405358354819189;0 +2.050761871093337;0.05672320068981571;0 +2.055125194223323;0.04799655442984406;0 +2.060884780754904;0.04066617157146788;0 +2.056521457624918;0.03490658503988659;0 +2.063851840483295;0.02757620218151041;0 +2.071182223341671;0.02181661564992912;0 +2.076941809873252;0.01605702911834783;0 +2.066818900211685;0.01448623279155293;0 +2.058092253951713;0.01448623279155293;0 +2.053728930821728;0.008726646259971648;0 +2.050761871093337;0;0 +2.049365607691742;-0.01012290966156711;0 +2.045002284561756;-0.0174532925199433;0 +2.03767190170338;-0.02321287905152459;0 +2.030341518845003;-0.03054326190990077;0 +2.036275638301784;-0.03926990816987241;0 +2.030341518845003;-0.05096361415823442;0 +2.027548992041813;-0.05969026041820607;0 +2.018822345781841;-0.06405358354819189;0 +2.010095699521869;-0.06841690667817771;0 +2.002765316663493;-0.07120943348136864;0 +2.001369053261898;-0.06405358354819189;0 +1.995434933805117;-0.05811946409141117;0 +1.986708287545145;-0.05969026041820607;0 +1.976585377883578;-0.05375614096142535;0 +1.969254995025202;-0.05811946409141117;0 +1.96052834876523;-0.05811946409141117;0 +1.951801702505259;-0.06108652381980154;0 +1.950405439103663;-0.04799655442984406;0 +1.944645852572082;-0.05096361415823442;0 +1.93591920631211;-0.05235987755982988;0 +1.925621763725344;-0.05096361415823442;0 +1.924225500323748;-0.04066617157146788;0 +1.921258440595358;-0.03054326190990077;0 +1.921258440595358;-0.02181661564992912;0 +1.915498854063777;-0.01308996938995747;0 +1.906772207803805;-0.007330382858376183;0 +1.906772207803805;0.001396263401595464;0 +1.902408884673819;0.007330382858376183;0 +1.901012621272224;0.0174532925199433;0 +0.4799655442984406;0.7417649320975901;0 +0.4872959271568168;0.7344345492392138;0 +0.4900884539600077;0.7272786993060371;0 +0.4988151002199793;0.7213445798492564;0 +0.5091125428067459;0.7185520530460655;0 +0.5206317158699084;0.7169812567192706;0 +0.5323254218582705;0.7185520530460655;0 +0.5424483315198376;0.7169812567192706;0 +0.5511749777798092;0.7213445798492564;0 +0.5599016240397809;0.7257079029792421;0 +0.5686282702997525;0.730071226109228;0 +0.5803219762881145;0.7330382858376184;0 +0.5904448859496816;0.7316420224360229;0 +0.6021385919380436;0.7316420224360229;0 +0.6108652381980153;0.7330382858376184;0 +0.6166248247295966;0.7272786993060371;0 +0.6283185307179586;0.7272786993060371;0 +0.6340781172495399;0.7199483164476609;0 +0.6414085001079162;0.7199483164476609;0 +0.6501351463678877;0.715584993317675;0 +0.657465529226264;0.7169812567192706;0 +0.6661921754862357;0.7141887299160796;0 +0.6763150851478027;0.715584993317675;0 +0.6864379948093697;0.7169812567192706;0 +0.6967354373961363;0.715584993317675;0 +0.7068583470577035;0.7169812567192706;0 +0.7169812567192706;0.7229153761760513;0 +0.7257079029792421;0.7272786993060371;0 +0.7272786993060371;0.7330382858376184;0 +0.7229153761760513;0.7387978723691996;0 +0.7199483164476609;0.7461282552275759;0 +0.715584993317675;0.7490953149559663;0 +0.7038912873293131;0.7534586380859521;0 +0.6951646410693415;0.7578219612159379;0 +0.6894050545377601;0.7621852843459237;0 +0.6806784082777885;0.7693411342791004;0 +0.6719517620178169;0.7737044574090862;0 +0.6632251157578452;0.7752752537358811;0 +0.657465529226264;0.7780677805390721;0 +0.6501351463678877;0.7810348402674625;0 +0.6457718232379019;0.7867944267990437;0 +0.6400122367063207;0.7867944267990437;0 +0.6297147941195541;0.7853981633974483;0 +0.6209881478595823;0.7867944267990437;0 +0.6122615015996108;0.7824311036690579;0 +0.6035348553396391;0.7810348402674625;0 +0.5977752688080579;0.7766715171374767;0 +0.5890486225480862;0.7737044574090862;0 +0.5832890360165049;0.7780677805390721;0 +0.5860815628196958;0.7853981633974483;0 +0.5803219762881145;0.7883652231258387;0 +0.5701990666265475;0.7911577499290294;0 +0.5773549165597242;0.7984881327874057;0 +0.5890486225480862;0.8014551925157961;0 +0.5789257128865191;0.805818515645782;0 +0.5686282702997525;0.8028514559173915;0 +0.5555383009097951;0.8072147790473774;0 +0.5599016240397809;0.8129743655789586;0 +0.5483824509766184;0.8129743655789586;0 +0.5380850083898517;0.8129743655789586;0 +0.533721685259866;0.805818515645782;0 +0.5265658353266892;0.7998843961890013;0 +0.5162683927399226;0.7970918693858103;0 +0.5178391890667177;0.7883652231258387;0 +0.5148721293383272;0.7824311036690579;0 +0.5061454830783556;0.7796385768658669;0 +0.5003858965467743;0.7737044574090862;0 +0.5003858965467743;0.7665486074759096;0 +0.4988151002199793;0.7578219612159379;0 +0.4886921905584123;0.756251164889143;0 +0.4872959271568168;0.7475245186291712;0 +0.4799655442984406;0.7417649320975901;0 +0.7548549014875475;-0.3825761720371571;0 +0.7606144880191288;-0.3722787294503905;0 +0.7665486074759096;-0.3651228795172138;0 +0.7693411342791004;-0.3577924966588375;0 +0.7752752537358811;-0.3490658503988659;0 +0.7766715171374767;-0.3417354675404897;0 +0.7723081940074908;-0.3316125578789226;0 +0.7723081940074908;-0.3242821750205464;0 +0.767944870877505;-0.3141592653589793;0 +0.7665486074759096;-0.3040363556974122;0 +0.7723081940074908;-0.2953097094374406;0 +0.7766715171374767;-0.2822197400474831;0 +0.7840018999958529;-0.2822197400474831;0 +0.7927285462558246;-0.2778564169174972;0 +0.8014551925157961;-0.2748893571891069;0 +0.8101818387757678;-0.2705260340591211;0 +0.8173376887089445;-0.2661627109291352;0 +0.8246680715673207;-0.2574360646691636;0 +0.831998454425697;-0.2574360646691636;0 +0.830427658098902;-0.2501056818107875;0 +0.8363617775556828;-0.2457423586808016;0 +0.8347909812288877;-0.2370157124208299;0 +0.8435176274888594;-0.2356194490192345;0 +0.8508480103472356;-0.2326523892908441;0 +0.8522442737488312;-0.2254965393576674;0 +0.8522442737488312;-0.2167698930976957;0 +0.8595746566072072;-0.2094395102393195;0 +0.8653342431387886;-0.2181661564992912;0 +0.8696975662687744;-0.2268928027592629;0 +0.8712683625955693;-0.2370157124208299;0 +0.8756316857255551;-0.2473131550075965;0 +0.878424212528746;-0.260403124397554;0 +0.879995008855541;-0.2691297706575256;0 +0.8740608893987601;-0.2778564169174972;0 +0.8669050394655835;-0.2705260340591211;0 +0.868301302867179;-0.285012266850674;0 +0.8669050394655835;-0.2923426497090502;0 +0.8625417163355976;-0.296705972839036;0 +0.8625417163355976;-0.3040363556974122;0 +0.8609709200088027;-0.3141592653589793;0 +0.8595746566072072;-0.322885911618951;0 +0.8552113334772214;-0.3330088212805181;0 +0.8522442737488312;-0.3417354675404897;0 +0.8494517469456402;-0.3504621138004613;0 +0.8464846872172498;-0.3577924966588375;0 +0.8450884238156544;-0.3651228795172138;0 +0.842121364087264;-0.3722787294503905;0 +0.8391543043588735;-0.3796091123087666;0 +0.8363617775556828;-0.3869394951671429;0 +0.8347909812288877;-0.3940953451003196;0 +0.8333947178272924;-0.4014257279586957;0 +0.831998454425697;-0.408756110817072;0 +0.8290313946973066;-0.4145156973486533;0 +0.8260643349689161;-0.4232423436086249;0 +0.8232718081657252;-0.4305727264670011;0 +0.8173376887089445;-0.4392993727269727;0 +0.8101818387757678;-0.4377285764001778;0 +0.8014551925157961;-0.4406956361285682;0 +0.7941248096574199;-0.445058959258554;0 +0.7853981633974483;-0.4464552226601495;0 +0.7780677805390721;-0.4420918995301636;0 +0.7709119306058954;-0.4363323129985824;0 +0.7635815477475191;-0.4276056667386107;0 +0.7621852843459237;-0.4174827570770436;0 +0.7606144880191288;-0.4057890510886816;0 +0.756251164889143;-0.3984586682303054;0 +0.7548549014875475;-0.3897320219703337;0 +0.7548549014875475;-0.3825761720371571;0 +1.663822375926194;0.09896016858807849;0 +1.674119818512961;0.09896016858807849;0 +1.681275668446137;0.09302604913129776;0 +1.691573111032904;0.09302604913129776;0 +1.703092284096067;0.0916297857297023;0 +1.710422666954443;0.08587019919812101;0 +1.714785990084429;0.07853981633974483;0 +1.72054557661601;0.07120943348136864;0 +1.727875959474386;0.06544984694978735;0 +1.736602605734358;0.06108652381980154;0 +1.74532925199433;0.05532693728822025;0 +1.751088838525911;0.0466002910282486;0 +1.758419221384287;0.03787364476827695;0 +1.767145867644258;0.03926990816987241;0 +1.77587251390423;0.03054326190990077;0 +1.784599160164202;0.0291469985083053;0 +1.791929543022578;0.02042035224833365;0 +1.799085392955755;0.01884955592153876;0 +1.797689129554159;0.01012290966156711;0 +1.805019512412536;0.01012290966156711;0 +1.812175362345712;0.002967059728390361;0 +1.810779098944117;-0.004363323129985824;0 +1.806415775814131;-0.01169370598836201;0 +1.812175362345712;-0.0174532925199433;0 +1.822472804932479;-0.0174532925199433;0 +1.82526533173567;-0.0291469985083053;0 +1.831199451192451;-0.03351032163829112;0 +1.833991977995641;-0.04066617157146788;0 +1.842718624255613;-0.04066617157146788;0 +1.848652743712394;-0.0466002910282486;0 +1.85301606684238;-0.05235987755982988;0 +1.848652743712394;-0.06108652381980154;0 +1.848652743712394;-0.07278022980816354;0 +1.848652743712394;-0.0815068760681352;0 +1.847081947385599;-0.0916297857297023;0 +1.845685683984003;-0.1003564319896739;0 +1.838355301125627;-0.09599310885968812;0 +1.831199451192451;-0.09599310885968812;0 +1.82823239146406;-0.1003564319896739;0 +1.822472804932479;-0.09738937226128359;0 +1.815142422074103;-0.08866272600131195;0 +1.806415775814131;-0.08290313946973064;0 +1.794722069825769;-0.07417649320975901;0 +1.787566219892593;-0.06684611035138281;0 +1.784599160164202;-0.06108652381980154;0 +1.77587251390423;-0.05532693728822025;0 +1.768542131045854;-0.0450294947014537;0 +1.761386281112677;-0.03630284844148206;0 +1.759815484785882;-0.0291469985083053;0 +1.754055898254301;-0.01884955592153876;0 +1.752659634852706;-0.01169370598836201;0 +1.74532925199433;-0.004363323129985824;0 +1.742362192265939;0.001396263401595464;0 +1.732239282604372;0.005759586531581288;0 +1.729272222875982;0.0174532925199433;0 +1.724908899745996;0.02617993877991494;0 +1.724908899745996;0.03193952531149623;0 +1.716182253486024;0.03787364476827695;0 +1.707455607226053;0.04223696789826277;0 +1.704663080422862;0.05096361415823442;0 +1.697332697564486;0.05811946409141117;0 +1.691573111032904;0.06544984694978735;0 +1.685638991576123;0.06684611035138281;0 +1.676912345316152;0.07557275661135446;0 +1.669756495382975;0.08290313946973064;0 +1.665393172252989;0.09023352232810683;0 +1.663822375926194;0.09896016858807849;0 +-1.579522973054868;1.422443340375378;0 +-1.553343034274953;1.429773723233755;0 +-1.512676862703485;1.429773723233755;0 +-1.512676862703485;1.433438914662943;0 +-1.48352986419518;1.436929573166932;0 +-1.441292896296917;1.441292896296917;0 +-1.409353370985421;1.447227015753698;0 +-1.340936464307243;1.449495943781291;0 +-1.300270292735775;1.448274213304895;0 +-1.265363707695889;1.450019542556889;0 +-1.217367153266045;1.450019542556889;0 +-1.172337658564591;1.447227015753698;0 +-1.124341104134747;1.445132620651305;0 +-1.098161165354832;1.440769297521319;0 +-1.067617903444931;1.438500369493726;0 +-1.067617903444931;1.434660645139339;0 +-1.090830782496456;1.430297322009353;0 +-1.121374044406357;1.425410400103769;0 +-1.122770307807952;1.421047076973783;0 +-1.165007275706215;1.41284402948941;0 +-1.201310124147697;1.406386311257031;0 +-1.221730476396031;1.399754060099452;0 +-1.247910415175946;1.391376479689879;0 +-1.291543646475804;1.387536755335492;0 +-1.308996938995747;1.37881010907552;0 +-1.308996938995747;1.370083462815548;0 +-1.3234831717873;1.361356816555577;0 +-1.361356816555577;1.359960553153982;0 +-1.355597230023996;1.354026433697201;0 +-1.383173432205506;1.34826684716562;0 +-1.356993493425591;1.340936464307243;0 +-1.37881010907552;1.333780614374067;0 +-1.413716694115407;1.329417291244081;0 +-1.423839603776974;1.335176877775662;0 +-1.442863692623712;1.332209818047272;0 +-1.466076571675237;1.333780614374067;0 +-1.486496923923571;1.330813554645676;0 +-1.531526418625024;1.332209818047272;0 +-1.562069680534925;1.333780614374067;0 +-1.562069680534925;1.340936464307243;0 +-1.5388568014834;1.346172452063226;0 +-1.518436449235067;1.34826684716562;0 +-1.53588974175501;1.35123390689401;0 +-1.53588974175501;1.358389756827187;0 +-1.493652773856747;1.359960553153982;0 +-1.528559358896634;1.364323876283967;0 +-1.500983156715123;1.374446785945534;0 +-1.476199481336804;1.376541181047928;0 +-1.486496923923571;1.383173432205506;0 +-1.486496923923571;1.391027413839481;0 +-1.512676862703485;1.393994473567871;0 +-1.498016096986733;1.40359378445384;0 +-1.460316985143656;1.400626724725449;0 +-1.439896632895322;1.404466449079837;0 +-1.388933018737087;1.407258975883028;0 +-1.355597230023996;1.412320430713812;0 +-1.407957107583826;1.410226035611418;0 +-1.457349925415265;1.410226035611418;0 +-1.492256510455152;1.407957107583826;0 +-1.540253064884996;1.407957107583826;0 +-1.570796326794897;1.413716694115407;0 +-1.579522973054868;1.422443340375378;0 +-1.48056280446679;0.3810053757103621;0 +-1.471836158206818;0.3839724354387525;0 +-1.471836158206818;0.3897320219703337;0 +-1.466076571675237;0.3940953451003196;0 +-1.457349925415265;0.3984586682303054;0 +-1.448623279155294;0.4000294645571004;0 +-1.439896632895322;0.4014257279586957;0 +-1.43116998663535;0.4043927876870862;0 +-1.422443340375378;0.4043927876870862;0 +-1.413716694115407;0.4014257279586957;0 +-1.404990047855435;0.4014257279586957;0 +-1.397659664997059;0.3984586682303054;0 +-1.390503815063882;0.3956661414271145;0 +-1.384569695607102;0.3897320219703337;0 +-1.37584304934713;0.3897320219703337;0 +-1.367116403087158;0.3869394951671429;0 +-1.358389756827187;0.3825761720371571;0 +-1.35123390689401;0.3782128489071713;0 +-1.343903524035634;0.3752457891787808;0 +-1.335176877775662;0.3694862026471996;0 +-1.32645023151569;0.3679154063204046;0 +-1.319119848657314;0.3665191429188092;0 +-1.320690644984109;0.359188760060433;0 +-1.314756525527328;0.360759556387228;0 +-1.306029879267357;0.359188760060433;0 +-1.300270292735775;0.3534291735288517;0 +-1.29590696960579;0.3534291735288517;0 +-1.294510706204194;0.3504621138004613;0 +-1.303237352464166;0.3490658503988659;0 +-1.308996938995747;0.3460987906704755;0 +-1.317723585255719;0.3460987906704755;0 +-1.32645023151569;0.3476695869972705;0 +-1.335176877775662;0.3476695869972705;0 +-1.343903524035634;0.3460987906704755;0 +-1.355597230023996;0.3460987906704755;0 +-1.35123390689401;0.3504621138004613;0 +-1.345299787437229;0.3548254369304472;0 +-1.34826684716562;0.360759556387228;0 +-1.361356816555577;0.360759556387228;0 +-1.370083462815548;0.3665191429188092;0 +-1.371479726217144;0.3738495257771854;0 +-1.374446785945534;0.3766420525803763;0 +-1.383173432205506;0.3752457891787808;0 +-1.391900078465478;0.3782128489071713;0 +-1.399230461323854;0.3796091123087666;0 +-1.404990047855435;0.3839724354387525;0 +-1.418080017245393;0.3839724354387525;0 +-1.426806663505364;0.3853686988403479;0 +-1.432566250036946;0.3897320219703337;0 +-1.423839603776974;0.3926990816987241;0 +-1.435533309765336;0.3940953451003196;0 +-1.444259956025308;0.3956661414271145;0 +-1.450019542556889;0.3913028182971287;0 +-1.45595366201367;0.3869394951671429;0 +-1.466076571675237;0.3869394951671429;0 +-1.469043631403627;0.3810053757103621;0 +-1.48056280446679;0.3810053757103621;0 +-1.53588974175501;0.7780677805390721;0 +-1.522799772365053;0.7840018999958529;0 +-1.527163095495038;0.7766715171374767;0 +-1.528559358896634;0.7709119306058954;0 +-1.531526418625024;0.7606144880191288;0 +-1.534493478353415;0.7534586380859521;0 +-1.53292268202662;0.7461282552275759;0 +-1.53292268202662;0.7360053455660087;0 +-1.527163095495038;0.7272786993060371;0 +-1.519832712636662;0.7272786993060371;0 +-1.512676862703485;0.730071226109228;0 +-1.5083135395735;0.7360053455660087;0 +-1.505346479845109;0.7461282552275759;0 +-1.506742743246704;0.7548549014875475;0 +-1.509709802975095;0.7621852843459237;0 +-1.509709802975095;0.7693411342791004;0 +-1.505346479845109;0.7766715171374767;0 +-1.502379420116719;0.7840018999958529;0 +-1.489289450726761;0.7883652231258387;0 +-1.48352986419518;0.7970918693858103;0 +-1.474803217935208;0.7970918693858103;0 +-1.467472835076832;0.7941248096574199;0 +-1.45874618881686;0.7911577499290294;0 +-1.454382865686875;0.7853981633974483;0 +-1.454382865686875;0.7752752537358811;0 +-1.463109511946846;0.7665486074759096;0 +-1.463109511946846;0.7606144880191288;0 +-1.45595366201367;0.7665486074759096;0 +-1.447227015753698;0.7693411342791004;0 +-1.442863692623712;0.7606144880191288;0 +-1.438500369493726;0.751887841759157;0 +-1.426806663505364;0.756251164889143;0 +-1.426806663505364;0.7665486074759096;0 +-1.422443340375378;0.7752752537358811;0 +-1.419476280646988;0.7824311036690579;0 +-1.422443340375378;0.7883652231258387;0 +-1.412320430713812;0.7810348402674625;0 +-1.397659664997059;0.7766715171374767;0 +-1.391900078465478;0.7824311036690579;0 +-1.400626724725449;0.7927285462558246;0 +-1.409353370985421;0.8014551925157961;0 +-1.425410400103769;0.8042477193189871;0 +-1.436929573166932;0.805818515645782;0 +-1.448623279155294;0.805818515645782;0 +-1.460316985143656;0.8072147790473774;0 +-1.469043631403627;0.8072147790473774;0 +-1.466076571675237;0.8014551925157961;0 +-1.48056280446679;0.8014551925157961;0 +-1.487893187325166;0.8028514559173915;0 +-1.496619833585138;0.8014551925157961;0 +-1.514073126105081;0.7984881327874057;0 +-1.518436449235067;0.7984881327874057;0 +-1.524196035766648;0.7927285462558246;0 +-1.530130155223429;0.7853981633974483;0 +-1.53588974175501;0.7780677805390721;0 +3.032509575340148;-0.6864379948093697;0 +3.038269161871729;-0.682074671679384;0 +3.046995808131701;-0.6792821448761931;0 +3.048566604458495;-0.6705554986162214;0 +3.052929927588481;-0.6632251157578452;0 +3.051359131261686;-0.655894732899469;0 +3.048566604458495;-0.6501351463678877;0 +3.052929927588481;-0.6457718232379019;0 +3.044203281328509;-0.6443755598363065;0 +3.039839958198523;-0.6370451769779303;0 +3.033905838741743;-0.6297147941195541;0 +3.028146252210162;-0.6225589441863774;0 +3.02238666567858;-0.6166248247295966;0 +3.020815869351785;-0.6094689747964199;0 +3.0164525462218;-0.6021385919380436;0 +3.025179192481772;-0.6108652381980153;0 +3.036872898470133;-0.6122615015996108;0 +3.042632485001715;-0.6181956210563916;0 +3.046995808131701;-0.6239552075879728;0 +3.046995808131701;-0.6297147941195541;0 +3.051359131261686;-0.6356489135763349;0 +3.052929927588481;-0.6457718232379019;0 +3.058689514120063;-0.6457718232379019;0 +3.063052837250048;-0.6501351463678877;0 +3.061656573848453;-0.6384414403795257;0 +3.06881242378163;-0.6414085001079162;0 +3.070383220108424;-0.6501351463678877;0 +3.073175746911616;-0.657465529226264;0 +3.083473189498382;-0.6602580560294549;0 +3.093596099159949;-0.6632251157578452;0 +3.10232274541992;-0.6588617926278594;0 +3.108082331951502;-0.6544984694978736;0 +3.115412714809878;-0.657465529226264;0 +3.112445655081488;-0.6661921754862357;0 +3.112445655081488;-0.6733480254194123;0 +3.106686068549907;-0.6763150851478027;0 +3.105289805148311;-0.682074671679384;0 +3.097959422289935;-0.682074671679384;0 +3.090629039431559;-0.6850417314077742;0 +3.087836512628367;-0.6894050545377601;0 +3.089232776029963;-0.693768377667746;0 +3.084869452899977;-0.7024950239277176;0 +3.079109866368396;-0.7098254067860938;0 +3.07474654323841;-0.715584993317675;0 +3.06881242378163;-0.7229153761760513;0 +3.058689514120063;-0.7257079029792421;0 +3.051359131261686;-0.7213445798492564;0 +3.055722454391673;-0.7141887299160796;0 +3.058689514120063;-0.7038912873293131;0 +3.055722454391673;-0.6981317007977318;0 +3.048566604458495;-0.6951646410693415;0 +3.04123622160012;-0.6923721142661505;0 +3.032509575340148;-0.6864379948093697;0 +-1.035503845208236;0.8363617775556828;0 +-1.028347995275059;0.8407251006856686;0 +-1.019621349015087;0.8464846872172498;0 +-1.025380935546669;0.8478809506188453;0 +-1.019621349015087;0.8552113334772214;0 +-1.010894702755116;0.8639379797371932;0 +-1.00653137962513;0.8740608893987601;0 +-0.9992009967667536;0.8827875356587318;0 +-0.9948376736367678;0.890117918517108;0 +-0.9890780871051865;0.8958775050486893;0 +-0.9773843811168246;0.9002408281786752;0 +-0.9686577348568529;0.9002408281786752;0 +-0.9730210579868387;0.8915141819187034;0 +-0.980351440845215;0.8827875356587318;0 +-0.9861110273767961;0.8770279491271507;0 +-0.9918706139083775;0.868301302867179;0 +-0.97878064451842;0.8740608893987601;0 +-0.9686577348568529;0.8712683625955693;0 +-0.9759881177152292;0.8669050394655835;0 +-0.9656906751284625;0.8609709200088027;0 +-0.9541715020653;0.8625417163355976;0 +-0.9424777960769379;0.8625417163355976;0 +-0.9337511498169663;0.8595746566072072;0 +-0.9424777960769379;0.8522442737488312;0 +-0.938114472946952;0.8464846872172498;0 +-0.9250245035569946;0.8478809506188453;0 +-0.938114472946952;0.8391543043588735;0 +-0.9410815326753426;0.8333947178272924;0 +-0.9367182095453567;0.830427658098902;0 +-0.9307840900885759;0.8377580409572781;0 +-0.9250245035569946;0.8391543043588735;0 +-0.9293878266869805;0.830427658098902;0 +-0.9206611804270088;0.831998454425697;0 +-0.9236282401553992;0.8232718081657252;0 +-0.92642076695859;0.8145451619057535;0 +-0.9367182095453567;0.8145451619057535;0 +-0.9367182095453567;0.8217010118389303;0 +-0.9454448558053283;0.8173376887089445;0 +-0.9410815326753426;0.8260643349689161;0 +-0.9498081789353141;0.827635131295711;0 +-0.9569640288684909;0.8260643349689161;0 +-0.9656906751284625;0.8173376887089445;0 +-0.9759881177152292;0.8189084850357394;0 +-0.9672614714552574;0.8232718081657252;0 +-0.9672614714552574;0.8290313946973066;0 +-0.97878064451842;0.830427658098902;0 +-0.9918706139083775;0.830427658098902;0 +-1.004960583298335;0.830427658098902;0 +-1.019621349015087;0.831998454425697;0 +-1.032711318405045;0.8290313946973066;0 +-1.035503845208236;0.8363617775556828;0 +-1.199913860746102;-0.9176941206986184;0 +-1.19118721448613;-0.9250245035569946;0 +-1.189790951084534;-0.9307840900885759;0 +-1.186823891356144;-0.9367182095453567;0 +-1.176700981694577;-0.9424777960769379;0 +-1.165007275706215;-0.9468411192069237;0 +-1.157676892847839;-0.9512044423369095;0 +-1.148950246587867;-0.9541715020653;0 +-1.137431073524705;-0.9541715020653;0 +-1.1388273369263;-0.9585348251952858;0 +-1.146157719784676;-0.9599310885968813;0 +-1.160643952576229;-0.9599310885968813;0 +-1.175130185367782;-0.9642944117268671;0 +-1.189790951084534;-0.9642944117268671;0 +-1.186823891356144;-0.9716247945852433;0 +-1.198517597344506;-0.9672614714552574;0 +-1.210036770407669;-0.9686577348568529;0 +-1.21876341666764;-0.9656906751284625;0 +-1.221730476396031;-0.9599310885968813;0 +-1.230457122656002;-0.9628981483252715;0 +-1.242150828644364;-0.9599310885968813;0 +-1.256637061435917;-0.9541715020653;0 +-1.256637061435917;-0.9498081789353141;0 +-1.265363707695889;-0.9498081789353141;0 +-1.268330767424279;-0.9438740594785334;0 +-1.279849940487442;-0.9438740594785334;0 +-1.279849940487442;-0.9395107363485476;0 +-1.288576586747413;-0.9351474132185617;0 +-1.282817000215832;-0.9307840900885759;0 +-1.291543646475804;-0.9293878266869805;0 +-1.300270292735775;-0.9250245035569946;0 +-1.303237352464166;-0.9206611804270088;0 +-1.291543646475804;-0.9250245035569946;0 +-1.279849940487442;-0.9293878266869805;0 +-1.265363707695889;-0.9351474132185617;0 +-1.258033324837513;-0.9395107363485476;0 +-1.244943355447555;-0.9424777960769379;0 +-1.239183768915974;-0.9454448558053283;0 +-1.230457122656002;-0.9367182095453567;0 +-1.227490062927612;-0.9454448558053283;0 +-1.221730476396031;-0.9468411192069237;0 +-1.223126739797626;-0.938114472946952;0 +-1.210036770407669;-0.9337511498169663;0 +-1.211607566734464;-0.9307840900885759;0 +-1.224697536124421;-0.9337511498169663;0 +-1.229060859254407;-0.9307840900885759;0 +-1.226093799526016;-0.9220574438286042;0 +-1.217367153266045;-0.9220574438286042;0 +-1.213003830136059;-0.9176941206986184;0 +-1.207244243604478;-0.9192649170254134;0 +-1.199913860746102;-0.9176941206986184;0 +-2.076941809873252;1.24965574442794;0 +-2.073974750144862;1.257160660211516;0 +-2.059488517353309;1.2618730491919;0 +-2.059488517353309;1.266759971097484;0 +-2.042035224833366;1.27112329422747;0 +-2.020218609183436;1.274439419806259;0 +-2.004161580065089;1.279326341711843;0 +-1.983915760741954;1.279326341711843;0 +-1.976585377883578;1.269203432050277;0 +-1.953372498832054;1.275486617357456;0 +-1.934348409985315;1.271472360077869;0 +-1.912531794335386;1.274090353955861;0 +-1.884955592153876;1.268330767424279;0 +-1.874832682492309;1.277057413684251;0 +-1.860171916775556;1.285784059944223;0 +-1.832595714594046;1.286307658719821;0 +-1.818109481802493;1.281420736814237;0 +-1.826836128062465;1.274963018581858;0 +-1.841322360854018;1.266759971097484;0 +-1.835562774322437;1.259604121164308;0 +-1.82526533173567;1.250179343203538;0 +-1.82823239146406;1.240056433541971;0 +-1.810779098944117;1.233424182384393;0 +-1.785995423565797;1.228711793404008;0 +-1.757022957982692;1.225570200750418;0 +-1.759815484785882;1.217367153266045;0 +-1.780235837034216;1.215970889864449;0 +-1.771509190774244;1.20951317163207;0 +-1.790358746695783;1.204277183876087;0 +-1.812175362345712;1.202008255848495;0 +-1.833991977995641;1.206895177754079;0 +-1.850049007113989;1.213003830136059;0 +-1.868898563035528;1.207244243604478;0 +-1.892285975012252;1.204277183876087;0 +-1.919862177193763;1.199913860746102;0 +-1.949009175702068;1.198168531494107;0 +-1.973618318155188;1.196946801017711;0 +-1.98531202414355;1.208640507006073;0 +-2.010095699521869;1.208640507006073;0 +-2.031912315171799;1.213003830136059;0 +-2.03767190170338;1.223824871498424;0 +-2.015855286053451;1.224697536124421;0 +-1.989675347273536;1.224697536124421;0 +-1.966462468222011;1.229060859254407;0 +-1.989675347273536;1.233947781159991;0 +-2.014459022651855;1.233424182384393;0 +-2.043431488234961;1.234820445785988;0 +-2.060884780754904;1.239707367691572;0 +-2.055125194223323;1.245641487148353;0 +-2.076941809873252;1.24965574442794;0 +2.474004214701962;0.9307840900885759;0 +2.482730860961934;0.9351474132185617;0 +2.48709418409192;0.9395107363485476;0 +2.482730860961934;0.9468411192069237;0 +2.49006124382031;0.9482373826085192;0 +2.494424566950296;0.9424777960769379;0 +2.495820830351891;0.9337511498169663;0 +2.498787890080282;0.9250245035569946;0 +2.498787890080282;0.9162978572970231;0 +2.497217093753487;0.9075712110370514;0 +2.501580416883473;0.8988445647770796;0 +2.504547476611863;0.890117918517108;0 +2.507514536340253;0.8813912722571364;0 +2.511877859470239;0.8726646259971648;0 +2.516241182600225;0.8639379797371932;0 +2.519033709403416;0.8566075968788169;0 +2.508910799741848;0.8609709200088027;0 +2.500184153481877;0.8609709200088027;0 +2.494424566950296;0.8566075968788169;0 +2.492853770623501;0.8508480103472356;0 +2.488490447493515;0.8435176274888594;0 +2.48709418409192;0.8347909812288877;0 +2.49006124382031;0.8290313946973066;0 +2.495820830351891;0.8246680715673207;0 +2.497217093753487;0.8189084850357394;0 +2.503151213210267;0.8159414253073491;0 +2.503151213210267;0.8072147790473774;0 +2.495820830351891;0.8129743655789586;0 +2.488490447493515;0.8145451619057535;0 +2.482730860961934;0.8101818387757678;0 +2.478367537831948;0.8014551925157961;0 +2.474004214701962;0.8129743655789586;0 +2.478367537831948;0.8203047484373349;0 +2.478367537831948;0.830427658098902;0 +2.481334597560338;0.8377580409572781;0 +2.478367537831948;0.8464846872172498;0 +2.475400478103558;0.8508480103472356;0 +2.478367537831948;0.8566075968788169;0 +2.479763801233544;0.8639379797371932;0 +2.479763801233544;0.8726646259971648;0 +2.478367537831948;0.8813912722571364;0 +2.479763801233544;0.890117918517108;0 +2.478367537831948;0.8974483013754843;0 +2.472607951300366;0.9032078879070654;0 +2.472607951300366;0.9119345341670372;0 +2.475400478103558;0.9206611804270088;0 +2.474004214701962;0.9307840900885759;0 +2.091428042664805;0.2836160034490786;0 +2.100154688924777;0.2806489437206882;0 +2.100154688924777;0.2893755899806598;0 +2.103121748653167;0.2996730325674264;0 +2.100154688924777;0.3068288825006031;0 +2.103121748653167;0.3141592653589793;0 +2.106088808381557;0.322885911618951;0 +2.113244658314734;0.3242821750205464;0 +2.12057504117311;0.3199188518905606;0 +2.127905424031487;0.3185225884889651;0 +2.135061273964663;0.322885911618951;0 +2.132268747161473;0.3127630019573839;0 +2.132268747161473;0.3040363556974122;0 +2.138028333693053;0.2981022362406315;0 +2.135061273964663;0.2893755899806598;0 +2.129301687433082;0.2822197400474831;0 +2.121971304574706;0.2748893571891069;0 +2.119178777771515;0.2661627109291352;0 +2.123542100901501;0.2544690049407732;0 +2.126334627704692;0.2457423586808016;0 +2.133665010563068;0.2429498318776107;0 +2.139424597094649;0.2473131550075965;0 +2.14535871655143;0.2473131550075965;0 +2.152514566484606;0.2443460952792061;0 +2.162812009071373;0.2399827721492203;0 +2.156877889614592;0.2385865087476248;0 +2.159844949342983;0.2326523892908441;0 +2.167175332201359;0.2254965393576674;0 +2.161241212744578;0.2239257430308725;0 +2.154085362811401;0.2268928027592629;0 +2.148151243354621;0.2370157124208299;0 +2.139424597094649;0.2413790355508158;0 +2.140995393421444;0.2356194490192345;0 +2.140995393421444;0.2282890661608583;0 +2.132268747161473;0.2385865087476248;0 +2.124938364303096;0.2429498318776107;0 +2.116211718043124;0.2370157124208299;0 +2.106088808381557;0.2399827721492203;0 +2.106088808381557;0.2473131550075965;0 +2.111848394913139;0.2530727415391778;0 +2.106088808381557;0.2574360646691636;0 +2.104518012054762;0.2516764781375823;0 +2.095791365794791;0.2574360646691636;0 +2.094395102393195;0.2661627109291352;0 +2.0929988389916;0.2734930937875114;0 +2.091428042664805;0.2836160034490786;0 +2.905973204570559;-0.8014551925157961;0 +2.91173279110214;-0.7927285462558246;0 +2.916096114232126;-0.7867944267990437;0 +2.924822760492098;-0.7810348402674625;0 +2.930756879948878;-0.7752752537358811;0 +2.937912729882055;-0.7693411342791004;0 +2.946639376142027;-0.767944870877505;0 +2.958333082130388;-0.7621852843459237;0 +2.96705972839036;-0.756251164889143;0 +2.975786374650331;-0.7504915783575616;0 +2.985909284311899;-0.7447319918259805;0 +2.990272607441885;-0.7374016089676042;0 +2.993239667170275;-0.730071226109228;0 +3.001966313430247;-0.7272786993060371;0 +3.004933373158637;-0.7213445798492564;0 +3.004933373158637;-0.7141887299160796;0 +3.012089223091814;-0.7098254067860938;0 +3.020815869351785;-0.7141887299160796;0 +3.02238666567858;-0.7213445798492564;0 +3.028146252210162;-0.7185520530460655;0 +3.033905838741743;-0.7141887299160796;0 +3.035476635068538;-0.7199483164476609;0 +3.042632485001715;-0.7213445798492564;0 +3.042632485001715;-0.730071226109228;0 +3.036872898470133;-0.7360053455660087;0 +3.029542515611757;-0.7431611954991855;0 +3.023782929080176;-0.7504915783575616;0 +3.0164525462218;-0.7534586380859521;0 +3.015056282820204;-0.7592182246175333;0 +3.020815869351785;-0.7635815477475191;0 +3.009296696288622;-0.7635815477475191;0 +3.001966313430247;-0.7693411342791004;0 +2.991843403768679;-0.7737044574090862;0 +2.988876344040289;-0.7796385768658669;0 +2.985909284311899;-0.7867944267990437;0 +2.983116757508708;-0.7941248096574199;0 +2.977182638051928;-0.8014551925157961;0 +2.970026788118751;-0.8072147790473774;0 +2.961300141858779;-0.8115781021773631;0 +2.949606435870417;-0.8145451619057535;0 +2.937912729882055;-0.8115781021773631;0 +2.929186083622084;-0.8101818387757678;0 +2.924822760492098;-0.805818515645782;0 +2.919063173960516;-0.8072147790473774;0 +2.910336527700544;-0.805818515645782;0 +2.905973204570559;-0.8014551925157961;0 +2.129301687433082;0.1251401073679934;0 +2.130697950834678;0.1352630170295605;0 +2.135061273964663;0.1396263401595464;0 +2.143787920224635;0.1425933998879367;0 +2.148151243354621;0.148352986419518;0 +2.155481626212997;0.1513200461479084;0 +2.161241212744578;0.148352986419518;0 +2.162812009071373;0.1410226035611418;0 +2.168571595602955;0.1469567230179225;0 +2.175901978461331;0.148352986419518;0 +2.178694505264521;0.1570796326794897;0 +2.184628624721302;0.1541125729510993;0 +2.190388211252884;0.1584758960810851;0 +2.188991947851288;0.1701696020694471;0 +2.199114857512855;0.1628392192110709;0 +2.204874444044437;0.1541125729510993;0 +2.204874444044437;0.1439896632895322;0 +2.209237767174422;0.1338667536279651;0 +2.209237767174422;0.1265363707695889;0 +2.204874444044437;0.1192059879112127;0 +2.202081917241245;0.1104793416512411;0 +2.199114857512855;0.1207767842380076;0 +2.194751534382869;0.1279326341711844;0 +2.190388211252884;0.1221730476396031;0 +2.187421151524493;0.1178097245096172;0 +2.191784474654479;0.112050137978036;0 +2.194751534382869;0.1061160185212552;0 +2.188991947851288;0.09738937226128359;0 +2.183057828394507;0.1033234917180643;0 +2.177298241862926;0.1033234917180643;0 +2.16996785900455;0.1076868148480501;0 +2.164208272472969;0.112050137978036;0 +2.164208272472969;0.1221730476396031;0 +2.168571595602955;0.1279326341711844;0 +2.164208272472969;0.1322959573011702;0 +2.156877889614592;0.1352630170295605;0 +2.151118303083011;0.1295034304979792;0 +2.14535871655143;0.1279326341711844;0 +2.143787920224635;0.1352630170295605;0 +2.138028333693053;0.1338667536279651;0 +2.133665010563068;0.1265363707695889;0 +2.130697950834678;0.1192059879112127;0 +2.129301687433082;0.1251401073679934;0 +1.841322360854018;-0.1164134611080218;0 +1.847081947385599;-0.1104793416512411;0 +1.851445270515585;-0.1017526953912694;0 +1.861742713102351;-0.1047197551196598;0 +1.868898563035528;-0.1017526953912694;0 +1.874832682492309;-0.1033234917180643;0 +1.88355932875228;-0.1076868148480501;0 +1.892285975012252;-0.1090830782496456;0 +1.896649298142238;-0.1164134611080218;0 +1.903805148075415;-0.1178097245096172;0 +1.912531794335386;-0.1178097245096172;0 +1.921258440595358;-0.1192059879112127;0 +1.928588823453734;-0.1192059879112127;0 +1.934348409985315;-0.1104793416512411;0 +1.943075056245287;-0.1148426647812269;0 +1.953372498832054;-0.1178097245096172;0 +1.962099145092025;-0.1192059879112127;0 +1.967858731623607;-0.1235693110411985;0 +1.969254995025202;-0.1308996938995747;0 +1.979552437611969;-0.1338667536279651;0 +1.98827908387194;-0.1322959573011702;0 +1.997005730131912;-0.1338667536279651;0 +1.997005730131912;-0.1425933998879367;0 +1.997005730131912;-0.1497492498211135;0 +1.989675347273536;-0.148352986419518;0 +1.982344964415159;-0.1453859266911277;0 +1.973618318155188;-0.1425933998879367;0 +1.963495408493621;-0.1453859266911277;0 +1.954768762233649;-0.1425933998879367;0 +1.946042115973677;-0.1425933998879367;0 +1.937315469713706;-0.1410226035611418;0 +1.928588823453734;-0.1396263401595464;0 +1.919862177193763;-0.1352630170295605;0 +1.912531794335386;-0.1338667536279651;0 +1.902408884673819;-0.1338667536279651;0 +1.895078501815443;-0.1352630170295605;0 +1.884955592153876;-0.1338667536279651;0 +1.8776252092955;-0.1295034304979792;0 +1.867502299633933;-0.1279326341711844;0 +1.858775653373961;-0.1265363707695889;0 +1.860171916775556;-0.1221730476396031;0 +1.850049007113989;-0.1178097245096172;0 +1.841322360854018;-0.1164134611080218;0 +2.440493893063671;0.7431611954991855;0 +2.450791335650437;0.7490953149559663;0 +2.449220539323643;0.7548549014875475;0 +2.456550922182019;0.7534586380859521;0 +2.46527756844199;0.7534586380859521;0 +2.466673831843586;0.7578219612159379;0 +2.46527756844199;0.7635815477475191;0 +2.471037154973572;0.767944870877505;0 +2.472607951300366;0.7737044574090862;0 +2.474004214701962;0.7810348402674625;0 +2.469640891571976;0.7897614865274341;0 +2.476971274430352;0.7941248096574199;0 +2.48412712436353;0.7883652231258387;0 +2.49006124382031;0.7810348402674625;0 +2.495820830351891;0.7766715171374767;0 +2.505943740013458;0.7709119306058954;0 +2.516241182600225;0.767944870877505;0 +2.524967828860196;0.7665486074759096;0 +2.536487001923359;0.7723081940074908;0 +2.530727415391778;0.7635815477475191;0 +2.535090738521764;0.7606144880191288;0 +2.535090738521764;0.756251164889143;0 +2.545213648183331;0.7578219612159379;0 +2.536487001923359;0.7534586380859521;0 +2.526364092261792;0.7490953149559663;0 +2.516241182600225;0.7504915783575616;0 +2.507514536340253;0.7447319918259805;0 +2.501580416883473;0.7387978723691996;0 +2.500184153481877;0.7330382858376184;0 +2.48709418409192;0.7374016089676042;0 +2.475400478103558;0.7431611954991855;0 +2.466673831843586;0.7417649320975901;0 +2.459517981910409;0.7387978723691996;0 +2.455154658780423;0.7417649320975901;0 +2.449220539323643;0.7417649320975901;0 +2.447824275922047;0.7374016089676042;0 +2.455154658780423;0.7344345492392138;0 +2.4623105087136;0.730071226109228;0 +2.452187599052033;0.7272786993060371;0 +2.443460952792061;0.7229153761760513;0 +2.443460952792061;0.7330382858376184;0 +2.439097629662076;0.7374016089676042;0 +2.440493893063671;0.7431611954991855;0 +0.90181162450547;1.249306678577541;0 +0.90181162450547;1.258033324837513;0 +0.9206611804270088;1.262396647967498;0 +0.9162978572970231;1.268330767424279;0 +0.9293878266869805;1.277057413684251;0 +0.9482373826085192;1.281420736814237;0 +0.9395107363485476;1.287180323345818;0 +0.9585348251952858;1.294510706204194;0 +0.9730210579868387;1.304633615865761;0 +0.9730210579868387;1.310393202397343;0 +1.003564319896739;1.314756525527328;0 +1.015258025885101;1.319119848657314;0 +1.03410758180664;1.325053968114095;0 +1.067617903444931;1.330813554645676;0 +1.102524488484818;1.330813554645676;0 +1.137431073524705;1.333780614374067;0 +1.151917306316258;1.339540200905648;0 +1.182460568226158;1.343903524035634;0 +1.205673447277683;1.340936464307243;0 +1.201310124147697;1.332209818047272;0 +1.173733921966187;1.327846494917286;0 +1.143190660056286;1.3234831717873;0 +1.114043661547981;1.320690644984109;0 +1.08646745936647;1.314756525527328;0 +1.060287520586555;1.308996938995747;0 +1.044230491468207;1.301666556137371;0 +1.023984672145073;1.294510706204194;0 +1.009323906428321;1.287180323345818;0 +0.9948376736367678;1.279849940487442;0 +0.980351440845215;1.272694090554265;0 +0.9700539982584483;1.265363707695889;0 +0.9686577348568529;1.256637061435917;0 +0.9730210579868387;1.247910415175946;0 +0.9831439676484057;1.240580032317569;0 +1.00653137962513;1.234820445785988;0 +0.9934414102351724;1.231853386057598;0 +0.9656906751284625;1.233424182384393;0 +0.9395107363485476;1.236216709187584;0 +0.9220574438286042;1.242150828644364;0 +0.90181162450547;1.249306678577541;0 +0.1919862177193762;1.391900078465478;0 +0.2413790355508158;1.393296341867073;0 +0.2705260340591211;1.390503815063882;0 +0.285012266850674;1.396787000371062;0 +0.3141592653589793;1.394867138193868;0 +0.3141592653589793;1.400626724725449;0 +0.3490658503988659;1.404990047855435;0 +0.3665191429188092;1.399230461323854;0 +0.4014257279586957;1.40359378445384;0 +0.433365253270192;1.400626724725449;0 +0.471238898038469;1.399230461323854;0 +0.471238898038469;1.393994473567871;0 +0.4480260189869444;1.386140491933896;0 +0.4159119607502487;1.381777168803911;0 +0.3651228795172138;1.384569695607102;0 +0.3272492347489368;1.391027413839481;0 +0.3316125578789226;1.381777168803911;0 +0.3752457891787808;1.37584304934713;0 +0.3869394951671429;1.368687199413953;0 +0.4043927876870862;1.362753079957173;0 +0.433365253270192;1.356993493425591;0 +0.3956661414271145;1.34826684716562;0 +0.3635520831904188;1.35123390689401;0 +0.3782128489071713;1.359960553153982;0 +0.360759556387228;1.364498409209167;0 +0.3534291735288517;1.372352390843141;0 +0.3316125578789226;1.368687199413953;0 +0.3302162944773271;1.361880415331175;0 +0.3155555287605747;1.352630170295605;0 +0.3024655593706173;1.343903524035634;0 +0.296705972839036;1.335176877775662;0 +0.2647664475275398;1.344252589886032;0 +0.2443460952792061;1.352630170295605;0 +0.2385865087476248;1.36048415192958;0 +0.2631956512007449;1.365196540909964;0 +0.2298598624876532;1.365196540909964;0 +0.2036799237077382;1.373574121319537;0 +0.1919862177193762;1.384569695607102;0 +0.1919862177193762;1.391900078465478;0 +-1.300270292735775;0.3199188518905606;0 +-1.294510706204194;0.3242821750205464;0 +-1.285784059944223;0.322885911618951;0 +-1.278453677085846;0.3199188518905606;0 +-1.269727030825875;0.3199188518905606;0 +-1.262396647967498;0.3242821750205464;0 +-1.269727030825875;0.3316125578789226;0 +-1.269727030825875;0.3373721444105038;0 +-1.274090353955861;0.3433062638672846;0 +-1.282817000215832;0.3433062638672846;0 +-1.277057413684251;0.3476695869972705;0 +-1.266759971097484;0.3476695869972705;0 +-1.256637061435917;0.3433062638672846;0 +-1.250877474904336;0.3460987906704755;0 +-1.239183768915974;0.3460987906704755;0 +-1.230457122656002;0.3447025272688801;0 +-1.220334212994435;0.3433062638672846;0 +-1.217367153266045;0.3373721444105038;0 +-1.207244243604478;0.3373721444105038;0 +-1.214400093537654;0.3330088212805181;0 +-1.199913860746102;0.3302162944773271;0 +-1.192583477887725;0.322885911618951;0 +-1.198517597344506;0.3155555287605747;0 +-1.204277183876087;0.3214896482173555;0 +-1.213003830136059;0.3214896482173555;0 +-1.223126739797626;0.3185225884889651;0 +-1.231853386057598;0.3171263250873697;0 +-1.231853386057598;0.3214896482173555;0 +-1.240580032317569;0.3185225884889651;0 +-1.240580032317569;0.3141592653589793;0 +-1.24651415177435;0.3068288825006031;0 +-1.253670001707527;0.3155555287605747;0 +-1.262396647967498;0.3171263250873697;0 +-1.269727030825875;0.3155555287605747;0 +-1.277057413684251;0.3171263250873697;0 +-1.285784059944223;0.3171263250873697;0 +-1.288576586747413;0.3141592653589793;0 +-1.300270292735775;0.3199188518905606;0 +-0.4246386070102203;1.143190660056286;0 +-0.4145156973486533;1.148950246587867;0 +-0.4131194339470578;1.154884366044648;0 +-0.4014257279586957;1.154884366044648;0 +-0.4014257279586957;1.159247689174634;0 +-0.3883357585687384;1.157676892847839;0 +-0.3752457891787808;1.151917306316258;0 +-0.3738495257771854;1.14179439665469;0 +-0.3548254369304472;1.144586923457881;0 +-0.3534291735288517;1.153313569717853;0 +-0.3433062638672846;1.148950246587867;0 +-0.3359758810089085;1.153313569717853;0 +-0.3185225884889651;1.154884366044648;0 +-0.3068288825006031;1.151917306316258;0 +-0.2937389131106456;1.154884366044648;0 +-0.2836160034490786;1.160643952576229;0 +-0.2734930937875114;1.156280629446243;0 +-0.2574360646691636;1.157676892847839;0 +-0.2560398012675681;1.147553983186272;0 +-0.2385865087476248;1.143190660056286;0 +-0.2385865087476248;1.133067750394719;0 +-0.2530727415391778;1.124341104134747;0 +-0.2762856205907024;1.119977781004761;0 +-0.2923426497090502;1.114043661547981;0 +-0.308399678827398;1.112647398146385;0 +-0.3272492347489368;1.106887811614804;0 +-0.3490658503988659;1.109680338417995;0 +-0.3665191429188092;1.114043661547981;0 +-0.39706240482871;1.114043661547981;0 +-0.3839724354387525;1.121374044406357;0 +-0.3940953451003196;1.130100690666328;0 +-0.4188790204786391;1.130100690666328;0 +-0.3984586682303054;1.13586027719791;0 +-0.3853686988403479;1.14179439665469;0 +-0.39706240482871;1.144586923457881;0 +-0.4115486376202628;1.14179439665469;0 +-0.4246386070102203;1.143190660056286;0 +-1.607099175236379;0.8145451619057535;0 +-1.598372528976407;0.8145451619057535;0 +-1.586853355913244;0.8189084850357394;0 +-1.579522973054868;0.8115781021773631;0 +-1.566433003664911;0.8159414253073491;0 +-1.553343034274953;0.8203047484373349;0 +-1.540253064884996;0.827635131295711;0 +-1.531526418625024;0.827635131295711;0 +-1.543220124613386;0.8217010118389303;0 +-1.543220124613386;0.8159414253073491;0 +-1.531526418625024;0.8173376887089445;0 +-1.524196035766648;0.8101818387757678;0 +-1.512676862703485;0.8101818387757678;0 +-1.498016096986733;0.8145451619057535;0 +-1.48352986419518;0.8159414253073491;0 +-1.48352986419518;0.8115781021773631;0 +-1.474803217935208;0.8115781021773631;0 +-1.479166541065194;0.8189084850357394;0 +-1.477770277663599;0.8260643349689161;0 +-1.48352986419518;0.830427658098902;0 +-1.48352986419518;0.8363617775556828;0 +-1.496619833585138;0.8363617775556828;0 +-1.503950216443514;0.842121364087264;0 +-1.509709802975095;0.8508480103472356;0 +-1.524196035766648;0.8508480103472356;0 +-1.537286005156605;0.8552113334772214;0 +-1.543220124613386;0.8494517469456402;0 +-1.554739297676549;0.8450884238156544;0 +-1.560673417133329;0.8391543043588735;0 +-1.567829267066506;0.8347909812288877;0 +-1.579522973054868;0.831998454425697;0 +-1.58824961931484;0.8260643349689161;0 +-1.598372528976407;0.8203047484373349;0 +-1.607099175236379;0.8145451619057535;0 +2.024581932313422;-0.1556833692778942;0 +2.025978195715017;-0.1469567230179225;0 +2.033308578573394;-0.1439896632895322;0 +2.042035224833366;-0.1469567230179225;0 +2.052158134494933;-0.1469567230179225;0 +2.059488517353309;-0.148352986419518;0 +2.055125194223323;-0.1410226035611418;0 +2.066818900211685;-0.1439896632895322;0 +2.076941809873252;-0.1439896632895322;0 +2.085668456133224;-0.1497492498211135;0 +2.094395102393195;-0.1453859266911277;0 +2.103121748653167;-0.1425933998879367;0 +2.111848394913139;-0.1453859266911277;0 +2.12057504117311;-0.148352986419518;0 +2.129301687433082;-0.1469567230179225;0 +2.136632070291458;-0.1513200461479084;0 +2.14535871655143;-0.1425933998879367;0 +2.158448685941387;-0.1453859266911277;0 +2.146754979953025;-0.148352986419518;0 +2.136632070291458;-0.1513200461479084;0 +2.129301687433082;-0.1541125729510993;0 +2.12057504117311;-0.1527163095495038;0 +2.111848394913139;-0.1541125729510993;0 +2.103121748653167;-0.1527163095495038;0 +2.094395102393195;-0.1527163095495038;0 +2.085668456133224;-0.1497492498211135;0 +2.076941809873252;-0.1513200461479084;0 +2.068215163613281;-0.1527163095495038;0 +2.060884780754904;-0.1541125729510993;0 +2.053728930821728;-0.1570796326794897;0 +2.045002284561756;-0.1584758960810851;0 +2.033308578573394;-0.1556833692778942;0 +2.024581932313422;-0.1556833692778942;0 +-2.055125194223323;1.313360262125733;0 +-2.045002284561756;1.320690644984109;0 +-2.031912315171799;1.328719159543283;0 +-2.020218609183436;1.334653279000064;0 +-1.995434933805117;1.333780614374067;0 +-1.967858731623607;1.329417291244081;0 +-1.954768762233649;1.325053968114095;0 +-1.944645852572082;1.318945315732115;0 +-1.909739267532195;1.317723585255719;0 +-1.921258440595358;1.3234831717873;0 +-1.916895117465372;1.328195560767685;0 +-1.93295214658372;1.330813554645676;0 +-1.919862177193763;1.336573141177257;0 +-1.905375944402209;1.340412865531645;0 +-1.895078501815443;1.332209818047272;0 +-1.867502299633933;1.326799297366089;0 +-1.844289420582408;1.324181303488098;0 +-1.850049007113989;1.31719998648012;0 +-1.85301606684238;1.309520537771345;0 +-1.874832682492309;1.30812427436975;0 +-1.911135530933791;1.308996938995747;0 +-1.931555883182125;1.305506280491759;0 +-1.949009175702068;1.300793891511374;0 +-1.967858731623607;1.29887402933418;0 +-1.989675347273536;1.300270292735775;0 +-1.998401993533507;1.304110017090163;0 +-1.976585377883578;1.307600675594152;0 +-1.994038670403522;1.313360262125733;0 +-2.011491962923465;1.308473340220149;0 +-2.030341518845003;1.31126586702334;0 +-2.055125194223323;1.313360262125733;0 +-0.1802925117310143;0.9105382707654417;0 +-0.1701696020694471;0.9105382707654417;0 +-0.1658062789394613;0.9192649170254134;0 +-0.1570796326794897;0.9279915632853851;0 +-0.1658062789394613;0.9279915632853851;0 +-0.1745329251994329;0.9337511498169663;0 +-0.1658062789394613;0.938114472946952;0 +-0.1745329251994329;0.9410815326753426;0 +-0.1701696020694471;0.9468411192069237;0 +-0.1584758960810851;0.9468411192069237;0 +-0.148352986419518;0.9468411192069237;0 +-0.1425933998879367;0.9512044423369095;0 +-0.1513200461479084;0.9541715020653;0 +-0.1439896632895322;0.9613273519984766;0 +-0.1308996938995747;0.9642944117268671;0 +-0.1178097245096172;0.9628981483252715;0 +-0.1061160185212552;0.9613273519984766;0 +-0.1003564319896739;0.9555677654668955;0 +-0.09738937226128359;0.9468411192069237;0 +-0.1090830782496456;0.9410815326753426;0 +-0.1061160185212552;0.9337511498169663;0 +-0.1047197551196598;0.9250245035569946;0 +-0.1076868148480501;0.9176941206986184;0 +-0.1104793416512411;0.9105382707654417;0 +-0.1265363707695889;0.9089674744386468;0 +-0.1396263401595464;0.9032078879070654;0 +-0.1527163095495038;0.9002408281786752;0 +-0.1672025423410568;0.8988445647770796;0 +-0.1759291886010284;0.9032078879070654;0 +-0.1802925117310143;0.9105382707654417;0 +-3.141592653589793;1.205673447277683;0 +-3.125535624471445;1.199913860746102;0 +-3.109653128278297;1.19415427421452;0 +-3.087836512628367;1.189790951084534;0 +-3.06881242378163;1.183856831627754;0 +-3.054326190990076;1.178097245096172;0 +-3.045599544730105;1.170766862237796;0 +-3.02238666567858;1.170766862237796;0 +-2.996206726898666;1.167974335434605;0 +-2.981545961181913;1.160643952576229;0 +-2.96409266866197;1.153313569717853;0 +-2.977182638051928;1.148950246587867;0 +-2.985909284311899;1.143190660056286;0 +-3.004933373158637;1.143190660056286;0 +-3.004933373158637;1.134464013796314;0 +-3.015056282820204;1.128704427264733;0 +-3.01941960595019;1.121374044406357;0 +-3.036872898470133;1.124341104134747;0 +-3.055722454391673;1.130100690666328;0 +-3.06881242378163;1.134464013796314;0 +-3.07177948351002;1.14179439665469;0 +-3.089232776029963;1.144586923457881;0 +-3.100926482018325;1.14179439665469;0 +-3.115412714809878;1.143190660056286;0 +-3.12117230134146;1.150521042914662;0 +-3.12413936106985;1.157676892847839;0 +-3.140196390188198;1.151917306316258;0 +-3.128502684199836;1.146157719784676;0 +-3.135833067058211;1.137431073524705;0 +-3.141592653589793;1.135336678422311;0 +-3.141592653589793;1.205673447277683;0 +-1.678483141642947;1.344427122811232;0 +-1.646369083406251;1.342507260634038;0 +-1.623156204354726;1.337794871653654;0 +-1.592612942444826;1.337794871653654;0 +-1.583886296184854;1.332907949748069;0 +-1.565036740263315;1.329417291244081;0 +-1.573763386523287;1.326101165665292;0 +-1.548979711144967;1.321214243759708;0 +-1.514073126105081;1.319119848657314;0 +-1.48056280446679;1.3233086388621;0 +-1.450019542556889;1.321563309610106;0 +-1.423839603776974;1.321563309610106;0 +-1.393296341867073;1.31719998648012;0 +-1.393296341867073;1.310393202397343;0 +-1.40359378445384;1.303237352464166;0 +-1.434137046363741;1.300270292735775;0 +-1.460316985143656;1.304633615865761;0 +-1.479166541065194;1.29887402933418;0 +-1.509709802975095;1.29887402933418;0 +-1.5388568014834;1.299746693960177;0 +-1.570796326794897;1.300793891511374;0 +-1.605702911834783;1.304633615865761;0 +-1.608669971563174;1.313360262125733;0 +-1.602735852106393;1.320690644984109;0 +-1.608669971563174;1.327846494917286;0 +-1.627519527484712;1.332209818047272;0 +-1.659459052796208;1.330813554645676;0 +-1.679879405044542;1.338143937504052;0 +-1.678483141642947;1.344427122811232;0 +2.127905424031487;0.1832595714594046;0 +2.129301687433082;0.1905899543177808;0 +2.130697950834678;0.1993166005777524;0 +2.127905424031487;0.2064724505109292;0 +2.138028333693053;0.2050761871093337;0 +2.139424597094649;0.2007128639793479;0 +2.149722039681416;0.2007128639793479;0 +2.148151243354621;0.1905899543177808;0 +2.155481626212997;0.1890191579909859;0 +2.154085362811401;0.1818633080578091;0 +2.161241212744578;0.1862266311877949;0 +2.164208272472969;0.1933824811209717;0 +2.164208272472969;0.1846558348610001;0 +2.164208272472969;0.1774999849278233;0 +2.17293491873294;0.1759291886010284;0 +2.17293491873294;0.1687733386678517;0 +2.164208272472969;0.1672025423410568;0 +2.159844949342983;0.1731366617978375;0 +2.155481626212997;0.1672025423410568;0 +2.149722039681416;0.1701696020694471;0 +2.152514566484606;0.1614429558094755;0 +2.146754979953025;0.1570796326794897;0 +2.140995393421444;0.1628392192110709;0 +2.136632070291458;0.1701696020694471;0 +2.143787920224635;0.1745329251994329;0 +2.143787920224635;0.1818633080578091;0 +2.138028333693053;0.1846558348610001;0 +2.127905424031487;0.1832595714594046;0 +-2.042035224833366;1.067617903444931;0 +-2.024581932313422;1.061683783988151;0 +-2.011491962923465;1.061683783988151;0 +-1.997005730131912;1.064650843716541;0 +-1.98827908387194;1.063254580314946;0 +-1.98531202414355;1.069014166846527;0 +-1.970825791351997;1.071981226574917;0 +-1.95773582196204;1.074773753378108;0 +-1.950405439103663;1.08350039963808;0 +-1.93591920631211;1.087863722768066;0 +-1.916895117465372;1.08943451909486;0 +-1.922829236922153;1.093797842224846;0 +-1.902408884673819;1.093797842224846;0 +-1.919862177193763;1.096590369028037;0 +-1.93295214658372;1.096590369028037;0 +-1.947438379375273;1.093797842224846;0 +-1.953372498832054;1.08943451909486;0 +-1.962099145092025;1.08350039963808;0 +-1.973618318155188;1.082104136236484;0 +-1.986708287545145;1.085071195964875;0 +-1.992642407001926;1.08943451909486;0 +-2.01288822632506;1.08943451909486;0 +-2.008524903195074;1.085071195964875;0 +-1.998401993533507;1.079137076508094;0 +-2.011491962923465;1.077740813106498;0 +-2.01288822632506;1.071981226574917;0 +-2.021614872585032;1.067617903444931;0 +-2.042035224833366;1.067617903444931;0 +1.807812039215726;0.9002408281786752;0 +1.823869068334074;0.8958775050486893;0 +1.836959037724032;0.8988445647770796;0 +1.848652743712394;0.90181162450547;0 +1.854412330243975;0.9105382707654417;0 +1.867502299633933;0.9162978572970231;0 +1.881988532425485;0.9192649170254134;0 +1.890715178685457;0.9250245035569946;0 +1.902408884673819;0.9337511498169663;0 +1.909739267532195;0.9424777960769379;0 +1.911135530933791;0.9512044423369095;0 +1.914102590662181;0.9613273519984766;0 +1.918465913792167;0.9700539982584483;0 +1.911135530933791;0.9730210579868387;0 +1.906772207803805;0.9686577348568529;0 +1.905375944402209;0.9628981483252715;0 +1.899441824945429;0.9555677654668955;0 +1.893682238413847;0.9482373826085192;0 +1.887922651882266;0.9410815326753426;0 +1.8776252092955;0.9337511498169663;0 +1.867502299633933;0.92642076695859;0 +1.860171916775556;0.9206611804270088;0 +1.851445270515585;0.9162978572970231;0 +1.844289420582408;0.9105382707654417;0 +1.836959037724032;0.904604151308661;0 +1.823869068334074;0.9032078879070654;0 +1.807812039215726;0.9002408281786752;0 +1.015258025885101;0.7853981633974483;0 +1.015258025885101;0.7766715171374767;0 +1.018050552688292;0.7723081940074908;0 +1.018050552688292;0.7621852843459237;0 +1.029744258676654;0.7621852843459237;0 +1.041437964665016;0.7621852843459237;0 +1.044230491468207;0.7592182246175333;0 +1.055924197456569;0.7621852843459237;0 +1.066047107118136;0.7709119306058954;0 +1.066047107118136;0.7796385768658669;0 +1.073377489976513;0.7810348402674625;0 +1.079137076508094;0.7853981633974483;0 +1.073377489976513;0.7911577499290294;0 +1.064650843716541;0.7984881327874057;0 +1.064650843716541;0.8028514559173915;0 +1.070410430248122;0.8101818387757678;0 +1.076344549704903;0.8159414253073491;0 +1.064650843716541;0.8115781021773631;0 +1.060287520586555;0.8145451619057535;0 +1.048593814598193;0.8115781021773631;0 +1.048593814598193;0.805818515645782;0 +1.042834228066612;0.8086110424489729;0 +1.038470904936626;0.8014551925157961;0 +1.029744258676654;0.8014551925157961;0 +1.023984672145073;0.7998843961890013;0 +1.022413875818278;0.7927285462558246;0 +1.015258025885101;0.7853981633974483;0 +-1.329417291244081;-1.240580032317569;0 +-1.303237352464166;-1.240580032317569;0 +-1.274090353955861;-1.239183768915974;0 +-1.253670001707527;-1.237787505514379;0 +-1.239183768915974;-1.236216709187584;0 +-1.233424182384393;-1.231853386057598;0 +-1.239183768915974;-1.223126739797626;0 +-1.247910415175946;-1.214400093537654;0 +-1.250877474904336;-1.205673447277683;0 +-1.242150828644364;-1.202880920474492;0 +-1.227490062927612;-1.201310124147697;0 +-1.215970889864449;-1.211607566734464;0 +-1.210036770407669;-1.221730476396031;0 +-1.201310124147697;-1.230457122656002;0 +-1.195550537616116;-1.239183768915974;0 +-1.192583477887725;-1.247910415175946;0 +-1.195550537616116;-1.255240798034322;0 +-1.201310124147697;-1.262396647967498;0 +-1.221730476396031;-1.266759971097484;0 +-1.247910415175946;-1.268330767424279;0 +-1.274090353955861;-1.266759971097484;0 +-1.279849940487442;-1.261000384565903;0 +-1.297303233007385;-1.259604121164308;0 +-1.308996938995747;-1.253670001707527;0 +-1.32645023151569;-1.250877474904336;0 +-1.335176877775662;-1.244943355447555;0 +-1.329417291244081;-1.240580032317569;0 +-2.183057828394507;1.153313569717853;0 +-2.156877889614592;1.15418623434385;0 +-2.129301687433082;1.156280629446243;0 +-2.111848394913139;1.151917306316258;0 +-2.129301687433082;1.147553983186272;0 +-2.142391656823039;1.144586923457881;0 +-2.151118303083011;1.134464013796314;0 +-2.124938364303096;1.134464013796314;0 +-2.121971304574706;1.140223600327895;0 +-2.106088808381557;1.146157719784676;0 +-2.103121748653167;1.140223600327895;0 +-2.111848394913139;1.131496954067924;0 +-2.082701396404834;1.140921732028693;0 +-2.094395102393195;1.148775713662668;0 +-2.066818900211685;1.146157719784676;0 +-2.060884780754904;1.153313569717853;0 +-2.053728930821728;1.159247689174634;0 +-2.078338073274848;1.157676892847839;0 +-2.103121748653167;1.159247689174634;0 +-2.09003177926321;1.163611012304619;0 +-2.075545546471657;1.167974335434605;0 +-2.094395102393195;1.170766862237796;0 +-2.11760798144472;1.165007275706215;0 +-2.140995393421444;1.162040215977824;0 +-2.161241212744578;1.158375024548637;0 +-2.183057828394507;1.153313569717853;0 +1.281420736814237;0.7955210730590153;0 +1.288576586747413;0.7897614865274341;0 +1.292939909877399;0.7840018999958529;0 +1.29590696960579;0.7970918693858103;0 +1.294510706204194;0.8028514559173915;0 +1.304633615865761;0.805818515645782;0 +1.311963998724138;0.8101818387757678;0 +1.32645023151569;0.8129743655789586;0 +1.340936464307243;0.8101818387757678;0 +1.349663110567215;0.8129743655789586;0 +1.361356816555577;0.8086110424489729;0 +1.374446785945534;0.8101818387757678;0 +1.383173432205506;0.8159414253073491;0 +1.374446785945534;0.8159414253073491;0 +1.367116403087158;0.8129743655789586;0 +1.358389756827187;0.8145451619057535;0 +1.349663110567215;0.8129743655789586;0 +1.340936464307243;0.8145451619057535;0 +1.327846494917286;0.8159414253073491;0 +1.313360262125733;0.8145451619057535;0 +1.304633615865761;0.8159414253073491;0 +1.294510706204194;0.8101818387757678;0 +1.285784059944223;0.805818515645782;0 +1.281420736814237;0.7955210730590153;0 +-1.855808593645571;1.382300767579509;0 +-1.844289420582408;1.385442360233099;0 +-1.819505745204089;1.385442360233099;0 +-1.797689129554159;1.382300767579509;0 +-1.770112927372649;1.382300767579509;0 +-1.74532925199433;1.376715713973127;0 +-1.74532925199433;1.36973439696515;0 +-1.737998869135953;1.36362574458317;0 +-1.72054557661601;1.362753079957173;0 +-1.713389726682833;1.36973439696515;0 +-1.710422666954443;1.377064779823526;0 +-1.672549022186166;1.370956127441546;0 +-1.665393172252989;1.36659280431156;0 +-1.672549022186166;1.361356816555577;0 +-1.69593643416289;1.360833217779979;0 +-1.724908899745996;1.359960553153982;0 +-1.74532925199433;1.356993493425591;0 +-1.759815484785882;1.364323876283967;0 +-1.783202896762607;1.364323876283967;0 +-1.818109481802493;1.36659280431156;0 +-1.832595714594046;1.370607061591147;0 +-1.818109481802493;1.37584304934713;0 +-1.848652743712394;1.37881010907552;0 +-1.855808593645571;1.382300767579509;0 +2.527760355663387;-0.7098254067860938;0 +2.539454061651749;-0.7126179335892847;0 +2.551147767640111;-0.7185520530460655;0 +2.561270677301679;-0.7185520530460655;0 +2.571393586963246;-0.715584993317675;0 +2.583087292951608;-0.7126179335892847;0 +2.588846879483189;-0.715584993317675;0 +2.588846879483189;-0.7243116395776468;0 +2.588846879483189;-0.7330382858376184;0 +2.586054352679998;-0.7360053455660087;0 +2.583087292951608;-0.7431611954991855;0 +2.581691029550012;-0.751887841759157;0 +2.574360646691636;-0.7475245186291712;0 +2.568601060160055;-0.7534586380859521;0 +2.562666940703274;-0.7606144880191288;0 +2.552544031041707;-0.7592182246175333;0 +2.543817384781735;-0.7548549014875475;0 +2.539454061651749;-0.7490953149559663;0 +2.536487001923359;-0.7417649320975901;0 +2.535090738521764;-0.7360053455660087;0 +2.530727415391778;-0.7286749627076327;0 +2.527760355663387;-0.7185520530460655;0 +2.527760355663387;-0.7098254067860938;0 +0.5105088062083414;-0.1047197551196598;0 +0.5148721293383272;-0.1134464013796314;0 +0.5206317158699084;-0.1221730476396031;0 +0.5293583621298801;-0.1295034304979792;0 +0.533721685259866;-0.1410226035611418;0 +0.5323254218582705;-0.1497492498211135;0 +0.5424483315198376;-0.1527163095495038;0 +0.5410520681182421;-0.1439896632895322;0 +0.5366887449882564;-0.1352630170295605;0 +0.5323254218582705;-0.1251401073679934;0 +0.533721685259866;-0.1192059879112127;0 +0.5265658353266892;-0.1134464013796314;0 +0.519235452468313;-0.1076868148480501;0 +0.5235987755982988;-0.1003564319896739;0 +0.5206317158699084;-0.09023352232810683;0 +0.5178391890667177;-0.07993607974134029;0 +0.5134758659367318;-0.06981317007977318;0 +0.5119050696099369;-0.05811946409141117;0 +0.507541746479951;-0.06981317007977318;0 +0.5105088062083414;-0.07853981633974483;0 +0.507541746479951;-0.08726646259971647;0 +0.5119050696099369;-0.09738937226128359;0 +0.5105088062083414;-0.1047197551196598;0 +-1.765749604242663;0.92642076695859;0 +-1.759815484785882;0.9176941206986184;0 +-1.752659634852706;0.9220574438286042;0 +-1.74532925199433;0.9176941206986184;0 +-1.749692575124315;0.9133307975686326;0 +-1.749692575124315;0.904604151308661;0 +-1.739569665462748;0.9002408281786752;0 +-1.727875959474386;0.8930849782454985;0 +-1.727875959474386;0.8871508587887176;0 +-1.722116372942805;0.8813912722571364;0 +-1.7235126363444;0.8756316857255551;0 +-1.710422666954443;0.8770279491271507;0 +-1.714785990084429;0.8843583319855268;0 +-1.72054557661601;0.8887216551155126;0 +-1.724908899745996;0.8944812416470939;0 +-1.722116372942805;0.90181162450547;0 +-1.730843019202776;0.9032078879070654;0 +-1.739569665462748;0.9002408281786752;0 +-1.742362192265939;0.9105382707654417;0 +-1.737998869135953;0.9149015938954275;0 +-1.737998869135953;0.9206611804270088;0 +-1.749692575124315;0.92642076695859;0 +-1.765749604242663;0.92642076695859;0 +2.587450616081593;-0.09599310885968812;0 +2.597573525743161;-0.09738937226128359;0 +2.607870968329927;-0.09738937226128359;0 +2.617993877991494;-0.09599310885968812;0 +2.62532426084987;-0.09599310885968812;0 +2.632480110783047;-0.09599310885968812;0 +2.639810493641424;-0.08587019919812101;0 +2.647140876499799;-0.08587019919812101;0 +2.644173816771409;-0.07278022980816354;0 +2.657263786161367;-0.07278022980816354;0 +2.660230845889757;-0.0815068760681352;0 +2.654296726432976;-0.08726646259971647;0 +2.652900463031381;-0.09738937226128359;0 +2.645570080173005;-0.09738937226128359;0 +2.638414230239828;-0.1047197551196598;0 +2.629687583979856;-0.1090830782496456;0 +2.620960937719884;-0.1090830782496456;0 +2.612234291459913;-0.1090830782496456;0 +2.603507645199941;-0.1076868148480501;0 +2.597573525743161;-0.1017526953912694;0 +2.588846879483189;-0.1003564319896739;0 +2.587450616081593;-0.09599310885968812;0 +0.6007423285364483;0.8014551925157961;0 +0.6065019150680295;0.7984881327874057;0 +0.6108652381980153;0.7927285462558246;0 +0.619591884457987;0.7897614865274341;0 +0.6297147941195541;0.7927285462558246;0 +0.6400122367063207;0.7927285462558246;0 +0.6515314097694832;0.7911577499290294;0 +0.6588617926278594;0.7998843961890013;0 +0.667588438887831;0.8072147790473774;0 +0.6618288523562498;0.8101818387757678;0 +0.657465529226264;0.8145451619057535;0 +0.6661921754862357;0.8145451619057535;0 +0.6763150851478027;0.8203047484373349;0 +0.6864379948093697;0.8217010118389303;0 +0.6806784082777885;0.8246680715673207;0 +0.6705554986162214;0.8232718081657252;0 +0.655894732899469;0.8217010118389303;0 +0.6428047635095115;0.8159414253073491;0 +0.6297147941195541;0.8145451619057535;0 +0.6181956210563916;0.8101818387757678;0 +0.6108652381980153;0.8042477193189871;0 +0.6007423285364483;0.8014551925157961;0 +0.5948082090796675;-0.2124065699677099;0 +0.5963790054064624;-0.2195624199008867;0 +0.5991715322096532;-0.2268928027592629;0 +0.5991715322096532;-0.234223185617639;0 +0.605105651666434;-0.2399827721492203;0 +0.6065019150680295;-0.2473131550075965;0 +0.6122615015996108;-0.2457423586808016;0 +0.6166248247295966;-0.2530727415391778;0 +0.6152285613280011;-0.2413790355508158;0 +0.6094689747964199;-0.234223185617639;0 +0.6078981784696249;-0.2239257430308725;0 +0.6078981784696249;-0.2138028333693054;0 +0.6108652381980153;-0.2036799237077382;0 +0.605105651666434;-0.1933824811209717;0 +0.6035348553396391;-0.1846558348610001;0 +0.6021385919380436;-0.1731366617978375;0 +0.5948082090796675;-0.1672025423410568;0 +0.5934119456780721;-0.1715658654710426;0 +0.5977752688080579;-0.1890191579909859;0 +0.5977752688080579;-0.1919862177193762;0 +0.6007423285364483;-0.2050761871093337;0 +0.5948082090796675;-0.2124065699677099;0 +2.260201381332656;0.5803219762881145;0 +2.268928027592628;0.5846852994181003;0 +2.276258410451004;0.5904448859496816;0 +2.284985056710976;0.5920156822764766;0 +2.287777583514167;0.5876523591464908;0 +2.296504229774139;0.5876523591464908;0 +2.298075026100934;0.5803219762881145;0 +2.302438349230919;0.5729915934297384;0 +2.298075026100934;0.5658357434965617;0 +2.293711702970948;0.55710909723659;0 +2.292140906644153;0.5483824509766184;0 +2.282017996982586;0.5424483315198376;0 +2.271895087321018;0.5454153912482279;0 +2.271895087321018;0.5527457741066042;0 +2.271895087321018;0.5599016240397809;0 +2.2776546738526;0.5642649471697667;0 +2.2776546738526;0.571595330028143;0 +2.273291350722614;0.5773549165597242;0 +2.271895087321018;0.571595330028143;0 +2.264564704462642;0.571595330028143;0 +2.260201381332656;0.5803219762881145;0 +-1.658062789394613;1.396263401595464;0 +-1.658062789394613;1.404117383229438;0 +-1.636246173744684;1.410226035611418;0 +-1.633279114016293;1.418080017245393;0 +-1.605702911834783;1.418080017245393;0 +-1.594009205846421;1.410226035611418;0 +-1.575159649924882;1.404990047855435;0 +-1.53588974175501;1.40359378445384;0 +-1.521403508963457;1.399230461323854;0 +-1.530130155223429;1.391900078465478;0 +-1.499586893313528;1.389805683363085;0 +-1.499586893313528;1.383173432205506;0 +-1.522799772365053;1.37881010907552;0 +-1.537286005156605;1.370607061591147;0 +-1.557706357404939;1.364323876283967;0 +-1.605702911834783;1.364323876283967;0 +-1.628915790886308;1.370607061591147;0 +-1.634849910343088;1.378461043225121;0 +-1.626123264083117;1.384569695607102;0 +-1.637642437146279;1.391376479689879;0 +-1.658062789394613;1.396263401595464;0 +-1.521403508963457;1.11125113474479;0 +-1.503950216443514;1.118406984677966;0 +-1.5083135395735;1.128704427264733;0 +-1.505346479845109;1.1388273369263;0 +-1.500983156715123;1.146157719784676;0 +-1.48352986419518;1.153313569717853;0 +-1.477770277663599;1.144586923457881;0 +-1.460316985143656;1.137431073524705;0 +-1.439896632895322;1.131496954067924;0 +-1.426806663505364;1.125737367536342;0 +-1.418080017245393;1.118406984677966;0 +-1.400626724725449;1.114043661547981;0 +-1.416683753843797;1.106887811614804;0 +-1.43116998663535;1.112647398146385;0 +-1.445656219426903;1.117010721276371;0 +-1.45874618881686;1.117010721276371;0 +-1.469043631403627;1.11125113474479;0 +-1.48056280446679;1.103920751886413;0 +-1.496619833585138;1.102524488484818;0 +-1.498016096986733;1.11125113474479;0 +-1.521403508963457;1.11125113474479;0 +-1.732239282604372;0.9307840900885759;0 +-1.726479696072791;0.9250245035569946;0 +-1.722116372942805;0.9162978572970231;0 +-1.713389726682833;0.9119345341670372;0 +-1.713389726682833;0.9061749476354559;0 +-1.700299757292876;0.9061749476354559;0 +-1.698728960966081;0.8974483013754843;0 +-1.690002314706109;0.9002408281786752;0 +-1.691573111032904;0.8930849782454985;0 +-1.6929693744345;0.8857545953871222;0 +-1.6929693744345;0.878424212528746;0 +-1.682846464772932;0.8813912722571364;0 +-1.678483141642947;0.8930849782454985;0 +-1.685638991576123;0.9002408281786752;0 +-1.6929693744345;0.9105382707654417;0 +-1.697332697564486;0.9192649170254134;0 +-1.703092284096067;0.9279915632853851;0 +-1.707455607226053;0.9367182095453567;0 +-1.717753049812819;0.938114472946952;0 +-1.727875959474386;0.938114472946952;0 +-1.732239282604372;0.9307840900885759;0 +0.5527457741066042;-0.03630284844148206;0 +0.5555383009097951;-0.04799655442984406;0 +0.5628686837681712;-0.04066617157146788;0 +0.571595330028143;-0.04363323129985824;0 +0.5832890360165049;-0.04363323129985824;0 +0.5904448859496816;-0.03787364476827695;0 +0.5803219762881145;-0.03630284844148206;0 +0.5860815628196958;-0.03054326190990077;0 +0.5920156822764766;-0.02321287905152459;0 +0.5948082090796675;-0.01308996938995747;0 +0.5977752688080579;-0.007330382858376183;0 +0.5934119456780721;0.001396263401595464;0 +0.5846852994181003;0.004363323129985824;0 +0.5759586531581288;0.004363323129985824;0 +0.5658357434965617;0.002967059728390361;0 +0.5555383009097951;-0.002967059728390361;0 +0.5527457741066042;-0.01308996938995747;0 +0.5555383009097951;-0.02042035224833365;0 +0.5541420375081997;-0.02757620218151041;0 +0.5527457741066042;-0.03630284844148206;0 +-2.239781029084323;0.8843583319855268;0 +-2.232625179151146;0.8871508587887176;0 +-2.219535209761189;0.8827875356587318;0 +-2.203478180642841;0.879995008855541;0 +-2.190388211252884;0.8770279491271507;0 +-2.181661564992912;0.868301302867179;0 +-2.171538655331345;0.8609709200088027;0 +-2.158448685941387;0.8538150700756261;0 +-2.149722039681416;0.8464846872172498;0 +-2.158448685941387;0.8435176274888594;0 +-2.168571595602955;0.8464846872172498;0 +-2.181661564992912;0.8508480103472356;0 +-2.181661564992912;0.8552113334772214;0 +-2.190388211252884;0.8552113334772214;0 +-2.19771859411126;0.8595746566072072;0 +-2.207841503772827;0.8625417163355976;0 +-2.206445240371231;0.8669050394655835;0 +-2.217964413434394;0.8712683625955693;0 +-2.229658119422756;0.8756316857255551;0 +-2.239781029084323;0.8843583319855268;0 +-2.186024888122898;1.258033324837513;0 +-2.175901978461331;1.265363707695889;0 +-2.164208272472969;1.273741288105462;0 +-2.159844949342983;1.282817000215832;0 +-2.171538655331345;1.292939909877399;0 +-2.140995393421444;1.29590696960579;0 +-2.114815454641529;1.300270292735775;0 +-2.084272192731628;1.29590696960579;0 +-2.052158134494933;1.29590696960579;0 +-2.034704841974989;1.288576586747413;0 +-2.008524903195074;1.282817000215832;0 +-2.033308578573394;1.277581012459849;0 +-2.056521457624918;1.272694090554265;0 +-2.081305133003238;1.266759971097484;0 +-2.088635515861614;1.255240798034322;0 +-2.104518012054762;1.24651415177435;0 +-2.124938364303096;1.244943355447555;0 +-2.148151243354621;1.240580032317569;0 +-2.161241212744578;1.250877474904336;0 +-2.186024888122898;1.258033324837513;0 +-1.796292866152564;1.272694090554265;0 +-1.780235837034216;1.275312084432257;0 +-1.754055898254301;1.274613952731459;0 +-1.770112927372649;1.282817000215832;0 +-1.767145867644258;1.288576586747413;0 +-1.74829631172272;1.291543646475804;0 +-1.724908899745996;1.290147383074208;0 +-1.706059343824457;1.293812574503396;0 +-1.694365637836095;1.285085928243425;0 +-1.711818930356038;1.277057413684251;0 +-1.687209787902918;1.273741288105462;0 +-1.679879405044542;1.263967444294293;0 +-1.682846464772932;1.253670001707527;0 +-1.707455607226053;1.250877474904336;0 +-1.727875959474386;1.244943355447555;0 +-1.743932988592734;1.253670001707527;0 +-1.761386281112677;1.261000384565903;0 +-1.780235837034216;1.261000384565903;0 +-1.785995423565797;1.267632635723481;0 +-1.796292866152564;1.272694090554265;0 +2.22232773656438;0.01884955592153876;0 +2.22529479629277;0.02617993877991494;0 +2.226691059694366;0.03351032163829112;0 +2.234021442552742;0.03787364476827695;0 +2.231054382824351;0.03054326190990077;0 +2.235417705954337;0.02321287905152459;0 +2.245715148541104;0.02757620218151041;0 +2.245715148541104;0.01884955592153876;0 +2.238384765682728;0.01448623279155293;0 +2.242748088812713;0.008726646259971648;0 +2.234021442552742;0.008726646259971648;0 +2.232625179151146;0;0 +2.234021442552742;-0.007330382858376183;0 +2.241351825411118;-0.01605702911834783;0 +2.232625179151146;-0.01012290966156711;0 +2.226691059694366;-0.002967059728390361;0 +2.22826185602116;0.004363323129985824;0 +2.226691059694366;0.01169370598836201;0 +2.22232773656438;0.01884955592153876;0 +1.391900078465478;0.1410226035611418;0 +1.393296341867073;0.148352986419518;0 +1.394867138193868;0.1570796326794897;0 +1.399230461323854;0.1644100155378658;0 +1.396263401595464;0.1715658654710426;0 +1.406386311257031;0.1658062789394613;0 +1.412320430713812;0.1570796326794897;0 +1.418080017245393;0.148352986419518;0 +1.422443340375378;0.1396263401595464;0 +1.42820292690696;0.1322959573011702;0 +1.42820292690696;0.1221730476396031;0 +1.425410400103769;0.1134464013796314;0 +1.418080017245393;0.1076868148480501;0 +1.407957107583826;0.1047197551196598;0 +1.400626724725449;0.1047197551196598;0 +1.396263401595464;0.112050137978036;0 +1.393296341867073;0.1235693110411985;0 +1.391900078465478;0.1308996938995747;0 +1.391900078465478;0.1410226035611418;0 +2.155481626212997;-0.1802925117310143;0 +2.158448685941387;-0.1687733386678517;0 +2.162812009071373;-0.1628392192110709;0 +2.16996785900455;-0.16004669240788;0 +2.178694505264521;-0.1570796326794897;0 +2.183057828394507;-0.1513200461479084;0 +2.193355270981274;-0.148352986419518;0 +2.203478180642841;-0.1469567230179225;0 +2.212204826902813;-0.1453859266911277;0 +2.220931473162784;-0.1453859266911277;0 +2.215171886631203;-0.1513200461479084;0 +2.206445240371231;-0.1556833692778942;0 +2.19771859411126;-0.1584758960810851;0 +2.188991947851288;-0.1614429558094755;0 +2.180265301591317;-0.1672025423410568;0 +2.17293491873294;-0.1759291886010284;0 +2.164208272472969;-0.1788962483294187;0 +2.155481626212997;-0.1802925117310143;0 +1.59121667904323;1.397659664997059;0 +1.617396617823145;1.404990047855435;0 +1.626123264083117;1.412320430713812;0 +1.66818569905618;1.418080017245393;0 +1.682846464772932;1.413716694115407;0 +1.701696020694471;1.409353370985421;0 +1.6929693744345;1.404990047855435;0 +1.703092284096067;1.399230461323854;0 +1.732239282604372;1.396263401595464;0 +1.74829631172272;1.390503815063882;0 +1.736602605734358;1.383173432205506;0 +1.742362192265939;1.37584304934713;0 +1.716182253486024;1.374446785945534;0 +1.688606051304514;1.377413845673925;0 +1.652303202863032;1.380206372477116;0 +1.637642437146279;1.387536755335492;0 +1.602735852106393;1.390503815063882;0 +1.59121667904323;1.397659664997059;0 +-1.457349925415265;0.7286749627076327;0 +-1.445656219426903;0.7243116395776468;0 +-1.435533309765336;0.7243116395776468;0 +-1.425410400103769;0.7257079029792421;0 +-1.415112957517002;0.730071226109228;0 +-1.404990047855435;0.7330382858376184;0 +-1.393296341867073;0.7374016089676042;0 +-1.383173432205506;0.7417649320975901;0 +-1.37584304934713;0.7475245186291712;0 +-1.387536755335492;0.7475245186291712;0 +-1.399230461323854;0.7475245186291712;0 +-1.404990047855435;0.7431611954991855;0 +-1.412320430713812;0.7447319918259805;0 +-1.422443340375378;0.7431611954991855;0 +-1.42820292690696;0.7374016089676042;0 +-1.439896632895322;0.7330382858376184;0 +-1.450019542556889;0.7330382858376184;0 +-1.457349925415265;0.7286749627076327;0 +2.16996785900455;0.2181661564992912;0 +2.177298241862926;0.2167698930976957;0 +2.186024888122898;0.2181661564992912;0 +2.190388211252884;0.210835773640915;0 +2.190388211252884;0.2036799237077382;0 +2.193355270981274;0.1933824811209717;0 +2.181661564992912;0.1933824811209717;0 +2.181661564992912;0.1862266311877949;0 +2.186024888122898;0.1788962483294187;0 +2.177298241862926;0.1774999849278233;0 +2.177298241862926;0.1876228945893904;0 +2.171538655331345;0.1890191579909859;0 +2.171538655331345;0.1993166005777524;0 +2.178694505264521;0.1977458042509575;0 +2.181661564992912;0.2050761871093337;0 +2.17293491873294;0.2094395102393195;0 +2.16996785900455;0.2181661564992912;0 +0.2151990967709008;0.6618288523562498;0 +0.222529479629277;0.6661921754862357;0 +0.2312561258892487;0.6661921754862357;0 +0.2385865087476248;0.6632251157578452;0 +0.2487094184091919;0.6632251157578452;0 +0.2617993877991494;0.6646213791594406;0 +0.2734930937875114;0.667588438887831;0 +0.2675589743307307;0.6602580560294549;0 +0.2647664475275398;0.6515314097694832;0 +0.2675589743307307;0.6457718232379019;0 +0.2647664475275398;0.6400122367063207;0 +0.2530727415391778;0.6414085001079162;0 +0.2473131550075965;0.6471680866394973;0 +0.2385865087476248;0.6487388829662923;0 +0.2268928027592629;0.6544984694978736;0 +0.2211332162276816;0.6544984694978736;0 +0.2151990967709008;0.6618288523562498;0 +0.6021385919380436;1.077740813106498;0 +0.6078981784696249;1.073377489976513;0 +0.619591884457987;1.070410430248122;0 +0.619591884457987;1.063254580314946;0 +0.6283185307179586;1.063254580314946;0 +0.6356489135763349;1.066047107118136;0 +0.6356489135763349;1.071981226574917;0 +0.6283185307179586;1.076344549704903;0 +0.6239552075879728;1.082104136236484;0 +0.6253514709895682;1.08943451909486;0 +0.6152285613280011;1.093797842224846;0 +0.6021385919380436;1.096590369028037;0 +0.6078981784696249;1.092227045898051;0 +0.6166248247295966;1.090830782496456;0 +0.6166248247295966;1.085071195964875;0 +0.605105651666434;1.085071195964875;0 +0.6021385919380436;1.077740813106498;0 +-2.167175332201359;1.330813554645676;0 +-2.142391656823039;1.335176877775662;0 +-2.123542100901501;1.34180912893324;0 +-2.103121748653167;1.346521517913625;0 +-2.082701396404834;1.349663110567215;0 +-2.053728930821728;1.349139511791617;0 +-2.03767190170338;1.354026433697201;0 +-2.015855286053451;1.349663110567215;0 +-2.034704841974989;1.345299787437229;0 +-2.027548992041813;1.33901660213005;0 +-2.050761871093337;1.331686219271673;0 +-2.075545546471657;1.335176877775662;0 +-2.085668456133224;1.329417291244081;0 +-2.104518012054762;1.3234831717873;0 +-2.127905424031487;1.325053968114095;0 +-2.148151243354621;1.324181303488098;0 +-2.167175332201359;1.330813554645676;0 +-1.832595714594046;1.336573141177257;0 +-1.815142422074103;1.337445805803255;0 +-1.797689129554159;1.332907949748069;0 +-1.780235837034216;1.32645023151569;0 +-1.778839573632621;1.333780614374067;0 +-1.767145867644258;1.338667536279651;0 +-1.736602605734358;1.338143937504052;0 +-1.710422666954443;1.333082482673269;0 +-1.710422666954443;1.32645023151569;0 +-1.707455607226053;1.319119848657314;0 +-1.716182253486024;1.310218669472143;0 +-1.755452161655897;1.310218669472143;0 +-1.771509190774244;1.319992513283311;0 +-1.797689129554159;1.316327321854123;0 +-1.815142422074103;1.3234831717873;0 +-1.819505745204089;1.329417291244081;0 +-1.832595714594046;1.336573141177257;0 +0.3679154063204046;0.6588617926278594;0 +0.3722787294503905;0.6646213791594406;0 +0.3810053757103621;0.667588438887831;0 +0.3897320219703337;0.6646213791594406;0 +0.3984586682303054;0.6602580560294549;0 +0.4043927876870862;0.6515314097694832;0 +0.3956661414271145;0.6531022060962781;0 +0.3984586682303054;0.6457718232379019;0 +0.4028219913602912;0.6356489135763349;0 +0.3956661414271145;0.6414085001079162;0 +0.3897320219703337;0.6356489135763349;0 +0.3853686988403479;0.6414085001079162;0 +0.3782128489071713;0.6414085001079162;0 +0.3752457891787808;0.6457718232379019;0 +0.3766420525803763;0.6531022060962781;0 +0.3679154063204046;0.6588617926278594;0 +0.1425933998879367;0.7141887299160796;0 +0.1469567230179225;0.7126179335892847;0 +0.1527163095495038;0.7141887299160796;0 +0.1614429558094755;0.7199483164476609;0 +0.1687733386678517;0.7126179335892847;0 +0.1701696020694471;0.7054620836561081;0 +0.1701696020694471;0.6981317007977318;0 +0.1687733386678517;0.6908013179393555;0 +0.1658062789394613;0.6836454680061789;0 +0.1584758960810851;0.6836454680061789;0 +0.1527163095495038;0.6777113485493982;0 +0.1453859266911277;0.6836454680061789;0 +0.1469567230179225;0.6923721142661505;0 +0.1469567230179225;0.7010987605261222;0 +0.1425933998879367;0.7082546104592988;0 +0.1425933998879367;0.7141887299160796;0 +2.394068134960622;1.313360262125733;0 +2.399827721492203;1.325053968114095;0 +2.426007660272118;1.329417291244081;0 +2.460914245312004;1.322086908385705;0 +2.478367537831948;1.329417291244081;0 +2.500184153481877;1.3234831717873;0 +2.513274122871834;1.3234831717873;0 +2.530727415391778;1.320690644984109;0 +2.530727415391778;1.316327321854123;0 +2.513274122871834;1.310393202397343;0 +2.492853770623501;1.306029879267357;0 +2.478367537831948;1.308996938995747;0 +2.452187599052033;1.306029879267357;0 +2.430370983402104;1.303237352464166;0 +2.40995063115377;1.304633615865761;0 +2.394068134960622;1.313360262125733;0 +2.308197935762501;0.5832890360165049;0 +2.315528318620877;0.5876523591464908;0 +2.318320845424068;0.5934119456780721;0 +2.32704749168404;0.5920156822764766;0 +2.331410814814026;0.5977752688080579;0 +2.340137461073998;0.5991715322096532;0 +2.348864107333969;0.5963790054064624;0 +2.350434903660763;0.5904448859496816;0 +2.344500784203983;0.5860815628196958;0 +2.340137461073998;0.5803219762881145;0 +2.334377874542416;0.5846852994181003;0 +2.325651228282444;0.58171823968971;0 +2.322684168554054;0.5773549165597242;0 +2.319891641750862;0.571595330028143;0 +2.311164995490891;0.5745623897565333;0 +2.308197935762501;0.5832890360165049;0 +2.097362162121586;0.4131194339470578;0 +2.103121748653167;0.4218460802070295;0 +2.107485071783153;0.4290019301402062;0 +2.113244658314734;0.4363323129985824;0 +2.121971304574706;0.4406956361285682;0 +2.127905424031487;0.4377285764001778;0 +2.127905424031487;0.4290019301402062;0 +2.123542100901501;0.4202752838802346;0 +2.12057504117311;0.4101523742186675;0 +2.11760798144472;0.4014257279586957;0 +2.111848394913139;0.3940953451003196;0 +2.108881335184748;0.3839724354387525;0 +2.106088808381557;0.3913028182971287;0 +2.100154688924777;0.3940953451003196;0 +2.097362162121586;0.4043927876870862;0 +2.097362162121586;0.4131194339470578;0 +-1.067617903444931;-0.904604151308661;0 +-1.055924197456569;-0.9075712110370514;0 +-1.050164610924988;-0.9032078879070654;0 +-1.055924197456569;-0.8974483013754843;0 +-1.041437964665016;-0.8958775050486893;0 +-1.029744258676654;-0.8988445647770796;0 +-1.018050552688292;-0.8958775050486893;0 +-1.007927643026725;-0.8988445647770796;0 +-1.007927643026725;-0.904604151308661;0 +-1.021017612416683;-0.9075712110370514;0 +-1.026777198948264;-0.9119345341670372;0 +-1.038470904936626;-0.9133307975686326;0 +-1.041437964665016;-0.9089674744386468;0 +-1.047197551196598;-0.9075712110370514;0 +-1.055924197456569;-0.9119345341670372;0 +-1.067617903444931;-0.904604151308661;0 +-1.391900078465478;0.7548549014875475;0 +-1.383173432205506;0.7534586380859521;0 +-1.371479726217144;0.756251164889143;0 +-1.361356816555577;0.756251164889143;0 +-1.35123390689401;0.7548549014875475;0 +-1.340936464307243;0.756251164889143;0 +-1.329417291244081;0.7592182246175333;0 +-1.330813554645676;0.767944870877505;0 +-1.327846494917286;0.7737044574090862;0 +-1.338143937504052;0.7709119306058954;0 +-1.343903524035634;0.7665486074759096;0 +-1.355597230023996;0.767944870877505;0 +-1.364323876283967;0.7665486074759096;0 +-1.37584304934713;0.7649778111491147;0 +-1.386140491933896;0.7621852843459237;0 +-1.391900078465478;0.7548549014875475;0 +-2.720619238008761;0.3537782393792506;0 +-2.716255914878775;0.3516838442768574;0 +-2.71171805882359;0.3499385150248631;0 +-2.707529268618803;0.3476695869972705;0 +-2.70560940644161;0.3434807967924841;0 +-2.701769682087222;0.3406882699892931;0 +-2.705260340591211;0.3373721444105038;0 +-2.710496328347194;0.3363249468593073;0 +-2.714336052701581;0.3338814859065152;0 +-2.716604980729174;0.3303908274025266;0 +-2.721317369709559;0.3330088212805181;0 +-2.720619238008761;0.3377212102609028;0 +-2.723586297737151;0.3450515931192789;0 +-2.720444705083561;0.3481931857728687;0 +-2.720619238008761;0.3537782393792506;0 +2.866703296400686;-0.3534291735288517;0 +2.875429942660658;-0.3577924966588375;0 +2.885552852322225;-0.3621558197888234;0 +2.891486971779005;-0.3694862026471996;0 +2.897246558310587;-0.3752457891787808;0 +2.905973204570559;-0.3782128489071713;0 +2.91173279110214;-0.3839724354387525;0 +2.917666910558921;-0.3897320219703337;0 +2.908940264298949;-0.3897320219703337;0 +2.900213618038977;-0.3839724354387525;0 +2.892883235180601;-0.3796091123087666;0 +2.88712364864902;-0.3752457891787808;0 +2.879793265790644;-0.370882466048795;0 +2.872462882932268;-0.3635520831904188;0 +2.866703296400686;-0.3534291735288517;0 +0.4101523742186675;0.6138322979264057;0 +0.4115486376202628;0.6209881478595823;0 +0.4218460802070295;0.619591884457987;0 +0.4232423436086249;0.6166248247295966;0 +0.4319689898685966;0.6181956210563916;0 +0.4392993727269727;0.6161012259539983;0 +0.4494222823885398;0.6166248247295966;0 +0.4494222823885398;0.6122615015996108;0 +0.4581489286485115;0.6152285613280011;0 +0.456752665246916;0.610341639422417;0 +0.445058959258554;0.6096435077216193;0 +0.433365253270192;0.609119908946021;0 +0.4276056667386107;0.6122615015996108;0 +0.4188790204786391;0.6138322979264057;0 +0.4101523742186675;0.6138322979264057;0 +0.9773843811168246;1.398357796697857;0 +1.000597260168349;1.404117383229438;0 +1.03410758180664;1.40359378445384;0 +1.041437964665016;1.409876969761019;0 +1.087863722768066;1.412320430713812;0 +1.096590369028037;1.416683753843797;0 +1.127133630937938;1.421047076973783;0 +1.1388273369263;1.413716694115407;0 +1.114043661547981;1.410749634387017;0 +1.087863722768066;1.412320430713812;0 +1.087863722768066;1.404466449079837;0 +1.073377489976513;1.402022988127045;0 +1.03410758180664;1.40359378445384;0 +1.007927643026725;1.398357796697857;0 +0.9773843811168246;1.398357796697857;0 +1.896649298142238;0.3373721444105038;0 +1.903805148075415;0.3417354675404897;0 +1.912531794335386;0.3476695869972705;0 +1.919862177193763;0.3490658503988659;0 +1.928588823453734;0.3490658503988659;0 +1.937315469713706;0.3490658503988659;0 +1.937315469713706;0.3433062638672846;0 +1.931555883182125;0.3373721444105038;0 +1.928588823453734;0.3286454981505322;0 +1.922829236922153;0.322885911618951;0 +1.914102590662181;0.3185225884889651;0 +1.906772207803805;0.3185225884889651;0 +1.898045561543833;0.322885911618951;0 +1.896649298142238;0.3302162944773271;0 +1.896649298142238;0.3373721444105038;0 +0.5235987755982988;1.066047107118136;0 +0.533721685259866;1.060287520586555;0 +0.5396558047166468;1.052957137728179;0 +0.5424483315198376;1.045801287795002;0 +0.5497787143782138;1.045801287795002;0 +0.5541420375081997;1.050164610924988;0 +0.5672320068981571;1.050164610924988;0 +0.5729915934297384;1.055924197456569;0 +0.5729915934297384;1.061683783988151;0 +0.5672320068981571;1.067617903444931;0 +0.5555383009097951;1.070410430248122;0 +0.5483824509766184;1.074773753378108;0 +0.5366887449882564;1.074773753378108;0 +0.5265658353266892;1.070410430248122;0 +0.5235987755982988;1.066047107118136;0 +0.2282890661608583;0.2457423586808016;0 +0.2326523892908441;0.2399827721492203;0 +0.2356194490192345;0.2326523892908441;0 +0.2413790355508158;0.2282890661608583;0 +0.2429498318776107;0.222529479629277;0 +0.2473131550075965;0.2181661564992912;0 +0.2544690049407732;0.222529479629277;0 +0.2631956512007449;0.2254965393576674;0 +0.2661627109291352;0.234223185617639;0 +0.2574360646691636;0.234223185617639;0 +0.2473131550075965;0.2356194490192345;0 +0.2473131550075965;0.2413790355508158;0 +0.2429498318776107;0.2473131550075965;0 +0.234223185617639;0.2487094184091919;0 +0.2282890661608583;0.2457423586808016;0 +2.046398547963351;0.1469567230179225;0 +2.050761871093337;0.1556833692778942;0 +2.058092253951713;0.1614429558094755;0 +2.066818900211685;0.1687733386678517;0 +2.072578486743266;0.1745329251994329;0 +2.079908869601642;0.1832595714594046;0 +2.085668456133224;0.1963495408493621;0 +2.088635515861614;0.1832595714594046;0 +2.079908869601642;0.1759291886010284;0 +2.073974750144862;0.1731366617978375;0 +2.069611427014876;0.1644100155378658;0 +2.062455577081699;0.1584758960810851;0 +2.058092253951713;0.1527163095495038;0 +2.046398547963351;0.1469567230179225;0 +2.232625179151146;-0.05532693728822025;0 +2.238384765682728;-0.04939281783143952;0 +2.25007847167109;-0.04939281783143952;0 +2.260201381332656;-0.04799655442984406;0 +2.267531764191033;-0.05235987755982988;0 +2.276258410451004;-0.05235987755982988;0 +2.282017996982586;-0.05969026041820607;0 +2.282017996982586;-0.06684611035138281;0 +2.273291350722614;-0.062482787221397;0 +2.258805117931061;-0.05969026041820607;0 +2.25007847167109;-0.05811946409141117;0 +2.242748088812713;-0.05969026041820607;0 +2.232625179151146;-0.05532693728822025;0 +0.5628686837681712;0.6108652381980153;0 +0.571595330028143;0.6122615015996108;0 +0.5759586531581288;0.6152285613280011;0 +0.5832890360165049;0.6166248247295966;0 +0.5920156822764766;0.6181956210563916;0 +0.6021385919380436;0.6209881478595823;0 +0.5920156822764766;0.6138322979264057;0 +0.5948082090796675;0.6094689747964199;0 +0.5876523591464908;0.6094689747964199;0 +0.5846852994181003;0.6056292504420324;0 +0.5759586531581288;0.6035348553396391;0 +0.5658357434965617;0.605105651666434;0 +0.5628686837681712;0.6108652381980153;0 +0.7766715171374767;1.405862712481432;0 +0.8203047484373349;1.411971364863413;0 +0.8377580409572781;1.409353370985421;0 +0.8377580409572781;1.405862712481432;0 +0.878424212528746;1.409876969761019;0 +0.8930849782454985;1.407957107583826;0 +0.8726646259971648;1.403244718603441;0 +0.8726646259971648;1.398357796697857;0 +0.8450884238156544;1.397136066221461;0 +0.8203047484373349;1.399230461323854;0 +0.8203047484373349;1.40359378445384;0 +0.7970918693858103;1.40359378445384;0 +0.7766715171374767;1.405862712481432;0 +1.201310124147697;-0.8522442737488312;0 +1.204277183876087;-0.8494517469456402;0 +1.210036770407669;-0.8552113334772214;0 +1.215970889864449;-0.8595746566072072;0 +1.221730476396031;-0.8581783932056118;0 +1.231853386057598;-0.8566075968788169;0 +1.229060859254407;-0.8625417163355976;0 +1.221730476396031;-0.8625417163355976;0 +1.21876341666764;-0.8669050394655835;0 +1.213003830136059;-0.8639379797371932;0 +1.202880920474492;-0.8669050394655835;0 +1.207244243604478;-0.8595746566072072;0 +1.201310124147697;-0.8522442737488312;0 +-2.322684168554054;0.9454448558053283;0 +-2.309594199164096;0.9438740594785334;0 +-2.298075026100934;0.9438740594785334;0 +-2.303834612632515;0.9351474132185617;0 +-2.298075026100934;0.92642076695859;0 +-2.300867552904125;0.9206611804270088;0 +-2.292140906644153;0.9162978572970231;0 +-2.286381320112572;0.9075712110370514;0 +-2.300867552904125;0.9149015938954275;0 +-2.308197935762501;0.9220574438286042;0 +-2.312561258892487;0.9307840900885759;0 +-2.321287905152458;0.9351474132185617;0 +-2.322684168554054;0.9454448558053283;0 +-1.367116403087158;0.3171263250873697;0 +-1.365720139685563;0.3199188518905606;0 +-1.358389756827187;0.322885911618951;0 +-1.349663110567215;0.3214896482173555;0 +-1.340936464307243;0.3199188518905606;0 +-1.333780614374067;0.3171263250873697;0 +-1.330813554645676;0.3111922056305889;0 +-1.336573141177257;0.3111922056305889;0 +-1.342507260634038;0.3127630019573839;0 +-1.34826684716562;0.3097959422289935;0 +-1.355597230023996;0.3111922056305889;0 +-1.361356816555577;0.3171263250873697;0 +-1.367116403087158;0.3171263250873697;0 +-1.941678792843691;1.023984672145073;0 +-1.925621763725344;1.022413875818278;0 +-1.919862177193763;1.028347995275059;0 +-1.906772207803805;1.03114052207825;0 +-1.889318915283862;1.03114052207825;0 +-1.874832682492309;1.03410758180664;0 +-1.884955592153876;1.037074641535031;0 +-1.895078501815443;1.037074641535031;0 +-1.905375944402209;1.041437964665016;0 +-1.914102590662181;1.041437964665016;0 +-1.922829236922153;1.03410758180664;0 +-1.931555883182125;1.029744258676654;0 +-1.941678792843691;1.023984672145073;0 +2.632480110783047;-0.0450294947014537;0 +2.642777553369814;-0.05061454830783556;0 +2.652900463031381;-0.05672320068981571;0 +2.658660049562962;-0.06108652381980154;0 +2.670353755551324;-0.06841690667817771;0 +2.673320815279714;-0.07557275661135446;0 +2.668957492149728;-0.08429940287132612;0 +2.664594169019743;-0.07278022980816354;0 +2.658660049562962;-0.06108652381980154;0 +2.652900463031381;-0.05969026041820607;0 +2.642777553369814;-0.05235987755982988;0 +2.632480110783047;-0.0450294947014537;0 +-2.702293280862821;0.9992009967667536;0 +-2.686410784669671;1.007927643026725;0 +-2.67471707868131;1.013687229558307;0 +-2.661627109291353;1.019621349015087;0 +-2.654296726432976;1.015258025885101;0 +-2.670353755551324;1.010894702755116;0 +-2.661627109291353;1.009323906428321;0 +-2.657263786161367;1.003564319896739;0 +-2.67175001895292;1.000597260168349;0 +-2.6776841384097;0.9948376736367678;0 +-2.689203311472863;0.9904743505067819;0 +-2.702293280862821;0.9992009967667536;0 +1.836959037724032;-0.03351032163829112;0 +1.841322360854018;-0.02757620218151041;0 +1.850049007113989;-0.02617993877991494;0 +1.854412330243975;-0.03490658503988659;0 +1.857379389972365;-0.04223696789826277;0 +1.863138976503947;-0.04363323129985824;0 +1.861742713102351;-0.05235987755982988;0 +1.848652743712394;-0.0466002910282486;0 +1.850049007113989;-0.03926990816987241;0 +1.845685683984003;-0.03490658503988659;0 +1.836959037724032;-0.03351032163829112;0 +1.733635546005968;1.359960553153982;0 +1.742362192265939;1.367116403087158;0 +1.755452161655897;1.37584304934713;0 +1.767145867644258;1.383173432205506;0 +1.785995423565797;1.386140491933896;0 +1.813746158672507;1.381777168803911;0 +1.832595714594046;1.37584304934713;0 +1.832595714594046;1.367116403087158;0 +1.80065618928255;1.364323876283967;0 +1.762782544514273;1.364323876283967;0 +1.733635546005968;1.359960553153982;0 +-1.404990047855435;1.287180323345818;0 +-1.383173432205506;1.288576586747413;0 +-1.358389756827187;1.287703922121416;0 +-1.339540200905648;1.284213263617428;0 +-1.333780614374067;1.277057413684251;0 +-1.336573141177257;1.271821425928268;0 +-1.364323876283967;1.273741288105462;0 +-1.381777168803911;1.27112329422747;0 +-1.404990047855435;1.273741288105462;0 +-1.410749634387017;1.281420736814237;0 +-1.404990047855435;1.287180323345818;0 +-1.121374044406357;0.8145451619057535;0 +-1.117010721276371;0.8189084850357394;0 +-1.115614457874776;0.8129743655789586;0 +-1.105317015288009;0.8101818387757678;0 +-1.095194105626442;0.8101818387757678;0 +-1.082104136236484;0.8115781021773631;0 +-1.090830782496456;0.8072147790473774;0 +-1.090830782496456;0.8014551925157961;0 +-1.105317015288009;0.805818515645782;0 +-1.115614457874776;0.8101818387757678;0 +-1.121374044406357;0.8145451619057535;0 +-1.124341104134747;0.8696975662687744;0 +-1.112647398146385;0.8696975662687744;0 +-1.100953692158023;0.868301302867179;0 +-1.090830782496456;0.8653342431387886;0 +-1.082104136236484;0.8625417163355976;0 +-1.076344549704903;0.8566075968788169;0 +-1.08646745936647;0.8566075968788169;0 +-1.098161165354832;0.8581783932056118;0 +-1.108284075016399;0.8609709200088027;0 +-1.112647398146385;0.8653342431387886;0 +-1.124341104134747;0.8696975662687744;0 +-1.799085392955755;0.9831439676484057;0 +-1.783202896762607;0.9875072907783917;0 +-1.783202896762607;0.9948376736367678;0 +-1.783202896762607;1.002168056495144;0 +-1.77290545417584;1.00653137962513;0 +-1.781632100435812;1.015258025885101;0 +-1.788962483294188;1.007927643026725;0 +-1.794722069825769;1.002168056495144;0 +-1.788962483294188;0.9948376736367678;0 +-1.793325806424174;0.9890780871051865;0 +-1.799085392955755;0.9831439676484057;0 +2.076941809873252;-0.1644100155378658;0 +2.085668456133224;-0.1628392192110709;0 +2.094395102393195;-0.1628392192110709;0 +2.103121748653167;-0.1672025423410568;0 +2.110452131511543;-0.1745329251994329;0 +2.101725485251571;-0.1788962483294187;0 +2.094395102393195;-0.1731366617978375;0 +2.088635515861614;-0.1701696020694471;0 +2.079908869601642;-0.1701696020694471;0 +2.076941809873252;-0.1644100155378658;0 +0.1513200461479084;0.7417649320975901;0 +0.16004669240788;0.7447319918259805;0 +0.1644100155378658;0.7504915783575616;0 +0.1644100155378658;0.7417649320975901;0 +0.1658062789394613;0.7360053455660087;0 +0.1628392192110709;0.730071226109228;0 +0.16004669240788;0.7213445798492564;0 +0.1513200461479084;0.7286749627076327;0 +0.1497492498211135;0.7344345492392138;0 +0.1513200461479084;0.7417649320975901;0 +0.9468411192069237;1.410226035611418;0 +0.9569640288684909;1.414240292891005;0 +0.9861110273767961;1.414240292891005;0 +0.9861110273767961;1.421047076973783;0 +1.021017612416683;1.426806663505364;0 +1.026777198948264;1.419476280646988;0 +1.00653137962513;1.413716694115407;0 +1.021017612416683;1.410226035611418;0 +0.9831439676484057;1.407258975883028;0 +0.9468411192069237;1.410226035611418;0 +-1.365720139685563;0.4392993727269727;0 +-1.361356816555577;0.4392993727269727;0 +-1.356993493425591;0.4305727264670011;0 +-1.356993493425591;0.4246386070102203;0 +-1.352630170295605;0.4188790204786391;0 +-1.355597230023996;0.4131194339470578;0 +-1.359960553153982;0.4218460802070295;0 +-1.368687199413953;0.4290019301402062;0 +-1.364323876283967;0.433365253270192;0 +-1.365720139685563;0.4392993727269727;0 +-1.291543646475804;-0.730071226109228;0 +-1.281420736814237;-0.7330382858376184;0 +-1.279849940487442;-0.7387978723691996;0 +-1.285784059944223;-0.7447319918259805;0 +-1.282817000215832;-0.7504915783575616;0 +-1.287180323345818;-0.7578219612159379;0 +-1.297303233007385;-0.756251164889143;0 +-1.294510706204194;-0.7447319918259805;0 +-1.294510706204194;-0.7387978723691996;0 +-1.291543646475804;-0.730071226109228;0 +-2.8623399732707;-1.374446785945534;0 +-2.821673801699232;-1.374446785945534;0 +-2.804220509179289;-1.380206372477116;0 +-2.792526803190927;-1.387536755335492;0 +-2.792526803190927;-1.394867138193868;0 +-2.821673801699232;-1.400626724725449;0 +-2.856580386739119;-1.393296341867073;0 +-2.856580386739119;-1.384569695607102;0 +-2.844886680750757;-1.380206372477116;0 +-2.8623399732707;-1.374446785945534;0 +-3.018023342548594;-0.234223185617639;0 +-3.005456971934235;-0.2356194490192345;0 +-3.004235241457839;-0.2399827721492203;0 +-2.996206726898666;-0.2413790355508158;0 +-2.990272607441885;-0.2443460952792061;0 +-3.000570050028651;-0.2443460952792061;0 +-3.004235241457839;-0.2399827721492203;0 +-3.013660019418609;-0.2399827721492203;0 +-3.018023342548594;-0.234223185617639;0 +3.094992362561545;-0.3141592653589793;0 +3.096563158888339;-0.3068288825006031;0 +3.10232274541992;-0.3024655593706173;0 +3.111049391679892;-0.3024655593706173;0 +3.118379774538268;-0.3068288825006031;0 +3.118379774538268;-0.3141592653589793;0 +3.109653128278297;-0.3171263250873697;0 +3.10232274541992;-0.3171263250873697;0 +3.094992362561545;-0.3141592653589793;0 +2.101725485251571;0.234223185617639;0 +2.108881335184748;0.234223185617639;0 +2.116211718043124;0.2326523892908441;0 +2.121971304574706;0.2268928027592629;0 +2.121971304574706;0.2181661564992912;0 +2.114815454641529;0.2124065699677099;0 +2.110452131511543;0.2181661564992912;0 +2.107485071783153;0.2268928027592629;0 +2.101725485251571;0.234223185617639;0 +-0.2487094184091919;0.4900884539600077;0 +-0.2487094184091919;0.4944517770899935;0 +-0.2413790355508158;0.5031784233499651;0 +-0.2385865087476248;0.507541746479951;0 +-0.234223185617639;0.5091125428067459;0 +-0.2356194490192345;0.5047492196767601;0 +-0.2413790355508158;0.5031784233499651;0 +-0.2413790355508158;0.4930555136883981;0 +-0.2487094184091919;0.4900884539600077;0 +0.1933824811209717;0.9721483933608416;0 +0.2050761871093337;0.9756390518648301;0 +0.2167698930976957;0.9791297103688189;0 +0.2195624199008867;0.9721483933608416;0 +0.2124065699677099;0.9681341360812545;0 +0.2167698930976957;0.9648180105024653;0 +0.2064724505109292;0.962200016624474;0 +0.1963495408493621;0.9634217471008699;0 +0.1933824811209717;0.9721483933608416;0 +-1.396263401595464;0.9817477042468103;0 +-1.381777168803911;0.9875072907783917;0 +-1.377413845673925;0.9831439676484057;0 +-1.381777168803911;0.9730210579868387;0 +-1.381777168803911;0.980351440845215;0 +-1.387536755335492;0.9759881177152292;0 +-1.397659664997059;0.9759881177152292;0 +-1.386140491933896;0.9831439676484057;0 +-1.396263401595464;0.9817477042468103;0 +-1.291543646475804;0.7082546104592988;0 +-1.290147383074208;0.7126179335892847;0 +-1.279849940487442;0.7141887299160796;0 +-1.27112329422747;0.715584993317675;0 +-1.262396647967498;0.7185520530460655;0 +-1.256637061435917;0.715584993317675;0 +-1.268330767424279;0.7112216701876892;0 +-1.279849940487442;0.7098254067860938;0 +-1.291543646475804;0.7082546104592988;0 +-1.172337658564591;0.3141592653589793;0 +-1.172337658564591;0.322885911618951;0 +-1.162040215977824;0.322885911618951;0 +-1.151917306316258;0.322885911618951;0 +-1.146157719784676;0.3185225884889651;0 +-1.150521042914662;0.3141592653589793;0 +-1.157676892847839;0.3141592653589793;0 +-1.165007275706215;0.3127630019573839;0 +-1.172337658564591;0.3141592653589793;0 +-1.064650843716541;-1.093797842224846;0 +-1.052957137728179;-1.090830782496456;0 +-1.035503845208236;-1.087863722768066;0 +-1.026777198948264;-1.082104136236484;0 +-1.00653137962513;-1.082104136236484;0 +-1.023984672145073;-1.08646745936647;0 +-1.035503845208236;-1.087863722768066;0 +-1.052957137728179;-1.095194105626442;0 +-1.064650843716541;-1.093797842224846;0 +-1.329417291244081;-1.231853386057598;0 +-1.320690644984109;-1.226093799526016;0 +-1.322086908385705;-1.221730476396031;0 +-1.300270292735775;-1.217367153266045;0 +-1.285784059944223;-1.220334212994435;0 +-1.287180323345818;-1.226093799526016;0 +-1.291543646475804;-1.230457122656002;0 +-1.308996938995747;-1.231853386057598;0 +-1.329417291244081;-1.231853386057598;0 +-2.734581872024715;0.365646478292812;0 +-2.730916680595528;0.3647738136668149;0 +-2.727600555016738;0.3659955441432109;0 +-2.722364567260755;0.3618067539384245;0 +-2.726204291615142;0.3598868917612307;0 +-2.73021854889473;0.3590142271352336;0 +-2.730916680595528;0.3626794185644217;0 +-2.734581872024715;0.365646478292812;0 +3.116808978211473;-0.2893755899806598;0 +3.12710642079824;-0.2865830631774689;0 +3.138625593861403;-0.2822197400474831;0 +3.135833067058211;-0.2879793265790644;0 +3.140196390188198;-0.2909463863074548;0 +3.129898947601431;-0.2909463863074548;0 +3.119776037939864;-0.2953097094374406;0 +3.116808978211473;-0.2893755899806598;0 +2.783800156930956;-0.1614429558094755;0 +2.796890126320913;-0.1628392192110709;0 +2.807013035982481;-0.1687733386678517;0 +2.801253449450899;-0.1731366617978375;0 +2.793923066592523;-0.1715658654710426;0 +2.786767216659346;-0.1715658654710426;0 +2.78240389352936;-0.1658062789394613;0 +2.783800156930956;-0.1614429558094755;0 +2.699500754059629;-0.09459684545809266;0 +2.706656603992807;-0.09599310885968812;0 +2.715383250252778;-0.1076868148480501;0 +2.722713633111154;-0.1148426647812269;0 +2.713986986851182;-0.1192059879112127;0 +2.708227400319601;-0.1134464013796314;0 +2.702293280862821;-0.1047197551196598;0 +2.699500754059629;-0.09459684545809266;0 +2.270324290994224;-0.2064724505109292;0 +2.27468761412421;-0.1977458042509575;0 +2.282017996982586;-0.2007128639793479;0 +2.292140906644153;-0.1977458042509575;0 +2.295107966372544;-0.2021091273809433;0 +2.286381320112572;-0.2094395102393195;0 +2.28062173358099;-0.2064724505109292;0 +2.270324290994224;-0.2064724505109292;0 +2.556907354171693;1.319119848657314;0 +2.571393586963246;1.316327321854123;0 +2.604903908601536;1.314756525527328;0 +2.635447170511438;1.311963998724138;0 +2.626720524251466;1.304633615865761;0 +2.604903908601536;1.304633615865761;0 +2.56999732356165;1.310393202397343;0 +2.556907354171693;1.319119848657314;0 +2.564237737030069;0.7752752537358811;0 +2.57296438329004;0.7853981633974483;0 +2.581691029550012;0.7911577499290294;0 +2.588846879483189;0.7897614865274341;0 +2.597573525743161;0.7941248096574199;0 +2.586054352679998;0.7867944267990437;0 +2.574360646691636;0.7810348402674625;0 +2.564237737030069;0.7752752537358811;0 +-2.922030233688906;1.050164610924988;0 +-2.910336527700544;1.051560874326584;0 +-2.898642821712183;1.052957137728179;0 +-2.888519912050616;1.051560874326584;0 +-2.888519912050616;1.047197551196598;0 +-2.900213618038977;1.044230491468207;0 +-2.91173279110214;1.045801287795002;0 +-2.922030233688906;1.050164610924988;0 +-2.997602990300261;1.11125113474479;0 +-2.975786374650331;1.11125113474479;0 +-2.96409266866197;1.106887811614804;0 +-2.946639376142027;1.105317015288009;0 +-2.96409266866197;1.100953692158023;0 +-2.980149697780318;1.106887811614804;0 +-2.997602990300261;1.105317015288009;0 +-2.997602990300261;1.11125113474479;0 +-1.982344964415159;1.356993493425591;0 +-1.959132085363635;1.359087888527984;0 +-1.938711733115301;1.361705882405976;0 +-1.919862177193763;1.361880415331175;0 +-1.922829236922153;1.354026433697201;0 +-1.950405439103663;1.349663110567215;0 +-1.976585377883578;1.35123390689401;0 +-1.982344964415159;1.356993493425591;0 +-1.98531202414355;1.365720139685563;0 +-1.972222054753592;1.370083462815548;0 +-1.93295214658372;1.371479726217144;0 +-1.901012621272224;1.367989067713155;0 +-1.912531794335386;1.364847475059566;0 +-1.937315469713706;1.364323876283967;0 +-1.954768762233649;1.36659280431156;0 +-1.98531202414355;1.365720139685563;0 +-1.34826684716562;1.181064304824563;0 +-1.335176877775662;1.19118721448613;0 +-1.314756525527328;1.19118721448613;0 +-1.306029879267357;1.185427627954549;0 +-1.308996938995747;1.178097245096172;0 +-1.320690644984109;1.173733921966187;0 +-1.340936464307243;1.172337658564591;0 +-1.34826684716562;1.181064304824563;0 +-1.37881010907552;0.4660029102824859;0 +-1.373574121319537;0.4625122517784973;0 +-1.365371073835164;0.4654793115068877;0 +-1.360135086079181;0.4654793115068877;0 +-1.357866158051588;0.461988653002899;0 +-1.361356816555577;0.4642575810304917;0 +-1.374446785945534;0.460766922526503;0 +-1.37881010907552;0.4660029102824859;0 +-1.449845009631689;0.3799581781591655;0 +-1.446354351127701;0.3836233695883536;0 +-1.442514626773313;0.3808308427851627;0 +-1.439896632895322;0.3757693879543791;0 +-1.445656219426903;0.3740240587023848;0 +-1.449495943781291;0.3747221904031825;0 +-1.447750614529296;0.3769911184307752;0 +-1.449845009631689;0.3799581781591655;0 +-1.079137076508094;0.1745329251994329;0 +-1.073377489976513;0.1774999849278233;0 +-1.073377489976513;0.1846558348610001;0 +-1.076344549704903;0.1862266311877949;0 +-1.064650843716541;0.1876228945893904;0 +-1.064650843716541;0.1788962483294187;0 +-1.069014166846527;0.1745329251994329;0 +-1.079137076508094;0.1745329251994329;0 +-0.6632251157578452;-0.9424777960769379;0 +-0.6457718232379019;-0.9438740594785334;0 +-0.6326818538479444;-0.9482373826085192;0 +-0.6253514709895682;-0.9526007057385051;0 +-0.6283185307179586;-0.9585348251952858;0 +-0.6384414403795257;-0.9512044423369095;0 +-0.6501351463678877;-0.9468411192069237;0 +-0.6632251157578452;-0.9424777960769379;0 +-1.595580002173216;0.001396263401595464;0 +-1.589645882716435;-0.005759586531581288;0 +-1.585282559586449;-0.01308996938995747;0 +-1.59121667904323;-0.01884955592153876;0 +-1.596976265574811;-0.01605702911834783;0 +-1.59121667904323;-0.01169370598836201;0 +-1.596976265574811;-0.007330382858376183;0 +-1.595580002173216;0.001396263401595464;0 +-1.122770307807952;-1.128704427264733;0 +-1.108284075016399;-1.121374044406357;0 +-1.099557428756428;-1.127133630937938;0 +-1.090830782496456;-1.117010721276371;0 +-1.082104136236484;-1.122770307807952;0 +-1.099557428756428;-1.127133630937938;0 +-1.108284075016399;-1.131496954067924;0 +-1.122770307807952;-1.128704427264733;0 +2.910336527700544;-0.2574360646691636;0 +2.914699850830531;-0.2661627109291352;0 +2.917666910558921;-0.2617993877991494;0 +2.920459437362112;-0.2705260340591211;0 +2.91173279110214;-0.2734930937875114;0 +2.91173279110214;-0.2661627109291352;0 +2.910336527700544;-0.2574360646691636;0 +2.199114857512855;-0.05672320068981571;0 +2.207841503772827;-0.05375614096142535;0 +2.216568150032799;-0.05532693728822025;0 +2.219535209761189;-0.062482787221397;0 +2.213601090304408;-0.06684611035138281;0 +2.204874444044437;-0.06405358354819189;0 +2.199114857512855;-0.05672320068981571;0 +2.340137461073998;-0.1207767842380076;0 +2.340137461073998;-0.1104793416512411;0 +2.343104520802387;-0.1017526953912694;0 +2.347467843932373;-0.09459684545809266;0 +2.350434903660763;-0.1033234917180643;0 +2.347467843932373;-0.1134464013796314;0 +2.340137461073998;-0.1207767842380076;0 +2.383770692373855;-0.6269222673163631;0 +2.388134015503841;-0.6239552075879728;0 +2.398431458090607;-0.6225589441863774;0 +2.40995063115377;-0.6269222673163631;0 +2.401223984893799;-0.631285590446349;0 +2.388134015503841;-0.631285590446349;0 +2.383770692373855;-0.6269222673163631;0 +0.3155555287605747;1.003564319896739;0 +0.3214896482173555;1.008451241802323;0 +0.334579617607313;1.011069235680315;0 +0.3272492347489368;1.007054978400728;0 +0.3272492347489368;0.9997245955423519;0 +0.3185225884889651;0.9962339370383633;0 +0.3155555287605747;1.003564319896739;0 +2.453583862453629;1.282817000215832;0 +2.460914245312004;1.288576586747413;0 +2.482730860961934;1.290147383074208;0 +2.504547476611863;1.282817000215832;0 +2.504547476611863;1.277057413684251;0 +2.471037154973572;1.278453677085846;0 +2.453583862453629;1.282817000215832;0 +2.708227400319601;0.8773770149775495;0 +2.716954046579573;0.879995008855541;0 +2.72410989651275;0.8857545953871222;0 +2.72410989651275;0.8813912722571364;0 +2.719746573382764;0.8761552845011534;0 +2.708227400319601;0.8726646259971648;0 +2.708227400319601;0.8773770149775495;0 +0.9307840900885759;0.2167698930976957;0 +0.9367182095453567;0.2211332162276816;0 +0.9454448558053283;0.2195624199008867;0 +0.9526007057385051;0.2181661564992912;0 +0.9438740594785334;0.2138028333693054;0 +0.9367182095453567;0.2138028333693054;0 +0.9307840900885759;0.2167698930976957;0 +-2.926393556818892;0.9307840900885759;0 +-2.917666910558921;0.9367182095453567;0 +-2.917666910558921;0.9424777960769379;0 +-2.904576941168963;0.9424777960769379;0 +-2.904576941168963;0.9372418083209549;0 +-2.914699850830531;0.9337511498169663;0 +-2.926393556818892;0.9307840900885759;0 +-1.6929693744345;1.355597230023996;0 +-1.658062789394613;1.358389756827187;0 +-1.614429558094755;1.357866158051588;0 +-1.611462498366364;1.353851900772001;0 +-1.626123264083117;1.350012176417614;0 +-1.661029849123004;1.352106571520007;0 +-1.6929693744345;1.355597230023996;0 +-1.685638991576123;1.308996938995747;0 +-1.669756495382975;1.318596249881716;0 +-1.649336143134641;1.318596249881716;0 +-1.636246173744684;1.312487597499736;0 +-1.636246173744684;1.303237352464166;0 +-1.663822375926194;1.305855346342157;0 +-1.685638991576123;1.308996938995747;0 +-1.460316985143656;1.085071195964875;0 +-1.454382865686875;1.092227045898051;0 +-1.441292896296917;1.095194105626442;0 +-1.429773723233755;1.095194105626442;0 +-1.429773723233755;1.093797842224846;0 +-1.445656219426903;1.08646745936647;0 +-1.460316985143656;1.085071195964875;0 +-1.079137076508094;0.2836160034490786;0 +-1.074773753378108;0.2822197400474831;0 +-1.073377489976513;0.2865830631774689;0 +-1.070410430248122;0.2822197400474831;0 +-1.074773753378108;0.2822197400474831;0 +-1.077740813106498;0.2778564169174972;0 +-1.079137076508094;0.2836160034490786;0 +-2.789385210537338;0.3844960342143508;0 +-2.785196420332551;0.38781215979314;0 +-2.780309498426967;0.38781215979314;0 +-2.781705761828562;0.3822271061867581;0 +-2.785894552033349;0.3822271061867581;0 +-2.789385210537338;0.3844960342143508;0 +1.997005730131912;-0.1425933998879367;0 +2.011491962923465;-0.1396263401595464;0 +2.018822345781841;-0.1439896632895322;0 +2.010095699521869;-0.1513200461479084;0 +2.004161580065089;-0.1453859266911277;0 +1.997005730131912;-0.1425933998879367;0 +-0.2757620218151041;0.4886921905584123;0 +-0.2734930937875114;0.4916592502868026;0 +-0.2682571060315284;0.4900884539600077;0 +-0.2675589743307307;0.4857251308300219;0 +-0.2734930937875114;0.4843288674284265;0 +-0.2757620218151041;0.4886921905584123;0 +-0.2937389131106456;0.4944517770899935;0 +-0.2879793265790644;0.4953244417159907;0 +-0.2822197400474831;0.4988151002199793;0 +-0.285012266850674;0.4916592502868026;0 +-0.2893755899806598;0.4886921905584123;0 +-0.2937389131106456;0.4944517770899935;0 +0.03926990816987241;0.6908013179393555;0 +0.05096361415823442;0.6967354373961363;0 +0.05969026041820607;0.6923721142661505;0 +0.05375614096142535;0.6853907972581733;0 +0.04764748857944519;0.6894050545377601;0 +0.03926990816987241;0.6908013179393555;0 +0.3810053757103621;1.018050552688292;0 +0.3897320219703337;1.023112007519076;0 +0.4043927876870862;1.021017612416683;0 +0.3956661414271145;1.017526953912694;0 +0.3869394951671429;1.014036295408705;0 +0.3810053757103621;1.018050552688292;0 +0.1919862177193762;0.9569640288684909;0 +0.2021091273809433;0.9585348251952858;0 +0.210835773640915;0.9569640288684909;0 +0.2064724505109292;0.9541715020653;0 +0.1977458042509575;0.9526007057385051;0 +0.1919862177193762;0.9569640288684909;0 +0.1701696020694471;0.9681341360812545;0 +0.179419847105017;0.9700539982584483;0 +0.1876228945893904;0.9663888068292602;0 +0.1867502299633932;0.9608037532228784;0 +0.1759291886010284;0.9608037532228784;0 +0.1701696020694471;0.9681341360812545;0 +-0.1265363707695889;1.004960583298335;0 +-0.1221730476396031;1.009323906428321;0 +-0.1221730476396031;1.015258025885101;0 +-0.1076868148480501;1.021017612416683;0 +-0.112050137978036;1.012290966156711;0 +-0.1265363707695889;1.004960583298335;0 +0.8508480103472356;1.199913860746102;0 +0.8464846872172498;1.208640507006073;0 +0.8581783932056118;1.214400093537654;0 +0.878424212528746;1.208640507006073;0 +0.8726646259971648;1.202880920474492;0 +0.8508480103472356;1.199913860746102;0 +1.7235126363444;-0.0174532925199433;0 +1.727875959474386;-0.01605702911834783;0 +1.735206342332762;-0.0291469985083053;0 +1.729272222875982;-0.03054326190990077;0 +1.724908899745996;-0.02617993877991494;0 +1.7235126363444;-0.0174532925199433;0 +1.697332697564486;0.02321287905152459;0 +1.701696020694471;0.02617993877991494;0 +1.710422666954443;0.0174532925199433;0 +1.710422666954443;0.01012290966156711;0 +1.703092284096067;0.0174532925199433;0 +1.697332697564486;0.02321287905152459;0 +0.9628981483252715;-0.3665191429188092;0 +0.9700539982584483;-0.3651228795172138;0 +0.9744173213884341;-0.3694862026471996;0 +0.9730210579868387;-0.3722787294503905;0 +0.9656906751284625;-0.3722787294503905;0 +0.9628981483252715;-0.3665191429188092;0 +-2.952573495598807;0.9206611804270088;0 +-2.940879789610445;0.9337511498169663;0 +-2.932153143350474;0.9351474132185617;0 +-2.932153143350474;0.9307840900885759;0 +-2.937912729882055;0.9279915632853851;0 +-2.952573495598807;0.9206611804270088;0 +-2.085668456133224;1.319119848657314;0 +-2.075545546471657;1.324704902263696;0 +-2.055125194223323;1.328719159543283;0 +-2.060884780754904;1.322086908385705;0 +-2.068215163613281;1.31737451940532;0 +-2.085668456133224;1.319119848657314;0 +-1.844289420582408;1.355597230023996;0 +-1.82823239146406;1.356993493425591;0 +-1.82526533173567;1.351408439819209;0 +-1.815142422074103;1.345299787437229;0 +-1.838355301125627;1.347045116689224;0 +-1.844289420582408;1.355597230023996;0 +-1.43116998663535;0.9250245035569946;0 +-1.421047076973783;0.9279915632853851;0 +-1.413716694115407;0.92642076695859;0 +-1.409353370985421;0.9192649170254134;0 +-1.421047076973783;0.9220574438286042;0 +-1.43116998663535;0.9250245035569946;0 +-1.397659664997059;1.087863722768066;0 +-1.383173432205506;1.087863722768066;0 +-1.384569695607102;1.080707872834889;0 +-1.391900078465478;1.073377489976513;0 +-1.399230461323854;1.077740813106498;0 +-1.397659664997059;1.087863722768066;0 +-1.285784059944223;0.3651228795172138;0 +-1.282817000215832;0.3694862026471996;0 +-1.277057413684251;0.3679154063204046;0 +-1.274090353955861;0.3722787294503905;0 +-1.277057413684251;0.3651228795172138;0 +-1.285784059944223;0.3651228795172138;0 +-1.450019542556889;0.7998843961890013;0 +-1.436929573166932;0.7998843961890013;0 +-1.426806663505364;0.8014551925157961;0 +-1.429773723233755;0.7941248096574199;0 +-1.438500369493726;0.7970918693858103;0 +-1.450019542556889;0.7998843961890013;0 +2.903006144842168;-1.354026433697201;0 +2.908940264298949;-1.345299787437229;0 +2.935120203078864;-1.349663110567215;0 +2.961300141858779;-1.35123390689401;0 +2.935120203078864;-1.355597230023996;0 +2.903006144842168;-1.354026433697201;0 +-2.762507140056625;0.3766420525803763;0 +-2.757271152300642;0.3790855135331683;0 +-2.751860631619459;0.3717551306747922;0 +-2.759714613253434;0.3717551306747922;0 +-2.762507140056625;0.3766420525803763;0 +-2.610663495133118;-0.3049090203234093;0 +-2.606300172003133;-0.305956217874606;0 +-2.603507645199941;-0.3111922056305889;0 +-2.609267231731522;-0.3094468763785946;0 +-2.610663495133118;-0.3049090203234093;0 +-3.086265716301573;-0.7639306135979181;0 +-3.07474654323841;-0.7644542123735162;0 +-3.081902393171587;-0.7709119306058954;0 +-3.080506129769991;-0.7661995416255106;0 +-3.086265716301573;-0.7639306135979181;0 +2.814343418840856;-0.1774999849278233;0 +2.827433388230814;-0.1802925117310143;0 +2.833192974762395;-0.1876228945893904;0 +2.823070065100828;-0.1862266311877949;0 +2.814343418840856;-0.1774999849278233;0 +2.361954076723926;-0.01169370598836201;0 +2.372251519310693;-0.01169370598836201;0 +2.378011105842274;-0.01884955592153876;0 +2.370680722983898;-0.02042035224833365;0 +2.361954076723926;-0.01169370598836201;0 +2.27468761412421;-0.002967059728390361;0 +2.282017996982586;0;0 +2.290744643242558;-0.004363323129985824;0 +2.282017996982586;-0.007330382858376183;0 +2.27468761412421;-0.002967059728390361;0 +1.972222054753592;-0.1221730476396031;0 +1.980948701013564;-0.1221730476396031;0 +1.989675347273536;-0.1221730476396031;0 +1.980948701013564;-0.127409035395586;0 +1.972222054753592;-0.1221730476396031;0 +1.879196005622294;-0.05375614096142535;0 +1.88059226902389;-0.04363323129985824;0 +1.890715178685457;-0.0466002910282486;0 +1.886351855555471;-0.05532693728822025;0 +1.879196005622294;-0.05375614096142535;0 +2.289348379840962;-0.1382300767579509;0 +2.290744643242558;-0.1295034304979792;0 +2.296504229774139;-0.1235693110411985;0 +2.296504229774139;-0.1322959573011702;0 +2.289348379840962;-0.1382300767579509;0 +2.196147797784465;-0.1382300767579509;0 +2.199114857512855;-0.1322959573011702;0 +2.210808563501217;-0.1308996938995747;0 +2.206445240371231;-0.1382300767579509;0 +2.196147797784465;-0.1382300767579509;0 +0.148352986419518;0.05811946409141117;0 +0.1513200461479084;0.06544984694978735;0 +0.1556833692778942;0.062482787221397;0 +0.1527163095495038;0.05672320068981571;0 +0.148352986419518;0.05811946409141117;0 +0.482932604026831;0.631285590446349;0 +0.4930555136883981;0.6361725123519332;0 +0.4900884539600077;0.6297147941195541;0 +0.4843288674284265;0.6262241356155654;0 +0.482932604026831;0.631285590446349;0 +0.3897320219703337;1.027649863574261;0 +0.3926990816987241;1.03114052207825;0 +0.4014257279586957;1.026777198948264;0 +0.3913028182971287;1.02485733677107;0 +0.3897320219703337;1.027649863574261;0 +-0.1295034304979792;1.08350039963808;0 +-0.1265363707695889;1.087340123992467;0 +-0.1104793416512411;1.088561854468863;0 +-0.1207767842380076;1.082104136236484;0 +-0.1295034304979792;1.08350039963808;0 +2.446428012520451;1.29590696960579;0 +2.460914245312004;1.29590696960579;0 +2.460914245312004;1.291543646475804;0 +2.449220539323643;1.290147383074208;0 +2.446428012520451;1.29590696960579;0 +-3.141592653589793;1.248434013951544;0 +-3.111049391679892;1.248434013951544;0 +-3.096563158888339;1.242150828644364;0 +-3.12710642079824;1.23743843966398;0 +-3.141592653589793;1.239183768915974;0 +-3.141592653589793;1.248434013951544;0 +2.850646267282339;1.021017612416683;0 +2.856580386739119;1.029744258676654;0 +2.866703296400686;1.032711318405045;0 +2.869670356129077;1.028347995275059;0 +2.850646267282339;1.021017612416683;0 +2.395464398362217;0.9569640288684909;0 +2.399827721492203;0.9628981483252715;0 +2.40995063115377;0.9599310885968813;0 +2.401223984893799;0.9526007057385051;0 +2.395464398362217;0.9569640288684909;0 +2.609267231731522;0.7970918693858103;0 +2.617993877991494;0.8042477193189871;0 +2.626720524251466;0.8072147790473774;0 +2.615026818263104;0.7984881327874057;0 +2.609267231731522;0.7970918693858103;0 +1.000597260168349;-0.3577924966588375;0 +1.003564319896739;-0.3490658503988659;0 +1.007927643026725;-0.3520329101272563;0 +1.007927643026725;-0.3577924966588375;0 +1.000597260168349;-0.3577924966588375;0 +3.010692959690219;0.9236282401553992;0 +3.0164525462218;0.9250245035569946;0 +3.025179192481772;0.9220574438286042;0 +3.018023342548594;0.9206611804270088;0 +3.010692959690219;0.9236282401553992;0 +-2.015855286053451;1.359960553153982;0 +-1.994038670403522;1.362753079957173;0 +-1.991071610675131;1.356993493425591;0 +-2.004161580065089;1.356120828799594;0 +-2.015855286053451;1.359960553153982;0 +-1.353851900772001;0.4689699700108764;0 +-1.345648853287628;0.461988653002899;0 +-1.349139511791617;0.4532620067429274;0 +-1.34826684716562;0.461988653002899;0 +-1.353851900772001;0.4689699700108764;0 +-0.9861110273767961;-1.103920751886413;0 +-0.9744173213884341;-1.099557428756428;0 +-0.9599310885968813;-1.106887811614804;0 +-0.9773843811168246;-1.108284075016399;0 +-0.9861110273767961;-1.103920751886413;0 +-2.620960937719884;-1.336573141177257;0 +-2.586054352679998;-1.329417291244081;0 +-2.568601060160055;-1.333780614374067;0 +-2.591813939211579;-1.339540200905648;0 +-2.620960937719884;-1.336573141177257;0 +-2.796541060470514;0.3810053757103621;0 +-2.794272132442921;0.3836233695883536;0 +-2.794272132442921;0.3822271061867581;0 +-2.796541060470514;0.3810053757103621;0 +2.920459437362112;-0.2778564169174972;0 +2.930756879948878;-0.2865830631774689;0 +2.923426497090502;-0.2879793265790644;0 +2.920459437362112;-0.2778564169174972;0 +2.818706741970842;-0.1687733386678517;0 +2.811376359112466;-0.16004669240788;0 +2.807013035982481;-0.1541125729510993;0 +2.804220509179289;-0.1453859266911277;0 +2.818706741970842;-0.1687733386678517;0 +2.786767216659346;-0.1453859266911277;0 +2.780833097202565;-0.1410226035611418;0 +2.772106450942594;-0.1352630170295605;0 +2.766346864411013;-0.1308996938995747;0 +2.786767216659346;-0.1453859266911277;0 +2.22232773656438;-0.0291469985083053;0 +2.226691059694366;-0.02321287905152459;0 +2.236988502281132;-0.0291469985083053;0 +2.22232773656438;-0.0291469985083053;0 +2.16996785900455;-0.1469567230179225;0 +2.17293491873294;-0.1410226035611418;0 +2.184628624721302;-0.1439896632895322;0 +2.16996785900455;-0.1469567230179225;0 +2.924822760492098;-0.8260643349689161;0 +2.932153143350474;-0.8145451619057535;0 +2.936516466480459;-0.8203047484373349;0 +2.924822760492098;-0.8260643349689161;0 +0.9279915632853851;1.400626724725449;0 +0.9424777960769379;1.404990047855435;0 +0.9599310885968813;1.401150323501048;0 +0.9279915632853851;1.400626724725449;0 +3.141592653589793;1.239183768915974;0 +3.12117230134146;1.236216709187584;0 +3.118379774538268;1.241278164018367;0 +3.141592653589793;1.248434013951544;0 +3.141592653589793;1.239183768915974;0 +2.229658119422756;0.4551818689201211;0 +2.231054382824351;0.4611159883769019;0 +2.236988502281132;0.4639085151800928;0 +2.238384765682728;0.4682718383100786;0 +2.229658119422756;0.4551818689201211;0 +-0.3286454981505322;1.315978256003725;0 +-0.3127630019573839;1.309869603621744;0 +-0.3286454981505322;1.308996938995747;0 +-0.3286454981505322;1.315978256003725;0 +-3.087836512628367;0.90181162450547;0 +-3.084869452899977;0.9061749476354559;0 +-3.077539070041602;0.9032078879070654;0 +-3.087836512628367;0.90181162450547;0 +-1.82823239146406;1.31109133409814;0 +-1.819505745204089;1.31719998648012;0 +-1.807812039215726;1.31126586702334;0 +-1.82823239146406;1.31109133409814;0 +-1.736602605734358;1.394518072343469;0 +-1.724908899745996;1.399230461323854;0 +-1.704663080422862;1.391900078465478;0 +-1.736602605734358;1.394518072343469;0 +-1.067617903444931;0.2588323280707591;0 +-1.062905514464547;0.2556907354171693;0 +-1.061683783988151;0.2527236756887789;0 +-1.067617903444931;0.2588323280707591;0 +-1.20654611190368;0.2155481626212997;0 +-1.202531854624093;0.2129301687433082;0 +-1.200786525372099;0.2106612407157156;0 +-1.20654611190368;0.2155481626212997;0 +-0.8086110424489729;-1.058193125484162;0 +-0.8028514559173915;-1.052957137728179;0 +-0.7853981633974483;-1.059414855960558;0 +-0.8086110424489729;-1.058193125484162;0 +2.745926512162679;-0.1265363707695889;0 +2.738770662229502;-0.1221730476396031;0 +2.728473219642735;-0.1148426647812269;0 +2.745926512162679;-0.1265363707695889;0 +0.4537856055185257;0.6845181326321761;0 +0.4581489286485115;0.6859143960337715;0 +0.4581489286485115;0.6815510729037856;0 +0.4537856055185257;0.6845181326321761;0 +-0.02705260340591211;1.051211808476185;0 +-0.02181661564992912;1.054527934054974;0 +-0.02181661564992912;1.047197551196598;0 +-0.02705260340591211;1.051211808476185;0 +2.539454061651749;0.7649778111491147;0 +2.545213648183331;0.7693411342791004;0 +2.551147767640111;0.7737044574090862;0 +2.539454061651749;0.7649778111491147;0 +1.617396617823145;0.2064724505109292;0 +1.620189144626336;0.2195624199008867;0 +1.621759940953131;0.2326523892908441;0 +1.617396617823145;0.2064724505109292;0 +-3.051359131261686;0.9089674744386468;0 +-3.042632485001715;0.9105382707654417;0 +-3.039839958198523;0.9149015938954275;0 +-3.051359131261686;0.9089674744386468;0 +-3.111049391679892;0.9061749476354559;0 +-3.103719008821517;0.9037314866826639;0 +-3.108082331951502;0.9002408281786752;0 +-3.111049391679892;0.9061749476354559;0 +-1.32645023151569;0.6122615015996108;0 +-1.319119848657314;0.6152285613280011;0 +-1.316327321854123;0.6209881478595823;0 +-1.32645023151569;0.6122615015996108;0 +-1.264840108920291;0.3782128489071713;0 +-1.258382390687911;0.3822271061867581;0 +-1.247386816400347;0.3782128489071713;0 +-1.264840108920291;0.3782128489071713;0 +-1.297303233007385;0.3984586682303054;0 +-1.288576586747413;0.3939208121751201;0 +-1.295034304979793;0.3874630939427411;0 +-1.297303233007385;0.3984586682303054;0 +-1.339191135055249;0.445058959258554;0 +-1.328719159543283;0.438601241026175;0 +-1.328719159543283;0.4305727264670011;0 +-1.339191135055249;0.445058959258554;0 +-2.744006649985485;0.3687880709464018;0 +-2.736676267127109;0.3687880709464018;0 +-2.744006649985485;0.3687880709464018;0 +2.754653158422651;-0.148352986419518;0 +2.744530248761083;-0.1396263401595464;0 +2.754653158422651;-0.148352986419518;0 +2.568601060160055;-0.03630284844148206;0 +2.559874413900083;-0.03630284844148206;0 +2.568601060160055;-0.03630284844148206;0 +2.186024888122898;-0.03054326190990077;0 +2.17293491873294;-0.03054326190990077;0 +2.186024888122898;-0.03054326190990077;0 +-0.4508185457901353;0.6597344572538565;0 +-0.4392993727269727;0.6597344572538565;0 +-0.4508185457901353;0.6597344572538565;0 +-0.5003858965467743;0.6731734924942129;0 +-0.4916592502868026;0.6702064327658225;0 +-0.5003858965467743;0.6731734924942129;0 +0.4537856055185257;0.667588438887831;0 +0.4537856055185257;0.6719517620178169;0 +0.4537856055185257;0.667588438887831;0 +-0.05672320068981571;1.032711318405045;0 +-0.04799655442984406;1.028522528200258;0 +-0.05672320068981571;1.032711318405045;0 +2.648537139901395;0.8173376887089445;0 +2.655867522759771;0.8232718081657252;0 +2.648537139901395;0.8173376887089445;0 +2.257234321604266;0.4916592502868026;0 +2.263168441061047;0.4960225734167885;0 +2.257234321604266;0.4916592502868026;0 +1.674119818512961;0.04799655442984406;0 +1.684242728174528;0.04223696789826277;0 +1.674119818512961;0.04799655442984406;0 +-0.1570796326794897;1.236216709187584;0 +-0.1396263401595464;1.242150828644364;0 +-0.1570796326794897;1.236216709187584;0 +2.894279498582197;0.9642944117268671;0 +2.908940264298949;0.9541715020653;0 +2.894279498582197;0.9642944117268671;0 +-1.42802839398176;0.4284783313646079;0 +-1.41895268187139;0.4305727264670011;0 +-1.42802839398176;0.4284783313646079;0 +-1.276359281983453;0.3913028182971287;0 +-1.269377964975476;0.3897320219703337;0 +-1.276359281983453;0.3913028182971287;0 +-1.31423292675173;0.4131194339470578;0 +-1.306029879267357;0.3991567999311032;0 +-1.31423292675173;0.4131194339470578;0 +-1.320690644984109;0.4305727264670011;0 +-1.31423292675173;0.4218460802070295;0 +-1.320690644984109;0.4305727264670011;0 +EDGE2=8314 +0;1;0 +1;2;0 +2;3;0 +3;4;0 +4;5;0 +5;6;0 +6;7;0 +7;8;0 +8;9;0 +9;10;0 +10;11;0 +11;12;0 +12;13;0 +13;14;0 +14;15;0 +15;16;0 +16;17;0 +17;18;0 +18;19;0 +19;20;0 +20;21;0 +21;22;0 +22;23;0 +23;24;0 +24;25;0 +25;26;0 +26;27;0 +27;28;0 +28;29;0 +29;30;0 +30;31;0 +31;32;0 +32;33;0 +33;34;0 +34;35;0 +35;36;0 +36;37;0 +37;38;0 +38;39;0 +39;40;0 +40;41;0 +41;42;0 +42;43;0 +43;44;0 +44;45;0 +45;46;0 +46;47;0 +47;48;0 +48;49;0 +49;50;0 +50;51;0 +51;52;0 +52;53;0 +53;54;0 +54;55;0 +55;56;0 +56;57;0 +57;58;0 +58;59;0 +59;60;0 +60;61;0 +61;62;0 +62;63;0 +63;64;0 +64;65;0 +65;66;0 +66;67;0 +67;68;0 +68;69;0 +69;70;0 +70;71;0 +71;72;0 +72;73;0 +73;74;0 +74;75;0 +75;76;0 +76;77;0 +77;78;0 +78;79;0 +79;80;0 +80;81;0 +81;82;0 +82;83;0 +83;84;0 +84;85;0 +85;86;0 +86;87;0 +87;88;0 +88;89;0 +89;90;0 +90;91;0 +91;92;0 +92;93;0 +93;94;0 +94;95;0 +95;96;0 +96;97;0 +97;98;0 +98;99;0 +99;100;0 +100;101;0 +101;102;0 +102;103;0 +103;104;0 +104;105;0 +105;106;0 +106;107;0 +107;108;0 +108;109;0 +109;110;0 +110;111;0 +111;112;0 +112;113;0 +113;114;0 +114;115;0 +115;116;0 +116;117;0 +117;118;0 +118;119;0 +119;120;0 +120;121;0 +121;122;0 +122;123;0 +123;124;0 +124;125;0 +125;126;0 +126;127;0 +127;128;0 +128;129;0 +129;130;0 +130;131;0 +131;132;0 +132;133;0 +133;134;0 +134;135;0 +135;136;0 +136;137;0 +137;138;0 +138;139;0 +139;140;0 +140;141;0 +141;142;0 +142;143;0 +143;144;0 +144;145;0 +145;146;0 +146;147;0 +147;148;0 +148;149;0 +149;150;0 +150;151;0 +151;152;0 +152;153;0 +153;154;0 +154;155;0 +155;156;0 +156;157;0 +157;158;0 +158;159;0 +159;160;0 +160;161;0 +161;162;0 +162;163;0 +163;164;0 +164;165;0 +165;166;0 +166;167;0 +167;168;0 +168;169;0 +169;170;0 +170;171;0 +171;172;0 +172;173;0 +173;174;0 +174;175;0 +175;176;0 +176;177;0 +177;178;0 +178;179;0 +179;180;0 +180;181;0 +181;182;0 +182;183;0 +183;184;0 +184;185;0 +185;186;0 +186;187;0 +187;188;0 +188;189;0 +189;190;0 +190;191;0 +191;192;0 +192;193;0 +193;194;0 +194;195;0 +195;196;0 +196;197;0 +197;198;0 +198;199;0 +199;200;0 +200;201;0 +201;202;0 +202;203;0 +203;204;0 +204;205;0 +205;206;0 +206;207;0 +207;208;0 +208;209;0 +209;210;0 +210;211;0 +211;212;0 +212;213;0 +213;214;0 +214;215;0 +215;216;0 +216;217;0 +217;218;0 +218;219;0 +219;220;0 +220;221;0 +221;222;0 +222;223;0 +223;224;0 +224;225;0 +225;226;0 +226;227;0 +227;228;0 +228;229;0 +229;230;0 +230;231;0 +231;232;0 +232;233;0 +233;234;0 +234;235;0 +235;236;0 +236;237;0 +237;238;0 +238;239;0 +239;240;0 +240;241;0 +241;242;0 +242;243;0 +243;244;0 +244;245;0 +245;246;0 +246;247;0 +247;248;0 +248;249;0 +249;250;0 +250;251;0 +251;252;0 +252;253;0 +253;254;0 +254;255;0 +255;256;0 +256;257;0 +257;258;0 +258;259;0 +259;260;0 +260;261;0 +261;262;0 +262;263;0 +263;264;0 +264;265;0 +265;266;0 +266;267;0 +267;268;0 +268;269;0 +269;270;0 +270;271;0 +271;272;0 +272;273;0 +273;274;0 +274;275;0 +275;276;0 +276;277;0 +277;278;0 +278;279;0 +279;280;0 +280;281;0 +281;282;0 +282;283;0 +283;284;0 +284;285;0 +285;286;0 +286;287;0 +287;288;0 +288;289;0 +289;290;0 +290;291;0 +291;292;0 +292;293;0 +293;294;0 +294;295;0 +295;296;0 +296;297;0 +297;298;0 +298;299;0 +299;300;0 +300;301;0 +301;302;0 +302;303;0 +303;304;0 +304;305;0 +305;306;0 +306;307;0 +307;308;0 +308;309;0 +309;310;0 +310;311;0 +311;312;0 +312;313;0 +313;314;0 +314;315;0 +315;316;0 +316;317;0 +317;318;0 +318;319;0 +319;320;0 +320;321;0 +321;322;0 +322;323;0 +323;324;0 +324;325;0 +325;326;0 +326;327;0 +327;328;0 +328;329;0 +329;330;0 +330;331;0 +331;332;0 +332;333;0 +333;334;0 +334;335;0 +335;336;0 +336;337;0 +337;338;0 +338;339;0 +339;340;0 +340;341;0 +341;342;0 +342;343;0 +343;344;0 +344;345;0 +345;346;0 +346;347;0 +347;348;0 +348;349;0 +349;350;0 +350;351;0 +351;352;0 +352;353;0 +353;354;0 +354;355;0 +355;356;0 +356;357;0 +357;358;0 +358;359;0 +359;360;0 +360;361;0 +361;362;0 +362;363;0 +363;364;0 +364;365;0 +365;366;0 +366;367;0 +367;368;0 +368;369;0 +369;370;0 +370;371;0 +371;372;0 +372;373;0 +373;374;0 +374;375;0 +375;376;0 +376;377;0 +377;378;0 +378;379;0 +379;380;0 +380;381;0 +381;382;0 +382;383;0 +383;384;0 +384;385;0 +385;386;0 +386;387;0 +387;388;0 +388;389;0 +389;390;0 +390;391;0 +391;392;0 +392;393;0 +393;394;0 +394;395;0 +395;396;0 +396;397;0 +397;398;0 +398;399;0 +399;400;0 +400;401;0 +401;402;0 +402;403;0 +403;404;0 +404;405;0 +405;406;0 +406;407;0 +407;408;0 +408;409;0 +409;410;0 +410;411;0 +411;412;0 +412;413;0 +413;414;0 +414;415;0 +415;416;0 +416;417;0 +417;418;0 +418;419;0 +419;420;0 +420;421;0 +421;422;0 +422;423;0 +423;424;0 +424;425;0 +425;426;0 +426;427;0 +427;428;0 +428;429;0 +429;430;0 +430;431;0 +431;432;0 +432;433;0 +433;434;0 +434;435;0 +435;436;0 +436;437;0 +437;438;0 +438;439;0 +439;440;0 +440;441;0 +441;442;0 +442;443;0 +443;444;0 +444;445;0 +445;446;0 +446;447;0 +447;448;0 +448;449;0 +449;450;0 +450;451;0 +451;452;0 +452;453;0 +453;454;0 +454;455;0 +455;456;0 +456;457;0 +457;458;0 +458;459;0 +459;460;0 +460;461;0 +461;462;0 +462;463;0 +463;464;0 +464;465;0 +465;466;0 +466;467;0 +467;468;0 +468;469;0 +469;470;0 +470;471;0 +471;472;0 +472;473;0 +473;474;0 +474;475;0 +475;476;0 +476;477;0 +477;478;0 +478;479;0 +479;480;0 +480;481;0 +481;482;0 +482;483;0 +483;484;0 +484;485;0 +485;486;0 +486;487;0 +487;488;0 +488;489;0 +489;490;0 +490;491;0 +491;492;0 +492;493;0 +493;494;0 +494;495;0 +495;496;0 +496;497;0 +497;498;0 +498;499;0 +499;500;0 +500;501;0 +501;502;0 +502;503;0 +503;504;0 +504;505;0 +505;506;0 +506;507;0 +507;508;0 +508;509;0 +509;510;0 +510;511;0 +511;512;0 +512;513;0 +513;514;0 +514;515;0 +515;516;0 +516;517;0 +517;518;0 +518;519;0 +519;520;0 +520;521;0 +521;522;0 +522;523;0 +523;524;0 +524;525;0 +525;526;0 +526;527;0 +527;528;0 +528;529;0 +529;530;0 +530;531;0 +531;532;0 +532;533;0 +533;534;0 +534;535;0 +535;536;0 +536;537;0 +537;538;0 +538;539;0 +539;540;0 +540;541;0 +541;542;0 +542;543;0 +543;544;0 +544;545;0 +545;546;0 +546;547;0 +547;548;0 +548;549;0 +549;550;0 +550;551;0 +551;552;0 +552;553;0 +553;554;0 +554;555;0 +555;556;0 +556;557;0 +557;558;0 +558;559;0 +559;560;0 +560;561;0 +561;562;0 +562;563;0 +563;564;0 +564;565;0 +565;566;0 +566;567;0 +567;568;0 +568;569;0 +569;570;0 +570;571;0 +571;572;0 +572;573;0 +573;574;0 +574;575;0 +575;576;0 +576;577;0 +577;578;0 +578;579;0 +579;580;0 +580;581;0 +581;582;0 +582;583;0 +583;584;0 +584;585;0 +585;586;0 +586;587;0 +587;588;0 +588;589;0 +589;590;0 +590;591;0 +591;592;0 +592;593;0 +593;594;0 +594;595;0 +595;596;0 +596;597;0 +597;598;0 +598;599;0 +599;600;0 +600;601;0 +601;602;0 +602;603;0 +603;604;0 +604;605;0 +605;606;0 +606;607;0 +607;608;0 +608;609;0 +609;610;0 +610;611;0 +611;612;0 +612;613;0 +613;614;0 +614;615;0 +615;616;0 +616;617;0 +617;618;0 +618;619;0 +619;620;0 +620;621;0 +621;622;0 +622;623;0 +623;624;0 +624;625;0 +625;626;0 +626;627;0 +627;628;0 +628;629;0 +629;630;0 +630;631;0 +631;632;0 +632;633;0 +633;634;0 +634;635;0 +635;636;0 +636;637;0 +637;638;0 +638;639;0 +639;640;0 +640;641;0 +641;642;0 +642;643;0 +643;644;0 +644;645;0 +645;646;0 +646;647;0 +647;648;0 +648;649;0 +649;650;0 +650;651;0 +651;652;0 +652;653;0 +653;654;0 +654;655;0 +655;656;0 +656;657;0 +657;658;0 +658;659;0 +659;660;0 +660;661;0 +661;662;0 +662;663;0 +663;664;0 +664;665;0 +665;666;0 +666;667;0 +667;668;0 +668;669;0 +669;670;0 +670;671;0 +671;672;0 +672;673;0 +673;674;0 +674;675;0 +675;676;0 +676;677;0 +677;678;0 +678;679;0 +679;680;0 +680;681;0 +681;682;0 +682;683;0 +683;684;0 +684;685;0 +685;686;0 +686;687;0 +687;688;0 +688;689;0 +689;690;0 +690;691;0 +691;692;0 +692;693;0 +693;694;0 +694;695;0 +695;696;0 +696;697;0 +697;698;0 +698;699;0 +699;700;0 +700;701;0 +701;702;0 +702;703;0 +703;704;0 +704;705;0 +705;706;0 +706;707;0 +707;708;0 +708;709;0 +709;710;0 +710;711;0 +711;712;0 +712;713;0 +713;714;0 +714;715;0 +715;716;0 +716;717;0 +717;718;0 +718;719;0 +719;720;0 +720;721;0 +721;722;0 +722;723;0 +723;724;0 +724;725;0 +725;726;0 +726;727;0 +727;728;0 +728;729;0 +729;730;0 +730;731;0 +731;732;0 +732;733;0 +733;734;0 +734;735;0 +735;736;0 +736;737;0 +737;738;0 +738;739;0 +739;740;0 +740;741;0 +741;742;0 +742;743;0 +743;744;0 +744;745;0 +745;746;0 +746;747;0 +747;748;0 +748;749;0 +749;750;0 +750;751;0 +751;752;0 +752;753;0 +753;754;0 +754;755;0 +755;756;0 +756;757;0 +757;758;0 +758;759;0 +759;760;0 +760;761;0 +761;762;0 +762;763;0 +763;764;0 +764;765;0 +765;766;0 +766;767;0 +767;768;0 +768;769;0 +769;770;0 +770;771;0 +771;772;0 +772;773;0 +773;774;0 +774;775;0 +775;776;0 +776;777;0 +777;778;0 +778;779;0 +779;780;0 +780;781;0 +781;782;0 +782;783;0 +783;784;0 +784;785;0 +785;786;0 +786;787;0 +787;788;0 +788;789;0 +789;790;0 +790;791;0 +791;792;0 +792;793;0 +793;794;0 +794;795;0 +795;796;0 +796;797;0 +797;798;0 +798;799;0 +799;800;0 +800;801;0 +801;802;0 +802;803;0 +803;804;0 +804;805;0 +805;806;0 +806;807;0 +807;808;0 +808;809;0 +809;810;0 +810;811;0 +811;812;0 +812;813;0 +813;814;0 +814;815;0 +815;816;0 +816;817;0 +817;818;0 +818;819;0 +819;820;0 +820;821;0 +821;822;0 +822;823;0 +823;824;0 +824;825;0 +825;826;0 +826;827;0 +827;828;0 +828;829;0 +829;830;0 +830;831;0 +831;832;0 +832;833;0 +833;834;0 +834;835;0 +835;836;0 +836;837;0 +837;838;0 +838;839;0 +839;840;0 +840;841;0 +841;842;0 +842;843;0 +843;844;0 +844;845;0 +845;846;0 +846;847;0 +847;848;0 +848;849;0 +849;850;0 +850;851;0 +851;852;0 +852;853;0 +853;854;0 +854;855;0 +855;856;0 +856;857;0 +857;858;0 +858;859;0 +859;860;0 +860;861;0 +861;862;0 +862;863;0 +863;864;0 +864;865;0 +865;866;0 +866;867;0 +867;868;0 +868;869;0 +869;870;0 +870;871;0 +871;872;0 +872;873;0 +873;874;0 +874;875;0 +875;876;0 +876;877;0 +877;878;0 +878;879;0 +879;880;0 +880;881;0 +881;882;0 +882;883;0 +883;884;0 +884;885;0 +885;886;0 +886;887;0 +887;888;0 +888;889;0 +889;890;0 +890;891;0 +891;892;0 +892;893;0 +893;894;0 +894;895;0 +895;896;0 +896;897;0 +897;898;0 +898;899;0 +899;900;0 +900;901;0 +901;902;0 +902;903;0 +903;904;0 +904;905;0 +905;906;0 +906;907;0 +907;908;0 +908;909;0 +909;910;0 +910;911;0 +911;912;0 +912;913;0 +913;914;0 +914;915;0 +915;916;0 +916;917;0 +917;918;0 +918;919;0 +919;920;0 +920;921;0 +921;922;0 +922;923;0 +923;924;0 +924;925;0 +925;926;0 +926;927;0 +927;928;0 +928;929;0 +929;930;0 +930;931;0 +931;932;0 +932;933;0 +933;934;0 +934;935;0 +935;936;0 +936;937;0 +937;938;0 +938;939;0 +939;940;0 +940;941;0 +941;942;0 +942;943;0 +943;944;0 +944;945;0 +945;946;0 +946;947;0 +947;948;0 +948;949;0 +949;950;0 +950;951;0 +951;952;0 +952;953;0 +953;954;0 +954;955;0 +955;956;0 +956;957;0 +957;958;0 +958;959;0 +959;960;0 +960;961;0 +961;962;0 +962;963;0 +963;964;0 +964;965;0 +965;966;0 +966;967;0 +967;968;0 +968;969;0 +969;970;0 +970;971;0 +971;972;0 +972;973;0 +973;974;0 +974;975;0 +975;976;0 +976;977;0 +977;978;0 +978;979;0 +979;980;0 +980;981;0 +981;982;0 +982;983;0 +983;984;0 +984;985;0 +985;986;0 +986;987;0 +987;988;0 +988;989;0 +989;990;0 +990;991;0 +991;992;0 +992;993;0 +993;994;0 +994;995;0 +995;996;0 +996;997;0 +997;998;0 +998;999;0 +999;1000;0 +1000;1001;0 +1001;1002;0 +1002;1003;0 +1003;1004;0 +1004;1005;0 +1005;1006;0 +1006;1007;0 +1007;1008;0 +1008;1009;0 +1009;1010;0 +1010;1011;0 +1011;1012;0 +1012;1013;0 +1013;1014;0 +1014;1015;0 +1015;1016;0 +1016;1017;0 +1017;1018;0 +1018;1019;0 +1019;1020;0 +1020;1021;0 +1021;1022;0 +1022;1023;0 +1023;1024;0 +1024;1025;0 +1025;1026;0 +1026;1027;0 +1027;1028;0 +1028;1029;0 +1029;1030;0 +1030;1031;0 +1031;1032;0 +1032;1033;0 +1033;1034;0 +1034;1035;0 +1035;1036;0 +1036;1037;0 +1037;1038;0 +1038;1039;0 +1039;1040;0 +1040;1041;0 +1041;1042;0 +1042;1043;0 +1043;1044;0 +1044;1045;0 +1045;1046;0 +1046;1047;0 +1047;1048;0 +1048;1049;0 +1049;1050;0 +1050;1051;0 +1051;1052;0 +1052;1053;0 +1053;1054;0 +1054;1055;0 +1055;1056;0 +1056;1057;0 +1057;1058;0 +1058;1059;0 +1059;1060;0 +1060;1061;0 +1061;1062;0 +1062;1063;0 +1063;1064;0 +1064;1065;0 +1065;1066;0 +1066;1067;0 +1067;1068;0 +1068;1069;0 +1069;1070;0 +1070;1071;0 +1071;1072;0 +1072;1073;0 +1073;1074;0 +1074;1075;0 +1075;1076;0 +1076;1077;0 +1077;1078;0 +1078;1079;0 +1079;1080;0 +1080;1081;0 +1081;1082;0 +1082;1083;0 +1083;1084;0 +1084;1085;0 +1085;1086;0 +1086;1087;0 +1087;1088;0 +1088;1089;0 +1089;1090;0 +1090;1091;0 +1091;1092;0 +1092;1093;0 +1093;1094;0 +1094;1095;0 +1095;1096;0 +1096;1097;0 +1097;1098;0 +1098;1099;0 +1099;1100;0 +1100;1101;0 +1101;1102;0 +1102;1103;0 +1103;1104;0 +1104;1105;0 +1105;1106;0 +1106;1107;0 +1107;1108;0 +1108;1109;0 +1109;1110;0 +1110;1111;0 +1111;1112;0 +1112;1113;0 +1113;1114;0 +1114;1115;0 +1115;1116;0 +1116;1117;0 +1117;1118;0 +1118;1119;0 +1119;1120;0 +1120;1121;0 +1121;1122;0 +1122;1123;0 +1123;1124;0 +1124;1125;0 +1125;1126;0 +1126;1127;0 +1127;1128;0 +1128;1129;0 +1129;1130;0 +1130;1131;0 +1131;1132;0 +1132;1133;0 +1133;1134;0 +1134;1135;0 +1135;1136;0 +1136;1137;0 +1137;1138;0 +1138;1139;0 +1139;1140;0 +1140;1141;0 +1141;1142;0 +1142;1143;0 +1143;1144;0 +1144;1145;0 +1145;1146;0 +1146;1147;0 +1147;1148;0 +1148;1149;0 +1149;1150;0 +1150;1151;0 +1151;1152;0 +1152;1153;0 +1153;1154;0 +1154;1155;0 +1155;1156;0 +1156;1157;0 +1157;1158;0 +1158;1159;0 +1159;1160;0 +1160;1161;0 +1161;1162;0 +1162;1163;0 +1163;1164;0 +1164;1165;0 +1165;1166;0 +1166;1167;0 +1167;1168;0 +1168;1169;0 +1169;1170;0 +1170;1171;0 +1171;1172;0 +1172;1173;0 +1173;1174;0 +1174;1175;0 +1175;1176;0 +1176;1177;0 +1177;1178;0 +1178;1179;0 +1179;1180;0 +1180;1181;0 +1181;1182;0 +1182;1183;0 +1183;1184;0 +1184;1185;0 +1185;1186;0 +1186;1187;0 +1187;1188;0 +1188;1189;0 +1189;1190;0 +1190;1191;0 +1191;1192;0 +1192;1193;0 +1193;1194;0 +1194;1195;0 +1195;1196;0 +1196;1197;0 +1197;1198;0 +1198;1199;0 +1199;1200;0 +1200;1201;0 +1201;1202;0 +1202;1203;0 +1203;1204;0 +1204;1205;0 +1205;1206;0 +1206;1207;0 +1207;1208;0 +1208;1209;0 +1209;1210;0 +1210;1211;0 +1211;1212;0 +1212;1213;0 +1213;1214;0 +1214;1215;0 +1215;1216;0 +1216;1217;0 +1217;1218;0 +1218;1219;0 +1219;1220;0 +1220;1221;0 +1221;1222;0 +1222;1223;0 +1223;1224;0 +1224;1225;0 +1225;1226;0 +1226;1227;0 +1227;1228;0 +1228;1229;0 +1229;1230;0 +1230;1231;0 +1231;1232;0 +1232;1233;0 +1233;1234;0 +1234;1235;0 +1235;1236;0 +1236;1237;0 +1237;1238;0 +1238;1239;0 +1239;1240;0 +1240;1241;0 +1241;1242;0 +1242;1243;0 +1243;1244;0 +1244;1245;0 +1245;1246;0 +1246;1247;0 +1247;1248;0 +1248;1249;0 +1249;1250;0 +1250;1251;0 +1251;1252;0 +1252;1253;0 +1253;1254;0 +1254;1255;0 +1255;1256;0 +1256;1257;0 +1257;1258;0 +1258;1259;0 +1259;1260;0 +1260;1261;0 +1261;1262;0 +1262;1263;0 +1263;1264;0 +1264;1265;0 +1265;1266;0 +1266;1267;0 +1267;1268;0 +1268;1269;0 +1269;1270;0 +1270;1271;0 +1271;1272;0 +1272;1273;0 +1273;1274;0 +1274;1275;0 +1275;1276;0 +1276;1277;0 +1277;1278;0 +1278;1279;0 +1279;1280;0 +1280;1281;0 +1281;1282;0 +1282;1283;0 +1283;1284;0 +1284;1285;0 +1285;1286;0 +1286;1287;0 +1287;1288;0 +1288;1289;0 +1289;1290;0 +1290;1291;0 +1291;1292;0 +1292;1293;0 +1293;1294;0 +1294;1295;0 +1295;1296;0 +1296;1297;0 +1297;1298;0 +1298;1299;0 +1299;1300;0 +1300;1301;0 +1301;1302;0 +1302;1303;0 +1303;1304;0 +1304;1305;0 +1305;1306;0 +1306;1307;0 +1307;1308;0 +1308;1309;0 +1309;1310;0 +1310;1311;0 +1311;1312;0 +1312;1313;0 +1313;1314;0 +1314;1315;0 +1315;1316;0 +1316;1317;0 +1317;1318;0 +1318;1319;0 +1319;1320;0 +1320;1321;0 +1321;1322;0 +1322;1323;0 +1323;1324;0 +1324;1325;0 +1325;1326;0 +1326;1327;0 +1327;1328;0 +1328;1329;0 +1329;1330;0 +1330;1331;0 +1331;1332;0 +1332;1333;0 +1333;1334;0 +1334;1335;0 +1335;1336;0 +1336;1337;0 +1337;1338;0 +1338;1339;0 +1339;1340;0 +1340;1341;0 +1341;1342;0 +1342;1343;0 +1343;1344;0 +1344;1345;0 +1345;1346;0 +1346;1347;0 +1347;1348;0 +1348;1349;0 +1349;1350;0 +1350;1351;0 +1351;1352;0 +1352;1353;0 +1353;1354;0 +1354;1355;0 +1355;1356;0 +1356;1357;0 +1357;1358;0 +1358;1359;0 +1359;1360;0 +1360;1361;0 +1361;1362;0 +1362;1363;0 +1363;1364;0 +1364;1365;0 +1365;1366;0 +1366;1367;0 +1367;1368;0 +1368;1369;0 +1369;1370;0 +1370;1371;0 +1371;1372;0 +1372;1373;0 +1373;1374;0 +1374;1375;0 +1375;1376;0 +1376;1377;0 +1377;1378;0 +1378;1379;0 +1379;1380;0 +1380;1381;0 +1381;1382;0 +1382;1383;0 +1383;1384;0 +1384;1385;0 +1385;1386;0 +1386;1387;0 +1387;1388;0 +1388;1389;0 +1389;1390;0 +1390;1391;0 +1391;1392;0 +1392;1393;0 +1393;1394;0 +1394;1395;0 +1395;1396;0 +1396;1397;0 +1397;1398;0 +1398;1399;0 +1399;1400;0 +1400;1401;0 +1401;1402;0 +1402;1403;0 +1403;1404;0 +1404;1405;0 +1405;1406;0 +1406;1407;0 +1407;1408;0 +1408;1409;0 +1409;1410;0 +1410;1411;0 +1411;1412;0 +1412;1413;0 +1413;1414;0 +1414;1415;0 +1415;1416;0 +1416;1417;0 +1417;1418;0 +1418;1419;0 +1419;1420;0 +1420;1421;0 +1421;1422;0 +1422;1423;0 +1423;1424;0 +1424;1425;0 +1425;1426;0 +1426;1427;0 +1427;1428;0 +1428;1429;0 +1429;1430;0 +1430;1431;0 +1431;1432;0 +1432;1433;0 +1433;1434;0 +1434;1435;0 +1435;1436;0 +1436;1437;0 +1437;1438;0 +1438;1439;0 +1439;1440;0 +1440;1441;0 +1441;1442;0 +1442;1443;0 +1443;1444;0 +1444;1445;0 +1445;1446;0 +1446;1447;0 +1447;1448;0 +1448;1449;0 +1449;1450;0 +1450;1451;0 +1451;1452;0 +1452;1453;0 +1453;1454;0 +1454;1455;0 +1455;1456;0 +1456;1457;0 +1457;1458;0 +1458;1459;0 +1459;1460;0 +1460;1461;0 +1461;1462;0 +1462;1463;0 +1463;1464;0 +1464;1465;0 +1465;1466;0 +1466;1467;0 +1467;1468;0 +1468;1469;0 +1469;1470;0 +1470;1471;0 +1471;1472;0 +1472;1473;0 +1473;1474;0 +1474;1475;0 +1475;1476;0 +1476;1477;0 +1477;1478;0 +1478;1479;0 +1479;1480;0 +1480;1481;0 +1481;1482;0 +1482;1483;0 +1483;1484;0 +1484;1485;0 +1485;1486;0 +1486;1487;0 +1487;1488;0 +1488;1489;0 +1489;1490;0 +1490;1491;0 +1491;1492;0 +1492;1493;0 +1493;1494;0 +1494;1495;0 +1495;1496;0 +1496;1497;0 +1497;1498;0 +1498;1499;0 +1499;1500;0 +1500;1501;0 +1501;1502;0 +1502;1503;0 +1503;1504;0 +1504;1505;0 +1505;1506;0 +1506;1507;0 +1507;1508;0 +1508;1509;0 +1509;1510;0 +1510;1511;0 +1511;1512;0 +1512;1513;0 +1513;1514;0 +1514;1515;0 +1515;1516;0 +1516;1517;0 +1517;1518;0 +1518;1519;0 +1519;1520;0 +1520;1521;0 +1521;1522;0 +1522;1523;0 +1523;1524;0 +1524;1525;0 +1525;1526;0 +1526;1527;0 +1527;1528;0 +1528;1529;0 +1529;1530;0 +1530;1531;0 +1531;1532;0 +1532;1533;0 +1533;1534;0 +1534;1535;0 +1535;1536;0 +1536;1537;0 +1537;1538;0 +1538;1539;0 +1539;1540;0 +1540;1541;0 +1541;1542;0 +1542;1543;0 +1543;1544;0 +1544;1545;0 +1545;1546;0 +1546;1547;0 +1547;1548;0 +1548;1549;0 +1549;1550;0 +1550;1551;0 +1551;1552;0 +1552;1553;0 +1553;1554;0 +1554;1555;0 +1555;1556;0 +1556;1557;0 +1557;1558;0 +1558;1559;0 +1559;1560;0 +1560;1561;0 +1561;1562;0 +1562;1563;0 +1563;1564;0 +1564;1565;0 +1565;1566;0 +1566;1567;0 +1567;1568;0 +1568;1569;0 +1569;1570;0 +1570;1571;0 +1571;1572;0 +1572;1573;0 +1573;1574;0 +1574;1575;0 +1575;1576;0 +1576;1577;0 +1577;1578;0 +1578;1579;0 +1579;1580;0 +1580;1581;0 +1581;1582;0 +1582;1583;0 +1583;1584;0 +1584;1585;0 +1585;1586;0 +1586;1587;0 +1587;1588;0 +1588;1589;0 +1589;1590;0 +1590;1591;0 +1591;1592;0 +1592;1593;0 +1593;1594;0 +1594;1595;0 +1595;1596;0 +1596;1597;0 +1597;1598;0 +1598;1599;0 +1599;1600;0 +1600;1601;0 +1601;1602;0 +1602;1603;0 +1603;1604;0 +1604;1605;0 +1605;1606;0 +1606;1607;0 +1607;1608;0 +1608;1609;0 +1609;1610;0 +1610;1611;0 +1611;1612;0 +1612;1613;0 +1613;1614;0 +1614;1615;0 +1615;1616;0 +1616;1617;0 +1617;1618;0 +1618;1619;0 +1619;1620;0 +1620;1621;0 +1621;1622;0 +1622;1623;0 +1623;1624;0 +1624;1625;0 +1625;1626;0 +1626;1627;0 +1627;1628;0 +1628;1629;0 +1629;1630;0 +1630;1631;0 +1631;1632;0 +1632;1633;0 +1633;1634;0 +1634;1635;0 +1635;1636;0 +1636;1637;0 +1637;1638;0 +1638;1639;0 +1639;1640;0 +1640;1641;0 +1641;1642;0 +1642;1643;0 +1643;1644;0 +1644;1645;0 +1645;1646;0 +1646;1647;0 +1647;1648;0 +1648;1649;0 +1649;1650;0 +1650;1651;0 +1651;1652;0 +1652;1653;0 +1653;1654;0 +1654;1655;0 +1655;1656;0 +1656;1657;0 +1657;1658;0 +1658;1659;0 +1659;1660;0 +1660;1661;0 +1661;1662;0 +1662;1663;0 +1663;1664;0 +1664;1665;0 +1665;1666;0 +1666;1667;0 +1667;1668;0 +1668;1669;0 +1669;1670;0 +1670;1671;0 +1671;1672;0 +1672;1673;0 +1673;1674;0 +1674;1675;0 +1675;1676;0 +1676;1677;0 +1677;1678;0 +1678;1679;0 +1679;1680;0 +1680;1681;0 +1681;1682;0 +1682;1683;0 +1683;1684;0 +1684;1685;0 +1685;1686;0 +1686;1687;0 +1687;1688;0 +1688;1689;0 +1689;1690;0 +1690;1691;0 +1691;1692;0 +1692;1693;0 +1693;1694;0 +1694;1695;0 +1695;1696;0 +1696;1697;0 +1697;1698;0 +1698;1699;0 +1699;1700;0 +1700;1701;0 +1701;1702;0 +1702;1703;0 +1703;1704;0 +1704;1705;0 +1705;1706;0 +1706;1707;0 +1707;1708;0 +1708;1709;0 +1709;1710;0 +1710;1711;0 +1711;1712;0 +1712;1713;0 +1713;1714;0 +1714;1715;0 +1715;1716;0 +1716;1717;0 +1717;1718;0 +1718;1719;0 +1719;1720;0 +1720;1721;0 +1721;1722;0 +1722;1723;0 +1723;1724;0 +1724;1725;0 +1725;1726;0 +1726;1727;0 +1727;1728;0 +1728;1729;0 +1729;1730;0 +1730;1731;0 +1731;1732;0 +1732;1733;0 +1733;1734;0 +1734;1735;0 +1735;1736;0 +1736;1737;0 +1737;1738;0 +1738;1739;0 +1739;1740;0 +1740;1741;0 +1741;1742;0 +1742;1743;0 +1743;1744;0 +1744;1745;0 +1745;1746;0 +1746;1747;0 +1747;1748;0 +1748;1749;0 +1749;1750;0 +1750;1751;0 +1751;1752;0 +1752;1753;0 +1753;1754;0 +1754;1755;0 +1755;1756;0 +1756;1757;0 +1757;1758;0 +1758;1759;0 +1759;1760;0 +1760;1761;0 +1761;1762;0 +1762;1763;0 +1763;1764;0 +1764;1765;0 +1765;1766;0 +1766;1767;0 +1767;1768;0 +1768;1769;0 +1769;1770;0 +1770;1771;0 +1771;1772;0 +1772;1773;0 +1773;1774;0 +1774;1775;0 +1775;1776;0 +1776;1777;0 +1777;1778;0 +1778;1779;0 +1779;1780;0 +1780;1781;0 +1781;1782;0 +1782;1783;0 +1783;1784;0 +1784;1785;0 +1785;1786;0 +1786;1787;0 +1787;1788;0 +1788;1789;0 +1789;1790;0 +1790;1791;0 +1791;1792;0 +1792;1793;0 +1793;1794;0 +1794;1795;0 +1795;1796;0 +1796;1797;0 +1797;1798;0 +1798;1799;0 +1799;1800;0 +1800;1801;0 +1801;1802;0 +1802;1803;0 +1803;1804;0 +1804;1805;0 +1805;1806;0 +1806;1807;0 +1807;1808;0 +1808;1809;0 +1809;1810;0 +1810;1811;0 +1811;1812;0 +1812;1813;0 +1813;1814;0 +1814;1815;0 +1815;1816;0 +1816;1817;0 +1817;1818;0 +1818;1819;0 +1819;1820;0 +1820;1821;0 +1821;1822;0 +1822;1823;0 +1823;1824;0 +1824;1825;0 +1825;1826;0 +1826;1827;0 +1827;1828;0 +1828;1829;0 +1829;1830;0 +1830;1831;0 +1831;1832;0 +1832;1833;0 +1833;1834;0 +1834;1835;0 +1835;1836;0 +1836;1837;0 +1837;1838;0 +1838;1839;0 +1839;1840;0 +1840;1841;0 +1841;1842;0 +1842;1843;0 +1843;1844;0 +1844;1845;0 +1845;1846;0 +1846;1847;0 +1847;1848;0 +1848;1849;0 +1849;1850;0 +1850;1851;0 +1851;1852;0 +1852;1853;0 +1853;1854;0 +1854;1855;0 +1855;1856;0 +1856;1857;0 +1857;1858;0 +1858;1859;0 +1859;1860;0 +1860;1861;0 +1861;1862;0 +1862;1863;0 +1863;1864;0 +1864;1865;0 +1865;1866;0 +1866;1867;0 +1867;1868;0 +1868;1869;0 +1869;1870;0 +1870;1871;0 +1871;1872;0 +1872;1873;0 +1873;1874;0 +1874;1875;0 +1875;1876;0 +1876;1877;0 +1877;1878;0 +1878;1879;0 +1879;1880;0 +1880;1881;0 +1881;1882;0 +1882;1883;0 +1883;1884;0 +1884;1885;0 +1885;1886;0 +1886;1887;0 +1887;1888;0 +1888;1889;0 +1889;1890;0 +1890;1891;0 +1891;1892;0 +1892;1893;0 +1893;1894;0 +1894;1895;0 +1895;1896;0 +1896;1897;0 +1897;1898;0 +1898;1899;0 +1899;1900;0 +1900;1901;0 +1901;1902;0 +1902;1903;0 +1903;1904;0 +1904;1905;0 +1905;1906;0 +1906;1907;0 +1907;1908;0 +1908;1909;0 +1909;1910;0 +1910;1911;0 +1911;1912;0 +1912;1913;0 +1913;1914;0 +1914;1915;0 +1915;1916;0 +1916;1917;0 +1917;1918;0 +1918;1919;0 +1919;1920;0 +1920;1921;0 +1921;1922;0 +1922;1923;0 +1923;1924;0 +1924;1925;0 +1925;1926;0 +1926;1927;0 +1927;1928;0 +1928;1929;0 +1929;1930;0 +1930;1931;0 +1931;1932;0 +1932;1933;0 +1933;1934;0 +1934;1935;0 +1935;1936;0 +1936;1937;0 +1937;1938;0 +1938;1939;0 +1939;1940;0 +1940;1941;0 +1941;1942;0 +1942;1943;0 +1943;1944;0 +1944;1945;0 +1945;1946;0 +1946;1947;0 +1947;1948;0 +1948;1949;0 +1949;1950;0 +1950;1951;0 +1951;1952;0 +1952;1953;0 +1953;1954;0 +1954;1955;0 +1955;1956;0 +1956;1957;0 +1957;1958;0 +1958;1959;0 +1959;1960;0 +1960;1961;0 +1961;1962;0 +1962;1963;0 +1963;1964;0 +1964;1965;0 +1965;1966;0 +1966;1967;0 +1967;1968;0 +1968;1969;0 +1969;1970;0 +1970;1971;0 +1971;1972;0 +1972;1973;0 +1973;1974;0 +1974;1975;0 +1975;1976;0 +1976;1977;0 +1977;1978;0 +1978;1979;0 +1979;1980;0 +1980;1981;0 +1981;1982;0 +1982;1983;0 +1983;1984;0 +1984;1985;0 +1985;1986;0 +1986;1987;0 +1987;1988;0 +1988;1989;0 +1989;1990;0 +1990;1991;0 +1991;1992;0 +1992;1993;0 +1993;1994;0 +1994;1995;0 +1995;1996;0 +1996;1997;0 +1997;1998;0 +1998;1999;0 +1999;2000;0 +2000;2001;0 +2001;2002;0 +2002;2003;0 +2003;2004;0 +2004;2005;0 +2005;2006;0 +2006;2007;0 +2007;2008;0 +2008;2009;0 +2009;2010;0 +2010;2011;0 +2011;2012;0 +2012;2013;0 +2013;2014;0 +2014;2015;0 +2015;2016;0 +2016;2017;0 +2017;2018;0 +2018;2019;0 +2019;2020;0 +2020;2021;0 +2021;2022;0 +2022;2023;0 +2023;2024;0 +2024;2025;0 +2025;2026;0 +2026;2027;0 +2027;2028;0 +2028;2029;0 +2029;2030;0 +2030;2031;0 +2031;2032;0 +2032;2033;0 +2033;2034;0 +2034;2035;0 +2035;2036;0 +2036;2037;0 +2037;2038;0 +2038;2039;0 +2039;2040;0 +2040;2041;0 +2041;2042;0 +2042;2043;0 +2043;2044;0 +2044;2045;0 +2045;2046;0 +2046;2047;0 +2047;2048;0 +2048;2049;0 +2049;2050;0 +2050;2051;0 +2051;2052;0 +2052;2053;0 +2053;2054;0 +2054;2055;0 +2055;2056;0 +2056;2057;0 +2057;2058;0 +2058;2059;0 +2059;2060;0 +2060;2061;0 +2061;2062;0 +2062;2063;0 +2063;2064;0 +2064;2065;0 +2065;2066;0 +2066;2067;0 +2067;2068;0 +2068;2069;0 +2069;2070;0 +2070;2071;0 +2071;2072;0 +2072;2073;0 +2073;2074;0 +2074;2075;0 +2075;2076;0 +2076;0;0 +2077;2078;0 +2078;2079;0 +2079;2080;0 +2080;2081;0 +2081;2082;0 +2082;2083;0 +2083;2084;0 +2084;2085;0 +2085;2086;0 +2086;2087;0 +2087;2088;0 +2088;2089;0 +2089;2090;0 +2090;2091;0 +2091;2092;0 +2092;2093;0 +2093;2094;0 +2094;2095;0 +2095;2096;0 +2096;2097;0 +2097;2098;0 +2098;2099;0 +2099;2100;0 +2100;2101;0 +2101;2102;0 +2102;2103;0 +2103;2104;0 +2104;2105;0 +2105;2106;0 +2106;2107;0 +2107;2108;0 +2108;2109;0 +2109;2110;0 +2110;2111;0 +2111;2112;0 +2112;2113;0 +2113;2114;0 +2114;2115;0 +2115;2116;0 +2116;2117;0 +2117;2118;0 +2118;2119;0 +2119;2120;0 +2120;2121;0 +2121;2122;0 +2122;2123;0 +2123;2124;0 +2124;2125;0 +2125;2126;0 +2126;2127;0 +2127;2128;0 +2128;2129;0 +2129;2130;0 +2130;2131;0 +2131;2132;0 +2132;2133;0 +2133;2134;0 +2134;2135;0 +2135;2136;0 +2136;2137;0 +2137;2138;0 +2138;2139;0 +2139;2140;0 +2140;2141;0 +2141;2142;0 +2142;2143;0 +2143;2144;0 +2144;2145;0 +2145;2146;0 +2146;2147;0 +2147;2148;0 +2148;2149;0 +2149;2150;0 +2150;2151;0 +2151;2152;0 +2152;2153;0 +2153;2154;0 +2154;2155;0 +2155;2156;0 +2156;2157;0 +2157;2158;0 +2158;2159;0 +2159;2160;0 +2160;2161;0 +2161;2162;0 +2162;2163;0 +2163;2164;0 +2164;2165;0 +2165;2166;0 +2166;2167;0 +2167;2168;0 +2168;2169;0 +2169;2170;0 +2170;2171;0 +2171;2172;0 +2172;2173;0 +2173;2174;0 +2174;2175;0 +2175;2176;0 +2176;2177;0 +2177;2178;0 +2178;2179;0 +2179;2180;0 +2180;2181;0 +2181;2182;0 +2182;2183;0 +2183;2184;0 +2184;2185;0 +2185;2186;0 +2186;2187;0 +2187;2188;0 +2188;2189;0 +2189;2190;0 +2190;2191;0 +2191;2192;0 +2192;2193;0 +2193;2194;0 +2194;2195;0 +2195;2196;0 +2196;2197;0 +2197;2198;0 +2198;2199;0 +2199;2200;0 +2200;2201;0 +2201;2202;0 +2202;2203;0 +2203;2204;0 +2204;2205;0 +2205;2206;0 +2206;2207;0 +2207;2208;0 +2208;2209;0 +2209;2210;0 +2210;2211;0 +2211;2212;0 +2212;2213;0 +2213;2214;0 +2214;2215;0 +2215;2216;0 +2216;2217;0 +2217;2218;0 +2218;2219;0 +2219;2220;0 +2220;2221;0 +2221;2222;0 +2222;2223;0 +2223;2224;0 +2224;2225;0 +2225;2226;0 +2226;2227;0 +2227;2228;0 +2228;2229;0 +2229;2230;0 +2230;2231;0 +2231;2232;0 +2232;2233;0 +2233;2234;0 +2234;2235;0 +2235;2236;0 +2236;2237;0 +2237;2238;0 +2238;2239;0 +2239;2240;0 +2240;2241;0 +2241;2242;0 +2242;2243;0 +2243;2244;0 +2244;2245;0 +2245;2246;0 +2246;2247;0 +2247;2248;0 +2248;2249;0 +2249;2250;0 +2250;2251;0 +2251;2252;0 +2252;2253;0 +2253;2254;0 +2254;2255;0 +2255;2256;0 +2256;2257;0 +2257;2258;0 +2258;2259;0 +2259;2260;0 +2260;2261;0 +2261;2262;0 +2262;2263;0 +2263;2264;0 +2264;2265;0 +2265;2266;0 +2266;2267;0 +2267;2268;0 +2268;2269;0 +2269;2270;0 +2270;2271;0 +2271;2272;0 +2272;2273;0 +2273;2274;0 +2274;2275;0 +2275;2276;0 +2276;2277;0 +2277;2278;0 +2278;2279;0 +2279;2280;0 +2280;2281;0 +2281;2282;0 +2282;2283;0 +2283;2284;0 +2284;2285;0 +2285;2286;0 +2286;2287;0 +2287;2288;0 +2288;2289;0 +2289;2290;0 +2290;2291;0 +2291;2292;0 +2292;2293;0 +2293;2294;0 +2294;2295;0 +2295;2296;0 +2296;2297;0 +2297;2298;0 +2298;2299;0 +2299;2300;0 +2300;2301;0 +2301;2302;0 +2302;2303;0 +2303;2304;0 +2304;2305;0 +2305;2306;0 +2306;2307;0 +2307;2308;0 +2308;2309;0 +2309;2310;0 +2310;2311;0 +2311;2312;0 +2312;2313;0 +2313;2314;0 +2314;2315;0 +2315;2316;0 +2316;2317;0 +2317;2318;0 +2318;2319;0 +2319;2320;0 +2320;2321;0 +2321;2322;0 +2322;2323;0 +2323;2324;0 +2324;2325;0 +2325;2326;0 +2326;2327;0 +2327;2328;0 +2328;2329;0 +2329;2330;0 +2330;2331;0 +2331;2332;0 +2332;2333;0 +2333;2334;0 +2334;2335;0 +2335;2336;0 +2336;2337;0 +2337;2338;0 +2338;2339;0 +2339;2340;0 +2340;2341;0 +2341;2342;0 +2342;2343;0 +2343;2344;0 +2344;2345;0 +2345;2346;0 +2346;2347;0 +2347;2348;0 +2348;2349;0 +2349;2350;0 +2350;2351;0 +2351;2352;0 +2352;2353;0 +2353;2354;0 +2354;2355;0 +2355;2356;0 +2356;2357;0 +2357;2358;0 +2358;2359;0 +2359;2360;0 +2360;2361;0 +2361;2362;0 +2362;2363;0 +2363;2364;0 +2364;2365;0 +2365;2366;0 +2366;2367;0 +2367;2368;0 +2368;2369;0 +2369;2370;0 +2370;2371;0 +2371;2372;0 +2372;2373;0 +2373;2374;0 +2374;2375;0 +2375;2376;0 +2376;2377;0 +2377;2378;0 +2378;2379;0 +2379;2380;0 +2380;2381;0 +2381;2382;0 +2382;2383;0 +2383;2384;0 +2384;2385;0 +2385;2386;0 +2386;2387;0 +2387;2388;0 +2388;2389;0 +2389;2390;0 +2390;2391;0 +2391;2392;0 +2392;2393;0 +2393;2394;0 +2394;2395;0 +2395;2396;0 +2396;2397;0 +2397;2398;0 +2398;2399;0 +2399;2400;0 +2400;2401;0 +2401;2402;0 +2402;2403;0 +2403;2404;0 +2404;2405;0 +2405;2406;0 +2406;2407;0 +2407;2408;0 +2408;2409;0 +2409;2410;0 +2410;2411;0 +2411;2412;0 +2412;2413;0 +2413;2414;0 +2414;2415;0 +2415;2416;0 +2416;2417;0 +2417;2418;0 +2418;2419;0 +2419;2420;0 +2420;2421;0 +2421;2422;0 +2422;2423;0 +2423;2424;0 +2424;2425;0 +2425;2426;0 +2426;2427;0 +2427;2428;0 +2428;2429;0 +2429;2430;0 +2430;2431;0 +2431;2432;0 +2432;2433;0 +2433;2434;0 +2434;2435;0 +2435;2436;0 +2436;2437;0 +2437;2438;0 +2438;2439;0 +2439;2440;0 +2440;2441;0 +2441;2442;0 +2442;2443;0 +2443;2444;0 +2444;2445;0 +2445;2446;0 +2446;2447;0 +2447;2448;0 +2448;2449;0 +2449;2450;0 +2450;2451;0 +2451;2452;0 +2452;2453;0 +2453;2454;0 +2454;2455;0 +2455;2456;0 +2456;2457;0 +2457;2458;0 +2458;2459;0 +2459;2460;0 +2460;2461;0 +2461;2462;0 +2462;2463;0 +2463;2464;0 +2464;2465;0 +2465;2466;0 +2466;2467;0 +2467;2468;0 +2468;2469;0 +2469;2470;0 +2470;2471;0 +2471;2472;0 +2472;2473;0 +2473;2474;0 +2474;2475;0 +2475;2476;0 +2476;2477;0 +2477;2478;0 +2478;2479;0 +2479;2480;0 +2480;2481;0 +2481;2482;0 +2482;2483;0 +2483;2484;0 +2484;2485;0 +2485;2486;0 +2486;2487;0 +2487;2488;0 +2488;2489;0 +2489;2490;0 +2490;2491;0 +2491;2492;0 +2492;2493;0 +2493;2494;0 +2494;2495;0 +2495;2496;0 +2496;2497;0 +2497;2498;0 +2498;2499;0 +2499;2500;0 +2500;2501;0 +2501;2502;0 +2502;2503;0 +2503;2504;0 +2504;2505;0 +2505;2506;0 +2506;2507;0 +2507;2508;0 +2508;2509;0 +2509;2510;0 +2510;2511;0 +2511;2512;0 +2512;2513;0 +2513;2514;0 +2514;2515;0 +2515;2516;0 +2516;2517;0 +2517;2518;0 +2518;2519;0 +2519;2520;0 +2520;2521;0 +2521;2522;0 +2522;2523;0 +2523;2524;0 +2524;2525;0 +2525;2526;0 +2526;2527;0 +2527;2528;0 +2528;2529;0 +2529;2530;0 +2530;2531;0 +2531;2532;0 +2532;2533;0 +2533;2534;0 +2534;2535;0 +2535;2536;0 +2536;2537;0 +2537;2538;0 +2538;2539;0 +2539;2540;0 +2540;2541;0 +2541;2542;0 +2542;2543;0 +2543;2544;0 +2544;2545;0 +2545;2546;0 +2546;2547;0 +2547;2548;0 +2548;2549;0 +2549;2550;0 +2550;2551;0 +2551;2552;0 +2552;2553;0 +2553;2554;0 +2554;2555;0 +2555;2556;0 +2556;2557;0 +2557;2558;0 +2558;2559;0 +2559;2560;0 +2560;2561;0 +2561;2562;0 +2562;2563;0 +2563;2564;0 +2564;2565;0 +2565;2566;0 +2566;2567;0 +2567;2568;0 +2568;2569;0 +2569;2570;0 +2570;2571;0 +2571;2572;0 +2572;2573;0 +2573;2574;0 +2574;2575;0 +2575;2576;0 +2576;2577;0 +2577;2578;0 +2578;2579;0 +2579;2580;0 +2580;2581;0 +2581;2582;0 +2582;2583;0 +2583;2584;0 +2584;2585;0 +2585;2586;0 +2586;2587;0 +2587;2588;0 +2588;2589;0 +2589;2590;0 +2590;2591;0 +2591;2592;0 +2592;2593;0 +2593;2594;0 +2594;2595;0 +2595;2596;0 +2596;2597;0 +2597;2598;0 +2598;2599;0 +2599;2600;0 +2600;2601;0 +2601;2602;0 +2602;2603;0 +2603;2604;0 +2604;2605;0 +2605;2606;0 +2606;2607;0 +2607;2608;0 +2608;2609;0 +2609;2610;0 +2610;2611;0 +2611;2612;0 +2612;2613;0 +2613;2614;0 +2614;2615;0 +2615;2616;0 +2616;2617;0 +2617;2618;0 +2618;2619;0 +2619;2620;0 +2620;2621;0 +2621;2622;0 +2622;2623;0 +2623;2624;0 +2624;2625;0 +2625;2626;0 +2626;2627;0 +2627;2628;0 +2628;2629;0 +2629;2630;0 +2630;2631;0 +2631;2632;0 +2632;2633;0 +2633;2634;0 +2634;2635;0 +2635;2636;0 +2636;2637;0 +2637;2638;0 +2638;2639;0 +2639;2640;0 +2640;2641;0 +2641;2642;0 +2642;2643;0 +2643;2644;0 +2644;2645;0 +2645;2646;0 +2646;2647;0 +2647;2648;0 +2648;2649;0 +2649;2650;0 +2650;2651;0 +2651;2652;0 +2652;2653;0 +2653;2654;0 +2654;2655;0 +2655;2656;0 +2656;2657;0 +2657;2658;0 +2658;2659;0 +2659;2660;0 +2660;2661;0 +2661;2662;0 +2662;2663;0 +2663;2664;0 +2664;2665;0 +2665;2666;0 +2666;2667;0 +2667;2668;0 +2668;2669;0 +2669;2670;0 +2670;2671;0 +2671;2672;0 +2672;2673;0 +2673;2674;0 +2674;2675;0 +2675;2676;0 +2676;2677;0 +2677;2678;0 +2678;2679;0 +2679;2680;0 +2680;2681;0 +2681;2682;0 +2682;2683;0 +2683;2684;0 +2684;2685;0 +2685;2686;0 +2686;2687;0 +2687;2688;0 +2688;2689;0 +2689;2690;0 +2690;2691;0 +2691;2692;0 +2692;2693;0 +2693;2694;0 +2694;2695;0 +2695;2696;0 +2696;2697;0 +2697;2698;0 +2698;2699;0 +2699;2700;0 +2700;2701;0 +2701;2702;0 +2702;2703;0 +2703;2704;0 +2704;2705;0 +2705;2706;0 +2706;2707;0 +2707;2708;0 +2708;2709;0 +2709;2710;0 +2710;2711;0 +2711;2712;0 +2712;2713;0 +2713;2714;0 +2714;2715;0 +2715;2716;0 +2716;2717;0 +2717;2718;0 +2718;2719;0 +2719;2720;0 +2720;2721;0 +2721;2722;0 +2722;2723;0 +2723;2724;0 +2724;2725;0 +2725;2726;0 +2726;2727;0 +2727;2728;0 +2728;2729;0 +2729;2730;0 +2730;2731;0 +2731;2732;0 +2732;2733;0 +2733;2734;0 +2734;2735;0 +2735;2736;0 +2736;2737;0 +2737;2738;0 +2738;2739;0 +2739;2740;0 +2740;2741;0 +2741;2742;0 +2742;2743;0 +2743;2744;0 +2744;2745;0 +2745;2746;0 +2746;2747;0 +2747;2748;0 +2748;2749;0 +2749;2750;0 +2750;2751;0 +2751;2752;0 +2752;2753;0 +2753;2754;0 +2754;2755;0 +2755;2756;0 +2756;2757;0 +2757;2758;0 +2758;2759;0 +2759;2760;0 +2760;2761;0 +2761;2762;0 +2762;2763;0 +2763;2764;0 +2764;2765;0 +2765;2766;0 +2766;2767;0 +2767;2768;0 +2768;2769;0 +2769;2770;0 +2770;2771;0 +2771;2772;0 +2772;2773;0 +2773;2774;0 +2774;2775;0 +2775;2776;0 +2776;2777;0 +2777;2778;0 +2778;2779;0 +2779;2780;0 +2780;2781;0 +2781;2782;0 +2782;2783;0 +2783;2784;0 +2784;2785;0 +2785;2786;0 +2786;2787;0 +2787;2788;0 +2788;2789;0 +2789;2790;0 +2790;2791;0 +2791;2792;0 +2792;2793;0 +2793;2794;0 +2794;2795;0 +2795;2796;0 +2796;2797;0 +2797;2798;0 +2798;2799;0 +2799;2800;0 +2800;2801;0 +2801;2802;0 +2802;2803;0 +2803;2804;0 +2804;2805;0 +2805;2806;0 +2806;2807;0 +2807;2808;0 +2808;2809;0 +2809;2810;0 +2810;2811;0 +2811;2812;0 +2812;2813;0 +2813;2814;0 +2814;2815;0 +2815;2816;0 +2816;2817;0 +2817;2818;0 +2818;2819;0 +2819;2820;0 +2820;2821;0 +2821;2822;0 +2822;2823;0 +2823;2824;0 +2824;2825;0 +2825;2826;0 +2826;2827;0 +2827;2828;0 +2828;2829;0 +2829;2830;0 +2830;2831;0 +2831;2832;0 +2832;2833;0 +2833;2834;0 +2834;2835;0 +2835;2836;0 +2836;2837;0 +2837;2838;0 +2838;2839;0 +2839;2840;0 +2840;2841;0 +2841;2842;0 +2842;2843;0 +2843;2844;0 +2844;2845;0 +2845;2846;0 +2846;2847;0 +2847;2848;0 +2848;2849;0 +2849;2850;0 +2850;2851;0 +2851;2852;0 +2852;2853;0 +2853;2854;0 +2854;2855;0 +2855;2856;0 +2856;2857;0 +2857;2858;0 +2858;2859;0 +2859;2860;0 +2860;2861;0 +2861;2862;0 +2862;2863;0 +2863;2864;0 +2864;2865;0 +2865;2866;0 +2866;2867;0 +2867;2868;0 +2868;2869;0 +2869;2870;0 +2870;2871;0 +2871;2872;0 +2872;2873;0 +2873;2874;0 +2874;2875;0 +2875;2876;0 +2876;2877;0 +2877;2878;0 +2878;2879;0 +2879;2880;0 +2880;2881;0 +2881;2882;0 +2882;2883;0 +2883;2884;0 +2884;2885;0 +2885;2886;0 +2886;2887;0 +2887;2888;0 +2888;2889;0 +2889;2890;0 +2890;2891;0 +2891;2892;0 +2892;2893;0 +2893;2894;0 +2894;2895;0 +2895;2896;0 +2896;2897;0 +2897;2898;0 +2898;2899;0 +2899;2900;0 +2900;2901;0 +2901;2902;0 +2902;2903;0 +2903;2904;0 +2904;2905;0 +2905;2906;0 +2906;2907;0 +2907;2908;0 +2908;2909;0 +2909;2910;0 +2910;2911;0 +2911;2912;0 +2912;2913;0 +2913;2914;0 +2914;2915;0 +2915;2916;0 +2916;2917;0 +2917;2918;0 +2918;2919;0 +2919;2920;0 +2920;2921;0 +2921;2922;0 +2922;2923;0 +2923;2924;0 +2924;2925;0 +2925;2926;0 +2926;2927;0 +2927;2928;0 +2928;2929;0 +2929;2930;0 +2930;2931;0 +2931;2932;0 +2932;2933;0 +2933;2934;0 +2934;2935;0 +2935;2936;0 +2936;2937;0 +2937;2938;0 +2938;2939;0 +2939;2940;0 +2940;2941;0 +2941;2942;0 +2942;2943;0 +2943;2944;0 +2944;2945;0 +2945;2946;0 +2946;2947;0 +2947;2948;0 +2948;2949;0 +2949;2950;0 +2950;2951;0 +2951;2952;0 +2952;2953;0 +2953;2954;0 +2954;2955;0 +2955;2956;0 +2956;2957;0 +2957;2958;0 +2958;2959;0 +2959;2960;0 +2960;2961;0 +2961;2962;0 +2962;2963;0 +2963;2964;0 +2964;2965;0 +2965;2966;0 +2966;2967;0 +2967;2968;0 +2968;2969;0 +2969;2970;0 +2970;2971;0 +2971;2972;0 +2972;2973;0 +2973;2974;0 +2974;2975;0 +2975;2976;0 +2976;2977;0 +2977;2978;0 +2978;2979;0 +2979;2980;0 +2980;2981;0 +2981;2982;0 +2982;2983;0 +2983;2984;0 +2984;2985;0 +2985;2986;0 +2986;2987;0 +2987;2988;0 +2988;2989;0 +2989;2990;0 +2990;2991;0 +2991;2992;0 +2992;2993;0 +2993;2994;0 +2994;2995;0 +2995;2996;0 +2996;2997;0 +2997;2998;0 +2998;2999;0 +2999;3000;0 +3000;3001;0 +3001;3002;0 +3002;3003;0 +3003;3004;0 +3004;3005;0 +3005;3006;0 +3006;3007;0 +3007;3008;0 +3008;3009;0 +3009;3010;0 +3010;3011;0 +3011;3012;0 +3012;3013;0 +3013;3014;0 +3014;3015;0 +3015;3016;0 +3016;3017;0 +3017;3018;0 +3018;3019;0 +3019;3020;0 +3020;3021;0 +3021;3022;0 +3022;3023;0 +3023;3024;0 +3024;3025;0 +3025;3026;0 +3026;3027;0 +3027;3028;0 +3028;3029;0 +3029;3030;0 +3030;3031;0 +3031;3032;0 +3032;3033;0 +3033;3034;0 +3034;3035;0 +3035;3036;0 +3036;3037;0 +3037;3038;0 +3038;3039;0 +3039;3040;0 +3040;3041;0 +3041;3042;0 +3042;3043;0 +3043;3044;0 +3044;3045;0 +3045;3046;0 +3046;3047;0 +3047;3048;0 +3048;3049;0 +3049;3050;0 +3050;3051;0 +3051;3052;0 +3052;3053;0 +3053;3054;0 +3054;3055;0 +3055;3056;0 +3056;3057;0 +3057;3058;0 +3058;3059;0 +3059;3060;0 +3060;3061;0 +3061;3062;0 +3062;3063;0 +3063;3064;0 +3064;3065;0 +3065;3066;0 +3066;3067;0 +3067;3068;0 +3068;3069;0 +3069;3070;0 +3070;3071;0 +3071;3072;0 +3072;3073;0 +3073;3074;0 +3074;3075;0 +3075;3076;0 +3076;3077;0 +3077;3078;0 +3078;3079;0 +3079;3080;0 +3080;3081;0 +3081;3082;0 +3082;3083;0 +3083;3084;0 +3084;3085;0 +3085;3086;0 +3086;3087;0 +3087;3088;0 +3088;3089;0 +3089;3090;0 +3090;3091;0 +3091;3092;0 +3092;3093;0 +3093;3094;0 +3094;3095;0 +3095;3096;0 +3096;3097;0 +3097;3098;0 +3098;3099;0 +3099;3100;0 +3100;3101;0 +3101;3102;0 +3102;3103;0 +3103;3104;0 +3104;3105;0 +3105;3106;0 +3106;3107;0 +3107;3108;0 +3108;3109;0 +3109;3110;0 +3110;3111;0 +3111;3112;0 +3112;3113;0 +3113;3114;0 +3114;3115;0 +3115;3116;0 +3116;3117;0 +3117;3118;0 +3118;3119;0 +3119;3120;0 +3120;3121;0 +3121;3122;0 +3122;3123;0 +3123;3124;0 +3124;3125;0 +3125;3126;0 +3126;3127;0 +3127;3128;0 +3128;3129;0 +3129;3130;0 +3130;3131;0 +3131;3132;0 +3132;3133;0 +3133;3134;0 +3134;3135;0 +3135;3136;0 +3136;3137;0 +3137;3138;0 +3138;3139;0 +3139;3140;0 +3140;3141;0 +3141;3142;0 +3142;3143;0 +3143;3144;0 +3144;3145;0 +3145;3146;0 +3146;3147;0 +3147;3148;0 +3148;3149;0 +3149;3150;0 +3150;3151;0 +3151;3152;0 +3152;3153;0 +3153;3154;0 +3154;3155;0 +3155;3156;0 +3156;3157;0 +3157;3158;0 +3158;3159;0 +3159;3160;0 +3160;3161;0 +3161;3162;0 +3162;3163;0 +3163;3164;0 +3164;3165;0 +3165;3166;0 +3166;3167;0 +3167;3168;0 +3168;3169;0 +3169;3170;0 +3170;3171;0 +3171;3172;0 +3172;3173;0 +3173;3174;0 +3174;3175;0 +3175;3176;0 +3176;3177;0 +3177;3178;0 +3178;3179;0 +3179;3180;0 +3180;3181;0 +3181;3182;0 +3182;3183;0 +3183;3184;0 +3184;3185;0 +3185;3186;0 +3186;3187;0 +3187;3188;0 +3188;3189;0 +3189;3190;0 +3190;3191;0 +3191;3192;0 +3192;3193;0 +3193;3194;0 +3194;3195;0 +3195;3196;0 +3196;3197;0 +3197;3198;0 +3198;3199;0 +3199;3200;0 +3200;3201;0 +3201;3202;0 +3202;3203;0 +3203;3204;0 +3204;3205;0 +3205;3206;0 +3206;3207;0 +3207;3208;0 +3208;3209;0 +3209;3210;0 +3210;3211;0 +3211;3212;0 +3212;3213;0 +3213;3214;0 +3214;3215;0 +3215;3216;0 +3216;3217;0 +3217;3218;0 +3218;3219;0 +3219;3220;0 +3220;3221;0 +3221;3222;0 +3222;3223;0 +3223;3224;0 +3224;3225;0 +3225;3226;0 +3226;3227;0 +3227;3228;0 +3228;3229;0 +3229;3230;0 +3230;3231;0 +3231;3232;0 +3232;3233;0 +3233;3234;0 +3234;3235;0 +3235;3236;0 +3236;3237;0 +3237;3238;0 +3238;3239;0 +3239;3240;0 +3240;3241;0 +3241;3242;0 +3242;3243;0 +3243;3244;0 +3244;3245;0 +3245;3246;0 +3246;3247;0 +3247;3248;0 +3248;3249;0 +3249;3250;0 +3250;3251;0 +3251;3252;0 +3252;3253;0 +3253;3254;0 +3254;3255;0 +3255;3256;0 +3256;3257;0 +3257;3258;0 +3258;3259;0 +3259;3260;0 +3260;3261;0 +3261;3262;0 +3262;3263;0 +3263;3264;0 +3264;3265;0 +3265;3266;0 +3266;3267;0 +3267;3268;0 +3268;3269;0 +3269;3270;0 +3270;3271;0 +3271;3272;0 +3272;3273;0 +3273;3274;0 +3274;3275;0 +3275;3276;0 +3276;3277;0 +3277;3278;0 +3278;3279;0 +3279;3280;0 +3280;3281;0 +3281;3282;0 +3282;3283;0 +3283;3284;0 +3284;3285;0 +3285;3286;0 +3286;3287;0 +3287;3288;0 +3288;3289;0 +3289;3290;0 +3290;3291;0 +3291;3292;0 +3292;3293;0 +3293;3294;0 +3294;3295;0 +3295;3296;0 +3296;3297;0 +3297;3298;0 +3298;3299;0 +3299;3300;0 +3300;3301;0 +3301;3302;0 +3302;3303;0 +3303;3304;0 +3304;3305;0 +3305;3306;0 +3306;3307;0 +3307;3308;0 +3308;3309;0 +3309;3310;0 +3310;3311;0 +3311;3312;0 +3312;3313;0 +3313;3314;0 +3314;3315;0 +3315;3316;0 +3316;3317;0 +3317;3318;0 +3318;3319;0 +3319;3320;0 +3320;3321;0 +3321;3322;0 +3322;3323;0 +3323;3324;0 +3324;3325;0 +3325;3326;0 +3326;3327;0 +3327;3328;0 +3328;3329;0 +3329;3330;0 +3330;3331;0 +3331;3332;0 +3332;3333;0 +3333;3334;0 +3334;3335;0 +3335;3336;0 +3336;3337;0 +3337;3338;0 +3338;3339;0 +3339;3340;0 +3340;3341;0 +3341;3342;0 +3342;3343;0 +3343;3344;0 +3344;3345;0 +3345;3346;0 +3346;3347;0 +3347;3348;0 +3348;3349;0 +3349;3350;0 +3350;3351;0 +3351;3352;0 +3352;3353;0 +3353;3354;0 +3354;3355;0 +3355;3356;0 +3356;3357;0 +3357;3358;0 +3358;3359;0 +3359;3360;0 +3360;3361;0 +3361;3362;0 +3362;3363;0 +3363;3364;0 +3364;3365;0 +3365;3366;0 +3366;3367;0 +3367;3368;0 +3368;3369;0 +3369;3370;0 +3370;3371;0 +3371;3372;0 +3372;3373;0 +3373;3374;0 +3374;3375;0 +3375;3376;0 +3376;3377;0 +3377;3378;0 +3378;3379;0 +3379;3380;0 +3380;3381;0 +3381;3382;0 +3382;3383;0 +3383;3384;0 +3384;3385;0 +3385;3386;0 +3386;3387;0 +3387;3388;0 +3388;3389;0 +3389;3390;0 +3390;3391;0 +3391;3392;0 +3392;3393;0 +3393;3394;0 +3394;3395;0 +3395;3396;0 +3396;3397;0 +3397;3398;0 +3398;3399;0 +3399;3400;0 +3400;3401;0 +3401;3402;0 +3402;3403;0 +3403;3404;0 +3404;3405;0 +3405;3406;0 +3406;3407;0 +3407;3408;0 +3408;3409;0 +3409;3410;0 +3410;3411;0 +3411;3412;0 +3412;3413;0 +3413;3414;0 +3414;3415;0 +3415;3416;0 +3416;3417;0 +3417;3418;0 +3418;3419;0 +3419;3420;0 +3420;3421;0 +3421;3422;0 +3422;3423;0 +3423;3424;0 +3424;3425;0 +3425;3426;0 +3426;3427;0 +3427;3428;0 +3428;3429;0 +3429;3430;0 +3430;3431;0 +3431;3432;0 +3432;3433;0 +3433;3434;0 +3434;3435;0 +3435;3436;0 +3436;3437;0 +3437;3438;0 +3438;3439;0 +3439;3440;0 +3440;3441;0 +3441;3442;0 +3442;3443;0 +3443;3444;0 +3444;3445;0 +3445;3446;0 +3446;3447;0 +3447;3448;0 +3448;3449;0 +3449;3450;0 +3450;3451;0 +3451;3452;0 +3452;3453;0 +3453;3454;0 +3454;3455;0 +3455;3456;0 +3456;3457;0 +3457;3458;0 +3458;3459;0 +3459;3460;0 +3460;3461;0 +3461;3462;0 +3462;3463;0 +3463;3464;0 +3464;3465;0 +3465;3466;0 +3466;3467;0 +3467;3468;0 +3468;3469;0 +3469;3470;0 +3470;3471;0 +3471;3472;0 +3472;3473;0 +3473;3474;0 +3474;3475;0 +3475;3476;0 +3476;3477;0 +3477;3478;0 +3478;3479;0 +3479;3480;0 +3480;3481;0 +3481;3482;0 +3482;3483;0 +3483;3484;0 +3484;3485;0 +3485;3486;0 +3486;3487;0 +3487;3488;0 +3488;3489;0 +3489;3490;0 +3490;3491;0 +3491;3492;0 +3492;3493;0 +3493;3494;0 +3494;3495;0 +3495;3496;0 +3496;3497;0 +3497;3498;0 +3498;3499;0 +3499;3500;0 +3500;3501;0 +3501;3502;0 +3502;3503;0 +3503;3504;0 +3504;3505;0 +3505;3506;0 +3506;3507;0 +3507;3508;0 +3508;3509;0 +3509;3510;0 +3510;3511;0 +3511;3512;0 +3512;3513;0 +3513;3514;0 +3514;3515;0 +3515;3516;0 +3516;3517;0 +3517;3518;0 +3518;3519;0 +3519;3520;0 +3520;3521;0 +3521;3522;0 +3522;3523;0 +3523;3524;0 +3524;3525;0 +3525;3526;0 +3526;3527;0 +3527;3528;0 +3528;3529;0 +3529;3530;0 +3530;3531;0 +3531;3532;0 +3532;3533;0 +3533;3534;0 +3534;3535;0 +3535;3536;0 +3536;3537;0 +3537;3538;0 +3538;3539;0 +3539;3540;0 +3540;3541;0 +3541;3542;0 +3542;3543;0 +3543;3544;0 +3544;3545;0 +3545;3546;0 +3546;3547;0 +3547;3548;0 +3548;3549;0 +3549;3550;0 +3550;3551;0 +3551;3552;0 +3552;3553;0 +3553;3554;0 +3554;3555;0 +3555;3556;0 +3556;2077;0 +3557;3558;0 +3558;3559;0 +3559;3560;0 +3560;3561;0 +3561;3562;0 +3562;3563;0 +3563;3564;0 +3564;3565;0 +3565;3566;0 +3566;3567;0 +3567;3568;0 +3568;3569;0 +3569;3570;0 +3570;3571;0 +3571;3572;0 +3572;3573;0 +3573;3574;0 +3574;3575;0 +3575;3576;0 +3576;3577;0 +3577;3578;0 +3578;3579;0 +3579;3580;0 +3580;3581;0 +3581;3582;0 +3582;3583;0 +3583;3584;0 +3584;3585;0 +3585;3586;0 +3586;3587;0 +3587;3588;0 +3588;3589;0 +3589;3590;0 +3590;3591;0 +3591;3592;0 +3592;3593;0 +3593;3594;0 +3594;3595;0 +3595;3596;0 +3596;3597;0 +3597;3598;0 +3598;3599;0 +3599;3600;0 +3600;3601;0 +3601;3602;0 +3602;3603;0 +3603;3604;0 +3604;3605;0 +3605;3606;0 +3606;3607;0 +3607;3608;0 +3608;3609;0 +3609;3610;0 +3610;3611;0 +3611;3612;0 +3612;3613;0 +3613;3614;0 +3614;3615;0 +3615;3616;0 +3616;3617;0 +3617;3618;0 +3618;3619;0 +3619;3620;0 +3620;3621;0 +3621;3622;0 +3622;3623;0 +3623;3624;0 +3624;3625;0 +3625;3626;0 +3626;3627;0 +3627;3628;0 +3628;3629;0 +3629;3630;0 +3630;3631;0 +3631;3632;0 +3632;3633;0 +3633;3634;0 +3634;3635;0 +3635;3636;0 +3636;3637;0 +3637;3638;0 +3638;3639;0 +3639;3640;0 +3640;3641;0 +3641;3642;0 +3642;3643;0 +3643;3644;0 +3644;3645;0 +3645;3646;0 +3646;3647;0 +3647;3648;0 +3648;3649;0 +3649;3650;0 +3650;3651;0 +3651;3652;0 +3652;3653;0 +3653;3654;0 +3654;3655;0 +3655;3656;0 +3656;3657;0 +3657;3658;0 +3658;3659;0 +3659;3660;0 +3660;3661;0 +3661;3662;0 +3662;3663;0 +3663;3664;0 +3664;3665;0 +3665;3666;0 +3666;3667;0 +3667;3668;0 +3668;3669;0 +3669;3670;0 +3670;3671;0 +3671;3672;0 +3672;3673;0 +3673;3674;0 +3674;3675;0 +3675;3676;0 +3676;3677;0 +3677;3678;0 +3678;3679;0 +3679;3680;0 +3680;3681;0 +3681;3682;0 +3682;3683;0 +3683;3684;0 +3684;3685;0 +3685;3686;0 +3686;3687;0 +3687;3688;0 +3688;3689;0 +3689;3690;0 +3690;3691;0 +3691;3692;0 +3692;3693;0 +3693;3694;0 +3694;3695;0 +3695;3696;0 +3696;3697;0 +3697;3698;0 +3698;3699;0 +3699;3700;0 +3700;3701;0 +3701;3702;0 +3702;3703;0 +3703;3704;0 +3704;3705;0 +3705;3706;0 +3706;3707;0 +3707;3708;0 +3708;3709;0 +3709;3710;0 +3710;3711;0 +3711;3712;0 +3712;3713;0 +3713;3714;0 +3714;3715;0 +3715;3716;0 +3716;3717;0 +3717;3718;0 +3718;3719;0 +3719;3720;0 +3720;3721;0 +3721;3722;0 +3722;3723;0 +3723;3724;0 +3724;3725;0 +3725;3726;0 +3726;3727;0 +3727;3728;0 +3728;3729;0 +3729;3730;0 +3730;3731;0 +3731;3732;0 +3732;3733;0 +3733;3734;0 +3734;3735;0 +3735;3736;0 +3736;3737;0 +3737;3738;0 +3738;3739;0 +3739;3740;0 +3740;3741;0 +3741;3742;0 +3742;3743;0 +3743;3744;0 +3744;3745;0 +3745;3746;0 +3746;3747;0 +3747;3748;0 +3748;3749;0 +3749;3750;0 +3750;3751;0 +3751;3752;0 +3752;3753;0 +3753;3754;0 +3754;3755;0 +3755;3756;0 +3756;3757;0 +3757;3758;0 +3758;3759;0 +3759;3760;0 +3760;3761;0 +3761;3762;0 +3762;3763;0 +3763;3764;0 +3764;3765;0 +3765;3766;0 +3766;3767;0 +3767;3768;0 +3768;3769;0 +3769;3770;0 +3770;3771;0 +3771;3772;0 +3772;3773;0 +3773;3774;0 +3774;3775;0 +3775;3776;0 +3776;3777;0 +3777;3778;0 +3778;3779;0 +3779;3780;0 +3780;3781;0 +3781;3782;0 +3782;3783;0 +3783;3784;0 +3784;3785;0 +3785;3786;0 +3786;3787;0 +3787;3788;0 +3788;3789;0 +3789;3790;0 +3790;3791;0 +3791;3792;0 +3792;3793;0 +3793;3794;0 +3794;3795;0 +3795;3796;0 +3796;3797;0 +3797;3798;0 +3798;3799;0 +3799;3800;0 +3800;3801;0 +3801;3802;0 +3802;3803;0 +3803;3804;0 +3804;3805;0 +3805;3806;0 +3806;3807;0 +3807;3808;0 +3808;3809;0 +3809;3810;0 +3810;3811;0 +3811;3812;0 +3812;3813;0 +3813;3814;0 +3814;3815;0 +3815;3816;0 +3816;3817;0 +3817;3818;0 +3818;3819;0 +3819;3820;0 +3820;3821;0 +3821;3822;0 +3822;3823;0 +3823;3824;0 +3824;3825;0 +3825;3826;0 +3826;3827;0 +3827;3828;0 +3828;3829;0 +3829;3830;0 +3830;3831;0 +3831;3832;0 +3832;3833;0 +3833;3834;0 +3834;3835;0 +3835;3836;0 +3836;3837;0 +3837;3838;0 +3838;3839;0 +3839;3840;0 +3840;3841;0 +3841;3842;0 +3842;3843;0 +3843;3844;0 +3844;3845;0 +3845;3846;0 +3846;3847;0 +3847;3848;0 +3848;3849;0 +3849;3850;0 +3850;3851;0 +3851;3852;0 +3852;3853;0 +3853;3854;0 +3854;3855;0 +3855;3856;0 +3856;3857;0 +3857;3858;0 +3858;3859;0 +3859;3860;0 +3860;3861;0 +3861;3862;0 +3862;3863;0 +3863;3864;0 +3864;3865;0 +3865;3866;0 +3866;3867;0 +3867;3868;0 +3868;3869;0 +3869;3870;0 +3870;3871;0 +3871;3872;0 +3872;3873;0 +3873;3874;0 +3874;3875;0 +3875;3876;0 +3876;3877;0 +3877;3878;0 +3878;3879;0 +3879;3880;0 +3880;3881;0 +3881;3882;0 +3882;3883;0 +3883;3884;0 +3884;3885;0 +3885;3886;0 +3886;3887;0 +3887;3888;0 +3888;3889;0 +3889;3890;0 +3890;3891;0 +3891;3892;0 +3892;3893;0 +3893;3894;0 +3894;3895;0 +3895;3896;0 +3896;3897;0 +3897;3898;0 +3898;3899;0 +3899;3900;0 +3900;3901;0 +3901;3902;0 +3902;3903;0 +3903;3904;0 +3904;3905;0 +3905;3906;0 +3906;3907;0 +3907;3908;0 +3908;3909;0 +3909;3910;0 +3910;3911;0 +3911;3912;0 +3912;3913;0 +3913;3914;0 +3914;3915;0 +3915;3916;0 +3916;3917;0 +3917;3918;0 +3918;3919;0 +3919;3920;0 +3920;3921;0 +3921;3922;0 +3922;3923;0 +3923;3924;0 +3924;3925;0 +3925;3926;0 +3926;3927;0 +3927;3928;0 +3928;3929;0 +3929;3930;0 +3930;3931;0 +3931;3932;0 +3932;3933;0 +3933;3934;0 +3934;3935;0 +3935;3936;0 +3936;3937;0 +3937;3938;0 +3938;3939;0 +3939;3940;0 +3940;3941;0 +3941;3942;0 +3942;3943;0 +3943;3944;0 +3944;3945;0 +3945;3946;0 +3946;3947;0 +3947;3948;0 +3948;3949;0 +3949;3950;0 +3950;3951;0 +3951;3952;0 +3952;3953;0 +3953;3954;0 +3954;3955;0 +3955;3956;0 +3956;3957;0 +3957;3958;0 +3958;3959;0 +3959;3960;0 +3960;3961;0 +3961;3962;0 +3962;3963;0 +3963;3964;0 +3964;3965;0 +3965;3966;0 +3966;3967;0 +3967;3968;0 +3968;3969;0 +3969;3970;0 +3970;3971;0 +3971;3972;0 +3972;3973;0 +3973;3974;0 +3974;3975;0 +3975;3976;0 +3976;3977;0 +3977;3978;0 +3978;3979;0 +3979;3980;0 +3980;3981;0 +3981;3982;0 +3982;3983;0 +3983;3984;0 +3984;3985;0 +3985;3986;0 +3986;3987;0 +3987;3988;0 +3988;3989;0 +3989;3990;0 +3990;3991;0 +3991;3992;0 +3992;3993;0 +3993;3994;0 +3994;3995;0 +3995;3996;0 +3996;3997;0 +3997;3998;0 +3998;3999;0 +3999;4000;0 +4000;4001;0 +4001;4002;0 +4002;4003;0 +4003;4004;0 +4004;4005;0 +4005;4006;0 +4006;4007;0 +4007;4008;0 +4008;4009;0 +4009;4010;0 +4010;4011;0 +4011;4012;0 +4012;4013;0 +4013;4014;0 +4014;4015;0 +4015;4016;0 +4016;4017;0 +4017;4018;0 +4018;4019;0 +4019;4020;0 +4020;4021;0 +4021;4022;0 +4022;4023;0 +4023;4024;0 +4024;4025;0 +4025;4026;0 +4026;4027;0 +4027;4028;0 +4028;4029;0 +4029;4030;0 +4030;4031;0 +4031;4032;0 +4032;4033;0 +4033;4034;0 +4034;4035;0 +4035;4036;0 +4036;4037;0 +4037;4038;0 +4038;4039;0 +4039;4040;0 +4040;4041;0 +4041;4042;0 +4042;4043;0 +4043;4044;0 +4044;4045;0 +4045;4046;0 +4046;4047;0 +4047;4048;0 +4048;4049;0 +4049;4050;0 +4050;4051;0 +4051;4052;0 +4052;4053;0 +4053;4054;0 +4054;4055;0 +4055;4056;0 +4056;4057;0 +4057;4058;0 +4058;4059;0 +4059;4060;0 +4060;4061;0 +4061;4062;0 +4062;4063;0 +4063;4064;0 +4064;4065;0 +4065;4066;0 +4066;4067;0 +4067;4068;0 +4068;4069;0 +4069;4070;0 +4070;4071;0 +4071;4072;0 +4072;4073;0 +4073;4074;0 +4074;4075;0 +4075;4076;0 +4076;4077;0 +4077;4078;0 +4078;4079;0 +4079;4080;0 +4080;4081;0 +4081;4082;0 +4082;4083;0 +4083;4084;0 +4084;4085;0 +4085;4086;0 +4086;4087;0 +4087;4088;0 +4088;4089;0 +4089;4090;0 +4090;4091;0 +4091;4092;0 +4092;4093;0 +4093;4094;0 +4094;4095;0 +4095;3557;0 +4096;4097;0 +4097;4098;0 +4098;4099;0 +4099;4100;0 +4100;4101;0 +4101;4102;0 +4102;4103;0 +4103;4104;0 +4104;4105;0 +4105;4106;0 +4106;4107;0 +4107;4108;0 +4108;4109;0 +4109;4110;0 +4110;4111;0 +4111;4112;0 +4112;4113;0 +4113;4114;0 +4114;4115;0 +4115;4116;0 +4116;4117;0 +4117;4118;0 +4118;4119;0 +4119;4120;0 +4120;4121;0 +4121;4122;0 +4122;4123;0 +4123;4124;0 +4124;4125;0 +4125;4126;0 +4126;4127;0 +4127;4128;0 +4128;4129;0 +4129;4130;0 +4130;4131;0 +4131;4132;0 +4132;4133;0 +4133;4134;0 +4134;4135;0 +4135;4136;0 +4136;4137;0 +4137;4138;0 +4138;4139;0 +4139;4140;0 +4140;4141;0 +4141;4142;0 +4142;4143;0 +4143;4144;0 +4144;4145;0 +4145;4146;0 +4146;4147;0 +4147;4148;0 +4148;4149;0 +4149;4150;0 +4150;4151;0 +4151;4152;0 +4152;4153;0 +4153;4154;0 +4154;4155;0 +4155;4156;0 +4156;4157;0 +4157;4158;0 +4158;4159;0 +4159;4160;0 +4160;4161;0 +4161;4162;0 +4162;4163;0 +4163;4164;0 +4164;4165;0 +4165;4166;0 +4166;4167;0 +4167;4168;0 +4168;4169;0 +4169;4170;0 +4170;4171;0 +4171;4172;0 +4172;4173;0 +4173;4174;0 +4174;4175;0 +4175;4176;0 +4176;4177;0 +4177;4178;0 +4178;4179;0 +4179;4180;0 +4180;4181;0 +4181;4182;0 +4182;4183;0 +4183;4184;0 +4184;4185;0 +4185;4186;0 +4186;4187;0 +4187;4188;0 +4188;4189;0 +4189;4190;0 +4190;4191;0 +4191;4192;0 +4192;4193;0 +4193;4194;0 +4194;4195;0 +4195;4196;0 +4196;4197;0 +4197;4198;0 +4198;4199;0 +4199;4200;0 +4200;4201;0 +4201;4202;0 +4202;4203;0 +4203;4204;0 +4204;4205;0 +4205;4206;0 +4206;4207;0 +4207;4208;0 +4208;4209;0 +4209;4210;0 +4210;4211;0 +4211;4212;0 +4212;4213;0 +4213;4214;0 +4214;4215;0 +4215;4216;0 +4216;4217;0 +4217;4218;0 +4218;4219;0 +4219;4220;0 +4220;4221;0 +4221;4222;0 +4222;4223;0 +4223;4224;0 +4224;4225;0 +4225;4226;0 +4226;4227;0 +4227;4228;0 +4228;4229;0 +4229;4230;0 +4230;4231;0 +4231;4232;0 +4232;4233;0 +4233;4234;0 +4234;4235;0 +4235;4236;0 +4236;4237;0 +4237;4238;0 +4238;4239;0 +4239;4240;0 +4240;4241;0 +4241;4242;0 +4242;4243;0 +4243;4244;0 +4244;4245;0 +4245;4246;0 +4246;4247;0 +4247;4248;0 +4248;4249;0 +4249;4250;0 +4250;4251;0 +4251;4252;0 +4252;4253;0 +4253;4254;0 +4254;4255;0 +4255;4256;0 +4256;4257;0 +4257;4258;0 +4258;4259;0 +4259;4260;0 +4260;4261;0 +4261;4262;0 +4262;4263;0 +4263;4264;0 +4264;4265;0 +4265;4266;0 +4266;4267;0 +4267;4268;0 +4268;4269;0 +4269;4270;0 +4270;4271;0 +4271;4272;0 +4272;4273;0 +4273;4274;0 +4274;4275;0 +4275;4276;0 +4276;4277;0 +4277;4278;0 +4278;4279;0 +4279;4280;0 +4280;4281;0 +4281;4282;0 +4282;4283;0 +4283;4284;0 +4284;4285;0 +4285;4286;0 +4286;4287;0 +4287;4288;0 +4288;4289;0 +4289;4290;0 +4290;4291;0 +4291;4292;0 +4292;4293;0 +4293;4294;0 +4294;4295;0 +4295;4296;0 +4296;4297;0 +4297;4298;0 +4298;4299;0 +4299;4300;0 +4300;4301;0 +4301;4302;0 +4302;4303;0 +4303;4304;0 +4304;4305;0 +4305;4306;0 +4306;4307;0 +4307;4308;0 +4308;4309;0 +4309;4310;0 +4310;4311;0 +4311;4312;0 +4312;4313;0 +4313;4314;0 +4314;4315;0 +4315;4316;0 +4316;4317;0 +4317;4318;0 +4318;4319;0 +4319;4320;0 +4320;4321;0 +4321;4322;0 +4322;4323;0 +4323;4324;0 +4324;4325;0 +4325;4326;0 +4326;4327;0 +4327;4328;0 +4328;4329;0 +4329;4330;0 +4330;4331;0 +4331;4332;0 +4332;4333;0 +4333;4334;0 +4334;4335;0 +4335;4336;0 +4336;4337;0 +4337;4338;0 +4338;4339;0 +4339;4340;0 +4340;4341;0 +4341;4342;0 +4342;4343;0 +4343;4344;0 +4344;4345;0 +4345;4346;0 +4346;4347;0 +4347;4348;0 +4348;4349;0 +4349;4350;0 +4350;4351;0 +4351;4352;0 +4352;4353;0 +4353;4354;0 +4354;4355;0 +4355;4356;0 +4356;4357;0 +4357;4358;0 +4358;4359;0 +4359;4360;0 +4360;4361;0 +4361;4362;0 +4362;4363;0 +4363;4364;0 +4364;4365;0 +4365;4366;0 +4366;4367;0 +4367;4368;0 +4368;4369;0 +4369;4370;0 +4370;4371;0 +4371;4372;0 +4372;4373;0 +4373;4374;0 +4374;4375;0 +4375;4376;0 +4376;4377;0 +4377;4378;0 +4378;4379;0 +4379;4380;0 +4380;4381;0 +4381;4382;0 +4382;4383;0 +4383;4384;0 +4384;4385;0 +4385;4386;0 +4386;4387;0 +4387;4388;0 +4388;4096;0 +4389;4390;0 +4390;4391;0 +4391;4392;0 +4392;4393;0 +4393;4394;0 +4394;4395;0 +4395;4396;0 +4396;4397;0 +4397;4398;0 +4398;4399;0 +4399;4400;0 +4400;4401;0 +4401;4402;0 +4402;4403;0 +4403;4404;0 +4404;4405;0 +4405;4406;0 +4406;4407;0 +4407;4408;0 +4408;4409;0 +4409;4410;0 +4410;4411;0 +4411;4412;0 +4412;4413;0 +4413;4414;0 +4414;4415;0 +4415;4416;0 +4416;4417;0 +4417;4418;0 +4418;4419;0 +4419;4420;0 +4420;4421;0 +4421;4422;0 +4422;4423;0 +4423;4424;0 +4424;4425;0 +4425;4426;0 +4426;4427;0 +4427;4428;0 +4428;4429;0 +4429;4430;0 +4430;4431;0 +4431;4432;0 +4432;4433;0 +4433;4434;0 +4434;4435;0 +4435;4436;0 +4436;4437;0 +4437;4438;0 +4438;4439;0 +4439;4440;0 +4440;4441;0 +4441;4442;0 +4442;4443;0 +4443;4444;0 +4444;4445;0 +4445;4446;0 +4446;4447;0 +4447;4448;0 +4448;4449;0 +4449;4450;0 +4450;4451;0 +4451;4452;0 +4452;4453;0 +4453;4454;0 +4454;4455;0 +4455;4456;0 +4456;4457;0 +4457;4458;0 +4458;4459;0 +4459;4460;0 +4460;4461;0 +4461;4462;0 +4462;4463;0 +4463;4464;0 +4464;4465;0 +4465;4466;0 +4466;4467;0 +4467;4468;0 +4468;4469;0 +4469;4470;0 +4470;4471;0 +4471;4472;0 +4472;4473;0 +4473;4474;0 +4474;4475;0 +4475;4476;0 +4476;4477;0 +4477;4478;0 +4478;4479;0 +4479;4480;0 +4480;4481;0 +4481;4482;0 +4482;4483;0 +4483;4484;0 +4484;4485;0 +4485;4486;0 +4486;4487;0 +4487;4488;0 +4488;4489;0 +4489;4490;0 +4490;4491;0 +4491;4492;0 +4492;4493;0 +4493;4494;0 +4494;4495;0 +4495;4496;0 +4496;4497;0 +4497;4498;0 +4498;4499;0 +4499;4500;0 +4500;4501;0 +4501;4502;0 +4502;4503;0 +4503;4504;0 +4504;4505;0 +4505;4506;0 +4506;4507;0 +4507;4508;0 +4508;4509;0 +4509;4510;0 +4510;4511;0 +4511;4512;0 +4512;4513;0 +4513;4514;0 +4514;4515;0 +4515;4516;0 +4516;4517;0 +4517;4518;0 +4518;4519;0 +4519;4520;0 +4520;4521;0 +4521;4522;0 +4522;4523;0 +4523;4524;0 +4524;4525;0 +4525;4526;0 +4526;4527;0 +4527;4528;0 +4528;4529;0 +4529;4530;0 +4530;4531;0 +4531;4532;0 +4532;4533;0 +4533;4534;0 +4534;4535;0 +4535;4536;0 +4536;4537;0 +4537;4538;0 +4538;4539;0 +4539;4540;0 +4540;4541;0 +4541;4542;0 +4542;4543;0 +4543;4544;0 +4544;4545;0 +4545;4546;0 +4546;4547;0 +4547;4548;0 +4548;4549;0 +4549;4550;0 +4550;4551;0 +4551;4552;0 +4552;4553;0 +4553;4554;0 +4554;4555;0 +4555;4556;0 +4556;4557;0 +4557;4558;0 +4558;4559;0 +4559;4560;0 +4560;4561;0 +4561;4562;0 +4562;4563;0 +4563;4564;0 +4564;4565;0 +4565;4566;0 +4566;4567;0 +4567;4568;0 +4568;4569;0 +4569;4570;0 +4570;4571;0 +4571;4572;0 +4572;4573;0 +4573;4574;0 +4574;4575;0 +4575;4389;0 +4576;4577;0 +4577;4578;0 +4578;4579;0 +4579;4580;0 +4580;4581;0 +4581;4582;0 +4582;4583;0 +4583;4584;0 +4584;4585;0 +4585;4586;0 +4586;4587;0 +4587;4588;0 +4588;4589;0 +4589;4590;0 +4590;4591;0 +4591;4592;0 +4592;4593;0 +4593;4594;0 +4594;4595;0 +4595;4596;0 +4596;4597;0 +4597;4598;0 +4598;4599;0 +4599;4600;0 +4600;4601;0 +4601;4602;0 +4602;4603;0 +4603;4604;0 +4604;4605;0 +4605;4606;0 +4606;4607;0 +4607;4608;0 +4608;4609;0 +4609;4610;0 +4610;4611;0 +4611;4612;0 +4612;4613;0 +4613;4614;0 +4614;4615;0 +4615;4616;0 +4616;4617;0 +4617;4618;0 +4618;4619;0 +4619;4620;0 +4620;4621;0 +4621;4622;0 +4622;4623;0 +4623;4624;0 +4624;4625;0 +4625;4626;0 +4626;4627;0 +4627;4628;0 +4628;4629;0 +4629;4630;0 +4630;4631;0 +4631;4632;0 +4632;4633;0 +4633;4634;0 +4634;4635;0 +4635;4636;0 +4636;4637;0 +4637;4638;0 +4638;4639;0 +4639;4640;0 +4640;4641;0 +4641;4642;0 +4642;4643;0 +4643;4644;0 +4644;4645;0 +4645;4646;0 +4646;4647;0 +4647;4648;0 +4648;4649;0 +4649;4650;0 +4650;4651;0 +4651;4652;0 +4652;4653;0 +4653;4654;0 +4654;4655;0 +4655;4656;0 +4656;4657;0 +4657;4658;0 +4658;4659;0 +4659;4660;0 +4660;4661;0 +4661;4662;0 +4662;4663;0 +4663;4664;0 +4664;4665;0 +4665;4666;0 +4666;4667;0 +4667;4668;0 +4668;4669;0 +4669;4670;0 +4670;4671;0 +4671;4672;0 +4672;4673;0 +4673;4674;0 +4674;4675;0 +4675;4676;0 +4676;4677;0 +4677;4678;0 +4678;4679;0 +4679;4680;0 +4680;4681;0 +4681;4682;0 +4682;4683;0 +4683;4684;0 +4684;4685;0 +4685;4686;0 +4686;4687;0 +4687;4688;0 +4688;4689;0 +4689;4690;0 +4690;4691;0 +4691;4692;0 +4692;4693;0 +4693;4694;0 +4694;4695;0 +4695;4696;0 +4696;4697;0 +4697;4576;0 +4698;4699;0 +4699;4700;0 +4700;4701;0 +4701;4702;0 +4702;4703;0 +4703;4704;0 +4704;4705;0 +4705;4706;0 +4706;4707;0 +4707;4708;0 +4708;4709;0 +4709;4710;0 +4710;4711;0 +4711;4712;0 +4712;4713;0 +4713;4714;0 +4714;4715;0 +4715;4716;0 +4716;4717;0 +4717;4718;0 +4718;4719;0 +4719;4720;0 +4720;4721;0 +4721;4722;0 +4722;4723;0 +4723;4724;0 +4724;4725;0 +4725;4726;0 +4726;4727;0 +4727;4728;0 +4728;4729;0 +4729;4730;0 +4730;4731;0 +4731;4732;0 +4732;4733;0 +4733;4734;0 +4734;4735;0 +4735;4736;0 +4736;4737;0 +4737;4738;0 +4738;4739;0 +4739;4740;0 +4740;4741;0 +4741;4742;0 +4742;4743;0 +4743;4744;0 +4744;4745;0 +4745;4746;0 +4746;4747;0 +4747;4748;0 +4748;4749;0 +4749;4750;0 +4750;4751;0 +4751;4752;0 +4752;4753;0 +4753;4754;0 +4754;4755;0 +4755;4756;0 +4756;4757;0 +4757;4758;0 +4758;4759;0 +4759;4760;0 +4760;4761;0 +4761;4762;0 +4762;4763;0 +4763;4764;0 +4764;4765;0 +4765;4766;0 +4766;4767;0 +4767;4768;0 +4768;4769;0 +4769;4770;0 +4770;4771;0 +4771;4772;0 +4772;4773;0 +4773;4774;0 +4774;4775;0 +4775;4776;0 +4776;4777;0 +4777;4778;0 +4778;4779;0 +4779;4780;0 +4780;4781;0 +4781;4782;0 +4782;4783;0 +4783;4784;0 +4784;4785;0 +4785;4786;0 +4786;4787;0 +4787;4788;0 +4788;4789;0 +4789;4790;0 +4790;4791;0 +4791;4792;0 +4792;4793;0 +4793;4794;0 +4794;4795;0 +4795;4796;0 +4796;4797;0 +4797;4798;0 +4798;4799;0 +4799;4800;0 +4800;4801;0 +4801;4802;0 +4802;4803;0 +4803;4804;0 +4804;4805;0 +4805;4806;0 +4806;4807;0 +4807;4808;0 +4808;4809;0 +4809;4810;0 +4810;4811;0 +4811;4698;0 +4812;4813;0 +4813;4814;0 +4814;4815;0 +4815;4816;0 +4816;4817;0 +4817;4818;0 +4818;4819;0 +4819;4820;0 +4820;4821;0 +4821;4822;0 +4822;4823;0 +4823;4824;0 +4824;4825;0 +4825;4826;0 +4826;4827;0 +4827;4828;0 +4828;4829;0 +4829;4830;0 +4830;4831;0 +4831;4832;0 +4832;4833;0 +4833;4834;0 +4834;4835;0 +4835;4836;0 +4836;4837;0 +4837;4838;0 +4838;4839;0 +4839;4840;0 +4840;4841;0 +4841;4842;0 +4842;4843;0 +4843;4844;0 +4844;4845;0 +4845;4846;0 +4846;4847;0 +4847;4848;0 +4848;4849;0 +4849;4850;0 +4850;4851;0 +4851;4852;0 +4852;4853;0 +4853;4854;0 +4854;4855;0 +4855;4856;0 +4856;4857;0 +4857;4858;0 +4858;4859;0 +4859;4860;0 +4860;4861;0 +4861;4862;0 +4862;4863;0 +4863;4864;0 +4864;4865;0 +4865;4866;0 +4866;4867;0 +4867;4868;0 +4868;4869;0 +4869;4870;0 +4870;4871;0 +4871;4872;0 +4872;4873;0 +4873;4874;0 +4874;4875;0 +4875;4876;0 +4876;4877;0 +4877;4878;0 +4878;4879;0 +4879;4880;0 +4880;4881;0 +4881;4882;0 +4882;4883;0 +4883;4884;0 +4884;4885;0 +4885;4886;0 +4886;4887;0 +4887;4888;0 +4888;4889;0 +4889;4890;0 +4890;4891;0 +4891;4892;0 +4892;4893;0 +4893;4894;0 +4894;4895;0 +4895;4896;0 +4896;4897;0 +4897;4898;0 +4898;4899;0 +4899;4900;0 +4900;4812;0 +4901;4902;0 +4902;4903;0 +4903;4904;0 +4904;4905;0 +4905;4906;0 +4906;4907;0 +4907;4908;0 +4908;4909;0 +4909;4910;0 +4910;4911;0 +4911;4912;0 +4912;4913;0 +4913;4914;0 +4914;4915;0 +4915;4916;0 +4916;4917;0 +4917;4918;0 +4918;4919;0 +4919;4920;0 +4920;4921;0 +4921;4922;0 +4922;4923;0 +4923;4924;0 +4924;4925;0 +4925;4926;0 +4926;4927;0 +4927;4928;0 +4928;4929;0 +4929;4930;0 +4930;4931;0 +4931;4932;0 +4932;4933;0 +4933;4934;0 +4934;4935;0 +4935;4936;0 +4936;4937;0 +4937;4938;0 +4938;4939;0 +4939;4940;0 +4940;4941;0 +4941;4942;0 +4942;4943;0 +4943;4944;0 +4944;4945;0 +4945;4946;0 +4946;4947;0 +4947;4948;0 +4948;4949;0 +4949;4950;0 +4950;4951;0 +4951;4952;0 +4952;4953;0 +4953;4954;0 +4954;4955;0 +4955;4956;0 +4956;4957;0 +4957;4958;0 +4958;4959;0 +4959;4960;0 +4960;4961;0 +4961;4962;0 +4962;4963;0 +4963;4964;0 +4964;4965;0 +4965;4966;0 +4966;4967;0 +4967;4968;0 +4968;4969;0 +4969;4970;0 +4970;4971;0 +4971;4972;0 +4972;4973;0 +4973;4974;0 +4974;4975;0 +4975;4976;0 +4976;4977;0 +4977;4978;0 +4978;4979;0 +4979;4980;0 +4980;4981;0 +4981;4982;0 +4982;4983;0 +4983;4984;0 +4984;4901;0 +4985;4986;0 +4986;4987;0 +4987;4988;0 +4988;4989;0 +4989;4990;0 +4990;4991;0 +4991;4992;0 +4992;4993;0 +4993;4994;0 +4994;4995;0 +4995;4996;0 +4996;4997;0 +4997;4998;0 +4998;4999;0 +4999;5000;0 +5000;5001;0 +5001;5002;0 +5002;5003;0 +5003;5004;0 +5004;5005;0 +5005;5006;0 +5006;5007;0 +5007;5008;0 +5008;5009;0 +5009;5010;0 +5010;5011;0 +5011;5012;0 +5012;5013;0 +5013;5014;0 +5014;5015;0 +5015;5016;0 +5016;5017;0 +5017;5018;0 +5018;5019;0 +5019;5020;0 +5020;5021;0 +5021;5022;0 +5022;5023;0 +5023;5024;0 +5024;5025;0 +5025;5026;0 +5026;5027;0 +5027;5028;0 +5028;5029;0 +5029;5030;0 +5030;5031;0 +5031;5032;0 +5032;5033;0 +5033;5034;0 +5034;5035;0 +5035;5036;0 +5036;5037;0 +5037;5038;0 +5038;5039;0 +5039;5040;0 +5040;5041;0 +5041;5042;0 +5042;5043;0 +5043;5044;0 +5044;5045;0 +5045;5046;0 +5046;5047;0 +5047;5048;0 +5048;5049;0 +5049;5050;0 +5050;5051;0 +5051;5052;0 +5052;5053;0 +5053;5054;0 +5054;5055;0 +5055;5056;0 +5056;5057;0 +5057;5058;0 +5058;5059;0 +5059;5060;0 +5060;5061;0 +5061;5062;0 +5062;5063;0 +5063;4985;0 +5064;5065;0 +5065;5066;0 +5066;5067;0 +5067;5068;0 +5068;5069;0 +5069;5070;0 +5070;5071;0 +5071;5072;0 +5072;5073;0 +5073;5074;0 +5074;5075;0 +5075;5076;0 +5076;5077;0 +5077;5078;0 +5078;5079;0 +5079;5080;0 +5080;5081;0 +5081;5082;0 +5082;5083;0 +5083;5084;0 +5084;5085;0 +5085;5086;0 +5086;5087;0 +5087;5088;0 +5088;5089;0 +5089;5090;0 +5090;5091;0 +5091;5092;0 +5092;5093;0 +5093;5094;0 +5094;5095;0 +5095;5096;0 +5096;5097;0 +5097;5098;0 +5098;5099;0 +5099;5100;0 +5100;5101;0 +5101;5102;0 +5102;5103;0 +5103;5104;0 +5104;5105;0 +5105;5106;0 +5106;5107;0 +5107;5108;0 +5108;5109;0 +5109;5110;0 +5110;5111;0 +5111;5112;0 +5112;5113;0 +5113;5114;0 +5114;5115;0 +5115;5116;0 +5116;5117;0 +5117;5118;0 +5118;5119;0 +5119;5120;0 +5120;5121;0 +5121;5122;0 +5122;5123;0 +5123;5124;0 +5124;5125;0 +5125;5126;0 +5126;5127;0 +5127;5128;0 +5128;5129;0 +5129;5130;0 +5130;5131;0 +5131;5132;0 +5132;5133;0 +5133;5134;0 +5134;5135;0 +5135;5136;0 +5136;5137;0 +5137;5138;0 +5138;5139;0 +5139;5140;0 +5140;5141;0 +5141;5142;0 +5142;5064;0 +5143;5144;0 +5144;5145;0 +5145;5146;0 +5146;5147;0 +5147;5148;0 +5148;5149;0 +5149;5150;0 +5150;5151;0 +5151;5152;0 +5152;5153;0 +5153;5154;0 +5154;5155;0 +5155;5156;0 +5156;5157;0 +5157;5158;0 +5158;5159;0 +5159;5160;0 +5160;5161;0 +5161;5162;0 +5162;5163;0 +5163;5164;0 +5164;5165;0 +5165;5166;0 +5166;5167;0 +5167;5168;0 +5168;5169;0 +5169;5170;0 +5170;5171;0 +5171;5172;0 +5172;5173;0 +5173;5174;0 +5174;5175;0 +5175;5176;0 +5176;5177;0 +5177;5178;0 +5178;5179;0 +5179;5180;0 +5180;5181;0 +5181;5182;0 +5182;5183;0 +5183;5184;0 +5184;5185;0 +5185;5186;0 +5186;5187;0 +5187;5188;0 +5188;5189;0 +5189;5190;0 +5190;5191;0 +5191;5192;0 +5192;5193;0 +5193;5194;0 +5194;5195;0 +5195;5196;0 +5196;5197;0 +5197;5198;0 +5198;5199;0 +5199;5200;0 +5200;5201;0 +5201;5202;0 +5202;5203;0 +5203;5204;0 +5204;5205;0 +5205;5206;0 +5206;5207;0 +5207;5208;0 +5208;5209;0 +5209;5210;0 +5210;5211;0 +5211;5212;0 +5212;5213;0 +5213;5214;0 +5214;5143;0 +5215;5216;0 +5216;5217;0 +5217;5218;0 +5218;5219;0 +5219;5220;0 +5220;5221;0 +5221;5222;0 +5222;5223;0 +5223;5224;0 +5224;5225;0 +5225;5226;0 +5226;5227;0 +5227;5228;0 +5228;5229;0 +5229;5230;0 +5230;5231;0 +5231;5232;0 +5232;5233;0 +5233;5234;0 +5234;5235;0 +5235;5236;0 +5236;5237;0 +5237;5238;0 +5238;5239;0 +5239;5240;0 +5240;5241;0 +5241;5242;0 +5242;5243;0 +5243;5244;0 +5244;5245;0 +5245;5246;0 +5246;5247;0 +5247;5248;0 +5248;5249;0 +5249;5250;0 +5250;5251;0 +5251;5252;0 +5252;5253;0 +5253;5254;0 +5254;5255;0 +5255;5256;0 +5256;5257;0 +5257;5258;0 +5258;5259;0 +5259;5260;0 +5260;5261;0 +5261;5262;0 +5262;5263;0 +5263;5264;0 +5264;5265;0 +5265;5266;0 +5266;5267;0 +5267;5268;0 +5268;5269;0 +5269;5270;0 +5270;5271;0 +5271;5272;0 +5272;5273;0 +5273;5274;0 +5274;5275;0 +5275;5276;0 +5276;5277;0 +5277;5278;0 +5278;5279;0 +5279;5280;0 +5280;5281;0 +5281;5282;0 +5282;5283;0 +5283;5284;0 +5284;5285;0 +5285;5286;0 +5286;5215;0 +5287;5288;0 +5288;5289;0 +5289;5290;0 +5290;5291;0 +5291;5292;0 +5292;5293;0 +5293;5294;0 +5294;5295;0 +5295;5296;0 +5296;5297;0 +5297;5298;0 +5298;5299;0 +5299;5300;0 +5300;5301;0 +5301;5302;0 +5302;5303;0 +5303;5304;0 +5304;5305;0 +5305;5306;0 +5306;5307;0 +5307;5308;0 +5308;5309;0 +5309;5310;0 +5310;5311;0 +5311;5312;0 +5312;5313;0 +5313;5314;0 +5314;5315;0 +5315;5316;0 +5316;5317;0 +5317;5318;0 +5318;5319;0 +5319;5320;0 +5320;5321;0 +5321;5322;0 +5322;5323;0 +5323;5324;0 +5324;5325;0 +5325;5326;0 +5326;5327;0 +5327;5328;0 +5328;5329;0 +5329;5330;0 +5330;5331;0 +5331;5332;0 +5332;5333;0 +5333;5334;0 +5334;5335;0 +5335;5336;0 +5336;5337;0 +5337;5338;0 +5338;5339;0 +5339;5340;0 +5340;5341;0 +5341;5342;0 +5342;5343;0 +5343;5344;0 +5344;5345;0 +5345;5346;0 +5346;5347;0 +5347;5348;0 +5348;5349;0 +5349;5350;0 +5350;5351;0 +5351;5352;0 +5352;5353;0 +5353;5354;0 +5354;5287;0 +5355;5356;0 +5356;5357;0 +5357;5358;0 +5358;5359;0 +5359;5360;0 +5360;5361;0 +5361;5362;0 +5362;5363;0 +5363;5364;0 +5364;5365;0 +5365;5366;0 +5366;5367;0 +5367;5368;0 +5368;5369;0 +5369;5370;0 +5370;5371;0 +5371;5372;0 +5372;5373;0 +5373;5374;0 +5374;5375;0 +5375;5376;0 +5376;5377;0 +5377;5378;0 +5378;5379;0 +5379;5380;0 +5380;5381;0 +5381;5382;0 +5382;5383;0 +5383;5384;0 +5384;5385;0 +5385;5386;0 +5386;5387;0 +5387;5388;0 +5388;5389;0 +5389;5390;0 +5390;5391;0 +5391;5392;0 +5392;5393;0 +5393;5394;0 +5394;5395;0 +5395;5396;0 +5396;5397;0 +5397;5398;0 +5398;5399;0 +5399;5400;0 +5400;5401;0 +5401;5402;0 +5402;5403;0 +5403;5404;0 +5404;5405;0 +5405;5406;0 +5406;5407;0 +5407;5408;0 +5408;5409;0 +5409;5410;0 +5410;5411;0 +5411;5412;0 +5412;5413;0 +5413;5414;0 +5414;5415;0 +5415;5416;0 +5416;5417;0 +5417;5418;0 +5418;5419;0 +5419;5420;0 +5420;5421;0 +5421;5355;0 +5422;5423;0 +5423;5424;0 +5424;5425;0 +5425;5426;0 +5426;5427;0 +5427;5428;0 +5428;5429;0 +5429;5430;0 +5430;5431;0 +5431;5432;0 +5432;5433;0 +5433;5434;0 +5434;5435;0 +5435;5436;0 +5436;5437;0 +5437;5438;0 +5438;5439;0 +5439;5440;0 +5440;5441;0 +5441;5442;0 +5442;5443;0 +5443;5444;0 +5444;5445;0 +5445;5446;0 +5446;5447;0 +5447;5448;0 +5448;5449;0 +5449;5450;0 +5450;5451;0 +5451;5452;0 +5452;5453;0 +5453;5454;0 +5454;5455;0 +5455;5456;0 +5456;5457;0 +5457;5458;0 +5458;5459;0 +5459;5460;0 +5460;5461;0 +5461;5462;0 +5462;5463;0 +5463;5464;0 +5464;5465;0 +5465;5466;0 +5466;5467;0 +5467;5468;0 +5468;5469;0 +5469;5470;0 +5470;5471;0 +5471;5472;0 +5472;5473;0 +5473;5474;0 +5474;5475;0 +5475;5476;0 +5476;5477;0 +5477;5478;0 +5478;5479;0 +5479;5480;0 +5480;5481;0 +5481;5482;0 +5482;5483;0 +5483;5422;0 +5484;5485;0 +5485;5486;0 +5486;5487;0 +5487;5488;0 +5488;5489;0 +5489;5490;0 +5490;5491;0 +5491;5492;0 +5492;5493;0 +5493;5494;0 +5494;5495;0 +5495;5496;0 +5496;5497;0 +5497;5498;0 +5498;5499;0 +5499;5500;0 +5500;5501;0 +5501;5502;0 +5502;5503;0 +5503;5504;0 +5504;5505;0 +5505;5506;0 +5506;5507;0 +5507;5508;0 +5508;5509;0 +5509;5510;0 +5510;5511;0 +5511;5512;0 +5512;5513;0 +5513;5514;0 +5514;5515;0 +5515;5516;0 +5516;5517;0 +5517;5518;0 +5518;5519;0 +5519;5520;0 +5520;5521;0 +5521;5522;0 +5522;5523;0 +5523;5524;0 +5524;5525;0 +5525;5526;0 +5526;5527;0 +5527;5528;0 +5528;5529;0 +5529;5530;0 +5530;5531;0 +5531;5532;0 +5532;5533;0 +5533;5534;0 +5534;5535;0 +5535;5536;0 +5536;5537;0 +5537;5538;0 +5538;5539;0 +5539;5540;0 +5540;5484;0 +5541;5542;0 +5542;5543;0 +5543;5544;0 +5544;5545;0 +5545;5546;0 +5546;5547;0 +5547;5548;0 +5548;5549;0 +5549;5550;0 +5550;5551;0 +5551;5552;0 +5552;5553;0 +5553;5554;0 +5554;5555;0 +5555;5556;0 +5556;5557;0 +5557;5558;0 +5558;5559;0 +5559;5560;0 +5560;5561;0 +5561;5562;0 +5562;5563;0 +5563;5564;0 +5564;5565;0 +5565;5566;0 +5566;5567;0 +5567;5568;0 +5568;5569;0 +5569;5570;0 +5570;5571;0 +5571;5572;0 +5572;5573;0 +5573;5574;0 +5574;5575;0 +5575;5576;0 +5576;5577;0 +5577;5578;0 +5578;5579;0 +5579;5580;0 +5580;5581;0 +5581;5582;0 +5582;5583;0 +5583;5584;0 +5584;5585;0 +5585;5586;0 +5586;5587;0 +5587;5588;0 +5588;5589;0 +5589;5590;0 +5590;5591;0 +5591;5592;0 +5592;5593;0 +5593;5594;0 +5594;5595;0 +5595;5541;0 +5596;5597;0 +5597;5598;0 +5598;5599;0 +5599;5600;0 +5600;5601;0 +5601;5602;0 +5602;5603;0 +5603;5604;0 +5604;5605;0 +5605;5606;0 +5606;5607;0 +5607;5608;0 +5608;5609;0 +5609;5610;0 +5610;5611;0 +5611;5612;0 +5612;5613;0 +5613;5614;0 +5614;5615;0 +5615;5616;0 +5616;5617;0 +5617;5618;0 +5618;5619;0 +5619;5620;0 +5620;5621;0 +5621;5622;0 +5622;5623;0 +5623;5624;0 +5624;5625;0 +5625;5626;0 +5626;5627;0 +5627;5628;0 +5628;5629;0 +5629;5630;0 +5630;5631;0 +5631;5632;0 +5632;5633;0 +5633;5634;0 +5634;5635;0 +5635;5636;0 +5636;5637;0 +5637;5638;0 +5638;5639;0 +5639;5640;0 +5640;5641;0 +5641;5642;0 +5642;5643;0 +5643;5644;0 +5644;5645;0 +5645;5646;0 +5646;5647;0 +5647;5648;0 +5648;5596;0 +5649;5650;0 +5650;5651;0 +5651;5652;0 +5652;5653;0 +5653;5654;0 +5654;5655;0 +5655;5656;0 +5656;5657;0 +5657;5658;0 +5658;5659;0 +5659;5660;0 +5660;5661;0 +5661;5662;0 +5662;5663;0 +5663;5664;0 +5664;5665;0 +5665;5666;0 +5666;5667;0 +5667;5668;0 +5668;5669;0 +5669;5670;0 +5670;5671;0 +5671;5672;0 +5672;5673;0 +5673;5674;0 +5674;5675;0 +5675;5676;0 +5676;5677;0 +5677;5678;0 +5678;5679;0 +5679;5680;0 +5680;5681;0 +5681;5682;0 +5682;5683;0 +5683;5684;0 +5684;5685;0 +5685;5686;0 +5686;5687;0 +5687;5688;0 +5688;5689;0 +5689;5690;0 +5690;5691;0 +5691;5692;0 +5692;5693;0 +5693;5694;0 +5694;5695;0 +5695;5696;0 +5696;5697;0 +5697;5698;0 +5698;5699;0 +5699;5649;0 +5700;5701;0 +5701;5702;0 +5702;5703;0 +5703;5704;0 +5704;5705;0 +5705;5706;0 +5706;5707;0 +5707;5708;0 +5708;5709;0 +5709;5710;0 +5710;5711;0 +5711;5712;0 +5712;5713;0 +5713;5714;0 +5714;5715;0 +5715;5716;0 +5716;5717;0 +5717;5718;0 +5718;5719;0 +5719;5720;0 +5720;5721;0 +5721;5722;0 +5722;5723;0 +5723;5724;0 +5724;5725;0 +5725;5726;0 +5726;5727;0 +5727;5728;0 +5728;5729;0 +5729;5730;0 +5730;5731;0 +5731;5732;0 +5732;5733;0 +5733;5734;0 +5734;5735;0 +5735;5736;0 +5736;5737;0 +5737;5738;0 +5738;5739;0 +5739;5740;0 +5740;5741;0 +5741;5742;0 +5742;5743;0 +5743;5744;0 +5744;5745;0 +5745;5746;0 +5746;5747;0 +5747;5748;0 +5748;5749;0 +5749;5750;0 +5750;5700;0 +5751;5752;0 +5752;5753;0 +5753;5754;0 +5754;5755;0 +5755;5756;0 +5756;5757;0 +5757;5758;0 +5758;5759;0 +5759;5760;0 +5760;5761;0 +5761;5762;0 +5762;5763;0 +5763;5764;0 +5764;5765;0 +5765;5766;0 +5766;5767;0 +5767;5768;0 +5768;5769;0 +5769;5770;0 +5770;5771;0 +5771;5772;0 +5772;5773;0 +5773;5774;0 +5774;5775;0 +5775;5776;0 +5776;5777;0 +5777;5778;0 +5778;5779;0 +5779;5780;0 +5780;5781;0 +5781;5782;0 +5782;5783;0 +5783;5784;0 +5784;5785;0 +5785;5786;0 +5786;5787;0 +5787;5788;0 +5788;5789;0 +5789;5790;0 +5790;5791;0 +5791;5792;0 +5792;5793;0 +5793;5794;0 +5794;5795;0 +5795;5796;0 +5796;5797;0 +5797;5798;0 +5798;5799;0 +5799;5800;0 +5800;5751;0 +5801;5802;0 +5802;5803;0 +5803;5804;0 +5804;5805;0 +5805;5806;0 +5806;5807;0 +5807;5808;0 +5808;5809;0 +5809;5810;0 +5810;5811;0 +5811;5812;0 +5812;5813;0 +5813;5814;0 +5814;5815;0 +5815;5816;0 +5816;5817;0 +5817;5818;0 +5818;5819;0 +5819;5820;0 +5820;5821;0 +5821;5822;0 +5822;5823;0 +5823;5824;0 +5824;5825;0 +5825;5826;0 +5826;5827;0 +5827;5828;0 +5828;5829;0 +5829;5830;0 +5830;5831;0 +5831;5832;0 +5832;5833;0 +5833;5834;0 +5834;5835;0 +5835;5836;0 +5836;5837;0 +5837;5838;0 +5838;5839;0 +5839;5840;0 +5840;5841;0 +5841;5842;0 +5842;5843;0 +5843;5844;0 +5844;5845;0 +5845;5846;0 +5846;5847;0 +5847;5801;0 +5848;5849;0 +5849;5850;0 +5850;5851;0 +5851;5852;0 +5852;5853;0 +5853;5854;0 +5854;5855;0 +5855;5856;0 +5856;5857;0 +5857;5858;0 +5858;5859;0 +5859;5860;0 +5860;5861;0 +5861;5862;0 +5862;5863;0 +5863;5864;0 +5864;5865;0 +5865;5866;0 +5866;5867;0 +5867;5868;0 +5868;5869;0 +5869;5870;0 +5870;5871;0 +5871;5872;0 +5872;5873;0 +5873;5874;0 +5874;5875;0 +5875;5876;0 +5876;5877;0 +5877;5878;0 +5878;5879;0 +5879;5880;0 +5880;5881;0 +5881;5882;0 +5882;5883;0 +5883;5884;0 +5884;5885;0 +5885;5886;0 +5886;5887;0 +5887;5888;0 +5888;5889;0 +5889;5890;0 +5890;5891;0 +5891;5892;0 +5892;5893;0 +5893;5848;0 +5894;5895;0 +5895;5896;0 +5896;5897;0 +5897;5898;0 +5898;5899;0 +5899;5900;0 +5900;5901;0 +5901;5902;0 +5902;5903;0 +5903;5904;0 +5904;5905;0 +5905;5906;0 +5906;5907;0 +5907;5908;0 +5908;5909;0 +5909;5910;0 +5910;5911;0 +5911;5912;0 +5912;5913;0 +5913;5914;0 +5914;5915;0 +5915;5916;0 +5916;5917;0 +5917;5918;0 +5918;5919;0 +5919;5920;0 +5920;5921;0 +5921;5922;0 +5922;5923;0 +5923;5924;0 +5924;5925;0 +5925;5926;0 +5926;5927;0 +5927;5928;0 +5928;5929;0 +5929;5930;0 +5930;5931;0 +5931;5932;0 +5932;5933;0 +5933;5934;0 +5934;5935;0 +5935;5936;0 +5936;5937;0 +5937;5938;0 +5938;5939;0 +5939;5894;0 +5940;5941;0 +5941;5942;0 +5942;5943;0 +5943;5944;0 +5944;5945;0 +5945;5946;0 +5946;5947;0 +5947;5948;0 +5948;5949;0 +5949;5950;0 +5950;5951;0 +5951;5952;0 +5952;5953;0 +5953;5954;0 +5954;5955;0 +5955;5956;0 +5956;5957;0 +5957;5958;0 +5958;5959;0 +5959;5960;0 +5960;5961;0 +5961;5962;0 +5962;5963;0 +5963;5964;0 +5964;5965;0 +5965;5966;0 +5966;5967;0 +5967;5968;0 +5968;5969;0 +5969;5970;0 +5970;5971;0 +5971;5972;0 +5972;5973;0 +5973;5974;0 +5974;5975;0 +5975;5976;0 +5976;5977;0 +5977;5978;0 +5978;5979;0 +5979;5980;0 +5980;5981;0 +5981;5982;0 +5982;5940;0 +5983;5984;0 +5984;5985;0 +5985;5986;0 +5986;5987;0 +5987;5988;0 +5988;5989;0 +5989;5990;0 +5990;5991;0 +5991;5992;0 +5992;5993;0 +5993;5994;0 +5994;5995;0 +5995;5996;0 +5996;5997;0 +5997;5998;0 +5998;5999;0 +5999;6000;0 +6000;6001;0 +6001;6002;0 +6002;6003;0 +6003;6004;0 +6004;6005;0 +6005;6006;0 +6006;6007;0 +6007;6008;0 +6008;6009;0 +6009;6010;0 +6010;6011;0 +6011;6012;0 +6012;6013;0 +6013;6014;0 +6014;6015;0 +6015;6016;0 +6016;6017;0 +6017;6018;0 +6018;6019;0 +6019;6020;0 +6020;6021;0 +6021;6022;0 +6022;6023;0 +6023;6024;0 +6024;6025;0 +6025;5983;0 +6026;6027;0 +6027;6028;0 +6028;6029;0 +6029;6030;0 +6030;6031;0 +6031;6032;0 +6032;6033;0 +6033;6034;0 +6034;6035;0 +6035;6036;0 +6036;6037;0 +6037;6038;0 +6038;6039;0 +6039;6040;0 +6040;6041;0 +6041;6042;0 +6042;6043;0 +6043;6044;0 +6044;6045;0 +6045;6046;0 +6046;6047;0 +6047;6048;0 +6048;6049;0 +6049;6050;0 +6050;6051;0 +6051;6052;0 +6052;6053;0 +6053;6054;0 +6054;6055;0 +6055;6056;0 +6056;6057;0 +6057;6058;0 +6058;6059;0 +6059;6060;0 +6060;6061;0 +6061;6062;0 +6062;6063;0 +6063;6064;0 +6064;6065;0 +6065;6066;0 +6066;6067;0 +6067;6068;0 +6068;6026;0 +6069;6070;0 +6070;6071;0 +6071;6072;0 +6072;6073;0 +6073;6074;0 +6074;6075;0 +6075;6076;0 +6076;6077;0 +6077;6078;0 +6078;6079;0 +6079;6080;0 +6080;6081;0 +6081;6082;0 +6082;6083;0 +6083;6084;0 +6084;6085;0 +6085;6086;0 +6086;6087;0 +6087;6088;0 +6088;6089;0 +6089;6090;0 +6090;6091;0 +6091;6092;0 +6092;6093;0 +6093;6094;0 +6094;6095;0 +6095;6096;0 +6096;6097;0 +6097;6098;0 +6098;6099;0 +6099;6100;0 +6100;6101;0 +6101;6102;0 +6102;6103;0 +6103;6104;0 +6104;6105;0 +6105;6106;0 +6106;6107;0 +6107;6108;0 +6108;6069;0 +6109;6110;0 +6110;6111;0 +6111;6112;0 +6112;6113;0 +6113;6114;0 +6114;6115;0 +6115;6116;0 +6116;6117;0 +6117;6118;0 +6118;6119;0 +6119;6120;0 +6120;6121;0 +6121;6122;0 +6122;6123;0 +6123;6124;0 +6124;6125;0 +6125;6126;0 +6126;6127;0 +6127;6128;0 +6128;6129;0 +6129;6130;0 +6130;6131;0 +6131;6132;0 +6132;6133;0 +6133;6134;0 +6134;6135;0 +6135;6136;0 +6136;6137;0 +6137;6138;0 +6138;6139;0 +6139;6140;0 +6140;6141;0 +6141;6142;0 +6142;6143;0 +6143;6144;0 +6144;6145;0 +6145;6146;0 +6146;6147;0 +6147;6109;0 +6148;6149;0 +6149;6150;0 +6150;6151;0 +6151;6152;0 +6152;6153;0 +6153;6154;0 +6154;6155;0 +6155;6156;0 +6156;6157;0 +6157;6158;0 +6158;6159;0 +6159;6160;0 +6160;6161;0 +6161;6162;0 +6162;6163;0 +6163;6164;0 +6164;6165;0 +6165;6166;0 +6166;6167;0 +6167;6168;0 +6168;6169;0 +6169;6170;0 +6170;6171;0 +6171;6172;0 +6172;6173;0 +6173;6174;0 +6174;6175;0 +6175;6176;0 +6176;6177;0 +6177;6178;0 +6178;6179;0 +6179;6180;0 +6180;6181;0 +6181;6182;0 +6182;6183;0 +6183;6184;0 +6184;6185;0 +6185;6148;0 +6186;6187;0 +6187;6188;0 +6188;6189;0 +6189;6190;0 +6190;6191;0 +6191;6192;0 +6192;6193;0 +6193;6194;0 +6194;6195;0 +6195;6196;0 +6196;6197;0 +6197;6198;0 +6198;6199;0 +6199;6200;0 +6200;6201;0 +6201;6202;0 +6202;6203;0 +6203;6204;0 +6204;6205;0 +6205;6206;0 +6206;6207;0 +6207;6208;0 +6208;6209;0 +6209;6210;0 +6210;6211;0 +6211;6212;0 +6212;6213;0 +6213;6214;0 +6214;6215;0 +6215;6216;0 +6216;6217;0 +6217;6218;0 +6218;6219;0 +6219;6220;0 +6220;6221;0 +6221;6222;0 +6222;6186;0 +6223;6224;0 +6224;6225;0 +6225;6226;0 +6226;6227;0 +6227;6228;0 +6228;6229;0 +6229;6230;0 +6230;6231;0 +6231;6232;0 +6232;6233;0 +6233;6234;0 +6234;6235;0 +6235;6236;0 +6236;6237;0 +6237;6238;0 +6238;6239;0 +6239;6240;0 +6240;6241;0 +6241;6242;0 +6242;6243;0 +6243;6244;0 +6244;6245;0 +6245;6246;0 +6246;6247;0 +6247;6248;0 +6248;6249;0 +6249;6250;0 +6250;6251;0 +6251;6252;0 +6252;6253;0 +6253;6254;0 +6254;6255;0 +6255;6256;0 +6256;6223;0 +6257;6258;0 +6258;6259;0 +6259;6260;0 +6260;6261;0 +6261;6262;0 +6262;6263;0 +6263;6264;0 +6264;6265;0 +6265;6266;0 +6266;6267;0 +6267;6268;0 +6268;6269;0 +6269;6270;0 +6270;6271;0 +6271;6272;0 +6272;6273;0 +6273;6274;0 +6274;6275;0 +6275;6276;0 +6276;6277;0 +6277;6278;0 +6278;6279;0 +6279;6280;0 +6280;6281;0 +6281;6282;0 +6282;6283;0 +6283;6284;0 +6284;6285;0 +6285;6286;0 +6286;6287;0 +6287;6288;0 +6288;6289;0 +6289;6257;0 +6290;6291;0 +6291;6292;0 +6292;6293;0 +6293;6294;0 +6294;6295;0 +6295;6296;0 +6296;6297;0 +6297;6298;0 +6298;6299;0 +6299;6300;0 +6300;6301;0 +6301;6302;0 +6302;6303;0 +6303;6304;0 +6304;6305;0 +6305;6306;0 +6306;6307;0 +6307;6308;0 +6308;6309;0 +6309;6310;0 +6310;6311;0 +6311;6312;0 +6312;6313;0 +6313;6314;0 +6314;6315;0 +6315;6316;0 +6316;6317;0 +6317;6318;0 +6318;6319;0 +6319;6320;0 +6320;6290;0 +6321;6322;0 +6322;6323;0 +6323;6324;0 +6324;6325;0 +6325;6326;0 +6326;6327;0 +6327;6328;0 +6328;6329;0 +6329;6330;0 +6330;6331;0 +6331;6332;0 +6332;6333;0 +6333;6334;0 +6334;6335;0 +6335;6336;0 +6336;6337;0 +6337;6338;0 +6338;6339;0 +6339;6340;0 +6340;6341;0 +6341;6342;0 +6342;6343;0 +6343;6344;0 +6344;6345;0 +6345;6346;0 +6346;6347;0 +6347;6348;0 +6348;6349;0 +6349;6350;0 +6350;6321;0 +6351;6352;0 +6352;6353;0 +6353;6354;0 +6354;6355;0 +6355;6356;0 +6356;6357;0 +6357;6358;0 +6358;6359;0 +6359;6360;0 +6360;6361;0 +6361;6362;0 +6362;6363;0 +6363;6364;0 +6364;6365;0 +6365;6366;0 +6366;6367;0 +6367;6368;0 +6368;6369;0 +6369;6370;0 +6370;6371;0 +6371;6372;0 +6372;6373;0 +6373;6374;0 +6374;6375;0 +6375;6376;0 +6376;6377;0 +6377;6378;0 +6378;6379;0 +6379;6380;0 +6380;6381;0 +6381;6351;0 +6382;6383;0 +6383;6384;0 +6384;6385;0 +6385;6386;0 +6386;6387;0 +6387;6388;0 +6388;6389;0 +6389;6390;0 +6390;6391;0 +6391;6392;0 +6392;6393;0 +6393;6394;0 +6394;6395;0 +6395;6396;0 +6396;6397;0 +6397;6398;0 +6398;6399;0 +6399;6400;0 +6400;6401;0 +6401;6402;0 +6402;6403;0 +6403;6404;0 +6404;6405;0 +6405;6406;0 +6406;6407;0 +6407;6408;0 +6408;6409;0 +6409;6410;0 +6410;6382;0 +6411;6412;0 +6412;6413;0 +6413;6414;0 +6414;6415;0 +6415;6416;0 +6416;6417;0 +6417;6418;0 +6418;6419;0 +6419;6420;0 +6420;6421;0 +6421;6422;0 +6422;6423;0 +6423;6424;0 +6424;6425;0 +6425;6426;0 +6426;6427;0 +6427;6428;0 +6428;6429;0 +6429;6430;0 +6430;6431;0 +6431;6432;0 +6432;6433;0 +6433;6434;0 +6434;6435;0 +6435;6436;0 +6436;6437;0 +6437;6438;0 +6438;6411;0 +6439;6440;0 +6440;6441;0 +6441;6442;0 +6442;6443;0 +6443;6444;0 +6444;6445;0 +6445;6446;0 +6446;6447;0 +6447;6448;0 +6448;6449;0 +6449;6450;0 +6450;6451;0 +6451;6452;0 +6452;6453;0 +6453;6454;0 +6454;6455;0 +6455;6456;0 +6456;6457;0 +6457;6458;0 +6458;6459;0 +6459;6460;0 +6460;6461;0 +6461;6462;0 +6462;6463;0 +6463;6464;0 +6464;6465;0 +6465;6466;0 +6466;6439;0 +6467;6468;0 +6468;6469;0 +6469;6470;0 +6470;6471;0 +6471;6472;0 +6472;6473;0 +6473;6474;0 +6474;6475;0 +6475;6476;0 +6476;6477;0 +6477;6478;0 +6478;6479;0 +6479;6480;0 +6480;6481;0 +6481;6482;0 +6482;6483;0 +6483;6484;0 +6484;6485;0 +6485;6486;0 +6486;6487;0 +6487;6488;0 +6488;6489;0 +6489;6490;0 +6490;6491;0 +6491;6492;0 +6492;6493;0 +6493;6467;0 +6494;6495;0 +6495;6496;0 +6496;6497;0 +6497;6498;0 +6498;6499;0 +6499;6500;0 +6500;6501;0 +6501;6502;0 +6502;6503;0 +6503;6504;0 +6504;6505;0 +6505;6506;0 +6506;6507;0 +6507;6508;0 +6508;6509;0 +6509;6510;0 +6510;6511;0 +6511;6512;0 +6512;6513;0 +6513;6514;0 +6514;6515;0 +6515;6516;0 +6516;6517;0 +6517;6518;0 +6518;6519;0 +6519;6520;0 +6520;6494;0 +6521;6522;0 +6522;6523;0 +6523;6524;0 +6524;6525;0 +6525;6526;0 +6526;6527;0 +6527;6528;0 +6528;6529;0 +6529;6530;0 +6530;6531;0 +6531;6532;0 +6532;6533;0 +6533;6534;0 +6534;6535;0 +6535;6536;0 +6536;6537;0 +6537;6538;0 +6538;6539;0 +6539;6540;0 +6540;6541;0 +6541;6542;0 +6542;6543;0 +6543;6544;0 +6544;6545;0 +6545;6546;0 +6546;6547;0 +6547;6521;0 +6548;6549;0 +6549;6550;0 +6550;6551;0 +6551;6552;0 +6552;6553;0 +6553;6554;0 +6554;6555;0 +6555;6556;0 +6556;6557;0 +6557;6558;0 +6558;6559;0 +6559;6560;0 +6560;6561;0 +6561;6562;0 +6562;6563;0 +6563;6564;0 +6564;6565;0 +6565;6566;0 +6566;6567;0 +6567;6568;0 +6568;6569;0 +6569;6570;0 +6570;6571;0 +6571;6572;0 +6572;6573;0 +6573;6548;0 +6574;6575;0 +6575;6576;0 +6576;6577;0 +6577;6578;0 +6578;6579;0 +6579;6580;0 +6580;6581;0 +6581;6582;0 +6582;6583;0 +6583;6584;0 +6584;6585;0 +6585;6586;0 +6586;6587;0 +6587;6588;0 +6588;6589;0 +6589;6590;0 +6590;6591;0 +6591;6592;0 +6592;6593;0 +6593;6594;0 +6594;6595;0 +6595;6596;0 +6596;6597;0 +6597;6574;0 +6598;6599;0 +6599;6600;0 +6600;6601;0 +6601;6602;0 +6602;6603;0 +6603;6604;0 +6604;6605;0 +6605;6606;0 +6606;6607;0 +6607;6608;0 +6608;6609;0 +6609;6610;0 +6610;6611;0 +6611;6612;0 +6612;6613;0 +6613;6614;0 +6614;6615;0 +6615;6616;0 +6616;6617;0 +6617;6618;0 +6618;6619;0 +6619;6620;0 +6620;6621;0 +6621;6598;0 +6622;6623;0 +6623;6624;0 +6624;6625;0 +6625;6626;0 +6626;6627;0 +6627;6628;0 +6628;6629;0 +6629;6630;0 +6630;6631;0 +6631;6632;0 +6632;6633;0 +6633;6634;0 +6634;6635;0 +6635;6636;0 +6636;6637;0 +6637;6638;0 +6638;6639;0 +6639;6640;0 +6640;6641;0 +6641;6642;0 +6642;6643;0 +6643;6644;0 +6644;6622;0 +6645;6646;0 +6646;6647;0 +6647;6648;0 +6648;6649;0 +6649;6650;0 +6650;6651;0 +6651;6652;0 +6652;6653;0 +6653;6654;0 +6654;6655;0 +6655;6656;0 +6656;6657;0 +6657;6658;0 +6658;6659;0 +6659;6660;0 +6660;6661;0 +6661;6662;0 +6662;6663;0 +6663;6664;0 +6664;6665;0 +6665;6666;0 +6666;6667;0 +6667;6645;0 +6668;6669;0 +6669;6670;0 +6670;6671;0 +6671;6672;0 +6672;6673;0 +6673;6674;0 +6674;6675;0 +6675;6676;0 +6676;6677;0 +6677;6678;0 +6678;6679;0 +6679;6680;0 +6680;6681;0 +6681;6682;0 +6682;6683;0 +6683;6684;0 +6684;6685;0 +6685;6686;0 +6686;6687;0 +6687;6688;0 +6688;6689;0 +6689;6690;0 +6690;6668;0 +6691;6692;0 +6692;6693;0 +6693;6694;0 +6694;6695;0 +6695;6696;0 +6696;6697;0 +6697;6698;0 +6698;6699;0 +6699;6700;0 +6700;6701;0 +6701;6702;0 +6702;6703;0 +6703;6704;0 +6704;6705;0 +6705;6706;0 +6706;6707;0 +6707;6708;0 +6708;6709;0 +6709;6710;0 +6710;6711;0 +6711;6712;0 +6712;6691;0 +6713;6714;0 +6714;6715;0 +6715;6716;0 +6716;6717;0 +6717;6718;0 +6718;6719;0 +6719;6720;0 +6720;6721;0 +6721;6722;0 +6722;6723;0 +6723;6724;0 +6724;6725;0 +6725;6726;0 +6726;6727;0 +6727;6728;0 +6728;6729;0 +6729;6730;0 +6730;6731;0 +6731;6732;0 +6732;6733;0 +6733;6734;0 +6734;6713;0 +6735;6736;0 +6736;6737;0 +6737;6738;0 +6738;6739;0 +6739;6740;0 +6740;6741;0 +6741;6742;0 +6742;6743;0 +6743;6744;0 +6744;6745;0 +6745;6746;0 +6746;6747;0 +6747;6748;0 +6748;6749;0 +6749;6750;0 +6750;6751;0 +6751;6752;0 +6752;6753;0 +6753;6754;0 +6754;6755;0 +6755;6756;0 +6756;6735;0 +6757;6758;0 +6758;6759;0 +6759;6760;0 +6760;6761;0 +6761;6762;0 +6762;6763;0 +6763;6764;0 +6764;6765;0 +6765;6766;0 +6766;6767;0 +6767;6768;0 +6768;6769;0 +6769;6770;0 +6770;6771;0 +6771;6772;0 +6772;6773;0 +6773;6774;0 +6774;6775;0 +6775;6776;0 +6776;6777;0 +6777;6757;0 +6778;6779;0 +6779;6780;0 +6780;6781;0 +6781;6782;0 +6782;6783;0 +6783;6784;0 +6784;6785;0 +6785;6786;0 +6786;6787;0 +6787;6788;0 +6788;6789;0 +6789;6790;0 +6790;6791;0 +6791;6792;0 +6792;6793;0 +6793;6794;0 +6794;6795;0 +6795;6796;0 +6796;6797;0 +6797;6798;0 +6798;6778;0 +6799;6800;0 +6800;6801;0 +6801;6802;0 +6802;6803;0 +6803;6804;0 +6804;6805;0 +6805;6806;0 +6806;6807;0 +6807;6808;0 +6808;6809;0 +6809;6810;0 +6810;6811;0 +6811;6812;0 +6812;6813;0 +6813;6814;0 +6814;6815;0 +6815;6816;0 +6816;6817;0 +6817;6818;0 +6818;6819;0 +6819;6799;0 +6820;6821;0 +6821;6822;0 +6822;6823;0 +6823;6824;0 +6824;6825;0 +6825;6826;0 +6826;6827;0 +6827;6828;0 +6828;6829;0 +6829;6830;0 +6830;6831;0 +6831;6832;0 +6832;6833;0 +6833;6834;0 +6834;6835;0 +6835;6836;0 +6836;6837;0 +6837;6838;0 +6838;6839;0 +6839;6840;0 +6840;6820;0 +6841;6842;0 +6842;6843;0 +6843;6844;0 +6844;6845;0 +6845;6846;0 +6846;6847;0 +6847;6848;0 +6848;6849;0 +6849;6850;0 +6850;6851;0 +6851;6852;0 +6852;6853;0 +6853;6854;0 +6854;6855;0 +6855;6856;0 +6856;6857;0 +6857;6858;0 +6858;6859;0 +6859;6860;0 +6860;6841;0 +6861;6862;0 +6862;6863;0 +6863;6864;0 +6864;6865;0 +6865;6866;0 +6866;6867;0 +6867;6868;0 +6868;6869;0 +6869;6870;0 +6870;6871;0 +6871;6872;0 +6872;6873;0 +6873;6874;0 +6874;6875;0 +6875;6876;0 +6876;6877;0 +6877;6878;0 +6878;6879;0 +6879;6880;0 +6880;6861;0 +6881;6882;0 +6882;6883;0 +6883;6884;0 +6884;6885;0 +6885;6886;0 +6886;6887;0 +6887;6888;0 +6888;6889;0 +6889;6890;0 +6890;6891;0 +6891;6892;0 +6892;6893;0 +6893;6894;0 +6894;6895;0 +6895;6896;0 +6896;6897;0 +6897;6898;0 +6898;6899;0 +6899;6900;0 +6900;6881;0 +6901;6902;0 +6902;6903;0 +6903;6904;0 +6904;6905;0 +6905;6906;0 +6906;6907;0 +6907;6908;0 +6908;6909;0 +6909;6910;0 +6910;6911;0 +6911;6912;0 +6912;6913;0 +6913;6914;0 +6914;6915;0 +6915;6916;0 +6916;6917;0 +6917;6918;0 +6918;6919;0 +6919;6920;0 +6920;6901;0 +6921;6922;0 +6922;6923;0 +6923;6924;0 +6924;6925;0 +6925;6926;0 +6926;6927;0 +6927;6928;0 +6928;6929;0 +6929;6930;0 +6930;6931;0 +6931;6932;0 +6932;6933;0 +6933;6934;0 +6934;6935;0 +6935;6936;0 +6936;6937;0 +6937;6938;0 +6938;6939;0 +6939;6921;0 +6940;6941;0 +6941;6942;0 +6942;6943;0 +6943;6944;0 +6944;6945;0 +6945;6946;0 +6946;6947;0 +6947;6948;0 +6948;6949;0 +6949;6950;0 +6950;6951;0 +6951;6952;0 +6952;6953;0 +6953;6954;0 +6954;6955;0 +6955;6956;0 +6956;6957;0 +6957;6958;0 +6958;6940;0 +6959;6960;0 +6960;6961;0 +6961;6962;0 +6962;6963;0 +6963;6964;0 +6964;6965;0 +6965;6966;0 +6966;6967;0 +6967;6968;0 +6968;6969;0 +6969;6970;0 +6970;6971;0 +6971;6972;0 +6972;6973;0 +6973;6974;0 +6974;6975;0 +6975;6976;0 +6976;6959;0 +6977;6978;0 +6978;6979;0 +6979;6980;0 +6980;6981;0 +6981;6982;0 +6982;6983;0 +6983;6984;0 +6984;6985;0 +6985;6986;0 +6986;6987;0 +6987;6988;0 +6988;6989;0 +6989;6990;0 +6990;6991;0 +6991;6992;0 +6992;6993;0 +6993;6994;0 +6994;6977;0 +6995;6996;0 +6996;6997;0 +6997;6998;0 +6998;6999;0 +6999;7000;0 +7000;7001;0 +7001;7002;0 +7002;7003;0 +7003;7004;0 +7004;7005;0 +7005;7006;0 +7006;7007;0 +7007;7008;0 +7008;7009;0 +7009;7010;0 +7010;7011;0 +7011;7012;0 +7012;6995;0 +7013;7014;0 +7014;7015;0 +7015;7016;0 +7016;7017;0 +7017;7018;0 +7018;7019;0 +7019;7020;0 +7020;7021;0 +7021;7022;0 +7022;7023;0 +7023;7024;0 +7024;7025;0 +7025;7026;0 +7026;7027;0 +7027;7028;0 +7028;7029;0 +7029;7013;0 +7030;7031;0 +7031;7032;0 +7032;7033;0 +7033;7034;0 +7034;7035;0 +7035;7036;0 +7036;7037;0 +7037;7038;0 +7038;7039;0 +7039;7040;0 +7040;7041;0 +7041;7042;0 +7042;7043;0 +7043;7044;0 +7044;7045;0 +7045;7046;0 +7046;7030;0 +7047;7048;0 +7048;7049;0 +7049;7050;0 +7050;7051;0 +7051;7052;0 +7052;7053;0 +7053;7054;0 +7054;7055;0 +7055;7056;0 +7056;7057;0 +7057;7058;0 +7058;7059;0 +7059;7060;0 +7060;7061;0 +7061;7062;0 +7062;7063;0 +7063;7047;0 +7064;7065;0 +7065;7066;0 +7066;7067;0 +7067;7068;0 +7068;7069;0 +7069;7070;0 +7070;7071;0 +7071;7072;0 +7072;7073;0 +7073;7074;0 +7074;7075;0 +7075;7076;0 +7076;7077;0 +7077;7078;0 +7078;7079;0 +7079;7080;0 +7080;7064;0 +7081;7082;0 +7082;7083;0 +7083;7084;0 +7084;7085;0 +7085;7086;0 +7086;7087;0 +7087;7088;0 +7088;7089;0 +7089;7090;0 +7090;7091;0 +7091;7092;0 +7092;7093;0 +7093;7094;0 +7094;7095;0 +7095;7096;0 +7096;7097;0 +7097;7081;0 +7098;7099;0 +7099;7100;0 +7100;7101;0 +7101;7102;0 +7102;7103;0 +7103;7104;0 +7104;7105;0 +7105;7106;0 +7106;7107;0 +7107;7108;0 +7108;7109;0 +7109;7110;0 +7110;7111;0 +7111;7112;0 +7112;7113;0 +7113;7098;0 +7114;7115;0 +7115;7116;0 +7116;7117;0 +7117;7118;0 +7118;7119;0 +7119;7120;0 +7120;7121;0 +7121;7122;0 +7122;7123;0 +7123;7124;0 +7124;7125;0 +7125;7126;0 +7126;7127;0 +7127;7128;0 +7128;7129;0 +7129;7114;0 +7130;7131;0 +7131;7132;0 +7132;7133;0 +7133;7134;0 +7134;7135;0 +7135;7136;0 +7136;7137;0 +7137;7138;0 +7138;7139;0 +7139;7140;0 +7140;7141;0 +7141;7142;0 +7142;7143;0 +7143;7144;0 +7144;7145;0 +7145;7130;0 +7146;7147;0 +7147;7148;0 +7148;7149;0 +7149;7150;0 +7150;7151;0 +7151;7152;0 +7152;7153;0 +7153;7154;0 +7154;7155;0 +7155;7156;0 +7156;7157;0 +7157;7158;0 +7158;7159;0 +7159;7160;0 +7160;7161;0 +7161;7146;0 +7162;7163;0 +7163;7164;0 +7164;7165;0 +7165;7166;0 +7166;7167;0 +7167;7168;0 +7168;7169;0 +7169;7170;0 +7170;7171;0 +7171;7172;0 +7172;7173;0 +7173;7174;0 +7174;7175;0 +7175;7176;0 +7176;7177;0 +7177;7162;0 +7178;7179;0 +7179;7180;0 +7180;7181;0 +7181;7182;0 +7182;7183;0 +7183;7184;0 +7184;7185;0 +7185;7186;0 +7186;7187;0 +7187;7188;0 +7188;7189;0 +7189;7190;0 +7190;7191;0 +7191;7192;0 +7192;7193;0 +7193;7178;0 +7194;7195;0 +7195;7196;0 +7196;7197;0 +7197;7198;0 +7198;7199;0 +7199;7200;0 +7200;7201;0 +7201;7202;0 +7202;7203;0 +7203;7204;0 +7204;7205;0 +7205;7206;0 +7206;7207;0 +7207;7208;0 +7208;7209;0 +7209;7194;0 +7210;7211;0 +7211;7212;0 +7212;7213;0 +7213;7214;0 +7214;7215;0 +7215;7216;0 +7216;7217;0 +7217;7218;0 +7218;7219;0 +7219;7220;0 +7220;7221;0 +7221;7222;0 +7222;7223;0 +7223;7224;0 +7224;7210;0 +7225;7226;0 +7226;7227;0 +7227;7228;0 +7228;7229;0 +7229;7230;0 +7230;7231;0 +7231;7232;0 +7232;7233;0 +7233;7234;0 +7234;7235;0 +7235;7236;0 +7236;7237;0 +7237;7238;0 +7238;7239;0 +7239;7225;0 +7240;7241;0 +7241;7242;0 +7242;7243;0 +7243;7244;0 +7244;7245;0 +7245;7246;0 +7246;7247;0 +7247;7248;0 +7248;7249;0 +7249;7250;0 +7250;7251;0 +7251;7252;0 +7252;7253;0 +7253;7254;0 +7254;7240;0 +7255;7256;0 +7256;7257;0 +7257;7258;0 +7258;7259;0 +7259;7260;0 +7260;7261;0 +7261;7262;0 +7262;7263;0 +7263;7264;0 +7264;7265;0 +7265;7266;0 +7266;7267;0 +7267;7268;0 +7268;7269;0 +7269;7255;0 +7270;7271;0 +7271;7272;0 +7272;7273;0 +7273;7274;0 +7274;7275;0 +7275;7276;0 +7276;7277;0 +7277;7278;0 +7278;7279;0 +7279;7280;0 +7280;7281;0 +7281;7282;0 +7282;7283;0 +7283;7284;0 +7284;7270;0 +7285;7286;0 +7286;7287;0 +7287;7288;0 +7288;7289;0 +7289;7290;0 +7290;7291;0 +7291;7292;0 +7292;7293;0 +7293;7294;0 +7294;7295;0 +7295;7296;0 +7296;7297;0 +7297;7298;0 +7298;7299;0 +7299;7285;0 +7300;7301;0 +7301;7302;0 +7302;7303;0 +7303;7304;0 +7304;7305;0 +7305;7306;0 +7306;7307;0 +7307;7308;0 +7308;7309;0 +7309;7310;0 +7310;7311;0 +7311;7312;0 +7312;7313;0 +7313;7314;0 +7314;7300;0 +7315;7316;0 +7316;7317;0 +7317;7318;0 +7318;7319;0 +7319;7320;0 +7320;7321;0 +7321;7322;0 +7322;7323;0 +7323;7324;0 +7324;7325;0 +7325;7326;0 +7326;7327;0 +7327;7328;0 +7328;7315;0 +7329;7330;0 +7330;7331;0 +7331;7332;0 +7332;7333;0 +7333;7334;0 +7334;7335;0 +7335;7336;0 +7336;7337;0 +7337;7338;0 +7338;7339;0 +7339;7340;0 +7340;7341;0 +7341;7329;0 +7342;7343;0 +7343;7344;0 +7344;7345;0 +7345;7346;0 +7346;7347;0 +7347;7348;0 +7348;7349;0 +7349;7350;0 +7350;7351;0 +7351;7352;0 +7352;7353;0 +7353;7354;0 +7354;7342;0 +7355;7356;0 +7356;7357;0 +7357;7358;0 +7358;7359;0 +7359;7360;0 +7360;7361;0 +7361;7362;0 +7362;7363;0 +7363;7364;0 +7364;7365;0 +7365;7366;0 +7366;7367;0 +7367;7355;0 +7368;7369;0 +7369;7370;0 +7370;7371;0 +7371;7372;0 +7372;7373;0 +7373;7374;0 +7374;7375;0 +7375;7376;0 +7376;7377;0 +7377;7378;0 +7378;7379;0 +7379;7380;0 +7380;7368;0 +7381;7382;0 +7382;7383;0 +7383;7384;0 +7384;7385;0 +7385;7386;0 +7386;7387;0 +7387;7388;0 +7388;7389;0 +7389;7390;0 +7390;7391;0 +7391;7392;0 +7392;7393;0 +7393;7381;0 +7394;7395;0 +7395;7396;0 +7396;7397;0 +7397;7398;0 +7398;7399;0 +7399;7400;0 +7400;7401;0 +7401;7402;0 +7402;7403;0 +7403;7404;0 +7404;7405;0 +7405;7406;0 +7406;7394;0 +7407;7408;0 +7408;7409;0 +7409;7410;0 +7410;7411;0 +7411;7412;0 +7412;7413;0 +7413;7414;0 +7414;7415;0 +7415;7416;0 +7416;7417;0 +7417;7418;0 +7418;7419;0 +7419;7407;0 +7420;7421;0 +7421;7422;0 +7422;7423;0 +7423;7424;0 +7424;7425;0 +7425;7426;0 +7426;7427;0 +7427;7428;0 +7428;7429;0 +7429;7430;0 +7430;7431;0 +7431;7420;0 +7432;7433;0 +7433;7434;0 +7434;7435;0 +7435;7436;0 +7436;7437;0 +7437;7438;0 +7438;7439;0 +7439;7440;0 +7440;7441;0 +7441;7442;0 +7442;7443;0 +7443;7432;0 +7444;7445;0 +7445;7446;0 +7446;7447;0 +7447;7448;0 +7448;7449;0 +7449;7450;0 +7450;7451;0 +7451;7452;0 +7452;7453;0 +7453;7454;0 +7454;7444;0 +7455;7456;0 +7456;7457;0 +7457;7458;0 +7458;7459;0 +7459;7460;0 +7460;7461;0 +7461;7462;0 +7462;7463;0 +7463;7464;0 +7464;7465;0 +7465;7455;0 +7466;7467;0 +7467;7468;0 +7468;7469;0 +7469;7470;0 +7470;7471;0 +7471;7472;0 +7472;7473;0 +7473;7474;0 +7474;7475;0 +7475;7476;0 +7476;7466;0 +7477;7478;0 +7478;7479;0 +7479;7480;0 +7480;7481;0 +7481;7482;0 +7482;7483;0 +7483;7484;0 +7484;7485;0 +7485;7486;0 +7486;7487;0 +7487;7477;0 +7488;7489;0 +7489;7490;0 +7490;7491;0 +7491;7492;0 +7492;7493;0 +7493;7494;0 +7494;7495;0 +7495;7496;0 +7496;7497;0 +7497;7498;0 +7498;7488;0 +7499;7500;0 +7500;7501;0 +7501;7502;0 +7502;7503;0 +7503;7504;0 +7504;7505;0 +7505;7506;0 +7506;7507;0 +7507;7508;0 +7508;7509;0 +7509;7499;0 +7510;7511;0 +7511;7512;0 +7512;7513;0 +7513;7514;0 +7514;7515;0 +7515;7516;0 +7516;7517;0 +7517;7518;0 +7518;7519;0 +7519;7510;0 +7520;7521;0 +7521;7522;0 +7522;7523;0 +7523;7524;0 +7524;7525;0 +7525;7526;0 +7526;7527;0 +7527;7528;0 +7528;7529;0 +7529;7520;0 +7530;7531;0 +7531;7532;0 +7532;7533;0 +7533;7534;0 +7534;7535;0 +7535;7536;0 +7536;7537;0 +7537;7538;0 +7538;7539;0 +7539;7530;0 +7540;7541;0 +7541;7542;0 +7542;7543;0 +7543;7544;0 +7544;7545;0 +7545;7546;0 +7546;7547;0 +7547;7548;0 +7548;7549;0 +7549;7540;0 +7550;7551;0 +7551;7552;0 +7552;7553;0 +7553;7554;0 +7554;7555;0 +7555;7556;0 +7556;7557;0 +7557;7558;0 +7558;7559;0 +7559;7550;0 +7560;7561;0 +7561;7562;0 +7562;7563;0 +7563;7564;0 +7564;7565;0 +7565;7566;0 +7566;7567;0 +7567;7568;0 +7568;7569;0 +7569;7560;0 +7570;7571;0 +7571;7572;0 +7572;7573;0 +7573;7574;0 +7574;7575;0 +7575;7576;0 +7576;7577;0 +7577;7578;0 +7578;7570;0 +7579;7580;0 +7580;7581;0 +7581;7582;0 +7582;7583;0 +7583;7584;0 +7584;7585;0 +7585;7586;0 +7586;7587;0 +7587;7579;0 +7588;7589;0 +7589;7590;0 +7590;7591;0 +7591;7592;0 +7592;7593;0 +7593;7594;0 +7594;7595;0 +7595;7596;0 +7596;7588;0 +7597;7598;0 +7598;7599;0 +7599;7600;0 +7600;7601;0 +7601;7602;0 +7602;7603;0 +7603;7604;0 +7604;7605;0 +7605;7597;0 +7606;7607;0 +7607;7608;0 +7608;7609;0 +7609;7610;0 +7610;7611;0 +7611;7612;0 +7612;7613;0 +7613;7614;0 +7614;7606;0 +7615;7616;0 +7616;7617;0 +7617;7618;0 +7618;7619;0 +7619;7620;0 +7620;7621;0 +7621;7622;0 +7622;7623;0 +7623;7615;0 +7624;7625;0 +7625;7626;0 +7626;7627;0 +7627;7628;0 +7628;7629;0 +7629;7630;0 +7630;7631;0 +7631;7632;0 +7632;7624;0 +7633;7634;0 +7634;7635;0 +7635;7636;0 +7636;7637;0 +7637;7638;0 +7638;7639;0 +7639;7640;0 +7640;7641;0 +7641;7633;0 +7642;7643;0 +7643;7644;0 +7644;7645;0 +7645;7646;0 +7646;7647;0 +7647;7648;0 +7648;7649;0 +7649;7650;0 +7650;7642;0 +7651;7652;0 +7652;7653;0 +7653;7654;0 +7654;7655;0 +7655;7656;0 +7656;7657;0 +7657;7658;0 +7658;7659;0 +7659;7651;0 +7660;7661;0 +7661;7662;0 +7662;7663;0 +7663;7664;0 +7664;7665;0 +7665;7666;0 +7666;7667;0 +7667;7660;0 +7668;7669;0 +7669;7670;0 +7670;7671;0 +7671;7672;0 +7672;7673;0 +7673;7674;0 +7674;7675;0 +7675;7668;0 +7676;7677;0 +7677;7678;0 +7678;7679;0 +7679;7680;0 +7680;7681;0 +7681;7682;0 +7682;7683;0 +7683;7676;0 +7684;7685;0 +7685;7686;0 +7686;7687;0 +7687;7688;0 +7688;7689;0 +7689;7690;0 +7690;7691;0 +7691;7684;0 +7692;7693;0 +7693;7694;0 +7694;7695;0 +7695;7696;0 +7696;7697;0 +7697;7698;0 +7698;7699;0 +7699;7692;0 +7700;7701;0 +7701;7702;0 +7702;7703;0 +7703;7704;0 +7704;7705;0 +7705;7706;0 +7706;7707;0 +7707;7700;0 +7708;7709;0 +7709;7710;0 +7710;7711;0 +7711;7712;0 +7712;7713;0 +7713;7714;0 +7714;7715;0 +7715;7708;0 +7716;7717;0 +7717;7718;0 +7718;7719;0 +7719;7720;0 +7720;7721;0 +7721;7722;0 +7722;7723;0 +7723;7716;0 +7724;7725;0 +7725;7726;0 +7726;7727;0 +7727;7728;0 +7728;7729;0 +7729;7730;0 +7730;7731;0 +7731;7724;0 +7732;7733;0 +7733;7734;0 +7734;7735;0 +7735;7736;0 +7736;7737;0 +7737;7738;0 +7738;7739;0 +7739;7732;0 +7740;7741;0 +7741;7742;0 +7742;7743;0 +7743;7744;0 +7744;7745;0 +7745;7746;0 +7746;7747;0 +7747;7740;0 +7748;7749;0 +7749;7750;0 +7750;7751;0 +7751;7752;0 +7752;7753;0 +7753;7754;0 +7754;7755;0 +7755;7748;0 +7756;7757;0 +7757;7758;0 +7758;7759;0 +7759;7760;0 +7760;7761;0 +7761;7762;0 +7762;7763;0 +7763;7756;0 +7764;7765;0 +7765;7766;0 +7766;7767;0 +7767;7768;0 +7768;7769;0 +7769;7770;0 +7770;7771;0 +7771;7764;0 +7772;7773;0 +7773;7774;0 +7774;7775;0 +7775;7776;0 +7776;7777;0 +7777;7778;0 +7778;7779;0 +7779;7772;0 +7780;7781;0 +7781;7782;0 +7782;7783;0 +7783;7784;0 +7784;7785;0 +7785;7786;0 +7786;7787;0 +7787;7780;0 +7788;7789;0 +7789;7790;0 +7790;7791;0 +7791;7792;0 +7792;7793;0 +7793;7794;0 +7794;7795;0 +7795;7788;0 +7796;7797;0 +7797;7798;0 +7798;7799;0 +7799;7800;0 +7800;7801;0 +7801;7802;0 +7802;7803;0 +7803;7796;0 +7804;7805;0 +7805;7806;0 +7806;7807;0 +7807;7808;0 +7808;7809;0 +7809;7810;0 +7810;7804;0 +7811;7812;0 +7812;7813;0 +7813;7814;0 +7814;7815;0 +7815;7816;0 +7816;7817;0 +7817;7811;0 +7818;7819;0 +7819;7820;0 +7820;7821;0 +7821;7822;0 +7822;7823;0 +7823;7824;0 +7824;7818;0 +7825;7826;0 +7826;7827;0 +7827;7828;0 +7828;7829;0 +7829;7830;0 +7830;7831;0 +7831;7825;0 +7832;7833;0 +7833;7834;0 +7834;7835;0 +7835;7836;0 +7836;7837;0 +7837;7838;0 +7838;7832;0 +7839;7840;0 +7840;7841;0 +7841;7842;0 +7842;7843;0 +7843;7844;0 +7844;7845;0 +7845;7839;0 +7846;7847;0 +7847;7848;0 +7848;7849;0 +7849;7850;0 +7850;7851;0 +7851;7852;0 +7852;7846;0 +7853;7854;0 +7854;7855;0 +7855;7856;0 +7856;7857;0 +7857;7858;0 +7858;7859;0 +7859;7853;0 +7860;7861;0 +7861;7862;0 +7862;7863;0 +7863;7864;0 +7864;7865;0 +7865;7866;0 +7866;7860;0 +7867;7868;0 +7868;7869;0 +7869;7870;0 +7870;7871;0 +7871;7872;0 +7872;7873;0 +7873;7867;0 +7874;7875;0 +7875;7876;0 +7876;7877;0 +7877;7878;0 +7878;7879;0 +7879;7880;0 +7880;7874;0 +7881;7882;0 +7882;7883;0 +7883;7884;0 +7884;7885;0 +7885;7886;0 +7886;7887;0 +7887;7881;0 +7888;7889;0 +7889;7890;0 +7890;7891;0 +7891;7892;0 +7892;7893;0 +7893;7894;0 +7894;7888;0 +7895;7896;0 +7896;7897;0 +7897;7898;0 +7898;7899;0 +7899;7900;0 +7900;7895;0 +7901;7902;0 +7902;7903;0 +7903;7904;0 +7904;7905;0 +7905;7906;0 +7906;7901;0 +7907;7908;0 +7908;7909;0 +7909;7910;0 +7910;7911;0 +7911;7912;0 +7912;7907;0 +7913;7914;0 +7914;7915;0 +7915;7916;0 +7916;7917;0 +7917;7918;0 +7918;7913;0 +7919;7920;0 +7920;7921;0 +7921;7922;0 +7922;7923;0 +7923;7924;0 +7924;7919;0 +7925;7926;0 +7926;7927;0 +7927;7928;0 +7928;7929;0 +7929;7930;0 +7930;7925;0 +7931;7932;0 +7932;7933;0 +7933;7934;0 +7934;7935;0 +7935;7936;0 +7936;7931;0 +7937;7938;0 +7938;7939;0 +7939;7940;0 +7940;7941;0 +7941;7942;0 +7942;7937;0 +7943;7944;0 +7944;7945;0 +7945;7946;0 +7946;7947;0 +7947;7948;0 +7948;7943;0 +7949;7950;0 +7950;7951;0 +7951;7952;0 +7952;7953;0 +7953;7954;0 +7954;7949;0 +7955;7956;0 +7956;7957;0 +7957;7958;0 +7958;7959;0 +7959;7960;0 +7960;7955;0 +7961;7962;0 +7962;7963;0 +7963;7964;0 +7964;7965;0 +7965;7966;0 +7966;7961;0 +7967;7968;0 +7968;7969;0 +7969;7970;0 +7970;7971;0 +7971;7972;0 +7972;7967;0 +7973;7974;0 +7974;7975;0 +7975;7976;0 +7976;7977;0 +7977;7978;0 +7978;7973;0 +7979;7980;0 +7980;7981;0 +7981;7982;0 +7982;7983;0 +7983;7984;0 +7984;7979;0 +7985;7986;0 +7986;7987;0 +7987;7988;0 +7988;7989;0 +7989;7990;0 +7990;7985;0 +7991;7992;0 +7992;7993;0 +7993;7994;0 +7994;7995;0 +7995;7996;0 +7996;7991;0 +7997;7998;0 +7998;7999;0 +7999;8000;0 +8000;8001;0 +8001;8002;0 +8002;7997;0 +8003;8004;0 +8004;8005;0 +8005;8006;0 +8006;8007;0 +8007;8008;0 +8008;8003;0 +8009;8010;0 +8010;8011;0 +8011;8012;0 +8012;8013;0 +8013;8014;0 +8014;8009;0 +8015;8016;0 +8016;8017;0 +8017;8018;0 +8018;8019;0 +8019;8020;0 +8020;8015;0 +8021;8022;0 +8022;8023;0 +8023;8024;0 +8024;8025;0 +8025;8021;0 +8026;8027;0 +8027;8028;0 +8028;8029;0 +8029;8030;0 +8030;8026;0 +8031;8032;0 +8032;8033;0 +8033;8034;0 +8034;8035;0 +8035;8031;0 +8036;8037;0 +8037;8038;0 +8038;8039;0 +8039;8040;0 +8040;8036;0 +8041;8042;0 +8042;8043;0 +8043;8044;0 +8044;8045;0 +8045;8041;0 +8046;8047;0 +8047;8048;0 +8048;8049;0 +8049;8050;0 +8050;8046;0 +8051;8052;0 +8052;8053;0 +8053;8054;0 +8054;8055;0 +8055;8051;0 +8056;8057;0 +8057;8058;0 +8058;8059;0 +8059;8060;0 +8060;8056;0 +8061;8062;0 +8062;8063;0 +8063;8064;0 +8064;8065;0 +8065;8061;0 +8066;8067;0 +8067;8068;0 +8068;8069;0 +8069;8070;0 +8070;8066;0 +8071;8072;0 +8072;8073;0 +8073;8074;0 +8074;8075;0 +8075;8071;0 +8076;8077;0 +8077;8078;0 +8078;8079;0 +8079;8080;0 +8080;8076;0 +8081;8082;0 +8082;8083;0 +8083;8084;0 +8084;8085;0 +8085;8081;0 +8086;8087;0 +8087;8088;0 +8088;8089;0 +8089;8090;0 +8090;8086;0 +8091;8092;0 +8092;8093;0 +8093;8094;0 +8094;8095;0 +8095;8091;0 +8096;8097;0 +8097;8098;0 +8098;8099;0 +8099;8100;0 +8100;8101;0 +8101;8096;0 +8102;8103;0 +8103;8104;0 +8104;8105;0 +8105;8106;0 +8106;8102;0 +8107;8108;0 +8108;8109;0 +8109;8110;0 +8110;8111;0 +8111;8107;0 +8112;8113;0 +8113;8114;0 +8114;8115;0 +8115;8116;0 +8116;8112;0 +8117;8118;0 +8118;8119;0 +8119;8120;0 +8120;8121;0 +8121;8117;0 +8122;8123;0 +8123;8124;0 +8124;8125;0 +8125;8126;0 +8126;8122;0 +8127;8128;0 +8128;8129;0 +8129;8130;0 +8130;8131;0 +8131;8127;0 +8132;8133;0 +8133;8134;0 +8134;8135;0 +8135;8136;0 +8136;8132;0 +8137;8138;0 +8138;8139;0 +8139;8140;0 +8140;8141;0 +8141;8137;0 +8142;8143;0 +8143;8144;0 +8144;8145;0 +8145;8146;0 +8146;8142;0 +8147;8148;0 +8148;8149;0 +8149;8150;0 +8150;8147;0 +8151;8152;0 +8152;8153;0 +8153;8154;0 +8154;8151;0 +8155;8156;0 +8156;8157;0 +8157;8158;0 +8158;8159;0 +8159;8155;0 +8160;8161;0 +8161;8162;0 +8162;8163;0 +8163;8164;0 +8164;8160;0 +8165;8166;0 +8166;8167;0 +8167;8168;0 +8168;8165;0 +8169;8170;0 +8170;8171;0 +8171;8172;0 +8172;8169;0 +8173;8174;0 +8174;8175;0 +8175;8176;0 +8176;8173;0 +8177;8178;0 +8178;8179;0 +8179;8180;0 +8180;8177;0 +8181;8182;0 +8182;8183;0 +8183;8184;0 +8184;8185;0 +8185;8181;0 +8186;8187;0 +8187;8188;0 +8188;8189;0 +8189;8190;0 +8190;8186;0 +8191;8192;0 +8192;8193;0 +8193;8194;0 +8194;8191;0 +8195;8196;0 +8196;8197;0 +8197;8198;0 +8198;8195;0 +8199;8200;0 +8200;8201;0 +8201;8202;0 +8202;8199;0 +8203;8204;0 +8204;8205;0 +8205;8206;0 +8206;8203;0 +8207;8208;0 +8208;8209;0 +8209;8210;0 +8210;8207;0 +8211;8212;0 +8212;8213;0 +8213;8214;0 +8214;8211;0 +8215;8216;0 +8216;8217;0 +8217;8218;0 +8218;8215;0 +8219;8220;0 +8220;8221;0 +8221;8222;0 +8222;8219;0 +8223;8224;0 +8224;8225;0 +8225;8226;0 +8226;8223;0 +8227;8228;0 +8228;8229;0 +8229;8230;0 +8230;8227;0 +8231;8232;0 +8232;8233;0 +8233;8234;0 +8234;8231;0 +8235;8236;0 +8236;8237;0 +8237;8238;0 +8238;8235;0 +8239;8240;0 +8240;8241;0 +8241;8242;0 +8242;8239;0 +8243;8244;0 +8244;8245;0 +8245;8246;0 +8246;8243;0 +8247;8248;0 +8248;8249;0 +8249;8250;0 +8250;8247;0 +8251;8252;0 +8252;8253;0 +8253;8254;0 +8254;8251;0 +8255;8256;0 +8256;8257;0 +8257;8258;0 +8258;8255;0 +8259;8260;0 +8260;8261;0 +8261;8262;0 +8262;8259;0 +8263;8264;0 +8264;8265;0 +8265;8263;0 +8266;8267;0 +8267;8268;0 +8268;8266;0 +8269;8270;0 +8270;8271;0 +8271;8269;0 +8272;8273;0 +8273;8274;0 +8274;8272;0 +8275;8276;0 +8276;8277;0 +8277;8275;0 +8278;8279;0 +8279;8280;0 +8280;8278;0 +8281;8282;0 +8282;8283;0 +8283;8281;0 +8284;8285;0 +8285;8286;0 +8286;8284;0 +8287;8288;0 +8288;8289;0 +8289;8287;0 +8290;8291;0 +8291;8292;0 +8292;8290;0 +8293;8294;0 +8294;8295;0 +8295;8293;0 +8296;8297;0 +8297;8298;0 +8298;8296;0 +8299;8300;0 +8300;8301;0 +8301;8299;0 +8302;8303;0 +8303;8304;0 +8304;8302;0 +8305;8306;0 +8306;8307;0 +8307;8305;0 +8308;8309;0 +8309;8310;0 +8310;8308;0 +8311;8312;0 +8312;8313;0 +8313;8311;0 diff --git a/external/jigsaw/geo/lakes.jig b/external/jigsaw/geo/lakes.jig new file mode 100644 index 0000000..3a2b0b2 --- /dev/null +++ b/external/jigsaw/geo/lakes.jig @@ -0,0 +1,26 @@ + +# +# LAKES.JIG: lake superior +# + +# To run on WIN platforms: +# +# bin\jigsaw.exe geo\lakes.jig +# +# To run on LNX platforms: +# +# bin/jigsaw geo/lakes.jig +# +# from jigsaw root folder. +# + + GEOM_FILE = geo/lakes.msh + MESH_FILE = out/lakes.msh + VERBOSITY = 1 + GEOM_FEAT = TRUE + MESH_TOP1 = TRUE + MESH_DIMS = 2 + HFUN_HMAX = 0.05 + + + diff --git a/external/jigsaw/geo/lakes.msh b/external/jigsaw/geo/lakes.msh new file mode 100644 index 0000000..5072f49 --- /dev/null +++ b/external/jigsaw/geo/lakes.msh @@ -0,0 +1,611 @@ +# lakes.msh geometry file +mshid=1 +ndims=2 +point=303 +-8.915414699999999;1.661592;0 +-8.884706400000001;1.5538653;0 +-8.7270571;1.4396306;0 +-8.6780329;1.3310253;0 +-8.2763869;1.3642085;0 +-7.7589437;1.5521208;0 +-7.3399811;1.5866412;0 +-7.2064877;1.7400111;0 +-6.987161;1.7838988;0 +-6.9190874;1.6751018;0 +-6.6594362;1.823788;0 +-6.4705078;2.0285109;0 +-6.3982459;2.0257761;0 +-6.1776033;2.1236043;0 +-5.9683636;1.9041636;0 +-6.0500631;1.6420917;0 +-6.2751037;1.4382319;0 +-6.2083449;1.2768143;0 +-6.3593873;1.1233594;0 +-6.4379782;0.9672913;0 +-6.4389687;0.940829;0 +-6.3308569;0.9103191;0 +-5.921668;1.1606956;0 +-5.885353;1.1594465;0 +-5.5306989;0.88275;0 +-5.4571118;0.9068911;0 +-5.2776995;0.8218321;0 +-4.6882658;1.0696109;0 +-4.4325551;1.115784;0 +-3.9867787;1.5284986;0 +-3.6232783;1.573356;0 +-3.5156848;1.5181578;0 +-3.1151141;1.6162773;0 +-2.6031886;1.9253444;0 +-2.4201615;2.0814581;0 +-2.0576784;2.182551;0 +-1.9469493;2.3929843;0 +-1.6564457;2.6016249;0 +-1.4385855;2.8113568;0 +-1.185718;2.9681802;0 +-0.896576;3.2839699;0 +-0.4656316;3.4939341;0 +-0.0715676;3.6520868;0 +0.3221563;3.5994536;0 +0.6089023;3.4943945;0 +0.6092879;3.3885375;0 +0.3942456;3.3878929;0 +0.2866788;3.4141384;0 +0.0717038;3.3345153;0 +0.0896864;3.2286668;0 +0.1076576;3.1757488;0 +-0.1436793;3.01699;0 +-0.3235837;2.8584538;0 +-0.4676923;2.7529346;0 +-0.9391942;2.0668111;0 +-1.0495193;1.7498742;0 +-1.0882363;1.3531376;0 +-1.0158452;1.3262275;0 +-0.9424102;1.4845979;0 +-0.615238;1.7477533;0 +-0.5061946000000001;1.9061816;0 +-0.2890742;2.0115316;0 +-0.506667;1.7473959;0 +-0.6160022000000001;1.5360392;0 +-0.397972;1.8000363;0 +-0.1808403;1.8525961;0 +0.2894343;1.7998173;0 +0.5431103;1.6681146;0 +0.9058832;1.5373304;0 +0.9432855999999999;1.3258124;0 +1.0534256;1.1147328;0 +1.1641909;0.8507940000000001;0 +1.3109203;0.6930545;0 +1.3117251;0.5871977;0 +1.421469;0.5351345;0 +1.9317215;0.5400872;0 +2.2226054;0.5965222;0 +2.3340522;0.4391798;0 +2.4073552;0.4137156;0 +2.4449497;0.334835;0 +2.5909063;0.3369578;0 +2.6249835;0.4962917;0 +2.7343488;0.4979874;0 +2.8454551;0.3938967;0 +2.936647;0.3954205;0 +2.9201944;0.2892562;0 +2.9931921;0.2905022;0 +3.3135431;0.7199108;0 +3.3863589;0.7213257;0 +3.9960329;1.1315466;0 +4.0705567;1.0538628;0 +4.6490632;1.174476;0 +4.903998;1.1550887;0 +5.4495532;1.1450567;0 +5.9850466;1.4278414;0 +6.1653805;1.4607402;0 +6.3476152;1.4409063;0 +6.6355959;1.5048353;0 +6.5309084;1.3948027;0 +6.4623697;1.2862027;0 +6.4803085;0.8098819;0 +6.4094979;0.7542354;0 +6.410009;0.7012564;0 +6.4882671;0.5981826;0 +6.7068647;0.6065329;0 +6.8546905;0.559329;0 +6.9296957;0.5093111;0 +7.3625916;0.6332439;0 +7.4195041;0.5826584;0 +7.4810256;0.4262426;0 +7.6622;0.4606821;0 +7.7339418;0.4903887;0 +7.6927729;0.5946095;0 +7.6199031;0.5913803;0 +7.5788199;0.6956243;0 +7.4649955;0.7967085;0 +7.4604098;0.9025555;0 +7.6668095;1.176764;0 +7.770946;1.2875089;0 +7.7298813;1.3917132;0 +7.6707366;1.4951115;0 +7.6356734;1.4670289;0 +7.6246141;1.3074531;0 +7.5532118;1.2777792;0 +7.5280861;1.4357493;0 +7.5345391;1.7011603;0 +7.7131429;1.762169;0 +7.8603274;1.7158544;0 +7.9228745;1.9308907;0 +7.7348899;2.0813402;0 +7.3713821;2.1182087;0 +7.2698318;1.9547751;0 +7.1885795;2.1633926;0 +7.1152657;2.1868122;0 +7.0441691;2.15734;0 +6.9336956;2.2058041;0 +6.9676141;2.2602054;0 +7.0648074;2.529299;0 +7.0897106;2.7954185;0 +7.2917362;3.1221593;0 +7.3230152;3.2295634;0 +7.2074219;3.4101256;0 +7.0987913;3.4319941;0 +7.056259;3.5892427;0 +6.8349672;3.7390777;0 +6.5426013;3.8863685;0 +6.3538119;4.1440578;0 +6.6493349;4.7917061;0 +6.5385166;4.8932842;0 +6.7052993;5.1650313;0 +6.7009764;5.2708721;0 +5.7441174;5.2345817;0 +5.5686945;5.1755508;0 +4.788607;5.1509481;0 +4.4636817;5.3536511;0 +4.2075761;5.6646354;0 +3.607578;7.1858876;0 +3.3873644;7.6576363;0 +3.2804384;7.7613007;0 +3.1762847;7.7327191;0 +3.0381962;7.6506117;0 +2.8286881;7.6467634;0 +2.8598071;7.8590921;0 +2.6845531;7.9089847;0 +2.5468001;7.8008409;0 +2.4437671;7.6933492;0 +2.3390419;7.6917801;0 +2.1983122;7.7691861;0 +2.1616242;7.9010276;0 +2.0918985;7.9000964;0 +2.0235167;7.7933405;0 +1.9540682;7.7660064;0 +1.570508;7.7353016;0 +1.5002116;7.7875578;0 +1.2547448;7.9442315;0 +0.730965;8.1526824;0 +0.4522013;8.2575018;0 +0.1738657;8.3098811;0 +-0.0694533;8.521515300000001;0 +-0.1737495;8.4157382;0 +-0.2084645;8.4422444;0 +-0.347615;8.363095700000001;0 +-0.4518238;8.389823099999999;0 +-0.5558115;8.4695476;0 +-0.5215963;8.310643900000001;0 +-0.5221188;8.1518584;0 +-0.4879606;7.9400337;0 +-0.2092654;7.833566;0 +-0.2097517;7.463066;0 +-0.5257651;7.0403597;0 +-0.5604465;7.1463352;0 +-0.7716285000000001;6.9354925;0 +-0.9473082;6.8835005;0 +-0.9833619;6.7249256;0 +-1.1593398;6.6731632;0 +-1.2287946;6.7795396;0 +-1.1574372;6.9378046;0 +-0.6994015;7.4115277;0 +-0.5933112;7.7286747;0 +-0.6973173;7.8878837;0 +-0.9759166;7.9422776;0 +-1.1175557;7.6256239;0 +-1.1194069;7.3609825;0 +-1.2951661;7.2564438;0 +-1.5483098;6.411761;0 +-1.9366363;6.31007;0 +-1.8637764;6.5209552;0 +-1.7582839;6.5197737;0 +-1.7202965;6.7840348;0 +-1.5427314;6.9939696;0 +-1.5417155;7.0998256;0 +-1.5762336;7.1530937;0 +-1.9985176;6.9989869;0 +-2.3506579;6.8978706;0 +-2.5645144;6.6893724;0 +-2.5351899;6.3183276;0 +-2.7562921;5.7395724;0 +-3.7980607;5.0191439;0 +-4.3373509;4.7676755;0 +-4.9834948;4.5740477;0 +-5.9256532;4.1282314;0 +-7.0382285;3.1643631;0 +-7.4517045;2.7580044;0 +-8.203390300000001;2.1245258;0 +-8.7235361;1.8639192;0 +-6.0222359;1.402651;0 +-5.9152018;1.5578835;0 +-5.8726343;1.5299217;0 +-5.7920161;1.5536639;0 +-5.8345898;1.5816055;0 +-5.8318773;1.6609928;0 +-5.663557;1.7083083;0 +-5.5966615;1.7590827;0 +-5.6808641;1.8413432;0 +-5.7929717;1.7391469;0 +-6.0818599;1.5637339;0 +-6.0865686;1.4314222;0 +-5.7324455;1.9225485;0 +-5.5683675;1.9594866;0 +-5.5335991;1.9159672;0 +-5.5318777;1.9688923;0 +-5.449816;2.0457126;0 +-5.4914569;2.1000333;0 +-5.7297704;2.0019357;0 +-5.7677013;1.9502324;0 +-5.2706487;2.2254789;0 +-5.2257103;2.277064;0 +-5.2196558;2.3563407;0 +-5.191165;2.4614151;0 +-5.2924029;2.4539566;0 +-5.3166868;2.3699543;0 +-5.3193455;2.2852741;0 +-5.344493;2.174812;0 +-2.628509;4.8904087;0 +-2.5231726;4.8093509;0 +-2.4524965;4.7818143;0 +-2.166425;4.9101487;0 +-1.8814086;4.9860466;0 +-2.0588911;4.9881727;0 +-2.093713;5.0415487;0 +-1.9150532;5.1452403;0 +-1.7011793;5.2487523;0 +-1.5239785;5.2470098;0 +-1.1676824;5.5087407;0 +-1.2022868;5.6148538;0 +-0.9185046;5.7718016;0 +-0.882891;5.8245348;0 +-0.9532116;5.8778612;0 +-1.3075201;5.7215257;0 +-1.5563954;5.5649116;0 +-1.6276655;5.5126727;0 +-1.7340945;5.4872998;0 +-1.840557;5.4619959;0 +-2.0900008;5.3326514;0 +-2.3756722;5.1777288;0 +-2.590489;5.0486276;0 +-0.1745905;7.648274;0 +-0.1048759;7.4629629;0 +-0.0174793;7.4629295;0 +-0.0349355;7.5687895;0 +0.0349007;7.7275752;0 +0.2267794;7.7806613;0 +0.3839078;7.7280333;0 +0.558318;7.7550129;0 +0.6632222;7.7024853;0 +0.8201638;7.7296796;0 +0.732548;7.8086476;0 +0.6273773;7.9405222;0 +0.4880418;7.9135694;0 +0.1393711;7.9922753;0 +0.0348428;7.9922181;0 +-0.1743299;7.8864526;0 +4.5964504;4.4039327;0 +4.8814214;4.4120893;0 +4.9866866;4.468199;0 +5.1274771;4.5254771;0 +5.1614199;4.5795088;0 +5.0886198;4.6302255;0 +4.9818982;4.6269721;0 +4.8364965;4.7285905;0 +4.5535316;4.6675729;0 +4.3785074;4.5569131;0 +4.3813116;4.4510625;0 +edge2=303 +0;1;0 +1;2;0 +2;3;0 +3;4;0 +4;5;0 +5;6;0 +6;7;0 +7;8;0 +8;9;0 +9;10;0 +10;11;0 +11;12;0 +12;13;0 +13;14;0 +14;15;0 +15;16;0 +16;17;0 +17;18;0 +18;19;0 +19;20;0 +20;21;0 +21;22;0 +22;23;0 +23;24;0 +24;25;0 +25;26;0 +26;27;0 +27;28;0 +28;29;0 +29;30;0 +30;31;0 +31;32;0 +32;33;0 +33;34;0 +34;35;0 +35;36;0 +36;37;0 +37;38;0 +38;39;0 +39;40;0 +40;41;0 +41;42;0 +42;43;0 +43;44;0 +44;45;0 +45;46;0 +46;47;0 +47;48;0 +48;49;0 +49;50;0 +50;51;0 +51;52;0 +52;53;0 +53;54;0 +54;55;0 +55;56;0 +56;57;0 +57;58;0 +58;59;0 +59;60;0 +60;61;0 +61;62;0 +62;63;0 +63;64;0 +64;65;0 +65;66;0 +66;67;0 +67;68;0 +68;69;0 +69;70;0 +70;71;0 +71;72;0 +72;73;0 +73;74;0 +74;75;0 +75;76;0 +76;77;0 +77;78;0 +78;79;0 +79;80;0 +80;81;0 +81;82;0 +82;83;0 +83;84;0 +84;85;0 +85;86;0 +86;87;0 +87;88;0 +88;89;0 +89;90;0 +90;91;0 +91;92;0 +92;93;0 +93;94;0 +94;95;0 +95;96;0 +96;97;0 +97;98;0 +98;99;0 +99;100;0 +100;101;0 +101;102;0 +102;103;0 +103;104;0 +104;105;0 +105;106;0 +106;107;0 +107;108;0 +108;109;0 +109;110;0 +110;111;0 +111;112;0 +112;113;0 +113;114;0 +114;115;0 +115;116;0 +116;117;0 +117;118;0 +118;119;0 +119;120;0 +120;121;0 +121;122;0 +122;123;0 +123;124;0 +124;125;0 +125;126;0 +126;127;0 +127;128;0 +128;129;0 +129;130;0 +130;131;0 +131;132;0 +132;133;0 +133;134;0 +134;135;0 +135;136;0 +136;137;0 +137;138;0 +138;139;0 +139;140;0 +140;141;0 +141;142;0 +142;143;0 +143;144;0 +144;145;0 +145;146;0 +146;147;0 +147;148;0 +148;149;0 +149;150;0 +150;151;0 +151;152;0 +152;153;0 +153;154;0 +154;155;0 +155;156;0 +156;157;0 +157;158;0 +158;159;0 +159;160;0 +160;161;0 +161;162;0 +162;163;0 +163;164;0 +164;165;0 +165;166;0 +166;167;0 +167;168;0 +168;169;0 +169;170;0 +170;171;0 +171;172;0 +172;173;0 +173;174;0 +174;175;0 +175;176;0 +176;177;0 +177;178;0 +178;179;0 +179;180;0 +180;181;0 +181;182;0 +182;183;0 +183;184;0 +184;185;0 +185;186;0 +186;187;0 +187;188;0 +188;189;0 +189;190;0 +190;191;0 +191;192;0 +192;193;0 +193;194;0 +194;195;0 +195;196;0 +196;197;0 +197;198;0 +198;199;0 +199;200;0 +200;201;0 +201;202;0 +202;203;0 +203;204;0 +204;205;0 +205;206;0 +206;207;0 +207;208;0 +208;209;0 +209;210;0 +210;211;0 +211;212;0 +212;213;0 +213;214;0 +214;215;0 +215;216;0 +216;217;0 +217;218;0 +218;219;0 +219;220;0 +220;221;0 +221;222;0 +222;223;0 +223;224;0 +224;0;0 +225;226;0 +226;227;0 +227;228;0 +228;229;0 +229;230;0 +230;231;0 +231;232;0 +232;233;0 +233;234;0 +234;235;0 +235;236;0 +236;225;0 +237;238;0 +238;239;0 +239;240;0 +240;241;0 +241;242;0 +242;243;0 +243;244;0 +244;237;0 +245;246;0 +246;247;0 +247;248;0 +248;249;0 +249;250;0 +250;251;0 +251;252;0 +252;245;0 +253;254;0 +254;255;0 +255;256;0 +256;257;0 +257;258;0 +258;259;0 +259;260;0 +260;261;0 +261;262;0 +262;263;0 +263;264;0 +264;265;0 +265;266;0 +266;267;0 +267;268;0 +268;269;0 +269;270;0 +270;271;0 +271;272;0 +272;273;0 +273;274;0 +274;275;0 +275;253;0 +276;277;0 +277;278;0 +278;279;0 +279;280;0 +280;281;0 +281;282;0 +282;283;0 +283;284;0 +284;285;0 +285;286;0 +286;287;0 +287;288;0 +288;289;0 +289;290;0 +290;291;0 +291;276;0 +292;293;0 +293;294;0 +294;295;0 +295;296;0 +296;297;0 +297;298;0 +298;299;0 +299;300;0 +300;301;0 +301;302;0 +302;292;0 diff --git a/external/jigsaw/geo/parts.jig b/external/jigsaw/geo/parts.jig new file mode 100644 index 0000000..21be3c1 --- /dev/null +++ b/external/jigsaw/geo/parts.jig @@ -0,0 +1,26 @@ + +# +# PARTS.JIG: mechanical part +# + +# To run on WIN platforms: +# +# bin\jigsaw.exe geo\parts.jig +# +# To run on LNX platforms: +# +# bin/jigsaw geo/parts.jig +# +# from jigsaw root folder. +# + + GEOM_FILE = geo/parts.msh + MESH_FILE = out/parts.msh + VERBOSITY = 1 + GEOM_FEAT = TRUE + MESH_TOP1 = TRUE + MESH_DIMS = 2 + HFUN_HMAX = 0.05 + + + diff --git a/external/jigsaw/geo/parts.msh b/external/jigsaw/geo/parts.msh new file mode 100644 index 0000000..37d32bb --- /dev/null +++ b/external/jigsaw/geo/parts.msh @@ -0,0 +1,4181 @@ +# parts.msh geometry file +mshid=1 +ndims=3 +point=1392 +1.851899995324402e-08;-2.771599993002382e-08;1.833299995371363e-08;0 +1.427999996394647e-08;-3.011999992395431e-08;1.833299995371363e-08;0 +2.236199994354138e-08;-2.471899993759052e-08;1.833299995371363e-08;0 +-2.494399993702245e-08;-1.666999995791229e-09;1.333299996633741e-08;0 +-2.494399993702245e-08;-1.666999995791229e-09;1.833299995371363e-08;0 +1.583299996002551e-08;3.999999989900971e-08;-1.166699997054365e-08;0 +1.916699995160798e-08;3.999999989900971e-08;-1.166699997054365e-08;0 +-7.49999998106432e-09;4.33329998905947e-08;8.332999978961198e-09;0 +-7.49999998106432e-09;4.33329998905947e-08;-1.166699997054365e-08;0 +4.999999987376214e-08;2.499999993688107e-08;-2.499999993688107e-08;0 +-4.999999987376214e-08;2.499999993688107e-08;-2.499999993688107e-08;0 +2.092099994717955e-08;2.001799994945941e-08;-1.332999996634498e-09;0 +2.083299994740173e-08;1.916699995160798e-08;-1.332999996634498e-09;0 +2.118099994652312e-08;2.083299994740173e-08;-1.332999996634498e-09;0 +3.333299991584227e-08;-4.33329998905947e-08;8.332999978961198e-09;0 +3.333299991584227e-08;-4.999999987376214e-08;8.332999978961198e-09;0 +2.499999993688107e-08;-4.999999987376214e-08;8.332999978961198e-09;0 +2.499999993688107e-08;-4.33329998905947e-08;8.332999978961198e-09;0 +-1.028199997404045e-08;-9.671999975580549e-09;2.499999993688107e-08;0 +-1.044899997361881e-08;-9.269999976595502e-09;2.499999993688107e-08;0 +-1.05059999734749e-08;-8.838999977683672e-09;2.499999993688107e-08;0 +-1.044899997361881e-08;-8.406999978774366e-09;2.499999993688107e-08;0 +-1.028199997404045e-08;-8.005999979786794e-09;2.499999993688107e-08;0 +-1.001699997470951e-08;-7.659999980660359e-09;2.499999993688107e-08;0 +-9.671999975580549e-09;-7.39499998132942e-09;2.499999993688107e-08;0 +-9.269999976595502e-09;-7.22899998174853e-09;2.499999993688107e-08;0 +-8.838999977683672e-09;-7.171999981892441e-09;2.499999993688107e-08;0 +-8.406999978774366e-09;-7.22899998174853e-09;2.499999993688107e-08;0 +-8.005999979786794e-09;-7.39499998132942e-09;2.499999993688107e-08;0 +-7.659999980660359e-09;-7.659999980660359e-09;2.499999993688107e-08;0 +-7.39499998132942e-09;-8.005999979786794e-09;2.499999993688107e-08;0 +-7.22899998174853e-09;-8.406999978774366e-09;2.499999993688107e-08;0 +-7.171999981892441e-09;-8.838999977683672e-09;2.499999993688107e-08;0 +-7.22899998174853e-09;-9.269999976595502e-09;2.499999993688107e-08;0 +-7.39499998132942e-09;-9.671999975580549e-09;2.499999993688107e-08;0 +-7.659999980660359e-09;-1.001699997470951e-08;2.499999993688107e-08;0 +-8.005999979786794e-09;-1.028199997404045e-08;2.499999993688107e-08;0 +-8.406999978774366e-09;-1.044899997361881e-08;2.499999993688107e-08;0 +-8.838999977683672e-09;-1.05059999734749e-08;2.499999993688107e-08;0 +-9.269999976595502e-09;-1.044899997361881e-08;2.499999993688107e-08;0 +-9.671999975580549e-09;-1.028199997404045e-08;2.499999993688107e-08;0 +-1.001699997470951e-08;-1.001699997470951e-08;2.499999993688107e-08;0 +4.166999989479337e-09;3.999999989900971e-08;8.332999978961198e-09;0 +4.166999989479337e-09;4.33329998905947e-08;8.332999978961198e-09;0 +-1.583299996002551e-08;3.999999989900971e-08;8.332999978961198e-09;0 +-1.583299996002551e-08;3.999999989900971e-08;-1.166699997054365e-08;0 +-2.749999993056917e-08;4.33329998905947e-08;8.332999978961198e-09;0 +-2.749999993056917e-08;3.999999989900971e-08;8.332999978961198e-09;0 +4.166999989479337e-09;1.249999996844053e-08;-4.999999987376214e-09;0 +4.166999989479337e-09;1.249999996844053e-08;-2.499999993688107e-09;0 +4.166999989479337e-09;-4.33329998905947e-08;8.332999978961198e-09;0 +4.166999989479337e-09;-4.33329998905947e-08;-1.166699997054365e-08;0 +2.240799994342524e-08;-1.108599997201054e-08;1.833299995371363e-08;0 +1.881699995249164e-08;-1.64599999584425e-08;1.833299995371363e-08;0 +8.048999979678229e-09;-2.156999994554099e-09;2.499999993688107e-08;0 +7.216999981778826e-09;-4.166999989479337e-09;2.499999993688107e-08;0 +5.892999985121606e-09;-5.892999985121606e-09;2.499999993688107e-08;0 +4.166999989479337e-09;-7.216999981778826e-09;2.499999993688107e-08;0 +2.156999994554099e-09;-8.048999979678229e-09;2.499999993688107e-08;0 +0;-8.332999978961198e-09;2.499999993688107e-08;0 +-2.156999994554099e-09;-8.048999979678229e-09;2.499999993688107e-08;0 +-4.166999989479337e-09;-7.216999981778826e-09;2.499999993688107e-08;0 +-5.892999985121606e-09;-5.892999985121606e-09;2.499999993688107e-08;0 +-7.216999981778826e-09;-4.166999989479337e-09;2.499999993688107e-08;0 +-8.048999979678229e-09;-2.156999994554099e-09;2.499999993688107e-08;0 +-8.332999978961198e-09;0;2.499999993688107e-08;0 +-8.048999979678229e-09;2.156999994554099e-09;2.499999993688107e-08;0 +-7.216999981778826e-09;4.166999989479337e-09;2.499999993688107e-08;0 +-5.892999985121606e-09;5.892999985121606e-09;2.499999993688107e-08;0 +-4.166999989479337e-09;7.216999981778826e-09;2.499999993688107e-08;0 +-2.156999994554099e-09;8.048999979678229e-09;2.499999993688107e-08;0 +0;8.332999978961198e-09;2.499999993688107e-08;0 +2.156999994554099e-09;8.048999979678229e-09;2.499999993688107e-08;0 +4.166999989479337e-09;7.216999981778826e-09;2.499999993688107e-08;0 +5.892999985121606e-09;5.892999985121606e-09;2.499999993688107e-08;0 +7.216999981778826e-09;4.166999989479337e-09;2.499999993688107e-08;0 +8.048999979678229e-09;2.156999994554099e-09;2.499999993688107e-08;0 +8.332999978961198e-09;0;2.499999993688107e-08;0 +2.91669999263604e-08;-1.916699995160798e-08;-1.332999996634498e-09;0 +2.91669999263604e-08;-1.916699995160798e-08;-8.329999978968771e-10;0 +2.91669999263604e-08;4.166999989479337e-09;-4.999999987376214e-09;0 +2.91669999263604e-08;4.166999989479337e-09;-2.166999994528851e-09;0 +2.166699994529609e-08;-4.999999987376214e-08;8.332999978961198e-09;0 +2.166699994529609e-08;-4.999999987376214e-08;-1.166699997054365e-08;0 +3.74999999053216e-08;4.166999989479337e-09;-4.999999987376214e-09;0 +9.99999997475243e-09;-4.33329998905947e-08;-1.166699997054365e-08;0 +7.49999998106432e-09;-4.33329998905947e-08;-1.166699997054365e-08;0 +1.916699995160798e-08;4.33329998905947e-08;-1.166699997054365e-08;0 +2.166699994529609e-08;4.33329998905947e-08;-1.166699997054365e-08;0 +-7.49999998106432e-09;3.999999989900971e-08;8.332999978961198e-09;0 +-7.49999998106432e-09;3.999999989900971e-08;-1.166699997054365e-08;0 +2.494399993702245e-08;1.666999995791229e-09;1.833299995371363e-08;0 +3.329199991594578e-08;1.666999995791229e-09;1.833299995371363e-08;0 +-2.166699994529609e-08;-4.999999987376214e-08;8.332999978961198e-09;0 +-2.166699994529609e-08;-4.33329998905947e-08;8.332999978961198e-09;0 +-1.249999996844053e-08;4.166999989479337e-09;-4.999999987376214e-09;0 +-2.083299994740173e-08;4.166999989479337e-09;-4.999999987376214e-09;0 +-1.333299996633741e-08;-4.999999987376214e-08;8.332999978961198e-09;0 +-9.99999997475243e-09;-4.999999987376214e-08;8.332999978961198e-09;0 +0;-3.333299991584227e-08;1.333299996633741e-08;0 +-1.666999995791229e-09;-3.329199991594578e-08;1.333299996633741e-08;0 +1.410999996437567e-08;-4.309999989118296e-10;1.666999995791229e-09;0 +1.394299996479731e-08;-8.329999978968771e-10;1.666999995791229e-09;0 +1.367899996546385e-08;-1.178999997023311e-09;1.666999995791229e-09;0 +1.333299996633741e-08;-1.442999996356775e-09;1.666999995791229e-09;0 +1.293099996735236e-08;-1.609999995935141e-09;1.666999995791229e-09;0 +1.249999996844053e-08;-1.666999995791229e-09;1.666999995791229e-09;0 +1.20689999695287e-08;-1.609999995935141e-09;1.666999995791229e-09;0 +1.166699997054365e-08;-1.442999996356775e-09;1.666999995791229e-09;0 +1.132099997141722e-08;-1.178999997023311e-09;1.666999995791229e-09;0 +1.105699997208376e-08;-8.329999978968771e-10;1.666999995791229e-09;0 +1.088999997250539e-08;-4.309999989118296e-10;1.666999995791229e-09;0 +1.08329999726493e-08;0;1.666999995791229e-09;0 +1.088999997250539e-08;4.309999989118296e-10;1.666999995791229e-09;0 +1.105699997208376e-08;8.329999978968771e-10;1.666999995791229e-09;0 +1.132099997141722e-08;1.178999997023311e-09;1.666999995791229e-09;0 +1.166699997054365e-08;1.442999996356775e-09;1.666999995791229e-09;0 +1.20689999695287e-08;1.609999995935141e-09;1.666999995791229e-09;0 +1.249999996844053e-08;1.666999995791229e-09;1.666999995791229e-09;0 +1.293099996735236e-08;1.609999995935141e-09;1.666999995791229e-09;0 +1.333299996633741e-08;1.442999996356775e-09;1.666999995791229e-09;0 +1.367899996546385e-08;1.178999997023311e-09;1.666999995791229e-09;0 +1.394299996479731e-08;8.329999978968771e-10;1.666999995791229e-09;0 +1.410999996437567e-08;4.309999989118296e-10;1.666999995791229e-09;0 +1.416699996423176e-08;0;1.666999995791229e-09;0 +1.881699995249164e-08;1.64599999584425e-08;1.333299996633741e-08;0 +2.240799994342524e-08;1.108599997201054e-08;1.333299996633741e-08;0 +1.333299996633741e-08;-4.33329998905947e-08;8.332999978961198e-09;0 +1.333299996633741e-08;-4.33329998905947e-08;-1.166699997054365e-08;0 +-3.083299992215415e-08;3.999999989900971e-08;8.332999978961198e-09;0 +1.666999995791229e-09;2.494399993702245e-08;1.333299996633741e-08;0 +8.005999979786794e-09;2.368299994020617e-08;1.333299996633741e-08;0 +-1.666999995791229e-09;-3.329199991594578e-08;1.833299995371363e-08;0 +1.666999995791229e-09;3.329199991594578e-08;1.333299996633741e-08;0 +1.666999995791229e-09;3.329199991594578e-08;1.833299995371363e-08;0 +1.249999996844053e-08;-1.249999996844053e-08;-2.499999993688107e-09;0 +1.249999996844053e-08;-4.166999989479337e-09;-2.499999993688107e-09;0 +-2.881899992723902e-08;-2.083299994740173e-08;-4.999999987376214e-09;0 +-2.881899992723902e-08;-2.083299994740173e-08;-2.499999993688107e-09;0 +2.91669999263604e-08;-4.166999989479337e-09;-2.166999994528851e-09;0 +2.91669999263604e-08;-4.166999989479337e-09;-4.999999987376214e-09;0 +3.083299992215415e-08;4.33329998905947e-08;-1.166699997054365e-08;0 +3.333299991584227e-08;4.33329998905947e-08;-1.166699997054365e-08;0 +-3.083299992215415e-08;-4.33329998905947e-08;8.332999978961198e-09;0 +-3.083299992215415e-08;-4.33329998905947e-08;-1.166699997054365e-08;0 +-1.881699995249164e-08;1.64599999584425e-08;1.333299996633741e-08;0 +-1.881699995249164e-08;1.64599999584425e-08;1.833299995371363e-08;0 +1.108599997201054e-08;-2.240799994342524e-08;1.833299995371363e-08;0 +4.191199989418238e-08;-1.264199996808202e-08;-1.332999996634498e-09;0 +4.2916999891645e-08;-1.305799996703172e-08;-1.332999996634498e-09;0 +4.377999988946612e-08;-1.371999996536033e-08;-1.332999996634498e-09;0 +4.444199988779473e-08;-1.458299996318147e-08;-1.332999996634498e-09;0 +4.485799988674445e-08;-1.558799996064408e-08;-1.332999996634498e-09;0 +4.499999988638592e-08;-1.666699995791987e-08;-1.332999996634498e-09;0 +4.485799988674445e-08;-1.774499995519818e-08;-1.332999996634498e-09;0 +4.444199988779473e-08;-1.87499999526608e-08;-1.332999996634498e-09;0 +4.377999988946612e-08;-1.961299995048193e-08;-1.332999996634498e-09;0 +4.2916999891645e-08;-2.027499994881055e-08;-1.332999996634498e-09;0 +4.191199989418238e-08;-2.069099994776025e-08;-1.332999996634498e-09;0 +4.083299989690659e-08;-1.249999996844053e-08;-1.332999996634498e-09;0 +4.083299989690659e-08;-2.083299994740173e-08;-1.332999996634498e-09;0 +-3.011999992395431e-08;-1.427999996394647e-08;1.833299995371363e-08;0 +-3.011999992395431e-08;-1.427999996394647e-08;1.333299996633741e-08;0 +1.666999995791229e-09;4.33329998905947e-08;8.332999978961198e-09;0 +-3.784799990444299e-08;-2.083299994740173e-08;-4.999999987376214e-09;0 +7.216999981778826e-09;-4.166999989479337e-09;-2.499999993688107e-09;0 +-2.166699994529609e-08;4.999999987376214e-08;-1.166699997054365e-08;0 +-2.499999993688107e-08;4.999999987376214e-08;-1.166699997054365e-08;0 +-4.166999989479337e-09;7.216999981778826e-09;-8.329999978968771e-10;0 +-4.166999989479337e-09;7.216999981778826e-09;-4.999999987376214e-09;0 +1.666999995791229e-09;-2.494399993702245e-08;1.333299996633741e-08;0 +1.666999995791229e-09;-2.494399993702245e-08;1.833299995371363e-08;0 +2.166699994529609e-08;-4.33329998905947e-08;-1.166699997054365e-08;0 +1.333299996633741e-08;4.999999987376214e-08;-1.166699997054365e-08;0 +1.333299996633741e-08;4.33329998905947e-08;-1.166699997054365e-08;0 +2.826799992863016e-08;2.175099994508401e-08;-4.999999987376214e-09;0 +2.750199993056412e-08;2.249899994319548e-08;-4.999999987376214e-09;0 +2.65699999329172e-08;2.302599994186494e-08;-4.999999987376214e-09;0 +2.553499993553032e-08;2.329899994117568e-08;-4.999999987376214e-09;0 +2.446499993823182e-08;2.329899994117568e-08;-4.999999987376214e-09;0 +2.342999994084493e-08;2.302599994186494e-08;-4.999999987376214e-09;0 +2.249799994319801e-08;2.249899994319548e-08;-4.999999987376214e-09;0 +2.173199994513197e-08;2.175099994508401e-08;-4.999999987376214e-09;0 +2.881899992723902e-08;2.083299994740173e-08;-4.999999987376214e-09;0 +2.118099994652312e-08;2.083299994740173e-08;-4.999999987376214e-09;0 +-1.108599997201054e-08;2.240799994342524e-08;1.333299996633741e-08;0 +-1.108599997201054e-08;2.240799994342524e-08;1.833299995371363e-08;0 +-3.083299992215415e-08;3.999999989900971e-08;-1.166699997054365e-08;0 +-2.749999993056917e-08;3.999999989900971e-08;-1.166699997054365e-08;0 +2.083299994740173e-08;-1.249999996844053e-08;-1.332999996634498e-09;0 +2.083299994740173e-08;-1.249999996844053e-08;-4.999999987376214e-09;0 +2.749999993056917e-08;-3.999999989900971e-08;8.332999978961198e-09;0 +2.749999993056917e-08;-3.999999989900971e-08;-1.166699997054365e-08;0 +-3.76419999049631e-08;-2.024499994888629e-08;-8.329999978968771e-10;0 +-3.805799990391279e-08;-2.124999994634891e-08;-8.329999978968771e-10;0 +-3.87199999022414e-08;-2.211299994417004e-08;-8.329999978968771e-10;0 +-3.958299990006253e-08;-2.277499994249865e-08;-8.329999978968771e-10;0 +-4.058799989752515e-08;-2.319099994144835e-08;-8.329999978968771e-10;0 +-4.166699989480094e-08;-2.333299994108984e-08;-8.329999978968771e-10;0 +-4.274499989207925e-08;-2.319099994144835e-08;-8.329999978968771e-10;0 +-4.374999988954187e-08;-2.277499994249865e-08;-8.329999978968771e-10;0 +-4.461299988736301e-08;-2.211299994417004e-08;-8.329999978968771e-10;0 +-4.527499988569161e-08;-2.124999994634891e-08;-8.329999978968771e-10;0 +-4.569099988464131e-08;-2.024499994888629e-08;-8.329999978968771e-10;0 +-3.74999999053216e-08;-1.916699995160798e-08;-8.329999978968771e-10;0 +-4.58329998842828e-08;-1.916699995160798e-08;-8.329999978968771e-10;0 +-2.118099994652312e-08;2.083299994740173e-08;-4.999999987376214e-09;0 +-2.118099994652312e-08;2.083299994740173e-08;-2.499999993688107e-09;0 +4.999999987376214e-08;2.499999993688107e-08;-4.999999987376214e-09;0 +-1.119999997172272e-08;-3.139499992073524e-08;1.833299995371363e-08;0 +-1.119999997172272e-08;-3.139499992073524e-08;1.333299996633741e-08;0 +4.954599987490837e-08;-4.01179998987118e-08;8.332999978961198e-09;0 +4.821399987827135e-08;-4.33329998905947e-08;8.332999978961198e-09;0 +4.609499988362132e-08;-4.609499988362132e-08;8.332999978961198e-09;0 +4.33329998905947e-08;-4.821399987827135e-08;8.332999978961198e-09;0 +4.01179998987118e-08;-4.954599987490837e-08;8.332999978961198e-09;0 +4.999999987376214e-08;-3.666699990742473e-08;8.332999978961198e-09;0 +3.666699990742473e-08;-4.999999987376214e-08;8.332999978961198e-09;0 +1.333299996633741e-08;-4.999999987376214e-08;8.332999978961198e-09;0 +-4.254999989257157e-09;-2.001799994945941e-08;-1.332999996634498e-09;0 +-4.166999989479337e-09;-1.916699995160798e-08;-1.332999996634498e-09;0 +-4.514999988600721e-09;-2.083299994740173e-08;-1.332999996634498e-09;0 +-1.851899995324402e-08;2.771599993002382e-08;1.833299995371363e-08;0 +-1.427999996394647e-08;3.011999992395431e-08;1.833299995371363e-08;0 +-2.236199994354138e-08;2.471899993759052e-08;1.833299995371363e-08;0 +-2.471899993759052e-08;2.236199994354138e-08;1.833299995371363e-08;0 +-2.471899993759052e-08;2.236199994354138e-08;1.333299996633741e-08;0 +-1.119999997172272e-08;3.139499992073524e-08;1.833299995371363e-08;0 +-8.005999979786794e-09;2.368299994020617e-08;1.833299995371363e-08;0 +7.49999998106432e-09;4.33329998905947e-08;-1.166699997054365e-08;0 +9.99999997475243e-09;4.33329998905947e-08;-1.166699997054365e-08;0 +8.048999979678229e-09;2.156999994554099e-09;-2.166999994528851e-09;0 +8.332999978961198e-09;0;-2.166999994528851e-09;0 +8.048999979678229e-09;-2.156999994554099e-09;-2.166999994528851e-09;0 +7.216999981778826e-09;4.166999989479337e-09;-2.166999994528851e-09;0 +7.216999981778826e-09;-4.166999989479337e-09;-2.166999994528851e-09;0 +-3.74999999053216e-08;4.166999989479337e-09;-4.999999987376214e-09;0 +-3.74999999053216e-08;4.166999989479337e-09;-2.166999994528851e-09;0 +1.64599999584425e-08;1.881699995249164e-08;1.333299996633741e-08;0 +2.236199994354138e-08;2.471899993759052e-08;1.333299996633741e-08;0 +1.666999995791229e-09;-4.999999987376214e-08;8.332999978961198e-09;0 +1.666999995791229e-09;-4.33329998905947e-08;8.332999978961198e-09;0 +-2.749999993056917e-08;-4.33329998905947e-08;8.332999978961198e-09;0 +-2.499999993688107e-08;-4.33329998905947e-08;8.332999978961198e-09;0 +-3.74999999053216e-08;-1.916699995160798e-08;-1.332999996634498e-09;0 +-3.74999999053216e-08;-1.249999996844053e-08;-1.332999996634498e-09;0 +-4.954599987490837e-08;4.01179998987118e-08;8.332999978961198e-09;0 +-4.821399987827135e-08;4.33329998905947e-08;8.332999978961198e-09;0 +-4.609499988362132e-08;4.609499988362132e-08;8.332999978961198e-09;0 +-4.33329998905947e-08;4.821399987827135e-08;8.332999978961198e-09;0 +-4.01179998987118e-08;4.954599987490837e-08;8.332999978961198e-09;0 +-4.999999987376214e-08;3.666699990742473e-08;8.332999978961198e-09;0 +-3.666699990742473e-08;4.999999987376214e-08;8.332999978961198e-09;0 +-3.74999999053216e-08;1.916699995160798e-08;-8.329999978968771e-10;0 +4.58329998842828e-08;-1.916699995160798e-08;-4.999999987376214e-09;0 +4.58329998842828e-08;1.916699995160798e-08;-4.999999987376214e-09;0 +2.368299994020617e-08;8.005999979786794e-09;1.833299995371363e-08;0 +2.368299994020617e-08;8.005999979786794e-09;1.333299996633741e-08;0 +-3.083299992215415e-08;-3.999999989900971e-08;-1.166699997054365e-08;0 +7.49999998106432e-09;3.999999989900971e-08;-1.166699997054365e-08;0 +-1.666999995791229e-09;4.33329998905947e-08;8.332999978961198e-09;0 +-1.666999995791229e-09;4.33329998905947e-08;-1.166699997054365e-08;0 +1.249999996844053e-08;-1.249999996844053e-08;-4.999999987376214e-09;0 +2.749999993056917e-08;-4.33329998905947e-08;8.332999978961198e-09;0 +-2.236199994354138e-08;2.471899993759052e-08;1.333299996633741e-08;0 +1.666999995791229e-09;4.999999987376214e-08;-1.166699997054365e-08;0 +-1.666999995791229e-09;4.999999987376214e-08;-1.166699997054365e-08;0 +-4.166999989479337e-09;1.916699995160798e-08;-8.329999978968771e-10;0 +-2.173199994513197e-08;2.175099994508401e-08;-4.999999987376214e-09;0 +-2.249799994319801e-08;2.249899994319548e-08;-4.999999987376214e-09;0 +-2.342999994084493e-08;2.302599994186494e-08;-4.999999987376214e-09;0 +-2.446499993823182e-08;2.329899994117568e-08;-4.999999987376214e-09;0 +-2.553499993553032e-08;2.329899994117568e-08;-4.999999987376214e-09;0 +-2.65699999329172e-08;2.302599994186494e-08;-4.999999987376214e-09;0 +-2.750199993056412e-08;2.249899994319548e-08;-4.999999987376214e-09;0 +-2.826799992863016e-08;2.175099994508401e-08;-4.999999987376214e-09;0 +-2.881899992723902e-08;2.083299994740173e-08;-4.999999987376214e-09;0 +-1.64599999584425e-08;-1.881699995249164e-08;1.833299995371363e-08;0 +-2.236199994354138e-08;-2.471899993759052e-08;1.833299995371363e-08;0 +1.916699995160798e-08;-4.33329998905947e-08;-1.166699997054365e-08;0 +1.916699995160798e-08;-3.999999989900971e-08;-1.166699997054365e-08;0 +4.166999989479337e-09;-1.249999996844053e-08;-2.499999993688107e-09;0 +2.499999993688107e-08;4.33329998905947e-08;8.332999978961198e-09;0 +2.499999993688107e-08;4.999999987376214e-08;8.332999978961198e-09;0 +1.215199996931915e-08;2.083299994740173e-08;-4.999999987376214e-09;0 +-1.215199996931915e-08;2.083299994740173e-08;-1.332999996634498e-09;0 +-1.215199996931915e-08;2.083299994740173e-08;-4.999999987376214e-09;0 +-1.916699995160798e-08;4.33329998905947e-08;-1.166699997054365e-08;0 +-1.916699995160798e-08;3.999999989900971e-08;-1.166699997054365e-08;0 +-2.118099994652312e-08;-2.083299994740173e-08;-4.999999987376214e-09;0 +-1.215199996931915e-08;-2.083299994740173e-08;-4.999999987376214e-09;0 +2.166699994529609e-08;4.33329998905947e-08;8.332999978961198e-09;0 +1.916699995160798e-08;4.33329998905947e-08;8.332999978961198e-09;0 +-1.333299996633741e-08;4.33329998905947e-08;-1.166699997054365e-08;0 +-1.333299996633741e-08;4.999999987376214e-08;-1.166699997054365e-08;0 +-1.249999996844053e-08;1.249999996844053e-08;-4.999999987376214e-09;0 +-1.249999996844053e-08;1.916699995160798e-08;-8.329999978968771e-10;0 +-1.249999996844053e-08;-1.916699995160798e-08;-8.329999978968771e-10;0 +2.118099994652312e-08;-2.083299994740173e-08;-1.332999996634498e-09;0 +1.583299996002551e-08;-4.33329998905947e-08;8.332999978961198e-09;0 +1.583299996002551e-08;-4.33329998905947e-08;-1.166699997054365e-08;0 +-9.99999997475243e-09;4.999999987376214e-08;-1.166699997054365e-08;0 +-7.49999998106432e-09;-4.33329998905947e-08;-1.166699997054365e-08;0 +-9.99999997475243e-09;-4.33329998905947e-08;-1.166699997054365e-08;0 +3.74999999053216e-08;1.249999996844053e-08;-4.999999987376214e-09;0 +2.356999994049147e-08;-2.356999994049147e-08;1.333299996633741e-08;0 +2.236199994354138e-08;-2.471899993759052e-08;1.333299996633741e-08;0 +-2.471899993759052e-08;-2.236199994354138e-08;1.333299996633741e-08;0 +-2.471899993759052e-08;-2.236199994354138e-08;1.833299995371363e-08;0 +-4.999999987376214e-08;2.499999993688107e-08;-4.999999987376214e-09;0 +-9.99999997475243e-09;4.33329998905947e-08;-1.166699997054365e-08;0 +-4.166999989479337e-09;-1.916699995160798e-08;-8.329999978968771e-10;0 +-2.156999994554099e-09;8.048999979678229e-09;-4.999999987376214e-09;0 +0;8.332999978961198e-09;-4.999999987376214e-09;0 +2.156999994554099e-09;8.048999979678229e-09;-4.999999987376214e-09;0 +4.166999989479337e-09;7.216999981778826e-09;-4.999999987376214e-09;0 +-4.514999988600721e-09;-2.083299994740173e-08;-4.999999987376214e-09;0 +4.514999988600721e-09;-2.083299994740173e-08;-4.999999987376214e-09;0 +-9.99999997475243e-09;-4.999999987376214e-08;-1.166699997054365e-08;0 +9.99999997475243e-09;-4.999999987376214e-08;8.332999978961198e-09;0 +9.99999997475243e-09;-4.999999987376214e-08;-1.166699997054365e-08;0 +-7.49999998106432e-09;-4.33329998905947e-08;8.332999978961198e-09;0 +3.269299991745812e-08;6.502999983581504e-09;1.833299995371363e-08;0 +3.139499992073524e-08;1.119999997172272e-08;1.833299995371363e-08;0 +-4.999999987376214e-08;3.666699990742473e-08;-1.166699997054365e-08;0 +-4.999999987376214e-08;3.333299991584227e-08;-1.166699997054365e-08;0 +-9.671999975580549e-09;1.028199997404045e-08;1.666999995791229e-09;0 +-9.269999976595502e-09;1.044899997361881e-08;1.666999995791229e-09;0 +-8.838999977683672e-09;1.05059999734749e-08;1.666999995791229e-09;0 +-8.406999978774366e-09;1.044899997361881e-08;1.666999995791229e-09;0 +-8.005999979786794e-09;1.028199997404045e-08;1.666999995791229e-09;0 +-7.659999980660359e-09;1.001699997470951e-08;1.666999995791229e-09;0 +-7.39499998132942e-09;9.671999975580549e-09;1.666999995791229e-09;0 +-7.22899998174853e-09;9.269999976595502e-09;1.666999995791229e-09;0 +-7.171999981892441e-09;8.838999977683672e-09;1.666999995791229e-09;0 +-7.22899998174853e-09;8.406999978774366e-09;1.666999995791229e-09;0 +-7.39499998132942e-09;8.005999979786794e-09;1.666999995791229e-09;0 +-7.659999980660359e-09;7.659999980660359e-09;1.666999995791229e-09;0 +-8.005999979786794e-09;7.39499998132942e-09;1.666999995791229e-09;0 +-8.406999978774366e-09;7.22899998174853e-09;1.666999995791229e-09;0 +-8.838999977683672e-09;7.171999981892441e-09;1.666999995791229e-09;0 +-9.269999976595502e-09;7.22899998174853e-09;1.666999995791229e-09;0 +-9.671999975580549e-09;7.39499998132942e-09;1.666999995791229e-09;0 +-1.001699997470951e-08;7.659999980660359e-09;1.666999995791229e-09;0 +-1.028199997404045e-08;8.005999979786794e-09;1.666999995791229e-09;0 +-1.044899997361881e-08;8.406999978774366e-09;1.666999995791229e-09;0 +-1.05059999734749e-08;8.838999977683672e-09;1.666999995791229e-09;0 +-1.044899997361881e-08;9.269999976595502e-09;1.666999995791229e-09;0 +-1.028199997404045e-08;9.671999975580549e-09;1.666999995791229e-09;0 +-1.001699997470951e-08;1.001699997470951e-08;1.666999995791229e-09;0 +2.236199994354138e-08;2.471899993759052e-08;1.833299995371363e-08;0 +-1.119999997172272e-08;3.139499992073524e-08;1.333299996633741e-08;0 +7.49999998106432e-09;4.33329998905947e-08;8.332999978961198e-09;0 +7.49999998106432e-09;3.999999989900971e-08;8.332999978961198e-09;0 +-3.333299991584227e-08;-4.33329998905947e-08;8.332999978961198e-09;0 +-1.583299996002551e-08;-3.999999989900971e-08;8.332999978961198e-09;0 +-1.583299996002551e-08;-4.33329998905947e-08;8.332999978961198e-09;0 +-4.01179998987118e-08;4.954599987490837e-08;-1.166699997054365e-08;0 +-4.33329998905947e-08;4.821399987827135e-08;-1.166699997054365e-08;0 +-4.609499988362132e-08;4.609499988362132e-08;-1.166699997054365e-08;0 +-4.821399987827135e-08;4.33329998905947e-08;-1.166699997054365e-08;0 +-4.954599987490837e-08;4.01179998987118e-08;-1.166699997054365e-08;0 +-3.666699990742473e-08;4.999999987376214e-08;-1.166699997054365e-08;0 +-2.083299994740173e-08;4.166999989479337e-09;-2.499999993688107e-09;0 +-2.083299994740173e-08;1.249999996844053e-08;-2.499999993688107e-09;0 +-1.666999995791229e-09;4.999999987376214e-08;8.332999978961198e-09;0 +-6.502999983581504e-09;3.269299991745812e-08;1.833299995371363e-08;0 +-1.666999995791229e-09;3.329199991594578e-08;1.833299995371363e-08;0 +-1.64599999584425e-08;-1.881699995249164e-08;1.333299996633741e-08;0 +-2.166699994529609e-08;-4.999999987376214e-08;-1.166699997054365e-08;0 +-3.269299991745812e-08;-6.502999983581504e-09;1.833299995371363e-08;0 +-3.329199991594578e-08;-1.666999995791229e-09;1.833299995371363e-08;0 +-3.139499992073524e-08;-1.119999997172272e-08;1.833299995371363e-08;0 +4.514999988600721e-09;-2.083299994740173e-08;-2.499999993688107e-09;0 +1.215199996931915e-08;-2.083299994740173e-08;-2.499999993688107e-09;0 +2.907899992658258e-08;-2.001799994945941e-08;-1.332999996634498e-09;0 +2.881899992723902e-08;-2.083299994740173e-08;-1.332999996634498e-09;0 +-1.583299996002551e-08;-4.33329998905947e-08;-1.166699997054365e-08;0 +-1.583299996002551e-08;-3.999999989900971e-08;-1.166699997054365e-08;0 +3.083299992215415e-08;3.999999989900971e-08;8.332999978961198e-09;0 +2.749999993056917e-08;3.999999989900971e-08;8.332999978961198e-09;0 +4.166999989479337e-09;-7.216999981778826e-09;-4.999999987376214e-09;0 +4.166999989479337e-09;-1.249999996844053e-08;-4.999999987376214e-09;0 +3.329199991594578e-08;-1.666999995791229e-09;1.333299996633741e-08;0 +2.494399993702245e-08;-1.666999995791229e-09;1.333299996633741e-08;0 +-3.784799990444299e-08;2.083299994740173e-08;-4.999999987376214e-09;0 +-3.784799990444299e-08;2.083299994740173e-08;-1.332999996634498e-09;0 +1.427999996394647e-08;3.011999992395431e-08;1.833299995371363e-08;0 +1.108599997201054e-08;2.240799994342524e-08;1.833299995371363e-08;0 +3.333299991584227e-08;4.999999987376214e-08;-1.166699997054365e-08;0 +3.74999999053216e-08;-1.249999996844053e-08;-4.999999987376214e-09;0 +2.91669999263604e-08;-1.249999996844053e-08;-4.999999987376214e-09;0 +1.249999996844053e-08;-4.166999989479337e-09;-4.999999987376214e-09;0 +1.427999996394647e-08;3.011999992395431e-08;1.333299996633741e-08;0 +-2.91669999263604e-08;-1.249999996844053e-08;-2.499999993688107e-09;0 +-2.91669999263604e-08;-1.249999996844053e-08;-4.999999987376214e-09;0 +-3.139499992073524e-08;-1.119999997172272e-08;1.333299996633741e-08;0 +-2.499999993688107e-08;4.999999987376214e-08;8.332999978961198e-09;0 +-2.499999993688107e-08;4.33329998905947e-08;8.332999978961198e-09;0 +-2.499999993688107e-08;4.33329998905947e-08;-1.166699997054365e-08;0 +-1.666999995791229e-09;-2.494399993702245e-08;1.333299996633741e-08;0 +-8.005999979786794e-09;-2.368299994020617e-08;1.333299996633741e-08;0 +3.011999992395431e-08;-1.427999996394647e-08;1.333299996633741e-08;0 +2.240799994342524e-08;-1.108599997201054e-08;1.333299996633741e-08;0 +-1.249999996844053e-08;1.249999996844053e-08;-1.332999996634498e-09;0 +1.583299996002551e-08;-3.999999989900971e-08;8.332999978961198e-09;0 +-2.881899992723902e-08;2.083299994740173e-08;-2.499999993688107e-09;0 +2.173199994513197e-08;-2.175099994508401e-08;-4.999999987376214e-09;0 +2.249799994319801e-08;-2.249899994319548e-08;-4.999999987376214e-09;0 +2.342999994084493e-08;-2.302599994186494e-08;-4.999999987376214e-09;0 +2.446499993823182e-08;-2.329899994117568e-08;-4.999999987376214e-09;0 +2.553499993553032e-08;-2.329899994117568e-08;-4.999999987376214e-09;0 +2.65699999329172e-08;-2.302599994186494e-08;-4.999999987376214e-09;0 +2.750199993056412e-08;-2.249899994319548e-08;-4.999999987376214e-09;0 +2.826799992863016e-08;-2.175099994508401e-08;-4.999999987376214e-09;0 +2.118099994652312e-08;-2.083299994740173e-08;-4.999999987376214e-09;0 +2.881899992723902e-08;-2.083299994740173e-08;-4.999999987376214e-09;0 +-2.083299994740173e-08;-4.166999989479337e-09;-4.999999987376214e-09;0 +-1.249999996844053e-08;-4.166999989479337e-09;-4.999999987376214e-09;0 +2.083299994740173e-08;4.166999989479337e-09;-2.166999994528851e-09;0 +-1.851899995324402e-08;-2.771599993002382e-08;1.833299995371363e-08;0 +-1.427999996394647e-08;-3.011999992395431e-08;1.833299995371363e-08;0 +2.749999993056917e-08;4.33329998905947e-08;8.332999978961198e-09;0 +2.91669999263604e-08;-1.249999996844053e-08;-1.332999996634498e-09;0 +-8.005999979786794e-09;2.368299994020617e-08;1.333299996633741e-08;0 +-1.666999995791229e-09;2.494399993702245e-08;1.333299996633741e-08;0 +1.333299996633741e-08;-4.999999987376214e-08;-1.166699997054365e-08;0 +-4.166999989479337e-09;1.249999996844053e-08;-1.332999996634498e-09;0 +-4.166999989479337e-09;1.249999996844053e-08;-4.999999987376214e-09;0 +2.749999993056917e-08;-4.33329998905947e-08;-1.166699997054365e-08;0 +-2.240799994342524e-08;-1.108599997201054e-08;1.333299996633741e-08;0 +-2.240799994342524e-08;1.108599997201054e-08;1.833299995371363e-08;0 +-4.166999989479337e-09;-1.249999996844053e-08;-4.999999987376214e-09;0 +-4.166999989479337e-09;-7.216999981778826e-09;-4.999999987376214e-09;0 +-2.236199994354138e-08;-2.471899993759052e-08;1.333299996633741e-08;0 +-2.356999994049147e-08;-2.356999994049147e-08;1.333299996633741e-08;0 +-4.58329998842828e-08;1.916699995160798e-08;-4.999999987376214e-09;0 +-4.58329998842828e-08;1.916699995160798e-08;-8.329999978968771e-10;0 +-2.499999993688107e-08;-4.999999987376214e-08;8.332999978961198e-09;0 +-4.166999989479337e-09;4.33329998905947e-08;-1.166699997054365e-08;0 +4.999999987376214e-08;-3.333299991584227e-08;-1.166699997054365e-08;0 +-4.999999987376214e-08;-3.333299991584227e-08;-1.166699997054365e-08;0 +-3.74999999053216e-08;1.249999996844053e-08;-1.332999996634498e-09;0 +2.91669999263604e-08;1.249999996844053e-08;-1.332999996634498e-09;0 +2.91669999263604e-08;1.249999996844053e-08;-4.999999987376214e-09;0 +3.333299991584227e-08;0;1.333299996633741e-08;0 +3.74999999053216e-08;1.249999996844053e-08;-2.499999993688107e-09;0 +3.74999999053216e-08;4.166999989479337e-09;-2.499999993688107e-09;0 +-1.916699995160798e-08;-4.33329998905947e-08;8.332999978961198e-09;0 +-1.916699995160798e-08;-4.33329998905947e-08;-1.166699997054365e-08;0 +-1.249999996844053e-08;-4.166999989479337e-09;-2.166999994528851e-09;0 +3.837399990311497e-08;-2.171999994516227e-08;-4.999999987376214e-09;0 +3.910199990127696e-08;-2.245099994331667e-08;-4.999999987376214e-09;0 +3.998799989904001e-08;-2.297999994198108e-08;-4.999999987376214e-09;0 +4.097599989654554e-08;-2.327599994123375e-08;-4.999999987376214e-09;0 +4.200699989394252e-08;-2.331899994112518e-08;-4.999999987376214e-09;0 +4.301599989139504e-08;-2.310899994165538e-08;-4.999999987376214e-09;0 +4.394299988905459e-08;-2.26559999427991e-08;-4.999999987376214e-09;0 +4.473099988706508e-08;-2.198999994448059e-08;-4.999999987376214e-09;0 +4.532999988555276e-08;-2.115099994659886e-08;-4.999999987376214e-09;0 +4.570599988460345e-08;-2.018999994902515e-08;-4.999999987376214e-09;0 +3.784799990444299e-08;-2.083299994740173e-08;-4.999999987376214e-09;0 +8.005999979786794e-09;2.368299994020617e-08;1.833299995371363e-08;0 +-3.333299991584227e-08;4.33329998905947e-08;8.332999978961198e-09;0 +-3.333299991584227e-08;4.33329998905947e-08;-1.166699997054365e-08;0 +-2.240799994342524e-08;1.108599997201054e-08;1.333299996633741e-08;0 +-2.91669999263604e-08;4.166999989479337e-09;-4.999999987376214e-09;0 +-4.999999987376214e-08;3.333299991584227e-08;-2.499999993688107e-08;0 +3.083299992215415e-08;-3.999999989900971e-08;-1.166699997054365e-08;0 +-1.916699995160798e-08;3.999999989900971e-08;8.332999978961198e-09;0 +-1.916699995160798e-08;4.33329998905947e-08;8.332999978961198e-09;0 +1.583299996002551e-08;4.33329998905947e-08;8.332999978961198e-09;0 +1.583299996002551e-08;4.33329998905947e-08;-1.166699997054365e-08;0 +4.999999987376214e-08;3.666699990742473e-08;8.332999978961198e-09;0 +4.999999987376214e-08;3.666699990742473e-08;-1.166699997054365e-08;0 +2.083299994740173e-08;-4.166999989479337e-09;-2.166999994528851e-09;0 +-4.166999989479337e-09;-3.999999989900971e-08;8.332999978961198e-09;0 +-4.166999989479337e-09;-4.33329998905947e-08;8.332999978961198e-09;0 +-3.784799990444299e-08;-2.083299994740173e-08;-1.332999996634498e-09;0 +-1.215199996931915e-08;-2.083299994740173e-08;-1.332999996634498e-09;0 +-3.74999999053216e-08;1.249999996844053e-08;-4.999999987376214e-09;0 +-4.166999989479337e-09;-1.249999996844053e-08;-1.332999996634498e-09;0 +-1.881699995249164e-08;-1.64599999584425e-08;1.333299996633741e-08;0 +-1.249999996844053e-08;-1.249999996844053e-08;-1.332999996634498e-09;0 +-1.249999996844053e-08;-1.249999996844053e-08;-4.999999987376214e-09;0 +-3.333299991584227e-08;4.999999987376214e-08;8.332999978961198e-09;0 +-3.758799990509942e-08;2.001799994945941e-08;-1.332999996634498e-09;0 +-3.74999999053216e-08;1.916699995160798e-08;-1.332999996634498e-09;0 +2.91669999263604e-08;1.916699995160798e-08;-8.329999978968771e-10;0 +1.119999997172272e-08;3.139499992073524e-08;1.833299995371363e-08;0 +1.119999997172272e-08;3.139499992073524e-08;1.333299996633741e-08;0 +1.249999996844053e-08;4.166999989479337e-09;-2.499999993688107e-09;0 +7.216999981778826e-09;4.166999989479337e-09;-2.499999993688107e-09;0 +-1.27559999677942e-08;3.079599992224757e-08;1.333299996633741e-08;0 +2.499999993688107e-08;4.999999987376214e-08;-1.166699997054365e-08;0 +2.499999993688107e-08;4.33329998905947e-08;-1.166699997054365e-08;0 +1.881699995249164e-08;-1.64599999584425e-08;1.333299996633741e-08;0 +2.471899993759052e-08;-2.236199994354138e-08;1.333299996633741e-08;0 +1.27559999677942e-08;3.079599992224757e-08;1.333299996633741e-08;0 +-1.108599997201054e-08;-2.240799994342524e-08;1.833299995371363e-08;0 +1.666999995791229e-09;-3.329199991594578e-08;1.333299996633741e-08;0 +-1.108599997201054e-08;-2.240799994342524e-08;1.333299996633741e-08;0 +3.083299992215415e-08;-3.999999989900971e-08;8.332999978961198e-09;0 +-1.916699995160798e-08;-3.999999989900971e-08;-1.166699997054365e-08;0 +3.333299991584227e-08;-4.999999987376214e-08;-1.166699997054365e-08;0 +3.666699990742473e-08;-4.999999987376214e-08;-1.166699997054365e-08;0 +1.427999996394647e-08;-3.011999992395431e-08;1.333299996633741e-08;0 +1.27559999677942e-08;-3.079599992224757e-08;1.333299996633741e-08;0 +-2.368299994020617e-08;-8.005999979786794e-09;1.833299995371363e-08;0 +-2.368299994020617e-08;-8.005999979786794e-09;1.333299996633741e-08;0 +-1.333299996633741e-08;4.999999987376214e-08;8.332999978961198e-09;0 +-1.333299996633741e-08;4.33329998905947e-08;8.332999978961198e-09;0 +-2.91669999263604e-08;-4.166999989479337e-09;-2.499999993688107e-09;0 +-8.005999979786794e-09;-2.368299994020617e-08;1.833299995371363e-08;0 +-1.666999995791229e-09;-4.999999987376214e-08;-1.166699997054365e-08;0 +1.666999995791229e-09;-4.999999987376214e-08;-1.166699997054365e-08;0 +-3.079599992224757e-08;1.27559999677942e-08;1.333299996633741e-08;0 +-3.011999992395431e-08;1.427999996394647e-08;1.333299996633741e-08;0 +-3.837399990311497e-08;2.171999994516227e-08;-4.999999987376214e-09;0 +-3.910199990127696e-08;2.245099994331667e-08;-4.999999987376214e-09;0 +-3.998799989904001e-08;2.297999994198108e-08;-4.999999987376214e-09;0 +-4.097599989654554e-08;2.327599994123375e-08;-4.999999987376214e-09;0 +-4.200699989394252e-08;2.331899994112518e-08;-4.999999987376214e-09;0 +-4.301599989139504e-08;2.310899994165538e-08;-4.999999987376214e-09;0 +-4.394299988905459e-08;2.26559999427991e-08;-4.999999987376214e-09;0 +-4.473099988706508e-08;2.198999994448059e-08;-4.999999987376214e-09;0 +-4.532999988555276e-08;2.115099994659886e-08;-4.999999987376214e-09;0 +-4.570599988460345e-08;2.018999994902515e-08;-4.999999987376214e-09;0 +5.064999987212105e-09;-2.175099994508401e-08;-4.999999987376214e-09;0 +5.831999985275616e-09;-2.249899994319548e-08;-4.999999987376214e-09;0 +6.762999982925067e-09;-2.302599994186494e-08;-4.999999987376214e-09;0 +7.797999980311943e-09;-2.329899994117568e-08;-4.999999987376214e-09;0 +8.868999977607928e-09;-2.329899994117568e-08;-4.999999987376214e-09;0 +9.903999974994805e-09;-2.302599994186494e-08;-4.999999987376214e-09;0 +1.083499997264426e-08;-2.249899994319548e-08;-4.999999987376214e-09;0 +1.160099997071029e-08;-2.175099994508401e-08;-4.999999987376214e-09;0 +1.215199996931915e-08;-2.083299994740173e-08;-4.999999987376214e-09;0 +-2.118099994652312e-08;-2.083299994740173e-08;-2.499999993688107e-09;0 +8.005999979786794e-09;-2.368299994020617e-08;1.833299995371363e-08;0 +8.005999979786794e-09;-2.368299994020617e-08;1.333299996633741e-08;0 +-4.166999989479337e-09;-4.33329998905947e-08;-1.166699997054365e-08;0 +-4.166999989479337e-09;-3.999999989900971e-08;-1.166699997054365e-08;0 +1.108599997201054e-08;2.240799994342524e-08;1.333299996633741e-08;0 +2.91669999263604e-08;1.916699995160798e-08;-1.332999996634498e-09;0 +2.494399993702245e-08;1.666999995791229e-09;1.333299996633741e-08;0 +-3.329199991594578e-08;-1.666999995791229e-09;1.333299996633741e-08;0 +-2.166699994529609e-08;4.33329998905947e-08;8.332999978961198e-09;0 +2.499999993688107e-08;-4.999999987376214e-08;-1.166699997054365e-08;0 +-2.749999993056917e-08;4.33329998905947e-08;-1.166699997054365e-08;0 +4.083299989690659e-08;2.083299994740173e-08;-1.332999996634498e-09;0 +2.881899992723902e-08;2.083299994740173e-08;-1.332999996634498e-09;0 +-1.27559999677942e-08;-3.079599992224757e-08;1.333299996633741e-08;0 +-1.427999996394647e-08;-3.011999992395431e-08;1.333299996633741e-08;0 +1.64599999584425e-08;1.881699995249164e-08;1.833299995371363e-08;0 +-1.666999995791229e-09;2.494399993702245e-08;1.833299995371363e-08;0 +-1.64599999584425e-08;1.881699995249164e-08;1.833299995371363e-08;0 +-1.64599999584425e-08;1.881699995249164e-08;1.333299996633741e-08;0 +-2.083299994740173e-08;1.249999996844053e-08;-4.999999987376214e-09;0 +1.666999995791229e-09;4.999999987376214e-08;8.332999978961198e-09;0 +-2.91669999263604e-08;-4.166999989479337e-09;-4.999999987376214e-09;0 +4.514999988600721e-09;2.083299994740173e-08;-2.499999993688107e-09;0 +4.514999988600721e-09;2.083299994740173e-08;-4.999999987376214e-09;0 +-2.356999994049147e-08;2.356999994049147e-08;1.333299996633741e-08;0 +2.083299994740173e-08;1.916699995160798e-08;-8.329999978968771e-10;0 +2.083299994740173e-08;-1.916699995160798e-08;-8.329999978968771e-10;0 +-4.58329998842828e-08;-1.916699995160798e-08;-4.999999987376214e-09;0 +2.749999993056917e-08;3.999999989900971e-08;-1.166699997054365e-08;0 +-4.166999989479337e-09;1.916699995160798e-08;-1.332999996634498e-09;0 +5.892999985121606e-09;5.892999985121606e-09;-2.499999993688107e-09;0 +4.166999989479337e-09;7.216999981778826e-09;-2.499999993688107e-09;0 +3.784799990444299e-08;-2.083299994740173e-08;-2.499999993688107e-09;0 +4.083299989690659e-08;-2.083299994740173e-08;-2.499999993688107e-09;0 +3.011999992395431e-08;1.427999996394647e-08;1.333299996633741e-08;0 +3.079599992224757e-08;1.27559999677942e-08;1.333299996633741e-08;0 +1.851899995324402e-08;2.771599993002382e-08;1.833299995371363e-08;0 +-2.749999993056917e-08;-4.33329998905947e-08;-1.166699997054365e-08;0 +2.083299994740173e-08;1.249999996844053e-08;-4.999999987376214e-09;0 +2.083299994740173e-08;1.249999996844053e-08;-1.332999996634498e-09;0 +4.191199989418238e-08;2.069099994776025e-08;-1.332999996634498e-09;0 +4.2916999891645e-08;2.027499994881055e-08;-1.332999996634498e-09;0 +4.377999988946612e-08;1.961299995048193e-08;-1.332999996634498e-09;0 +4.444199988779473e-08;1.87499999526608e-08;-1.332999996634498e-09;0 +4.485799988674445e-08;1.774499995519818e-08;-1.332999996634498e-09;0 +4.499999988638592e-08;1.666699995791987e-08;-1.332999996634498e-09;0 +4.485799988674445e-08;1.558799996064408e-08;-1.332999996634498e-09;0 +4.444199988779473e-08;1.458299996318147e-08;-1.332999996634498e-09;0 +4.377999988946612e-08;1.371999996536033e-08;-1.332999996634498e-09;0 +4.2916999891645e-08;1.305799996703172e-08;-1.332999996634498e-09;0 +4.191199989418238e-08;1.264199996808202e-08;-1.332999996634498e-09;0 +4.083299989690659e-08;1.249999996844053e-08;-1.332999996634498e-09;0 +2.471899993759052e-08;2.236199994354138e-08;1.333299996633741e-08;0 +-1.666999995791229e-09;3.329199991594578e-08;1.333299996633741e-08;0 +-3.333299991584227e-08;4.999999987376214e-08;-1.166699997054365e-08;0 +-4.166999989479337e-09;3.999999989900971e-08;8.332999978961198e-09;0 +-1.333299996633741e-08;-4.33329998905947e-08;8.332999978961198e-09;0 +1.333299996633741e-08;4.33329998905947e-08;8.332999978961198e-09;0 +3.139499992073524e-08;1.119999997172272e-08;1.333299996633741e-08;0 +2.083299994740173e-08;-1.916699995160798e-08;-1.332999996634498e-09;0 +-2.368299994020617e-08;8.005999979786794e-09;1.833299995371363e-08;0 +-3.139499992073524e-08;1.119999997172272e-08;1.833299995371363e-08;0 +1.916699995160798e-08;-4.33329998905947e-08;8.332999978961198e-09;0 +3.011999992395431e-08;1.427999996394647e-08;1.833299995371363e-08;0 +-1.916699995160798e-08;-3.999999989900971e-08;8.332999978961198e-09;0 +-2.166699994529609e-08;4.999999987376214e-08;8.332999978961198e-09;0 +-2.083299994740173e-08;-1.249999996844053e-08;-2.499999993688107e-09;0 +-2.083299994740173e-08;-4.166999989479337e-09;-2.499999993688107e-09;0 +-2.749999993056917e-08;-3.999999989900971e-08;-1.166699997054365e-08;0 +1.881699995249164e-08;1.64599999584425e-08;1.833299995371363e-08;0 +2.240799994342524e-08;1.108599997201054e-08;1.833299995371363e-08;0 +3.333299991584227e-08;4.999999987376214e-08;8.332999978961198e-09;0 +3.333299991584227e-08;4.33329998905947e-08;8.332999978961198e-09;0 +-2.166699994529609e-08;4.33329998905947e-08;-1.166699997054365e-08;0 +4.191199989418238e-08;-4.024999989837852e-09;-2.499999993688107e-09;0 +4.2916999891645e-08;-3.607999990890676e-09;-2.499999993688107e-09;0 +4.377999988946612e-08;-2.945999992562065e-09;-2.499999993688107e-09;0 +4.444199988779473e-08;-2.082999994740931e-09;-2.499999993688107e-09;0 +4.485799988674445e-08;-1.077999997278312e-09;-2.499999993688107e-09;0 +4.499999988638592e-08;0;-2.499999993688107e-09;0 +4.485799988674445e-08;1.077999997278312e-09;-2.499999993688107e-09;0 +4.444199988779473e-08;2.082999994740931e-09;-2.499999993688107e-09;0 +4.377999988946612e-08;2.945999992562065e-09;-2.499999993688107e-09;0 +4.2916999891645e-08;3.607999990890676e-09;-2.499999993688107e-09;0 +4.191199989418238e-08;4.024999989837852e-09;-2.499999993688107e-09;0 +4.083299989690659e-08;-4.166999989479337e-09;-2.499999993688107e-09;0 +4.083299989690659e-08;4.166999989479337e-09;-2.499999993688107e-09;0 +1.666999995791229e-09;2.494399993702245e-08;1.833299995371363e-08;0 +1.119999997172272e-08;-3.139499992073524e-08;1.333299996633741e-08;0 +9.99999997475243e-09;4.999999987376214e-08;-1.166699997054365e-08;0 +9.99999997475243e-09;4.999999987376214e-08;8.332999978961198e-09;0 +5.064999987212105e-09;2.175099994508401e-08;-2.499999993688107e-09;0 +5.831999985275616e-09;2.249899994319548e-08;-2.499999993688107e-09;0 +6.762999982925067e-09;2.302599994186494e-08;-2.499999993688107e-09;0 +7.797999980311943e-09;2.329899994117568e-08;-2.499999993688107e-09;0 +8.868999977607928e-09;2.329899994117568e-08;-2.499999993688107e-09;0 +9.903999974994805e-09;2.302599994186494e-08;-2.499999993688107e-09;0 +1.083499997264426e-08;2.249899994319548e-08;-2.499999993688107e-09;0 +1.160099997071029e-08;2.175099994508401e-08;-2.499999993688107e-09;0 +1.215199996931915e-08;2.083299994740173e-08;-2.499999993688107e-09;0 +2.368299994020617e-08;-8.005999979786794e-09;1.333299996633741e-08;0 +4.083299989690659e-08;-4.166999989479337e-09;-2.166999994528851e-09;0 +3.329199991594578e-08;-1.666999995791229e-09;1.833299995371363e-08;0 +2.494399993702245e-08;-1.666999995791229e-09;1.833299995371363e-08;0 +1.249999996844053e-08;1.249999996844053e-08;-2.499999993688107e-09;0 +-1.427999996394647e-08;3.011999992395431e-08;1.333299996633741e-08;0 +-4.166999989479337e-09;3.999999989900971e-08;-1.166699997054365e-08;0 +-1.249999996844053e-08;4.166999989479337e-09;-2.166999994528851e-09;0 +-9.99999997475243e-09;-4.33329998905947e-08;8.332999978961198e-09;0 +3.139499992073524e-08;-1.119999997172272e-08;1.833299995371363e-08;0 +3.139499992073524e-08;-1.119999997172272e-08;1.333299996633741e-08;0 +4.999999987376214e-08;-3.333299991584227e-08;-2.499999993688107e-08;0 +-4.999999987376214e-08;-3.333299991584227e-08;-2.499999993688107e-08;0 +3.083299992215415e-08;-4.33329998905947e-08;8.332999978961198e-09;0 +3.011999992395431e-08;-1.427999996394647e-08;1.833299995371363e-08;0 +4.999999987376214e-08;-2.499999993688107e-08;-4.999999987376214e-09;0 +-1.666999995791229e-09;-4.33329998905947e-08;-1.166699997054365e-08;0 +-3.333299991584227e-08;0;1.333299996633741e-08;0 +2.771599993002382e-08;-1.851899995324402e-08;1.833299995371363e-08;0 +2.471899993759052e-08;-2.236199994354138e-08;1.833299995371363e-08;0 +3.219799991870787e-08;-8.626999978218918e-09;8.332999978961198e-09;0 +2.886799992711531e-08;-1.666699995791987e-08;8.332999978961198e-09;0 +2.356999994049147e-08;-2.356999994049147e-08;8.332999978961198e-09;0 +1.666699995791987e-08;-2.886799992711531e-08;8.332999978961198e-09;0 +8.626999978218918e-09;-3.219799991870787e-08;8.332999978961198e-09;0 +0;-3.333299991584227e-08;8.332999978961198e-09;0 +-8.626999978218918e-09;-3.219799991870787e-08;8.332999978961198e-09;0 +-1.666699995791987e-08;-2.886799992711531e-08;8.332999978961198e-09;0 +-2.356999994049147e-08;-2.356999994049147e-08;8.332999978961198e-09;0 +-2.886799992711531e-08;-1.666699995791987e-08;8.332999978961198e-09;0 +-3.219799991870787e-08;-8.626999978218918e-09;8.332999978961198e-09;0 +-3.333299991584227e-08;0;8.332999978961198e-09;0 +-3.219799991870787e-08;8.626999978218918e-09;8.332999978961198e-09;0 +-2.886799992711531e-08;1.666699995791987e-08;8.332999978961198e-09;0 +-2.356999994049147e-08;2.356999994049147e-08;8.332999978961198e-09;0 +-1.666699995791987e-08;2.886799992711531e-08;8.332999978961198e-09;0 +-8.626999978218918e-09;3.219799991870787e-08;8.332999978961198e-09;0 +0;3.333299991584227e-08;8.332999978961198e-09;0 +8.626999978218918e-09;3.219799991870787e-08;8.332999978961198e-09;0 +1.666699995791987e-08;2.886799992711531e-08;8.332999978961198e-09;0 +2.356999994049147e-08;2.356999994049147e-08;8.332999978961198e-09;0 +2.886799992711531e-08;1.666699995791987e-08;8.332999978961198e-09;0 +3.219799991870787e-08;8.626999978218918e-09;8.332999978961198e-09;0 +3.333299991584227e-08;0;8.332999978961198e-09;0 +1.916699995160798e-08;3.999999989900971e-08;8.332999978961198e-09;0 +1.583299996002551e-08;3.999999989900971e-08;8.332999978961198e-09;0 +3.74999999053216e-08;-1.249999996844053e-08;-2.499999993688107e-09;0 +9.671999975580549e-09;-1.028199997404045e-08;1.666999995791229e-09;0 +9.269999976595502e-09;-1.044899997361881e-08;1.666999995791229e-09;0 +8.838999977683672e-09;-1.05059999734749e-08;1.666999995791229e-09;0 +8.406999978774366e-09;-1.044899997361881e-08;1.666999995791229e-09;0 +8.005999979786794e-09;-1.028199997404045e-08;1.666999995791229e-09;0 +7.659999980660359e-09;-1.001699997470951e-08;1.666999995791229e-09;0 +7.39499998132942e-09;-9.671999975580549e-09;1.666999995791229e-09;0 +7.22899998174853e-09;-9.269999976595502e-09;1.666999995791229e-09;0 +7.171999981892441e-09;-8.838999977683672e-09;1.666999995791229e-09;0 +7.22899998174853e-09;-8.406999978774366e-09;1.666999995791229e-09;0 +7.39499998132942e-09;-8.005999979786794e-09;1.666999995791229e-09;0 +7.659999980660359e-09;-7.659999980660359e-09;1.666999995791229e-09;0 +8.005999979786794e-09;-7.39499998132942e-09;1.666999995791229e-09;0 +8.406999978774366e-09;-7.22899998174853e-09;1.666999995791229e-09;0 +8.838999977683672e-09;-7.171999981892441e-09;1.666999995791229e-09;0 +9.269999976595502e-09;-7.22899998174853e-09;1.666999995791229e-09;0 +9.671999975580549e-09;-7.39499998132942e-09;1.666999995791229e-09;0 +1.001699997470951e-08;-7.659999980660359e-09;1.666999995791229e-09;0 +1.028199997404045e-08;-8.005999979786794e-09;1.666999995791229e-09;0 +1.044899997361881e-08;-8.406999978774366e-09;1.666999995791229e-09;0 +1.05059999734749e-08;-8.838999977683672e-09;1.666999995791229e-09;0 +1.044899997361881e-08;-9.269999976595502e-09;1.666999995791229e-09;0 +1.028199997404045e-08;-9.671999975580549e-09;1.666999995791229e-09;0 +1.001699997470951e-08;-1.001699997470951e-08;1.666999995791229e-09;0 +4.58329998842828e-08;-1.916699995160798e-08;-2.499999993688107e-09;0 +-1.249999996844053e-08;-1.916699995160798e-08;-1.332999996634498e-09;0 +-7.49999998106432e-09;-3.999999989900971e-08;8.332999978961198e-09;0 +-3.74999999053216e-08;-4.166999989479337e-09;-2.166999994528851e-09;0 +-3.74999999053216e-08;-4.166999989479337e-09;-4.999999987376214e-09;0 +-3.666699990742473e-08;-4.999999987376214e-08;8.332999978961198e-09;0 +-3.333299991584227e-08;-4.999999987376214e-08;8.332999978961198e-09;0 +7.49999998106432e-09;-4.33329998905947e-08;8.332999978961198e-09;0 +1.160099997071029e-08;-2.175099994508401e-08;-2.499999993688107e-09;0 +1.083499997264426e-08;-2.249899994319548e-08;-2.499999993688107e-09;0 +9.903999974994805e-09;-2.302599994186494e-08;-2.499999993688107e-09;0 +8.868999977607928e-09;-2.329899994117568e-08;-2.499999993688107e-09;0 +7.797999980311943e-09;-2.329899994117568e-08;-2.499999993688107e-09;0 +6.762999982925067e-09;-2.302599994186494e-08;-2.499999993688107e-09;0 +5.831999985275616e-09;-2.249899994319548e-08;-2.499999993688107e-09;0 +5.064999987212105e-09;-2.175099994508401e-08;-2.499999993688107e-09;0 +6.502999983581504e-09;3.269299991745812e-08;1.833299995371363e-08;0 +-9.99999997475243e-09;4.999999987376214e-08;8.332999978961198e-09;0 +1.583299996002551e-08;-3.999999989900971e-08;-1.166699997054365e-08;0 +-4.166999989479337e-09;4.33329998905947e-08;8.332999978961198e-09;0 +-2.499999993688107e-08;-4.999999987376214e-08;-1.166699997054365e-08;0 +4.166999989479337e-09;-3.999999989900971e-08;8.332999978961198e-09;0 +4.166999989479337e-09;-3.999999989900971e-08;-1.166699997054365e-08;0 +3.333299991584227e-08;-4.33329998905947e-08;-1.166699997054365e-08;0 +1.249999996844053e-08;1.249999996844053e-08;-4.999999987376214e-09;0 +-3.011999992395431e-08;1.427999996394647e-08;1.833299995371363e-08;0 +-3.666699990742473e-08;-4.999999987376214e-08;-1.166699997054365e-08;0 +-3.333299991584227e-08;-4.999999987376214e-08;-1.166699997054365e-08;0 +2.166699994529609e-08;-4.33329998905947e-08;8.332999978961198e-09;0 +4.309999989118296e-10;1.410999996437567e-08;2.499999993688107e-08;0 +8.329999978968771e-10;1.394299996479731e-08;2.499999993688107e-08;0 +1.178999997023311e-09;1.367899996546385e-08;2.499999993688107e-08;0 +1.442999996356775e-09;1.333299996633741e-08;2.499999993688107e-08;0 +1.609999995935141e-09;1.293099996735236e-08;2.499999993688107e-08;0 +1.666999995791229e-09;1.249999996844053e-08;2.499999993688107e-08;0 +1.609999995935141e-09;1.20689999695287e-08;2.499999993688107e-08;0 +1.442999996356775e-09;1.166699997054365e-08;2.499999993688107e-08;0 +1.178999997023311e-09;1.132099997141722e-08;2.499999993688107e-08;0 +8.329999978968771e-10;1.105699997208376e-08;2.499999993688107e-08;0 +4.309999989118296e-10;1.088999997250539e-08;2.499999993688107e-08;0 +0;1.08329999726493e-08;2.499999993688107e-08;0 +-4.309999989118296e-10;1.088999997250539e-08;2.499999993688107e-08;0 +-8.329999978968771e-10;1.105699997208376e-08;2.499999993688107e-08;0 +-1.178999997023311e-09;1.132099997141722e-08;2.499999993688107e-08;0 +-1.442999996356775e-09;1.166699997054365e-08;2.499999993688107e-08;0 +-1.609999995935141e-09;1.20689999695287e-08;2.499999993688107e-08;0 +-1.666999995791229e-09;1.249999996844053e-08;2.499999993688107e-08;0 +-1.609999995935141e-09;1.293099996735236e-08;2.499999993688107e-08;0 +-1.442999996356775e-09;1.333299996633741e-08;2.499999993688107e-08;0 +-1.178999997023311e-09;1.367899996546385e-08;2.499999993688107e-08;0 +-8.329999978968771e-10;1.394299996479731e-08;2.499999993688107e-08;0 +-4.309999989118296e-10;1.410999996437567e-08;2.499999993688107e-08;0 +0;1.416699996423176e-08;2.499999993688107e-08;0 +-1.333299996633741e-08;-4.999999987376214e-08;-1.166699997054365e-08;0 +-1.333299996633741e-08;-4.33329998905947e-08;-1.166699997054365e-08;0 +1.666999995791229e-09;-3.329199991594578e-08;1.833299995371363e-08;0 +-4.999999987376214e-08;-3.666699990742473e-08;8.332999978961198e-09;0 +-4.999999987376214e-08;-3.666699990742473e-08;-1.166699997054365e-08;0 +1.249999996844053e-08;4.166999989479337e-09;-4.999999987376214e-09;0 +1.64599999584425e-08;-1.881699995249164e-08;1.333299996633741e-08;0 +1.108599997201054e-08;-2.240799994342524e-08;1.333299996633741e-08;0 +-3.329199991594578e-08;1.666999995791229e-09;1.833299995371363e-08;0 +-2.494399993702245e-08;1.666999995791229e-09;1.833299995371363e-08;0 +4.999999987376214e-08;-2.499999993688107e-08;-2.499999993688107e-08;0 +-3.083299992215415e-08;4.33329998905947e-08;-1.166699997054365e-08;0 +-1.609899995935393e-08;4.313999989108197e-09;1.333299996633741e-08;0 +-1.443399996355765e-08;8.332999978961198e-09;1.333299996633741e-08;0 +-1.178499997024573e-08;1.178499997024573e-08;1.333299996633741e-08;0 +-8.332999978961198e-09;1.443399996355765e-08;1.333299996633741e-08;0 +-4.313999989108197e-09;1.609899995935393e-08;1.333299996633741e-08;0 +0;1.666699995791987e-08;1.333299996633741e-08;0 +4.313999989108197e-09;1.609899995935393e-08;1.333299996633741e-08;0 +8.332999978961198e-09;1.443399996355765e-08;1.333299996633741e-08;0 +1.178499997024573e-08;1.178499997024573e-08;1.333299996633741e-08;0 +1.443399996355765e-08;8.332999978961198e-09;1.333299996633741e-08;0 +1.609899995935393e-08;4.313999989108197e-09;1.333299996633741e-08;0 +1.666699995791987e-08;0;1.333299996633741e-08;0 +1.609899995935393e-08;-4.313999989108197e-09;1.333299996633741e-08;0 +1.443399996355765e-08;-8.332999978961198e-09;1.333299996633741e-08;0 +1.178499997024573e-08;-1.178499997024573e-08;1.333299996633741e-08;0 +8.332999978961198e-09;-1.443399996355765e-08;1.333299996633741e-08;0 +4.313999989108197e-09;-1.609899995935393e-08;1.333299996633741e-08;0 +0;-1.666699995791987e-08;1.333299996633741e-08;0 +-4.313999989108197e-09;-1.609899995935393e-08;1.333299996633741e-08;0 +-8.332999978961198e-09;-1.443399996355765e-08;1.333299996633741e-08;0 +-1.178499997024573e-08;-1.178499997024573e-08;1.333299996633741e-08;0 +-1.443399996355765e-08;-8.332999978961198e-09;1.333299996633741e-08;0 +-1.609899995935393e-08;-4.313999989108197e-09;1.333299996633741e-08;0 +-1.666699995791987e-08;0;1.333299996633741e-08;0 +-3.329199991594578e-08;1.666999995791229e-09;1.333299996633741e-08;0 +-2.494399993702245e-08;1.666999995791229e-09;1.333299996633741e-08;0 +-2.166699994529609e-08;-4.33329998905947e-08;-1.166699997054365e-08;0 +-1.583299996002551e-08;4.33329998905947e-08;-1.166699997054365e-08;0 +-1.583299996002551e-08;4.33329998905947e-08;8.332999978961198e-09;0 +4.083299989690659e-08;2.083299994740173e-08;-2.499999993688107e-09;0 +1.333299996633741e-08;4.999999987376214e-08;8.332999978961198e-09;0 +-4.514999988600721e-09;2.083299994740173e-08;-1.332999996634498e-09;0 +-1.666999995791229e-09;-4.33329998905947e-08;8.332999978961198e-09;0 +-1.666999995791229e-09;-4.999999987376214e-08;8.332999978961198e-09;0 +-2.749999993056917e-08;-3.999999989900971e-08;8.332999978961198e-09;0 +2.499999993688107e-08;-4.33329998905947e-08;-1.166699997054365e-08;0 +-2.368299994020617e-08;8.005999979786794e-09;1.333299996633741e-08;0 +-3.139499992073524e-08;1.119999997172272e-08;1.333299996633741e-08;0 +4.999999987376214e-08;3.333299991584227e-08;-1.166699997054365e-08;0 +4.999999987376214e-08;-3.666699990742473e-08;-1.166699997054365e-08;0 +1.666999995791229e-09;-4.33329998905947e-08;-1.166699997054365e-08;0 +-3.74999999053216e-08;-1.249999996844053e-08;-4.999999987376214e-09;0 +-1.666999995791229e-09;-2.494399993702245e-08;1.833299995371363e-08;0 +9.99999997475243e-09;-4.33329998905947e-08;8.332999978961198e-09;0 +9.99999997475243e-09;4.33329998905947e-08;8.332999978961198e-09;0 +-4.999999987376214e-08;-2.499999993688107e-08;-2.499999993688107e-08;0 +-4.166999989479337e-09;-7.216999981778826e-09;-8.329999978968771e-10;0 +3.079599992224757e-08;-1.27559999677942e-08;1.333299996633741e-08;0 +-2.771599993002382e-08;1.851899995324402e-08;1.833299995371363e-08;0 +-5.892999985121606e-09;-5.892999985121606e-09;-8.329999978968771e-10;0 +-7.216999981778826e-09;-4.166999989479337e-09;-8.329999978968771e-10;0 +-8.048999979678229e-09;-2.156999994554099e-09;-8.329999978968771e-10;0 +-8.332999978961198e-09;0;-8.329999978968771e-10;0 +-8.048999979678229e-09;2.156999994554099e-09;-8.329999978968771e-10;0 +-7.216999981778826e-09;4.166999989479337e-09;-8.329999978968771e-10;0 +-5.892999985121606e-09;5.892999985121606e-09;-8.329999978968771e-10;0 +3.784799990444299e-08;2.083299994740173e-08;-4.999999987376214e-09;0 +-1.410999996437567e-08;4.309999989118296e-10;2.499999993688107e-08;0 +-1.394299996479731e-08;8.329999978968771e-10;2.499999993688107e-08;0 +-1.367899996546385e-08;1.178999997023311e-09;2.499999993688107e-08;0 +-1.333299996633741e-08;1.442999996356775e-09;2.499999993688107e-08;0 +-1.293099996735236e-08;1.609999995935141e-09;2.499999993688107e-08;0 +-1.249999996844053e-08;1.666999995791229e-09;2.499999993688107e-08;0 +-1.20689999695287e-08;1.609999995935141e-09;2.499999993688107e-08;0 +-1.166699997054365e-08;1.442999996356775e-09;2.499999993688107e-08;0 +-1.132099997141722e-08;1.178999997023311e-09;2.499999993688107e-08;0 +-1.105699997208376e-08;8.329999978968771e-10;2.499999993688107e-08;0 +-1.088999997250539e-08;4.309999989118296e-10;2.499999993688107e-08;0 +-1.08329999726493e-08;0;2.499999993688107e-08;0 +-1.088999997250539e-08;-4.309999989118296e-10;2.499999993688107e-08;0 +-1.105699997208376e-08;-8.329999978968771e-10;2.499999993688107e-08;0 +-1.132099997141722e-08;-1.178999997023311e-09;2.499999993688107e-08;0 +-1.166699997054365e-08;-1.442999996356775e-09;2.499999993688107e-08;0 +-1.20689999695287e-08;-1.609999995935141e-09;2.499999993688107e-08;0 +-1.249999996844053e-08;-1.666999995791229e-09;2.499999993688107e-08;0 +-1.293099996735236e-08;-1.609999995935141e-09;2.499999993688107e-08;0 +-1.333299996633741e-08;-1.442999996356775e-09;2.499999993688107e-08;0 +-1.367899996546385e-08;-1.178999997023311e-09;2.499999993688107e-08;0 +-1.394299996479731e-08;-8.329999978968771e-10;2.499999993688107e-08;0 +-1.410999996437567e-08;-4.309999989118296e-10;2.499999993688107e-08;0 +-1.416699996423176e-08;0;2.499999993688107e-08;0 +2.156999994554099e-09;-8.048999979678229e-09;-4.999999987376214e-09;0 +0;-8.332999978961198e-09;-4.999999987376214e-09;0 +-2.156999994554099e-09;-8.048999979678229e-09;-4.999999987376214e-09;0 +4.083299989690659e-08;1.249999996844053e-08;-2.499999993688107e-09;0 +-2.083299994740173e-08;-1.249999996844053e-08;-4.999999987376214e-09;0 +2.092099994717955e-08;-2.001799994945941e-08;-1.332999996634498e-09;0 +2.771599993002382e-08;1.851899995324402e-08;1.833299995371363e-08;0 +2.471899993759052e-08;2.236199994354138e-08;1.833299995371363e-08;0 +3.329199991594578e-08;1.666999995791229e-09;1.333299996633741e-08;0 +-2.240799994342524e-08;-1.108599997201054e-08;1.833299995371363e-08;0 +-2.826799992863016e-08;-2.175099994508401e-08;-4.999999987376214e-09;0 +-2.750199993056412e-08;-2.249899994319548e-08;-4.999999987376214e-09;0 +-2.65699999329172e-08;-2.302599994186494e-08;-4.999999987376214e-09;0 +-2.553499993553032e-08;-2.329899994117568e-08;-4.999999987376214e-09;0 +-2.446499993823182e-08;-2.329899994117568e-08;-4.999999987376214e-09;0 +-2.342999994084493e-08;-2.302599994186494e-08;-4.999999987376214e-09;0 +-2.249799994319801e-08;-2.249899994319548e-08;-4.999999987376214e-09;0 +-2.173199994513197e-08;-2.175099994508401e-08;-4.999999987376214e-09;0 +-2.91669999263604e-08;1.249999996844053e-08;-4.999999987376214e-09;0 +-2.91669999263604e-08;1.249999996844053e-08;-2.499999993688107e-09;0 +2.083299994740173e-08;-4.166999989479337e-09;-4.999999987376214e-09;0 +-4.514999988600721e-09;2.083299994740173e-08;-4.999999987376214e-09;0 +2.749999993056917e-08;4.33329998905947e-08;-1.166699997054365e-08;0 +3.74999999053216e-08;-4.166999989479337e-09;-4.999999987376214e-09;0 +3.74999999053216e-08;-4.166999989479337e-09;-2.499999993688107e-09;0 +1.410999996437567e-08;-4.309999989118296e-10;2.499999993688107e-08;0 +1.394299996479731e-08;-8.329999978968771e-10;2.499999993688107e-08;0 +1.367899996546385e-08;-1.178999997023311e-09;2.499999993688107e-08;0 +1.333299996633741e-08;-1.442999996356775e-09;2.499999993688107e-08;0 +1.293099996735236e-08;-1.609999995935141e-09;2.499999993688107e-08;0 +1.249999996844053e-08;-1.666999995791229e-09;2.499999993688107e-08;0 +1.20689999695287e-08;-1.609999995935141e-09;2.499999993688107e-08;0 +1.166699997054365e-08;-1.442999996356775e-09;2.499999993688107e-08;0 +1.132099997141722e-08;-1.178999997023311e-09;2.499999993688107e-08;0 +1.105699997208376e-08;-8.329999978968771e-10;2.499999993688107e-08;0 +1.088999997250539e-08;-4.309999989118296e-10;2.499999993688107e-08;0 +1.08329999726493e-08;0;2.499999993688107e-08;0 +1.088999997250539e-08;4.309999989118296e-10;2.499999993688107e-08;0 +1.105699997208376e-08;8.329999978968771e-10;2.499999993688107e-08;0 +1.132099997141722e-08;1.178999997023311e-09;2.499999993688107e-08;0 +1.166699997054365e-08;1.442999996356775e-09;2.499999993688107e-08;0 +1.20689999695287e-08;1.609999995935141e-09;2.499999993688107e-08;0 +1.249999996844053e-08;1.666999995791229e-09;2.499999993688107e-08;0 +1.293099996735236e-08;1.609999995935141e-09;2.499999993688107e-08;0 +1.333299996633741e-08;1.442999996356775e-09;2.499999993688107e-08;0 +1.367899996546385e-08;1.178999997023311e-09;2.499999993688107e-08;0 +1.394299996479731e-08;8.329999978968771e-10;2.499999993688107e-08;0 +1.410999996437567e-08;4.309999989118296e-10;2.499999993688107e-08;0 +1.416699996423176e-08;0;2.499999993688107e-08;0 +4.954599987490837e-08;4.01179998987118e-08;-1.166699997054365e-08;0 +4.821399987827135e-08;4.33329998905947e-08;-1.166699997054365e-08;0 +4.609499988362132e-08;4.609499988362132e-08;-1.166699997054365e-08;0 +4.33329998905947e-08;4.821399987827135e-08;-1.166699997054365e-08;0 +4.01179998987118e-08;4.954599987490837e-08;-1.166699997054365e-08;0 +3.666699990742473e-08;4.999999987376214e-08;-1.166699997054365e-08;0 +3.784799990444299e-08;2.083299994740173e-08;-2.499999993688107e-09;0 +-2.499999993688107e-08;-4.33329998905947e-08;-1.166699997054365e-08;0 +4.083299989690659e-08;-1.249999996844053e-08;-2.499999993688107e-09;0 +6.502999983581504e-09;-3.269299991745812e-08;1.833299995371363e-08;0 +1.119999997172272e-08;-3.139499992073524e-08;1.833299995371363e-08;0 +4.191199989418238e-08;4.024999989837852e-09;-2.166999994528851e-09;0 +4.2916999891645e-08;3.607999990890676e-09;-2.166999994528851e-09;0 +4.377999988946612e-08;2.945999992562065e-09;-2.166999994528851e-09;0 +4.444199988779473e-08;2.082999994740931e-09;-2.166999994528851e-09;0 +4.485799988674445e-08;1.077999997278312e-09;-2.166999994528851e-09;0 +4.499999988638592e-08;0;-2.166999994528851e-09;0 +4.485799988674445e-08;-1.077999997278312e-09;-2.166999994528851e-09;0 +4.444199988779473e-08;-2.082999994740931e-09;-2.166999994528851e-09;0 +4.377999988946612e-08;-2.945999992562065e-09;-2.166999994528851e-09;0 +4.2916999891645e-08;-3.607999990890676e-09;-2.166999994528851e-09;0 +4.191199989418238e-08;-4.024999989837852e-09;-2.166999994528851e-09;0 +4.083299989690659e-08;4.166999989479337e-09;-2.166999994528851e-09;0 +-7.49999998106432e-09;-3.999999989900971e-08;-1.166699997054365e-08;0 +-4.999999987376214e-08;-2.499999993688107e-08;-4.999999987376214e-09;0 +2.083299994740173e-08;4.166999989479337e-09;-4.999999987376214e-09;0 +-1.881699995249164e-08;-1.64599999584425e-08;1.833299995371363e-08;0 +-9.99999997475243e-09;4.33329998905947e-08;8.332999978961198e-09;0 +-3.083299992215415e-08;4.33329998905947e-08;8.332999978961198e-09;0 +2.166699994529609e-08;4.999999987376214e-08;8.332999978961198e-09;0 +2.902499992671892e-08;-2.024499994888629e-08;-8.329999978968771e-10;0 +2.860799992777174e-08;-2.124999994634891e-08;-8.329999978968771e-10;0 +2.794599992944313e-08;-2.211299994417004e-08;-8.329999978968771e-10;0 +2.7082999931622e-08;-2.277499994249865e-08;-8.329999978968771e-10;0 +2.607799993415938e-08;-2.319099994144835e-08;-8.329999978968771e-10;0 +2.499999993688107e-08;-2.333299994108984e-08;-8.329999978968771e-10;0 +2.392199993960276e-08;-2.319099994144835e-08;-8.329999978968771e-10;0 +2.291699994214014e-08;-2.277499994249865e-08;-8.329999978968771e-10;0 +2.2053999944319e-08;-2.211299994417004e-08;-8.329999978968771e-10;0 +2.139199994599039e-08;-2.124999994634891e-08;-8.329999978968771e-10;0 +2.097499994704322e-08;-2.024499994888629e-08;-8.329999978968771e-10;0 +-1.410999996437567e-08;4.309999989118296e-10;1.666999995791229e-09;0 +-1.394299996479731e-08;8.329999978968771e-10;1.666999995791229e-09;0 +-1.367899996546385e-08;1.178999997023311e-09;1.666999995791229e-09;0 +-1.333299996633741e-08;1.442999996356775e-09;1.666999995791229e-09;0 +-1.293099996735236e-08;1.609999995935141e-09;1.666999995791229e-09;0 +-1.249999996844053e-08;1.666999995791229e-09;1.666999995791229e-09;0 +-1.20689999695287e-08;1.609999995935141e-09;1.666999995791229e-09;0 +-1.166699997054365e-08;1.442999996356775e-09;1.666999995791229e-09;0 +-1.132099997141722e-08;1.178999997023311e-09;1.666999995791229e-09;0 +-1.105699997208376e-08;8.329999978968771e-10;1.666999995791229e-09;0 +-1.088999997250539e-08;4.309999989118296e-10;1.666999995791229e-09;0 +-1.08329999726493e-08;0;1.666999995791229e-09;0 +-1.088999997250539e-08;-4.309999989118296e-10;1.666999995791229e-09;0 +-1.105699997208376e-08;-8.329999978968771e-10;1.666999995791229e-09;0 +-1.132099997141722e-08;-1.178999997023311e-09;1.666999995791229e-09;0 +-1.166699997054365e-08;-1.442999996356775e-09;1.666999995791229e-09;0 +-1.20689999695287e-08;-1.609999995935141e-09;1.666999995791229e-09;0 +-1.249999996844053e-08;-1.666999995791229e-09;1.666999995791229e-09;0 +-1.293099996735236e-08;-1.609999995935141e-09;1.666999995791229e-09;0 +-1.333299996633741e-08;-1.442999996356775e-09;1.666999995791229e-09;0 +-1.367899996546385e-08;-1.178999997023311e-09;1.666999995791229e-09;0 +-1.394299996479731e-08;-8.329999978968771e-10;1.666999995791229e-09;0 +-1.410999996437567e-08;-4.309999989118296e-10;1.666999995791229e-09;0 +-1.416699996423176e-08;0;1.666999995791229e-09;0 +1.666999995791229e-09;4.33329998905947e-08;-1.166699997054365e-08;0 +4.166999989479337e-09;4.33329998905947e-08;-1.166699997054365e-08;0 +-1.249999996844053e-08;1.916699995160798e-08;-1.332999996634498e-09;0 +0;3.333299991584227e-08;1.333299996633741e-08;0 +4.166999989479337e-09;-7.216999981778826e-09;-2.499999993688107e-09;0 +-4.254999989257157e-09;2.001799994945941e-08;-1.332999996634498e-09;0 +-3.758799990509942e-08;-2.001799994945941e-08;-1.332999996634498e-09;0 +1.028199997404045e-08;9.671999975580549e-09;1.666999995791229e-09;0 +1.044899997361881e-08;9.269999976595502e-09;1.666999995791229e-09;0 +1.05059999734749e-08;8.838999977683672e-09;1.666999995791229e-09;0 +1.044899997361881e-08;8.406999978774366e-09;1.666999995791229e-09;0 +1.028199997404045e-08;8.005999979786794e-09;1.666999995791229e-09;0 +1.001699997470951e-08;7.659999980660359e-09;1.666999995791229e-09;0 +9.671999975580549e-09;7.39499998132942e-09;1.666999995791229e-09;0 +9.269999976595502e-09;7.22899998174853e-09;1.666999995791229e-09;0 +8.838999977683672e-09;7.171999981892441e-09;1.666999995791229e-09;0 +8.406999978774366e-09;7.22899998174853e-09;1.666999995791229e-09;0 +8.005999979786794e-09;7.39499998132942e-09;1.666999995791229e-09;0 +7.659999980660359e-09;7.659999980660359e-09;1.666999995791229e-09;0 +7.39499998132942e-09;8.005999979786794e-09;1.666999995791229e-09;0 +7.22899998174853e-09;8.406999978774366e-09;1.666999995791229e-09;0 +7.171999981892441e-09;8.838999977683672e-09;1.666999995791229e-09;0 +7.22899998174853e-09;9.269999976595502e-09;1.666999995791229e-09;0 +7.39499998132942e-09;9.671999975580549e-09;1.666999995791229e-09;0 +7.659999980660359e-09;1.001699997470951e-08;1.666999995791229e-09;0 +8.005999979786794e-09;1.028199997404045e-08;1.666999995791229e-09;0 +8.406999978774366e-09;1.044899997361881e-08;1.666999995791229e-09;0 +8.838999977683672e-09;1.05059999734749e-08;1.666999995791229e-09;0 +9.269999976595502e-09;1.044899997361881e-08;1.666999995791229e-09;0 +9.671999975580549e-09;1.028199997404045e-08;1.666999995791229e-09;0 +1.001699997470951e-08;1.001699997470951e-08;1.666999995791229e-09;0 +3.837399990311497e-08;2.171999994516227e-08;-2.499999993688107e-09;0 +3.910199990127696e-08;2.245099994331667e-08;-2.499999993688107e-09;0 +3.998799989904001e-08;2.297999994198108e-08;-2.499999993688107e-09;0 +4.097599989654554e-08;2.327599994123375e-08;-2.499999993688107e-09;0 +4.200699989394252e-08;2.331899994112518e-08;-2.499999993688107e-09;0 +4.301599989139504e-08;2.310899994165538e-08;-2.499999993688107e-09;0 +4.394299988905459e-08;2.26559999427991e-08;-2.499999993688107e-09;0 +4.473099988706508e-08;2.198999994448059e-08;-2.499999993688107e-09;0 +4.532999988555276e-08;2.115099994659886e-08;-2.499999993688107e-09;0 +4.570599988460345e-08;2.018999994902515e-08;-2.499999993688107e-09;0 +4.58329998842828e-08;1.916699995160798e-08;-2.499999993688107e-09;0 +4.01179998987118e-08;4.954599987490837e-08;8.332999978961198e-09;0 +4.33329998905947e-08;4.821399987827135e-08;8.332999978961198e-09;0 +4.609499988362132e-08;4.609499988362132e-08;8.332999978961198e-09;0 +4.821399987827135e-08;4.33329998905947e-08;8.332999978961198e-09;0 +4.954599987490837e-08;4.01179998987118e-08;8.332999978961198e-09;0 +3.666699990742473e-08;4.999999987376214e-08;8.332999978961198e-09;0 +-3.083299992215415e-08;-3.999999989900971e-08;8.332999978961198e-09;0 +2.097499994704322e-08;2.024499994888629e-08;-8.329999978968771e-10;0 +2.139199994599039e-08;2.124999994634891e-08;-8.329999978968771e-10;0 +2.2053999944319e-08;2.211299994417004e-08;-8.329999978968771e-10;0 +2.291699994214014e-08;2.277499994249865e-08;-8.329999978968771e-10;0 +2.392199993960276e-08;2.319099994144835e-08;-8.329999978968771e-10;0 +2.499999993688107e-08;2.333299994108984e-08;-8.329999978968771e-10;0 +2.607799993415938e-08;2.319099994144835e-08;-8.329999978968771e-10;0 +2.7082999931622e-08;2.277499994249865e-08;-8.329999978968771e-10;0 +2.794599992944313e-08;2.211299994417004e-08;-8.329999978968771e-10;0 +2.860799992777174e-08;2.124999994634891e-08;-8.329999978968771e-10;0 +2.902499992671892e-08;2.024499994888629e-08;-8.329999978968771e-10;0 +1.916699995160798e-08;-3.999999989900971e-08;8.332999978961198e-09;0 +2.368299994020617e-08;-8.005999979786794e-09;1.833299995371363e-08;0 +1.609899995935393e-08;4.313999989108197e-09;2.499999993688107e-08;0 +1.443399996355765e-08;8.332999978961198e-09;2.499999993688107e-08;0 +1.178499997024573e-08;1.178499997024573e-08;2.499999993688107e-08;0 +8.332999978961198e-09;1.443399996355765e-08;2.499999993688107e-08;0 +4.313999989108197e-09;1.609899995935393e-08;2.499999993688107e-08;0 +0;1.666699995791987e-08;2.499999993688107e-08;0 +-4.313999989108197e-09;1.609899995935393e-08;2.499999993688107e-08;0 +-8.332999978961198e-09;1.443399996355765e-08;2.499999993688107e-08;0 +-1.178499997024573e-08;1.178499997024573e-08;2.499999993688107e-08;0 +-1.443399996355765e-08;8.332999978961198e-09;2.499999993688107e-08;0 +-1.609899995935393e-08;4.313999989108197e-09;2.499999993688107e-08;0 +-1.666699995791987e-08;0;2.499999993688107e-08;0 +-1.609899995935393e-08;-4.313999989108197e-09;2.499999993688107e-08;0 +-1.443399996355765e-08;-8.332999978961198e-09;2.499999993688107e-08;0 +-1.178499997024573e-08;-1.178499997024573e-08;2.499999993688107e-08;0 +-8.332999978961198e-09;-1.443399996355765e-08;2.499999993688107e-08;0 +-4.313999989108197e-09;-1.609899995935393e-08;2.499999993688107e-08;0 +0;-1.666699995791987e-08;2.499999993688107e-08;0 +4.313999989108197e-09;-1.609899995935393e-08;2.499999993688107e-08;0 +8.332999978961198e-09;-1.443399996355765e-08;2.499999993688107e-08;0 +1.178499997024573e-08;-1.178499997024573e-08;2.499999993688107e-08;0 +1.443399996355765e-08;-8.332999978961198e-09;2.499999993688107e-08;0 +1.609899995935393e-08;-4.313999989108197e-09;2.499999993688107e-08;0 +1.666699995791987e-08;0;2.499999993688107e-08;0 +4.166999989479337e-09;3.999999989900971e-08;-1.166699997054365e-08;0 +-9.671999975580549e-09;1.028199997404045e-08;2.499999993688107e-08;0 +-9.269999976595502e-09;1.044899997361881e-08;2.499999993688107e-08;0 +-8.838999977683672e-09;1.05059999734749e-08;2.499999993688107e-08;0 +-8.406999978774366e-09;1.044899997361881e-08;2.499999993688107e-08;0 +-8.005999979786794e-09;1.028199997404045e-08;2.499999993688107e-08;0 +-7.659999980660359e-09;1.001699997470951e-08;2.499999993688107e-08;0 +-7.39499998132942e-09;9.671999975580549e-09;2.499999993688107e-08;0 +-7.22899998174853e-09;9.269999976595502e-09;2.499999993688107e-08;0 +-7.171999981892441e-09;8.838999977683672e-09;2.499999993688107e-08;0 +-7.22899998174853e-09;8.406999978774366e-09;2.499999993688107e-08;0 +-7.39499998132942e-09;8.005999979786794e-09;2.499999993688107e-08;0 +-7.659999980660359e-09;7.659999980660359e-09;2.499999993688107e-08;0 +-8.005999979786794e-09;7.39499998132942e-09;2.499999993688107e-08;0 +-8.406999978774366e-09;7.22899998174853e-09;2.499999993688107e-08;0 +-8.838999977683672e-09;7.171999981892441e-09;2.499999993688107e-08;0 +-9.269999976595502e-09;7.22899998174853e-09;2.499999993688107e-08;0 +-9.671999975580549e-09;7.39499998132942e-09;2.499999993688107e-08;0 +-1.001699997470951e-08;7.659999980660359e-09;2.499999993688107e-08;0 +-1.028199997404045e-08;8.005999979786794e-09;2.499999993688107e-08;0 +-1.044899997361881e-08;8.406999978774366e-09;2.499999993688107e-08;0 +-1.05059999734749e-08;8.838999977683672e-09;2.499999993688107e-08;0 +-1.044899997361881e-08;9.269999976595502e-09;2.499999993688107e-08;0 +-1.028199997404045e-08;9.671999975580549e-09;2.499999993688107e-08;0 +-1.001699997470951e-08;1.001699997470951e-08;2.499999993688107e-08;0 +2.356999994049147e-08;2.356999994049147e-08;1.333299996633741e-08;0 +4.999999987376214e-08;3.333299991584227e-08;-2.499999993688107e-08;0 +4.191199989418238e-08;1.264199996808202e-08;-2.499999993688107e-09;0 +4.2916999891645e-08;1.305799996703172e-08;-2.499999993688107e-09;0 +4.377999988946612e-08;1.371999996536033e-08;-2.499999993688107e-09;0 +4.444199988779473e-08;1.458299996318147e-08;-2.499999993688107e-09;0 +4.485799988674445e-08;1.558799996064408e-08;-2.499999993688107e-09;0 +4.499999988638592e-08;1.666699995791987e-08;-2.499999993688107e-09;0 +4.485799988674445e-08;1.774499995519818e-08;-2.499999993688107e-09;0 +4.444199988779473e-08;1.87499999526608e-08;-2.499999993688107e-09;0 +4.377999988946612e-08;1.961299995048193e-08;-2.499999993688107e-09;0 +4.2916999891645e-08;2.027499994881055e-08;-2.499999993688107e-09;0 +4.191199989418238e-08;2.069099994776025e-08;-2.499999993688107e-09;0 +-3.079599992224757e-08;-1.27559999677942e-08;1.333299996633741e-08;0 +1.64599999584425e-08;-1.881699995249164e-08;1.833299995371363e-08;0 +4.309999989118296e-10;1.410999996437567e-08;1.666999995791229e-09;0 +8.329999978968771e-10;1.394299996479731e-08;1.666999995791229e-09;0 +1.178999997023311e-09;1.367899996546385e-08;1.666999995791229e-09;0 +1.442999996356775e-09;1.333299996633741e-08;1.666999995791229e-09;0 +1.609999995935141e-09;1.293099996735236e-08;1.666999995791229e-09;0 +1.666999995791229e-09;1.249999996844053e-08;1.666999995791229e-09;0 +1.609999995935141e-09;1.20689999695287e-08;1.666999995791229e-09;0 +1.442999996356775e-09;1.166699997054365e-08;1.666999995791229e-09;0 +1.178999997023311e-09;1.132099997141722e-08;1.666999995791229e-09;0 +8.329999978968771e-10;1.105699997208376e-08;1.666999995791229e-09;0 +4.309999989118296e-10;1.088999997250539e-08;1.666999995791229e-09;0 +0;1.08329999726493e-08;1.666999995791229e-09;0 +-4.309999989118296e-10;1.088999997250539e-08;1.666999995791229e-09;0 +-8.329999978968771e-10;1.105699997208376e-08;1.666999995791229e-09;0 +-1.178999997023311e-09;1.132099997141722e-08;1.666999995791229e-09;0 +-1.442999996356775e-09;1.166699997054365e-08;1.666999995791229e-09;0 +-1.609999995935141e-09;1.20689999695287e-08;1.666999995791229e-09;0 +-1.666999995791229e-09;1.249999996844053e-08;1.666999995791229e-09;0 +-1.609999995935141e-09;1.293099996735236e-08;1.666999995791229e-09;0 +-1.442999996356775e-09;1.333299996633741e-08;1.666999995791229e-09;0 +-1.178999997023311e-09;1.367899996546385e-08;1.666999995791229e-09;0 +-8.329999978968771e-10;1.394299996479731e-08;1.666999995791229e-09;0 +-4.309999989118296e-10;1.410999996437567e-08;1.666999995791229e-09;0 +0;1.416699996423176e-08;1.666999995791229e-09;0 +2.166699994529609e-08;4.999999987376214e-08;-1.166699997054365e-08;0 +-5.064999987212105e-09;2.175099994508401e-08;-4.999999987376214e-09;0 +-5.831999985275616e-09;2.249899994319548e-08;-4.999999987376214e-09;0 +-6.762999982925067e-09;2.302599994186494e-08;-4.999999987376214e-09;0 +-7.797999980311943e-09;2.329899994117568e-08;-4.999999987376214e-09;0 +-8.868999977607928e-09;2.329899994117568e-08;-4.999999987376214e-09;0 +-9.903999974994805e-09;2.302599994186494e-08;-4.999999987376214e-09;0 +-1.083499997264426e-08;2.249899994319548e-08;-4.999999987376214e-09;0 +-1.160099997071029e-08;2.175099994508401e-08;-4.999999987376214e-09;0 +-3.269299991745812e-08;6.502999983581504e-09;1.833299995371363e-08;0 +3.083299992215415e-08;3.999999989900971e-08;-1.166699997054365e-08;0 +1.160099997071029e-08;2.175099994508401e-08;-4.999999987376214e-09;0 +1.083499997264426e-08;2.249899994319548e-08;-4.999999987376214e-09;0 +9.903999974994805e-09;2.302599994186494e-08;-4.999999987376214e-09;0 +8.868999977607928e-09;2.329899994117568e-08;-4.999999987376214e-09;0 +7.797999980311943e-09;2.329899994117568e-08;-4.999999987376214e-09;0 +6.762999982925067e-09;2.302599994186494e-08;-4.999999987376214e-09;0 +5.831999985275616e-09;2.249899994319548e-08;-4.999999987376214e-09;0 +5.064999987212105e-09;2.175099994508401e-08;-4.999999987376214e-09;0 +-4.570599988460345e-08;-2.018999994902515e-08;-4.999999987376214e-09;0 +-4.532999988555276e-08;-2.115099994659886e-08;-4.999999987376214e-09;0 +-4.473099988706508e-08;-2.198999994448059e-08;-4.999999987376214e-09;0 +-4.394299988905459e-08;-2.26559999427991e-08;-4.999999987376214e-09;0 +-4.301599989139504e-08;-2.310899994165538e-08;-4.999999987376214e-09;0 +-4.200699989394252e-08;-2.331899994112518e-08;-4.999999987376214e-09;0 +-4.097599989654554e-08;-2.327599994123375e-08;-4.999999987376214e-09;0 +-3.998799989904001e-08;-2.297999994198108e-08;-4.999999987376214e-09;0 +-3.910199990127696e-08;-2.245099994331667e-08;-4.999999987376214e-09;0 +-3.837399990311497e-08;-2.171999994516227e-08;-4.999999987376214e-09;0 +-2.173199994513197e-08;-2.175099994508401e-08;-2.499999993688107e-09;0 +-2.249799994319801e-08;-2.249899994319548e-08;-2.499999993688107e-09;0 +-2.342999994084493e-08;-2.302599994186494e-08;-2.499999993688107e-09;0 +-2.446499993823182e-08;-2.329899994117568e-08;-2.499999993688107e-09;0 +-2.553499993553032e-08;-2.329899994117568e-08;-2.499999993688107e-09;0 +-2.65699999329172e-08;-2.302599994186494e-08;-2.499999993688107e-09;0 +-2.750199993056412e-08;-2.249899994319548e-08;-2.499999993688107e-09;0 +-2.826799992863016e-08;-2.175099994508401e-08;-2.499999993688107e-09;0 +-3.333299991584227e-08;-4.33329998905947e-08;-1.166699997054365e-08;0 +3.083299992215415e-08;4.33329998905947e-08;8.332999978961198e-09;0 +-4.308999989120821e-09;-2.024499994888629e-08;-8.329999978968771e-10;0 +-4.724999988070522e-09;-2.124999994634891e-08;-8.329999978968771e-10;0 +-5.386999986399133e-09;-2.211299994417004e-08;-8.329999978968771e-10;0 +-6.249999984220266e-09;-2.277499994249865e-08;-8.329999978968771e-10;0 +-7.254999981682885e-09;-2.319099994144835e-08;-8.329999978968771e-10;0 +-8.332999978961198e-09;-2.333299994108984e-08;-8.329999978968771e-10;0 +-9.411999976236982e-09;-2.319099994144835e-08;-8.329999978968771e-10;0 +-1.04169999736996e-08;-2.277499994249865e-08;-8.329999978968771e-10;0 +-1.127999997152074e-08;-2.211299994417004e-08;-8.329999978968771e-10;0 +-1.194199996984935e-08;-2.124999994634891e-08;-8.329999978968771e-10;0 +-1.235799996879905e-08;-2.024499994888629e-08;-8.329999978968771e-10;0 +-1.241199996866271e-08;-2.001799994945941e-08;-1.332999996634498e-09;0 +-2.91669999263604e-08;4.166999989479337e-09;-2.499999993688107e-09;0 +-1.028199997404045e-08;-9.671999975580549e-09;1.666999995791229e-09;0 +-1.044899997361881e-08;-9.269999976595502e-09;1.666999995791229e-09;0 +-1.05059999734749e-08;-8.838999977683672e-09;1.666999995791229e-09;0 +-1.044899997361881e-08;-8.406999978774366e-09;1.666999995791229e-09;0 +-1.028199997404045e-08;-8.005999979786794e-09;1.666999995791229e-09;0 +-1.001699997470951e-08;-7.659999980660359e-09;1.666999995791229e-09;0 +-9.671999975580549e-09;-7.39499998132942e-09;1.666999995791229e-09;0 +-9.269999976595502e-09;-7.22899998174853e-09;1.666999995791229e-09;0 +-8.838999977683672e-09;-7.171999981892441e-09;1.666999995791229e-09;0 +-8.406999978774366e-09;-7.22899998174853e-09;1.666999995791229e-09;0 +-8.005999979786794e-09;-7.39499998132942e-09;1.666999995791229e-09;0 +-7.659999980660359e-09;-7.659999980660359e-09;1.666999995791229e-09;0 +-7.39499998132942e-09;-8.005999979786794e-09;1.666999995791229e-09;0 +-7.22899998174853e-09;-8.406999978774366e-09;1.666999995791229e-09;0 +-7.171999981892441e-09;-8.838999977683672e-09;1.666999995791229e-09;0 +-7.22899998174853e-09;-9.269999976595502e-09;1.666999995791229e-09;0 +-7.39499998132942e-09;-9.671999975580549e-09;1.666999995791229e-09;0 +-7.659999980660359e-09;-1.001699997470951e-08;1.666999995791229e-09;0 +-8.005999979786794e-09;-1.028199997404045e-08;1.666999995791229e-09;0 +-8.406999978774366e-09;-1.044899997361881e-08;1.666999995791229e-09;0 +-8.838999977683672e-09;-1.05059999734749e-08;1.666999995791229e-09;0 +-9.269999976595502e-09;-1.044899997361881e-08;1.666999995791229e-09;0 +-9.671999975580549e-09;-1.028199997404045e-08;1.666999995791229e-09;0 +-1.001699997470951e-08;-1.001699997470951e-08;1.666999995791229e-09;0 +7.49999998106432e-09;-3.999999989900971e-08;8.332999978961198e-09;0 +1.028199997404045e-08;9.671999975580549e-09;2.499999993688107e-08;0 +1.044899997361881e-08;9.269999976595502e-09;2.499999993688107e-08;0 +1.05059999734749e-08;8.838999977683672e-09;2.499999993688107e-08;0 +1.044899997361881e-08;8.406999978774366e-09;2.499999993688107e-08;0 +1.028199997404045e-08;8.005999979786794e-09;2.499999993688107e-08;0 +1.001699997470951e-08;7.659999980660359e-09;2.499999993688107e-08;0 +9.671999975580549e-09;7.39499998132942e-09;2.499999993688107e-08;0 +9.269999976595502e-09;7.22899998174853e-09;2.499999993688107e-08;0 +8.838999977683672e-09;7.171999981892441e-09;2.499999993688107e-08;0 +8.406999978774366e-09;7.22899998174853e-09;2.499999993688107e-08;0 +8.005999979786794e-09;7.39499998132942e-09;2.499999993688107e-08;0 +7.659999980660359e-09;7.659999980660359e-09;2.499999993688107e-08;0 +7.39499998132942e-09;8.005999979786794e-09;2.499999993688107e-08;0 +7.22899998174853e-09;8.406999978774366e-09;2.499999993688107e-08;0 +7.171999981892441e-09;8.838999977683672e-09;2.499999993688107e-08;0 +7.22899998174853e-09;9.269999976595502e-09;2.499999993688107e-08;0 +7.39499998132942e-09;9.671999975580549e-09;2.499999993688107e-08;0 +7.659999980660359e-09;1.001699997470951e-08;2.499999993688107e-08;0 +8.005999979786794e-09;1.028199997404045e-08;2.499999993688107e-08;0 +8.406999978774366e-09;1.044899997361881e-08;2.499999993688107e-08;0 +8.838999977683672e-09;1.05059999734749e-08;2.499999993688107e-08;0 +9.269999976595502e-09;1.044899997361881e-08;2.499999993688107e-08;0 +9.671999975580549e-09;1.028199997404045e-08;2.499999993688107e-08;0 +1.001699997470951e-08;1.001699997470951e-08;2.499999993688107e-08;0 +3.083299992215415e-08;-4.33329998905947e-08;-1.166699997054365e-08;0 +9.671999975580549e-09;-1.028199997404045e-08;2.499999993688107e-08;0 +9.269999976595502e-09;-1.044899997361881e-08;2.499999993688107e-08;0 +8.838999977683672e-09;-1.05059999734749e-08;2.499999993688107e-08;0 +8.406999978774366e-09;-1.044899997361881e-08;2.499999993688107e-08;0 +8.005999979786794e-09;-1.028199997404045e-08;2.499999993688107e-08;0 +7.659999980660359e-09;-1.001699997470951e-08;2.499999993688107e-08;0 +7.39499998132942e-09;-9.671999975580549e-09;2.499999993688107e-08;0 +7.22899998174853e-09;-9.269999976595502e-09;2.499999993688107e-08;0 +7.171999981892441e-09;-8.838999977683672e-09;2.499999993688107e-08;0 +7.22899998174853e-09;-8.406999978774366e-09;2.499999993688107e-08;0 +7.39499998132942e-09;-8.005999979786794e-09;2.499999993688107e-08;0 +7.659999980660359e-09;-7.659999980660359e-09;2.499999993688107e-08;0 +8.005999979786794e-09;-7.39499998132942e-09;2.499999993688107e-08;0 +8.406999978774366e-09;-7.22899998174853e-09;2.499999993688107e-08;0 +8.838999977683672e-09;-7.171999981892441e-09;2.499999993688107e-08;0 +9.269999976595502e-09;-7.22899998174853e-09;2.499999993688107e-08;0 +9.671999975580549e-09;-7.39499998132942e-09;2.499999993688107e-08;0 +1.001699997470951e-08;-7.659999980660359e-09;2.499999993688107e-08;0 +1.028199997404045e-08;-8.005999979786794e-09;2.499999993688107e-08;0 +1.044899997361881e-08;-8.406999978774366e-09;2.499999993688107e-08;0 +1.05059999734749e-08;-8.838999977683672e-09;2.499999993688107e-08;0 +1.044899997361881e-08;-9.269999976595502e-09;2.499999993688107e-08;0 +1.028199997404045e-08;-9.671999975580549e-09;2.499999993688107e-08;0 +1.001699997470951e-08;-1.001699997470951e-08;2.499999993688107e-08;0 +4.191199989418238e-08;-2.069099994776025e-08;-2.499999993688107e-09;0 +4.2916999891645e-08;-2.027499994881055e-08;-2.499999993688107e-09;0 +4.377999988946612e-08;-1.961299995048193e-08;-2.499999993688107e-09;0 +4.444199988779473e-08;-1.87499999526608e-08;-2.499999993688107e-09;0 +4.485799988674445e-08;-1.774499995519818e-08;-2.499999993688107e-09;0 +4.499999988638592e-08;-1.666699995791987e-08;-2.499999993688107e-09;0 +4.485799988674445e-08;-1.558799996064408e-08;-2.499999993688107e-09;0 +4.444199988779473e-08;-1.458299996318147e-08;-2.499999993688107e-09;0 +4.377999988946612e-08;-1.371999996536033e-08;-2.499999993688107e-09;0 +4.2916999891645e-08;-1.305799996703172e-08;-2.499999993688107e-09;0 +4.191199989418238e-08;-1.264199996808202e-08;-2.499999993688107e-09;0 +4.570599988460345e-08;-2.018999994902515e-08;-2.499999993688107e-09;0 +4.532999988555276e-08;-2.115099994659886e-08;-2.499999993688107e-09;0 +4.473099988706508e-08;-2.198999994448059e-08;-2.499999993688107e-09;0 +4.394299988905459e-08;-2.26559999427991e-08;-2.499999993688107e-09;0 +4.301599989139504e-08;-2.310899994165538e-08;-2.499999993688107e-09;0 +4.200699989394252e-08;-2.331899994112518e-08;-2.499999993688107e-09;0 +4.097599989654554e-08;-2.327599994123375e-08;-2.499999993688107e-09;0 +3.998799989904001e-08;-2.297999994198108e-08;-2.499999993688107e-09;0 +3.910199990127696e-08;-2.245099994331667e-08;-2.499999993688107e-09;0 +3.837399990311497e-08;-2.171999994516227e-08;-2.499999993688107e-09;0 +7.49999998106432e-09;-3.999999989900971e-08;-1.166699997054365e-08;0 +-1.160099997071029e-08;-2.175099994508401e-08;-4.999999987376214e-09;0 +-1.083499997264426e-08;-2.249899994319548e-08;-4.999999987376214e-09;0 +-9.903999974994805e-09;-2.302599994186494e-08;-4.999999987376214e-09;0 +-8.868999977607928e-09;-2.329899994117568e-08;-4.999999987376214e-09;0 +-7.797999980311943e-09;-2.329899994117568e-08;-4.999999987376214e-09;0 +-6.762999982925067e-09;-2.302599994186494e-08;-4.999999987376214e-09;0 +-5.831999985275616e-09;-2.249899994319548e-08;-4.999999987376214e-09;0 +-5.064999987212105e-09;-2.175099994508401e-08;-4.999999987376214e-09;0 +5.892999985121606e-09;-5.892999985121606e-09;-2.499999993688107e-09;0 +-4.309999989118296e-10;-1.410999996437567e-08;1.666999995791229e-09;0 +-8.329999978968771e-10;-1.394299996479731e-08;1.666999995791229e-09;0 +-1.178999997023311e-09;-1.367899996546385e-08;1.666999995791229e-09;0 +-1.442999996356775e-09;-1.333299996633741e-08;1.666999995791229e-09;0 +-1.609999995935141e-09;-1.293099996735236e-08;1.666999995791229e-09;0 +-1.666999995791229e-09;-1.249999996844053e-08;1.666999995791229e-09;0 +-1.609999995935141e-09;-1.20689999695287e-08;1.666999995791229e-09;0 +-1.442999996356775e-09;-1.166699997054365e-08;1.666999995791229e-09;0 +-1.178999997023311e-09;-1.132099997141722e-08;1.666999995791229e-09;0 +-8.329999978968771e-10;-1.105699997208376e-08;1.666999995791229e-09;0 +-4.309999989118296e-10;-1.088999997250539e-08;1.666999995791229e-09;0 +0;-1.08329999726493e-08;1.666999995791229e-09;0 +4.309999989118296e-10;-1.088999997250539e-08;1.666999995791229e-09;0 +8.329999978968771e-10;-1.105699997208376e-08;1.666999995791229e-09;0 +1.178999997023311e-09;-1.132099997141722e-08;1.666999995791229e-09;0 +1.442999996356775e-09;-1.166699997054365e-08;1.666999995791229e-09;0 +1.609999995935141e-09;-1.20689999695287e-08;1.666999995791229e-09;0 +1.666999995791229e-09;-1.249999996844053e-08;1.666999995791229e-09;0 +1.609999995935141e-09;-1.293099996735236e-08;1.666999995791229e-09;0 +1.442999996356775e-09;-1.333299996633741e-08;1.666999995791229e-09;0 +1.178999997023311e-09;-1.367899996546385e-08;1.666999995791229e-09;0 +8.329999978968771e-10;-1.394299996479731e-08;1.666999995791229e-09;0 +4.309999989118296e-10;-1.410999996437567e-08;1.666999995791229e-09;0 +0;-1.416699996423176e-08;1.666999995791229e-09;0 +-2.826799992863016e-08;2.175099994508401e-08;-2.499999993688107e-09;0 +-2.750199993056412e-08;2.249899994319548e-08;-2.499999993688107e-09;0 +-2.65699999329172e-08;2.302599994186494e-08;-2.499999993688107e-09;0 +-2.553499993553032e-08;2.329899994117568e-08;-2.499999993688107e-09;0 +-2.446499993823182e-08;2.329899994117568e-08;-2.499999993688107e-09;0 +-2.342999994084493e-08;2.302599994186494e-08;-2.499999993688107e-09;0 +-2.249799994319801e-08;2.249899994319548e-08;-2.499999993688107e-09;0 +-2.173199994513197e-08;2.175099994508401e-08;-2.499999993688107e-09;0 +-1.241199996866271e-08;2.001799994945941e-08;-1.332999996634498e-09;0 +-4.954599987490837e-08;-4.01179998987118e-08;-1.166699997054365e-08;0 +-4.821399987827135e-08;-4.33329998905947e-08;-1.166699997054365e-08;0 +-4.609499988362132e-08;-4.609499988362132e-08;-1.166699997054365e-08;0 +-4.33329998905947e-08;-4.821399987827135e-08;-1.166699997054365e-08;0 +-4.01179998987118e-08;-4.954599987490837e-08;-1.166699997054365e-08;0 +2.907899992658258e-08;2.001799994945941e-08;-1.332999996634498e-09;0 +-1.235799996879905e-08;2.024499994888629e-08;-8.329999978968771e-10;0 +-1.194199996984935e-08;2.124999994634891e-08;-8.329999978968771e-10;0 +-1.127999997152074e-08;2.211299994417004e-08;-8.329999978968771e-10;0 +-1.04169999736996e-08;2.277499994249865e-08;-8.329999978968771e-10;0 +-9.411999976236982e-09;2.319099994144835e-08;-8.329999978968771e-10;0 +-8.332999978961198e-09;2.333299994108984e-08;-8.329999978968771e-10;0 +-7.254999981682885e-09;2.319099994144835e-08;-8.329999978968771e-10;0 +-6.249999984220266e-09;2.277499994249865e-08;-8.329999978968771e-10;0 +-5.386999986399133e-09;2.211299994417004e-08;-8.329999978968771e-10;0 +-4.724999988070522e-09;2.124999994634891e-08;-8.329999978968771e-10;0 +-4.308999989120821e-09;2.024499994888629e-08;-8.329999978968771e-10;0 +4.570599988460345e-08;2.018999994902515e-08;-4.999999987376214e-09;0 +4.532999988555276e-08;2.115099994659886e-08;-4.999999987376214e-09;0 +4.473099988706508e-08;2.198999994448059e-08;-4.999999987376214e-09;0 +4.394299988905459e-08;2.26559999427991e-08;-4.999999987376214e-09;0 +4.301599989139504e-08;2.310899994165538e-08;-4.999999987376214e-09;0 +4.200699989394252e-08;2.331899994112518e-08;-4.999999987376214e-09;0 +4.097599989654554e-08;2.327599994123375e-08;-4.999999987376214e-09;0 +3.998799989904001e-08;2.297999994198108e-08;-4.999999987376214e-09;0 +3.910199990127696e-08;2.245099994331667e-08;-4.999999987376214e-09;0 +3.837399990311497e-08;2.171999994516227e-08;-4.999999987376214e-09;0 +-6.502999983581504e-09;-3.269299991745812e-08;1.833299995371363e-08;0 +-2.771599993002382e-08;-1.851899995324402e-08;1.833299995371363e-08;0 +-4.569099988464131e-08;2.024499994888629e-08;-8.329999978968771e-10;0 +-4.527499988569161e-08;2.124999994634891e-08;-8.329999978968771e-10;0 +-4.461299988736301e-08;2.211299994417004e-08;-8.329999978968771e-10;0 +-4.374999988954187e-08;2.277499994249865e-08;-8.329999978968771e-10;0 +-4.274499989207925e-08;2.319099994144835e-08;-8.329999978968771e-10;0 +-4.166699989480094e-08;2.333299994108984e-08;-8.329999978968771e-10;0 +-4.058799989752515e-08;2.319099994144835e-08;-8.329999978968771e-10;0 +-3.958299990006253e-08;2.277499994249865e-08;-8.329999978968771e-10;0 +-3.87199999022414e-08;2.211299994417004e-08;-8.329999978968771e-10;0 +-3.805799990391279e-08;2.124999994634891e-08;-8.329999978968771e-10;0 +-3.76419999049631e-08;2.024499994888629e-08;-8.329999978968771e-10;0 +4.01179998987118e-08;-4.954599987490837e-08;-1.166699997054365e-08;0 +4.33329998905947e-08;-4.821399987827135e-08;-1.166699997054365e-08;0 +4.609499988362132e-08;-4.609499988362132e-08;-1.166699997054365e-08;0 +4.821399987827135e-08;-4.33329998905947e-08;-1.166699997054365e-08;0 +4.954599987490837e-08;-4.01179998987118e-08;-1.166699997054365e-08;0 +-4.309999989118296e-10;-1.410999996437567e-08;2.499999993688107e-08;0 +-8.329999978968771e-10;-1.394299996479731e-08;2.499999993688107e-08;0 +-1.178999997023311e-09;-1.367899996546385e-08;2.499999993688107e-08;0 +-1.442999996356775e-09;-1.333299996633741e-08;2.499999993688107e-08;0 +-1.609999995935141e-09;-1.293099996735236e-08;2.499999993688107e-08;0 +-1.666999995791229e-09;-1.249999996844053e-08;2.499999993688107e-08;0 +-1.609999995935141e-09;-1.20689999695287e-08;2.499999993688107e-08;0 +-1.442999996356775e-09;-1.166699997054365e-08;2.499999993688107e-08;0 +-1.178999997023311e-09;-1.132099997141722e-08;2.499999993688107e-08;0 +-8.329999978968771e-10;-1.105699997208376e-08;2.499999993688107e-08;0 +-4.309999989118296e-10;-1.088999997250539e-08;2.499999993688107e-08;0 +0;-1.08329999726493e-08;2.499999993688107e-08;0 +4.309999989118296e-10;-1.088999997250539e-08;2.499999993688107e-08;0 +8.329999978968771e-10;-1.105699997208376e-08;2.499999993688107e-08;0 +1.178999997023311e-09;-1.132099997141722e-08;2.499999993688107e-08;0 +1.442999996356775e-09;-1.166699997054365e-08;2.499999993688107e-08;0 +1.609999995935141e-09;-1.20689999695287e-08;2.499999993688107e-08;0 +1.666999995791229e-09;-1.249999996844053e-08;2.499999993688107e-08;0 +1.609999995935141e-09;-1.293099996735236e-08;2.499999993688107e-08;0 +1.442999996356775e-09;-1.333299996633741e-08;2.499999993688107e-08;0 +1.178999997023311e-09;-1.367899996546385e-08;2.499999993688107e-08;0 +8.329999978968771e-10;-1.394299996479731e-08;2.499999993688107e-08;0 +4.309999989118296e-10;-1.410999996437567e-08;2.499999993688107e-08;0 +0;-1.416699996423176e-08;2.499999993688107e-08;0 +3.269299991745812e-08;-6.502999983581504e-09;1.833299995371363e-08;0 +-4.01179998987118e-08;-4.954599987490837e-08;8.332999978961198e-09;0 +-4.33329998905947e-08;-4.821399987827135e-08;8.332999978961198e-09;0 +-4.609499988362132e-08;-4.609499988362132e-08;8.332999978961198e-09;0 +-4.821399987827135e-08;-4.33329998905947e-08;8.332999978961198e-09;0 +-4.954599987490837e-08;-4.01179998987118e-08;8.332999978961198e-09;0 +1.249999996844053e-08;0;0;0 +-1.249999996844053e-08;0;0;0 +0;1.249999996844053e-08;0;0 +0;-1.249999996844053e-08;0;0 +8.838999977683672e-09;8.838999977683672e-09;0;0 +-8.838999977683672e-09;-8.838999977683672e-09;0;0 +-8.838999977683672e-09;8.838999977683672e-09;0;0 +8.838999977683672e-09;-8.838999977683672e-09;0;0 +tria3=2784 +624;622;915;508 +926;624;915;508 +622;621;916;508 +915;622;916;508 +621;620;917;508 +916;621;917;508 +620;619;918;508 +917;620;918;508 +619;618;919;508 +918;619;919;508 +618;617;920;508 +919;618;920;508 +617;616;920;508 +920;616;921;508 +921;616;922;508 +922;616;615;508 +923;615;614;508 +924;614;613;508 +612;924;613;508 +612;925;924;508 +612;639;925;508 +612;623;639;508 +924;923;614;508 +923;922;615;508 +140;139;879;508 +878;140;879;508 +139;639;879;508 +879;639;623;508 +450;418;605;508 +712;605;512;508 +713;512;559;508 +713;712;512;508 +418;417;605;508 +712;450;605;508 +165;235;136;508 +136;235;475;508 +875;136;475;508 +875;392;136;508 +95;645;363;508 +96;95;363;508 +645;237;1170;508 +363;645;1170;508 +237;236;1170;508 +1170;236;466;508 +81;80;447;508 +926;447;624;508 +926;81;447;508 +80;84;447;508 +645;450;712;508 +237;645;712;508 +139;81;920;508 +921;139;920;508 +921;922;139;508 +139;922;923;508 +924;139;923;508 +924;639;139;508 +924;925;639;508 +81;926;916;508 +917;81;916;508 +917;918;81;508 +81;918;919;508 +920;81;919;508 +926;915;916;508 +235;233;475;508 +475;233;232;508 +419;232;231;508 +234;419;231;508 +419;475;232;508 +234;492;491;508 +419;491;929;508 +419;234;491;508 +491;767;929;508 +803;1092;578;508 +549;803;578;508 +1092;1091;579;508 +578;1092;579;508 +1091;1090;580;508 +579;1091;580;508 +1090;1089;581;508 +580;1090;581;508 +1089;1088;582;508 +581;1089;582;508 +1088;1087;583;508 +582;1088;583;508 +1087;1086;584;508 +583;1087;584;508 +1086;1085;585;508 +584;1086;585;508 +1085;1084;586;508 +585;1085;586;508 +1084;1083;587;508 +586;1084;587;508 +1083;1082;588;508 +587;1083;588;508 +1082;858;589;508 +588;1082;589;508 +444;443;446;508 +304;444;446;508 +443;589;446;508 +446;589;858;508 +404;295;364;508 +874;404;364;508 +874;442;404;508 +874;480;442;508 +874;873;480;508 +295;557;364;508 +971;404;487;508 +1308;487;486;508 +386;1308;486;508 +386;285;1308;508 +404;442;487;508 +487;1308;971;508 +443;543;584;508 +585;443;584;508 +585;586;443;508 +443;586;587;508 +589;587;588;508 +589;443;587;508 +543;1314;579;508 +580;543;579;508 +580;581;543;508 +543;581;582;508 +583;543;582;508 +583;584;543;508 +1314;550;549;508 +579;549;578;508 +579;1314;549;508 +12;577;427;508 +567;12;427;508 +567;974;12;508 +12;974;11;508 +11;974;805;508 +13;11;805;508 +286;285;207;508 +206;286;207;508 +285;386;207;508 +207;386;406;508 +406;386;385;508 +276;406;385;508 +550;183;910;508 +549;910;803;508 +549;550;910;508 +183;830;910;508 +184;13;637;508 +284;184;637;508 +805;560;13;508 +805;876;560;508 +560;876;561;508 +637;13;560;508 +577;576;642;508 +427;642;49;508 +428;49;48;508 +428;427;49;508 +576;733;642;508 +427;577;642;508 +912;1255;148;508 +159;912;148;508 +1255;1254;149;508 +148;1255;149;508 +1254;1253;150;508 +149;1254;150;508 +1253;1252;151;508 +150;1253;151;508 +1252;1251;152;508 +151;1252;152;508 +1251;1250;153;508 +152;1251;153;508 +1250;1249;154;508 +153;1250;154;508 +1249;1248;155;508 +154;1249;155;508 +1248;1247;156;508 +155;1248;156;508 +1247;1246;157;508 +156;1247;157;508 +1246;1245;158;508 +157;1246;158;508 +1245;571;160;508 +158;1245;160;508 +416;376;570;508 +461;416;570;508 +376;160;570;508 +570;160;571;508 +479;290;537;508 +478;537;138;508 +164;138;137;508 +164;478;138;508 +290;289;537;508 +478;479;537;508 +710;1169;244;508 +245;710;244;508 +245;483;710;508 +1169;479;975;508 +244;1169;975;508 +479;478;975;508 +376;375;160;508 +160;375;157;508 +158;160;157;508 +375;78;157;508 +157;78;156;508 +156;78;155;508 +155;78;154;508 +154;78;153;508 +153;78;152;508 +152;78;423;508 +151;423;150;508 +151;152;423;508 +423;159;149;508 +150;423;149;508 +159;148;149;508 +597;860;220;508 +481;597;220;508 +481;189;597;508 +860;298;219;508 +220;860;219;508 +221;219;298;508 +484;483;604;508 +859;484;604;508 +483;245;604;508 +604;245;394;508 +394;245;815;508 +395;394;815;508 +423;391;684;508 +159;684;912;508 +159;423;684;508 +391;390;684;508 +190;189;135;508 +262;190;135;508 +189;481;135;508 +135;481;281;508 +281;481;432;508 +382;281;432;508 +298;415;374;508 +373;298;374;508 +373;221;298;508 +373;316;221;508 +373;317;316;508 +415;536;374;508 +284;637;1130;508 +1130;637;636;508 +635;1130;636;508 +635;1131;1130;508 +635;634;1131;508 +1131;634;1132;508 +1132;634;633;508 +1133;633;632;508 +1134;632;631;508 +1135;631;630;508 +1136;630;629;508 +1137;629;561;508 +1137;1136;629;508 +629;560;561;508 +1136;1135;630;508 +1135;1134;631;508 +1134;1133;632;508 +1133;1132;633;508 +12;11;563;508 +563;11;1018;508 +1018;11;13;508 +1019;13;184;508 +182;1019;184;508 +182;1020;1019;508 +182;181;1020;508 +1020;181;1021;508 +1021;181;180;508 +1022;180;179;508 +1023;179;178;508 +1024;178;177;508 +1025;177;176;508 +1026;176;175;508 +1027;175;183;508 +550;1027;183;508 +550;1028;1027;508 +550;1314;1028;508 +1028;1314;488;508 +488;1314;543;508 +1027;1026;175;508 +1026;1025;176;508 +1025;1024;177;508 +1024;1023;178;508 +1023;1022;179;508 +1022;1021;180;508 +1019;1018;13;508 +206;207;1307;508 +268;1307;1306;508 +269;1306;1305;508 +270;1305;1304;508 +271;1304;1303;508 +272;1303;1302;508 +273;1302;274;508 +273;272;1302;508 +1302;1301;274;508 +274;1301;275;508 +275;1301;1300;508 +276;1300;406;508 +276;275;1300;508 +272;271;1303;508 +271;270;1304;508 +270;269;1305;508 +269;268;1306;508 +268;206;1307;508 +374;536;535;508 +717;535;534;508 +718;534;533;508 +719;533;532;508 +720;532;531;508 +721;531;530;508 +722;530;529;508 +723;529;528;508 +724;528;373;508 +724;723;528;508 +528;317;373;508 +723;722;529;508 +722;721;530;508 +721;720;531;508 +720;719;532;508 +719;718;533;508 +718;717;534;508 +717;374;535;508 +875;475;190;508 +190;475;189;508 +189;475;419;508 +577;419;576;508 +577;189;419;508 +577;564;189;508 +577;563;564;508 +577;12;563;508 +419;929;576;508 +564;597;189;508 +767;491;733;508 +733;491;642;508 +136;392;262;508 +135;136;262;508 +560;633;637;508 +560;632;633;508 +560;631;632;508 +560;630;631;508 +560;629;630;508 +634;637;633;508 +634;635;637;508 +637;635;636;508 +373;374;721;508 +722;373;721;508 +722;723;373;508 +373;723;724;508 +717;718;374;508 +374;718;719;508 +720;374;719;508 +720;721;374;508 +491;492;642;508 +642;492;568;508 +49;568;569;508 +49;642;568;508 +298;943;415;508 +298;944;943;508 +298;860;944;508 +944;860;564;508 +564;860;597;508 +943;942;407;508 +415;943;407;508 +942;941;408;508 +407;942;408;508 +941;940;409;508 +408;941;409;508 +940;939;410;508 +409;940;410;508 +939;938;411;508 +410;939;411;508 +938;937;412;508 +411;938;412;508 +937;936;413;508 +412;937;413;508 +936;935;414;508 +413;936;414;508 +935;934;376;508 +416;935;376;508 +416;414;935;508 +934;79;375;508 +376;934;375;508 +79;78;375;508 +461;570;1265;508 +451;1265;1264;508 +452;1264;1263;508 +453;1263;1262;508 +454;1262;1261;508 +455;1261;1260;508 +456;1260;1259;508 +457;1259;1258;508 +458;1258;1257;508 +459;1257;1256;508 +460;1256;254;508 +460;459;1256;508 +1256;709;254;508 +459;458;1257;508 +458;457;1258;508 +457;456;1259;508 +456;455;1260;508 +455;454;1261;508 +454;453;1262;508 +453;452;1263;508 +452;451;1264;508 +451;461;1265;508 +623;684;879;508 +623;912;684;508 +623;612;912;508 +912;612;1255;508 +1255;612;613;508 +1254;613;1253;508 +1254;1255;613;508 +613;614;1253;508 +1253;614;615;508 +1252;615;1251;508 +1252;1253;615;508 +615;616;1251;508 +1251;616;709;508 +1250;709;1256;508 +1257;1250;1256;508 +1257;1249;1250;508 +1257;1258;1249;508 +1249;1258;1248;508 +1248;1258;1259;508 +1247;1259;1260;508 +1246;1260;1261;508 +1245;1261;1262;508 +571;1262;1263;508 +1264;571;1263;508 +1264;1265;571;508 +571;1265;570;508 +617;709;616;508 +617;1010;709;508 +617;618;1010;508 +1010;618;1086;508 +1087;1010;1086;508 +1087;1009;1010;508 +1087;1008;1009;508 +1087;1088;1008;508 +1008;1088;1007;508 +1007;1088;1089;508 +1006;1089;1090;508 +1005;1090;1091;508 +1004;1091;1092;508 +1003;1092;803;508 +1002;803;1001;508 +1002;1003;803;508 +618;619;1086;508 +1086;619;1085;508 +1085;619;620;508 +1084;620;1083;508 +1084;1085;620;508 +620;621;1083;508 +1083;621;1082;508 +1082;621;622;508 +624;1082;622;508 +624;858;1082;508 +624;447;858;508 +858;447;446;508 +803;910;1000;508 +1001;803;1000;508 +1004;1092;1003;508 +1004;1005;1091;508 +1006;1090;1005;508 +1006;1007;1089;508 +571;1245;1262;508 +1245;1246;1261;508 +1247;1260;1246;508 +1248;1259;1247;508 +1250;1251;709;508 +447;84;304;508 +446;447;304;508 +878;879;390;508 +390;879;684;508 +537;289;872;508 +1148;872;871;508 +1149;871;870;508 +1150;870;869;508 +1151;869;868;508 +1152;868;867;508 +1153;867;866;508 +1154;866;865;508 +1155;865;138;508 +1155;1154;865;508 +865;137;138;508 +1154;1153;866;508 +1153;1152;867;508 +1152;1151;868;508 +1151;1150;869;508 +1150;1149;870;508 +1149;1148;871;508 +1148;537;872;508 +418;450;484;508 +484;450;483;508 +483;450;645;508 +404;645;295;508 +404;483;645;508 +404;297;483;508 +404;296;297;508 +404;971;296;508 +645;95;295;508 +297;710;483;508 +96;363;557;508 +557;363;364;508 +605;417;859;508 +604;605;859;508 +382;432;856;508 +855;382;856;508 +855;381;382;508 +857;432;433;508 +857;856;432;508 +428;48;313;508 +312;428;313;508 +312;169;428;508 +48;315;314;508 +313;48;314;508 +928;309;436;508 +565;928;436;508 +565;1138;928;508 +928;1138;1139;508 +1140;928;1139;508 +1140;1141;928;508 +928;1141;1142;508 +1143;928;1142;508 +1143;1144;928;508 +928;1144;868;508 +869;928;868;508 +869;1270;928;508 +869;870;1270;508 +1270;870;1269;508 +1269;870;1268;508 +1268;870;871;508 +872;1268;871;508 +872;1267;1268;508 +872;289;1267;508 +1267;289;290;508 +208;1123;309;508 +208;1134;1123;508 +208;1133;1134;508 +208;179;1133;508 +208;178;179;508 +208;1332;178;508 +208;1331;1332;508 +208;1330;1331;508 +208;1329;1330;508 +208;1328;1329;508 +208;1327;1328;508 +208;1326;1327;508 +208;255;1326;508 +208;653;255;508 +255;653;254;508 +254;653;460;508 +460;653;459;508 +459;653;458;508 +458;653;457;508 +457;653;456;508 +456;653;455;508 +455;653;454;508 +454;653;411;508 +412;454;411;508 +412;453;454;508 +412;413;453;508 +453;413;452;508 +452;413;414;508 +451;414;461;508 +451;452;414;508 +928;531;653;508 +928;1271;531;508 +928;1270;1271;508 +184;284;1130;508 +182;1130;1131;508 +181;1131;180;508 +181;182;1131;508 +1131;1132;180;508 +180;1132;179;508 +179;1132;1133;508 +1122;1134;1135;508 +1121;1135;1136;508 +1137;1121;1136;508 +1137;1120;1121;508 +1137;561;1120;508 +1120;561;876;508 +1121;1122;1135;508 +1122;1123;1134;508 +1124;309;1123;508 +1124;271;309;508 +1124;270;271;508 +1124;1125;270;508 +270;1125;1126;508 +269;1126;1127;508 +268;1127;286;508 +206;268;286;508 +269;1127;268;508 +269;270;1126;508 +271;272;309;508 +309;272;521;508 +522;309;521;508 +522;523;309;508 +309;523;524;508 +525;309;524;508 +525;526;309;508 +309;526;527;508 +436;309;527;508 +272;273;521;508 +521;273;520;508 +520;273;274;508 +519;274;275;508 +518;275;385;508 +518;519;275;508 +275;276;385;508 +520;274;519;508 +1145;867;1144;508 +1145;866;867;508 +1145;1146;866;508 +866;1146;865;508 +865;1146;1147;508 +164;865;1147;508 +164;137;865;508 +1144;867;868;508 +1271;1272;530;508 +531;1271;530;508 +1272;1273;529;508 +530;1272;529;508 +1274;529;1273;508 +1274;528;529;508 +1274;317;528;508 +1274;316;317;508 +532;653;531;508 +532;410;653;508 +532;533;410;508 +410;533;409;508 +409;533;408;508 +408;533;534;508 +535;408;534;508 +535;407;408;508 +535;536;407;508 +407;536;415;508 +410;411;653;508 +414;416;461;508 +1332;1333;177;508 +178;1332;177;508 +1333;1334;176;508 +177;1333;176;508 +1334;1335;175;508 +176;1334;175;508 +1335;830;175;508 +175;830;183;508 +182;184;1130;508 +466;236;873;508 +873;236;480;508 +713;559;815;508 +815;559;395;508 +95;96;295;508 +295;96;557;508 +417;418;859;508 +859;418;484;508 +84;80;304;508 +304;80;444;508 +140;878;391;508 +391;878;390;508 +929;767;576;508 +576;767;733;508 +392;875;262;508 +262;875;190;508 +406;1304;207;508 +406;1303;1304;508 +406;1302;1303;508 +406;1301;1302;508 +406;1300;1301;508 +1305;207;1304;508 +1305;1306;207;508 +207;1306;1307;508 +537;1152;138;508 +537;1151;1152;508 +537;1150;1151;508 +537;1149;1150;508 +537;1148;1149;508 +1152;1153;138;508 +138;1153;1154;508 +1155;138;1154;508 +363;1170;364;508 +364;1170;874;508 +1170;466;873;508 +874;1170;873;508 +48;49;315;508 +315;49;569;508 +281;382;973;508 +973;382;381;508 +165;136;135;508 +1275;135;281;508 +973;1275;281;508 +1275;165;135;508 +316;1159;221;508 +316;1274;1159;508 +1159;1274;1160;508 +1160;1274;1273;508 +1161;1273;1272;508 +1162;1272;1271;508 +1163;1271;1270;508 +1164;1270;1269;508 +1165;1269;1268;508 +1166;1268;1267;508 +1167;1267;290;508 +479;1167;290;508 +479;1168;1167;508 +479;1169;1168;508 +1168;1169;297;508 +297;1169;710;508 +1167;1166;1267;508 +1166;1165;1268;508 +1165;1164;1269;508 +1164;1163;1270;508 +1163;1162;1271;508 +1162;1161;1272;508 +1161;1160;1273;508 +1159;1158;221;508 +221;1158;219;508 +219;1158;311;508 +220;219;311;508 +481;220;311;508 +820;481;311;508 +820;433;481;508 +481;433;432;508 +168;829;267;508 +267;829;1324;508 +1325;267;1324;508 +1322;829;828;508 +1321;828;1320;508 +1321;1322;828;508 +828;827;1320;508 +1320;827;1319;508 +1319;827;1318;508 +1318;827;826;508 +1317;826;296;508 +1316;296;1315;508 +1316;1317;296;508 +826;825;1165;508 +1166;826;1165;508 +1166;297;826;508 +1166;1167;297;508 +297;1167;1168;508 +825;824;1163;508 +1164;825;1163;508 +1164;1165;825;508 +824;823;1161;508 +1162;824;1161;508 +1162;1163;824;508 +823;820;311;508 +1159;311;1158;508 +1159;823;311;508 +1159;1160;823;508 +823;1160;1161;508 +296;826;297;508 +1317;1318;826;508 +1322;1323;829;508 +829;1323;1324;508 +974;1325;805;508 +974;267;1325;508 +974;567;267;508 +1325;1324;805;508 +805;1324;876;508 +876;1324;1120;508 +1120;1324;1323;508 +1121;1323;1322;508 +1122;1322;1321;508 +1123;1321;1320;508 +1124;1320;1319;508 +1125;1319;1318;508 +1126;1318;1317;508 +1127;1317;1316;508 +286;1316;285;508 +286;1127;1316;508 +1316;1315;285;508 +285;1315;1308;508 +1308;1315;296;508 +971;1308;296;508 +1127;1126;1317;508 +1126;1125;1318;508 +1125;1124;1319;508 +1124;1123;1320;508 +1123;1122;1321;508 +1122;1121;1322;508 +1121;1120;1323;508 +427;428;169;508 +168;427;169;508 +168;267;427;508 +427;267;567;508 +910;830;1335;508 +1000;1335;1334;508 +1001;1334;1333;508 +1002;1333;1003;508 +1002;1001;1333;508 +1332;1003;1333;508 +1332;1004;1003;508 +1332;1331;1004;508 +1004;1331;1330;508 +1005;1330;1006;508 +1005;1004;1330;508 +1330;1329;1006;508 +1006;1329;1007;508 +1007;1329;1328;508 +1008;1328;1327;508 +1009;1327;1326;508 +1010;1326;255;508 +1010;1009;1326;508 +1009;1008;1327;508 +1008;1007;1328;508 +1001;1000;1334;508 +1000;910;1335;508 +255;254;709;508 +1010;255;709;508 +79;934;935;508 +936;79;935;508 +936;1026;79;508 +936;1025;1026;508 +936;937;1025;508 +1025;937;1024;508 +1024;937;938;508 +1023;938;939;508 +940;1023;939;508 +940;1022;1023;508 +940;1021;1022;508 +940;941;1021;508 +1021;941;942;508 +1020;942;563;508 +1019;563;1018;508 +1019;1020;563;508 +942;943;564;508 +563;942;564;508 +943;944;564;508 +1021;942;1020;508 +1023;1024;938;508 +1026;1027;488;508 +79;1026;488;508 +1027;1028;488;508 +139;140;391;508 +423;139;391;508 +423;81;139;508 +423;443;81;508 +423;488;443;508 +423;79;488;508 +423;78;79;508 +488;543;443;508 +443;444;81;508 +81;444;80;508 +559;512;395;508 +395;512;394;508 +512;605;394;508 +394;605;604;508 +386;486;1348;508 +1347;386;1348;508 +1347;385;386;508 +1347;518;385;508 +1347;1346;518;508 +518;1346;519;508 +519;1346;1345;508 +520;1345;1344;508 +521;1344;1343;508 +522;1343;1342;508 +523;1342;1341;508 +524;1341;1340;508 +525;1340;1339;508 +526;1339;1338;508 +527;1338;437;508 +436;527;437;508 +486;487;253;508 +1348;486;253;508 +527;526;1338;508 +526;525;1339;508 +525;524;1340;508 +524;523;1341;508 +523;522;1342;508 +522;521;1343;508 +521;520;1344;508 +520;519;1345;508 +565;436;437;508 +205;565;437;508 +164;194;478;508 +164;1147;194;508 +194;1147;195;508 +195;1147;1146;508 +196;1146;1145;508 +197;1145;1144;508 +198;1144;1143;508 +199;1143;1142;508 +200;1142;1141;508 +201;1141;1140;508 +202;1140;1139;508 +203;1139;1138;508 +205;1138;565;508 +205;203;1138;508 +203;202;1139;508 +201;1140;202;508 +201;200;1141;508 +200;199;1142;508 +199;198;1143;508 +198;197;1144;508 +197;196;1145;508 +196;195;1146;508 +194;193;478;508 +478;193;975;508 +975;193;204;508 +244;975;204;508 +204;193;194;508 +195;204;194;508 +195;1346;204;508 +195;1345;1346;508 +195;196;1345;508 +1345;196;197;508 +1344;197;1343;508 +1344;1345;197;508 +197;198;1343;508 +1343;198;199;508 +1342;199;200;508 +1341;200;201;508 +1340;201;205;508 +437;1340;205;508 +437;1339;1340;508 +437;1338;1339;508 +201;202;205;508 +205;202;203;508 +1340;1341;201;508 +1341;1342;200;508 +1342;1343;199;508 +1346;1347;253;508 +204;1346;253;508 +1347;1348;253;508 +712;713;815;508 +245;712;815;508 +245;237;712;508 +245;442;237;508 +245;253;442;508 +245;204;253;508 +245;244;204;508 +253;487;442;508 +442;480;237;508 +237;480;236;508 +819;928;772;508 +772;928;653;508 +309;10;208;508 +208;10;9;508 +10;309;325;508 +467;10;325;508 +309;928;765;508 +251;309;765;508 +251;324;309;508 +309;324;325;508 +928;819;441;508 +766;928;441;508 +766;765;928;508 +819;650;441;508 +819;772;650;508 +650;772;649;508 +772;653;440;508 +649;772;440;508 +653;208;216;508 +813;653;216;508 +813;440;653;508 +208;9;812;508 +474;208;812;508 +474;473;208;508 +208;473;216;508 +9;1081;812;508 +932;129;187;508 +773;932;187;508 +463;932;773;508 +464;463;773;508 +485;463;464;508 +592;485;464;508 +129;47;188;508 +187;129;188;508 +47;46;548;508 +188;47;548;508 +46;398;399;508 +548;46;399;508 +398;397;167;508 +399;398;167;508 +470;469;288;508 +287;470;288;508 +546;470;287;508 +611;546;287;508 +603;546;611;508 +166;603;611;508 +469;44;45;508 +288;469;45;508 +44;802;801;508 +45;44;801;508 +802;511;293;508 +801;802;293;508 +511;510;294;508 +293;511;294;508 +7;89;90;508 +8;7;90;508 +931;7;8;508 +310;931;8;508 +726;931;310;508 +301;726;310;508 +89;593;644;508 +90;89;644;508 +593;728;439;508 +644;593;439;508 +728;260;261;508 +439;728;261;508 +260;365;266;508 +261;260;266;508 +43;42;1055;508 +970;43;1055;508 +163;43;970;508 +969;163;970;508 +558;163;969;508 +265;558;969;508 +42;353;259;508 +1055;42;259;508 +353;352;229;508 +259;353;229;508 +352;818;230;508 +229;352;230;508 +818;628;627;508 +230;818;627;508 +471;683;5;508 +472;471;5;508 +595;471;472;508 +174;595;472;508 +804;595;174;508 +173;804;174;508 +683;682;6;508 +5;683;6;508 +682;292;87;508 +6;682;87;508 +292;291;88;508 +87;292;88;508 +291;933;1119;508 +88;291;1119;508 +422;380;566;508 +877;422;566;508 +282;422;877;508 +495;282;877;508 +283;282;495;508 +494;283;495;508 +380;379;1129;508 +566;380;1129;508 +379;1157;141;508 +1129;379;141;508 +1157;610;142;508 +141;1157;142;508 +610;609;389;508 +142;610;389;508 +389;609;909;508 +909;609;1016;508 +1119;933;494;508 +494;933;283;508 +627;628;173;508 +173;628;804;508 +266;365;265;508 +265;365;558;508 +294;510;301;508 +301;510;726;508 +167;397;166;508 +166;397;603;508 +485;592;252;508 +252;592;362;508 +464;358;592;508 +464;359;358;508 +464;360;359;508 +464;361;360;508 +464;187;361;508 +464;773;187;508 +188;324;187;508 +188;288;324;508 +188;611;288;508 +188;399;611;508 +188;548;399;508 +399;167;166;508 +611;399;166;508 +611;287;288;508 +45;325;288;508 +45;90;325;508 +45;310;90;508 +45;293;310;508 +45;801;293;508 +293;294;301;508 +310;293;301;508 +310;8;90;508 +90;644;325;508 +325;644;1055;508 +812;1055;259;508 +5;259;230;508 +174;230;173;508 +174;5;230;508 +174;472;5;508 +644;439;261;508 +969;261;265;508 +969;644;261;508 +969;1055;644;508 +969;970;1055;508 +261;266;265;508 +259;229;230;508 +230;627;173;508 +6;812;5;508 +6;474;812;508 +6;566;474;508 +6;495;566;508 +6;88;495;508 +6;87;88;508 +88;1119;494;508 +495;88;494;508 +495;877;566;508 +1129;474;566;508 +1129;904;474;508 +1129;142;904;508 +1129;141;142;508 +389;907;142;508 +389;908;907;508 +389;909;908;508 +907;906;142;508 +142;906;905;508 +904;142;905;508 +812;325;1055;508 +324;288;325;508 +324;361;187;508 +357;592;358;508 +357;362;592;508 +5;812;259;508 +144;258;1017;508 +143;144;1017;508 +1156;144;143;508 +354;1156;143;508 +736;1156;354;508 +715;736;354;508 +258;606;808;508 +1017;258;808;508 +606;575;242;508 +808;606;242;508 +575;911;243;508 +242;575;243;508 +911;729;438;508 +243;911;438;508 +449;503;602;508 +448;449;602;508 +800;449;448;508 +94;800;448;508 +369;800;94;508 +93;369;94;508 +503;378;355;508 +602;503;355;508 +378;377;356;508 +355;378;356;508 +377;763;594;508 +356;377;594;508 +763;762;97;508 +594;763;97;508 +302;927;711;508 +321;302;711;508 +303;302;321;508 +646;303;321;508 +318;303;646;508 +98;318;646;508 +927;541;476;508 +711;927;476;508 +541;540;477;508 +476;541;477;508 +540;654;806;508 +477;540;806;508 +654;514;807;508 +806;654;807;508 +51;731;730;508 +50;51;730;508 +814;51;50;508 +241;814;50;508 +515;814;241;508 +240;515;241;508 +731;1266;1195;508 +730;731;1195;508 +1266;86;716;508 +1195;1266;716;508 +86;85;817;508 +716;86;817;508 +85;320;319;508 +817;85;319;508 +300;727;405;508 +299;300;405;508 +128;300;299;508 +127;128;299;508 +426;128;127;508 +218;426;127;508 +727;280;1029;508 +405;727;1029;508 +280;279;600;508 +1029;280;600;508 +279;172;737;508 +600;279;737;508 +172;83;82;508 +737;172;82;508 +429;192;191;508 +263;429;191;508 +809;429;263;508 +17;809;263;508 +547;809;17;508 +16;547;17;508 +192;468;502;508 +191;192;502;508 +468;1220;651;508 +502;468;651;508 +1220;732;14;508 +651;1220;14;508 +732;504;15;508 +14;732;15;508 +15;504;217;508 +217;504;505;508 +82;83;16;508 +16;83;547;508 +319;320;218;508 +218;320;426;508 +807;514;240;508 +240;514;515;508 +97;762;98;508 +98;762;318;508 +438;729;93;508 +93;729;369;508 +736;715;735;508 +735;715;714;508 +463;485;252;508 +250;463;252;508 +250;249;463;508 +463;249;248;508 +247;463;248;508 +247;246;463;508 +463;246;251;508 +129;251;671;508 +672;129;671;508 +672;47;129;508 +672;673;47;508 +47;673;469;508 +398;469;546;508 +603;398;546;508 +603;397;398;508 +251;765;669;508 +670;251;669;508 +670;671;251;508 +1383;354;765;508 +1383;1382;354;508 +354;1382;1381;508 +1380;354;1381;508 +1380;1379;354;508 +354;1379;714;508 +715;354;714;508 +354;143;1017;508 +765;1017;667;508 +668;765;667;508 +668;669;765;508 +1017;808;666;508 +667;1017;666;508 +808;242;243;508 +94;243;438;508 +93;94;438;508 +94;448;602;508 +808;602;665;508 +666;808;665;508 +602;355;665;508 +665;355;664;508 +664;355;711;508 +476;664;711;508 +476;663;664;508 +476;730;663;508 +476;241;730;508 +476;806;241;508 +476;477;806;508 +355;356;594;508 +646;594;98;508 +646;355;594;508 +646;711;355;508 +646;321;711;508 +594;97;98;508 +806;807;240;508 +241;806;240;508 +241;50;730;508 +730;1195;662;508 +663;730;662;508 +1195;716;817;508 +405;817;127;508 +299;405;127;508 +817;319;218;508 +127;817;218;508 +405;1029;661;508 +662;405;661;508 +662;1195;405;508 +405;1195;817;508 +1029;600;737;508 +17;737;82;508 +16;17;82;508 +17;263;191;508 +1029;191;661;508 +1029;17;191;508 +1029;737;17;508 +191;502;660;508 +661;191;660;508 +502;651;14;508 +216;14;211;508 +216;502;14;508 +216;659;502;508 +216;658;659;508 +216;681;658;508 +216;473;681;508 +681;473;680;508 +680;473;679;508 +679;473;379;508 +678;379;380;508 +677;380;682;508 +683;677;682;508 +683;676;677;508 +683;353;676;508 +683;818;353;508 +683;595;818;508 +683;471;595;508 +14;15;217;508 +215;14;217;508 +215;214;14;508 +14;214;213;508 +212;14;213;508 +212;211;14;508 +1015;610;473;508 +1015;1014;610;508 +610;1014;1013;508 +1012;610;1013;508 +1012;1011;610;508 +610;1011;1016;508 +609;610;1016;508 +610;1157;379;508 +473;610;379;508 +380;422;282;508 +291;282;283;508 +933;291;283;508 +291;292;682;508 +380;291;682;508 +380;282;291;508 +595;804;628;508 +818;595;628;508 +818;352;353;508 +353;42;676;508 +676;42;675;508 +675;42;593;508 +674;593;89;508 +44;89;931;508 +511;931;510;508 +511;44;931;508 +511;802;44;508 +42;43;163;508 +260;163;365;508 +260;42;163;508 +260;593;42;508 +260;728;593;508 +163;558;365;508 +89;7;931;508 +931;726;510;508 +44;469;673;508 +674;44;673;508 +674;89;44;508 +469;470;546;508 +398;46;47;508 +469;398;47;508 +129;932;463;508 +251;129;463;508 +659;660;502;508 +674;675;593;508 +678;380;677;508 +678;679;379;508 +602;808;94;508 +94;808;243;508 +1017;765;354;508 +812;1081;325;508 +325;1081;467;508 +474;904;1015;508 +473;474;1015;508 +904;905;1014;508 +1015;904;1014;508 +905;906;1013;508 +1014;905;1013;508 +906;907;1012;508 +1013;906;1012;508 +907;908;1011;508 +1012;907;1011;508 +908;909;1016;508 +1011;908;1016;508 +362;357;250;508 +252;362;250;508 +357;358;249;508 +250;357;249;508 +358;359;248;508 +249;358;248;508 +359;360;247;508 +248;359;247;508 +360;361;246;508 +247;360;246;508 +361;324;251;508 +246;361;251;508 +736;1312;1156;508 +736;1313;1312;508 +736;735;1313;508 +1312;1311;1156;508 +1156;1311;1310;508 +1309;1156;1310;508 +1309;258;1156;508 +1309;766;258;508 +258;766;606;508 +606;766;503;508 +911;503;800;508 +729;800;369;508 +729;911;800;508 +441;503;766;508 +441;378;503;508 +441;927;378;508 +441;541;927;508 +441;440;541;508 +541;440;731;508 +654;731;814;508 +514;814;515;508 +514;654;814;508 +813;280;440;508 +813;192;280;508 +813;468;192;508 +813;1353;468;508 +468;1353;732;508 +1220;468;732;508 +1353;1352;732;508 +732;1352;1351;508 +1350;732;1351;508 +1350;504;732;508 +1350;1349;504;508 +504;1349;505;508 +192;429;809;508 +172;809;83;508 +172;192;809;508 +172;280;192;508 +172;279;280;508 +809;547;83;508 +727;440;280;508 +727;1266;440;508 +727;85;1266;508 +727;128;85;508 +727;300;128;508 +128;426;320;508 +85;128;320;508 +85;86;1266;508 +1266;731;440;508 +731;51;814;508 +654;540;541;508 +731;654;541;508 +927;302;303;508 +378;303;763;508 +377;378;763;508 +303;318;762;508 +763;303;762;508 +503;449;800;508 +911;575;606;508 +503;911;606;508 +258;144;1156;508 +378;927;303;508 +649;440;650;508 +650;440;441;508 +9;10;1081;508 +1081;10;467;508 +766;1309;1383;508 +765;766;1383;508 +1309;1310;1382;508 +1383;1309;1382;508 +1310;1311;1381;508 +1382;1310;1381;508 +1311;1312;1380;508 +1381;1311;1380;508 +1312;1313;1379;508 +1380;1312;1379;508 +1313;735;714;508 +1379;1313;714;508 +124;123;1384;508 +123;122;1384;508 +122;121;1384;508 +121;120;1384;508 +120;119;1384;508 +119;118;1384;508 +118;117;1384;508 +117;116;1384;508 +115;1384;116;508 +115;114;1384;508 +114;113;1384;508 +113;112;1384;508 +1384;112;111;508 +1384;111;110;508 +1384;110;109;508 +108;1384;109;508 +108;107;1384;508 +107;106;1384;508 +1384;106;105;508 +1384;105;104;508 +1384;104;103;508 +1384;103;102;508 +1384;102;101;508 +1384;101;124;508 +124;101;880;508 +903;124;880;508 +903;123;124;508 +903;902;123;508 +123;902;122;508 +122;902;901;508 +121;901;900;508 +120;900;899;508 +119;899;898;508 +118;898;897;508 +117;897;896;508 +116;896;895;508 +115;895;894;508 +114;894;893;508 +113;893;892;508 +112;892;891;508 +111;891;890;508 +110;890;889;508 +109;889;888;508 +108;888;887;508 +107;887;886;508 +106;886;885;508 +105;885;884;508 +104;884;883;508 +103;883;882;508 +102;882;881;508 +101;881;880;508 +101;102;881;508 +102;103;882;508 +103;104;883;508 +104;105;884;508 +105;106;885;508 +106;107;886;508 +107;108;887;508 +108;109;888;508 +109;110;889;508 +110;111;890;508 +111;112;891;508 +112;113;892;508 +113;114;893;508 +114;115;894;508 +115;116;895;508 +116;117;896;508 +117;118;897;508 +118;119;898;508 +119;120;899;508 +120;121;900;508 +121;122;901;508 +968;967;1385;508 +1385;967;966;508 +1385;966;965;508 +1385;965;964;508 +1385;964;963;508 +1385;963;962;508 +1385;962;961;508 +1385;961;960;508 +1385;960;959;508 +1385;959;958;508 +1385;958;957;508 +1385;957;956;508 +1385;956;955;508 +1385;955;954;508 +1385;954;953;508 +1385;953;952;508 +1385;952;951;508 +1385;951;950;508 +1385;950;949;508 +1385;949;948;508 +1385;948;947;508 +1385;947;946;508 +1385;946;945;508 +1385;945;968;508 +968;945;831;508 +854;968;831;508 +854;967;968;508 +854;853;967;508 +967;853;966;508 +966;853;852;508 +965;852;851;508 +964;851;850;508 +963;850;849;508 +962;849;848;508 +961;848;847;508 +960;847;846;508 +959;846;845;508 +958;845;844;508 +957;844;843;508 +956;843;842;508 +955;842;841;508 +954;841;840;508 +953;840;839;508 +952;839;838;508 +951;838;837;508 +950;837;836;508 +949;836;835;508 +948;835;834;508 +947;834;833;508 +946;833;832;508 +945;832;831;508 +945;946;832;508 +946;947;833;508 +947;948;834;508 +948;949;835;508 +949;950;836;508 +950;951;837;508 +951;952;838;508 +952;953;839;508 +953;954;840;508 +954;955;841;508 +955;956;842;508 +956;957;843;508 +957;958;844;508 +958;959;845;508 +959;960;846;508 +960;961;847;508 +961;962;848;508 +962;963;849;508 +963;964;850;508 +964;965;851;508 +965;966;852;508 +1118;1117;1386;508 +1117;1116;1386;508 +1116;1115;1386;508 +1115;1114;1386;508 +1114;1113;1386;508 +1113;1112;1386;508 +1112;1111;1386;508 +1386;1111;1110;508 +1386;1110;1109;508 +1386;1109;1108;508 +1386;1108;1107;508 +1386;1107;1106;508 +1105;1386;1106;508 +1105;1104;1386;508 +1103;1386;1104;508 +1102;1386;1103;508 +1102;1101;1386;508 +1101;1100;1386;508 +1100;1099;1386;508 +1099;1098;1386;508 +1097;1386;1098;508 +1096;1386;1097;508 +1095;1386;1096;508 +1095;1118;1386;508 +1118;1095;738;508 +761;1118;738;508 +761;1117;1118;508 +761;760;1117;508 +1117;760;1116;508 +1116;760;759;508 +1115;759;758;508 +1114;758;757;508 +1113;757;756;508 +1112;756;755;508 +1111;755;754;508 +1110;754;753;508 +1109;753;752;508 +1108;752;751;508 +1107;751;750;508 +1106;750;749;508 +1105;749;748;508 +1104;748;747;508 +1103;747;746;508 +1102;746;745;508 +1101;745;744;508 +1100;744;743;508 +1099;743;742;508 +1098;742;741;508 +1097;741;740;508 +1096;740;739;508 +1095;739;738;508 +1095;1096;739;508 +1096;1097;740;508 +1097;1098;741;508 +1098;1099;742;508 +1099;1100;743;508 +1100;1101;744;508 +1101;1102;745;508 +1102;1103;746;508 +1103;1104;747;508 +1104;1105;748;508 +1105;1106;749;508 +1106;1107;750;508 +1107;1108;751;508 +1108;1109;752;508 +1109;1110;753;508 +1110;1111;754;508 +1111;1112;755;508 +1112;1113;756;508 +1113;1114;757;508 +1114;1115;758;508 +1115;1116;759;508 +1299;1298;1387;508 +1297;1387;1298;508 +1297;1296;1387;508 +1296;1295;1387;508 +1294;1387;1295;508 +1294;1293;1387;508 +1293;1292;1387;508 +1292;1291;1387;508 +1291;1290;1387;508 +1290;1289;1387;508 +1288;1387;1289;508 +1288;1287;1387;508 +1387;1287;1286;508 +1286;1285;1387;508 +1387;1285;1284;508 +1387;1284;1283;508 +1387;1283;1282;508 +1387;1282;1281;508 +1387;1281;1280;508 +1387;1280;1279;508 +1387;1279;1278;508 +1387;1278;1277;508 +1387;1277;1276;508 +1387;1276;1299;508 +1299;1276;1377;508 +1376;1299;1377;508 +1376;1298;1299;508 +1376;1297;1298;508 +1376;1375;1297;508 +1297;1375;1296;508 +1296;1375;1374;508 +1295;1374;1373;508 +1294;1373;1372;508 +1293;1372;1371;508 +1292;1371;1370;508 +1291;1370;1369;508 +1290;1369;1368;508 +1289;1368;1367;508 +1288;1367;1366;508 +1287;1366;1365;508 +1286;1365;1364;508 +1285;1364;1363;508 +1284;1363;1362;508 +1283;1362;1361;508 +1282;1361;1360;508 +1281;1360;1359;508 +1280;1359;1358;508 +1279;1358;1357;508 +1278;1357;1356;508 +1277;1356;1355;508 +1276;1355;1354;508 +1377;1276;1354;508 +1276;1277;1355;508 +1277;1278;1356;508 +1278;1279;1357;508 +1279;1280;1358;508 +1280;1281;1359;508 +1281;1282;1360;508 +1282;1283;1361;508 +1283;1284;1362;508 +1284;1285;1363;508 +1285;1286;1364;508 +1286;1287;1365;508 +1287;1288;1366;508 +1288;1289;1367;508 +1289;1290;1368;508 +1290;1291;1369;508 +1291;1292;1370;508 +1292;1293;1371;508 +1293;1294;1372;508 +1294;1295;1373;508 +1295;1296;1374;508 +999;998;1388;508 +998;997;1388;508 +1388;997;996;508 +1388;996;995;508 +1388;995;994;508 +1388;994;993;508 +1388;993;992;508 +1388;992;991;508 +1388;991;990;508 +1388;990;989;508 +1388;989;988;508 +1388;988;987;508 +1388;987;986;508 +1388;986;985;508 +1388;985;984;508 +1388;984;983;508 +1388;983;982;508 +1388;982;981;508 +1388;981;980;508 +1388;980;979;508 +1388;979;978;508 +1388;978;977;508 +1388;977;976;508 +1388;976;999;508 +999;976;1196;508 +1219;999;1196;508 +1219;998;999;508 +1219;1218;998;508 +998;1218;997;508 +997;1218;1217;508 +996;1217;1216;508 +995;1216;1215;508 +994;1215;1214;508 +993;1214;1213;508 +992;1213;1212;508 +991;1212;1211;508 +990;1211;1210;508 +989;1210;1209;508 +988;1209;1208;508 +987;1208;1207;508 +986;1207;1206;508 +985;1206;1205;508 +984;1205;1204;508 +983;1204;1203;508 +982;1203;1202;508 +981;1202;1201;508 +980;1201;1200;508 +979;1200;1199;508 +978;1199;1198;508 +977;1198;1197;508 +976;1197;1196;508 +976;977;1197;508 +977;978;1198;508 +978;979;1199;508 +979;980;1200;508 +980;981;1201;508 +981;982;1202;508 +982;983;1203;508 +983;984;1204;508 +984;985;1205;508 +985;986;1206;508 +986;987;1207;508 +987;988;1208;508 +988;989;1209;508 +989;990;1210;508 +990;991;1211;508 +991;992;1212;508 +992;993;1213;508 +993;994;1214;508 +994;995;1215;508 +995;996;1216;508 +996;997;1217;508 +1194;1193;1389;508 +1193;1192;1389;508 +1192;1191;1389;508 +1191;1190;1389;508 +1190;1189;1389;508 +1189;1188;1389;508 +1188;1187;1389;508 +1187;1186;1389;508 +1186;1185;1389;508 +1185;1184;1389;508 +1184;1183;1389;508 +1183;1182;1389;508 +1182;1181;1389;508 +1181;1180;1389;508 +1180;1179;1389;508 +1179;1178;1389;508 +1177;1389;1178;508 +1177;1176;1389;508 +1176;1175;1389;508 +1175;1174;1389;508 +1174;1173;1389;508 +1173;1172;1389;508 +1389;1172;1171;508 +1389;1171;1194;508 +1194;1171;18;508 +41;1194;18;508 +41;1193;1194;508 +41;40;1193;508 +1193;40;1192;508 +1192;40;39;508 +1191;39;38;508 +1190;38;37;508 +1189;37;36;508 +1188;36;35;508 +1187;35;34;508 +1186;34;33;508 +1185;33;32;508 +1184;32;31;508 +1183;31;30;508 +1182;30;29;508 +1181;29;28;508 +1180;28;27;508 +1179;27;26;508 +1178;26;25;508 +1177;25;24;508 +1176;24;23;508 +1175;23;22;508 +1174;22;21;508 +1173;21;20;508 +1172;20;19;508 +1171;19;18;508 +1171;1172;19;508 +1172;1173;20;508 +1173;1174;21;508 +1174;1175;22;508 +1175;1176;23;508 +1176;1177;24;508 +1177;1178;25;508 +1178;1179;26;508 +1179;1180;27;508 +1180;1181;28;508 +1181;1182;29;508 +1182;1183;30;508 +1183;1184;31;508 +1184;1185;32;508 +1185;1186;33;508 +1186;1187;34;508 +1187;1188;35;508 +1188;1189;36;508 +1189;1190;37;508 +1190;1191;38;508 +1191;1192;39;508 +349;348;1390;508 +348;347;1390;508 +347;346;1390;508 +345;1390;346;508 +345;344;1390;508 +344;343;1390;508 +1390;343;342;508 +1390;342;341;508 +1390;341;340;508 +1390;340;339;508 +1390;339;338;508 +1390;338;337;508 +1390;337;336;508 +1390;336;335;508 +1390;335;334;508 +1390;334;333;508 +1390;333;332;508 +1390;332;331;508 +1390;331;330;508 +1390;330;329;508 +1390;329;328;508 +1390;328;327;508 +1390;327;326;508 +1390;326;349;508 +349;326;1056;508 +1079;349;1056;508 +1079;348;349;508 +1079;1078;348;508 +348;1078;347;508 +347;1078;1077;508 +346;1077;1076;508 +345;1076;1075;508 +344;1075;1074;508 +343;1074;1073;508 +342;1073;1072;508 +341;1072;1071;508 +340;1071;1070;508 +339;1070;1069;508 +338;1069;1068;508 +337;1068;1067;508 +336;1067;1066;508 +335;1066;1065;508 +334;1065;1064;508 +333;1064;1063;508 +332;1063;1062;508 +331;1062;1061;508 +330;1061;1060;508 +329;1060;1059;508 +328;1059;1058;508 +327;1058;1057;508 +326;1057;1056;508 +326;327;1057;508 +327;328;1058;508 +328;329;1059;508 +329;330;1060;508 +330;331;1061;508 +331;332;1062;508 +332;333;1063;508 +333;334;1064;508 +334;335;1065;508 +335;336;1066;508 +336;337;1067;508 +337;338;1068;508 +338;339;1069;508 +339;340;1070;508 +340;341;1071;508 +341;342;1072;508 +342;343;1073;508 +343;344;1074;508 +344;345;1075;508 +345;346;1076;508 +346;347;1077;508 +708;707;1391;508 +707;706;1391;508 +706;705;1391;508 +704;1391;705;508 +704;703;1391;508 +702;1391;703;508 +702;701;1391;508 +701;700;1391;508 +699;1391;700;508 +699;698;1391;508 +698;697;1391;508 +697;696;1391;508 +696;695;1391;508 +695;694;1391;508 +693;1391;694;508 +693;692;1391;508 +692;691;1391;508 +691;690;1391;508 +690;689;1391;508 +688;1391;689;508 +688;687;1391;508 +1391;687;686;508 +1391;686;685;508 +1391;685;708;508 +708;685;1221;508 +1244;708;1221;508 +1244;707;708;508 +1244;1243;707;508 +707;1243;706;508 +706;1243;1242;508 +705;1242;1241;508 +704;1241;1240;508 +703;1240;1239;508 +702;1239;1238;508 +701;1238;1237;508 +700;1237;1236;508 +699;1236;1235;508 +698;1235;1234;508 +697;1234;1233;508 +696;1233;1232;508 +695;1232;1231;508 +694;1231;1230;508 +693;1230;1229;508 +692;1229;1228;508 +691;1228;1227;508 +690;1227;1226;508 +689;1226;1225;508 +688;1225;1224;508 +687;1224;1223;508 +686;1223;1222;508 +685;1222;1221;508 +685;686;1222;508 +686;687;1223;508 +687;688;1224;508 +688;689;1225;508 +689;690;1226;508 +690;691;1227;508 +691;692;1228;508 +692;693;1229;508 +693;694;1230;508 +694;695;1231;508 +695;696;1232;508 +696;697;1233;508 +697;698;1234;508 +698;699;1235;508 +699;700;1236;508 +700;701;1237;508 +701;702;1238;508 +702;703;1239;508 +703;704;1240;508 +704;705;1241;508 +705;706;1242;508 +235;165;1275;508 +56;1275;57;508 +56;235;1275;508 +56;55;235;508 +235;55;54;508 +233;54;77;508 +232;77;231;508 +232;233;77;508 +1275;973;57;508 +57;973;58;508 +58;973;855;508 +59;855;856;508 +857;59;856;508 +857;60;59;508 +857;820;60;508 +857;433;820;508 +973;381;855;508 +820;823;61;508 +60;820;61;508 +823;824;62;508 +61;823;62;508 +824;825;64;508 +63;824;64;508 +63;62;824;508 +825;826;65;508 +64;825;65;508 +826;827;66;508 +65;826;66;508 +828;67;827;508 +828;68;67;508 +828;829;68;508 +68;829;69;508 +69;829;168;508 +70;168;312;508 +71;312;313;508 +72;313;314;508 +569;314;315;508 +569;72;314;508 +569;73;72;508 +569;74;73;508 +569;568;74;508 +74;568;234;508 +75;234;76;508 +75;74;234;508 +168;169;312;508 +568;492;234;508 +234;231;76;508 +76;231;77;508 +233;235;54;508 +72;71;313;508 +71;70;312;508 +70;69;168;508 +67;66;827;508 +59;58;855;508 +505;1349;215;508 +217;505;215;508 +1349;1350;214;508 +215;1349;214;508 +1350;1351;213;508 +214;1350;213;508 +1351;1352;212;508 +213;1351;212;508 +1352;1353;211;508 +212;1352;211;508 +1353;813;216;508 +211;1353;216;508 +640;383;641;508 +641;383;384;508 +323;596;256;508 +256;596;257;508 +652;402;52;508 +52;402;403;508 +862;590;607;508 +607;590;125;508 +2;306;1094;508 +1094;306;768;508 +387;393;388;508 +388;393;542;508 +914;626;538;508 +538;626;539;508 +134;133;625;508 +625;133;130;508 +132;100;816;508 +816;100;400;508 +227;351;228;508 +228;351;424;508 +421;552;499;508 +499;552;501;508 +224;264;555;508 +555;264;556;508 +308;307;930;508 +930;307;482;508 +734;517;431;508 +431;517;465;508 +372;396;508;508 +508;396;509;508 +4;3;371;508 +371;3;545;508 +162;161;430;508 +430;161;864;508 +434;278;277;508 +368;434;277;508 +210;209;401;508 +401;209;513;508 +500;764;170;508 +170;764;171;508 +147;506;1;508 +147;769;506;508 +497;657;496;508 +496;657;53;508 +648;647;638;508 +638;647;1030;508 +863;92;544;508 +544;92;91;508 +186;643;223;508 +186;185;643;508 +490;489;131;508 +131;489;462;508 +811;599;810;508 +810;599;598;508 +572;601;608;508 +126;572;608;508 +591;367;425;508 +425;367;554;508 +226;225;145;508 +145;225;146;508 +239;350;238;508 +238;350;553;508 +799;771;798;508 +798;771;770;508 +508;509;3;508 +4;508;3;508 +930;482;430;508 +864;930;430;508 +810;598;771;508 +799;810;771;508 +499;501;368;508 +277;499;368;508 +145;146;431;508 +465;145;431;508 +816;400;401;508 +513;816;401;508 +185;186;555;508 +556;185;555;508 +539;171;538;508 +539;170;171;508 +425;554;228;508 +424;425;228;508 +1094;768;769;508 +147;1094;769;508 +131;462;625;508 +130;131;625;508 +52;403;496;508 +53;52;496;508 +238;553;388;508 +542;238;388;508 +641;384;638;508 +1030;641;638;508 +126;608;607;508 +125;126;607;508 +372;508;370;508 +370;508;4;508 +371;370;4;508 +308;930;1337;508 +1337;930;864;508 +161;1337;864;508 +598;599;1128;508 +771;1128;770;508 +771;598;1128;508 +421;499;420;508 +420;499;277;508 +278;420;277;508 +146;225;822;508 +431;822;734;508 +431;146;822;508 +816;1336;132;508 +816;513;1336;508 +1336;513;209;508 +186;223;222;508 +555;222;224;508 +555;186;222;508 +914;538;913;508 +913;538;171;508 +764;913;171;508 +366;554;367;508 +366;228;554;508 +366;227;228;508 +2;1094;0;508 +0;1094;147;508 +1;0;147;508 +462;489;725;508 +625;725;134;508 +625;462;725;508 +652;52;656;508 +656;52;53;508 +657;656;53;508 +553;350;574;508 +388;574;387;508 +388;553;574;508 +641;1378;640;508 +641;1030;1378;508 +1378;1030;647;508 +608;601;861;508 +607;861;862;508 +607;608;861;508 +92;863;322;508 +322;863;680;508 +323;680;596;508 +323;322;680;508 +863;445;681;508 +680;863;681;508 +445;383;681;508 +681;383;658;508 +658;383;1378;508 +647;658;1378;508 +647;648;658;508 +658;648;821;508 +659;821;402;508 +652;659;402;508 +652;656;659;508 +659;656;497;508 +660;497;305;508 +306;660;305;508 +306;661;660;508 +306;0;661;508 +306;2;0;508 +383;640;1378;508 +656;657;497;508 +0;1;661;508 +661;1;506;508 +507;661;506;508 +507;662;661;508 +507;626;662;508 +662;626;914;508 +913;662;914;508 +913;500;662;508 +913;764;500;508 +500;99;663;508 +662;500;663;508 +99;100;663;508 +663;100;664;508 +664;100;1336;508 +209;664;1336;508 +209;210;664;508 +664;210;551;508 +665;551;552;508 +421;665;552;508 +421;420;665;508 +665;420;434;508 +666;434;435;508 +307;666;435;508 +307;667;666;508 +307;1337;667;508 +307;308;1337;508 +100;132;1336;508 +420;278;434;508 +161;667;1337;508 +161;162;667;508 +667;162;1093;508 +668;1093;396;508 +372;668;396;508 +372;370;668;508 +668;370;545;508 +669;545;655;508 +798;669;655;508 +798;670;669;508 +798;1128;670;508 +798;770;1128;508 +370;371;545;508 +1128;599;670;508 +670;599;811;508 +516;670;811;508 +516;671;670;508 +516;517;671;508 +671;517;734;508 +822;671;734;508 +822;226;671;508 +822;225;226;508 +226;562;672;508 +671;226;672;508 +562;264;672;508 +672;264;673;508 +673;264;222;508 +223;673;222;508 +223;643;673;508 +673;643;493;508 +674;493;351;508 +227;674;351;508 +227;366;674;508 +674;366;591;508 +675;591;972;508 +133;675;972;508 +133;676;675;508 +133;725;676;508 +133;134;725;508 +222;264;224;508 +366;367;591;508 +725;489;676;508 +676;489;490;508 +498;676;490;508 +498;677;676;508 +498;393;677;508 +677;393;387;508 +574;677;387;508 +574;239;677;508 +574;350;239;508 +1080;678;239;508 +1080;590;678;508 +678;590;679;508 +679;590;861;508 +601;679;861;508 +601;572;679;508 +679;572;573;508 +680;573;596;508 +680;679;573;508 +590;862;861;508 +678;677;239;508 +675;674;591;508 +673;493;674;508 +669;668;545;508 +668;667;1093;508 +666;665;434;508 +665;664;551;508 +660;659;497;508 +658;821;659;508 +544;91;256;508 +257;544;256;508 +797;774;799;508 +3;799;655;508 +545;3;655;508 +774;775;810;508 +799;774;810;508 +775;776;145;508 +465;775;145;508 +465;810;775;508 +465;516;810;508 +465;517;516;508 +777;556;776;508 +777;185;556;508 +777;778;185;508 +185;778;424;508 +493;424;351;508 +493;185;424;508 +493;643;185;508 +779;425;778;508 +779;130;425;508 +779;780;130;508 +130;780;131;508 +131;780;781;508 +542;781;238;508 +542;131;781;508 +542;498;131;508 +542;393;498;508 +238;781;782;508 +125;782;783;508 +126;783;784;508 +257;784;544;508 +257;126;784;508 +257;573;126;508 +257;596;573;508 +784;785;544;508 +544;785;384;508 +445;384;383;508 +445;544;384;508 +445;863;544;508 +785;786;384;508 +384;786;638;508 +638;786;787;508 +403;787;496;508 +403;638;787;508 +403;821;638;508 +403;402;821;508 +788;496;787;508 +788;768;496;508 +788;789;768;508 +768;789;769;508 +769;789;790;508 +539;790;170;508 +539;769;790;508 +539;507;769;508 +539;626;507;508 +791;170;790;508 +791;400;170;508 +791;792;400;508 +400;792;401;508 +401;792;793;508 +501;793;368;508 +501;401;793;508 +501;551;401;508 +501;552;551;508 +793;794;368;508 +368;794;482;508 +435;482;307;508 +435;368;482;508 +435;434;368;508 +794;795;482;508 +482;795;430;508 +430;795;796;508 +509;796;3;508 +509;430;796;508 +509;1093;430;508 +509;396;1093;508 +796;797;3;508 +3;797;799;508 +573;572;126;508 +126;125;783;508 +1080;125;590;508 +1080;238;125;508 +1080;239;238;508 +490;131;498;508 +972;130;133;508 +972;425;130;508 +972;591;425;508 +425;424;778;508 +562;556;264;508 +562;145;556;508 +562;226;145;508 +811;810;516;508 +799;798;655;508 +1093;162;430;508 +551;210;401;508 +99;400;100;508 +99;170;400;508 +99;500;170;508 +506;769;507;508 +305;768;306;508 +305;496;768;508 +305;497;496;508 +821;648;638;508 +776;556;145;508 +782;125;238;508 +92;322;91;508 +91;322;256;508 +256;322;323;508 +797;796;1043;508 +1042;797;1043;508 +1042;774;797;508 +1042;1041;774;508 +774;1041;775;508 +775;1041;1040;508 +776;1040;1039;508 +777;1039;1038;508 +778;1038;1037;508 +779;1037;1036;508 +780;1036;1035;508 +781;1035;1034;508 +782;1034;1033;508 +783;1033;1032;508 +784;1032;1031;508 +785;1031;1054;508 +786;1054;1053;508 +787;1053;1052;508 +788;1052;1051;508 +789;1051;1050;508 +790;1050;1049;508 +791;1049;1048;508 +792;1048;1047;508 +793;1047;1046;508 +794;1046;1045;508 +795;1045;1044;508 +796;1044;1043;508 +796;795;1044;508 +795;794;1045;508 +793;1046;794;508 +793;792;1047;508 +792;791;1048;508 +791;790;1049;508 +790;789;1050;508 +789;788;1051;508 +788;787;1052;508 +787;786;1053;508 +786;785;1054;508 +785;784;1031;508 +784;783;1032;508 +783;782;1033;508 +782;781;1034;508 +780;1035;781;508 +780;779;1036;508 +779;778;1037;508 +778;777;1038;508 +777;776;1039;508 +776;775;1040;508 +903;880;1054;508 +902;1054;901;508 +902;903;1054;508 +880;881;1054;508 +1054;881;1053;508 +1053;881;882;508 +883;1053;882;508 +883;884;1053;508 +1053;884;885;508 +1238;885;1237;508 +1238;1053;885;508 +1238;1052;1053;508 +1238;1239;1052;508 +1052;1239;1240;508 +1241;1052;1240;508 +1241;1242;1052;508 +1052;1242;1051;508 +1051;1242;1243;508 +1244;1051;1243;508 +1244;1221;1051;508 +1051;1221;1222;508 +1050;1222;1223;508 +1224;1050;1223;508 +1224;1225;1050;508 +1050;1225;1226;508 +1371;1226;1370;508 +1371;1050;1226;508 +1371;1049;1050;508 +1371;1372;1049;508 +1049;1372;1373;508 +1374;1049;1373;508 +1374;1375;1049;508 +1049;1375;1048;508 +1048;1375;1376;508 +1377;1048;1376;508 +1377;1354;1048;508 +1048;1354;1355;508 +1047;1355;1356;508 +1357;1047;1356;508 +1357;1358;1047;508 +1047;1358;1359;508 +35;1359;34;508 +35;1047;1359;508 +35;1046;1047;508 +35;36;1046;508 +1046;36;37;508 +38;1046;37;508 +38;39;1046;508 +1046;39;1045;508 +1045;39;40;508 +41;1045;40;508 +41;18;1045;508 +1045;18;19;508 +1044;19;20;508 +21;1044;20;508 +21;22;1044;508 +1044;22;23;508 +848;23;847;508 +848;1044;23;508 +848;1043;1044;508 +848;849;1043;508 +1043;849;850;508 +851;1043;850;508 +851;852;1043;508 +1043;852;1042;508 +1042;852;853;508 +854;1042;853;508 +854;831;1042;508 +1042;831;832;508 +1041;832;833;508 +834;1041;833;508 +834;835;1041;508 +1041;835;836;508 +1073;836;1072;508 +1073;1041;836;508 +1073;1040;1041;508 +1073;1074;1040;508 +1040;1074;1075;508 +1076;1040;1075;508 +1076;1077;1040;508 +1040;1077;1039;508 +1039;1077;1078;508 +1079;1039;1078;508 +1079;1056;1039;508 +1039;1056;1057;508 +1038;1057;1058;508 +1059;1038;1058;508 +1059;1060;1038;508 +1038;1060;1061;508 +755;1061;754;508 +755;1038;1061;508 +755;1037;1038;508 +755;756;1037;508 +1037;756;757;508 +758;1037;757;508 +758;759;1037;508 +1037;759;1036;508 +1036;759;760;508 +761;1036;760;508 +761;738;1036;508 +1036;738;739;508 +1035;739;740;508 +741;1035;740;508 +741;742;1035;508 +1035;742;743;508 +1213;743;1212;508 +1213;1035;743;508 +1213;1034;1035;508 +1213;1214;1034;508 +1034;1214;1215;508 +1216;1034;1215;508 +1216;1217;1034;508 +1034;1217;1033;508 +1033;1217;1218;508 +1219;1033;1218;508 +1219;1196;1033;508 +1033;1196;1197;508 +1032;1197;1198;508 +1199;1032;1198;508 +1199;1200;1032;508 +1032;1200;1201;508 +897;1201;1202;508 +896;1202;1203;508 +895;1203;75;508 +76;895;75;508 +76;894;895;508 +76;893;894;508 +76;892;893;508 +76;77;892;508 +892;77;891;508 +891;77;890;508 +890;77;54;508 +889;54;888;508 +889;890;54;508 +886;1237;885;508 +886;1236;1237;508 +886;887;1236;508 +1236;887;54;508 +55;1236;54;508 +55;1235;1236;508 +55;1234;1235;508 +55;1233;1234;508 +55;56;1233;508 +1233;56;1232;508 +1232;56;1231;508 +1231;56;57;508 +1230;57;1229;508 +1230;1231;57;508 +887;888;54;508 +896;1203;895;508 +896;897;1202;508 +1031;897;898;508 +899;1031;898;508 +899;900;1031;508 +1031;900;901;508 +1054;1031;901;508 +836;837;1072;508 +1072;837;1071;508 +1071;837;838;508 +66;838;839;508 +840;66;839;508 +840;841;66;508 +66;841;65;508 +65;841;842;508 +843;65;842;508 +843;64;65;508 +843;844;64;508 +64;844;845;508 +846;64;845;508 +846;63;64;508 +846;25;63;508 +846;847;25;508 +25;847;24;508 +24;847;23;508 +743;744;1212;508 +1212;744;1211;508 +1211;744;745;508 +72;745;746;508 +747;72;746;508 +747;748;72;508 +72;748;71;508 +71;748;749;508 +750;71;749;508 +750;70;71;508 +750;751;70;508 +70;751;752;508 +753;70;752;508 +753;69;70;508 +753;1063;69;508 +753;1062;1063;508 +753;754;1062;508 +1062;754;1061;508 +1360;34;1359;508 +1360;33;34;508 +1360;1361;33;508 +33;1361;60;508 +61;33;60;508 +61;32;33;508 +61;31;32;508 +61;30;31;508 +61;62;30;508 +30;62;29;508 +29;62;28;508 +28;62;63;508 +27;63;26;508 +27;28;63;508 +1362;60;1361;508 +1362;1363;60;508 +60;1363;1364;508 +59;1364;1365;508 +1366;59;1365;508 +1366;58;59;508 +1366;1367;58;508 +58;1367;1368;508 +1369;58;1368;508 +1369;57;58;508 +1369;1228;57;508 +1369;1227;1228;508 +1369;1370;1227;508 +1227;1370;1226;508 +1204;75;1203;508 +1204;1205;75;508 +75;1205;1206;508 +74;1206;1207;508 +1208;74;1207;508 +1208;73;74;508 +1208;1209;73;508 +73;1209;1210;508 +1211;73;1210;508 +1211;72;73;508 +1211;745;72;508 +25;26;63;508 +1063;1064;69;508 +69;1064;1065;508 +1066;69;1065;508 +1066;68;69;508 +1066;1067;68;508 +68;1067;1068;508 +67;1068;1069;508 +1070;67;1069;508 +1070;1071;67;508 +67;1071;66;508 +66;1071;838;508 +1229;57;1228;508 +59;60;1364;508 +68;1068;67;508 +75;1206;74;508 +1032;897;1031;508 +1032;1201;897;508 +1197;1032;1033;508 +1036;739;1035;508 +1038;1039;1057;508 +1041;1042;832;508 +1044;1045;19;508 +1047;1048;1355;508 +1050;1051;1222;508 diff --git a/external/jigsaw/inc/jigsaw_const.h b/external/jigsaw/inc/jigsaw_const.h index 1ad031f..7a413ad 100644 --- a/external/jigsaw/inc/jigsaw_const.h +++ b/external/jigsaw/inc/jigsaw_const.h @@ -22,18 +22,22 @@ * how they can obtain it for free, then you are not * required to make any arrangement with me.) * - * Disclaimer: Neither I nor: Columbia University, The - * Massachusetts Institute of Technology, The - * University of Sydney, nor The National Aeronautics - * and Space Administration warrant this code in any - * way whatsoever. This code is provided "as-is" to be - * used at your own risk. + * Disclaimer: Neither I nor THE CONTRIBUTORS warrant + * this code in any way whatsoever. This code is + * provided "as-is" to be used at your own risk. + * + * THE CONTRIBUTORS include: + * (a) The University of Sydney + * (b) The Massachusetts Institute of Technology + * (c) Columbia University + * (d) The National Aeronautics & Space Administration + * (e) Los Alamos National Laboratory * -------------------------------------------------------- * - * Last updated: 16 July, 2020 + * Last updated: 29 May, 2022 * - * Copyright 2013-2020 + * Copyright 2013-2022 * Darren Engwirda * d.engwirda@gmail.com * https://github.com/dengwirda @@ -53,6 +57,7 @@ # define JIGSAW_FILE_NOT_LOCATED +2 # define JIGSAW_FILE_NOT_CREATED +3 +# define JIGSAW_NETCDF_NOT_FOUND +9 # define JIGSAW_INVALID_ARGUMENT +4 # define JIGSAW_INVALID_INDEXING +5 @@ -98,5 +103,7 @@ # define JIGSAW_KERN_CVT_DQDX +405 # define JIGSAW_KERN_H95_DQDX +406 +# define JIGSAW_KERN_AREA_LEN +410 +# define JIGSAW_KERN_SKEW_COS +411 diff --git a/external/jigsaw/inc/jigsaw_jig_t.h b/external/jigsaw/inc/jigsaw_jig_t.h index 50cf23c..4efce4f 100644 --- a/external/jigsaw/inc/jigsaw_jig_t.h +++ b/external/jigsaw/inc/jigsaw_jig_t.h @@ -22,18 +22,22 @@ * how they can obtain it for free, then you are not * required to make any arrangement with me.) * - * Disclaimer: Neither I nor: Columbia University, The - * Massachusetts Institute of Technology, The - * University of Sydney, nor The National Aeronautics - * and Space Administration warrant this code in any - * way whatsoever. This code is provided "as-is" to be - * used at your own risk. + * Disclaimer: Neither I nor THE CONTRIBUTORS warrant + * this code in any way whatsoever. This code is + * provided "as-is" to be used at your own risk. + * + * THE CONTRIBUTORS include: + * (a) The University of Sydney + * (b) The Massachusetts Institute of Technology + * (c) Columbia University + * (d) The National Aeronautics & Space Administration + * (e) Los Alamos National Laboratory * -------------------------------------------------------- * - * Last updated: 21 Apr., 2021 + * Last updated: 12 Dec., 2022 * - * Copyright 2013-2021 + * Copyright 2013-2022 * Darren Engwirda * d.engwirda@gmail.com * https://github.com/dengwirda @@ -60,6 +64,16 @@ indx_t _verbosity ; + /* + -------------------------------------------------------- + * NUMTHREAD - {default=0} control for thread-parallel + * implementations. Set NUMTHREAD <= 0 to autodetect a + * machine's max-thread allocation. + -------------------------------------------------------- + */ + + indx_t _numthread ; + /* -------------------------------------------------------- * GEOM-SEED - {default = 8} number of "seed" vertices @@ -380,6 +394,46 @@ indx_t _optm_iter ; + /* + -------------------------------------------------------- + * OPTM_COST - {default = 'area-len'} mesh optimisation + * cost metric, choice of area-length (COST='area-len') + * or skewed-cosine (COST='skew-cos') functions. + * The area-length metric is symmetric wrt. both small + * and large cell angles, and is typically appropriate + * for simplex-only meshes. The skewed-cosine metric is + * based on an asymmetric penalisation of large cell + * angles, and may be useful for staggered primal-dual + * tessellations. + -------------------------------------------------------- + */ + + indx_t _optm_cost ; + + /* + -------------------------------------------------------- + * OPTM_BETA - {default=0.4950} "momentum"-type weight + * for gradient descent updates, such that + * DX' = BETA * DX(K-1) + (1-BETA) * DX(K). + * Momentum typically improves the convergence of mesh + * optimisation. + -------------------------------------------------------- + */ + + real_t _optm_beta ; + + /* + -------------------------------------------------------- + * OPTM_ZETA - {default=0.8250} "momentum"-type weight + * for search direction updates, such that + * DX* = ZETA * DX' (K) + (1-ZETA) * DX(K). + * Momentum typically improves the convergence of mesh + * optimisation. + -------------------------------------------------------- + */ + + real_t _optm_zeta ; + /* -------------------------------------------------------- * OPTM_QTOL - {default=1.E-04} tolerance on mesh cost @@ -393,7 +447,7 @@ /* -------------------------------------------------------- - * OPTM_QLIM - {default=0.9375} threshold on mesh cost + * OPTM_QLIM - {default=0.9333} threshold on mesh cost * function above which gradient-based optimisation is * attempted. -------------------------------------------------------- diff --git a/external/jigsaw/inc/jigsaw_msh_t.h b/external/jigsaw/inc/jigsaw_msh_t.h index be180ab..3983de6 100644 --- a/external/jigsaw/inc/jigsaw_msh_t.h +++ b/external/jigsaw/inc/jigsaw_msh_t.h @@ -22,12 +22,16 @@ * how they can obtain it for free, then you are not * required to make any arrangement with me.) * - * Disclaimer: Neither I nor: Columbia University, The - * Massachusetts Institute of Technology, The - * University of Sydney, nor The National Aeronautics - * and Space Administration warrant this code in any - * way whatsoever. This code is provided "as-is" to be - * used at your own risk. + * Disclaimer: Neither I nor THE CONTRIBUTORS warrant + * this code in any way whatsoever. This code is + * provided "as-is" to be used at your own risk. + * + * THE CONTRIBUTORS include: + * (a) The University of Sydney + * (b) The Massachusetts Institute of Technology + * (c) Columbia University + * (d) The National Aeronautics & Space Administration + * (e) Los Alamos National Laboratory * -------------------------------------------------------- * diff --git a/external/jigsaw/inc/lib_jigsaw.h b/external/jigsaw/inc/lib_jigsaw.h index 18995a9..2491e2f 100644 --- a/external/jigsaw/inc/lib_jigsaw.h +++ b/external/jigsaw/inc/lib_jigsaw.h @@ -41,12 +41,16 @@ * how they can obtain it for free, then you are not * required to make any arrangement with me.) * - * Disclaimer: Neither I nor: Columbia University, The - * Massachusetts Institute of Technology, The - * University of Sydney, nor The National Aeronautics - * and Space Administration warrant this code in any - * way whatsoever. This code is provided "as-is" to be - * used at your own risk. + * Disclaimer: Neither I nor THE CONTRIBUTORS warrant + * this code in any way whatsoever. This code is + * provided "as-is" to be used at your own risk. + * + * THE CONTRIBUTORS include: + * (a) The University of Sydney + * (b) The Massachusetts Institute of Technology + * (c) Columbia University + * (d) The National Aeronautics & Space Administration + * (e) Los Alamos National Laboratory * -------------------------------------------------------- */ diff --git a/external/jigsaw/src/CMakeLists.txt b/external/jigsaw/src/CMakeLists.txt index 358d3c8..80208f3 100644 --- a/external/jigsaw/src/CMakeLists.txt +++ b/external/jigsaw/src/CMakeLists.txt @@ -2,6 +2,8 @@ function (cfg_compile_options OPT CFG) add_compile_options ("$<$:${OPT}>") endfunction () +include (CheckCXXCompilerFlag) + set (CMAKE_CXX_STANDARD 17) set (CMAKE_INTERPROCEDURAL_OPTIMIZATION TRUE) @@ -9,33 +11,92 @@ if (CMAKE_CXX_COMPILER_ID STREQUAL "GNU" OR CMAKE_CXX_COMPILER_ID STREQUAL "Clang" OR CMAKE_CXX_COMPILER_ID STREQUAL "AppleClang") set (GCXX_LIKE TRUE) - message (">> GCXX-LIKE COMPILER DETECTED") + message (STATUS "GCXX-like compiler detected") +endif () + +if (CMAKE_CXX_COMPILER_ID STREQUAL "Intel") + set (ICPC_LIKE TRUE) + message (STATUS "ICPC-like compiler detected") endif () if (CMAKE_CXX_COMPILER_ID STREQUAL "MSVC") set (MSVC_LIKE TRUE) - message (">> MSVC-LIKE COMPILER DETECTED") + message (STATUS "MSVC-like compiler detected") +endif () + +if (DEFINED ICPC_LIKE) + add_compile_options (-pedantic -Wall -Wextra -Wshadow -Wfloat-conversion) + add_compile_options (-fp-model=precise) # needed for adapt-fp + add_compile_options (-fno-math-errno) # no errno checks + add_compile_options (-fno-trapping-math) # no fp exceptions + add_compile_options (-ffinite-math-only) # no explicit nans, etc endif () if (DEFINED MSVC_LIKE) add_compile_options (/W3) - cfg_compile_options (/GS- RELEASE) - cfg_compile_options (/Ot RELEASE) + add_compile_options (/openmp:llvm) # needed for openmp > 2.0 + add_compile_options (/fp:precise) # needed for adapt-fp + cfg_compile_options (/GS- RELEASE) # disable buffer checks + cfg_compile_options (/Ot RELEASE) # favour "fast" code endif () if (DEFINED GCXX_LIKE) - add_compile_options (-pedantic -Wall) + add_compile_options (-pedantic -Wall -Wextra -Wshadow -Wfloat-conversion) + add_compile_options (-fno-math-errno) # no errno checks + add_compile_options (-fno-trapping-math) # no fp exceptions + add_compile_options (-ffinite-math-only) # no explicit nans, etc endif () if (CMAKE_INSTALL_PREFIX_INITIALIZED_TO_DEFAULT) set (INSTALL_LOCAL TRUE) - message (">> INSTALLING LOCALLY") + message (STATUS "Installing locally") else () - message (">> INSTALLING TO ${CMAKE_INSTALL_PREFIX}") + message (STATUS "Installing to ${CMAKE_INSTALL_PREFIX}") endif () +# try to find netcdf support + +find_library (NETCDF_LIBRARY NAMES netcdf) + +if (NETCDF_LIBRARY) + message (STATUS "NetCDF library found") + message (STATUS "NetCDF inc. lib: ${NETCDF_LIBRARY}") +else () + message (STATUS "NetCDF library not found") +endif () + +# try to find openmp support + +find_package (OpenMP) + +if (OpenMP_CXX_FOUND AND (OpenMP_CXX_VERSION LESS 3)) + set (OpenMP_CXX_FOUND FALSE) + message (STATUS "Insufficient OpenMP support") +endif () + +if (OpenMP_CXX_FOUND) + message (STATUS "OpenMP library found") + message (STATUS "OpenMP inc. lib: ${OpenMP_CXX_LIB_NAMES}") +else () + message (STATUS "OpenMP library not found") +endif () + + add_executable (jigsaw-cmd jigsaw.cpp) -target_compile_definitions (jigsaw-cmd PRIVATE __cmd_jigsaw) +target_compile_definitions (jigsaw-cmd PRIVATE CMD_JIGSAW) + +if (NETCDF_LIBRARY) + target_compile_definitions (jigsaw-cmd PRIVATE USE_NETCDF) + target_link_libraries (jigsaw-cmd PRIVATE ${NETCDF_LIBRARY}) + set_target_properties (jigsaw-cmd PROPERTIES INSTALL_RPATH_USE_LINK_PATH TRUE) +endif () + +if (OpenMP_CXX_FOUND) + target_compile_definitions (jigsaw-cmd PRIVATE USE_OPENMP) + target_link_libraries (jigsaw-cmd PRIVATE OpenMP::OpenMP_CXX) + set_target_properties (jigsaw-cmd PROPERTIES INSTALL_RPATH_USE_LINK_PATH TRUE) +endif () + set_target_properties (jigsaw-cmd PROPERTIES OUTPUT_NAME jigsaw) if (DEFINED INSTALL_LOCAL) install (TARGETS jigsaw-cmd DESTINATION "${PROJECT_SOURCE_DIR}/bin") @@ -43,8 +104,22 @@ else () install (TARGETS jigsaw-cmd DESTINATION bin) endif () + add_executable (tripod-cmd jigsaw.cpp) -target_compile_definitions (tripod-cmd PRIVATE __cmd_tripod) +target_compile_definitions (tripod-cmd PRIVATE CMD_TRIPOD) + +if (NETCDF_LIBRARY) + target_compile_definitions (tripod-cmd PRIVATE USE_NETCDF) + target_link_libraries (tripod-cmd PRIVATE ${NETCDF_LIBRARY}) + set_target_properties (tripod-cmd PROPERTIES INSTALL_RPATH_USE_LINK_PATH TRUE) +endif () + +if (OpenMP_CXX_FOUND) + target_compile_definitions (tripod-cmd PRIVATE USE_OPENMP) + target_link_libraries (tripod-cmd PRIVATE OpenMP::OpenMP_CXX) + set_target_properties (tripod-cmd PROPERTIES INSTALL_RPATH_USE_LINK_PATH TRUE) +endif () + set_target_properties (tripod-cmd PROPERTIES OUTPUT_NAME tripod) if (DEFINED INSTALL_LOCAL) install (TARGETS tripod-cmd DESTINATION "${PROJECT_SOURCE_DIR}/bin") @@ -52,8 +127,22 @@ else () install (TARGETS tripod-cmd DESTINATION bin) endif () + add_executable (marche-cmd jigsaw.cpp) -target_compile_definitions (marche-cmd PRIVATE __cmd_marche) +target_compile_definitions (marche-cmd PRIVATE CMD_MARCHE) + +if (NETCDF_LIBRARY) + target_compile_definitions (marche-cmd PRIVATE USE_NETCDF) + target_link_libraries (marche-cmd PRIVATE ${NETCDF_LIBRARY}) + set_target_properties (marche-cmd PROPERTIES INSTALL_RPATH_USE_LINK_PATH TRUE) +endif () + +if (OpenMP_CXX_FOUND) + target_compile_definitions (marche-cmd PRIVATE USE_OPENMP) + target_link_libraries (marche-cmd PRIVATE OpenMP::OpenMP_CXX) + set_target_properties (marche-cmd PROPERTIES INSTALL_RPATH_USE_LINK_PATH TRUE) +endif () + set_target_properties (marche-cmd PROPERTIES OUTPUT_NAME marche) if (DEFINED INSTALL_LOCAL) install (TARGETS marche-cmd DESTINATION "${PROJECT_SOURCE_DIR}/bin") @@ -61,8 +150,22 @@ else () install (TARGETS marche-cmd DESTINATION bin) endif () + add_library (jigsaw-lib SHARED jigsaw.cpp) -target_compile_definitions (jigsaw-lib PRIVATE __lib_jigsaw) +target_compile_definitions (jigsaw-lib PRIVATE LIB_JIGSAW) + +if (NETCDF_LIBRARY) + target_compile_definitions (jigsaw-lib PRIVATE USE_NETCDF) + target_link_libraries (jigsaw-lib PRIVATE ${NETCDF_LIBRARY}) + set_target_properties (jigsaw-lib PROPERTIES INSTALL_RPATH_USE_LINK_PATH TRUE) +endif () + +if (OpenMP_CXX_FOUND) + target_compile_definitions (jigsaw-lib PRIVATE USE_OPENMP) + target_link_libraries (jigsaw-lib PRIVATE OpenMP::OpenMP_CXX) + set_target_properties (jigsaw-lib PROPERTIES INSTALL_RPATH_USE_LINK_PATH TRUE) +endif () + set_target_properties (jigsaw-lib PROPERTIES OUTPUT_NAME jigsaw) if (DEFINED INSTALL_LOCAL) install (TARGETS jigsaw-lib DESTINATION "${PROJECT_SOURCE_DIR}/lib") diff --git a/external/jigsaw/src/geo_load.hpp b/external/jigsaw/src/geo_load.hpp index 7dabc12..3adba32 100644 --- a/external/jigsaw/src/geo_load.hpp +++ b/external/jigsaw/src/geo_load.hpp @@ -22,12 +22,16 @@ * how they can obtain it for free, then you are not * required to make any arrangement with me.) * - * Disclaimer: Neither I nor: Columbia University, The - * Massachusetts Institute of Technology, The - * University of Sydney, nor The National Aeronautics - * and Space Administration warrant this code in any - * way whatsoever. This code is provided "as-is" to be - * used at your own risk. + * Disclaimer: Neither I nor THE CONTRIBUTORS warrant + * this code in any way whatsoever. This code is + * provided "as-is" to be used at your own risk. + * + * THE CONTRIBUTORS include: + * (a) The University of Sydney + * (b) The Massachusetts Institute of Technology + * (c) Columbia University + * (d) The National Aeronautics & Space Administration + * (e) Los Alamos National Laboratory * -------------------------------------------------------- * @@ -889,7 +893,6 @@ std::numeric_limits::min () ; iptr_type _nnPT = +0 ; - iptr_type _nnE2 = +0 ; iptr_type _nnT3 = +0 ; for (auto _iter = _geom. @@ -920,8 +923,6 @@ _imax = std::max( _imax, _iter->node(1)) ; - _nnE2 += +1 ; - if (_imin < +0 || _imax >= _nnPT) { @@ -1059,7 +1060,6 @@ std::numeric_limits::min () ; iptr_type _nnPT = +0 ; - iptr_type _nnE2 = +0 ; for (auto _iter = _geom. _ellipsoid_mesh_3d._mesh.node().head() ; @@ -1117,8 +1117,6 @@ _imax = std::max( _imax, _iter->node(1)) ; - _nnE2 += +1 ; - if (_imin < +0 || _imax >= _nnPT) { @@ -1183,7 +1181,7 @@ } _jlog.push( - " |COORD.| = " + " |COORD.| = " + std::to_string(_nnPT) + "\n"); for (auto _iter = _geom. @@ -1196,7 +1194,7 @@ } _jlog.push( - " |EDGE-2| = " + " |EDGE-2| = " + std::to_string(_nnE2) + "\n"); _jlog.push("\n") ; @@ -1213,15 +1211,15 @@ } _jlog.push( - " |SEEDS.| = " + " |SEEDS.| = " + std::to_string(_nnSD) + "\n"); _jlog.push("\n") ; _jlog.push(" |BOUND.| = " + std::to_string(_geom. - _euclidean_mesh_2d._ptag.count()) + - " (" + + _euclidean_mesh_2d._ptag.count()) + + " (" + std::to_string(_geom. _euclidean_mesh_2d._part.count()) + ") " + "\n") ; @@ -1254,7 +1252,7 @@ } _jlog.push( - " |COORD.| = " + " |COORD.| = " + std::to_string(_nnPT) + "\n"); for (auto _iter = _geom. @@ -1267,7 +1265,7 @@ } _jlog.push( - " |EDGE-2| = " + " |EDGE-2| = " + std::to_string(_nnE2) + "\n"); for (auto _iter = _geom. @@ -1280,7 +1278,7 @@ } _jlog.push( - " |TRIA-3| = " + " |TRIA-3| = " + std::to_string(_nnT3) + "\n"); _jlog.push("\n") ; @@ -1297,15 +1295,15 @@ } _jlog.push( - " |SEEDS.| = " + " |SEEDS.| = " + std::to_string(_nnSD) + "\n"); _jlog.push("\n") ; _jlog.push(" |BOUND.| = " + std::to_string(_geom. - _euclidean_mesh_3d._ptag.count()) + - " (" + + _euclidean_mesh_3d._ptag.count()) + + " (" + std::to_string(_geom. _euclidean_mesh_3d._part.count()) + ") " + "\n") ; @@ -1350,7 +1348,7 @@ } _jlog.push( - " |COORD.| = " + " |COORD.| = " + std::to_string(_nnPT) + "\n"); for (auto _iter = _geom. @@ -1363,7 +1361,7 @@ } _jlog.push( - " |EDGE-2| = " + " |EDGE-2| = " + std::to_string(_nnE2) + "\n"); _jlog.push("\n") ; @@ -1380,7 +1378,7 @@ } _jlog.push( - " |SEEDS.| = " + " |SEEDS.| = " + std::to_string(_nnSD) + "\n"); } diff --git a/external/jigsaw/src/hfn_init.hpp b/external/jigsaw/src/hfn_init.hpp index 5318a8d..c6cd93b 100644 --- a/external/jigsaw/src/hfn_init.hpp +++ b/external/jigsaw/src/hfn_init.hpp @@ -22,18 +22,22 @@ * how they can obtain it for free, then you are not * required to make any arrangement with me.) * - * Disclaimer: Neither I nor: Columbia University, The - * Massachusetts Institute of Technology, The - * University of Sydney, nor The National Aeronautics - * and Space Administration warrant this code in any - * way whatsoever. This code is provided "as-is" to be - * used at your own risk. + * Disclaimer: Neither I nor THE CONTRIBUTORS warrant + * this code in any way whatsoever. This code is + * provided "as-is" to be used at your own risk. + * + * THE CONTRIBUTORS include: + * (a) The University of Sydney + * (b) The Massachusetts Institute of Technology + * (c) Columbia University + * (d) The National Aeronautics & Space Administration + * (e) Los Alamos National Laboratory * -------------------------------------------------------- * - * Last updated: 20 Apr., 2021 + * Last updated: 06 Jun., 2022 * - * Copyright 2013-2021 + * Copyright 2013-2022 * Darren Engwirda * d.engwirda@gmail.com * https://github.com/dengwirda/ @@ -68,25 +72,22 @@ /*--------------------------------- find GEOM scaling */ real_type _scal = (real_type) +1. ; - - if (_jcfg._hfun_scal == - jcfg_data::hfun_scal::relative) - { + real_type _blen = (real_type) +0. ; if (_geom._ndim == +2 && _geom._kind == jmsh_kind::euclidean_mesh) { /*--------------------------------- euclidean-mesh-2d */ - _scal = (real_type) +0. ; - _scal += + _blen = (real_type) +0. ; + _blen += _geom._euclidean_mesh_2d._bmax[0] - _geom._euclidean_mesh_2d._bmin[0] ; - _scal += + _blen += _geom._euclidean_mesh_2d._bmax[1] - _geom._euclidean_mesh_2d._bmin[1] ; - _scal /= (real_type) +2. ; + _blen /= (real_type) +2. ; } else if (_geom._ndim == +3 && @@ -94,46 +95,63 @@ jmsh_kind::euclidean_mesh) { /*--------------------------------- euclidean-mesh-3d */ - _scal = (real_type) +0. ; - _scal += + _blen = (real_type) +0. ; + _blen += _geom._euclidean_mesh_3d._bmax[0] - _geom._euclidean_mesh_3d._bmin[0] ; - _scal += + _blen += _geom._euclidean_mesh_3d._bmax[1] - _geom._euclidean_mesh_3d._bmin[1] ; - _scal += + _blen += _geom._euclidean_mesh_3d._bmax[2] - _geom._euclidean_mesh_3d._bmin[2] ; - _scal /= (real_type) +3. ; + _blen /= (real_type) +3. ; } else if (_geom._kind == jmsh_kind::ellipsoid_mesh) { /*--------------------------------- ellipsoid-mesh-3d */ - _scal = (real_type) +0. ; - _scal += + _blen = (real_type) +0. ; + _blen += _geom._ellipsoid_mesh_3d._bmax[0] - _geom._ellipsoid_mesh_3d._bmin[0] ; - _scal += + _blen += _geom._ellipsoid_mesh_3d._bmax[1] - _geom._ellipsoid_mesh_3d._bmin[1] ; - _scal += + _blen += _geom._ellipsoid_mesh_3d._bmax[2] - _geom._ellipsoid_mesh_3d._bmin[2] ; - _scal /= (real_type) +3. ; + _blen /= (real_type) +3. ; } + /*--------------------------------- push GEOM scaling */ + real_type _hmin , _hmax; + if (_jcfg._hfun_scal == + jcfg_data::hfun_scal::relative) + { + _scal = _blen ; // swap to abs scale + _hmax = + std::min( +1.0 , _jcfg._hfun_hmax); + _hmin = + std::max( +0.0 , _jcfg._hfun_hmin); + } + else + { + _hmax = + std::min(_blen , _jcfg._hfun_hmax); + _hmin = + std::max( +0.0 , _jcfg._hfun_hmin); } - /*--------------------------------- push GEOM scaling */ if (_hfun._ndim == +0) { /*--------------------------------- constant-value-kd */ - _hfun._constant_value_kd. - _hval = _scal*_jcfg._hfun_hmax ; + _hfun. + _constant_value_kd._hval = _scal*_hmax ; + } else if (_hfun._ndim == +2) @@ -148,13 +166,12 @@ _euclidean_mesh_2d._hval.tend(); ++_iter ) { - *_iter*= (fp32_t) _scal; - - *_iter = std::min(*_iter, - (fp32_t) (_scal *_jcfg._hfun_hmax)); + *_iter*= (fp32_t) _scal ; - *_iter = std::max(*_iter, - (fp32_t) (_scal *_jcfg._hfun_hmin)); + *_iter = std::min( + *_iter, (fp32_t) (_scal * _hmax)) ; + *_iter = std::max( + *_iter, (fp32_t) (_scal * _hmin)) ; } } @@ -168,13 +185,12 @@ _euclidean_grid_2d._hmat.tend(); ++_iter ) { - *_iter*= (fp32_t) _scal; + *_iter*= (fp32_t) _scal ; - *_iter = std::min(*_iter, - (fp32_t) (_scal *_jcfg._hfun_hmax)); - - *_iter = std::max(*_iter, - (fp32_t) (_scal *_jcfg._hfun_hmin)); + *_iter = std::min( + *_iter, (fp32_t) (_scal * _hmax)) ; + *_iter = std::max( + *_iter, (fp32_t) (_scal * _hmin)) ; } } @@ -192,13 +208,12 @@ _euclidean_mesh_3d._hval.tend(); ++_iter ) { - *_iter*= (fp32_t) _scal; - - *_iter = std::min(*_iter, - (fp32_t) (_scal *_jcfg._hfun_hmax)); + *_iter*= (fp32_t) _scal ; - *_iter = std::max(*_iter, - (fp32_t) (_scal *_jcfg._hfun_hmin)); + *_iter = std::min( + *_iter, (fp32_t) (_scal * _hmax)) ; + *_iter = std::max( + *_iter, (fp32_t) (_scal * _hmin)) ; } } @@ -212,13 +227,12 @@ _euclidean_grid_3d._hmat.tend(); ++_iter ) { - *_iter*= (fp32_t) _scal; - - *_iter = std::min(*_iter, - (fp32_t) (_scal *_jcfg._hfun_hmax)); + *_iter*= (fp32_t) _scal ; - *_iter = std::max(*_iter, - (fp32_t) (_scal *_jcfg._hfun_hmin)); + *_iter = std::min( + *_iter, (fp32_t) (_scal * _hmax)) ; + *_iter = std::max( + *_iter, (fp32_t) (_scal * _hmin)) ; } } @@ -234,13 +248,12 @@ _ellipsoid_mesh_3d._hval.tend(); ++_iter ) { - *_iter*= (fp32_t) _scal; + *_iter*= (fp32_t) _scal ; - *_iter = std::min(*_iter, - (fp32_t) (_scal *_jcfg._hfun_hmax)); - - *_iter = std::max(*_iter, - (fp32_t) (_scal *_jcfg._hfun_hmin)); + *_iter = std::min( + *_iter, (fp32_t) (_scal * _hmax)) ; + *_iter = std::max( + *_iter, (fp32_t) (_scal * _hmin)) ; } } @@ -255,13 +268,12 @@ _ellipsoid_grid_3d._hmat.tend(); ++_iter ) { - *_iter*= (fp32_t) _scal; - - *_iter = std::min(*_iter, - (fp32_t) (_scal *_jcfg._hfun_hmax)); + *_iter*= (fp32_t) _scal ; - *_iter = std::max(*_iter, - (fp32_t) (_scal *_jcfg._hfun_hmin)); + *_iter = std::min( + *_iter, (fp32_t) (_scal * _hmax)) ; + *_iter = std::max( + *_iter, (fp32_t) (_scal * _hmin)) ; } } diff --git a/external/jigsaw/src/hfn_load.hpp b/external/jigsaw/src/hfn_load.hpp index 141fa81..78c543f 100644 --- a/external/jigsaw/src/hfn_load.hpp +++ b/external/jigsaw/src/hfn_load.hpp @@ -22,18 +22,22 @@ * how they can obtain it for free, then you are not * required to make any arrangement with me.) * - * Disclaimer: Neither I nor: Columbia University, The - * Massachusetts Institute of Technology, The - * University of Sydney, nor The National Aeronautics - * and Space Administration warrant this code in any - * way whatsoever. This code is provided "as-is" to be - * used at your own risk. + * Disclaimer: Neither I nor THE CONTRIBUTORS warrant + * this code in any way whatsoever. This code is + * provided "as-is" to be used at your own risk. + * + * THE CONTRIBUTORS include: + * (a) The University of Sydney + * (b) The Massachusetts Institute of Technology + * (c) Columbia University + * (d) The National Aeronautics & Space Administration + * (e) Los Alamos National Laboratory * -------------------------------------------------------- * - * Last updated: 07 Jul., 2021 + * Last updated: 28 Mar., 2022 * - * Copyright 2013-2021 + * Copyright 2013-2022 * Darren Engwirda * d.engwirda@gmail.com * https://github.com/dengwirda/ @@ -1114,7 +1118,8 @@ __normal_call iptr_type test_hfun ( jcfg_data &_jcfg , jlog_data &_jlog , - hfun_data &_hfun + hfun_data &_hfun , + bool_type _nneg = true // require non-negative ) { iptr_type _errv = __no_error ; @@ -1206,7 +1211,7 @@ _errv = __invalid_arraydim ; } - if (_hmin < (fp32_type) +0.) + if (_hmin < (fp32_type)+0. && _nneg) { _jlog.push ( "**input error: HFUN. values must be non-negative.\n") ; @@ -1214,7 +1219,7 @@ _errv = __invalid_argument ; } - if (_smin < (fp32_type) +0.) + if (_smin < (fp32_type)+0. && _nneg) { _jlog.push ( "**input error: DHDX. values must be non-negative.\n") ; @@ -1317,7 +1322,7 @@ _errv = __invalid_arraydim ; } - if (_hmin < (fp32_type) +0.) + if (_hmin < (fp32_type)+0. && _nneg) { _jlog.push ( "**input error: HFUN. values must be non-negative.\n") ; @@ -1325,7 +1330,7 @@ _errv = __invalid_argument ; } - if (_smin < (fp32_type) +0.) + if (_smin < (fp32_type)+0. && _nneg) { _jlog.push ( "**input error: DHDX. values must be non-negative.\n") ; @@ -1431,7 +1436,7 @@ _errv = __invalid_arraydim ; } - if (_hmin < (fp32_type) +0.) + if (_hmin < (fp32_type)+0. && _nneg) { _jlog.push ( "**input error: HFUN. values must be non-negative.\n") ; @@ -1439,7 +1444,7 @@ _errv = __invalid_argument ; } - if (_smin < (fp32_type) +0.) + if (_smin < (fp32_type)+0. && _nneg) { _jlog.push ( "**input error: DHDX. values must be non-negative.\n") ; @@ -1558,7 +1563,7 @@ _errv = __invalid_arraydim ; } - if (_hmin < (fp32_type) +0.) + if (_hmin < (fp32_type)+0. && _nneg) { _jlog.push ( "**input error: HFUN. values must be non-negative.\n") ; @@ -1566,7 +1571,7 @@ _errv = __invalid_argument ; } - if (_smin < (fp32_type) +0.) + if (_smin < (fp32_type)+0. && _nneg) { _jlog.push ( "**input error: DHDX. values must be non-negative.\n") ; @@ -1730,7 +1735,7 @@ _errv = __invalid_arraydim ; } - if (_hmin < (fp32_type) +0.) + if (_hmin < (fp32_type)+0. && _nneg) { _jlog.push ( "**input error: HFUN. values must be non-negative.\n") ; @@ -1738,7 +1743,7 @@ _errv = __invalid_argument ; } - if (_smin < (fp32_type) +0.) + if (_smin < (fp32_type)+0. && _nneg) { _jlog.push ( "**input error: DHDX. values must be non-negative.\n") ; @@ -1902,7 +1907,7 @@ _errv = __invalid_arraydim ; } - if (_hmin < (fp32_type) +0.) + if (_hmin < (fp32_type)+0. && _nneg) { _jlog.push ( "**input error: HFUN. values must be non-negative.\n") ; @@ -1910,7 +1915,7 @@ _errv = __invalid_argument ; } - if (_smin < (fp32_type) +0.) + if (_smin < (fp32_type)+0. && _nneg) { _jlog.push ( "**input error: DHDX. values must be non-negative.\n") ; @@ -1942,7 +1947,8 @@ __normal_call iptr_type echo_hfun ( jcfg_data &_jcfg , jlog_data &_jlog , - hfun_data &_hfun + hfun_data &_hfun , + bool_type _nneg = true // require non-negative ) { iptr_type _errv = __no_error ; @@ -1964,7 +1970,7 @@ " CONSTANT-VALUE\n\n") ; _jlog.push( - " .VAL(H). = " + + " .VAL(H). = " + to_string_prec ( _hfun._constant_value_kd._hval, 2) + "\n") ; } @@ -1984,6 +1990,7 @@ iptr_type _num1 = +0 ; iptr_type _num3 = +0 ; + iptr_type _nmsk = +0 ; for (auto _iter = _hfun. _euclidean_mesh_2d._hval.head() ; @@ -1991,10 +1998,22 @@ _euclidean_mesh_2d._hval.tend() ; ++_iter ) { + if (_nneg) + { _hmin = std::min( _hmin,*_iter) ; _hmax = std::max( _hmax,*_iter) ; + } + else + if (*_iter >= (fp32_type)+0.) + { + _hmin = std::min( + _hmin,*_iter) ; + _hmax = std::max( + _hmax,*_iter) ; + } + else _nmsk += +1 ; } _jlog.push( @@ -2004,6 +2023,11 @@ " .MAX(H). = " + to_string_prec(_hmax, 2) + "\n"); + _jlog.push(" \n") ; + _jlog.push( + " |MASKED| = " + + std::to_string (_nmsk) + "\n"); + _jlog.push(" \n") ; auto _mptr = @@ -2019,7 +2043,7 @@ } _jlog.push( - " |COORD.| = " + " |COORD.| = " + std::to_string(_num1) + "\n"); for (auto _iter = @@ -2032,7 +2056,7 @@ } _jlog.push( - " |TRIA-3| = " + " |TRIA-3| = " + std::to_string(_num3) + "\n"); } @@ -2050,16 +2074,30 @@ _jlog.push("\n") ; + iptr_type _nmsk = +0 ; + for (auto _iter = _hfun. _euclidean_grid_2d._hmat.head() ; _iter != _hfun. _euclidean_grid_2d._hmat.tend() ; ++_iter ) { - _hmin = - std::min(_hmin, *_iter) ; - _hmax = - std::max(_hmax, *_iter) ; + if (_nneg) + { + _hmin = std::min( + _hmin,*_iter) ; + _hmax = std::max( + _hmax,*_iter) ; + } + else + if (*_iter >= (fp32_type)+0.) + { + _hmin = std::min( + _hmin,*_iter) ; + _hmax = std::max( + _hmax,*_iter) ; + } + else _nmsk += +1 ; } _jlog.push( @@ -2069,6 +2107,11 @@ " .MAX(H). = " + to_string_prec(_hmax, 2) + "\n"); + _jlog.push(" \n") ; + _jlog.push( + " |MASKED| = " + + std::to_string (_nmsk) + "\n"); + _jlog.push(" \n") ; auto _xnum = _hfun. @@ -2078,10 +2121,10 @@ _euclidean_grid_2d._ypos.count(); _jlog.push( - " |XGRID.| = " + " |XGRID.| = " + std::to_string(_xnum) + "\n") ; _jlog.push( - " |YGRID.| = " + " |YGRID.| = " + std::to_string(_ynum) + "\n") ; } else @@ -2100,6 +2143,7 @@ iptr_type _num1 = +0 ; iptr_type _num4 = +0 ; + iptr_type _nmsk = +0 ; for (auto _iter = _hfun. _euclidean_mesh_3d._hval.head() ; @@ -2107,10 +2151,22 @@ _euclidean_mesh_3d._hval.tend() ; ++_iter ) { + if (_nneg) + { _hmin = std::min( _hmin,*_iter) ; _hmax = std::max( _hmax,*_iter) ; + } + else + if (*_iter >= (fp32_type)+0.) + { + _hmin = std::min( + _hmin,*_iter) ; + _hmax = std::max( + _hmax,*_iter) ; + } + else _nmsk += +1 ; } _jlog.push( @@ -2120,6 +2176,11 @@ " .MAX(H). = " + to_string_prec(_hmax, 2) + "\n"); + _jlog.push(" \n") ; + _jlog.push( + " |MASKED| = " + + std::to_string (_nmsk) + "\n"); + _jlog.push(" \n") ; auto _mptr = @@ -2135,7 +2196,7 @@ } _jlog.push( - " |COORD.| = " + " |COORD.| = " + std::to_string(_num1) + "\n"); for (auto _iter = @@ -2148,7 +2209,7 @@ } _jlog.push( - " |TRIA-4| = " + " |TRIA-4| = " + std::to_string(_num4) + "\n"); } @@ -2166,16 +2227,30 @@ _jlog.push("\n") ; + iptr_type _nmsk = +0 ; + for (auto _iter = _hfun. _euclidean_grid_3d._hmat.head() ; _iter != _hfun. _euclidean_grid_3d._hmat.tend() ; ++_iter ) { - _hmin = - std::min(_hmin, *_iter) ; - _hmax = - std::max(_hmax, *_iter) ; + if (_nneg) + { + _hmin = std::min( + _hmin,*_iter) ; + _hmax = std::max( + _hmax,*_iter) ; + } + else + if (*_iter >= (fp32_type)+0.) + { + _hmin = std::min( + _hmin,*_iter) ; + _hmax = std::max( + _hmax,*_iter) ; + } + else _nmsk += +1 ; } _jlog.push( @@ -2185,6 +2260,11 @@ " .MAX(H). = " + to_string_prec(_hmax, 2) + "\n"); + _jlog.push(" \n") ; + _jlog.push( + " |MASKED| = " + + std::to_string (_nmsk) + "\n"); + _jlog.push(" \n") ; auto _xnum = _hfun. @@ -2197,13 +2277,13 @@ _euclidean_grid_3d._zpos.count(); _jlog.push( - " |XGRID.| = " + " |XGRID.| = " + std::to_string(_xnum) + "\n") ; _jlog.push( - " |YGRID.| = " + " |YGRID.| = " + std::to_string(_ynum) + "\n") ; _jlog.push( - " |ZGRID.| = " + " |ZGRID.| = " + std::to_string(_znum) + "\n") ; } @@ -2220,6 +2300,7 @@ iptr_type _num1 = +0 ; iptr_type _num3 = +0 ; + iptr_type _nmsk = +0 ; for (auto _iter = _hfun. _ellipsoid_mesh_3d._hval.head() ; @@ -2227,10 +2308,22 @@ _ellipsoid_mesh_3d._hval.tend() ; ++_iter ) { + if (_nneg) + { + _hmin = std::min( + _hmin,*_iter) ; + _hmax = std::max( + _hmax,*_iter) ; + } + else + if (*_iter >= (fp32_type)+0.) + { _hmin = std::min( _hmin,*_iter) ; _hmax = std::max( _hmax,*_iter) ; + } + else _nmsk += +1 ; } _jlog.push( @@ -2240,6 +2333,11 @@ " .MAX(H). = " + to_string_prec(_hmax, 2) + "\n"); + _jlog.push(" \n") ; + _jlog.push( + " |MASKED| = " + + std::to_string (_nmsk) + "\n"); + _jlog.push(" \n") ; auto _mptr = @@ -2255,7 +2353,7 @@ } _jlog.push( - " |COORD.| = " + " |COORD.| = " + std::to_string(_num1) + "\n"); for (auto _iter = @@ -2268,7 +2366,7 @@ } _jlog.push( - " |TRIA-3| = " + " |TRIA-3| = " + std::to_string(_num3) + "\n"); } @@ -2283,16 +2381,30 @@ _jlog.push( " |NDIMS.| = " + std::to_string(2) + "\n"); + iptr_type _nmsk = +0 ; + for (auto _iter = _hfun. _ellipsoid_grid_3d._hmat.head() ; _iter != _hfun. _ellipsoid_grid_3d._hmat.tend() ; ++_iter ) { - _hmin = - std::min(_hmin, *_iter) ; - _hmax = - std::max(_hmax, *_iter) ; + if (_nneg) + { + _hmin = std::min( + _hmin,*_iter) ; + _hmax = std::max( + _hmax,*_iter) ; + } + else + if (*_iter >= (fp32_type)+0.) + { + _hmin = std::min( + _hmin,*_iter) ; + _hmax = std::max( + _hmax,*_iter) ; + } + else _nmsk += +1 ; } _jlog.push( @@ -2302,6 +2414,11 @@ " .MAX(H). = " + to_string_prec(_hmax, 2) + "\n"); + _jlog.push(" \n") ; + _jlog.push( + " |MASKED| = " + + std::to_string (_nmsk) + "\n"); + _jlog.push(" \n") ; auto _xnum = _hfun. @@ -2311,10 +2428,10 @@ _ellipsoid_grid_3d._ypos.count(); _jlog.push( - " |XGRID.| = " + " |XGRID.| = " + std::to_string(_xnum) + "\n") ; _jlog.push( - " |YGRID.| = " + " |YGRID.| = " + std::to_string(_ynum) + "\n") ; _jlog.push(" \n") ; diff --git a/external/jigsaw/src/hfn_save.inc b/external/jigsaw/src/hfn_save.inc new file mode 100644 index 0000000..678d7ed --- /dev/null +++ b/external/jigsaw/src/hfn_save.inc @@ -0,0 +1,1059 @@ + + /* + -------------------------------------------------------- + * MSH-SAVE: parse MESH data into *.MSH / MSH_t. + -------------------------------------------------------- + * + * This program may be freely redistributed under the + * condition that the copyright notices (including this + * entire header) are not removed, and no compensation + * is received through use of the software. Private, + * research, and institutional use is free. You may + * distribute modified versions of this code UNDER THE + * CONDITION THAT THIS CODE AND ANY MODIFICATIONS MADE + * TO IT IN THE SAME FILE REMAIN UNDER COPYRIGHT OF THE + * ORIGINAL AUTHOR, BOTH SOURCE AND OBJECT CODE ARE + * MADE FREELY AVAILABLE WITHOUT CHARGE, AND CLEAR + * NOTICE IS GIVEN OF THE MODIFICATIONS. Distribution + * of this code as part of a commercial system is + * permissible ONLY BY DIRECT ARRANGEMENT WITH THE + * AUTHOR. (If you are not directly supplying this + * code to a customer, and you are instead telling them + * how they can obtain it for free, then you are not + * required to make any arrangement with me.) + * + * Disclaimer: Neither I nor THE CONTRIBUTORS warrant + * this code in any way whatsoever. This code is + * provided "as-is" to be used at your own risk. + * + * THE CONTRIBUTORS include: + * (a) The University of Sydney + * (b) The Massachusetts Institute of Technology + * (c) Columbia University + * (d) The National Aeronautics & Space Administration + * (e) Los Alamos National Laboratory + * + -------------------------------------------------------- + * + * Last updated: 30 May, 2022 + * + * Copyright 2013-2022 + * Darren Engwirda + * d.engwirda@gmail.com + * https://github.com/dengwirda/ + * + -------------------------------------------------------- + */ + + // from msh_save.hpp + + + /* + -------------------------------------------------------- + * SAVE-HFUN: save *.MSH output file. + -------------------------------------------------------- + */ + + template < + typename file_type , + typename list_type + > + __normal_call void_type save_vals ( + file_type &_file, + typename + list_type::data_type const _xoff , + list_type &_list + ) + { + auto constexpr VALUEBLOCK = VALUECHUNK / 4 ; + + /*--------------------- save msh_t REALS data to file */ + auto _next = +0, _roll = +0 ; + char _fbuf[PRINTCHUNK] ; + + auto _this = _list.head () ; + + for (auto _iter = _this, + _last =(_list.tend() - 4); + _iter < _last; + _iter += +4 , _this += +4) + { + /*--------------------- (apparently) faster to unroll */ + PRINTCHARS(snprintf(&_fbuf[_next] , + PRINTCHUNK, + "%.9g\n%.9g\n%.9g\n%.9g\n" , + *(_iter + 0) + _xoff, + *(_iter + 1) + _xoff, + *(_iter + 2) + _xoff, + *(_iter + 3) + _xoff) , VALUEBLOCK) + } + + for (auto _iter = _this, + _last =(_list.tend() - 0); + _iter < _last; + _iter += +1 ) + { + /*--------------------- (apparently) faster to unroll */ + PRINTCHARS(snprintf(&_fbuf[_next] , + PRINTCHUNK, "%.9g\n", + *(_iter + 0) + _xoff) , VALUECHUNK) + } + + { + /*--------------------- ensure last buffer is written */ + PRINTFINAL ; + } + } + + #define save_vert2(_mesh) \ + _file << "POINT=" << _nnum << "\n" ; \ + \ + auto _next = +0, _roll = +0, \ + _npos = +0; \ + char _fbuf[PRINTCHUNK] ; \ + \ + for (auto _iter = _mesh.node().head() ; \ + _iter != _mesh.node().tend() ; \ + ++_iter, ++_npos) \ + { \ + if (_iter->mark() >= 0 ) \ + { \ + PRINTCHARS(snprintf(&_fbuf[_next] , \ + PRINTCHUNK, "%.17g;%.17g;+0\n", \ + _iter->pval(0) + _xoff[0] , \ + _iter->pval(1) + _xoff[1]), \ + VERT2CHUNK) \ + } \ + } \ + PRINTFINAL; \ + + + #define save_vert3(_mesh) \ + _file << "POINT=" << _nnum << "\n" ; \ + \ + auto _next = +0, _roll = +0, \ + _npos = +0; \ + char _fbuf[PRINTCHUNK] ; \ + \ + for (auto _iter = _mesh.node().head() ; \ + _iter != _mesh.node().tend() ; \ + ++_iter, ++_npos) \ + { \ + if (_iter->mark() >= 0 ) \ + { \ + PRINTCHARS(snprintf(&_fbuf[_next] , \ + PRINTCHUNK,"%.17g;%.17g;%.17g;+0\n", \ + _iter->pval(0) + _xoff[0] , \ + _iter->pval(1) + _xoff[1] , \ + _iter->pval(2) + _xoff[2]), \ + VERT3CHUNK) \ + } \ + } \ + PRINTFINAL; \ + + + #define save_vertS(_mesh) \ + _file << "POINT=" << _nnum << "\n" ; \ + \ + auto _next = +0, _roll = +0, \ + _npos = +0; \ + char _fbuf[PRINTCHUNK] ; \ + \ + for (auto _iter = _mesh.node().head() ; \ + _iter != _mesh.node().tend() ; \ + ++_iter, ++_npos) \ + { \ + if (_iter->mark() >= +0) \ + { \ + real_type _ppos[3], _apos[2] ; \ + _ppos[0] =_iter->pval(0); \ + _ppos[1] =_iter->pval(1); \ + _ppos[2] =_iter->pval(2); \ + \ + _ffun._ellipsoid_mesh_3d. \ + toS2( _ppos, _apos ); \ + \ + PRINTCHARS(snprintf(&_fbuf[_next] , \ + PRINTCHUNK ,"%.17g;%.17g;+0\n" , \ + _apos[ 0], _apos[ 1]) , VERT2CHUNK) \ + } \ + } \ + PRINTFINAL; \ + + + #define save_tria3(_mesh) \ + _file << "TRIA3=" << _tnum << "\n" ; \ + \ + auto _next = +0, _roll = +0; \ + char _fbuf[PRINTCHUNK] ; \ + \ + for (auto _iter = _mesh.tri3().head() ; \ + _iter != _mesh.tri3().tend() ; \ + ++_iter ) \ + { \ + if (_iter->mark() >= 0 && \ + _iter->self() >= 1 ) \ + { \ + PRINTCHARS(snprintf(&_fbuf[_next] , \ + PRINTCHUNK, "%u;%u;%u;+0\n" , \ + _iter->node(0) , \ + _iter->node(1) , \ + _iter->node(2) ), TRIA3CHUNK) \ + } \ + } \ + PRINTFINAL; \ + + + #define save_tria4(_mesh) \ + _file << "TRIA4=" << _tnum << "\n" ; \ + \ + auto _next = +0, _roll = +0; \ + char _fbuf[PRINTCHUNK] ; \ + \ + for (auto _iter = _mesh.tri4().head() ; \ + _iter != _mesh.tri4().tend() ; \ + ++_iter ) \ + { \ + if (_iter->mark() >= 0 && \ + _iter->self() >= 1 ) \ + { \ + PRINTCHARS(snprintf(&_fbuf[_next] , \ + PRINTCHUNK, "%u;%u;%u;%u;+0\n" , \ + _iter->node(0) , \ + _iter->node(1) , \ + _iter->node(2) , \ + _iter->node(3) ), TRIA4CHUNK) \ + } \ + } \ + PRINTFINAL; \ + + + template < + typename jlog_data + > + __normal_call iptr_type save_hfun ( + jcfg_data &_jcfg , + jlog_data &_jlog , + float *_xoff , + hfun_data &_ffun , + mshfile_tag const& + ) + { + iptr_type _errv = __no_error ; + + // NB. this routine handles output for MARCHE --- this + // will *overwrite* the hfun-file input... + + __unreferenced(_jlog) ; + + try + { + std::string _path, _name, _fext; + file_part( + _jcfg._hfun_file, _path, _name, _fext) ; + + std::ofstream _file; + _file.open( + _jcfg._hfun_file, + std::ofstream::out | std::ofstream::trunc) ; + + if (_file.is_open()) + { + if (_ffun._ndim == +2 && + _ffun._kind == + jmsh_kind::euclidean_mesh) + { + /*-------------------------- save 2-dim. mesh */ + _file << "# " << _name << ".msh" + << "; created by " ; + _file << __JGSWVSTR "\n" ; + _file << "MSHID=3;EUCLIDEAN-MESH \n" ; + _file << "NDIMS=2 \n" ; + + /*-------------------------- count mesh items */ + iptr_type _nnum = +0 ; + iptr_type _tnum = +0 ; + + for (auto _iter = _ffun. + _euclidean_mesh_2d._mesh.node().head() ; + _iter != _ffun. + _euclidean_mesh_2d._mesh.node().tend() ; + ++_iter ) + { + if (_iter->mark() >= +0 && + _iter->self() >= +1 ) + _nnum += +1 ; + } + + for (auto _iter = _ffun. + _euclidean_mesh_2d._mesh.tri3().head() ; + _iter != _ffun. + _euclidean_mesh_2d._mesh.tri3().tend() ; + ++_iter ) + { + if (_iter->mark() >= +0 && + _iter->self() >= +1 ) + _tnum += +1 ; + } + + if (_nnum > +0) + { + /*-------------------------- write POINT data */ + save_vert2( + _ffun._euclidean_mesh_2d._mesh); + } + + if (_nnum > +0) + { + /*-------------------------- write VALUE data */ + _file << "VALUE=" + << _nnum << ";1" << "\n" ; + + save_vals(_file, +0.f, + _ffun._euclidean_mesh_2d._hval); + } + + if (_tnum > +0) + { + /*-------------------------- write TRIA3 data */ + save_tria3( + _ffun._euclidean_mesh_2d._mesh); + } + + } + else + if (_ffun._ndim == +3 && + _ffun._kind == + jmsh_kind::euclidean_mesh) + { + /*-------------------------- save 3-dim. mesh */ + _file << "# " << _name << ".msh" + << "; created by " ; + _file << __JGSWVSTR "\n" ; + _file << "MSHID=3;EUCLIDEAN-MESH \n" ; + _file << "NDIMS=3 \n" ; + + /*-------------------------- count mesh items */ + iptr_type _nnum = +0 ; + iptr_type _tnum = +0 ; + + for (auto _iter = _ffun. + _euclidean_mesh_3d._mesh.node().head() ; + _iter != _ffun. + _euclidean_mesh_3d._mesh.node().tend() ; + ++_iter ) + { + if (_iter->mark() >= +0 && + _iter->self() >= +1 ) + _nnum += +1 ; + } + + for (auto _iter = _ffun. + _euclidean_mesh_3d._mesh.tri4().head() ; + _iter != _ffun. + _euclidean_mesh_3d._mesh.tri4().tend() ; + ++_iter ) + { + if (_iter->mark() >= +0 && + _iter->self() >= +1 ) + _tnum += +1 ; + } + + if (_nnum > +0) + { + /*-------------------------- write POINT data */ + save_vert2( + _ffun._euclidean_mesh_3d._mesh); + } + + if (_nnum > +0) + { + /*-------------------------- write VALUE data */ + _file << "VALUE=" + << _nnum << ";1" << "\n" ; + + save_vals(_file, +0.f, + _ffun._euclidean_mesh_3d._hval); + } + + if (_tnum > +0) + { + /*-------------------------- write TRIA4 data */ + save_tria4( + _ffun._euclidean_mesh_3d._mesh); + } + + } + else + if (_ffun._ndim == +2 && + _ffun._kind == + jmsh_kind::ellipsoid_mesh) + { + /*-------------------------- save 3-dim. mesh */ + _file << "# " << _name << ".msh" + << "; created by " ; + _file << __JGSWVSTR "\n" ; + _file << "MSHID=3;ELLIPSOID-MESH \n" ; + _file << "NDIMS=2 \n" ; + + /*-------------------------- write class data */ + { + char _fbuf [PRINTCHUNK] ; + auto _char = snprintf(&_fbuf[ 0 ] , + PRINTCHUNK, + "%.17g;%.17g;%.17g\n", + _ffun._ellipsoid_mesh_3d._radA , + _ffun._ellipsoid_mesh_3d._radB , + _ffun._ellipsoid_mesh_3d._radC) ; + + _file << "RADII=" + << std::string(_fbuf, _char) ; + } + + /*-------------------------- count mesh items */ + iptr_type _nnum = +0 ; + iptr_type _tnum = +0 ; + + for (auto _iter = _ffun. + _ellipsoid_mesh_3d._mesh.node().head() ; + _iter != _ffun. + _ellipsoid_mesh_3d._mesh.node().tend() ; + ++_iter ) + { + if (_iter->mark() >= +0 && + _iter->self() >= +1 ) + _nnum += +1 ; + } + + for (auto _iter = _ffun. + _ellipsoid_mesh_3d._mesh.tri3().head() ; + _iter != _ffun. + _ellipsoid_mesh_3d._mesh.tri3().tend() ; + ++_iter ) + { + if (_iter->mark() >= +0 && + _iter->self() >= +1 ) + _tnum += +1 ; + } + + if (_nnum > +0) + { + /*-------------------------- write POINT data */ + save_vertS( + _ffun._ellipsoid_mesh_3d._mesh); + } + + if (_nnum > +0) + { + /*-------------------------- write VALUE data */ + _file << "VALUE=" + << _nnum << ";1" << "\n" ; + + save_vals(_file, +0.f, + _ffun._ellipsoid_mesh_3d._hval); + } + + if (_tnum > +0) + { + /*-------------------------- write TRIA3 data */ + save_tria3( + _ffun._ellipsoid_mesh_3d._mesh); + } + + } + else + if (_ffun._ndim == +2 && + _ffun._kind == + jmsh_kind::euclidean_grid) + { + /*-------------------------- save 2-dim. grid */ + _file << "# " << _name << ".msh" + << "; created by " ; + _file << __JGSWVSTR "\n" ; + _file << "MSHID=3;EUCLIDEAN-GRID \n" ; + _file << "NDIMS=2 \n" ; + + /*-------------------------- write class data */ + + if (_ffun._euclidean_grid_2d. + _xpos.count() > +0) + { + /*-------------------------- write COORD data */ + _file << "COORD=1;" << + _ffun._euclidean_grid_2d. + _xpos.count() << "\n" ; + + save_vals(_file, _xoff[0], + _ffun._euclidean_grid_2d._xpos); + } + + if (_ffun._euclidean_grid_2d. + _ypos.count() > +0) + { + /*-------------------------- write COORD data */ + _file << "COORD=2;" << + _ffun._euclidean_grid_2d. + _ypos.count() << "\n" ; + + save_vals(_file, _xoff[1], + _ffun._euclidean_grid_2d._ypos); + } + + if (_ffun._euclidean_grid_2d. + _hmat.count() > +0) + { + /*-------------------------- write VALUE data */ + _file << "VALUE=" << + _ffun._euclidean_grid_2d. + _hmat.count() << ";1" "\n" ; + + save_vals(_file, +0.f , + _ffun._euclidean_grid_2d._hmat); + } + + } + else + if (_ffun._ndim == +3 && + _ffun._kind == + jmsh_kind::euclidean_grid) + { + /*-------------------------- save 3-dim. grid */ + _file << "# " << _name << ".msh" + << "; created by " ; + _file << __JGSWVSTR "\n" ; + _file << "MSHID=3;EUCLIDEAN-GRID \n" ; + _file << "NDIMS=3 \n" ; + + /*-------------------------- write class data */ + + if (_ffun._euclidean_grid_3d. + _xpos.count() > +0) + { + /*-------------------------- write COORD data */ + _file << "COORD=1;" << + _ffun._euclidean_grid_3d. + _xpos.count() << "\n" ; + + save_vals(_file, _xoff[0], + _ffun._euclidean_grid_3d._xpos); + } + + if (_ffun._euclidean_grid_3d. + _ypos.count() > +0) + { + /*-------------------------- write COORD data */ + _file << "COORD=2;" << + _ffun._euclidean_grid_3d. + _ypos.count() << "\n" ; + + save_vals(_file, _xoff[1], + _ffun._euclidean_grid_3d._ypos); + } + + if (_ffun._euclidean_grid_3d. + _zpos.count() > +0) + { + /*-------------------------- write COORD data */ + _file << "COORD=3;" << + _ffun._euclidean_grid_3d. + _zpos.count() << "\n" ; + + save_vals(_file, _xoff[2], + _ffun._euclidean_grid_3d._zpos); + } + + if (_ffun._euclidean_grid_3d. + _hmat.count() > +0) + { + /*-------------------------- write VALUE data */ + _file << "VALUE=" << + _ffun._euclidean_grid_3d. + _hmat.count() << ";1" "\n" ; + + save_vals(_file, +0.f , + _ffun._euclidean_grid_3d._hmat); + } + + } + else + if (_ffun._ndim == +2 && + _ffun._kind == + jmsh_kind::ellipsoid_grid) + { + /*-------------------------- save 2-dim. grid */ + _file << "# " << _name << ".msh" + << "; created by " ; + _file << __JGSWVSTR "\n" ; + _file << "MSHID=3;ELLIPSOID-GRID \n" ; + _file << "NDIMS=2 \n" ; + + /*-------------------------- write class data */ + { + char _fbuf [PRINTCHUNK] ; + auto _char = snprintf(&_fbuf[ 0 ] , + PRINTCHUNK, + "%.17g;%.17g;%.17g\n", + _ffun._ellipsoid_grid_3d._radA , + _ffun._ellipsoid_grid_3d._radB , + _ffun._ellipsoid_grid_3d._radC) ; + + _file << "RADII=" + << std::string(_fbuf, _char) ; + } + + if (_ffun._ellipsoid_grid_3d. + _xpos.count() > +0) + { + /*-------------------------- write COORD data */ + _file << "COORD=1;" << + _ffun._ellipsoid_grid_3d. + _xpos.count() << "\n" ; + + save_vals(_file, +0.0, + _ffun._ellipsoid_grid_3d._xpos); + } + + if (_ffun._ellipsoid_grid_3d. + _ypos.count() > +0) + { + /*-------------------------- write COORD data */ + _file << "COORD=2;" << + _ffun._ellipsoid_grid_3d. + _ypos.count() << "\n" ; + + save_vals(_file, +0.0, + _ffun._ellipsoid_grid_3d._ypos); + } + + if (_ffun._ellipsoid_grid_3d. + _hmat.count() > +0) + { + /*-------------------------- write VALUE data */ + _file << "VALUE=" << + _ffun._ellipsoid_grid_3d. + _hmat.count() << ";1" "\n" ; + + save_vals(_file, +0.f , + _ffun._ellipsoid_grid_3d._hmat); + } + + } + + } + else + { + _errv = __file_not_created ; + } + + _file.close(); + + } + catch (...) + { + _errv = __unknown_error ; + } + + return ( _errv ) ; + } + + #undef save_vert2 + #undef save_vert3 + #undef save_vertS + #undef save_tria3 + #undef save_tria4 + + /* + -------------------------------------------------------- + * SAVE-MESH: save *.NC output file. + -------------------------------------------------------- + */ + + #ifdef __use_netcdf + + template < + typename jlog_data + > + __normal_call iptr_type save_hfun ( + jcfg_data &_jcfg , + jlog_data &_jlog , + float* /*_xoff*/ , + hfun_data &_ffun , + _netcdf_tag const& + ) + { + iptr_type _errv = __no_error ; + + // NB. this routine handles output for MARCHE --- only + // *overwriting* the "value" arrays in *.NC - all else + // is passed read-only... + + try + { + std::string _path, _name, _fext; + file_part( + _jcfg._hfun_file, _path, _name, _fext) ; + + int _retv, _ncid; + if ((_retv = nc_create( + _jcfg._hfun_file.c_str(), + NC_CLOBBER|NC_NETCDF4, &_ncid))) + { + return __file_not_created; + } + + __unreferenced (_jcfg) ; + __unreferenced (_jlog) ; + + if (_ffun._ndim == +2 && // save 2-dim. mesh + _ffun._kind == + jmsh_kind::euclidean_mesh) + { + ncutil::put_str(_jcfg._hfun_file, + "TITLE" , + _name + "; created by " + __JGSWVSTR); + + if (_ffun._euclidean_mesh_2d. + _hval.count() > +0) + { + /*-------------------------- write VALUE data */ + ncutil::put_var( + _jcfg._hfun_file, "value_mat", + &_ffun._euclidean_mesh_2d._hval [0]) ; + } + + } + else + if (_ffun._ndim == +3 && // save 3-dim. mesh + _ffun._kind == + jmsh_kind::euclidean_mesh) + { + ncutil::put_str(_jcfg._hfun_file, + "TITLE" , + _name + "; created by " + __JGSWVSTR); + + if (_ffun._euclidean_mesh_3d. + _hval.count() > +0) + { + /*-------------------------- write VALUE data */ + ncutil::put_var( + _jcfg._hfun_file, "value_mat", + &_ffun._euclidean_mesh_3d._hval [0]) ; + } + + } + else + if (_ffun._ndim == +2 && // save 2-sph. mesh + _ffun._kind == + jmsh_kind::ellipsoid_mesh) + { + ncutil::put_str(_jcfg._hfun_file, + "TITLE" , + _name + "; created by " + __JGSWVSTR); + + if (_ffun._ellipsoid_mesh_3d. + _hval.count() > +0) + { + /*-------------------------- write VALUE data */ + ncutil::put_var( + _jcfg._hfun_file, "value_mat", + &_ffun._ellipsoid_mesh_3d._hval [0]) ; + } + + } + else + if (_ffun._ndim == +2 && // save 2-dim. grid + _ffun._kind == + jmsh_kind::euclidean_grid) + { + ncutil::put_str(_jcfg._hfun_file, + "TITLE" , + _name + "; created by " + __JGSWVSTR); + + if (_ffun._euclidean_grid_2d. + _hmat.count() > +0) + { + /*-------------------------- write VALUE data */ + ncutil::put_var( + _jcfg._hfun_file, "value_mat", + &_ffun._euclidean_grid_2d._hmat [0]) ; + } + + } + else + if (_ffun._ndim == +3 && // save 3-dim. grid + _ffun._kind == + jmsh_kind::euclidean_grid) + { + ncutil::put_str(_jcfg._hfun_file, + "TITLE" , + _name + "; created by " + __JGSWVSTR); + + if (_ffun._euclidean_grid_3d. + _hmat.count() > +0) + { + /*-------------------------- write VALUE data */ + ncutil::put_var( + _jcfg._hfun_file, "value_mat", + &_ffun._euclidean_grid_3d._hmat [0]) ; + } + + } + else + if (_ffun._ndim == +2 && // save 2-sph. grid + _ffun._kind == + jmsh_kind::ellipsoid_grid) + { + ncutil::put_str(_jcfg._hfun_file, + "TITLE" , + _name + "; created by " + __JGSWVSTR); + + if (_ffun._ellipsoid_grid_3d. + _hmat.count() > +0) + { + /*-------------------------- write VALUE data */ + ncutil::put_var( + _jcfg._hfun_file, "value_mat", + &_ffun._ellipsoid_grid_3d._hmat [0]) ; + } + + } + + } + catch (...) + { + _errv = __unknown_error ; + } + + return ( _errv ) ; + } + + #endif //__use_netcdf + + /* + -------------------------------------------------------- + * SAVE-MESH: save MSH_t output data. + -------------------------------------------------------- + */ + + template < + typename _dst_list , + typename _src_list + > + __inline_call void_type copy_vals ( + _dst_list &_ldst, + _src_list &_lsrc + ) + { + /*--------------------- copy msh_t REALS data to data */ + std::memcpy(&_ldst._data[0] , + &_lsrc[0], _ldst._size * sizeof(fp32_type)) ; + } + + template < + typename jlog_data + > + __normal_call iptr_type save_hfun ( + jcfg_data &_jcfg , + jlog_data &_jlog , + float* /*_xoff*/ , + hfun_data &_ffun , + jigsaw_msh_t &_fmsh + ) + { + iptr_type _errv = __no_error ; + + // NB. this routine handles output for MARCHE --- only + // *overwriting* the "value" arrays in FMSH - all else + // is passed read-only... + + try + { + __unreferenced (_jcfg) ; + __unreferenced (_jlog) ; + + if (_ffun._ndim == +2 && // save 2-dim. mesh + _ffun._kind == + jmsh_kind::euclidean_mesh) + { + _fmsh._flags = JIGSAW_EUCLIDEAN_MESH ; + + if (_ffun._euclidean_mesh_2d. + _hval.count() > +0) + { + /*-------------------------- write VALUE data */ + __assert( _fmsh._value._size == + _ffun._euclidean_mesh_2d. + _hval.count() && + "savemsh: inconsistent VALUE array") ; + + copy_vals(_fmsh._value, + _ffun._euclidean_mesh_2d._hval ) ; + } + + } + else + if (_ffun._ndim == +3 && // save 3-dim. mesh + _ffun._kind == + jmsh_kind::euclidean_mesh) + { + _fmsh._flags = JIGSAW_EUCLIDEAN_MESH ; + + if (_ffun._euclidean_mesh_3d. + _hval.count() > +0) + { + /*-------------------------- write VALUE data */ + __assert( _fmsh._value._size == + _ffun._euclidean_mesh_3d. + _hval.count() && + "savemsh: inconsistent VALUE array") ; + + copy_vals(_fmsh._value, + _ffun._euclidean_mesh_3d._hval ) ; + } + + } + else + if (_ffun._ndim == +2 && // save 2-sph. mesh + _ffun._kind == + jmsh_kind::ellipsoid_mesh) + { + _fmsh._flags = JIGSAW_ELLIPSOID_MESH ; + + if (_ffun._ellipsoid_mesh_3d. + _hval.count() > +0) + { + /*-------------------------- write VALUE data */ + __assert( _fmsh._value._size == + _ffun._ellipsoid_mesh_3d. + _hval.count() && + "savemsh: inconsistent VALUE array") ; + + copy_vals(_fmsh._value, + _ffun._ellipsoid_mesh_3d._hval ) ; + } + + } + else + if (_ffun._ndim == +2 && // save 2-dim. grid + _ffun._kind == + jmsh_kind::euclidean_grid) + { + _fmsh._flags = JIGSAW_EUCLIDEAN_GRID ; + + if (_ffun._euclidean_grid_2d. + _hmat.count() > +0) + { + /*-------------------------- write VALUE data */ + __assert( _fmsh._value._size == + _ffun._euclidean_grid_2d. + _hmat.count() && + "savemsh: inconsistent VALUE array") ; + + copy_vals(_fmsh._value, + _ffun._euclidean_grid_2d._hmat ) ; + } + + } + else + if (_ffun._ndim == +3 && // save 3-dim. grid + _ffun._kind == + jmsh_kind::euclidean_grid) + { + _fmsh._flags = JIGSAW_EUCLIDEAN_GRID ; + + if (_ffun._euclidean_grid_3d. + _hmat.count() > +0) + { + /*-------------------------- write VALUE data */ + __assert( _fmsh._value._size == + _ffun._euclidean_grid_3d. + _hmat.count() && + "savemsh: inconsistent VALUE array") ; + + copy_vals(_fmsh._value, + _ffun._euclidean_grid_3d._hmat ) ; + } + + } + else + if (_ffun._ndim == +2 && // save 2-sph. grid + _ffun._kind == + jmsh_kind::ellipsoid_grid) + { + _fmsh._flags = JIGSAW_ELLIPSOID_GRID ; + + if (_ffun._ellipsoid_grid_3d. + _hmat.count() > +0) + { + /*-------------------------- write VALUE data */ + __assert( _fmsh._value._size == + _ffun._ellipsoid_grid_3d. + _hmat.count() && + "savemsh: inconsistent VALUE array") ; + + copy_vals(_fmsh._value, + _ffun._ellipsoid_grid_3d._hmat ) ; + } + + } + + } + catch (...) + { + _errv = __unknown_error ; + } + + return ( _errv ) ; + } + + /* + -------------------------------------------------------- + * SAVE-MESH: save to *.MSH or *.NC + -------------------------------------------------------- + */ + + template < + typename jlog_data + > + __normal_call iptr_type save_hfun ( + jcfg_data &_jcfg , + jlog_data &_jlog , + float *_xoff , + hfun_data &_ffun + ) + { + iptr_type _errv = __no_error ; + + try + { + /*------------------------- disambiguate via file-ext */ + std::string _path, _name, _fext; + file_part( + _jcfg._hfun_file, _path, _name, _fext) ; + + if(_fext.find("msh") != std::string::npos) + { + return save_hfun(_jcfg, _jlog, + _xoff, _ffun, mshfile_tag()) ; + } + else + if(_fext.find( "nc") != std::string::npos) + { + # ifdef __use_netcdf + return save_hfun(_jcfg, _jlog, + _xoff, _ffun, _netcdf_tag()) ; + # else + return __netcdf_not_available; + # endif + } + } + catch (...) + { + _errv = __unknown_error ; // can't get here?? + } + + return ( _errv ) ; + } + + + diff --git a/external/jigsaw/src/ini_load.hpp b/external/jigsaw/src/ini_load.hpp index 27247a2..0cb3f2b 100644 --- a/external/jigsaw/src/ini_load.hpp +++ b/external/jigsaw/src/ini_load.hpp @@ -22,12 +22,16 @@ * how they can obtain it for free, then you are not * required to make any arrangement with me.) * - * Disclaimer: Neither I nor: Columbia University, The - * Massachusetts Institute of Technology, The - * University of Sydney, nor The National Aeronautics - * and Space Administration warrant this code in any - * way whatsoever. This code is provided "as-is" to be - * used at your own risk. + * Disclaimer: Neither I nor THE CONTRIBUTORS warrant + * this code in any way whatsoever. This code is + * provided "as-is" to be used at your own risk. + * + * THE CONTRIBUTORS include: + * (a) The University of Sydney + * (b) The Massachusetts Institute of Technology + * (c) Columbia University + * (d) The National Aeronautics & Space Administration + * (e) Los Alamos National Laboratory * -------------------------------------------------------- * @@ -1204,7 +1208,7 @@ } _jlog.push( - " |COORD.| = " + " |COORD.| = " + std::to_string(_nnN1) + "\n"); for (auto _iter = _init. @@ -1217,7 +1221,7 @@ } _jlog.push( - " |EDGE-2| = " + " |EDGE-2| = " + std::to_string(_nnE2) + "\n"); for (auto _iter = _init. @@ -1230,7 +1234,7 @@ } _jlog.push( - " |TRIA-3| = " + " |TRIA-3| = " + std::to_string(_nnT3) + "\n"); for (auto _iter = _init. @@ -1243,7 +1247,7 @@ } _jlog.push( - " |QUAD-4| = " + " |QUAD-4| = " + std::to_string(_nnQ4) + "\n"); } else @@ -1275,7 +1279,7 @@ } _jlog.push( - " |COORD.| = " + " |COORD.| = " + std::to_string(_nnN1) + "\n"); for (auto _iter = _init. @@ -1288,7 +1292,7 @@ } _jlog.push( - " |EDGE-2| = " + " |EDGE-2| = " + std::to_string(_nnE2) + "\n"); for (auto _iter = _init. @@ -1301,7 +1305,7 @@ } _jlog.push( - " |TRIA-3| = " + " |TRIA-3| = " + std::to_string(_nnT3) + "\n"); for (auto _iter = _init. @@ -1314,7 +1318,7 @@ } _jlog.push( - " |QUAD-4| = " + " |QUAD-4| = " + std::to_string(_nnQ4) + "\n"); for (auto _iter = _init. @@ -1327,7 +1331,7 @@ } _jlog.push( - " |TRIA-4| = " + " |TRIA-4| = " + std::to_string(_nnT4) + "\n"); } diff --git a/external/jigsaw/src/jig_load.hpp b/external/jigsaw/src/jig_load.hpp index 5175532..bd63937 100644 --- a/external/jigsaw/src/jig_load.hpp +++ b/external/jigsaw/src/jig_load.hpp @@ -22,18 +22,22 @@ * how they can obtain it for free, then you are not * required to make any arrangement with me.) * - * Disclaimer: Neither I nor: Columbia University, The - * Massachusetts Institute of Technology, The - * University of Sydney, nor The National Aeronautics - * and Space Administration warrant this code in any - * way whatsoever. This code is provided "as-is" to be - * used at your own risk. + * Disclaimer: Neither I nor THE CONTRIBUTORS warrant + * this code in any way whatsoever. This code is + * provided "as-is" to be used at your own risk. + * + * THE CONTRIBUTORS include: + * (a) The University of Sydney + * (b) The Massachusetts Institute of Technology + * (c) Columbia University + * (d) The National Aeronautics & Space Administration + * (e) Los Alamos National Laboratory * -------------------------------------------------------- * - * Last updated: 07 Jul., 2021 + * Last updated: 12 Dec., 2022 * - * Copyright 2013-2021 + * Copyright 2013-2022 * Darren Engwirda * d.engwirda@gmail.com * https://github.com/dengwirda/ @@ -85,6 +89,23 @@ this->_jjig-> _iter_opts.verb() = _verb; } + __normal_call void_type push_numthread ( + std::int32_t _nprt + ) + { + if (_nprt <= 0 ) + # ifdef __use_openmp + _nprt = omp_get_num_procs() ; + # else + _nprt = +1 ; + # endif//__use_openmp + + this->_jjig->_numthread = _nprt ; + this->_jjig-> + _mesh_opts.nprt() = _nprt; + this->_jjig-> + _iter_opts.nprt() = _nprt; + } /*------------------------------------- GEOM keywords */ __normal_call void_type push_geom_file ( @@ -355,6 +376,14 @@ (jcfg_data::iter_pred::enum_data)_kern ; } + __normal_call void_type push_optm_cost ( + std::int32_t _cost + ) + { + this->_jjig->_iter_cost = + (jcfg_data::iter_cost::enum_data)_cost ; + } + __normal_call void_type push_optm_iter ( std::int32_t _iter ) @@ -362,6 +391,20 @@ this->_jjig-> _iter_opts.iter() = _iter; } + __normal_call void_type push_optm_beta ( + double _beta + ) + { + this->_jjig-> + _iter_opts.beta() = _beta; + } + __normal_call void_type push_optm_zeta ( + double _zeta + ) + { + this->_jjig-> + _iter_opts.zeta() = _zeta; + } __normal_call void_type push_optm_qtol ( double _qtol ) @@ -463,7 +506,7 @@ __normal_call iptr_type copy_jcfg ( jcfg_data &_jcfg , jlog_data &_jlog , - jigsaw_jig_t const&_jjig + jigsaw_jig_t &_jjig ) { iptr_type _errv = __no_error ; @@ -480,6 +523,21 @@ _jcfg._iter_opts. verb() = _jjig._verbosity ; + if (_jjig._numthread <= 0 ) + # ifdef __use_openmp + _jjig._numthread = + omp_get_num_procs(); + # else + _jjig._numthread = +1 ; + # endif//__use_openmp + + _jcfg._numthread = + _jjig._numthread ; + _jcfg._mesh_opts. + nprt() = _jjig._numthread ; + _jcfg._iter_opts. + nprt() = _jjig._numthread ; + /*------------------------------------- BNDS keywords */ if (_jjig._bnds_kern == JIGSAW_BNDS_TRIACELL) @@ -599,9 +657,26 @@ else _errv = __invalid_useropts ; + if (_jjig._optm_cost == + JIGSAW_KERN_AREA_LEN) + _jcfg._iter_cost = + jcfg_data::iter_cost::area_len ; + else + if (_jjig._optm_cost == + JIGSAW_KERN_SKEW_COS) + _jcfg._iter_cost = + jcfg_data::iter_cost::skew_cos ; + else + _errv = __invalid_useropts ; + _jcfg._iter_opts. iter() = _jjig._optm_iter ; + _jcfg._iter_opts. + beta() = _jjig._optm_beta ; + _jcfg._iter_opts. + zeta() = _jjig._optm_zeta ; + _jcfg._iter_opts. qtol() = _jjig._optm_qtol ; _jcfg._iter_opts. @@ -739,7 +814,7 @@ __testINTS("MESH-DIMS", _jcfg._mesh_opts.dims(), - (iptr_type) + 1, + (iptr_type) + 0, (iptr_type) + 3) __testREAL("MESH-SIZ1", @@ -815,6 +890,15 @@ (iptr_type) + 0, std::numeric_limits:: max()) + __testREAL("OPTM-BETA", + _jcfg._iter_opts.beta(), + (real_type) 0., + (real_type) .5) + __testREAL("OPTM-ZETA", + _jcfg._iter_opts.zeta(), + (real_type) 0., + (real_type) 1.) + __testREAL("OPTM-QTOL", _jcfg._iter_opts.qtol(), (real_type) 0., @@ -866,44 +950,47 @@ to_string_prec(__var, +2) : "MAXFLT"\ ) + "\n" - _jlog.push(" GEOM-FILE = " + + _jlog.push(" GEOM-FILE = " + _jcfg._geom_file + "\n" ) ; - _jlog.push(" MESH-FILE = " + + _jlog.push(" MESH-FILE = " + _jcfg._mesh_file + "\n" ) ; - _jlog.push(" HFUN-FILE = " + + _jlog.push(" HFUN-FILE = " + _jcfg._hfun_file + "\n" ) ; - _jlog.push(" INIT-FILE = " + + _jlog.push(" INIT-FILE = " + _jcfg._init_file + "\n" ) ; - _jlog.push(" TRIA-FILE = " + + _jlog.push(" TRIA-FILE = " + _jcfg._tria_file + "\n" ) ; - _jlog.push(" BNDS-FILE = " + + _jlog.push(" BNDS-FILE = " + _jcfg._bnds_file + "\n" ) ; _jlog.push("\n") ; + _jlog.push(" NUMTHREAD = " + + __pushIVAL(_jcfg._numthread) + "\n" ) ; + if (_jcfg._verbosity > +0) { /*---------------------------- push GEOM keywords */ - _jlog.push(" GEOM-SEED = " + + _jlog.push(" GEOM-SEED = " + __pushIVAL(_jcfg._mesh_opts.seed())); - _jlog.push(" GEOM-PHI1 = " + + _jlog.push(" GEOM-PHI1 = " + __pushRVAL(_jcfg._mesh_opts.phi1())); - _jlog.push(" GEOM-PHI2 = " + + _jlog.push(" GEOM-PHI2 = " + __pushRVAL(_jcfg._mesh_opts.phi2())); - _jlog.push(" GEOM-ETA1 = " + + _jlog.push(" GEOM-ETA1 = " + __pushRVAL(_jcfg._mesh_opts.eta1())); - _jlog.push(" GEOM-ETA2 = " + + _jlog.push(" GEOM-ETA2 = " + __pushRVAL(_jcfg._mesh_opts.eta2())); - _jlog.push(" GEOM-FEAT = " + + _jlog.push(" GEOM-FEAT = " + __pushBVAL(_jcfg._mesh_opts.feat())); _jlog.push("\n") ; /*---------------------------- push INIT keywords */ - _jlog.push(" INIT-NEAR = " + + _jlog.push(" INIT-NEAR = " + __pushRVAL(_jcfg._mesh_opts.near())); _jlog.push("\n") ; @@ -917,9 +1004,9 @@ jcfg_data::hfun_scal::relative) _jlog.push(" HFUN-SCAL = RELATIVE \n") ; - _jlog.push(" HFUN-HMAX = " + + _jlog.push(" HFUN-HMAX = " + __pushRVAL( _jcfg._hfun_hmax )) ; - _jlog.push(" HFUN-HMIN = " + + _jlog.push(" HFUN-HMIN = " + __pushRVAL( _jcfg._hfun_hmin )) ; _jlog.push("\n") ; @@ -946,44 +1033,44 @@ jcfg_data::mesh_pred::bisector) _jlog.push(" MESH-KERN = BISECTOR \n") ; - _jlog.push(" MESH-TOP1 = " + + _jlog.push(" MESH-TOP1 = " + __pushBVAL(_jcfg._mesh_opts.top1())); - _jlog.push(" MESH-TOP2 = " + + _jlog.push(" MESH-TOP2 = " + __pushBVAL(_jcfg._mesh_opts.top2())); - _jlog.push(" MESH-ITER = " + + _jlog.push(" MESH-ITER = " + __pushIVAL(_jcfg._mesh_opts.iter())); - _jlog.push(" MESH-DIMS = " + + _jlog.push(" MESH-DIMS = " + __pushIVAL(_jcfg._mesh_opts.dims())); - _jlog.push(" MESH-SIZ1 = " + + _jlog.push(" MESH-SIZ1 = " + __pushRVAL(_jcfg._mesh_opts.siz1())); - _jlog.push(" MESH-SIZ2 = " + + _jlog.push(" MESH-SIZ2 = " + __pushRVAL(_jcfg._mesh_opts.siz2())); - _jlog.push(" MESH-SIZ2 = " + + _jlog.push(" MESH-SIZ2 = " + __pushRVAL(_jcfg._mesh_opts.siz3())); - _jlog.push(" MESH-EPS1 = " + + _jlog.push(" MESH-EPS1 = " + __pushRVAL(_jcfg._mesh_opts.eps1())); - _jlog.push(" MESH-EPS2 = " + + _jlog.push(" MESH-EPS2 = " + __pushRVAL(_jcfg._mesh_opts.eps2())); - _jlog.push(" MESH-RAD2 = " + + _jlog.push(" MESH-RAD2 = " + __pushRVAL(_jcfg._mesh_opts.rad2())); - _jlog.push(" MESH-RAD3 = " + + _jlog.push(" MESH-RAD3 = " + __pushRVAL(_jcfg._mesh_opts.rad3())); - _jlog.push(" MESH-OFF2 = " + + _jlog.push(" MESH-OFF2 = " + __pushRVAL(_jcfg._mesh_opts.off2())); - _jlog.push(" MESH-OFF3 = " + + _jlog.push(" MESH-OFF3 = " + __pushRVAL(_jcfg._mesh_opts.off3())); - _jlog.push(" MESH-SNK2 = " + + _jlog.push(" MESH-SNK2 = " + __pushRVAL(_jcfg._mesh_opts.snk2())); - _jlog.push(" MESH-SNK3 = " + + _jlog.push(" MESH-SNK3 = " + __pushRVAL(_jcfg._mesh_opts.snk3())); - _jlog.push(" MESH-VOL3 = " + + _jlog.push(" MESH-VOL3 = " + __pushRVAL(_jcfg._mesh_opts.vol3())); _jlog.push("\n") ; @@ -1001,21 +1088,34 @@ jcfg_data::iter_pred::h95_dqdx) _jlog.push(" OPTM-KERN = H95+DQDX \n") ; - _jlog.push(" OPTM-ITER = " + + _jlog.push(" OPTM-ITER = " + __pushIVAL(_jcfg._iter_opts.iter())); - _jlog.push(" OPTM-QTOL = " + + if(_jcfg._iter_cost == + jcfg_data::iter_cost::area_len) + _jlog.push(" OPTM-COST = AREA-LEN \n") ; + else + if(_jcfg._iter_cost == + jcfg_data::iter_cost::skew_cos) + _jlog.push(" OPTM-COST = SKEW-COS \n") ; + + _jlog.push(" OPTM-BETA = " + + __pushRVAL(_jcfg._iter_opts.beta())); + _jlog.push(" OPTM-ZETA = " + + __pushRVAL(_jcfg._iter_opts.zeta())); + + _jlog.push(" OPTM-QTOL = " + __pushRVAL(_jcfg._iter_opts.qtol())); - _jlog.push(" OPTM-QLIM = " + + _jlog.push(" OPTM-QLIM = " + __pushRVAL(_jcfg._iter_opts.qlim())); - _jlog.push(" OPTM-ZIP_ = " + + _jlog.push(" OPTM-ZIP_ = " + __pushBVAL(_jcfg._iter_opts.zip_())); - _jlog.push(" OPTM-DIV_ = " + + _jlog.push(" OPTM-DIV_ = " + __pushBVAL(_jcfg._iter_opts.div_())); - _jlog.push(" OPTM-TRIA = " + + _jlog.push(" OPTM-TRIA = " + __pushBVAL(_jcfg._iter_opts.tria())); - _jlog.push(" OPTM-DUAL = " + + _jlog.push(" OPTM-DUAL = " + __pushBVAL(_jcfg._iter_opts.dual())); _jlog.push("\n") ; diff --git a/external/jigsaw/src/jig_read.hpp b/external/jigsaw/src/jig_read.hpp index 3983429..aa164d4 100644 --- a/external/jigsaw/src/jig_read.hpp +++ b/external/jigsaw/src/jig_read.hpp @@ -22,18 +22,22 @@ * how they can obtain it for free, then you are not * required to make any arrangement with me.) * - * Disclaimer: Neither I nor: Columbia University, The - * Massachusetts Institute of Technology, The - * University of Sydney, nor The National Aeronautics - * and Space Administration warrant this code in any - * way whatsoever. This code is provided "as-is" to be - * used at your own risk. + * Disclaimer: Neither I nor THE CONTRIBUTORS warrant + * this code in any way whatsoever. This code is + * provided "as-is" to be used at your own risk. + * + * THE CONTRIBUTORS include: + * (a) The University of Sydney + * (b) The Massachusetts Institute of Technology + * (c) Columbia University + * (d) The National Aeronautics & Space Administration + * (e) Los Alamos National Laboratory * -------------------------------------------------------- * - * Last updated: 16 July, 2020 + * Last updated: 12 Dec., 2022 * - * Copyright 2013-2020 + * Copyright 2013-2022 * Darren Engwirda * d.engwirda@gmail.com * https://github.com/dengwirda/ @@ -53,6 +57,9 @@ __normal_call void_type push_verbosity ( std::int32_t /*_verb*/ ) { } + __normal_call void_type push_numthread ( + std::int32_t /*_nprt*/ + ) { } __normal_call void_type push_geom_file ( std::string /*_file*/ @@ -170,6 +177,15 @@ __normal_call void_type push_optm_iter ( std::int32_t /*_iter*/ ) { } + __normal_call void_type push_optm_cost ( + std::int32_t /*_cost*/ + ) { } + __normal_call void_type push_optm_beta ( + double /*_beta*/ + ) { } + __normal_call void_type push_optm_zeta ( + double /*_zeta*/ + ) { } __normal_call void_type push_optm_qtol ( double /*_qtol*/ ) { } @@ -288,6 +304,26 @@ else \ _errs.push_tail(_line) ; + /*---------------------------------- read "COST" pred */ + #define __putCOST(__fun, __str) \ + if (__str.count() == 2 ) \ + { \ + __toUPPER(__str [1]) \ + if (__str[1].find("AREA-LEN")!= \ + std::string::npos ) \ + _dest.__fun ( \ + jcfg_data::iter_cost::area_len) ; \ + else \ + if (__str[1].find("SKEW-COS")!= \ + std::string::npos ) \ + _dest.__fun ( \ + jcfg_data::iter_cost::skew_cos) ; \ + else \ + _errs.push_tail(_line) ; \ + } \ + else \ + _errs.push_tail(_line) ; + /*---------------------------------- read "BNDS" pred */ #define __putBNDS(__fun, __str) \ if (__str.count() == 2 ) \ @@ -400,6 +436,11 @@ __putINTS(push_verbosity, _stok) ; } else + if (_stok[0] == "NUMTHREAD") + { + __putINTS(push_numthread, _stok) ; + } + else /*---------------------------- read GEOM keywords */ if (_stok[0] == "GEOM_FILE") { @@ -591,6 +632,21 @@ __putINTS(push_optm_iter, _stok) ; } else + if (_stok[0] == "OPTM_COST") + { + __putCOST(push_optm_cost, _stok) ; + } + else + if (_stok[0] == "OPTM_BETA") + { + __putREAL(push_optm_beta, _stok) ; + } + else + if (_stok[0] == "OPTM_ZETA") + { + __putREAL(push_optm_zeta, _stok) ; + } + else if (_stok[0] == "OPTM_QTOL") { __putREAL(push_optm_qtol, _stok) ; @@ -623,8 +679,7 @@ } catch (...) { - this-> - _errs.push_tail (_line) ; + this->_errs.push_tail(_line) ; } } @@ -634,11 +689,11 @@ #undef __putSCAL #undef __putMESH #undef __putOPTM + #undef __putCOST #undef __putBNDS #undef __putREAL #undef __putINTS #undef __putBOOL - } } ; diff --git a/external/jigsaw/src/jigsaw.cpp b/external/jigsaw/src/jigsaw.cpp index c69e145..8d94db6 100644 --- a/external/jigsaw/src/jigsaw.cpp +++ b/external/jigsaw/src/jigsaw.cpp @@ -19,8 +19,9 @@ // // more option(s): // - // -DUSE_NETCDF + // -DUSE_NETCDF -lnetcdf // -DUSE_TIMERS + // -fopenmp // // -Wfloat-conversion -Wsign-conversion -Wshadow // @@ -40,11 +41,11 @@ * JIGSAW: an unstructured mesh generation library. -------------------------------------------------------- * - * JIGSAW release 0.9.15.x + * JIGSAW release 1.0.0.x * - * Last updated: 10 July, 2021 + * Last updated: 11 Dec., 2022 * - * Copyright 2013 -- 2021 + * Copyright 2013 -- 2022 * Darren Engwirda * d.engwirda@gmail.com * https://github.com/dengwirda @@ -69,12 +70,16 @@ * how they can obtain it for free, then you are not * required to make any arrangement with me.) * - * Disclaimer: Neither I nor: Columbia University, The - * Massachusetts Institute of Technology, The - * University of Sydney, nor the National Aeronautics - * and Space Administration warrant this code in any - * way whatsoever. This code is provided "as-is" to be - * used at your own risk. + * Disclaimer: Neither I nor THE CONTRIBUTORS warrant + * this code in any way whatsoever. This code is + * provided "as-is" to be used at your own risk. + * + * THE CONTRIBUTORS include: + * (a) The University of Sydney + * (b) The Massachusetts Institute of Technology + * (c) Columbia University + * (d) The National Aeronautics & Space Administration + * (e) Los Alamos National Laboratory * -------------------------------------------------------- * @@ -188,13 +193,17 @@ -------------------------------------------------------- */ -# define __JGSWVSTR "JIGSAW VERSION 0.9.15" +# define __JGSWVSTR "JIGSAW VERSION 1.0.0" # if defined( USE_NETCDF) # define __use_netcdf # endif # if defined( USE_TIMERS) # define __use_timers +# endif + +# if defined( _OPENMP) +# define __use_openmp # endif // define __cmd_jigsaw // the cmd-ln exe's @@ -241,6 +250,12 @@ # include + /*---------------------------------- openmp threading */ + +# ifdef __use_openmp +# include +# endif//__use_openmp + /*---------------------------------- to do cpu timing */ # define __use_timers @@ -249,17 +264,13 @@ # include # endif//__use_timers - /*---------------------------------- to do netcdf i/o */ - - extern "C" - { -# ifdef __use_netcdf -# include "netcdf/lib_netcdf.h" -# endif//__use_netcdf - } - /*---------------------------------- JIGSAW's backend */ +# ifdef __clang__ + // bug w function-local classes? +# pragma clang diagnostic ignored "-Wunused-local-typedef" +# endif + extern "C" { # include "../inc/lib_jigsaw.h" @@ -278,6 +289,12 @@ typedef fp32_t fp32_type ; // single-precision typedef indx_t iptr_type ; // 32bit signed int + /*---------------------------------- to do netcdf i/o */ + +# ifdef __use_netcdf +# include "netcdf/ncutil.h" +# endif//__use_netcdf + /*---------------------------------- JIGSAW mesh kind */ struct jmsh_kind { @@ -304,6 +321,8 @@ __file_not_located = +2 ; iptr_type static constexpr __file_not_created = +3 ; + iptr_type static constexpr + __netcdf_not_available = +9 ; iptr_type static constexpr __invalid_argument = +4 ; @@ -338,6 +357,13 @@ iptr_type _verbosity = 0 ; + # ifdef __use_openmp + iptr_type _numthread = + omp_get_num_procs() ; + # else + iptr_type _numthread = 1 ; + # endif//__use_openmp + /*--------------------------------- geom-bnd. kernels */ struct bnds_pred { enum enum_data { @@ -375,6 +401,17 @@ iter_pred::enum_data _iter_pred = iter_pred::odt_dqdx ; + struct iter_cost { + enum enum_data { + nullkern , + area_len = JIGSAW_KERN_AREA_LEN, + skew_cos = JIGSAW_KERN_SKEW_COS + } ; + } ; + + iter_cost::enum_data + _iter_cost = iter_cost::area_len ; + /*--------------------------------- H(x) fun. scaling */ struct hfun_scal { enum enum_data { @@ -442,23 +479,34 @@ public : /*------------------------- helper: init. everything! */ __normal_call void_type init_geom ( - jcfg_data &_jcfg + jcfg_data &_jcfg, + float *_xoff, + bool_type _link = true ) { + if (_link) + this->_euclidean_mesh_2d._tria. + make_link () ; this->_euclidean_mesh_2d. - _tria.make_link() ; - this->_euclidean_mesh_2d. - init_geom(_jcfg._mesh_opts) ; + init_geom(_jcfg._mesh_opts, + _xoff[ +0 ], + _xoff[ +1 ]) ; + if (_link) + this->_euclidean_mesh_3d._tria. + make_link () ; this->_euclidean_mesh_3d. - _tria.make_link() ; - this->_euclidean_mesh_3d. - init_geom(_jcfg._mesh_opts) ; + init_geom(_jcfg._mesh_opts, + _xoff[ +0 ], + _xoff[ +1 ], + _xoff[ +2 ]) ; + if (_link) + this->_ellipsoid_mesh_3d._mesh. + make_link () ; this->_ellipsoid_mesh_3d. - _mesh.make_link() ; - this->_ellipsoid_mesh_3d. - init_geom(_jcfg._mesh_opts) ; + init_geom(_jcfg._mesh_opts + ) ; } } ; @@ -528,37 +576,47 @@ /*------------------------- helper: init. everything! */ __normal_call void_type init_hfun ( jcfg_data &_jcfg, + float *_xoff, bool_type _link = false ) { __unreferenced(_jcfg) ; + this->_constant_value_kd. init( + ) ; + if (_link) - { - this-> - _euclidean_mesh_2d._mesh.make_link () ; - this-> - _euclidean_mesh_3d._mesh.make_link () ; - this-> - _ellipsoid_mesh_3d._mesh.make_link () ; - } + this->_euclidean_mesh_2d._mesh. + make_link () ; + this->_euclidean_mesh_2d. init( + _xoff[ +0 ], + _xoff[ +1 ]) ; + + if (_link) + this->_euclidean_mesh_3d._mesh. + make_link () ; + this->_euclidean_mesh_3d. init( + _xoff[ +0 ], + _xoff[ +1 ], + _xoff[ +2 ]) ; - this-> - _constant_value_kd.init() ; - - this-> - _euclidean_mesh_2d.init() ; - this-> - _euclidean_mesh_3d.init() ; - this-> - _ellipsoid_mesh_3d.init() ; - - this-> - _euclidean_grid_2d.init() ; - this-> - _euclidean_grid_3d.init() ; - this-> - _ellipsoid_grid_3d.init() ; + if (_link) + this->_ellipsoid_mesh_3d._mesh. + make_link () ; + this->_ellipsoid_mesh_3d. init( + ) ; + + this->_euclidean_grid_2d. init( + _xoff[ +0 ], + _xoff[ +1 ]) ; + + this->_euclidean_grid_3d. init( + _xoff[ +0 ], + _xoff[ +1 ], + _xoff[ +2 ]) ; + + this->_ellipsoid_grid_3d. init( + ) ; } /*------------------------- helper: limit everything! */ @@ -568,22 +626,22 @@ { __unreferenced(_jcfg) ; - this-> - _constant_value_kd.clip() ; - - this-> - _euclidean_mesh_2d.clip() ; - this-> - _euclidean_mesh_3d.clip() ; - this-> - _ellipsoid_mesh_3d.clip() ; - - this-> - _euclidean_grid_2d.clip() ; - this-> - _euclidean_grid_3d.clip() ; - this-> - _ellipsoid_grid_3d.clip() ; + this->_constant_value_kd.clip( + ) ; + + this->_euclidean_mesh_2d.clip( + ) ; + this->_euclidean_mesh_3d.clip( + ) ; + this->_ellipsoid_mesh_3d.clip( + ) ; + + this->_euclidean_grid_2d.clip( + ) ; + this->_euclidean_grid_3d.clip( + ) ; + this->_ellipsoid_grid_3d.clip( + ) ; } } ; @@ -638,6 +696,32 @@ euclidean_mesh_2d _euclidean_mesh_2d ; euclidean_mesh_3d _euclidean_mesh_3d ; + public : + /*------------------------- helper: init. everything! */ + __normal_call void_type init_mesh ( + jcfg_data &_jcfg, + float *_xoff, + bool_type _link = true + ) + { + __unreferenced(_jcfg) ; + + if (_link) + this->_euclidean_mesh_2d._mesh. + make_link () ; + this->_euclidean_mesh_2d. init( + _xoff[ +0 ], + _xoff[ +1 ]) ; + + if (_link) + this->_euclidean_mesh_3d._mesh. + make_link () ; + this->_euclidean_mesh_3d. init( + _xoff[ +0 ], + _xoff[ +1 ], + _xoff[ +2 ]) ; + } + } ; /* @@ -650,9 +734,9 @@ { public : /*-------------------------- a "real" log-file writer */ - std::ofstream _file ; + std::ofstream _file ; - iptr_type _verbosity ; + iptr_type _verbosity = +0; public : @@ -692,7 +776,8 @@ data_type const&_data ) { - std :: cout << _data ; + if (this->_verbosity > -2) + std::cout << _data ; this->_file << _data ; } @@ -702,8 +787,7 @@ { public : /*-------------------------- a "null" log-file writer */ - - iptr_type _verbosity ; + iptr_type _verbosity = +0; public : @@ -725,9 +809,7 @@ { /*-------------------------- def. no: for lib_jigsaw! */ if (this->_verbosity > +0) - { std::cout << _data ; - } } } ; @@ -840,6 +922,8 @@ -------------------------------------------------------- */ + # include "offset.hpp" + # include "jigsaw.hpp" # include "tripod.hpp" diff --git a/external/jigsaw/src/jigsaw.hpp b/external/jigsaw/src/jigsaw.hpp index cfe0099..ec541e5 100644 --- a/external/jigsaw/src/jigsaw.hpp +++ b/external/jigsaw/src/jigsaw.hpp @@ -14,9 +14,9 @@ * JIGSAW: an unstructured mesh generation library. -------------------------------------------------------- * - * Last updated: 16 Apr., 2021 + * Last updated: 10 Jun., 2022 * - * Copyright 2013 -- 2021 + * Copyright 2013 -- 2022 * Darren Engwirda * d.engwirda@gmail.com * https://github.com/dengwirda @@ -41,12 +41,16 @@ * how they can obtain it for free, then you are not * required to make any arrangement with me.) * - * Disclaimer: Neither I nor: Columbia University, The - * Massachusetts Institute of Technology, The - * University of Sydney, nor the National Aeronautics - * and Space Administration warrant this code in any - * way whatsoever. This code is provided "as-is" to be - * used at your own risk. + * Disclaimer: Neither I nor THE CONTRIBUTORS warrant + * this code in any way whatsoever. This code is + * provided "as-is" to be used at your own risk. + * + * THE CONTRIBUTORS include: + * (a) The University of Sydney + * (b) The Massachusetts Institute of Technology + * (c) Columbia University + * (d) The National Aeronautics & Space Administration + * (e) Los Alamos National Laboratory * -------------------------------------------------------- */ @@ -563,12 +567,16 @@ ) { if (_args._iter_pred == - jcfg_data::iter_pred::odt_dqdx) + jcfg_data::iter_pred::odt_dqdx && + _args._iter_cost == + jcfg_data::iter_cost::area_len) { /*-------------------------- call ODT-ITER kernel */ typedef mesh:: iter_pred_euclidean_2d < geom_type , + jcfg_data:: + iter_cost::area_len , typename mesh_type:: mesh_type > pred_type ; @@ -590,17 +598,57 @@ iter_func::iter_mesh ( _geom, _hfun , _mesh. _mesh , - iter_func::_odt_kern , + iter_func::_odt_optimise, *_opts, _jlog ) ; } else if (_args._iter_pred == - jcfg_data::iter_pred::cvt_dqdx) + jcfg_data::iter_pred::odt_dqdx && + _args._iter_cost == + jcfg_data::iter_cost::skew_cos) + { + /*-------------------------- call ODT-ITER kernel */ + typedef mesh:: + iter_pred_euclidean_2d < + geom_type , + jcfg_data:: + iter_cost::skew_cos , + typename + mesh_type:: + mesh_type > pred_type ; + + typedef mesh::iter_mesh_2 < + geom_type , + typename + mesh_type:: + mesh_type , + hfun_type , + pred_type > iter_func ; + + typedef + jcfg_data::iter_opts iter_opts ; + + iter_opts *_opts = + &_args._iter_opts ; + + iter_func::iter_mesh ( + _geom, _hfun , + _mesh. _mesh , + iter_func::_odt_optimise, + *_opts, _jlog ) ; + } + else + if (_args._iter_pred == + jcfg_data::iter_pred::cvt_dqdx && + _args._iter_cost == + jcfg_data::iter_cost::area_len) { /*-------------------------- call CVT-ITER kernel */ typedef mesh:: iter_pred_euclidean_2d < geom_type , + jcfg_data:: + iter_cost::area_len , typename mesh_type:: mesh_type > pred_type ; @@ -622,17 +670,21 @@ iter_func::iter_mesh ( _geom, _hfun , _mesh. _mesh , - iter_func::_cvt_kern , + iter_func::_cvt_optimise, *_opts, _jlog ) ; } else if (_args._iter_pred == - jcfg_data::iter_pred::h95_dqdx) + jcfg_data::iter_pred::cvt_dqdx && + _args._iter_cost == + jcfg_data::iter_cost::skew_cos) { - /*-------------------------- call H95-ITER kernel */ + /*-------------------------- call CVT-ITER kernel */ typedef mesh:: iter_pred_euclidean_2d < geom_type , + jcfg_data:: + iter_cost::skew_cos , typename mesh_type:: mesh_type > pred_type ; @@ -654,7 +706,7 @@ iter_func::iter_mesh ( _geom, _hfun , _mesh. _mesh , - iter_func::_h95_kern , + iter_func::_cvt_optimise, *_opts, _jlog ) ; } } @@ -674,12 +726,52 @@ ) { if (_args._iter_pred == - jcfg_data::iter_pred::odt_dqdx) + jcfg_data::iter_pred::odt_dqdx && + _args._iter_cost == + jcfg_data::iter_cost::area_len) + { + /*-------------------------- call ODT-ITER kernel */ + typedef mesh:: + iter_pred_ellipsoid_3d < + geom_type , + jcfg_data:: + iter_cost::area_len , + typename + mesh_type:: + mesh_type > pred_type ; + + typedef mesh::iter_mesh_2 < + geom_type , + typename + mesh_type:: + mesh_type , + hfun_type , + pred_type > iter_func ; + + typedef + jcfg_data::iter_opts iter_opts ; + + iter_opts *_opts = + &_args._iter_opts ; + + iter_func::iter_mesh ( + _geom, _hfun , + _mesh. _mesh , + iter_func::_odt_optimise, + *_opts, _jlog ) ; + } + else + if (_args._iter_pred == + jcfg_data::iter_pred::odt_dqdx && + _args._iter_cost == + jcfg_data::iter_cost::skew_cos) { /*-------------------------- call ODT-ITER kernel */ typedef mesh:: iter_pred_ellipsoid_3d < geom_type , + jcfg_data:: + iter_cost::skew_cos , typename mesh_type:: mesh_type > pred_type ; @@ -701,17 +793,21 @@ iter_func::iter_mesh ( _geom, _hfun , _mesh. _mesh , - iter_func::_odt_kern , + iter_func::_odt_optimise, *_opts, _jlog ) ; } else if (_args._iter_pred == - jcfg_data::iter_pred::cvt_dqdx) + jcfg_data::iter_pred::cvt_dqdx && + _args._iter_cost == + jcfg_data::iter_cost::area_len) { /*-------------------------- call CVT-ITER kernel */ typedef mesh:: iter_pred_ellipsoid_3d < geom_type , + jcfg_data:: + iter_cost::area_len , typename mesh_type:: mesh_type > pred_type ; @@ -733,17 +829,21 @@ iter_func::iter_mesh ( _geom, _hfun , _mesh. _mesh , - iter_func::_cvt_kern , + iter_func::_cvt_optimise, *_opts, _jlog ) ; } else if (_args._iter_pred == - jcfg_data::iter_pred::h95_dqdx) + jcfg_data::iter_pred::cvt_dqdx && + _args._iter_cost == + jcfg_data::iter_cost::skew_cos) { - /*-------------------------- call H95-ITER kernel */ + /*-------------------------- call CVT-ITER kernel */ typedef mesh:: iter_pred_ellipsoid_3d < geom_type , + jcfg_data:: + iter_cost::skew_cos , typename mesh_type:: mesh_type > pred_type ; @@ -765,7 +865,7 @@ iter_func::iter_mesh ( _geom, _hfun , _mesh. _mesh , - iter_func::_h95_kern , + iter_func::_cvt_optimise, *_opts, _jlog ) ; } } @@ -1057,6 +1157,8 @@ mesh_data _mesh ; // MESH data jcfg_data _jcfg ; + float _xoff[3] = {+0.f} ; // to origin + # ifdef __use_timers typename std ::chrono:: high_resolution_clock::time_point _ttic ; @@ -1146,6 +1248,13 @@ return _retv ; } + if ((_retv = separator ( + _jcfg, _jlog , + _geom, _xoff)) != __no_error) + { + return _retv ; + } + # ifdef __use_timers _ttoc = _time.now(); _jlog.push(dump_time(_ttic, _ttoc)); @@ -1163,7 +1272,7 @@ _ttic = _time.now(); # endif//__use_timers - _geom.init_geom(_jcfg) ; + _geom.init_geom(_jcfg, _xoff) ; if (_jcfg._verbosity > 0 ) { @@ -1228,10 +1337,7 @@ _ttic = _time.now(); # endif//__use_timers - _mesh._euclidean_mesh_2d. - _mesh.make_link(); - _mesh._euclidean_mesh_3d. - _mesh.make_link(); + _mesh.init_mesh(_jcfg, _xoff) ; if (_jcfg._verbosity > 0 ) { @@ -1303,7 +1409,7 @@ return _retv ; } - _hfun.init_hfun (_jcfg); + _hfun.init_hfun(_jcfg, _xoff) ; if (_jcfg._verbosity > 0 ) { @@ -1449,6 +1555,7 @@ if ((_retv = save_rdel ( _jcfg, _jlog , + _xoff, _mesh,*_mmsh)) != __no_error) { return _retv ; @@ -1460,6 +1567,7 @@ if ((_retv = save_mesh ( _jcfg, _jlog , + _xoff, _mesh,*_mmsh)) != __no_error) { return _retv ; @@ -1491,6 +1599,8 @@ geom_data _geom ; // GEOM data mesh_data _mesh ; // MESH data + float _xoff[3] = {+0.f} ; // to origin + # ifdef __use_timers typename std ::chrono:: high_resolution_clock::time_point _ttic ; @@ -1559,15 +1669,10 @@ /*--------------------------------- setup *.JLOG file */ jlog_text _jlog(_jcfg) ; - _jlog.push(JIGSAW:: - asciibanner) ; if(!_jcfg._jcfg_file.empty()) { /*--------------------------------- parse *.JCFG file */ - _jlog.push ( - " Reading CFG. file...\n\n" ) ; - # ifdef __use_timers _ttic = _time.now(); # endif//__use_timers @@ -1578,6 +1683,11 @@ return _retv ; } + _jlog._verbosity = + _jcfg._verbosity ; + + _jlog.push ( JIGSAW::asciibanner ) ; + if ((_retv = test_jcfg ( _jcfg, _jlog)) != __no_error) { @@ -1624,6 +1734,13 @@ return _retv ; } + if ((_retv = separator ( + _jcfg, _jlog , + _geom, _xoff)) != __no_error) + { + return _retv ; + } + # ifdef __use_timers _ttoc = _time.now(); _jlog.push(dump_time(_ttic, _ttoc)); @@ -1641,7 +1758,7 @@ _ttic = _time.now(); # endif//__use_timers - _geom.init_geom(_jcfg) ; + _geom.init_geom(_jcfg, _xoff) ; if (_jcfg._verbosity > 0 ) { @@ -1706,10 +1823,7 @@ _ttic = _time.now(); # endif//__use_timers - _mesh._euclidean_mesh_2d. - _mesh.make_link(); - _mesh._euclidean_mesh_3d. - _mesh.make_link(); + _mesh.init_mesh(_jcfg, _xoff) ; if (_jcfg._verbosity > 0 ) { @@ -1781,7 +1895,7 @@ return _retv ; } - _hfun.init_hfun (_jcfg); + _hfun.init_hfun(_jcfg, _xoff) ; if (_jcfg._verbosity > 0 ) { @@ -1846,8 +1960,8 @@ # endif//__use_timers if ((_retv = save_tria ( - _jcfg, - _jlog, _mesh)) != __no_error) + _jcfg, _jlog, + _xoff, _mesh)) != __no_error) { return _retv ; } @@ -1952,8 +2066,8 @@ { if ((_retv = save_rdel ( - _jcfg, - _jlog, _mesh)) != __no_error) + _jcfg, _jlog, + _xoff, _mesh)) != __no_error) { return _retv ; } @@ -1963,8 +2077,8 @@ { if ((_retv = save_mesh ( - _jcfg, - _jlog, _mesh)) != __no_error) + _jcfg, _jlog, + _xoff, _mesh)) != __no_error) { return _retv ; } diff --git a/external/jigsaw/src/libcpp/aabb_tree/aabb_mesh_k.hpp b/external/jigsaw/src/libcpp/aabb_tree/aabb_mesh_k.hpp index 08b1f1d..906345a 100644 --- a/external/jigsaw/src/libcpp/aabb_tree/aabb_mesh_k.hpp +++ b/external/jigsaw/src/libcpp/aabb_tree/aabb_mesh_k.hpp @@ -22,16 +22,20 @@ * how they can obtain it for free, then you are not * required to make any arrangement with me.) * - * Disclaimer: Neither I nor: Columbia University, The - * Massachusetts Institute of Technology, The - * University of Sydney, nor The National Aeronautics - * and Space Administration warrant this code in any - * way whatsoever. This code is provided "as-is" to be - * used at your own risk. + * Disclaimer: Neither I nor THE CONTRIBUTORS warrant + * this code in any way whatsoever. This code is + * provided "as-is" to be used at your own risk. + * + * THE CONTRIBUTORS include: + * (a) The University of Sydney + * (b) The Massachusetts Institute of Technology + * (c) Columbia University + * (d) The National Aeronautics & Space Administration + * (e) Los Alamos National Laboratory * ------------------------------------------------------------ * - * Last updated: 11 September, 2017 + * Last updated: 11 Sept., 2017 * * Copyright 2013-2017 * Darren Engwirda @@ -79,8 +83,7 @@ bool_type operator() ( face_type const&_fdat ) const - { - __unreferenced (_fdat) ; + { __unreferenced (_fdat) ; return ( true ) ; } @@ -102,12 +105,12 @@ allocators::basic_alloc > __normal_call void_type aabb_mesh ( - node_list& _nset , - face_list& _fset , - tree_type& _tree , - REAL_TYPE* _btol , - IPTR_TYPE _nbox = + 32, - push_pred _push = push_aabb() + node_list& _nset , // array of mesh nodes + face_list& _fset , // array of mesh cells + tree_type& _tree , // tree to load into + REAL_TYPE* _btol , // expand tree bbox over axes + IPTR_TYPE _nbox = + 32, // cells-per-bbox lim. + push_pred _push = push_aabb() // filter scheme ) { IPTR_TYPE constexpr _nnod = diff --git a/external/jigsaw/src/libcpp/aabb_tree/aabb_pred_k.hpp b/external/jigsaw/src/libcpp/aabb_tree/aabb_pred_k.hpp index 729795c..3191105 100644 --- a/external/jigsaw/src/libcpp/aabb_tree/aabb_pred_k.hpp +++ b/external/jigsaw/src/libcpp/aabb_tree/aabb_pred_k.hpp @@ -22,18 +22,22 @@ * how they can obtain it for free, then you are not * required to make any arrangement with me.) * - * Disclaimer: Neither I nor: Columbia University, The - * Massachusetts Institute of Technology, The - * University of Sydney, nor The National Aeronautics - * and Space Administration warrant this code in any - * way whatsoever. This code is provided "as-is" to be - * used at your own risk. + * Disclaimer: Neither I nor THE CONTRIBUTORS warrant + * this code in any way whatsoever. This code is + * provided "as-is" to be used at your own risk. + * + * THE CONTRIBUTORS include: + * (a) The University of Sydney + * (b) The Massachusetts Institute of Technology + * (c) Columbia University + * (d) The National Aeronautics & Space Administration + * (e) Los Alamos National Laboratory * ------------------------------------------------------------ * - * Last updated: 08 December, 2019 + * Last updated: 15 Aug., 2021 * - * Copyright 2013-2019 + * Copyright 2013-2021 * Darren Engwirda * d.engwirda@gmail.com * https://github.com/dengwirda/ @@ -283,7 +287,7 @@ real_type _ipos [ 2] ; real_type _jpos [ 2] ; - real_type _xmul [ 2] ; + real_type _xdiv [ 2] ; real_type _rmin [ 2] ; real_type _rmax [ 2] ; @@ -311,10 +315,10 @@ this->_rmax[1] = std::max( _isrc[1] , _jsrc[1]) ; - this->_xmul[0] = (real_type)1. / - ( _jsrc[0] - _isrc[0]) ; - this->_xmul[1] = (real_type)1. / - ( _jsrc[1] - _isrc[1]) ; + this->_xdiv[0] = + _jsrc[0] - _isrc[0]; + this->_xdiv[1] = + _jsrc[1] - _isrc[1]; } /*---------------------------------- TRUE if intersection */ @@ -331,12 +335,27 @@ /*------------------------------ bbox can't intersect */ return false ; + /*------------------------------ test if contain ends */ + if (_bmin[0] <= _ipos[0] && + _bmax[0] >= _ipos[0] && + _bmin[1] <= _ipos[1] && + _bmax[1] >= _ipos[1] ) + return true ; + + if (_bmin[0] <= _jpos[0] && + _bmax[0] >= _jpos[0] && + _bmin[1] <= _jpos[1] && + _bmax[1] >= _jpos[1] ) + return true ; + + return true ; + /*------------------------------ test if line overlap */ real_type _aval, _bval ; _aval = (_bmin[0]-_ipos[0]) - *_xmul[0]; + / this-> _xdiv[0]; _bval = (_bmax[0]-_ipos[0]) - *_xmul[0]; + / this-> _xdiv[0]; real_type _tmin, _tmax ; _tmin = @@ -347,9 +366,9 @@ if (_tmax<_tmin) return false ; _aval = (_bmin[1]-_ipos[1]) - *_xmul[1]; + / this-> _xdiv[1]; _bval = (_bmax[1]-_ipos[1]) - *_xmul[1]; + / this-> _xdiv[1]; _tmin = std::max(_tmin, std::min( _aval, _bval )) ; @@ -358,7 +377,7 @@ if (_tmax<_tmin) return false ; - if (_tmax< +0.) return false ; + if (_tmax< +0 ) return false ; return true ; } @@ -384,7 +403,7 @@ real_type _ipos [ 3] ; real_type _jpos [ 3] ; - real_type _xmul [ 3] ; + real_type _xdiv [ 3] ; real_type _rmin [ 3] ; real_type _rmax [ 3] ; @@ -418,12 +437,12 @@ this->_rmax[2] = std::max( _isrc[2] , _jsrc[2]) ; - this->_xmul[0] = (real_type)1. / - ( _jsrc[0] - _isrc[0]) ; - this->_xmul[1] = (real_type)1. / - ( _jsrc[1] - _isrc[1]) ; - this->_xmul[2] = (real_type)1. / - ( _jsrc[2] - _isrc[2]) ; + this->_xdiv[0] = + _jsrc[0] - _isrc[0]; + this->_xdiv[1] = + _jsrc[1] - _isrc[1]; + this->_xdiv[2] = + _jsrc[2] - _isrc[2]; } /*---------------------------------- TRUE if intersection */ @@ -440,12 +459,29 @@ /*------------------------------ bbox can't intersect */ return false ; + /*------------------------------ test if contain ends */ + if (_bmin[0] <= _ipos[0] && + _bmax[0] >= _ipos[0] && + _bmin[1] <= _ipos[1] && + _bmax[1] >= _ipos[1] && + _bmin[2] <= _ipos[2] && + _bmax[2] >= _ipos[2] ) + return true ; + + if (_bmin[0] <= _jpos[0] && + _bmax[0] >= _jpos[0] && + _bmin[1] <= _jpos[1] && + _bmax[1] >= _jpos[1] && + _bmin[2] <= _jpos[2] && + _bmax[2] >= _jpos[2] ) + return true ; + /*------------------------------ test if line overlap */ real_type _aval, _bval ; _aval = (_bmin[0]-_ipos[0]) - *_xmul[0]; + / this-> _xdiv[0]; _bval = (_bmax[0]-_ipos[0]) - *_xmul[0]; + / this-> _xdiv[0]; real_type _tmin, _tmax ; _tmin = @@ -456,9 +492,9 @@ if (_tmax<_tmin) return false ; _aval = (_bmin[1]-_ipos[1]) - *_xmul[1]; + / this-> _xdiv[1]; _bval = (_bmax[1]-_ipos[1]) - *_xmul[1]; + / this-> _xdiv[1]; _tmin = std::max(_tmin, std::min( _aval, _bval )) ; @@ -468,9 +504,9 @@ if (_tmax<_tmin) return false ; _aval = (_bmin[2]-_ipos[2]) - *_xmul[2]; + / this-> _xdiv[2]; _bval = (_bmax[2]-_ipos[2]) - *_xmul[2]; + / this-> _xdiv[2]; _tmin = std::max(_tmin, std::min( _aval, _bval )) ; @@ -479,7 +515,7 @@ if (_tmax<_tmin) return false ; - if (_tmax< +0.) return false ; + if (_tmax< +0 ) return false ; return true ; } diff --git a/external/jigsaw/src/libcpp/aabb_tree/aabb_tree_k.hpp b/external/jigsaw/src/libcpp/aabb_tree/aabb_tree_k.hpp index dd4870d..a7ece7a 100644 --- a/external/jigsaw/src/libcpp/aabb_tree/aabb_tree_k.hpp +++ b/external/jigsaw/src/libcpp/aabb_tree/aabb_tree_k.hpp @@ -22,18 +22,22 @@ * how they can obtain it for free, then you are not * required to make any arrangement with me.) * - * Disclaimer: Neither I nor: Columbia University, The - * Massachusetts Institute of Technology, The - * University of Sydney, nor The National Aeronautics - * and Space Administration warrant this code in any - * way whatsoever. This code is provided "as-is" to be - * used at your own risk. + * Disclaimer: Neither I nor THE CONTRIBUTORS warrant + * this code in any way whatsoever. This code is + * provided "as-is" to be used at your own risk. + * + * THE CONTRIBUTORS include: + * (a) The University of Sydney + * (b) The Massachusetts Institute of Technology + * (c) Columbia University + * (d) The National Aeronautics & Space Administration + * (e) Los Alamos National Laboratory * ------------------------------------------------------------ * - * Last updated: 28 Sept., 2020 + * Last updated: 30 Dec., 2022 * - * Copyright 2013-2020 + * Copyright 2013-2022 * Darren Engwirda * d.engwirda@gmail.com * https://github.com/dengwirda/ @@ -49,9 +53,9 @@ namespace geom_tree { template < - typename I , - size_t K , - typename N = aabb_node_base_k, + typename I , // item-to-be-stored typedef + size_t K , // number of geometric dimensions + typename N = aabb_node_base_k, // inner node typedef typename A = allocators::basic_alloc > class aabb_tree @@ -70,6 +74,10 @@ iptr_type static constexpr _dims = K ; + iptr_type static constexpr middle_split = +0 ; + iptr_type static constexpr median_split = +1 ; + iptr_type static constexpr window_split = +2 ; + typedef geom_tree::aabb_tree < item_type , _dims , @@ -90,6 +98,7 @@ real_type _pmax[ K] ; /*------------------------------- linkedlist of items */ item_data *_hptr; + iptr_type _size = 0 ; /*------------------------------- tree-based pointers */ node_type *_pptr; node_data *_lptr; @@ -135,10 +144,8 @@ item_data, wrap_pool> item_pool ; - typedef node_type* node_ptrt ; - - typedef containers::array < - node_ptrt, + typedef containers::array < + node_type* , allocator> work_list ; public : @@ -146,6 +153,7 @@ node_type _rdat ; node_type *_root ; iptr_type _size ; + iptr_type _imax ; work_list _work ; @@ -157,14 +165,14 @@ item_pool _item_pool ; /*------------------------------------- tree shape params */ - iptr_type _imax ; + iptr_type _npop ; real_type _long ; real_type _vtol ; private : /*---------------------- helper - delete a block of nodes */ __inline_call void_type free_node ( - node_data*&_data + __write_ptr(node_data)&_data ) { this-> @@ -176,7 +184,7 @@ /*---------------------- helper - create a block of nodes */ __inline_call void_type make_node ( - node_data*&_data + __write_ptr(node_data)&_data ) { _data = @@ -187,7 +195,7 @@ /*------------------------------- helper - delete an item */ __inline_call void_type free_item ( - item_data *_idat + __write_ptr(item_data) _idat ) { this-> @@ -200,7 +208,7 @@ /*------------------------------- helper - create an item */ __inline_call void_type make_item ( item_type const&_item, - item_data *&_idat + __write_ptr(item_data)&_idat ) { _idat = @@ -212,8 +220,8 @@ /*--------------------- helper - push an item onto a list */ __static_call __inline_call void_type push_item ( - item_data*&_head, - item_data *_item + __write_ptr(item_data)&_head, + __write_ptr(item_data) _item ) { _item->_next = _head ; @@ -223,9 +231,9 @@ /*--------------------- helper - _pop an item from a list */ __static_call __inline_call void_type _pop_item ( - item_data*&_head, - item_data *_item, - item_data *_prev + __write_ptr(item_data)&_head, + __write_ptr(item_data) _item, + __write_ptr(item_data) _prev ) { if (_prev != nullptr ) @@ -246,7 +254,7 @@ __inline_call aabb_tree ( allocator const&_asrc = allocator() ) : _root(nullptr) , - _size( +0) , + _size(+0) , _imax(+0), _work( _asrc) , /*-------------------------------------- "base" pools */ _node_base ( @@ -263,6 +271,15 @@ // pool'd alloc. takes care of dealloc... + __inline_call void_type clear ( + ) + { + this->_root = nullptr ; + this->_size = +0; + this->_imax = +0; + this->_node_base.clear() ; + this->_item_base.clear() ; + } /*------------- return container count / empty statistics */ __inline_call bool_type empty ( @@ -302,7 +319,17 @@ _iptr != nullptr; _iptr = _iptr->_next) { - for(auto _idim = _dims ; _idim-- != +0; ) + push_aabb_node(_nptr, _iptr) ; + } + } + + __static_call + __inline_call void_type push_aabb_node ( + node_type *_nptr, // node to update + item_data *_iptr // item to update with + ) + { + for (auto _idim = _dims; _idim-- != +0; ) { /*------------------------ find max. on each axis */ if (_nptr->_pmax[_idim] < @@ -319,7 +346,6 @@ _iptr->_data.pmin(_idim); } } - } } /*------------- helper - calc. best "split" axis for node */ @@ -353,12 +379,13 @@ /*------------------------------ form aabb dimensions */ rect_data _rect [_dims]; - iptr_type _best = 0; + iptr_type _best = +0 ; for(auto _idim = _dims ; _idim-- != +0; ) { + /*------------------------------ find long bbox. axis */ real_type _alen; - _alen = _node->_pmax[_idim] - - _node->_pmin[_idim]; + _alen = _node->_pmax[_idim] - + _node->_pmin[_idim] ; _rect[_idim]._alen = _alen ; _rect[_idim]._axis = _idim ; @@ -366,7 +393,19 @@ /*------------------------------ sort aabb dimensions */ algorithms::ssort ( - &_rect[0], &_rect[_dims], rect_less()) ; + &_rect[0], &_rect[_dims], rect_less()) ; + + /*------------------------------ shortcuts: item=node */ + if (!item_type::_is_a_rect) + { + auto _last = _dims - 1; + + _bdim = _rect[_last]._axis ; + _blen = this->_long * + _rect[_last]._alen ; + + return ; // exit, no "long" node + } /*------------------------------ scan aabb dimensions */ for(auto _idim = _dims ; _idim-- != +0; ) @@ -382,12 +421,12 @@ iptr_type _cnum = +0 ; /*------------------ partition "long"/inner items */ - for(item_data*_iptr = _node->_hptr; - _iptr != nullptr ; - _iptr = _iptr->_next) + for (auto _iptr = _node->_hptr; + _iptr != nullptr ; + _iptr = _iptr->_next) { if (_iptr-> - _data.plen(_axis) >= +_llen) + _data.plen(_axis) >= _llen) { _pnum += +1 ; } @@ -407,6 +446,7 @@ if (_pnum == +0) break ; } } + } /*--- top-down assembly of aabb-tree via recursive splits */ @@ -414,21 +454,22 @@ typename iter_type > __normal_call void_type load ( - iter_type _head , - iter_type _tend , - iptr_type _IMAX = + 32 , - real_type _LONG = +.75 , - real_type _VTOL = +.50 + iter_type _head , // head of items array to load + iter_type _tend , // last of items array to load + iptr_type _NPOP = + 32 , // leaf population lim. + iptr_type _RULE = window_split , // split scheme + real_type _LONG = +.75 , // "too-long" item lim. + real_type _VTOL = +.50 // leaf vol. split lim. ) { if (_tend <= _head) return ; this->_root = &this->_rdat ; - + this->_root->_size = +0 ; this->_size = +1 ; /*------------------------------ set node fill params */ - this->_imax = _IMAX ; + this->_npop = _NPOP ; this->_long = _LONG ; this->_vtol = _VTOL ; @@ -438,14 +479,19 @@ this->_root->_hptr = nullptr; /*------------------------------ push items onto root */ + { item_data *_hptr = nullptr; item_data *_idat = nullptr; - { for(; _head != _tend; ++_head) { /*------------------------------ alloc. and push item */ make_item(*_head, _idat); push_item( _hptr, _idat); + + this->_root->_size += +1; + + this->_imax = std::max( + this->_imax,_head->ipos ()) ; } this->_root->_hptr = _hptr ; } @@ -453,15 +499,16 @@ init_aabb_node (this->_root); /*-------------------------- a list of un-split nodes */ - this->_work.set_count( +0); + this->_work.clear() ; this->_work. push_tail(this->_root); /*--- refine tree until all nodes satisfy constraints */ + containers::array _sort; for( ; !this->_work.empty() ; ) { node_type *_pnod = nullptr; - node_data *_ndat = nullptr; + __write_ptr(node_data) _ndat = nullptr; node_type *_rnod = nullptr; node_type *_lnod = nullptr; @@ -472,77 +519,164 @@ iptr_type _lnum = +0 ; iptr_type _rnum = +0 ; - item_data *_next = nullptr; - item_data *_pptr = nullptr; - item_data *_cptr = nullptr; - item_data *_lptr = nullptr; - item_data *_rptr = nullptr; + __write_ptr(item_data) _next = nullptr; + __write_ptr(item_data) _pptr = nullptr; + __write_ptr(item_data) _cptr = nullptr; + __write_ptr(item_data) _lptr = nullptr; + __write_ptr(item_data) _rptr = nullptr; + __write_ptr(item_data) _iptr = nullptr; /*-------------------------- _pop node from stack */ - this->_work._pop_tail(_pnod) ; + this->_work._pop_tail (_pnod); /*---------- find best "split" axis for this node */ find_best_axis (_pnod, _bdim , _blen) ; - if (_bdim == -1) continue ; + if (_bdim == -1) continue; - /*---------- partition list - remove "long" items */ - for(item_data *_iptr = _pnod-> - _hptr ; - _iptr != nullptr ; - _iptr = _next ) + /*---------- compute split-pos. via user-def RULE */ + real_type _spos = (real_type)+0. ; + iptr_type _nnum = _pnod->_size ; + item_data*_hptr = _pnod->_hptr ; + if (_RULE == middle_split) { - _next = _iptr->_next ; + /*---------- split pos. - middle of items in node */ + double _SPOS = +0. ; + for(_iptr = _hptr ; _iptr != nullptr ; + _iptr = _next ) + { + _next = _iptr-> _next ; /*------------------------------- partition items */ if (_iptr->_data .plen (_bdim) > _blen) { - push_item(_pptr,_iptr); - _pnum += +1 ; + push_item(_pptr, _iptr); + _pnum += +1 ; } else { - push_item(_cptr,_iptr); - _cnum += +1 ; + push_item(_cptr, _iptr); + _cnum += +1 ; + + _SPOS += + _iptr->_data.pmid(_bdim); } } - /*---------- split pos. - mean of non-long aabb's */ - double _SPOS = +0. ; - for(item_data *_iptr = _cptr ; - _iptr != nullptr ; - _iptr = _next ) + _spos = (real_type)(_SPOS/_cnum); + } + else + if (_RULE == median_split) + { + /*---------- split pos. - median of items in node */ + + // (1+-a)-approx. with probability p + // require: 1/a^2 + log(1/p) samples + size_t _nsel = + (size_t)(+500 * std::log2(_nnum + 1) + 1) ; + + size_t _filt = _nnum / _nsel + 1; + size_t _njmp = _filt ; + size_t _inum = +0; + _sort.clear(); + for(_iptr = _hptr ; _iptr != nullptr ; + _iptr = _next , + _inum += +1 ) { - _next = _iptr->_next ; + _next = _iptr-> _next ; + /*------------------------------- partition items */ + if (_iptr->_data + .plen (_bdim) > _blen) + { + push_item(_pptr, _iptr); + _pnum += +1 ; + } + else + { + push_item(_cptr, _iptr); + _cnum += +1 ; + + if(_inum >= _njmp) + { + _sort.push_tail( + _iptr->_data.pmid(_bdim)) ; - _SPOS +=_iptr-> - _data.pmid (_bdim); + _njmp += _filt; + } + } } - real_type _spos = - (real_type)(_SPOS / _cnum); + if(!_sort.empty()) + { + algorithms::qsort( + _sort.head(), _sort.tend(), + std::less()) ; - /*---------- partition list - split on left|right */ - for(item_data *_iptr = _cptr ; - _iptr != nullptr ; - _iptr = _next ) + _spos = _sort[_sort.count() / 2]; + } + } + else + if (_RULE == window_split) { - _next = _iptr->_next ; + /*---------- split pos. - window of items in node */ + + // (1+-a)-approx. with probability p + // require: 1/a^2 + log(1/p) samples + size_t _nsel = + (size_t)(+500 * std::log2(_nnum + 1) + 1) ; + + size_t _filt = _nnum / _nsel + 1; + size_t _njmp = _filt ; + size_t _inum = +0; + double _SPOS = +0. ; + _sort.clear(); + for(_iptr = _hptr ; _iptr != nullptr ; + _iptr = _next , + _inum += +1 ) + { + _next = _iptr-> _next ; /*------------------------------- partition items */ if (_iptr->_data - .pmid (_bdim) > _spos) + .plen (_bdim) > _blen) { - push_item(_rptr,_iptr); - _rnum += +1 ; + push_item(_pptr, _iptr); + _pnum += +1 ; } else { - push_item(_lptr,_iptr); - _lnum += +1 ; + push_item(_cptr, _iptr); + _cnum += +1 ; + + _SPOS += + _iptr->_data.pmid(_bdim); + + if(_inum >= _njmp) + { + _sort.push_tail( + _iptr->_data.pmid(_bdim)) ; + + _njmp += _filt; + } } } + if(!_sort.empty()) // middle-median blend + { + algorithms::qsort( + _sort.head(), _sort.tend(), + std::less()) ; + + _spos = _sort[_sort.count() / 2]; + _SPOS/= _cnum ; + + _spos = (real_type)(+1./3.*_spos) + + (real_type)(+2./3.*_SPOS) ; + } + } + + if (_cnum == +0) continue ; + /*-------------------- alloc. new child node data */ make_node(_ndat); _lnod = &_ndat->_node[ 0] ; @@ -553,19 +687,49 @@ _pnod->_hptr = _pptr ; _pnod->_lptr = _ndat ; - _lnod->_hptr = _lptr ; + _lnod->_hptr = nullptr ; _lnod->_lptr = nullptr ; _lnod->_pptr = _pnod ; - _rnod->_hptr = _rptr ; + init_aabb_node (_lnod , _pnod); + + _rnod->_hptr = nullptr ; _rnod->_lptr = nullptr ; _rnod->_pptr = _pnod ; - init_aabb_node (_lnod, _pnod); - init_aabb_node (_rnod, _pnod); + init_aabb_node (_rnod , _pnod); + + /*---------- partition list - split on left|right */ + for(_iptr = _cptr ; _iptr != nullptr ; + _iptr = _next ) + { + _next = _iptr-> _next ; + /*------------------------------- partition items */ + if (_iptr->_data + .pmid (_bdim) > _spos) + { + push_aabb_node( _rnod, _iptr) ; + push_item(_rptr,_iptr); + + _rnum += +1 ; + } + else + { + push_aabb_node( _lnod, _iptr) ; + push_item(_lptr,_iptr); + + _lnum += +1 ; + } + } + + _rnod->_hptr = _rptr ; + _rnod->_size = _rnum ; + + _lnod->_hptr = _lptr ; + _lnod->_size = _lnum ; /*------------------ push new children onto stack */ - if (_cnum < this->_imax) + if (_cnum < this->_npop) { double _volp, _voll, _volr ; @@ -594,10 +758,8 @@ /*--------------- push children due to vol. ratio */ if (_lnum < _cnum && _rnum < _cnum) { - this->_work - .push_tail(_rnod); - this->_work - .push_tail(_lnod); + _work.push_tail (_rnod); + _work.push_tail (_lnod); } } @@ -607,39 +769,69 @@ /*--------------- push children due to items cap. */ if (_lnum < _cnum && _rnum < _cnum) { - this->_work - .push_tail(_rnod); - this->_work - .push_tail(_lnod); + _work.push_tail (_rnod); + _work.push_tail (_lnod); } } } } +/*-------- _pop items from tree while preserving geometry */ + __normal_call void_type _pop ( + ) + { + if (this->_root == nullptr) return ; + + this->_work.clear() ; + this->_work.push_tail(this->_root) ; + + /*---------------------------- nullify lists per node */ + for ( ; !this->_work.empty() ; ) + { + node_type *_node = nullptr ; + this->_work._pop_tail(_node) ; + + if (_node->items () != nullptr) + { + _node->_hptr = nullptr ; + } + + if (_node->lower(0) != nullptr) + { + { + this->_work.push_tail ( + _node->lower( 0)) ; + + this->_work.push_tail ( + _node->lower( 1)) ; + } + } + } + /*---------------------------- clear item linked list */ + this->_item_base.clear() ; + } + /*-------- form a biased, spatially-local insertion order */ template < typename iptr_list > __normal_call void_type brio ( - iptr_list &_iset + iptr_list &_iset // return brio indices for item ) { - containers::array _next; + containers::array_next ; - if (this->_root - == nullptr) return ; + if (this->_root == nullptr) return ; - this->_work.set_count( +0) ; - this->_work. - push_tail(this->_root) ; + this->_work.clear() ; + this->_work.push_tail(this->_root) ; /*---------------------------- init. leading item ptr */ for ( ; !this->_work.empty() ; ) { node_type *_node = nullptr ; - this->_work. - _pop_tail(_node) ; + this->_work._pop_tail(_node) ; if (_node->items () != nullptr) { @@ -706,11 +898,82 @@ } } +/*-------- get items-per-nodes, as a sparse list-of-lists */ + template < + typename lptr_list, + typename iptr_list + > + __normal_call void_type dcmp ( + lptr_list &_lptr, // ith list: _lp[i]:_lp[i+1]-1 + iptr_list &_iset // unrolled list of item index + ) + { + _lptr.push_tail(_iset.count()) ; + + if (this->_root == nullptr) return; + + this->_work.clear() ; + this->_work.push_tail(this->_root); + + for ( ; !this->_work.empty() ; ) + { + node_type *_node = nullptr ; + this->_work._pop_tail(_node) ; + + /*---------------------------- push items to CCS list */ + if (_node->items () != nullptr) + { + for (auto + _item = _node->items() ; + _item != nullptr; + _item = _item->_next ) + { + _iset.push_tail( + _item->_data.ipos()); + } + _lptr. + push_tail(_iset.count()) ; + } + + /*---------------------------- descend to child nodes */ + if (_node->lower(0) != nullptr) + { + uint32_t _rsiz = + sizeof(real_type) * +K ; + uint32_t _usiz = + sizeof(uint32_t ) * +1 ; + + uint32_t _hash ; + _hash = hash::hashword ( + (uint32_t*)_node->_pmin, + _rsiz / _usiz, +13) ; + + if (_hash % 2 == +0 ) + { + this->_work.push_tail ( + _node->lower( 0)) ; + + this->_work.push_tail ( + _node->lower( 1)) ; + } + else + { + this->_work.push_tail ( + _node->lower( 1)) ; + + this->_work.push_tail ( + _node->lower( 0)) ; + } + } + } + } + /*-------- helper: calc. "distance" between pos. and aabb */ + __static_call __normal_call real_type calc_rect_dist ( - real_type *_ppos, - real_type *_bmin, - real_type *_bmax + __const_ptr(real_type) _ppos, + __const_ptr(real_type) _bmin, + __const_ptr(real_type) _bmax ) { real_type _dist = (real_type)0.; @@ -750,21 +1013,23 @@ { if (this->_root == nullptr) return false ; + containers::array< + node_type* , + allocator> _wset ; + /*----------------- maintain stack of unvisited nodes */ - this->_work.set_count( +0) ; + _wset.set_alloc (+64) ; if (_pred(this->_root->_pmin, this->_root->_pmax) ) - this->_work. - push_tail(this->_root) ; + _wset.push_tail (this->_root) ; /*----------------- traverse while _pred remains true */ bool_type _find = false ; - for ( ; !this->_work.empty() ; ) + for ( ; !_wset.empty() ; ) { node_type *_node = nullptr ; - this->_work. - _pop_tail(_node) ; + _wset._pop_tail(_node) ; if (_node->_hptr!= nullptr ) { @@ -780,14 +1045,14 @@ _node->lower(0)->_pmin , _node->lower(0)->_pmax ) ) - this->_work.push_tail ( + _wset.push_tail ( _node->lower(0)) ; if (_pred( _node->lower(1)->_pmin , _node->lower(1)->_pmax ) ) - this->_work.push_tail ( + _wset.push_tail ( _node->lower(1)) ; } } @@ -800,8 +1065,8 @@ typename projector > __normal_call bool_type near ( - real_type *_ppos , - projector &_proj + __const_ptr(real_type) _ppos , // point to index + projector &_proj // closest distance projector ) { class node_dist @@ -837,10 +1102,9 @@ node_dist _ndat ; _ndat._node = _root ; - _ndat._dsqr = - calc_rect_dist(_ppos , - &_root->_pmin[0], - &_root->_pmax[0]) ; + _ndat._dsqr = calc_rect_dist(_ppos, + &_root->_pmin[ 0] , + &_root->_pmax[ 0]); _nnpq.push (_ndat); /*----------------- traverse tree while len. reducing */ @@ -860,12 +1124,15 @@ /*------------------------ descend if maybe close */ if (_ndat. - _node-> _hptr != nullptr) + _node-> _hptr != nullptr || + _ndat. + _node->lower(0) == nullptr) { /*------------------------ leaf: update item-dist */ _find = true ; _dsqr = _proj( + _ndat._node , _ndat._node->_hptr) ; } @@ -881,17 +1148,17 @@ _ndat._node = _inod ; _ndat._dsqr = - calc_rect_dist(_ppos , - &_inod->_pmin[ 0], - &_inod->_pmax[ 0]) ; + calc_rect_dist(_ppos, + &_inod->_pmin[ 0], + &_inod->_pmax[ 0]) ; _nnpq.push(_ndat) ; _ndat._node = _jnod ; _ndat._dsqr = - calc_rect_dist(_ppos , - &_jnod->_pmin[ 0], - &_jnod->_pmax[ 0]) ; + calc_rect_dist(_ppos, + &_jnod->_pmin[ 0], + &_jnod->_pmax[ 0]) ; _nnpq.push(_ndat) ; } diff --git a/external/jigsaw/src/libcpp/aabb_tree/aabb_type_k.hpp b/external/jigsaw/src/libcpp/aabb_tree/aabb_type_k.hpp index dd8cd43..ee52a80 100644 --- a/external/jigsaw/src/libcpp/aabb_tree/aabb_type_k.hpp +++ b/external/jigsaw/src/libcpp/aabb_tree/aabb_type_k.hpp @@ -22,16 +22,20 @@ * how they can obtain it for free, then you are not * required to make any arrangement with me.) * - * Disclaimer: Neither I nor: Columbia University, The - * Massachusetts Institute of Technology, The - * University of Sydney, nor The National Aeronautics - * and Space Administration warrant this code in any - * way whatsoever. This code is provided "as-is" to be - * used at your own risk. + * Disclaimer: Neither I nor THE CONTRIBUTORS warrant + * this code in any way whatsoever. This code is + * provided "as-is" to be used at your own risk. + * + * THE CONTRIBUTORS include: + * (a) The University of Sydney + * (b) The Massachusetts Institute of Technology + * (c) Columbia University + * (d) The National Aeronautics & Space Administration + * (e) Los Alamos National Laboratory * ------------------------------------------------------------ * - * Last updated: 10 September, 2017 + * Last updated: 10 Sept., 2017 * * Copyright 2013-2017 * Darren Engwirda @@ -57,9 +61,9 @@ template < - typename R, - typename I, - size_t K + typename R, // reals typedef + typename I, // integer typedef + size_t K // number of geometric dimensions > class aabb_item_rect_k { @@ -70,6 +74,7 @@ typedef I iptr_type; iptr_type static constexpr _dims = K ; + bool_type static constexpr _is_a_rect = true ; private : @@ -128,9 +133,9 @@ template < - typename R, - typename I, - size_t K + typename R, // reals typedef + typename I, // integer typedef + size_t K // number of geometric dimensions > class aabb_item_node_k { @@ -141,6 +146,7 @@ typedef I iptr_type; iptr_type static constexpr _dims = K ; + bool_type static constexpr _is_a_rect = false; private : diff --git a/external/jigsaw/src/libcpp/aabbtree.hpp b/external/jigsaw/src/libcpp/aabbtree.hpp index 52deac5..84af308 100644 --- a/external/jigsaw/src/libcpp/aabbtree.hpp +++ b/external/jigsaw/src/libcpp/aabbtree.hpp @@ -22,16 +22,20 @@ * how they can obtain it for free, then you are not * required to make any arrangement with me.) * - * Disclaimer: Neither I nor: Columbia University, The - * Massachusetts Institute of Technology, The - * University of Sydney, nor The National Aeronautics - * and Space Administration warrant this code in any - * way whatsoever. This code is provided "as-is" to be - * used at your own risk. + * Disclaimer: Neither I nor THE CONTRIBUTORS warrant + * this code in any way whatsoever. This code is + * provided "as-is" to be used at your own risk. + * + * THE CONTRIBUTORS include: + * (a) The University of Sydney + * (b) The Massachusetts Institute of Technology + * (c) Columbia University + * (d) The National Aeronautics & Space Administration + * (e) Los Alamos National Laboratory * ------------------------------------------------------------ * - * Last updated: 13 August, 2018 + * Last updated: 13 Aug., 2018 * * Copyright 2013-2018 * Darren Engwirda diff --git a/external/jigsaw/src/libcpp/algorithms.hpp b/external/jigsaw/src/libcpp/algorithms.hpp index 330e328..cc8aa66 100644 --- a/external/jigsaw/src/libcpp/algorithms.hpp +++ b/external/jigsaw/src/libcpp/algorithms.hpp @@ -22,16 +22,20 @@ * how they can obtain it for free, then you are not * required to make any arrangement with me.) * - * Disclaimer: Neither I nor: Columbia University, The - * Massachusetts Institute of Technology, The - * University of Sydney, nor The National Aeronautics - * and Space Administration warrant this code in any - * way whatsoever. This code is provided "as-is" to be - * used at your own risk. + * Disclaimer: Neither I nor THE CONTRIBUTORS warrant + * this code in any way whatsoever. This code is + * provided "as-is" to be used at your own risk. + * + * THE CONTRIBUTORS include: + * (a) The University of Sydney + * (b) The Massachusetts Institute of Technology + * (c) Columbia University + * (d) The National Aeronautics & Space Administration + * (e) Los Alamos National Laboratory * ------------------------------------------------------------ * - * Last updated: 01 September, 2017 + * Last updated: 01 Sept., 2017 * * Copyright 2013-2017 * Darren Engwirda diff --git a/external/jigsaw/src/libcpp/algorithms/find.hpp b/external/jigsaw/src/libcpp/algorithms/find.hpp index 3564454..1ba8944 100644 --- a/external/jigsaw/src/libcpp/algorithms/find.hpp +++ b/external/jigsaw/src/libcpp/algorithms/find.hpp @@ -22,16 +22,20 @@ * how they can obtain it for free, then you are not * required to make any arrangement with me.) * - * Disclaimer: Neither I nor: Columbia University, The - * Massachusetts Institute of Technology, The - * University of Sydney, nor The National Aeronautics - * and Space Administration warrant this code in any - * way whatsoever. This code is provided "as-is" to be - * used at your own risk. + * Disclaimer: Neither I nor THE CONTRIBUTORS warrant + * this code in any way whatsoever. This code is + * provided "as-is" to be used at your own risk. + * + * THE CONTRIBUTORS include: + * (a) The University of Sydney + * (b) The Massachusetts Institute of Technology + * (c) Columbia University + * (d) The National Aeronautics & Space Administration + * (e) Los Alamos National Laboratory * -------------------------------------------------------- * - * Last updated: 01 September, 2017 + * Last updated: 01 Sept., 2017 * * Copyright 2013-2017 * Darren Engwirda @@ -62,10 +66,10 @@ typename pred_type > __normal_call iter_type lower_bound ( - iter_type _head , - iter_type _tend , - data_type _xval , - pred_type _less + iter_type _head , // head of sequence to search + iter_type _tend , // last of sequence to search + data_type _xval , // value to search for + pred_type _less // comparison predicate ) { iter_type _iter ; @@ -109,10 +113,10 @@ typename pred_type > __normal_call iter_type upper_bound ( - iter_type _head , - iter_type _tend , - data_type _xval , - pred_type _less + iter_type _head , // head of sequence to search + iter_type _tend , // last of sequence to search + data_type _xval , // value to search for + pred_type _less // comparison predicate ) { iter_type _iter ; diff --git a/external/jigsaw/src/libcpp/algorithms/sort.hpp b/external/jigsaw/src/libcpp/algorithms/sort.hpp index f161c7e..5663c97 100644 --- a/external/jigsaw/src/libcpp/algorithms/sort.hpp +++ b/external/jigsaw/src/libcpp/algorithms/sort.hpp @@ -22,16 +22,20 @@ * how they can obtain it for free, then you are not * required to make any arrangement with me.) * - * Disclaimer: Neither I nor: Columbia University, The - * Massachusetts Institute of Technology, The - * University of Sydney, nor The National Aeronautics - * and Space Administration warrant this code in any - * way whatsoever. This code is provided "as-is" to be - * used at your own risk. + * Disclaimer: Neither I nor THE CONTRIBUTORS warrant + * this code in any way whatsoever. This code is + * provided "as-is" to be used at your own risk. + * + * THE CONTRIBUTORS include: + * (a) The University of Sydney + * (b) The Massachusetts Institute of Technology + * (c) Columbia University + * (d) The National Aeronautics & Space Administration + * (e) Los Alamos National Laboratory * -------------------------------------------------------- * - * Last updated: 24 July, 2019 + * Last updated: 24 Jul., 2019 * * Copyright 2013-2019 * Darren Engwirda @@ -61,9 +65,9 @@ typename pred_type > __normal_call bool_type is_sorted ( - iter_type _head , - iter_type _tail , - pred_type _less + iter_type _head , // head of sequence to test + iter_type _tail , // last of sequence to test + pred_type _less // comparison predicate ) { for ( ; _head+1 != _tail; ++_head ) @@ -159,9 +163,9 @@ typename pred_type > __normal_call void_type isort ( - iter_type _head, - iter_type _tend, - pred_type _less + iter_type _head, // head of sequence to sort + iter_type _tend, // last of sequence to sort + pred_type _less // comparison predicate ) { /*--------------------------- sort small input ranges */ @@ -244,9 +248,9 @@ typename pred_type > __normal_call void_type ssort ( - iter_type _head, - iter_type _tend, - pred_type _less + iter_type _head, // head of sequence to sort + iter_type _tend, // head of sequence to sort + pred_type _less // comparison predicate ) { /*--------------------------- sort small input ranges */ @@ -350,14 +354,14 @@ pred_type const&_less ) { - typename containers:: - iterator_traits:: - diff_type static constexpr _LONG = 256; + //typename containers:: + // iterator_traits:: + //diff_type static constexpr _LONG = 256; iter_type _imid = _head + (_tail - _head) / 2 ; - if (_tail - _head >= _LONG) + if (false) //(_tail - _head >= _LONG) { /*-------------- median-of-5 choice for pivot element */ typename containers:: @@ -389,8 +393,8 @@ > __normal_call void_type qsort ( // unrolled quick sort iter_type _head, - iter_type _tend, - pred_type _less + iter_type _tend, // last of sequence to sort + pred_type _less // comparison predicate ) { typedef containers:: @@ -436,25 +440,31 @@ iter_type _hh, _tt, _mm; /* _pop next partition bounds from stack */ ( --_nptr)->_pop(_hh, _tt); + if (_tt - _hh + 1 < _LONG) { /* leave small partitions */ continue ; } + /* find pivot item for current partition */ _mm = pivot(_hh, _tt, _less); - /* push pivot onto a local copy */ - typename - iter_base::data_type _pp = *_mm; + /* reduce partition around pivot element */ iter_type _ll = _hh + 1; iter_type _rr = _tt - 1; for ( ; _ll < _rr; ) { - for(;_less(*_ll, _pp);) ++_ll; - for(;_less( _pp, *_rr);) --_rr; + for(;_less(*_ll, *_mm);) ++_ll; + for(;_less(*_mm, *_rr);) --_rr; if (_ll < _rr) { /* swap elements */ + if (_ll == _mm) + _mm = _rr; + else + if (_rr == _mm) + _mm = _ll; + std::swap(*_ll, *_rr) ; } @@ -463,6 +473,7 @@ ++_ll; --_rr ; } } + /* push partitions onto stack, big first */ if (_rr - _hh > _tt - _ll) { @@ -481,6 +492,88 @@ isort (_head , _tend, _less) ; } + /* + -------------------------------------------------------- + * Q-SIFT: quick select; sort kth element + -------------------------------------------------------- + */ + + template < + typename iter_type , + typename pred_type + > + __normal_call void_type qsift ( // quick select + iter_type _head, + iter_type _kk, // pos. in sequence to find + iter_type _tend, // last of sequence to parition + pred_type _less // comparison predicate + ) + { + iter_type _hh, _tt, _mm; + _hh = _head + 0; + _tt = _tend - 1; + + do { + /* deal with "spec.-case" tiny partition */ + if (_tt - _hh + 1 <= 1) + break ; + + if (_tt - _hh + 1 == 2) + { + if (_less(*_tt, *_hh)) + std::swap(*_hh, *_tt); + break ; + } + + /* + if (_tt - _hh + 1 <= 4) + { + isort ( _hh, _tt, _less); + break ; + } + */ + + /* find pivot item for current partition */ + _mm = pivot(_hh, _tt, _less); + + /* reduce partition around pivot element */ + iter_type _ll = _hh + 1; + iter_type _rr = _tt - 1; + for ( ; _ll < _rr; ) + { + for(;_less(*_ll, *_mm);) ++_ll; + for(;_less(*_mm, *_rr);) --_rr; + + if (_ll < _rr) + { /* swap elements */ + if (_ll == _mm) + _mm = _rr; + else + if (_rr == _mm) + _mm = _ll; + + std::swap(*_ll, + *_rr) ; + } + if (_ll <= _rr) + { /* shrink bounds */ + ++_ll; --_rr ; + } + } + + //if (_mm == _kk) break ; + + if (_kk < _rr) _tt = _rr; + else + if (_kk > _ll) _hh = _ll; + else + { + _hh = _rr+1; _tt = _ll-1; + } + } + while (true) ; + } + } diff --git a/external/jigsaw/src/libcpp/allocators.hpp b/external/jigsaw/src/libcpp/allocators.hpp index 7f7e57a..7f91a32 100644 --- a/external/jigsaw/src/libcpp/allocators.hpp +++ b/external/jigsaw/src/libcpp/allocators.hpp @@ -22,12 +22,16 @@ * how they can obtain it for free, then you are not * required to make any arrangement with me.) * - * Disclaimer: Neither I nor: Columbia University, The - * Massachusetts Institute of Technology, The - * University of Sydney, nor The National Aeronautics - * and Space Administration warrant this code in any - * way whatsoever. This code is provided "as-is" to be - * used at your own risk. + * Disclaimer: Neither I nor THE CONTRIBUTORS warrant + * this code in any way whatsoever. This code is + * provided "as-is" to be used at your own risk. + * + * THE CONTRIBUTORS include: + * (a) The University of Sydney + * (b) The Massachusetts Institute of Technology + * (c) Columbia University + * (d) The National Aeronautics & Space Administration + * (e) Los Alamos National Laboratory * ------------------------------------------------------------ * diff --git a/external/jigsaw/src/libcpp/allocators/alloc_base.hpp b/external/jigsaw/src/libcpp/allocators/alloc_base.hpp index 75f3d5c..bd78a9b 100644 --- a/external/jigsaw/src/libcpp/allocators/alloc_base.hpp +++ b/external/jigsaw/src/libcpp/allocators/alloc_base.hpp @@ -29,12 +29,16 @@ * how they can obtain it for free, then you are not * required to make any arrangement with me.) * - * Disclaimer: Neither I nor: Columbia University, The - * Massachusetts Institute of Technology, The - * University of Sydney, nor The National Aeronautics - * and Space Administration warrant this code in any - * way whatsoever. This code is provided "as-is" to be - * used at your own risk. + * Disclaimer: Neither I nor THE CONTRIBUTORS warrant + * this code in any way whatsoever. This code is + * provided "as-is" to be used at your own risk. + * + * THE CONTRIBUTORS include: + * (a) The University of Sydney + * (b) The Massachusetts Institute of Technology + * (c) Columbia University + * (d) The National Aeronautics & Space Administration + * (e) Los Alamos National Laboratory * -------------------------------------------------------- * diff --git a/external/jigsaw/src/libcpp/allocators/alloc_item.hpp b/external/jigsaw/src/libcpp/allocators/alloc_item.hpp index b9c1727..6371849 100644 --- a/external/jigsaw/src/libcpp/allocators/alloc_item.hpp +++ b/external/jigsaw/src/libcpp/allocators/alloc_item.hpp @@ -29,16 +29,20 @@ * how they can obtain it for free, then you are not * required to make any arrangement with me.) * - * Disclaimer: Neither I nor: Columbia University, The - * Massachusetts Institute of Technology, The - * University of Sydney, nor The National Aeronautics - * and Space Administration warrant this code in any - * way whatsoever. This code is provided "as-is" to be - * used at your own risk. + * Disclaimer: Neither I nor THE CONTRIBUTORS warrant + * this code in any way whatsoever. This code is + * provided "as-is" to be used at your own risk. + * + * THE CONTRIBUTORS include: + * (a) The University of Sydney + * (b) The Massachusetts Institute of Technology + * (c) Columbia University + * (d) The National Aeronautics & Space Administration + * (e) Los Alamos National Laboratory * -------------------------------------------------------- * - * Last updated: 06 September, 2018 + * Last updated: 06 Sept., 2018 * * Copyright 2013-2018 * Darren Engwirda diff --git a/external/jigsaw/src/libcpp/allocators/alloc_pool.hpp b/external/jigsaw/src/libcpp/allocators/alloc_pool.hpp index 68c839d..0f03078 100644 --- a/external/jigsaw/src/libcpp/allocators/alloc_pool.hpp +++ b/external/jigsaw/src/libcpp/allocators/alloc_pool.hpp @@ -32,12 +32,16 @@ * how they can obtain it for free, then you are not * required to make any arrangement with me.) * - * Disclaimer: Neither I nor: Columbia University, The - * Massachusetts Institute of Technology, The - * University of Sydney, nor The National Aeronautics - * and Space Administration warrant this code in any - * way whatsoever. This code is provided "as-is" to be - * used at your own risk. + * Disclaimer: Neither I nor THE CONTRIBUTORS warrant + * this code in any way whatsoever. This code is + * provided "as-is" to be used at your own risk. + * + * THE CONTRIBUTORS include: + * (a) The University of Sydney + * (b) The Massachusetts Institute of Technology + * (c) Columbia University + * (d) The National Aeronautics & Space Administration + * (e) Los Alamos National Laboratory * -------------------------------------------------------- * diff --git a/external/jigsaw/src/libcpp/allocators/alloc_wrap.hpp b/external/jigsaw/src/libcpp/allocators/alloc_wrap.hpp index 5eb8404..81ff04a 100644 --- a/external/jigsaw/src/libcpp/allocators/alloc_wrap.hpp +++ b/external/jigsaw/src/libcpp/allocators/alloc_wrap.hpp @@ -30,12 +30,16 @@ * how they can obtain it for free, then you are not * required to make any arrangement with me.) * - * Disclaimer: Neither I nor: Columbia University, The - * Massachusetts Institute of Technology, The - * University of Sydney, nor The National Aeronautics - * and Space Administration warrant this code in any - * way whatsoever. This code is provided "as-is" to be - * used at your own risk. + * Disclaimer: Neither I nor THE CONTRIBUTORS warrant + * this code in any way whatsoever. This code is + * provided "as-is" to be used at your own risk. + * + * THE CONTRIBUTORS include: + * (a) The University of Sydney + * (b) The Massachusetts Institute of Technology + * (c) Columbia University + * (d) The National Aeronautics & Space Administration + * (e) Los Alamos National Laboratory * -------------------------------------------------------- * diff --git a/external/jigsaw/src/libcpp/basebase.hpp b/external/jigsaw/src/libcpp/basebase.hpp index d62e11b..277b793 100644 --- a/external/jigsaw/src/libcpp/basebase.hpp +++ b/external/jigsaw/src/libcpp/basebase.hpp @@ -22,16 +22,20 @@ * how they can obtain it for free, then you are not * required to make any arrangement with me.) * - * Disclaimer: Neither I nor: Columbia University, The - * Massachusetts Institute of Technology, The - * University of Sydney, nor The National Aeronautics - * and Space Administration warrant this code in any - * way whatsoever. This code is provided "as-is" to be - * used at your own risk. + * Disclaimer: Neither I nor THE CONTRIBUTORS warrant + * this code in any way whatsoever. This code is + * provided "as-is" to be used at your own risk. + * + * THE CONTRIBUTORS include: + * (a) The University of Sydney + * (b) The Massachusetts Institute of Technology + * (c) Columbia University + * (d) The National Aeronautics & Space Administration + * (e) Los Alamos National Laboratory * ------------------------------------------------------------ * - * Last updated: 02 March, 2020 + * Last updated: 02 Mar., 2020 * * Copyright 2013-2020 * Darren Engwirda diff --git a/external/jigsaw/src/libcpp/containers.hpp b/external/jigsaw/src/libcpp/containers.hpp index 31e6b6f..2e2d46f 100644 --- a/external/jigsaw/src/libcpp/containers.hpp +++ b/external/jigsaw/src/libcpp/containers.hpp @@ -22,16 +22,20 @@ * how they can obtain it for free, then you are not * required to make any arrangement with me.) * - * Disclaimer: Neither I nor: Columbia University, The - * Massachusetts Institute of Technology, The - * University of Sydney, nor The National Aeronautics - * and Space Administration warrant this code in any - * way whatsoever. This code is provided "as-is" to be - * used at your own risk. + * Disclaimer: Neither I nor THE CONTRIBUTORS warrant + * this code in any way whatsoever. This code is + * provided "as-is" to be used at your own risk. + * + * THE CONTRIBUTORS include: + * (a) The University of Sydney + * (b) The Massachusetts Institute of Technology + * (c) Columbia University + * (d) The National Aeronautics & Space Administration + * (e) Los Alamos National Laboratory * ------------------------------------------------------------ * - * Last updated: 21 December, 2018 + * Last updated: 21 Dec., 2018 * * Copyright 2013-2018 * Darren Engwirda @@ -72,6 +76,7 @@ # include "containers/priorityset.hpp" # include "containers/prioritymap.hpp" +# include "containers/priorityidx.hpp" # endif//__CONTAINERS__ diff --git a/external/jigsaw/src/libcpp/containers/array.hpp b/external/jigsaw/src/libcpp/containers/array.hpp index 5b89fe7..904c3f4 100644 --- a/external/jigsaw/src/libcpp/containers/array.hpp +++ b/external/jigsaw/src/libcpp/containers/array.hpp @@ -32,16 +32,20 @@ * how they can obtain it for free, then you are not * required to make any arrangement with me.) * - * Disclaimer: Neither I nor: Columbia University, The - * Massachusetts Institute of Technology, The - * University of Sydney, nor The National Aeronautics - * and Space Administration warrant this code in any - * way whatsoever. This code is provided "as-is" to be - * used at your own risk. + * Disclaimer: Neither I nor THE CONTRIBUTORS warrant + * this code in any way whatsoever. This code is + * provided "as-is" to be used at your own risk. + * + * THE CONTRIBUTORS include: + * (a) The University of Sydney + * (b) The Massachusetts Institute of Technology + * (c) Columbia University + * (d) The National Aeronautics & Space Administration + * (e) Los Alamos National Laboratory * ------------------------------------------------------------ * - * Last updated: 27 April, 2020 + * Last updated: 27 Apr., 2020 * * Copyright 2013-2020 * Darren Engwirda diff --git a/external/jigsaw/src/libcpp/containers/array_iter.hpp b/external/jigsaw/src/libcpp/containers/array_iter.hpp index cf0cb97..67f1185 100644 --- a/external/jigsaw/src/libcpp/containers/array_iter.hpp +++ b/external/jigsaw/src/libcpp/containers/array_iter.hpp @@ -32,12 +32,16 @@ * how they can obtain it for free, then you are not * required to make any arrangement with me.) * - * Disclaimer: Neither I nor: Columbia University, The - * Massachusetts Institute of Technology, The - * University of Sydney, nor The National Aeronautics - * and Space Administration warrant this code in any - * way whatsoever. This code is provided "as-is" to be - * used at your own risk. + * Disclaimer: Neither I nor THE CONTRIBUTORS warrant + * this code in any way whatsoever. This code is + * provided "as-is" to be used at your own risk. + * + * THE CONTRIBUTORS include: + * (a) The University of Sydney + * (b) The Massachusetts Institute of Technology + * (c) Columbia University + * (d) The National Aeronautics & Space Administration + * (e) Los Alamos National Laboratory * ------------------------------------------------------------ * diff --git a/external/jigsaw/src/libcpp/containers/arraylist.hpp b/external/jigsaw/src/libcpp/containers/arraylist.hpp index 5bf8f9d..84e7cfb 100644 --- a/external/jigsaw/src/libcpp/containers/arraylist.hpp +++ b/external/jigsaw/src/libcpp/containers/arraylist.hpp @@ -28,16 +28,20 @@ * how they can obtain it for free, then you are not * required to make any arrangement with me.) * - * Disclaimer: Neither I nor: Columbia University, The - * Massachusetts Institute of Technology, The - * University of Sydney, nor The National Aeronautics - * and Space Administration warrant this code in any - * way whatsoever. This code is provided "as-is" to be - * used at your own risk. + * Disclaimer: Neither I nor THE CONTRIBUTORS warrant + * this code in any way whatsoever. This code is + * provided "as-is" to be used at your own risk. + * + * THE CONTRIBUTORS include: + * (a) The University of Sydney + * (b) The Massachusetts Institute of Technology + * (c) Columbia University + * (d) The National Aeronautics & Space Administration + * (e) Los Alamos National Laboratory * ------------------------------------------------------------ * - * Last updated: 11 April, 2018 + * Last updated: 11 Apr., 2018 * * Copyright 2013-2018 * Darren Engwirda @@ -332,7 +336,7 @@ ) { /*------------------------------ clear lists of items */ - this-> empty(_kind) ; + this-> empty() ; /*------------------------------ resize backing array */ this->_lptr .clear(_kind) ; } diff --git a/external/jigsaw/src/libcpp/containers/basic_stack.hpp b/external/jigsaw/src/libcpp/containers/basic_stack.hpp index 2153dfa..4d60e89 100644 --- a/external/jigsaw/src/libcpp/containers/basic_stack.hpp +++ b/external/jigsaw/src/libcpp/containers/basic_stack.hpp @@ -30,16 +30,20 @@ * how they can obtain it for free, then you are not * required to make any arrangement with me.) * - * Disclaimer: Neither I nor: Columbia University, The - * Massachusetts Institute of Technology, The - * University of Sydney, nor The National Aeronautics - * and Space Administration warrant this code in any - * way whatsoever. This code is provided "as-is" to be - * used at your own risk. + * Disclaimer: Neither I nor THE CONTRIBUTORS warrant + * this code in any way whatsoever. This code is + * provided "as-is" to be used at your own risk. + * + * THE CONTRIBUTORS include: + * (a) The University of Sydney + * (b) The Massachusetts Institute of Technology + * (c) Columbia University + * (d) The National Aeronautics & Space Administration + * (e) Los Alamos National Laboratory * ------------------------------------------------------------ * - * Last updated: 21 December, 2018 + * Last updated: 21 Dec., 2018 * * Copyright 2013-2018 * Darren Engwirda diff --git a/external/jigsaw/src/libcpp/containers/block_array.hpp b/external/jigsaw/src/libcpp/containers/block_array.hpp index 35f853e..7bff094 100644 --- a/external/jigsaw/src/libcpp/containers/block_array.hpp +++ b/external/jigsaw/src/libcpp/containers/block_array.hpp @@ -34,16 +34,20 @@ * how they can obtain it for free, then you are not * required to make any arrangement with me.) * - * Disclaimer: Neither I nor: Columbia University, The - * Massachusetts Institute of Technology, The - * University of Sydney, nor The National Aeronautics - * and Space Administration warrant this code in any - * way whatsoever. This code is provided "as-is" to be - * used at your own risk. + * Disclaimer: Neither I nor THE CONTRIBUTORS warrant + * this code in any way whatsoever. This code is + * provided "as-is" to be used at your own risk. + * + * THE CONTRIBUTORS include: + * (a) The University of Sydney + * (b) The Massachusetts Institute of Technology + * (c) Columbia University + * (d) The National Aeronautics & Space Administration + * (e) Los Alamos National Laboratory * ------------------------------------------------------------ * - * Last updated: 27 April, 2020 + * Last updated: 27 Apr., 2020 * * Copyright 2013-2020 * Darren Engwirda diff --git a/external/jigsaw/src/libcpp/containers/block_iter.hpp b/external/jigsaw/src/libcpp/containers/block_iter.hpp index d658e4a..4c4eacf 100644 --- a/external/jigsaw/src/libcpp/containers/block_iter.hpp +++ b/external/jigsaw/src/libcpp/containers/block_iter.hpp @@ -34,16 +34,20 @@ * how they can obtain it for free, then you are not * required to make any arrangement with me.) * - * Disclaimer: Neither I nor: Columbia University, The - * Massachusetts Institute of Technology, The - * University of Sydney, nor The National Aeronautics - * and Space Administration warrant this code in any - * way whatsoever. This code is provided "as-is" to be - * used at your own risk. + * Disclaimer: Neither I nor THE CONTRIBUTORS warrant + * this code in any way whatsoever. This code is + * provided "as-is" to be used at your own risk. + * + * THE CONTRIBUTORS include: + * (a) The University of Sydney + * (b) The Massachusetts Institute of Technology + * (c) Columbia University + * (d) The National Aeronautics & Space Administration + * (e) Los Alamos National Laboratory * ------------------------------------------------------------ * - * Last updated: 03 July, 2019 + * Last updated: 03 Jul., 2019 * * Copyright 2013-2019 * Darren Engwirda diff --git a/external/jigsaw/src/libcpp/containers/double_list.hpp b/external/jigsaw/src/libcpp/containers/double_list.hpp index 56bf71f..676537c 100644 --- a/external/jigsaw/src/libcpp/containers/double_list.hpp +++ b/external/jigsaw/src/libcpp/containers/double_list.hpp @@ -30,12 +30,16 @@ * how they can obtain it for free, then you are not * required to make any arrangement with me.) * - * Disclaimer: Neither I nor: Columbia University, The - * Massachusetts Institute of Technology, The - * University of Sydney, nor The National Aeronautics - * and Space Administration warrant this code in any - * way whatsoever. This code is provided "as-is" to be - * used at your own risk. + * Disclaimer: Neither I nor THE CONTRIBUTORS warrant + * this code in any way whatsoever. This code is + * provided "as-is" to be used at your own risk. + * + * THE CONTRIBUTORS include: + * (a) The University of Sydney + * (b) The Massachusetts Institute of Technology + * (c) Columbia University + * (d) The National Aeronautics & Space Administration + * (e) Los Alamos National Laboratory * ------------------------------------------------------------ * diff --git a/external/jigsaw/src/libcpp/containers/doubleiter.hpp b/external/jigsaw/src/libcpp/containers/doubleiter.hpp index 7e3e5c8..a9fef6d 100644 --- a/external/jigsaw/src/libcpp/containers/doubleiter.hpp +++ b/external/jigsaw/src/libcpp/containers/doubleiter.hpp @@ -30,12 +30,16 @@ * how they can obtain it for free, then you are not * required to make any arrangement with me.) * - * Disclaimer: Neither I nor: Columbia University, The - * Massachusetts Institute of Technology, The - * University of Sydney, nor The National Aeronautics - * and Space Administration warrant this code in any - * way whatsoever. This code is provided "as-is" to be - * used at your own risk. + * Disclaimer: Neither I nor THE CONTRIBUTORS warrant + * this code in any way whatsoever. This code is + * provided "as-is" to be used at your own risk. + * + * THE CONTRIBUTORS include: + * (a) The University of Sydney + * (b) The Massachusetts Institute of Technology + * (c) Columbia University + * (d) The National Aeronautics & Space Administration + * (e) Los Alamos National Laboratory * ------------------------------------------------------------ * diff --git a/external/jigsaw/src/libcpp/containers/fixed_array.hpp b/external/jigsaw/src/libcpp/containers/fixed_array.hpp index 9240f71..2db557d 100644 --- a/external/jigsaw/src/libcpp/containers/fixed_array.hpp +++ b/external/jigsaw/src/libcpp/containers/fixed_array.hpp @@ -28,12 +28,16 @@ * how they can obtain it for free, then you are not * required to make any arrangement with me.) * - * Disclaimer: Neither I nor: Columbia University, The - * Massachusetts Institute of Technology, The - * University of Sydney, nor The National Aeronautics - * and Space Administration warrant this code in any - * way whatsoever. This code is provided "as-is" to be - * used at your own risk. + * Disclaimer: Neither I nor THE CONTRIBUTORS warrant + * this code in any way whatsoever. This code is + * provided "as-is" to be used at your own risk. + * + * THE CONTRIBUTORS include: + * (a) The University of Sydney + * (b) The Massachusetts Institute of Technology + * (c) Columbia University + * (d) The National Aeronautics & Space Administration + * (e) Los Alamos National Laboratory * ------------------------------------------------------------ * diff --git a/external/jigsaw/src/libcpp/containers/hashtable.hpp b/external/jigsaw/src/libcpp/containers/hashtable.hpp index 77af72b..a403e1b 100644 --- a/external/jigsaw/src/libcpp/containers/hashtable.hpp +++ b/external/jigsaw/src/libcpp/containers/hashtable.hpp @@ -28,16 +28,20 @@ * how they can obtain it for free, then you are not * required to make any arrangement with me.) * - * Disclaimer: Neither I nor: Columbia University, The - * Massachusetts Institute of Technology, The - * University of Sydney, nor The National Aeronautics - * and Space Administration warrant this code in any - * way whatsoever. This code is provided "as-is" to be - * used at your own risk. + * Disclaimer: Neither I nor THE CONTRIBUTORS warrant + * this code in any way whatsoever. This code is + * provided "as-is" to be used at your own risk. + * + * THE CONTRIBUTORS include: + * (a) The University of Sydney + * (b) The Massachusetts Institute of Technology + * (c) Columbia University + * (d) The National Aeronautics & Space Administration + * (e) Los Alamos National Laboratory * ------------------------------------------------------------ * - * Last updated: 28 April, 2020 + * Last updated: 28 Apr., 2020 * * Copyright 2013-2020 * Darren Engwirda diff --git a/external/jigsaw/src/libcpp/containers/hashtwice.hpp b/external/jigsaw/src/libcpp/containers/hashtwice.hpp index d82d64d..56d6d8c 100644 --- a/external/jigsaw/src/libcpp/containers/hashtwice.hpp +++ b/external/jigsaw/src/libcpp/containers/hashtwice.hpp @@ -31,16 +31,20 @@ * how they can obtain it for free, then you are not * required to make any arrangement with me.) * - * Disclaimer: Neither I nor: Columbia University, The - * Massachusetts Institute of Technology, The - * University of Sydney, nor The National Aeronautics - * and Space Administration warrant this code in any - * way whatsoever. This code is provided "as-is" to be - * used at your own risk. + * Disclaimer: Neither I nor THE CONTRIBUTORS warrant + * this code in any way whatsoever. This code is + * provided "as-is" to be used at your own risk. + * + * THE CONTRIBUTORS include: + * (a) The University of Sydney + * (b) The Massachusetts Institute of Technology + * (c) Columbia University + * (d) The National Aeronautics & Space Administration + * (e) Los Alamos National Laboratory * ------------------------------------------------------------ * - * Last updated: 28 April, 2020 + * Last updated: 28 Apr., 2020 * * Copyright 2013-2020 * Darren Engwirda diff --git a/external/jigsaw/src/libcpp/containers/iter_base.hpp b/external/jigsaw/src/libcpp/containers/iter_base.hpp index 6b5f32f..46c0a7a 100644 --- a/external/jigsaw/src/libcpp/containers/iter_base.hpp +++ b/external/jigsaw/src/libcpp/containers/iter_base.hpp @@ -1,45 +1,49 @@ - /* - -------------------------------------------------------- - * a bit of template meta-magic on iterator types. - -------------------------------------------------------- - * - * This program may be freely redistributed under the - * condition that the copyright notices (including this - * entire header) are not removed, and no compensation - * is received through use of the software. Private, - * research, and institutional use is free. You may - * distribute modified versions of this code UNDER THE - * CONDITION THAT THIS CODE AND ANY MODIFICATIONS MADE - * TO IT IN THE SAME FILE REMAIN UNDER COPYRIGHT OF THE - * ORIGINAL AUTHOR, BOTH SOURCE AND OBJECT CODE ARE - * MADE FREELY AVAILABLE WITHOUT CHARGE, AND CLEAR - * NOTICE IS GIVEN OF THE MODIFICATIONS. Distribution - * of this code as part of a commercial system is - * permissible ONLY BY DIRECT ARRANGEMENT WITH THE - * AUTHOR. (If you are not directly supplying this - * code to a customer, and you are instead telling them - * how they can obtain it for free, then you are not - * required to make any arrangement with me.) - * - * Disclaimer: Neither I nor: Columbia University, The - * Massachusetts Institute of Technology, The - * University of Sydney, nor The National Aeronautics - * and Space Administration warrant this code in any - * way whatsoever. This code is provided "as-is" to be - * used at your own risk. - * - -------------------------------------------------------- - * - * Last updated: 03 May, 2017 - * - * Copyright 2013-2017 - * Darren Engwirda - * d.engwirda@gmail.com - * https://github.com/dengwirda/ - * - -------------------------------------------------------- - */ +/* +------------------------------------------------------------ + * a bit of template meta-magic on iterator types. +------------------------------------------------------------ + * + * This program may be freely redistributed under the + * condition that the copyright notices (including this + * entire header) are not removed, and no compensation + * is received through use of the software. Private, + * research, and institutional use is free. You may + * distribute modified versions of this code UNDER THE + * CONDITION THAT THIS CODE AND ANY MODIFICATIONS MADE + * TO IT IN THE SAME FILE REMAIN UNDER COPYRIGHT OF THE + * ORIGINAL AUTHOR, BOTH SOURCE AND OBJECT CODE ARE + * MADE FREELY AVAILABLE WITHOUT CHARGE, AND CLEAR + * NOTICE IS GIVEN OF THE MODIFICATIONS. Distribution + * of this code as part of a commercial system is + * permissible ONLY BY DIRECT ARRANGEMENT WITH THE + * AUTHOR. (If you are not directly supplying this + * code to a customer, and you are instead telling them + * how they can obtain it for free, then you are not + * required to make any arrangement with me.) + * + * Disclaimer: Neither I nor THE CONTRIBUTORS warrant + * this code in any way whatsoever. This code is + * provided "as-is" to be used at your own risk. + * + * THE CONTRIBUTORS include: + * (a) The University of Sydney + * (b) The Massachusetts Institute of Technology + * (c) Columbia University + * (d) The National Aeronautics & Space Administration + * (e) Los Alamos National Laboratory + * +------------------------------------------------------------ + * + * Last updated: 03 May, 2017 + * + * Copyright 2013-2017 + * Darren Engwirda + * d.engwirda@gmail.com + * https://github.com/dengwirda/ + * +------------------------------------------------------------ + */ # pragma once diff --git a/external/jigsaw/src/libcpp/containers/priorityidx.hpp b/external/jigsaw/src/libcpp/containers/priorityidx.hpp new file mode 100644 index 0000000..1948807 --- /dev/null +++ b/external/jigsaw/src/libcpp/containers/priorityidx.hpp @@ -0,0 +1,737 @@ + +/* +------------------------------------------------------------ + * an "n-ary"-heap based priority queue. +------------------------------------------------------------ + * + * PRIORITY-IDX utilises an "n-ary" heap data-structure, + * designed to maintain sorted precedence in mutable + * collections. This "n-ary" heap simply generalises + * a standard binary heap (i.e. a 2-heap) to trees with + * "n" children per level. + * +------------------------------------------------------------ + * + * This program may be freely redistributed under the + * condition that the copyright notices (including this + * entire header) are not removed, and no compensation + * is received through use of the software. Private, + * research, and institutional use is free. You may + * distribute modified versions of this code UNDER THE + * CONDITION THAT THIS CODE AND ANY MODIFICATIONS MADE + * TO IT IN THE SAME FILE REMAIN UNDER COPYRIGHT OF THE + * ORIGINAL AUTHOR, BOTH SOURCE AND OBJECT CODE ARE + * MADE FREELY AVAILABLE WITHOUT CHARGE, AND CLEAR + * NOTICE IS GIVEN OF THE MODIFICATIONS. Distribution + * of this code as part of a commercial system is + * permissible ONLY BY DIRECT ARRANGEMENT WITH THE + * AUTHOR. (If you are not directly supplying this + * code to a customer, and you are instead telling them + * how they can obtain it for free, then you are not + * required to make any arrangement with me.) + * + * Disclaimer: Neither I nor THE CONTRIBUTORS warrant + * this code in any way whatsoever. This code is + * provided "as-is" to be used at your own risk. + * + * THE CONTRIBUTORS include: + * (a) The University of Sydney + * (b) The Massachusetts Institute of Technology + * (c) Columbia University + * (d) The National Aeronautics & Space Administration + * (e) Los Alamos National Laboratory + * +------------------------------------------------------------ + * + * Last updated: 15 Jun., 2022 + * + * Copyright 2013-2022 + * Darren Engwirda + * d.engwirda@gmail.com + * https://github.com/dengwirda/ + * +------------------------------------------------------------ + */ + +# pragma once + +# ifndef __PRIORITY_IDX__ +# define __PRIORITY_IDX__ + +# include "array.hpp" + + namespace containers { + +# define __cont containers + + template < + typename T , + typename I + > + class _idx_pair + { +/*----------- local data-pair for an indexed "n"-ary heap */ + public : + typedef T data_type ; + typedef I iptr_type ; + + public : + data_type _data ; // heap data + iptr_type _kidx ; // keys idx. + } ; + +# define D _idx_pair + + template < + typename T , + typename K , + typename P = std::less , + typename A = allocators::basic_alloc , + typename C = containers::array + > + class priorityidx + { +/*----------- a dynamic priority queue as an "n"-ary heap */ + public : + + #undef D + + typedef T data_type ; + typedef K iptr_type ; + typedef C container ; + typedef P pred_type ; + typedef A allocator ; + + typedef containers::priorityidx < + data_type , + iptr_type , + pred_type , + allocator , + container > self_type ; + + typedef typename + container::data_type pair_type ; + typedef typename + container::size_type size_type ; + + typedef typename + container::_write_it _write_it ; + typedef typename + container::_const_it _const_it ; + + typedef containers::array < + iptr_type , + allocator > iptr_list ; + + size_type static constexpr _nfan = +8 ; // fan out + + public : + + container _heap ; + + iptr_list _keys ; + + pred_type _pred ; + + public : + +/*------------- helper - set "null" item marker as maxint */ + __static_call + __inline_call iptr_type const null ( + ) + { return std::numeric_limits::max() ; + } + + private : + +/*------------- helper - push "hole" into sorted position */ + __normal_call _write_it push_upper ( + _write_it _head, + _write_it _ipos, + data_type const&_data + ) + { + for (; _ipos != _head ; ) + { + /*----------------------- find position of parent */ + _write_it _ppos = + _head + (_ipos-_head-1) / _nfan; + /*----------------------- swap parent with "hole" */ + if (this->_pred(_data,_ppos->_data)) + { + /*------------------ update heap-keys mapping */ + _ipos->_data = + std::move(_ppos->_data); + _ipos->_kidx = + std::move(_ppos->_kidx); + /*------------------ update keys-heap mapping */ + this->_keys [_ipos->_kidx] = + (iptr_type)(_ipos- _head) ; + /*------------------ traverse to upper levels */ + _ipos =_ppos ; + } + else break ; + } + + return (_ipos) ; + } + +/*------------- helper - push "hole" into sorted position */ + __normal_call _write_it push_lower ( + _write_it _head, + _write_it _tail, + _write_it _ipos, + data_type const&_data + ) + { + if (_head == _tail) return _ipos ; + /*-- find position of root of last partial (sub)-tree */ + _write_it _cpos ; + _write_it _imin ; + _write_it _iend = _head; + if (_tail - _head > 0) + { + _iend = + _head + (_tail-_head-1) / _nfan ; + } + /*-- push "hole" into sorted position on lower levels */ + for ( ; _ipos < _iend; ) + { + /*---------------------------- pos of right child */ + _cpos = _head + + _nfan * (_ipos - _head) + _nfan ; + /*---------------------------- find minimum child */ + _imin = _cpos; + switch (_nfan) + { + case 8 : + if (this->_pred((--_cpos)->_data , + _imin ->_data)) + _imin=_cpos; // falls through + case 7 : + if (this->_pred((--_cpos)->_data , + _imin ->_data)) + _imin=_cpos; // falls through + case 6 : + if (this->_pred((--_cpos)->_data , + _imin ->_data)) + _imin=_cpos; // falls through + case 5 : + if (this->_pred((--_cpos)->_data , + _imin ->_data)) + _imin=_cpos; // falls through + case 4 : + if (this->_pred((--_cpos)->_data , + _imin ->_data)) + _imin=_cpos; // falls through + case 3 : + if (this->_pred((--_cpos)->_data , + _imin ->_data)) + _imin=_cpos; // falls through + case 2 : + if (this->_pred((--_cpos)->_data , + _imin ->_data)) + _imin=_cpos; // falls through + } + /*---------------------- update heap-keys mapping */ + _ipos->_data = + std::move(_imin->_data); + _ipos->_kidx = + std::move(_imin->_kidx); + /*---------------------- update keys-heap mapping */ + this->_keys [_ipos->_kidx] = + (iptr_type)(_ipos- _head) ; + /*---------------------- move onto next child pos */ + _ipos =_imin ; + } + + /*-- deal with special case - last partial sub - tree */ + if (_ipos == _iend) + { + size_type _inum = + _tail-_head-_nfan*(_ipos-_head); + if (_inum > +0) + { + /*---------------------------- pos of right child */ + _cpos = _head + + _nfan * (_ipos -_head) + _inum ; + /*---------------------------- find minimum child */ + _imin = _cpos; + switch (_inum) + { + case 8 : + if (this->_pred((--_cpos)->_data , + _imin ->_data)) + _imin=_cpos; // falls through + case 7 : + if (this->_pred((--_cpos)->_data , + _imin ->_data)) + _imin=_cpos; // falls through + case 6 : + if (this->_pred((--_cpos)->_data , + _imin ->_data)) + _imin=_cpos; // falls through + case 5 : + if (this->_pred((--_cpos)->_data , + _imin ->_data)) + _imin=_cpos; // falls through + case 4 : + if (this->_pred((--_cpos)->_data , + _imin ->_data)) + _imin=_cpos; // falls through + case 3 : + if (this->_pred((--_cpos)->_data , + _imin ->_data)) + _imin=_cpos; // falls through + case 2 : + if (this->_pred((--_cpos)->_data , + _imin ->_data)) + _imin=_cpos; // falls through + } + /*---------------------- update heap-keys mapping */ + _ipos->_data = + std::move(_imin->_data); + _ipos->_kidx = + std::move(_imin->_kidx); + /*---------------------- update keys-heap mapping */ + this->_keys [_ipos->_kidx] = + (iptr_type)(_ipos- _head) ; + /*---------------------- move onto next child pos */ + _ipos =_imin ; + } + } + + /*--- push "hole" into final position sorted position */ + return push_upper(_head, _ipos, _data) ; + } + + public : + +/*--------------------------- default c'tor - do nothing! */ + __inline_call priorityidx ( + allocator const&_asrc = allocator(), + pred_type const&_psrc = pred_type() + ) : _heap(_asrc), + _keys(_asrc), + _pred(_psrc) {} + +/*--------------------------- default c'tor - initialisor */ + __inline_call priorityidx ( + pred_type const&_psrc + ) : _heap(allocator()), + _keys(allocator()), + _pred(_psrc) {} + + __inline_call~priorityidx() = default ; + + __inline_call priorityidx ( + self_type const&_src + ) = default ; + __inline_call priorityidx ( + self_type && _src + ) = default ; + + __inline_call + self_type & operator= ( + self_type const&_src + ) = default ; + __inline_call + self_type & operator= ( + self_type && _src + ) = default ; + +/*------------------------------------- peek at heap root */ + + __inline_call data_type const& root ( + ) const + { return this->_heap[ +0 ]._data ; + } + +/*------------------------------------- peek at heap item */ + __inline_call data_type const& peek ( + size_type _hpos = +0 + ) const + { return this->_heap[_hpos]._data ; + } + +/*------------------------------------- peek at item idx. */ + __inline_call iptr_type const keys ( + size_type _kpos = +0 + ) const + { return this->_keys[_kpos] ; + } + +/*-------------------------------------------- empty test */ + __inline_call bool_type empty ( + ) const + { return ( this->_heap. empty() ) ; + } + +/*-------------------------------------------- heap count */ + __inline_call size_type count ( + ) const + { return ( this->_heap. count() ) ; + } + +/*-------------------------------------------- heap alloc */ + __inline_call size_type alloc ( + ) const + { return ( this->_heap. alloc() ) ; + } + +/*-------------------------------------------- _set alloc */ + __inline_call size_type set_alloc ( + size_type _asiz + ) + { this->_heap.set_alloc( _asiz) ; + } + +/*------------------------------------- (const) iterators */ + __inline_call _const_it head ( + ) const + { return this->_heap. head() ; + } + __inline_call _const_it tail ( + ) const + { return this->_heap. tail() ; + } + __inline_call _const_it hend ( + ) const + { return this->_heap. hend() ; + } + __inline_call _const_it tend ( + ) const + { return this->_heap. tend() ; + } + + /* + -------------------------------------------------------- + * PUSH: push data onto heap + -------------------------------------------------------- + */ + + __inline_call void_type push ( // copy + iptr_type _kpos, + data_type const&_data + ) + {/*---------------- make room for new item in mapping */ + iptr_type _size = + (iptr_type) this->_keys .count() ; + if (_size <= _kpos) + this->_keys.set_count( + _kpos + 1 , + containers::loose_alloc, null()); + + if (this->_keys[_kpos] != null()) + throw std::invalid_argument( + "priorityidx.push: key in use") ; + + /*----------------- push _data onto tail of container */ + size_type _tpos = + this->_heap.push_tail() ; + /*----------------- sort corresponding "hole" to pos. */ + _write_it _ipos = push_upper ( + this->_heap.head() , + this->_heap.head() + _tpos , + __copy(data_type, _data)) ; + + /*------------------------- copy new data into "hole" */ + _ipos->_kidx = _kpos ; + _ipos->_data = + __copy(data_type, _data) ; + + /*------------------------- map _item to _data "hole" */ + this->_keys[_kpos] = + (iptr_type)( + _ipos - this->_heap.head()) ; + } + + __inline_call void_type push ( // move + iptr_type _kpos, + data_type && _data + ) + {/*---------------- make room for new item in mapping */ + iptr_type _size = + (iptr_type) this->_keys .count() ; + if (_size <= _kpos) + this->_keys.set_count( + _kpos + 1 , + containers::loose_alloc, null()); + + if (this->_keys[_kpos] != null()) + throw std::invalid_argument( + "priorityidx.push: key in use") ; + + /*----------------- push _data onto tail of container */ + size_type _tpos = + this->_heap.push_tail() ; + /*----------------- sort corresponding "hole" to pos. */ + _write_it _ipos = push_upper ( + this->_heap.head() , + this->_heap.head() + _tpos , + __copy(data_type, _data)) ; + + /*------------------------- move new data into "hole" */ + _ipos->_kidx = _kpos ; + _ipos->_data = + __move(data_type, _data) ; + + /*------------------------- map _item to _data "hole" */ + this->_keys[_kpos] = + (iptr_type)( + _ipos - this->_heap.head()) ; + } + + /* + -------------------------------------------------------- + * _POP: _pop data from heap + -------------------------------------------------------- + */ + + __inline_call void_type _pop_root ( + ) + { + /*---------------------------- _pop root, cache temp. */ + data_type _temp ; + _pop( +0, _temp); + } + __inline_call void_type _pop_root ( + iptr_type &_kpos , + data_type &_data + ) + { + /*---------------------------- _pop item, return data */ + size_type _hpos = +0 ; + _kpos = this->_heap[_hpos]._kidx ; + _data = + std::move (this->_heap[_hpos]._data); + /*----------------------- push "hole" to lower levels */ + if (this->_heap.head() + _hpos != + this->_heap.tail() ) + { + /*----------- sort "hole" at root to updated position */ + _write_it _ipos = push_lower ( + this->_heap.head() , + this->_heap.tail() - 1 , + this->_heap.head() + _hpos, + this->_heap.tail()-> _data) ; + + /*----------- copy current tail into updated position */ + _ipos->_data = std::move( + this->_heap.tail()-> _data) ; + _ipos->_kidx = std::move( + this->_heap.tail()-> _kidx) ; + + /*---------------------- update mapping for tail item */ + this->_keys[_ipos->_kidx] = + (iptr_type)( + _ipos - this->_heap.head()); + } + this->_heap._pop_tail(); + + this->_keys[_kpos] = null() ; + } + + __inline_call void_type _pop ( + iptr_type _kpos + ) + { + /*---------------------------- _pop data, cache temp. */ + data_type _temp ; + _pop(_kpos,_temp); + } + __normal_call void_type _pop ( + iptr_type _kpos , + data_type &_data + ) + { + if (this->_keys[_kpos] == null()) + return ; + /*---------------------------- _pop item, return data */ + size_type _hpos = this->_keys[_kpos]; + _data = + std::move (this->_heap[_hpos]._data); + /*----------------------- push "hole" to lower levels */ + if (this->_heap.head() + _hpos != + this->_heap.tail() ) + { + /*----------- sort "hole" at root to updated position */ + _write_it _ipos = push_lower ( + this->_heap.head() , + this->_heap.tail() - 1 , + this->_heap.head() + _hpos, + this->_heap.tail()-> _data) ; + + /*----------- copy current tail into updated position */ + _ipos->_data = std::move( + this->_heap.tail()-> _data) ; + _ipos->_kidx = std::move( + this->_heap.tail()-> _kidx) ; + + /*---------------------- update mapping for tail item */ + this->_keys[_ipos->_kidx] = + (iptr_type)( + _ipos - this->_heap.head()); + } + this->_heap._pop_tail(); + + this->_keys[_kpos] = null() ; + } + + /* + -------------------------------------------------------- + * UPDATE: update data in heap + -------------------------------------------------------- + */ + + __inline_call void_type update ( // copy + iptr_type _kpos, + data_type const&_data + ) + {/*------------------ move "hole" to updated position */ + size_type _hpos = + this->_keys[_kpos]; + _write_it _ipos = + this->_heap.tend(); + + /*------------------------ push "hole" to lower level */ + _ipos = push_lower ( + this-> _heap.head(), + this-> _heap.tail(), + this-> _heap.head()+_hpos , + __copy(data_type,_data)) ; + + /*------------------------ copy this data into "hole" */ + _ipos->_kidx = _kpos ; + _ipos->_data = + __copy(data_type,_data) ; + + /*------------------------ copy position into mapping */ + this->_keys[_kpos] = + (iptr_type) + _ipos - this->_heap.head() ; + } + + __inline_call void_type update ( // move + iptr_type _kpos, + data_type &&_data + ) + {/*------------------ move "hole" to updated position */ + size_type _hpos = + this->_keys[_kpos]; + _write_it _ipos = + this->_heap.tend(); + + /*------------------------ push "hole" to lower level */ + _ipos = push_lower ( + this-> _heap.head(), + this-> _heap.tail(), + this-> _heap.head()+_hpos , + __copy(data_type,_data)) ; + + /*------------------------ copy this data into "hole" */ + _ipos->_kidx = _kpos ; + _ipos->_data = + __move(data_type,_data) ; + + /*------------------------ copy position into mapping */ + this->_keys[_kpos] = + (iptr_type)( + _ipos - this->_heap.head()) ; + } + + /* + -------------------------------------------------------- + * REDUCE: update data in heap ("lower" priority) + -------------------------------------------------------- + */ + + __inline_call void_type reduce ( // copy + iptr_type _kpos, + data_type const&_data + ) + {/*------------------ move "hole" to updated position */ + size_type _hpos = + this->_keys[_kpos]; + _write_it _ipos = push_upper ( + this->_heap.head(), + this->_heap.head()+_hpos , + __copy(data_type,_data)) ; + + /*------------------------ copy this data into "hole" */ + _ipos->_kidx = _kpos ; + _ipos->_data = + __copy(data_type,_data) ; + + /*------------------------ copy position into mapping */ + this->_keys[_kpos] = + (iptr_type)( + _ipos - this->_heap.head()) ; + } + + __inline_call void_type reduce ( // move + iptr_type _kpos, + data_type &&_data + ) + {/*------------------ move "hole" to updated position */ + size_type _hpos = + this->_keys[_kpos]; + _write_it _ipos = push_upper ( + this->_heap.head(), + this->_heap.head()+_hpos , + __copy(data_type,_data)) ; + + /*------------------------ copy this data into "hole" */ + _ipos->_kidx = _kpos ; + _ipos->_data = + __move(data_type,_data) ; + + /*------------------------ copy position into mapping */ + this->_keys[_kpos] = + (iptr_type)( + _ipos - this->_heap.head()) ; + } + + /* + -------------------------------------------------------- + * test heap validity (debug only!) + -------------------------------------------------------- + */ + + __normal_call bool_type test_heap ( + ) + { +# ifdef _DEBUG + /*------------------ test relationships for all nodes */ + size_type _ipos = +1 ; + size_type _iend = + this->_heap.count () ; + for ( ; _ipos < _iend; ++_ipos) + { + /*------------------ heap is invalid if lower < upper */ + size_type _ppos = + (_ipos - 1)/_nfan ; + + if (this->_pred( + this->_heap[_ipos]._data, + this->_heap[_ppos]._data + ) ) + return false ; + } +# endif + + /*------------------ must be valid if we got this far */ + return true ; + } + + } ; + +# undef __cont + + + } + +# endif //__PRIORITY_IDX__ + + + diff --git a/external/jigsaw/src/libcpp/containers/prioritymap.hpp b/external/jigsaw/src/libcpp/containers/prioritymap.hpp index d3e0515..1ce5e74 100644 --- a/external/jigsaw/src/libcpp/containers/prioritymap.hpp +++ b/external/jigsaw/src/libcpp/containers/prioritymap.hpp @@ -30,18 +30,22 @@ * how they can obtain it for free, then you are not * required to make any arrangement with me.) * - * Disclaimer: Neither I nor: Columbia University, The - * Massachusetts Institute of Technology, The - * University of Sydney, nor The National Aeronautics - * and Space Administration warrant this code in any - * way whatsoever. This code is provided "as-is" to be - * used at your own risk. + * Disclaimer: Neither I nor THE CONTRIBUTORS warrant + * this code in any way whatsoever. This code is + * provided "as-is" to be used at your own risk. + * + * THE CONTRIBUTORS include: + * (a) The University of Sydney + * (b) The Massachusetts Institute of Technology + * (c) Columbia University + * (d) The National Aeronautics & Space Administration + * (e) Los Alamos National Laboratory * ------------------------------------------------------------ * - * Last updated: 25 April, 2020 + * Last updated: 30 Mar., 2022 * - * Copyright 2013-2020 + * Copyright 2013-2022 * Darren Engwirda * d.engwirda@gmail.com * https://github.com/dengwirda/ @@ -64,7 +68,7 @@ typename T , typename K > - class heap_pair + class _map_pair { /*----------- local data-pair for an indexed "n"-ary heap */ public : @@ -76,7 +80,7 @@ kptr_type _kptr ; // keys iptr } ; -# define D heap_pair +# define D _map_pair template < typename T , @@ -123,7 +127,7 @@ size_type , allocator > free_list ; - size_type static constexpr _nfan = +4 ; // fan out + size_type static constexpr _nfan = +8 ; // fan out public : @@ -574,16 +578,9 @@ this->_keys[_kptr]; _write_it _ipos = this->_heap.tend(); - if (this->_pred(_data , - this->_heap[_hpos]. _data)) - /*-------------------- push "hole" to upper level */ - _ipos = push_upper ( - this-> _heap.head(), - this-> _heap.head()+_hpos , - __copy(data_type,_data)) ; - else - /*-------------------- push "hole" to lower level */ - _ipos = push_lower ( + + /*------------------------ push "hole" to lower level */ + _ipos = push_lower ( this-> _heap.head(), this-> _heap.tail(), this-> _heap.head()+_hpos , @@ -608,16 +605,9 @@ this->_keys[_kptr]; _write_it _ipos = this->_heap.tend(); - if (this->_pred(_data , - this->_heap[_hpos]. _data)) - /*-------------------- push "hole" to upper level */ - _ipos = push_upper ( - this-> _heap.head(), - this-> _heap.head()+_hpos , - __copy(data_type,_data)) ; - else - /*-------------------- push "hole" to lower level */ - _ipos = push_lower ( + + /*------------------------ push "hole" to lower level */ + _ipos = push_lower ( this-> _heap.head(), this-> _heap.tail(), this-> _heap.head()+_hpos , @@ -704,8 +694,8 @@ (_ipos - 1)/_nfan ; if (this->_pred( - this->_heap[_ipos], - this->_heap[_ppos] + this->_heap[_ipos]._data, + this->_heap[_ppos]._data ) ) return false ; } diff --git a/external/jigsaw/src/libcpp/containers/priorityset.hpp b/external/jigsaw/src/libcpp/containers/priorityset.hpp index 54d9cf1..af5911a 100644 --- a/external/jigsaw/src/libcpp/containers/priorityset.hpp +++ b/external/jigsaw/src/libcpp/containers/priorityset.hpp @@ -30,12 +30,16 @@ * how they can obtain it for free, then you are not * required to make any arrangement with me.) * - * Disclaimer: Neither I nor: Columbia University, The - * Massachusetts Institute of Technology, The - * University of Sydney, nor The National Aeronautics - * and Space Administration warrant this code in any - * way whatsoever. This code is provided "as-is" to be - * used at your own risk. + * Disclaimer: Neither I nor THE CONTRIBUTORS warrant + * this code in any way whatsoever. This code is + * provided "as-is" to be used at your own risk. + * + * THE CONTRIBUTORS include: + * (a) The University of Sydney + * (b) The Massachusetts Institute of Technology + * (c) Columbia University + * (d) The National Aeronautics & Space Administration + * (e) Los Alamos National Laboratory * ------------------------------------------------------------ * @@ -90,7 +94,7 @@ typedef typename container::_const_it _const_it ; - size_type static constexpr _nfan = +4; // fan out + size_type static constexpr _nfan = +8; // fan out public : diff --git a/external/jigsaw/src/libcpp/containers/single_list.hpp b/external/jigsaw/src/libcpp/containers/single_list.hpp index 0e58672..3fc278e 100644 --- a/external/jigsaw/src/libcpp/containers/single_list.hpp +++ b/external/jigsaw/src/libcpp/containers/single_list.hpp @@ -32,16 +32,20 @@ * how they can obtain it for free, then you are not * required to make any arrangement with me.) * - * Disclaimer: Neither I nor: Columbia University, The - * Massachusetts Institute of Technology, The - * University of Sydney, nor The National Aeronautics - * and Space Administration warrant this code in any - * way whatsoever. This code is provided "as-is" to be - * used at your own risk. + * Disclaimer: Neither I nor THE CONTRIBUTORS warrant + * this code in any way whatsoever. This code is + * provided "as-is" to be used at your own risk. + * + * THE CONTRIBUTORS include: + * (a) The University of Sydney + * (b) The Massachusetts Institute of Technology + * (c) Columbia University + * (d) The National Aeronautics & Space Administration + * (e) Los Alamos National Laboratory * ------------------------------------------------------------ * - * Last updated: 21 December, 2018 + * Last updated: 21 Dec., 2018 * * Copyright 2013-2018 * Darren Engwirda diff --git a/external/jigsaw/src/libcpp/containers/singleiter.hpp b/external/jigsaw/src/libcpp/containers/singleiter.hpp index 3a681de..39b53fd 100644 --- a/external/jigsaw/src/libcpp/containers/singleiter.hpp +++ b/external/jigsaw/src/libcpp/containers/singleiter.hpp @@ -32,12 +32,16 @@ * how they can obtain it for free, then you are not * required to make any arrangement with me.) * - * Disclaimer: Neither I nor: Columbia University, The - * Massachusetts Institute of Technology, The - * University of Sydney, nor The National Aeronautics - * and Space Administration warrant this code in any - * way whatsoever. This code is provided "as-is" to be - * used at your own risk. + * Disclaimer: Neither I nor THE CONTRIBUTORS warrant + * this code in any way whatsoever. This code is + * provided "as-is" to be used at your own risk. + * + * THE CONTRIBUTORS include: + * (a) The University of Sydney + * (b) The Massachusetts Institute of Technology + * (c) Columbia University + * (d) The National Aeronautics & Space Administration + * (e) Los Alamos National Laboratory * ------------------------------------------------------------ * diff --git a/external/jigsaw/src/libcpp/expansion/dd_float.hpp b/external/jigsaw/src/libcpp/expansion/dd_float.hpp index d53e547..c94bd39 100644 --- a/external/jigsaw/src/libcpp/expansion/dd_float.hpp +++ b/external/jigsaw/src/libcpp/expansion/dd_float.hpp @@ -37,16 +37,20 @@ * how they can obtain it for free, then you are not * required to make any arrangement with me.) * - * Disclaimer: Neither I nor: Columbia University, The - * Massachusetts Institute of Technology, The - * University of Sydney, nor The National Aeronautics - * and Space Administration warrant this code in any - * way whatsoever. This code is provided "as-is" to be - * used at your own risk. + * Disclaimer: Neither I nor THE CONTRIBUTORS warrant + * this code in any way whatsoever. This code is + * provided "as-is" to be used at your own risk. + * + * THE CONTRIBUTORS include: + * (a) The University of Sydney + * (b) The Massachusetts Institute of Technology + * (c) Columbia University + * (d) The National Aeronautics & Space Administration + * (e) Los Alamos National Laboratory * -------------------------------------------------------- * - * Last updated: 16 April, 2020 + * Last updated: 16 Apr., 2020 * * Copyright 2020-- * Darren Engwirda diff --git a/external/jigsaw/src/libcpp/expansion/ia_float.hpp b/external/jigsaw/src/libcpp/expansion/ia_float.hpp index 341b6a5..1d2cc80 100644 --- a/external/jigsaw/src/libcpp/expansion/ia_float.hpp +++ b/external/jigsaw/src/libcpp/expansion/ia_float.hpp @@ -22,16 +22,20 @@ * how they can obtain it for free, then you are not * required to make any arrangement with me.) * - * Disclaimer: Neither I nor: Columbia University, The - * Massachusetts Institute of Technology, The - * University of Sydney, nor The National Aeronautics - * and Space Administration warrant this code in any - * way whatsoever. This code is provided "as-is" to be - * used at your own risk. + * Disclaimer: Neither I nor THE CONTRIBUTORS warrant + * this code in any way whatsoever. This code is + * provided "as-is" to be used at your own risk. + * + * THE CONTRIBUTORS include: + * (a) The University of Sydney + * (b) The Massachusetts Institute of Technology + * (c) Columbia University + * (d) The National Aeronautics & Space Administration + * (e) Los Alamos National Laboratory * -------------------------------------------------------- * - * Last updated: 10 April, 2020 + * Last updated: 10 Apr., 2020 * * Copyright 2020-- * Darren Engwirda diff --git a/external/jigsaw/src/libcpp/expansion/mp_basic.hpp b/external/jigsaw/src/libcpp/expansion/mp_basic.hpp index 684d3cb..66262e5 100644 --- a/external/jigsaw/src/libcpp/expansion/mp_basic.hpp +++ b/external/jigsaw/src/libcpp/expansion/mp_basic.hpp @@ -50,16 +50,20 @@ * how they can obtain it for free, then you are not * required to make any arrangement with me.) * - * Disclaimer: Neither I nor: Columbia University, The - * Massachusetts Institute of Technology, The - * University of Sydney, nor The National Aeronautics - * and Space Administration warrant this code in any - * way whatsoever. This code is provided "as-is" to be - * used at your own risk. + * Disclaimer: Neither I nor THE CONTRIBUTORS warrant + * this code in any way whatsoever. This code is + * provided "as-is" to be used at your own risk. + * + * THE CONTRIBUTORS include: + * (a) The University of Sydney + * (b) The Massachusetts Institute of Technology + * (c) Columbia University + * (d) The National Aeronautics & Space Administration + * (e) Los Alamos National Laboratory * -------------------------------------------------------- * - * Last updated: 16 April, 2020 + * Last updated: 16 Apr., 2020 * * Copyright 2020-- * Darren Engwirda diff --git a/external/jigsaw/src/libcpp/expansion/mp_float.hpp b/external/jigsaw/src/libcpp/expansion/mp_float.hpp index e04fb98..5610954 100644 --- a/external/jigsaw/src/libcpp/expansion/mp_float.hpp +++ b/external/jigsaw/src/libcpp/expansion/mp_float.hpp @@ -46,16 +46,20 @@ * how they can obtain it for free, then you are not * required to make any arrangement with me.) * - * Disclaimer: Neither I nor: Columbia University, The - * Massachusetts Institute of Technology, The - * University of Sydney, nor The National Aeronautics - * and Space Administration warrant this code in any - * way whatsoever. This code is provided "as-is" to be - * used at your own risk. + * Disclaimer: Neither I nor THE CONTRIBUTORS warrant + * this code in any way whatsoever. This code is + * provided "as-is" to be used at your own risk. + * + * THE CONTRIBUTORS include: + * (a) The University of Sydney + * (b) The Massachusetts Institute of Technology + * (c) Columbia University + * (d) The National Aeronautics & Space Administration + * (e) Los Alamos National Laboratory * -------------------------------------------------------- * - * Last updated: 30 April, 2020 + * Last updated: 05 Jun., 2022 * * Copyright 2020-- * Darren Engwirda @@ -95,7 +99,7 @@ indx_type static constexpr _size = N ; - real_type _xdat [ N ] ; + real_type _xdat [ N ] = { 0. } ; indx_type _xlen = 0 ; public : diff --git a/external/jigsaw/src/libcpp/expansion/mp_utils.hpp b/external/jigsaw/src/libcpp/expansion/mp_utils.hpp index 36f3b0c..5720a03 100644 --- a/external/jigsaw/src/libcpp/expansion/mp_utils.hpp +++ b/external/jigsaw/src/libcpp/expansion/mp_utils.hpp @@ -22,16 +22,20 @@ * how they can obtain it for free, then you are not * required to make any arrangement with me.) * - * Disclaimer: Neither I nor: Columbia University, The - * Massachusetts Institute of Technology, The - * University of Sydney, nor The National Aeronautics - * and Space Administration warrant this code in any - * way whatsoever. This code is provided "as-is" to be - * used at your own risk. + * Disclaimer: Neither I nor THE CONTRIBUTORS warrant + * this code in any way whatsoever. This code is + * provided "as-is" to be used at your own risk. + * + * THE CONTRIBUTORS include: + * (a) The University of Sydney + * (b) The Massachusetts Institute of Technology + * (c) Columbia University + * (d) The National Aeronautics & Space Administration + * (e) Los Alamos National Laboratory * -------------------------------------------------------- * - * Last updated: 03 March, 2020 + * Last updated: 03 Mar., 2020 * * Copyright 2020-- * Darren Engwirda diff --git a/external/jigsaw/src/libcpp/geom_base/cell_ball_k.hpp b/external/jigsaw/src/libcpp/geom_base/cell_ball_k.hpp index 0035b92..3fa289f 100644 --- a/external/jigsaw/src/libcpp/geom_base/cell_ball_k.hpp +++ b/external/jigsaw/src/libcpp/geom_base/cell_ball_k.hpp @@ -22,16 +22,20 @@ * how they can obtain it for free, then you are not * required to make any arrangement with me.) * - * Disclaimer: Neither I nor: Columbia University, The - * Massachusetts Institute of Technology, The - * University of Sydney, nor The National Aeronautics - * and Space Administration warrant this code in any - * way whatsoever. This code is provided "as-is" to be - * used at your own risk. + * Disclaimer: Neither I nor THE CONTRIBUTORS warrant + * this code in any way whatsoever. This code is + * provided "as-is" to be used at your own risk. + * + * THE CONTRIBUTORS include: + * (a) The University of Sydney + * (b) The Massachusetts Institute of Technology + * (c) Columbia University + * (d) The National Aeronautics & Space Administration + * (e) Los Alamos National Laboratory * -------------------------------------------------------- * - * Last updated: 26 July, 2020 + * Last updated: 26 Jul., 2020 * * Copyright 2013-2020 * Darren Engwirda diff --git a/external/jigsaw/src/libcpp/geom_base/cell_base_k.hpp b/external/jigsaw/src/libcpp/geom_base/cell_base_k.hpp index 6485623..fd4ad37 100644 --- a/external/jigsaw/src/libcpp/geom_base/cell_base_k.hpp +++ b/external/jigsaw/src/libcpp/geom_base/cell_base_k.hpp @@ -22,18 +22,22 @@ * how they can obtain it for free, then you are not * required to make any arrangement with me.) * - * Disclaimer: Neither I nor: Columbia University, The - * Massachusetts Institute of Technology, The - * University of Sydney, nor The National Aeronautics - * and Space Administration warrant this code in any - * way whatsoever. This code is provided "as-is" to be - * used at your own risk. + * Disclaimer: Neither I nor THE CONTRIBUTORS warrant + * this code in any way whatsoever. This code is + * provided "as-is" to be used at your own risk. + * + * THE CONTRIBUTORS include: + * (a) The University of Sydney + * (b) The Massachusetts Institute of Technology + * (c) Columbia University + * (d) The National Aeronautics & Space Administration + * (e) Los Alamos National Laboratory * -------------------------------------------------------- * - * Last updated: 28 Dec., 2020 + * Last updated: 12 Jul., 2022 * - * Copyright 2013-2020 + * Copyright 2013-2022 * Darren Engwirda * d.engwirda@gmail.com * https://github.com/dengwirda/ @@ -179,8 +183,9 @@ return ((_a1+_a2) + (_a3+_a4)) / +2.; /* - // real_type _x1[2], _x2[2], _nc; - // quad_axes_2d(_p1, _p2, _p3, _p4, _x1, _x2); + real_type _x1[2], _x2[2], _nc; + quad_axes_2d( + _p1, _p2, _p3, _p4, _x1, _x2); real_type _v1[2], _a1; real_type _v2[2], _a2; @@ -223,7 +228,8 @@ /* real_type _x1[3], _x2[3], _nc[3]; - quad_axes_3d(_p1, _p2, _p3, _p4, _x1, _x2); + quad_axes_3d( + _p1, _p2, _p3, _p4, _x1, _x2); real_type _v1[3], _n1[3]; real_type _v2[3], _n2[3]; @@ -269,6 +275,26 @@ _nv[1] = _p2[0] - _p1[0]; } + template < + typename real_type + > + __inline_call void_type tria_norm_2d ( + __const_ptr (real_type) _p1, + __const_ptr (real_type) _p2, + __const_ptr (real_type) _p3, + __write_ptr (real_type) _nv + ) + { + real_type _ev12[2], _ev13[2] ; + vector_2d(_p1, _p2, _ev12); + vector_2d(_p1, _p3, _ev13); + + _nv[0] = (real_type)+0. ; + _nv[1] = (real_type)+0. ; + _nv[2] = _ev12[0] * _ev13[1] - + _ev12[1] * _ev13[0] ; + } + template < typename real_type > @@ -527,6 +553,114 @@ (_vmin > 0.) ? +_mean : -_mean ; } + /* + -------------------------------------------------------- + * skew "quality" scores. + -------------------------------------------------------- + */ + + template < + typename real_type + > + __inline_call + real_type tria_skewcos_2d ( + __const_ptr (real_type) _p1, + __const_ptr (real_type) _p2, + __const_ptr (real_type) _p3 + ) + { // "skewed-cosine"; penalty for obtuse + // Engwirda, D. (2022): + // An 'asymmetric-cosine' metric for primal-dual mesh optimisation. + real_type _vv12[2] ; + real_type _vv23[2] ; + real_type _vv31[2] ; + geometry::vector_2d(_p1, _p2, _vv12) ; + geometry::vector_2d(_p2, _p3, _vv23) ; + geometry::vector_2d(_p3, _p1, _vv31) ; + + real_type _ll12 = + geometry::length_2d (_vv12) ; + real_type _ll23 = + geometry::length_2d (_vv23) ; + real_type _ll31 = + geometry::length_2d (_vv31) ; + + // -ve due to ccw sign of vectors + real_type _dd11 = + geometry::dot_2d( + _vv31, _vv12) / _ll31 / _ll12 ; + real_type _dd22 = + geometry::dot_2d( + _vv12, _vv23) / _ll12 / _ll23 ; + real_type _dd33 = + geometry::dot_2d( + _vv23, _vv31) / _ll23 / _ll31 ; + + _dd11 += (real_type)+ 1./2. ; + _dd22 += (real_type)+ 1./2. ; + _dd33 += (real_type)+ 1./2. ; + + real_type _skew = + (real_type) +4. / 11. * ( + std::pow(_dd11, 2) + + std::pow(_dd22, 2) + + std::pow(_dd33, 2) ) ; + + return std::pow( + (real_type) +1. - _skew, +4./3.) ; + } + + template < + typename real_type + > + __inline_call + real_type tria_skewcos_3d ( + __const_ptr (real_type) _p1, + __const_ptr (real_type) _p2, + __const_ptr (real_type) _p3 + ) + { // "skewed-cosine"; penalty for obtuse + // Engwirda, D. (2022): + // An 'asymmetric-cosine' metric for primal-dual mesh optimisation. + real_type _vv12[3] ; + real_type _vv23[3] ; + real_type _vv31[3] ; + geometry::vector_3d(_p1, _p2, _vv12) ; + geometry::vector_3d(_p2, _p3, _vv23) ; + geometry::vector_3d(_p3, _p1, _vv31) ; + + real_type _ll12 = + geometry::length_3d (_vv12) ; + real_type _ll23 = + geometry::length_3d (_vv23) ; + real_type _ll31 = + geometry::length_3d (_vv31) ; + + // -ve due to ccw sign of vectors + real_type _dd11 = + geometry::dot_3d( + _vv31, _vv12) / _ll31 / _ll12 ; + real_type _dd22 = + geometry::dot_3d( + _vv12, _vv23) / _ll12 / _ll23 ; + real_type _dd33 = + geometry::dot_3d( + _vv23, _vv31) / _ll23 / _ll31 ; + + _dd11 += (real_type)+ 1./2. ; + _dd22 += (real_type)+ 1./2. ; + _dd33 += (real_type)+ 1./2. ; + + real_type _skew = + (real_type) +4. / 11. * ( + std::pow(_dd11, 2) + + std::pow(_dd22, 2) + + std::pow(_dd33, 2) ) ; + + return std::pow( + (real_type) +1. - _skew, +4./3.) ; + } + /* -------------------------------------------------------- * dual "quality" scores. @@ -542,7 +676,10 @@ __const_ptr (real_type) _p2, __const_ptr (real_type) _p3 ) - { + { // optimise primal-dual staggering + // Engwirda, D. (2018): + // Generalised primal-dual grids for unstructured co-volume schemes. + // J. Comp. Phys., 375, pp.155-176 real_type _ob[3]; perp_ball_2d(_ob, _p1, _p2, _p3); @@ -574,7 +711,7 @@ real_type _r3 = _m3[2] ; real_type _rb = // chara.-length - (_r1+_r2+_r3) / (real_type)+3. ; + std::pow( _r1 * _r2 * _r3, 1./3.) ; real_type _qb = _lb / _rb ; @@ -586,10 +723,10 @@ (_q1+_q2+_q3) / (real_type)+3. ; real_type _qq = - ((real_type)+1.-.33) * _qb + - ((real_type)+0.+.33) * _qe ; + ((real_type)+1. - 1./3.) * _qb + + ((real_type)+0. + 1./3.) * _qe ; - return (real_type)1.-_qq ; + return (real_type)+1.0 - _qq ; } template < @@ -601,7 +738,10 @@ __const_ptr (real_type) _p2, __const_ptr (real_type) _p3 ) - { + { // optimise primal-dual staggering + // Engwirda, D. (2018): + // Generalised primal-dual grids for unstructured co-volume schemes. + // J. Comp. Phys., 375, pp.155-176 real_type _ob[4]; perp_ball_3d(_ob, _p1, _p2, _p3); @@ -633,7 +773,7 @@ real_type _r3 = _m3[3] ; real_type _rb = // chara.-length - (_r1+_r2+_r3) / (real_type)+3. ; + std::pow( _r1 * _r2 * _r3, 1./3.) ; real_type _qb = _lb / _rb ; @@ -645,32 +785,15 @@ (_q1+_q2+_q3) / (real_type)+3. ; real_type _qq = - ((real_type)+1.-.33) * _qb + - ((real_type)+0.+.33) * _qe ; + ((real_type)+1. - 1./3.) * _qb + + ((real_type)+0. + 1./3.) * _qe ; - return (real_type)1.-_qq ; + return (real_type)+1.0 - _qq ; } - /* - template < - typename real_type - > - __normal_call - real_type tria_duality_3d ( - __const_ptr (real_type) _p1, - __const_ptr (real_type) _p2, - __const_ptr (real_type) _p3, - __const_ptr (real_type) _p4 - ) - { - //!! to-do... - - return _qq ; - } - */ } -# endif//__CELL_BASE_K__ +# endif // __CELL_BASE_K__ diff --git a/external/jigsaw/src/libcpp/geom_base/intersect_k.hpp b/external/jigsaw/src/libcpp/geom_base/intersect_k.hpp index 0759c7a..c6b6442 100644 --- a/external/jigsaw/src/libcpp/geom_base/intersect_k.hpp +++ b/external/jigsaw/src/libcpp/geom_base/intersect_k.hpp @@ -22,16 +22,20 @@ * how they can obtain it for free, then you are not * required to make any arrangement with me.) * - * Disclaimer: Neither I nor: Columbia University, The - * Massachusetts Institute of Technology, The - * University of Sydney, nor The National Aeronautics - * and Space Administration warrant this code in any - * way whatsoever. This code is provided "as-is" to be - * used at your own risk. + * Disclaimer: Neither I nor THE CONTRIBUTORS warrant + * this code in any way whatsoever. This code is + * provided "as-is" to be used at your own risk. + * + * THE CONTRIBUTORS include: + * (a) The University of Sydney + * (b) The Massachusetts Institute of Technology + * (c) Columbia University + * (d) The National Aeronautics & Space Administration + * (e) Los Alamos National Laboratory * -------------------------------------------------------- * - * Last updated: 12 August, 2019 + * Last updated: 12 Aug., 2019 * * Copyright 2013-2019 * Darren Engwirda diff --git a/external/jigsaw/src/libcpp/geom_base/vect_base_k.hpp b/external/jigsaw/src/libcpp/geom_base/vect_base_k.hpp index d99555e..29f5daa 100644 --- a/external/jigsaw/src/libcpp/geom_base/vect_base_k.hpp +++ b/external/jigsaw/src/libcpp/geom_base/vect_base_k.hpp @@ -22,16 +22,20 @@ * how they can obtain it for free, then you are not * required to make any arrangement with me.) * - * Disclaimer: Neither I nor: Columbia University, The - * Massachusetts Institute of Technology, The - * University of Sydney, nor The National Aeronautics - * and Space Administration warrant this code in any - * way whatsoever. This code is provided "as-is" to be - * used at your own risk. + * Disclaimer: Neither I nor THE CONTRIBUTORS warrant + * this code in any way whatsoever. This code is + * provided "as-is" to be used at your own risk. + * + * THE CONTRIBUTORS include: + * (a) The University of Sydney + * (b) The Massachusetts Institute of Technology + * (c) Columbia University + * (d) The National Aeronautics & Space Administration + * (e) Los Alamos National Laboratory * -------------------------------------------------------- * - * Last updated: 30 April, 2020 + * Last updated: 30 Apr., 2020 * * Copyright 2013-2020 * Darren Engwirda diff --git a/external/jigsaw/src/libcpp/geom_type/geom_base_2.hpp b/external/jigsaw/src/libcpp/geom_reps/geom_base_2.hpp similarity index 93% rename from external/jigsaw/src/libcpp/geom_type/geom_base_2.hpp rename to external/jigsaw/src/libcpp/geom_reps/geom_base_2.hpp index 55d5e13..364c564 100644 --- a/external/jigsaw/src/libcpp/geom_type/geom_base_2.hpp +++ b/external/jigsaw/src/libcpp/geom_reps/geom_base_2.hpp @@ -22,12 +22,16 @@ * how they can obtain it for free, then you are not * required to make any arrangement with me.) * - * Disclaimer: Neither I nor: Columbia University, The - * Massachusetts Institute of Technology, The - * University of Sydney, nor The National Aeronautics - * and Space Administration warrant this code in any - * way whatsoever. This code is provided "as-is" to be - * used at your own risk. + * Disclaimer: Neither I nor THE CONTRIBUTORS warrant + * this code in any way whatsoever. This code is + * provided "as-is" to be used at your own risk. + * + * THE CONTRIBUTORS include: + * (a) The University of Sydney + * (b) The Massachusetts Institute of Technology + * (c) Columbia University + * (d) The National Aeronautics & Space Administration + * (e) Los Alamos National Laboratory * -------------------------------------------------------- * diff --git a/external/jigsaw/src/libcpp/geom_type/geom_base_3.hpp b/external/jigsaw/src/libcpp/geom_reps/geom_base_3.hpp similarity index 94% rename from external/jigsaw/src/libcpp/geom_type/geom_base_3.hpp rename to external/jigsaw/src/libcpp/geom_reps/geom_base_3.hpp index f16395d..116aadc 100644 --- a/external/jigsaw/src/libcpp/geom_type/geom_base_3.hpp +++ b/external/jigsaw/src/libcpp/geom_reps/geom_base_3.hpp @@ -22,12 +22,16 @@ * how they can obtain it for free, then you are not * required to make any arrangement with me.) * - * Disclaimer: Neither I nor: Columbia University, The - * Massachusetts Institute of Technology, The - * University of Sydney, nor The National Aeronautics - * and Space Administration warrant this code in any - * way whatsoever. This code is provided "as-is" to be - * used at your own risk. + * Disclaimer: Neither I nor THE CONTRIBUTORS warrant + * this code in any way whatsoever. This code is + * provided "as-is" to be used at your own risk. + * + * THE CONTRIBUTORS include: + * (a) The University of Sydney + * (b) The Massachusetts Institute of Technology + * (c) Columbia University + * (d) The National Aeronautics & Space Administration + * (e) Los Alamos National Laboratory * -------------------------------------------------------- * diff --git a/external/jigsaw/src/libcpp/geom_type/geom_mesh_ellipsoid_3.hpp b/external/jigsaw/src/libcpp/geom_reps/geom_mesh_ellipsoid_3.hpp similarity index 95% rename from external/jigsaw/src/libcpp/geom_type/geom_mesh_ellipsoid_3.hpp rename to external/jigsaw/src/libcpp/geom_reps/geom_mesh_ellipsoid_3.hpp index 3b21ef7..b5b9e2c 100644 --- a/external/jigsaw/src/libcpp/geom_type/geom_mesh_ellipsoid_3.hpp +++ b/external/jigsaw/src/libcpp/geom_reps/geom_mesh_ellipsoid_3.hpp @@ -22,16 +22,20 @@ * how they can obtain it for free, then you are not * required to make any arrangement with me.) * - * Disclaimer: Neither I nor: Columbia University, The - * Massachusetts Institute of Technology, The - * University of Sydney, nor The National Aeronautics - * and Space Administration warrant this code in any - * way whatsoever. This code is provided "as-is" to be - * used at your own risk. + * Disclaimer: Neither I nor THE CONTRIBUTORS warrant + * this code in any way whatsoever. This code is + * provided "as-is" to be used at your own risk. + * + * THE CONTRIBUTORS include: + * (a) The University of Sydney + * (b) The Massachusetts Institute of Technology + * (c) Columbia University + * (d) The National Aeronautics & Space Administration + * (e) Los Alamos National Laboratory * -------------------------------------------------------- * - * Last updated: 17 Apr., 2021 + * Last updated: 18 Aug., 2021 * * Copyright 2013-2021 * Darren Engwirda @@ -87,11 +91,12 @@ { /*------------------------------------ loc. node type */ public : - iptr_type _itag ; + iptr_type _itag = +0 ; + + char_type _fdim = +0 ; + char_type _feat = +0 ; - char_type _fdim ; - char_type _feat ; - char_type _topo ; + char_type _topo [ 2] = {+2} ; public : /*------------------------------------ "write" access */ @@ -107,9 +112,12 @@ ) { return this->_fdim ; } - __inline_call char_type& topo ( + __inline_call char_type & topo ( + char_type _kind = filt_topo ) - { return this->_topo ; + { return ( _kind == filt_topo ) ? + this->_topo[ +0] : + this->_topo[ +1] ; } /*------------------------------------ "const" access */ __inline_call iptr_type const& itag ( @@ -125,8 +133,11 @@ { return this->_fdim ; } __inline_call char_type const& topo ( + char_type _kind = filt_topo ) const - { return this->_topo ; + { return ( _kind == filt_topo ) ? + this->_topo[ +0] : + this->_topo[ +1] ; } } ; @@ -135,7 +146,7 @@ { /*------------------------------------ loc. node type */ public : - iptr_type _itag ; + iptr_type _itag = +0 ; public : /*------------------------------------ "write" access */ @@ -155,10 +166,11 @@ { /*------------------------------------ loc. edge type */ public : - iptr_type _itag ; + iptr_type _itag = +0 ; + + char_type _feat = +0 ; - char_type _feat ; - char_type _topo ; + char_type _topo [ 2] = {+2} ; public : /*------------------------------------ "write" access */ @@ -166,27 +178,33 @@ ) { return this->_itag ; } - __inline_call char_type& topo ( - ) - { return this->_topo ; - } __inline_call char_type& feat ( ) { return this->_feat ; } + __inline_call char_type & topo ( + char_type _kind = filt_topo + ) + { return ( _kind == filt_topo ) ? + this->_topo[ +0] : + this->_topo[ +1] ; + } /*------------------------------------ "const" access */ __inline_call iptr_type const& itag ( ) const { return this->_itag ; } - __inline_call char_type const& topo ( - ) const - { return this->_topo ; - } __inline_call char_type const& feat ( ) const { return this->_feat ; } + __inline_call char_type const& topo ( + char_type _kind = filt_topo + ) const + { return ( _kind == filt_topo ) ? + this->_topo[ +0] : + this->_topo[ +1] ; + } } ; @@ -305,6 +323,7 @@ list_type &_aset , char_type &_feat , char_type &_topo , + char_type &_full , user_opts &_opts ) { @@ -313,8 +332,8 @@ (real_type)+3.141592653589793 / 180. ; real_type _ZERO = -1. + - std::numeric_limits - ::epsilon(); + std::pow(std::numeric_limits + ::epsilon(),.50) ; real_type _phi1 = (real_type)+180. - _opts.phi1(); @@ -330,6 +349,7 @@ _feat = null_feat ; _topo = (char_type)_aset.count () ; + _full = (char_type)_aset.count () ; // unfiltered for (auto _ipos = _aset.head() ; _ipos != _aset.tend() ; @@ -428,34 +448,6 @@ typename mesh_type::connector _eadj ; - /*---------------------------------- init. geom feat. */ - for (auto _iter = - this->_mesh.node().head() ; - _iter != - this->_mesh.node().tend() ; - ++_iter ) - { - if (_iter->mark() >= +0) - { - _iter->fdim () = +0 ; - _iter->feat () = null_feat ; - _iter->topo () = +2 ; - } - } - - for (auto _iter = - this->_mesh.edge().head() ; - _iter != - this->_mesh.edge().tend() ; - ++_iter ) - { - if (_iter->mark() >= +0) - { - _iter->feat () = null_feat ; - _iter->topo () = +2 ; - } - } - /*---------------------------------- find sharp feat. */ for (auto _iter = this->_mesh.node().head() ; @@ -479,7 +471,8 @@ &_iter->node (0), _eadj , _iter->feat () , - _iter->topo () , + _iter->topo (0), + _iter->topo (1), _opts ) ; if (_iter->itag() <= -1) @@ -744,8 +737,12 @@ = _iter->feat() ; _rdel._tria.node - (_node)->topo() - = _iter->topo() ; + (_node)->topo(0) + = _iter->topo(0); + + _rdel._tria.node + (_node)->topo(1) + = _iter->topo(1); _rdel._tria.node (_node)->part() @@ -775,8 +772,12 @@ = _iter->feat() ; _rdel._tria.node - (_node)->topo() - = _iter->topo() ; + (_node)->topo(0) + = _iter->topo(0); + + _rdel._tria.node + (_node)->topo(1) + = _iter->topo(1); _rdel._tria.node (_node)->part() @@ -1144,8 +1145,12 @@ = _best->feat() ; _rdel._tria.node - (_node)->topo() - = _best->topo() ; + (_node)->topo(0) + = _best->topo(0); + + _rdel._tria.node + (_node)->topo(1) + = _best->topo(1); _rdel._tria.node (_node)->part() @@ -1538,7 +1543,7 @@ { _hfun(&_pprj[0], _htmp , _edge.feat() , - _edge.topo() , + &_edge.topo(0), _edge.itag() ) ; _hnum += +1 ; @@ -1572,12 +1577,12 @@ { _hfun(&_pprj[0], _htmp , _edge.feat() , - _edge.topo() , + &_edge.topo(0), _edge.itag() ) ; _hfun(&_qprj[0], _htmp , _edge.feat() , - _edge.topo() , + &_edge.topo(0), _edge.itag() ) ; _hnum += +2 ; @@ -1670,7 +1675,7 @@ { _hfun(&_xprj[0], _htmp , _edge.feat() , - _edge.topo() , + &_edge.topo(0), _edge.itag() ) ; _hnum += +1 ; @@ -1995,6 +2000,11 @@ ball_intersect < hits_func > hits_pred ; + float static const _RTOL = + std::pow ( + std::numeric_limits + ::epsilon(), (float).675) ; + float _PMID[3] = { (float) _ball. _pmid[0] , (float) _ball. _pmid[1] , @@ -2004,6 +2014,8 @@ float _RRAD = (float) _ball. _rrad; + _RRAD *= (1.f + _RTOL) ; + /*------------------ call actual intersection testing */ real_type _rmin[3] = { _ball._pmid[0] -_ball. _rrad, @@ -2092,8 +2104,8 @@ char_type _hits = geometry::face_hits ; char_type _feat = +2; - char_type _topo = +2; iptr_type _itag = +0; + char_type _topo[2] = {2}; real_type _apos[3] ; _apos[0] = _APOS[0] ; @@ -2118,8 +2130,8 @@ char_type _hits = geometry::face_hits ; char_type _feat = +2; - char_type _topo = +2; iptr_type _itag = +0; + char_type _topo[2] = {2}; real_type _bpos[3] ; _bpos[0] = _BPOS[0] ; @@ -2188,8 +2200,8 @@ char_type _hits = geometry::face_hits ; char_type _feat = +2; - char_type _topo = +2; iptr_type _itag = +0; + char_type _topo[2] = {2}; _hfun( _proj , _hits, _feat , _topo, _itag) ; diff --git a/external/jigsaw/src/libcpp/geom_type/geom_mesh_euclidean_2.hpp b/external/jigsaw/src/libcpp/geom_reps/geom_mesh_euclidean_2.hpp similarity index 93% rename from external/jigsaw/src/libcpp/geom_type/geom_mesh_euclidean_2.hpp rename to external/jigsaw/src/libcpp/geom_reps/geom_mesh_euclidean_2.hpp index d1670df..ae17fff 100644 --- a/external/jigsaw/src/libcpp/geom_type/geom_mesh_euclidean_2.hpp +++ b/external/jigsaw/src/libcpp/geom_reps/geom_mesh_euclidean_2.hpp @@ -22,16 +22,20 @@ * how they can obtain it for free, then you are not * required to make any arrangement with me.) * - * Disclaimer: Neither I nor: Columbia University, The - * Massachusetts Institute of Technology, The - * University of Sydney, nor The National Aeronautics - * and Space Administration warrant this code in any - * way whatsoever. This code is provided "as-is" to be - * used at your own risk. + * Disclaimer: Neither I nor THE CONTRIBUTORS warrant + * this code in any way whatsoever. This code is + * provided "as-is" to be used at your own risk. + * + * THE CONTRIBUTORS include: + * (a) The University of Sydney + * (b) The Massachusetts Institute of Technology + * (c) Columbia University + * (d) The National Aeronautics & Space Administration + * (e) Los Alamos National Laboratory * -------------------------------------------------------- * - * Last updated: 07 Jul., 2021 + * Last updated: 18 Aug., 2021 * * Copyright 2013-2021 * Darren Engwirda @@ -83,11 +87,12 @@ { /*------------------------------------ loc. node type */ public : - iptr_type _itag ; + iptr_type _itag = +0 ; + + char_type _fdim = +0 ; + char_type _feat = +0 ; - char_type _fdim ; - char_type _feat ; - char_type _topo ; + char_type _topo [ 2] = {+2} ; public : /*------------------------------------ "write" access */ @@ -103,9 +108,12 @@ ) { return this->_fdim ; } - __inline_call char_type& topo ( + __inline_call char_type & topo ( + char_type _kind = filt_topo ) - { return this->_topo ; + { return ( _kind == filt_topo ) ? + this->_topo[ +0] : + this->_topo[ +1] ; } /*------------------------------------ "const" access */ __inline_call iptr_type const& itag ( @@ -121,8 +129,11 @@ { return this->_fdim ; } __inline_call char_type const& topo ( + char_type _kind = filt_topo ) const - { return this->_topo ; + { return ( _kind == filt_topo ) ? + this->_topo[ +0] : + this->_topo[ +1] ; } } ; @@ -131,7 +142,7 @@ { /*------------------------------------ loc. seed type */ public : - iptr_type _itag ; + iptr_type _itag = +0 ; public : /*------------------------------------ "write" access */ @@ -151,10 +162,11 @@ { /*------------------------------------ loc. edge type */ public : - iptr_type _itag ; + iptr_type _itag = +0 ; + + char_type _feat = +0 ; - char_type _feat ; - char_type _topo ; + char_type _topo [ 2] = {+2} ; public : /*------------------------------------ "write" access */ @@ -162,27 +174,33 @@ ) { return this->_itag ; } - __inline_call char_type& topo ( - ) - { return this->_topo ; - } __inline_call char_type& feat ( ) { return this->_feat ; } + __inline_call char_type & topo ( + char_type _kind = filt_topo + ) + { return ( _kind == filt_topo ) ? + this->_topo[ +0] : + this->_topo[ +1] ; + } /*------------------------------------ "const" access */ __inline_call iptr_type const& itag ( ) const { return this->_itag ; } - __inline_call char_type const& topo ( - ) const - { return this->_topo ; - } __inline_call char_type const& feat ( ) const { return this->_feat ; } + __inline_call char_type const& topo ( + char_type _kind = filt_topo + ) const + { return ( _kind == filt_topo ) ? + this->_topo[ +0] : + this->_topo[ +1] ; + } } ; @@ -391,6 +409,7 @@ list_type &_aset , char_type &_feat , char_type &_topo , + char_type &_full , user_opts &_opts ) { @@ -399,8 +418,8 @@ (real_type)+3.141592653589793 / 180. ; real_type _ZERO = -1. + - std::numeric_limits - ::epsilon(); + std::pow(std::numeric_limits + ::epsilon(),.50) ; real_type _phi1 = (real_type)+180. - _opts.phi1(); @@ -416,6 +435,7 @@ _feat = null_feat ; _topo = (char_type)_aset.count () ; + _full = (char_type)_aset.count () ; // unfiltered for (auto _ipos = _aset.head() ; _ipos != _aset.tend() ; @@ -514,34 +534,6 @@ typename mesh_type::connector _eadj ; - /*---------------------------------- init. geom feat. */ - for (auto _iter = - this->_tria.node().head() ; - _iter != - this->_tria.node().tend() ; - ++_iter ) - { - if (_iter->mark() >= +0) - { - _iter->fdim () = +0 ; - _iter->feat () = null_feat ; - _iter->topo () = +2 ; - } - } - - for (auto _iter = - this->_tria.edge().head() ; - _iter != - this->_tria.edge().tend() ; - ++_iter ) - { - if (_iter->mark() >= +0) - { - _iter->feat () = null_feat ; - _iter->topo () = +2 ; - } - } - /*---------------------------------- find sharp feat. */ for (auto _iter = this->_tria.node().head() ; @@ -565,7 +557,8 @@ &_iter->node (0), _eadj , _iter->feat () , - _iter->topo () , + _iter->topo (0), + _iter->topo (1), _opts ) ; if (_iter->itag() <= -1) @@ -789,7 +782,9 @@ typename user_opts > __normal_call void_type init_geom ( - user_opts &_opts + user_opts &_opts , + float _xoff = + 0.f , + float _yoff = + 0.f ) { class edge_pred @@ -825,6 +820,9 @@ { if (_iter->mark() >= +0 ) { + _iter->pval(0) -= _xoff; + _iter->pval(1) -= _yoff; + this->_bmin[0] = std::min ( this->_bmin[0] , _iter->pval(0) ) ; @@ -844,7 +842,7 @@ float static const _RTOL = std::pow ( std::numeric_limits - ::epsilon(), (float)+.75) ; + ::epsilon(), (float).675) ; float _BTOL[2] ; _BTOL[0] = @@ -917,8 +915,12 @@ = _iter->feat() ; _mesh._tria.node - (_node)->topo() - = _iter->topo() ; + (_node)->topo(0) + = _iter->topo(0); + + _mesh._tria.node + (_node)->topo(1) + = _iter->topo(1); _mesh._tria.node (_node)->part() @@ -947,8 +949,12 @@ = _iter->feat() ; _mesh._tria.node - (_node)->topo() - = _iter->topo() ; + (_node)->topo(0) + = _iter->topo(0); + + _mesh._tria.node + (_node)->topo(1) + = _iter->topo(1); _mesh._tria.node (_node)->part() @@ -1046,8 +1052,12 @@ = _best->feat() ; _mesh._tria.node - (_node)->topo() - = _best->topo() ; + (_node)->topo(0) + = _best->topo(0); + + _mesh._tria.node + (_node)->topo(1) + = _best->topo(1); _mesh._tria.node (_node)->part() @@ -1185,8 +1195,8 @@ this->_hfun (_xpos, _HITS , _geom._tria . edge(_epos).feat() , - _geom._tria . - edge(_epos).topo() , + &_geom._tria . + edge(_epos).topo(0), _geom._tria . edge(_epos).itag() ) ; @@ -1294,8 +1304,8 @@ this->_hfun (_jpos, _HITS , _geom._tria . edge(_epos).feat() , - _geom._tria . - edge(_epos).topo() , + &_geom._tria . + edge(_epos).topo(0), _geom._tria . edge(_epos).itag() ) ; @@ -1308,8 +1318,8 @@ this->_hfun (_ipos, _HITS , _geom._tria . edge(_epos).feat() , - _geom._tria . - edge(_epos).topo() , + &_geom._tria . + edge(_epos).topo(0), _geom._tria . edge(_epos).itag() ) ; @@ -1360,11 +1370,15 @@ /*------------------------ call pred. on tree matches */ __inline_call float operator () ( typename + tree_type::node_type *_lptr , + typename tree_type::item_data *_iptr ) { if (this->_find) return +0. ; + __unreferenced(_lptr); + real_type _qtmp[+2] = {+0.}; for ( ; _iptr != nullptr; @@ -1445,6 +1459,11 @@ ball_line_pred < hits_func > hits_pred ; + float static const _RTOL = + std::pow ( + std::numeric_limits + ::epsilon(), (float).675) ; + float _PMID[2] = { (float) _ball. _pmid[0] , (float) _ball. _pmid[1] , @@ -1453,6 +1472,8 @@ float _RRAD = (float) _ball. _rrad; + _RRAD *= (1.f + _RTOL) ; + /*------------------ call actual intersection testing */ tree_pred _pred(_PMID, _RRAD) ; hits_pred _func(_ball. _pmid, @@ -1526,7 +1547,7 @@ real_type*_ppos, char_type _hits, char_type _feat, - char_type _topo, + char_type*_topo, iptr_type _itag ) { @@ -1542,6 +1563,15 @@ real_type *_ppos ) { + /*--------------------------- check against full bbox */ + if (_ppos[0] < this->_bmin[0] || + _ppos[1] < this->_bmin[1] ) + return (iptr_type) -1 ; + + if (_ppos[0] > this->_bmax[0] || + _ppos[1] > this->_bmax[1] ) + return (iptr_type) -1 ; + /*--------------------------- calc. axis-aligned dir. */ iptr_type _vdim = (iptr_type)+0; iptr_type _sign = (iptr_type)+0; @@ -1588,7 +1618,7 @@ } } - _vlen *= (real_type)+2. ; + _vlen *= (real_type)+4. ; /*--------------------------- calc. "is-inside" state */ if (this->_ptag.empty() ) @@ -1596,14 +1626,6 @@ /*--------------------------- null PART specification */ - if (_ppos[0] < this->_bmin[0] || - _ppos[1] < this->_bmin[1] ) - return (iptr_type) -1 ; - - if (_ppos[0] > this->_bmax[0] || - _ppos[1] > this->_bmax[1] ) - return (iptr_type) -1 ; - for(auto _iter = +0; _iter++ != +8; ) { real_type _rvec[ 3] ; @@ -1673,6 +1695,10 @@ { return ( (iptr_type) +0 ) ; } + else + { + return ( (iptr_type) -1 ) ; + } } } @@ -1768,6 +1794,7 @@ { return this->_ptag[_pnum] ; } + else { break ; } // outside: try next part } } @@ -1802,7 +1829,7 @@ real_type static const _RTOL= std::pow ( std::numeric_limits - ::epsilon(), (real_type)+.75); + ::epsilon(), (real_type)+.675) ; real_type _BTOL = ( this->_bmax[0] - diff --git a/external/jigsaw/src/libcpp/geom_type/geom_mesh_euclidean_3.hpp b/external/jigsaw/src/libcpp/geom_reps/geom_mesh_euclidean_3.hpp similarity index 94% rename from external/jigsaw/src/libcpp/geom_type/geom_mesh_euclidean_3.hpp rename to external/jigsaw/src/libcpp/geom_reps/geom_mesh_euclidean_3.hpp index 5b3413b..202dcf3 100644 --- a/external/jigsaw/src/libcpp/geom_type/geom_mesh_euclidean_3.hpp +++ b/external/jigsaw/src/libcpp/geom_reps/geom_mesh_euclidean_3.hpp @@ -22,16 +22,20 @@ * how they can obtain it for free, then you are not * required to make any arrangement with me.) * - * Disclaimer: Neither I nor: Columbia University, The - * Massachusetts Institute of Technology, The - * University of Sydney, nor The National Aeronautics - * and Space Administration warrant this code in any - * way whatsoever. This code is provided "as-is" to be - * used at your own risk. + * Disclaimer: Neither I nor THE CONTRIBUTORS warrant + * this code in any way whatsoever. This code is + * provided "as-is" to be used at your own risk. + * + * THE CONTRIBUTORS include: + * (a) The University of Sydney + * (b) The Massachusetts Institute of Technology + * (c) Columbia University + * (d) The National Aeronautics & Space Administration + * (e) Los Alamos National Laboratory * -------------------------------------------------------- * - * Last updated: 07 Jul., 2021 + * Last updated: 18 Aug., 2021 * * Copyright 2013-2021 * Darren Engwirda @@ -85,11 +89,12 @@ { /*------------------------------------ loc. node type */ public : - iptr_type _itag ; + iptr_type _itag = +0 ; + + char_type _fdim = +0 ; + char_type _feat = +0 ; - char_type _fdim ; - char_type _feat ; - char_type _topo ; + char_type _topo [ 2] = {+2} ; public : /*------------------------------------ "write" access */ @@ -105,9 +110,12 @@ ) { return this->_fdim ; } - __inline_call char_type& topo ( + __inline_call char_type & topo ( + char_type _kind = filt_topo ) - { return this->_topo ; + { return ( _kind == filt_topo ) ? + this->_topo[ +0] : + this->_topo[ +1] ; } /*------------------------------------ "const" access */ __inline_call iptr_type const& itag ( @@ -123,8 +131,11 @@ { return this->_fdim ; } __inline_call char_type const& topo ( + char_type _kind = filt_topo ) const - { return this->_topo ; + { return ( _kind == filt_topo ) ? + this->_topo[ +0] : + this->_topo[ +1] ; } } ; @@ -133,7 +144,7 @@ { /*------------------------------------ loc. node type */ public : - iptr_type _itag ; + iptr_type _itag = +0 ; public : /*------------------------------------ "write" access */ @@ -153,10 +164,11 @@ { /*------------------------------------ loc. edge type */ public : - iptr_type _itag ; + iptr_type _itag = +0 ; - char_type _feat ; - char_type _topo ; + char_type _feat = +0 ; + + char_type _topo [ 2] = {+2} ; public : /*------------------------------------ "write" access */ @@ -164,27 +176,33 @@ ) { return this->_itag ; } - __inline_call char_type& topo ( - ) - { return this->_topo ; - } __inline_call char_type& feat ( ) { return this->_feat ; } + __inline_call char_type & topo ( + char_type _kind = filt_topo + ) + { return ( _kind == filt_topo ) ? + this->_topo[ +0] : + this->_topo[ +1] ; + } /*------------------------------------ "const" access */ __inline_call iptr_type const& itag ( ) const { return this->_itag ; } - __inline_call char_type const& topo ( - ) const - { return this->_topo ; - } __inline_call char_type const& feat ( ) const { return this->_feat ; } + __inline_call char_type const& topo ( + char_type _kind = filt_topo + ) const + { return ( _kind == filt_topo ) ? + this->_topo[ +0] : + this->_topo[ +1] ; + } } ; @@ -192,10 +210,11 @@ { /*------------------------------------ loc. face type */ public : - iptr_type _itag ; + iptr_type _itag = +0 ; + + char_type _feat = +0 ; - char_type _feat ; - char_type _topo ; + char_type _topo [ 2] = {+2} ; public : /*------------------------------------ "write" access */ @@ -203,27 +222,33 @@ ) { return this->_itag ; } - __inline_call char_type& topo ( - ) - { return this->_topo ; - } __inline_call char_type& feat ( ) { return this->_feat ; } + __inline_call char_type & topo ( + char_type _kind = filt_topo + ) + { return ( _kind == filt_topo ) ? + this->_topo[ +0] : + this->_topo[ +1] ; + } /*------------------------------------ "const" access */ __inline_call iptr_type const& itag ( ) const { return this->_itag ; } - __inline_call char_type const& topo ( - ) const - { return this->_topo ; - } __inline_call char_type const& feat ( ) const { return this->_feat ; } + __inline_call char_type const& topo ( + char_type _kind = filt_topo + ) const + { return ( _kind == filt_topo ) ? + this->_topo[ +0] : + this->_topo[ +1] ; + } } ; @@ -470,6 +495,7 @@ list_type &_aset , char_type &_feat , char_type &_topo , + char_type &_full , user_opts &_opts ) { @@ -478,8 +504,8 @@ (real_type)+3.141592653589793 / 180. ; real_type _ZERO = -1. + - std::numeric_limits - ::epsilon(); + std::pow(std::numeric_limits + ::epsilon(),.50) ; real_type _phi1 = (real_type)+180. - _opts.phi1(); @@ -495,6 +521,7 @@ _feat = null_feat ; _topo = (char_type)_aset.count () ; + _full = (char_type)_aset.count () ; // unfiltered for (auto _ipos = _aset.head() ; _ipos != _aset.tend() ; @@ -701,6 +728,7 @@ list_type &_aset , char_type &_feat , char_type &_topo , + char_type &_full , user_opts &_opts ) { @@ -709,8 +737,8 @@ (real_type)+3.141592653589793 / 180. ; real_type _ZERO = -1. + - std::numeric_limits - ::epsilon(); + std::pow(std::numeric_limits + ::epsilon(),.50) ; real_type _phi2 = (real_type)+180. - _opts.phi2(); @@ -724,6 +752,7 @@ _feat = null_feat ; _topo = (char_type)_aset.count () ; + _full = (char_type)_aset.count () ; // unfiltered for (auto _ipos = _aset.head() ; _ipos != _aset.tend() ; @@ -876,45 +905,6 @@ typename mesh_type::connector _ebnd ; - /*---------------------------------- init. geom feat. */ - for (auto _iter = - this->_tria.node().head() ; - _iter != - this->_tria.node().tend() ; - ++_iter ) - { - if (_iter->mark() >= +0) - { - _iter->fdim () = +0 ; - _iter->feat () = null_feat ; - _iter->topo () = +2 ; - } - } - for (auto _iter = - this->_tria.edge().head() ; - _iter != - this->_tria.edge().tend() ; - ++_iter ) - { - if (_iter->mark() >= +0) - { - _iter->feat () = null_feat ; - _iter->topo () = +2 ; - } - } - for (auto _iter = - this->_tria.tri3().head() ; - _iter != - this->_tria.tri3().tend() ; - ++_iter ) - { - if (_iter->mark() >= +0) - { - _iter->feat () = null_feat ; - _iter->topo () = +2 ; - } - } - /*---------------------------------- find sharp feat. */ _nmrk.set_count ( this->_tria.node().count(), @@ -950,7 +940,8 @@ &_epos->node (0), _fadj , _epos->feat () , - _epos->topo () , + _epos->topo (0), + _epos->topo (1), _opts ) ; if (_epos->self() >= +1) @@ -1007,7 +998,8 @@ &_npos->node (0), _ebnd , _npos->feat () , - _npos->topo () , + _npos->topo (0), + _npos->topo (1), _opts ) ; if (_npos->itag () <= -1) @@ -1276,7 +1268,10 @@ typename user_opts > __normal_call void_type init_geom ( - user_opts &_opts + user_opts &_opts , + float _xoff = + 0.f , + float _yoff = + 0.f , + float _zoff = + 0.f ) { class edge_pred @@ -1325,6 +1320,10 @@ { if (_iter->mark() >= +0) { + _iter->pval(0) -= _xoff; + _iter->pval(1) -= _yoff; + _iter->pval(2) -= _zoff; + this->_bmin[0] = std::min ( this->_bmin[0] , _iter->pval(0) ) ; @@ -1350,7 +1349,7 @@ float static const _RTOL = std::pow ( std::numeric_limits - ::epsilon(), (float)+.75) ; + ::epsilon(), (float).675) ; float _BTOL[3] ; _BTOL[0] = @@ -1434,8 +1433,12 @@ = _iter->feat() ; _mesh._tria.node - (_node)->topo() - = _iter->topo() ; + (_node)->topo(0) + = _iter->topo(0); + + _mesh._tria.node + (_node)->topo(1) + = _iter->topo(1); _mesh._tria.node (_node)->part() @@ -1465,8 +1468,12 @@ = _iter->feat() ; _mesh._tria.node - (_node)->topo() - = _iter->topo() ; + (_node)->topo(0) + = _iter->topo(0); + + _mesh._tria.node + (_node)->topo(1) + = _iter->topo(1); _mesh._tria.node (_node)->part() @@ -1565,8 +1572,12 @@ = _best->feat() ; _mesh._tria.node - (_node)->topo() - = _best->topo() ; + (_node)->topo(0) + = _best->topo(0); + + _mesh._tria.node + (_node)->topo(1) + = _best->topo(1); _mesh._tria.node (_node)->part() @@ -1674,8 +1685,8 @@ this->_hfun (_xpos, _HITS , _geom._tria . edge(_epos).feat() , - _geom._tria . - edge(_epos).topo() , + &_geom._tria . + edge(_epos).topo(0), _geom._tria . edge(_epos).itag() ) ; @@ -1815,8 +1826,8 @@ this->_hfun (_xpos, _HITS , _geom._tria . tri3(_tpos).feat() , - _geom._tria . - tri3(_tpos).topo() , + &_geom._tria . + tri3(_tpos).topo(0), _geom._tria . tri3(_tpos).itag() ) ; @@ -1925,8 +1936,8 @@ this->_hfun (_jpos, _HITS , _geom._tria . edge(_epos).feat() , - _geom._tria . - edge(_epos).topo() , + &_geom._tria . + edge(_epos).topo(0), _geom._tria . edge(_epos).itag() ) ; @@ -1938,8 +1949,8 @@ this->_hfun (_ipos, _HITS , _geom._tria . edge(_epos).feat() , - _geom._tria . - edge(_epos).topo() , + &_geom._tria . + edge(_epos).topo(0), _geom._tria . edge(_epos).itag() ) ; @@ -2044,8 +2055,7 @@ _nh=geometry::ball_line_3d ( this->_cmid , this->_rsiz , - _apos, _bpos , - _ipos, _jpos ) ; + _apos, _bpos, _ipos, _jpos ) ; switch (_nh) { @@ -2055,8 +2065,8 @@ this->_hfun (_jpos, _HITS , _geom._tria . tri3(_tpos).feat() , - _geom._tria . - tri3(_tpos).topo() , + &_geom._tria . + tri3(_tpos).topo(0), _geom._tria . tri3(_tpos).itag() ) ; } // falls through @@ -2066,8 +2076,8 @@ this->_hfun (_ipos, _HITS , _geom._tria . tri3(_tpos).feat() , - _geom._tria . - tri3(_tpos).topo() , + &_geom._tria . + tri3(_tpos).topo(0), _geom._tria . tri3(_tpos).itag() ) ; @@ -2115,11 +2125,15 @@ /*------------------------ call pred. on tree matches */ __inline_call float operator () ( typename + tree_type::node_type *_lptr , + typename tree_type::item_data *_iptr ) { if (this->_find) return +0. ; + __unreferenced(_lptr); + real_type _qtmp[+3] = {+0.}; for ( ; _iptr != nullptr; @@ -2212,11 +2226,15 @@ /*------------------------ call pred. on tree matches */ __inline_call float operator () ( typename + tree_type::node_type *_lptr , + typename tree_type::item_data *_iptr ) { if (this->_find) return +0. ; + __unreferenced(_lptr); + real_type _qtmp[+3] = {+0.}; for ( ; _iptr != nullptr; @@ -2436,6 +2454,11 @@ ball_line_pred < hits_func > hits_pred ; + float static const _RTOL = + std::pow ( + std::numeric_limits + ::epsilon(), (float).675) ; + float _PMID[3] = { (float) _ball. _pmid[0] , (float) _ball. _pmid[1] , @@ -2445,6 +2468,8 @@ float _RRAD = (float) _ball. _rrad; + _RRAD *= (1.f + _RTOL) ; + /*------------------ call actual intersection testing */ tree_pred _pred(_PMID, _RRAD) ; hits_pred _func(_ball. _pmid, @@ -2485,6 +2510,11 @@ __unreferenced(_sbal) ; + float static const _RTOL = + std::pow ( + std::numeric_limits + ::epsilon(), (float).675) ; + float _PMID[3] = { (float) _disc. _pmid[0] , (float) _disc. _pmid[1] , @@ -2494,6 +2524,8 @@ float _RRAD = (float) _disc. _rrad; + _RRAD *= (1.f + _RTOL) ; + /*------------------ call actual intersection testing */ tree_pred _pred(_PMID, _RRAD) ; hits_pred _func(_disc. _pmid, @@ -2520,7 +2552,7 @@ real_type*_ppos, char_type _hits, char_type _feat, - char_type _topo, + char_type*_topo, iptr_type _itag ) { @@ -2536,6 +2568,17 @@ real_type *_ppos ) { + /*--------------------------- check against full bbox */ + if (_ppos[0] < this->_bmin[0] || + _ppos[1] < this->_bmin[1] || + _ppos[2] < this->_bmin[2] ) + return (iptr_type) -1 ; + + if (_ppos[0] > this->_bmax[0] || + _ppos[1] > this->_bmax[1] || + _ppos[2] > this->_bmax[2] ) + return (iptr_type) -1 ; + /*--------------------------- calc. axis-aligned dir. */ iptr_type _vdim = (iptr_type)+0; iptr_type _sign = (iptr_type)+0; @@ -2582,7 +2625,7 @@ } } - _vlen *= (real_type)+2. ; + _vlen *= (real_type)+8. ; /*--------------------------- calc. "is-inside" state */ if (this->_ptag.empty() ) @@ -2590,16 +2633,6 @@ /*--------------------------- null PART specification */ - if (_ppos[0] < this->_bmin[0] || - _ppos[1] < this->_bmin[1] || - _ppos[2] < this->_bmin[2] ) - return (iptr_type) -1 ; - - if (_ppos[0] > this->_bmax[0] || - _ppos[1] > this->_bmax[1] || - _ppos[2] > this->_bmax[2] ) - return (iptr_type) -1 ; - for(auto _iter = +0; _iter++ != +8; ) { real_type _rvec[ 4] ; @@ -2678,6 +2711,10 @@ { return ( (iptr_type) +0 ) ; } + else + { + return ( (iptr_type) -1 ) ; + } } } @@ -2786,6 +2823,7 @@ { return this->_ptag[_pnum] ; } + else { break ; } // outside: try next part } } @@ -2822,7 +2860,7 @@ real_type static const _RTOL= std::pow ( std::numeric_limits - ::epsilon(), (real_type)+.75); + ::epsilon(), (real_type)+.675) ; real_type _BTOL = ( this->_bmax[0] - @@ -2859,7 +2897,7 @@ real_type static const _RTOL= std::pow ( std::numeric_limits - ::epsilon(), (real_type)+.75); + ::epsilon(), (real_type)+.675) ; real_type _BTOL = ( this->_bmax[0] - diff --git a/external/jigsaw/src/libcpp/geometry.hpp b/external/jigsaw/src/libcpp/geometry.hpp index 56a2124..8472480 100644 --- a/external/jigsaw/src/libcpp/geometry.hpp +++ b/external/jigsaw/src/libcpp/geometry.hpp @@ -22,16 +22,20 @@ * how they can obtain it for free, then you are not * required to make any arrangement with me.) * - * Disclaimer: Neither I nor: Columbia University, The - * Massachusetts Institute of Technology, The - * University of Sydney, nor The National Aeronautics - * and Space Administration warrant this code in any - * way whatsoever. This code is provided "as-is" to be - * used at your own risk. + * Disclaimer: Neither I nor THE CONTRIBUTORS warrant + * this code in any way whatsoever. This code is + * provided "as-is" to be used at your own risk. + * + * THE CONTRIBUTORS include: + * (a) The University of Sydney + * (b) The Massachusetts Institute of Technology + * (c) Columbia University + * (d) The National Aeronautics & Space Administration + * (e) Los Alamos National Laboratory * ------------------------------------------------------------ * - * Last updated: 01 November, 2017 + * Last updated: 01 Nov., 2017 * * Copyright 2013-2017 * Darren Engwirda diff --git a/external/jigsaw/src/libcpp/geompred.hpp b/external/jigsaw/src/libcpp/geompred.hpp index d4965a6..ca78caf 100644 --- a/external/jigsaw/src/libcpp/geompred.hpp +++ b/external/jigsaw/src/libcpp/geompred.hpp @@ -22,16 +22,20 @@ * how they can obtain it for free, then you are not * required to make any arrangement with me.) * - * Disclaimer: Neither I nor: Columbia University, The - * Massachusetts Institute of Technology, The - * University of Sydney, nor The National Aeronautics - * and Space Administration warrant this code in any - * way whatsoever. This code is provided "as-is" to be - * used at your own risk. + * Disclaimer: Neither I nor THE CONTRIBUTORS warrant + * this code in any way whatsoever. This code is + * provided "as-is" to be used at your own risk. + * + * THE CONTRIBUTORS include: + * (a) The University of Sydney + * (b) The Massachusetts Institute of Technology + * (c) Columbia University + * (d) The National Aeronautics & Space Administration + * (e) Los Alamos National Laboratory * ------------------------------------------------------------ * - * Last updated: 01 March, 2020 + * Last updated: 01 Mar., 2020 * * Copyright 2020-- * Darren Engwirda diff --git a/external/jigsaw/src/libcpp/geomtype.hpp b/external/jigsaw/src/libcpp/geomreps.hpp similarity index 69% rename from external/jigsaw/src/libcpp/geomtype.hpp rename to external/jigsaw/src/libcpp/geomreps.hpp index 4722cef..b979619 100644 --- a/external/jigsaw/src/libcpp/geomtype.hpp +++ b/external/jigsaw/src/libcpp/geomreps.hpp @@ -22,16 +22,20 @@ * how they can obtain it for free, then you are not * required to make any arrangement with me.) * - * Disclaimer: Neither I nor: Columbia University, The - * Massachusetts Institute of Technology, The - * University of Sydney, nor The National Aeronautics - * and Space Administration warrant this code in any - * way whatsoever. This code is provided "as-is" to be - * used at your own risk. + * Disclaimer: Neither I nor THE CONTRIBUTORS warrant + * this code in any way whatsoever. This code is + * provided "as-is" to be used at your own risk. + * + * THE CONTRIBUTORS include: + * (a) The University of Sydney + * (b) The Massachusetts Institute of Technology + * (c) Columbia University + * (d) The National Aeronautics & Space Administration + * (e) Los Alamos National Laboratory * ------------------------------------------------------------ * - * Last updated: 20 February, 2020 + * Last updated: 20 Feb., 2020 * * Copyright 2013-2020 * Darren Engwirda @@ -43,8 +47,8 @@ # pragma once -# ifndef __GEOMTYPE__ -# define __GEOMTYPE__ +# ifndef __GEOMREPS__ +# define __GEOMREPS__ namespace mesh { @@ -60,19 +64,19 @@ # include "geometry.hpp" # include "aabbtree.hpp" -# include "meshtype.hpp" +# include "meshreps.hpp" # include "rdel_mesh/rdel_filt_k.hpp" -# include "geom_type/geom_base_2.hpp" -# include "geom_type/geom_base_3.hpp" +# include "geom_reps/geom_base_2.hpp" +# include "geom_reps/geom_base_3.hpp" -# include "geom_type/geom_mesh_euclidean_2.hpp" -# include "geom_type/geom_mesh_euclidean_3.hpp" +# include "geom_reps/geom_mesh_euclidean_2.hpp" +# include "geom_reps/geom_mesh_euclidean_3.hpp" -# include "geom_type/geom_mesh_ellipsoid_3.hpp" +# include "geom_reps/geom_mesh_ellipsoid_3.hpp" -# endif//__GEOMTYPE__ +# endif//__GEOMREPS__ diff --git a/external/jigsaw/src/libcpp/hashfunc.hpp b/external/jigsaw/src/libcpp/hashfunc.hpp index 65b164a..9f3b2b8 100644 --- a/external/jigsaw/src/libcpp/hashfunc.hpp +++ b/external/jigsaw/src/libcpp/hashfunc.hpp @@ -173,9 +173,9 @@ hashlittle() has to dance around fitting the key bytes into registers. ------------------------------------------------------------------------------- */ uint32_t hashword ( -__const_ptr(uint32_t) k, /* the key, an array of uint32_t values */ -size_t length, /* the length of the key, in uint32_ts */ -uint32_t initval) /* the previous hash, or an arbitrary value */ + const uint32_t *k, /* the key, an array of uint32_t values */ + size_t length, /* the length of the key, in uint32_ts */ + uint32_t initval) /* the previous hash, or an arbitrary value */ { uint32_t a,b,c; @@ -217,10 +217,10 @@ both be initialized with seeds. If you pass in (*pb)==0, the output ------------------------------------------------------------------------------- */ void hashword2 ( -__const_ptr(uint32_t) k, /* the key, an array of uint32_t values */ -size_t length, /* the length of the key, in uint32_ts */ -__write_ptr(uint32_t) pc, /* IN: seed OUT: primary hash value */ -__write_ptr(uint32_t) pb) /* IN: more seed OUT: secondary hash value */ + const uint32_t *k, /* the key, an array of uint32_t values */ + size_t length, /* the length of the key, in uint32_ts */ + uint32_t *pc, /* IN: seed OUT: primary hash value */ + uint32_t *pb) /* IN: more seed OUT: secondary hash value */ { uint32_t a,b,c; diff --git a/external/jigsaw/src/libcpp/meshfunc.hpp b/external/jigsaw/src/libcpp/interpolate.hpp similarity index 58% rename from external/jigsaw/src/libcpp/meshfunc.hpp rename to external/jigsaw/src/libcpp/interpolate.hpp index bb5bfbe..5a15151 100644 --- a/external/jigsaw/src/libcpp/meshfunc.hpp +++ b/external/jigsaw/src/libcpp/interpolate.hpp @@ -1,7 +1,7 @@ /* ------------------------------------------------------------ - * data-structures for discrete function rep. in R^d. + * data-structures for discrete interpolation in R^d. ------------------------------------------------------------ * * This program may be freely redistributed under the @@ -22,16 +22,20 @@ * how they can obtain it for free, then you are not * required to make any arrangement with me.) * - * Disclaimer: Neither I nor: Columbia University, The - * Massachusetts Institute of Technology, The - * University of Sydney, nor The National Aeronautics - * and Space Administration warrant this code in any - * way whatsoever. This code is provided "as-is" to be - * used at your own risk. + * Disclaimer: Neither I nor THE CONTRIBUTORS warrant + * this code in any way whatsoever. This code is + * provided "as-is" to be used at your own risk. + * + * THE CONTRIBUTORS include: + * (a) The University of Sydney + * (b) The Massachusetts Institute of Technology + * (c) Columbia University + * (d) The National Aeronautics & Space Administration + * (e) Los Alamos National Laboratory * ------------------------------------------------------------ * - * Last updated: 30 June, 2019 + * Last updated: 30 Jun., 2019 * * Copyright 2013-2019 * Darren Engwirda @@ -43,8 +47,8 @@ # pragma once -# ifndef __MESHFUNC__ -# define __MESHFUNC__ +# ifndef __INTERPOLATE__ +# define __INTERPOLATE__ # include "containers.hpp" # include "algorithms.hpp" @@ -53,25 +57,25 @@ # include "geometry.hpp" # include "aabbtree.hpp" -# include "meshtype.hpp" +# include "meshreps.hpp" -# include "mesh_func/hfun_base_k.hpp" -# include "mesh_func/hfun_clip_k.hpp" +# include "interpolate/hfun_base_k.hpp" +# include "interpolate/hfun_clip_k.hpp" -# include "mesh_func/hfun_constant_value_k.hpp" +# include "interpolate/hfun_constant_value_k.hpp" -# include "mesh_func/hfun_mesh_euclidean_2.hpp" -# include "mesh_func/hfun_mesh_euclidean_3.hpp" +# include "interpolate/hfun_mesh_euclidean_2.hpp" +# include "interpolate/hfun_mesh_euclidean_3.hpp" -# include "mesh_func/hfun_mesh_ellipsoid_3.hpp" +# include "interpolate/hfun_mesh_ellipsoid_3.hpp" -# include "mesh_func/hfun_grid_euclidean_2.hpp" -# include "mesh_func/hfun_grid_euclidean_3.hpp" +# include "interpolate/hfun_grid_euclidean_2.hpp" +# include "interpolate/hfun_grid_euclidean_3.hpp" -# include "mesh_func/hfun_grid_ellipsoid_3.hpp" +# include "interpolate/hfun_grid_ellipsoid_3.hpp" -# endif//__MESHFUNC__ +# endif//__INTERPOLATE__ diff --git a/external/jigsaw/src/libcpp/mesh_func/hfun_base_k.hpp b/external/jigsaw/src/libcpp/interpolate/hfun_base_k.hpp similarity index 83% rename from external/jigsaw/src/libcpp/mesh_func/hfun_base_k.hpp rename to external/jigsaw/src/libcpp/interpolate/hfun_base_k.hpp index 6e0ac70..c637b18 100644 --- a/external/jigsaw/src/libcpp/mesh_func/hfun_base_k.hpp +++ b/external/jigsaw/src/libcpp/interpolate/hfun_base_k.hpp @@ -22,16 +22,20 @@ * how they can obtain it for free, then you are not * required to make any arrangement with me.) * - * Disclaimer: Neither I nor: Columbia University, The - * Massachusetts Institute of Technology, The - * University of Sydney, nor The National Aeronautics - * and Space Administration warrant this code in any - * way whatsoever. This code is provided "as-is" to be - * used at your own risk. + * Disclaimer: Neither I nor THE CONTRIBUTORS warrant + * this code in any way whatsoever. This code is + * provided "as-is" to be used at your own risk. + * + * THE CONTRIBUTORS include: + * (a) The University of Sydney + * (b) The Massachusetts Institute of Technology + * (c) Columbia University + * (d) The National Aeronautics & Space Administration + * (e) Los Alamos National Laboratory * -------------------------------------------------------- * - * Last updated: 30 June, 2019 + * Last updated: 30 Jun., 2019 * * Copyright 2013-2019 * Darren Engwirda diff --git a/external/jigsaw/src/libcpp/mesh_func/hfun_clip_k.hpp b/external/jigsaw/src/libcpp/interpolate/hfun_clip_k.hpp similarity index 63% rename from external/jigsaw/src/libcpp/mesh_func/hfun_clip_k.hpp rename to external/jigsaw/src/libcpp/interpolate/hfun_clip_k.hpp index 9f5d57a..1772655 100644 --- a/external/jigsaw/src/libcpp/mesh_func/hfun_clip_k.hpp +++ b/external/jigsaw/src/libcpp/interpolate/hfun_clip_k.hpp @@ -22,18 +22,22 @@ * how they can obtain it for free, then you are not * required to make any arrangement with me.) * - * Disclaimer: Neither I nor: Columbia University, The - * Massachusetts Institute of Technology, The - * University of Sydney, nor The National Aeronautics - * and Space Administration warrant this code in any - * way whatsoever. This code is provided "as-is" to be - * used at your own risk. + * Disclaimer: Neither I nor THE CONTRIBUTORS warrant + * this code in any way whatsoever. This code is + * provided "as-is" to be used at your own risk. + * + * THE CONTRIBUTORS include: + * (a) The University of Sydney + * (b) The Massachusetts Institute of Technology + * (c) Columbia University + * (d) The National Aeronautics & Space Administration + * (e) Los Alamos National Laboratory * -------------------------------------------------------- * - * Last updated: 20 Apr., 2021 + * Last updated: 29 Jun., 2022 * - * Copyright 2013-2021 + * Copyright 2013-2022 * Darren Engwirda * d.engwirda@gmail.com * https://github.com/dengwirda @@ -52,7 +56,7 @@ typename real_type , typename vals_type > - __normal_call bool_type EIKONAL_edge_2d ( + __inline_call bool_type EIKONAL_edge_2d ( __const_ptr (real_type) _p1 , vals_type _h1 , vals_type _g1 , @@ -80,7 +84,7 @@ typename real_type , typename vals_type > - __normal_call bool_type EIKONAL_edge_3d ( + __inline_call bool_type EIKONAL_edge_3d ( __const_ptr (real_type) _p1 , vals_type _h1 , vals_type _g1 , @@ -150,8 +154,7 @@ _aa * _aa - _rr * _cc; vals_type _hn = - std::numeric_limits - ::infinity() ; + std::numeric_limits::infinity() ; real_type _tt[2] ; if (!math:: @@ -159,12 +162,12 @@ { /*-------------------------- test flow along boundary */ return EIKONAL_edge_2d ( - _p1, _h1, _gg, - _p3, _h3, _gg) + _p1, _h1, _g1, + _p3, _h3, _g3) | EIKONAL_edge_2d ( - _p2, _h2, _gg, - _p3, _h3, _gg) ; + _p2, _h2, _g2, + _p3, _h3, _g3) ; } else { @@ -257,8 +260,7 @@ _aa * _aa - _rr * _cc; vals_type _hn = - std::numeric_limits - ::infinity() ; + std::numeric_limits::infinity() ; real_type _tt[2] ; if (!math:: @@ -266,12 +268,12 @@ { /*-------------------------- test flow along boundary */ return EIKONAL_edge_3d ( - _p1, _h1, _gg, - _p3, _h3, _gg) + _p1, _h1, _g1, + _p3, _h3, _g3) | EIKONAL_edge_3d ( - _p2, _h2, _gg, - _p3, _h3, _gg) ; + _p2, _h2, _g2, + _p3, _h3, _g3) ; } else { @@ -327,6 +329,7 @@ __normal_call bool_type eikonal_edge_2d ( __const_ptr (real_type) _p1 , __const_ptr (real_type) _p2 , + vals_type _hb , // current anchor vals_type& _h1 , vals_type& _h2 , vals_type _g1 , @@ -336,21 +339,23 @@ /*---------------------- limit h-values within EDGE-2 */ bool_type _clip = false ; - vals_type _h0 = std::min(_h1,_h2) ; - - if (_h2 > _h0) + if (_h2 > _hb) /*--------------------------------- 1st node ordering */ - if (EIKONAL_edge_2d ( - _p1, _h1, _g1 , - _p2, _h2, _g2 ) ) - _clip = true ; - - if (_h1 > _h0) + if (_h1 >=(vals_type)+0. && + _h2 >=(vals_type)+0. ) + if (EIKONAL_edge_2d ( + _p1, _h1, _g1 , + _p2, _h2, _g2 ) ) + _clip = true ; + + if (_h1 > _hb) /*--------------------------------- 2nd node ordering */ - if (EIKONAL_edge_2d ( - _p2, _h2, _g2 , - _p1, _h1, _g1 ) ) - _clip = true ; + if (_h1 >=(vals_type)+0. && + _h2 >=(vals_type)+0. ) + if (EIKONAL_edge_2d ( + _p2, _h2, _g2 , + _p1, _h1, _g1 ) ) + _clip = true ; return ( _clip ) ; } @@ -362,6 +367,7 @@ __normal_call bool_type eikonal_edge_3d ( __const_ptr (real_type) _p1 , __const_ptr (real_type) _p2 , + vals_type _hb , // current anchor vals_type& _h1 , vals_type& _h2 , vals_type _g1 , @@ -371,21 +377,23 @@ /*---------------------- limit h-values within EDGE-2 */ bool_type _clip = false ; - vals_type _h0 = std::min(_h1,_h2) ; - - if (_h2 > _h0) + if (_h2 > _hb) /*--------------------------------- 1st node ordering */ - if (EIKONAL_edge_3d ( - _p1, _h1, _g1 , - _p2, _h2, _g2 ) ) - _clip = true ; - - if (_h1 > _h0) + if (_h1 >=(vals_type)+0. && + _h2 >=(vals_type)+0. ) + if (EIKONAL_edge_3d ( + _p1, _h1, _g1 , + _p2, _h2, _g2 ) ) + _clip = true ; + + if (_h1 > _hb) /*--------------------------------- 2nd node ordering */ - if (EIKONAL_edge_3d ( - _p2, _h2, _g2 , - _p1, _h1, _g1 ) ) - _clip = true ; + if (_h1 >=(vals_type)+0. && + _h2 >=(vals_type)+0. ) + if (EIKONAL_edge_3d ( + _p2, _h2, _g2 , + _p1, _h1, _g1 ) ) + _clip = true ; return ( _clip ) ; } @@ -398,6 +406,7 @@ __const_ptr (real_type) _p1 , __const_ptr (real_type) _p2 , __const_ptr (real_type) _p3 , + vals_type _hb , // current anchor vals_type& _h1 , vals_type& _h2 , vals_type& _h3 , @@ -409,32 +418,38 @@ /*---------------------- limit h-values within TRIA-3 */ bool_type _clip = false ; - vals_type _h0 = - std::min( _h3, std::min(_h1,_h2)) ; - - if (_h3 > _h0) + if (_h3 > _hb) /*--------------------------------- 1st node ordering */ - if (EIKONAL_tria_2d ( - _p1, _h1, _g1 , - _p2, _h2, _g2 , - _p3, _h3, _g3 ) ) - _clip = true ; - - if (_h1 > _h0) + if (_h1 >=(vals_type)+0. && + _h2 >=(vals_type)+0. && + _h3 >=(vals_type)+0. ) + if (EIKONAL_tria_2d ( + _p1, _h1, _g1 , + _p2, _h2, _g2 , + _p3, _h3, _g3 ) ) + _clip = true ; + + if (_h1 > _hb) /*--------------------------------- 2nd node ordering */ - if (EIKONAL_tria_2d ( - _p2, _h2, _g2 , - _p3, _h3, _g3 , - _p1, _h1, _g1 ) ) - _clip = true ; - - if (_h2 > _h0) + if (_h1 >=(vals_type)+0. && + _h2 >=(vals_type)+0. && + _h3 >=(vals_type)+0. ) + if (EIKONAL_tria_2d ( + _p2, _h2, _g2 , + _p3, _h3, _g3 , + _p1, _h1, _g1 ) ) + _clip = true ; + + if (_h2 > _hb) /*--------------------------------- 3rd node ordering */ - if (EIKONAL_tria_2d ( - _p3, _h3, _g3 , - _p1, _h1, _g1 , - _p2, _h2, _g2 ) ) - _clip = true ; + if (_h1 >=(vals_type)+0. && + _h2 >=(vals_type)+0. && + _h3 >=(vals_type)+0. ) + if (EIKONAL_tria_2d ( + _p3, _h3, _g3 , + _p1, _h1, _g1 , + _p2, _h2, _g2 ) ) + _clip = true ; return ( _clip ) ; } @@ -447,6 +462,7 @@ __const_ptr (real_type) _p1 , __const_ptr (real_type) _p2 , __const_ptr (real_type) _p3 , + vals_type _hb , // current anchor vals_type& _h1 , vals_type& _h2 , vals_type& _h3 , @@ -458,32 +474,38 @@ /*---------------------- limit h-values within TRIA-3 */ bool_type _clip = false ; - vals_type _h0 = - std::min( _h3, std::min(_h1,_h2)) ; - - if (_h3 > _h0) + if (_h3 > _hb) /*--------------------------------- 1st node ordering */ - if (EIKONAL_tria_3d ( - _p1, _h1, _g1 , - _p2, _h2, _g2 , - _p3, _h3, _g3 ) ) - _clip = true ; - - if (_h1 > _h0) + if (_h1 >=(vals_type)+0. && + _h2 >=(vals_type)+0. && + _h3 >=(vals_type)+0. ) + if (EIKONAL_tria_3d ( + _p1, _h1, _g1 , + _p2, _h2, _g2 , + _p3, _h3, _g3 ) ) + _clip = true ; + + if (_h1 > _hb) /*--------------------------------- 2nd node ordering */ - if (EIKONAL_tria_3d ( - _p2, _h2, _g2 , - _p3, _h3, _g3 , - _p1, _h1, _g1 ) ) - _clip = true ; - - if (_h2 > _h0) + if (_h1 >=(vals_type)+0. && + _h2 >=(vals_type)+0. && + _h3 >=(vals_type)+0. ) + if (EIKONAL_tria_3d ( + _p2, _h2, _g2 , + _p3, _h3, _g3 , + _p1, _h1, _g1 ) ) + _clip = true ; + + if (_h2 > _hb) /*--------------------------------- 3rd node ordering */ - if (EIKONAL_tria_3d ( - _p3, _h3, _g3 , - _p1, _h1, _g1 , - _p2, _h2, _g2 ) ) - _clip = true ; + if (_h1 >=(vals_type)+0. && + _h2 >=(vals_type)+0. && + _h3 >=(vals_type)+0. ) + if (EIKONAL_tria_3d ( + _p3, _h3, _g3 , + _p1, _h1, _g1 , + _p2, _h2, _g2 ) ) + _clip = true ; return ( _clip ) ; } @@ -497,6 +519,7 @@ __const_ptr (real_type) _p2 , __const_ptr (real_type) _p3 , __const_ptr (real_type) _p4 , + vals_type _hb , // current anchor vals_type& _h1 , vals_type& _h2 , vals_type& _h3 , @@ -516,18 +539,18 @@ real_type _a2 = geometry::tria_area_2d(_p1, _p3, _p4) ; - if (_a1*_a2 > (real_type)+0.) + if (_a1*_a2 > (real_type)+0. ) { _okay = true ; /*--------------------------------- 1st tria ordering */ if (eikonal_tria_2d ( - _p1, _p2, _p3 , + _p1, _p2, _p3 , _hb, _h1, _h2, _h3 , _g1, _g2, _g3 ) ) _clip = true ; if (eikonal_tria_2d ( - _p1, _p3, _p4 , + _p1, _p3, _p4 , _hb, _h1, _h3, _h4 , _g1, _g3, _g4 ) ) _clip = true ; @@ -538,18 +561,18 @@ real_type _a4 = geometry::tria_area_2d(_p2, _p3, _p4) ; - if (_a3*_a4 > (real_type)+0.) + if (_a3*_a4 > (real_type)+0. ) { _okay = true ; /*--------------------------------- 2nd tria ordering */ if (eikonal_tria_2d ( - _p1, _p2, _p4 , + _p1, _p2, _p4 , _hb, _h1, _h2, _h4 , _g1, _g2, _g4 ) ) _clip = true ; if (eikonal_tria_2d ( - _p2, _p3, _p4 , + _p2, _p3, _p4 , _hb, _h2, _h3, _h4 , _g2, _g3, _g4 ) ) _clip = true ; @@ -558,24 +581,90 @@ if (!_okay) { /*--------------------------------- a degenerate quad */ - if (EIKONAL_edge_2d ( - _p1, _h1, _g1 , - _p2, _h2, _g2 ) ) + if (_h1 >=(vals_type)+0. && + _h2 >=(vals_type)+0. ) + if (eikonal_edge_2d ( + _p1, _p2, _hb , + _h1, _h2, _g1 , _g2) ) _clip = true ; - if (EIKONAL_edge_2d ( - _p2, _h2, _g2 , - _p3, _h3, _g3 ) ) + if (_h2 >=(vals_type)+0. && + _h3 >=(vals_type)+0. ) + if (eikonal_edge_2d ( + _p2, _p3, _hb , + _h2, _h3, _g2 , _g3) ) _clip = true ; - if (EIKONAL_edge_2d ( - _p3, _h3, _g3 , - _p4, _h4, _g4 ) ) + if (_h3 >=(vals_type)+0. && + _h4 >=(vals_type)+0. ) + if (eikonal_edge_2d ( + _p3, _p4, _hb , + _h3, _h4, _g3 , _g4) ) _clip = true ; - if (EIKONAL_edge_2d ( - _p4, _h4, _g4 , - _p1, _h1, _g1 ) ) + if (_h4 >=(vals_type)+0. && + _h1 >=(vals_type)+0. ) + if (eikonal_edge_2d ( + _p4, _p1, _hb , + _h4, _h1, _g4 , _g1) ) + _clip = true ; + } + + return ( _clip ) ; + } + + template < + typename real_type , + typename vals_type + > + __normal_call bool_type eikonal_grid_2d ( + __const_ptr (real_type) _p1 , + __const_ptr (real_type) _p2 , + __const_ptr (real_type) _p3 , + __const_ptr (real_type) _p4 , + vals_type _hb , // current anchor + vals_type& _h1 , + vals_type& _h2 , + vals_type& _h3 , + vals_type& _h4 , + vals_type _g1 , + vals_type _g2 , + vals_type _g3 , + vals_type _g4 + ) + { + /*---------------------- limit h-values within GRID-4 */ + bool_type _clip = false ; + + if (true) + { + /*--------------------------------- 1st tria ordering */ + if (eikonal_tria_2d ( + _p1, _p2, _p3 , _hb, + _h1, _h2, _h3 , + _g1, _g2, _g3 ) ) + _clip = true ; + + if (eikonal_tria_2d ( + _p1, _p3, _p4 , _hb, + _h1, _h3, _h4 , + _g1, _g3, _g4 ) ) + _clip = true ; + } + + if (true) + { + /*--------------------------------- 2nd tria ordering */ + if (eikonal_tria_2d ( + _p1, _p2, _p4 , _hb, + _h1, _h2, _h4 , + _g1, _g2, _g4 ) ) + _clip = true ; + + if (eikonal_tria_2d ( + _p2, _p3, _p4 , _hb, + _h2, _h3, _h4 , + _g2, _g3, _g4 ) ) _clip = true ; } @@ -591,6 +680,7 @@ __const_ptr (real_type) _p2 , __const_ptr (real_type) _p3 , __const_ptr (real_type) _p4 , + vals_type _hb , // current anchor vals_type& _h1 , vals_type& _h2 , vals_type& _h3 , @@ -618,13 +708,13 @@ _okay = true ; /*--------------------------------- 1st tria ordering */ if (eikonal_tria_3d ( - _p1, _p2, _p3 , + _p1, _p2, _p3 , _hb, _h1, _h2, _h3 , _g1, _g2, _g3 ) ) _clip = true ; if (eikonal_tria_3d ( - _p1, _p3, _p4 , + _p1, _p3, _p4 , _hb, _h1, _h3, _h4 , _g1, _g3, _g4 ) ) _clip = true ; @@ -643,13 +733,13 @@ _okay = true ; /*--------------------------------- 2nd tria ordering */ if (eikonal_tria_3d ( - _p1, _p2, _p4 , + _p1, _p2, _p4 , _hb, _h1, _h2, _h4 , _g1, _g2, _g4 ) ) _clip = true ; if (eikonal_tria_3d ( - _p2, _p3, _p4 , + _p2, _p3, _p4 , _hb, _h2, _h3, _h4 , _g2, _g3, _g4 ) ) _clip = true ; @@ -658,24 +748,90 @@ if (!_okay) { /*--------------------------------- a degenerate quad */ - if (EIKONAL_edge_3d ( - _p1, _h1, _g1 , - _p2, _h2, _g2 ) ) + if (_h1 >=(vals_type)+0. && + _h2 >=(vals_type)+0. ) + if (eikonal_edge_3d ( + _p1, _p2, _hb , + _h1, _h2, _g1 , _g2) ) + _clip = true ; + + if (_h2 >=(vals_type)+0. && + _h3 >=(vals_type)+0. ) + if (eikonal_edge_3d ( + _p2, _p3, _hb , + _h2, _h3, _g2 , _g3) ) _clip = true ; - if (EIKONAL_edge_3d ( - _p2, _h2, _g2 , - _p3, _h3, _g3 ) ) + if (_h3 >=(vals_type)+0. && + _h4 >=(vals_type)+0. ) + if (eikonal_edge_3d ( + _p3, _p4, _hb , + _h3, _h4, _g3 , _g4) ) _clip = true ; - if (EIKONAL_edge_3d ( - _p3, _h3, _g3 , - _p4, _h4, _g4 ) ) + if (_h4 >=(vals_type)+0. && + _h1 >=(vals_type)+0. ) + if (eikonal_edge_3d ( + _p4, _p1, _hb , + _h4, _h1, _g4 , _g1) ) _clip = true ; + } + + return ( _clip ) ; + } - if (EIKONAL_edge_3d ( - _p4, _h4, _g4 , - _p1, _h1, _g1 ) ) + template < + typename real_type , + typename vals_type + > + __normal_call bool_type eikonal_grid_3d ( + __const_ptr (real_type) _p1 , + __const_ptr (real_type) _p2 , + __const_ptr (real_type) _p3 , + __const_ptr (real_type) _p4 , + vals_type _hb , // current anchor + vals_type& _h1 , + vals_type& _h2 , + vals_type& _h3 , + vals_type& _h4 , + vals_type _g1 , + vals_type _g2 , + vals_type _g3 , + vals_type _g4 + ) + { + /*---------------------- limit h-values within GRID-4 */ + bool_type _clip = false ; + + if (true) + { + /*--------------------------------- 1st tria ordering */ + if (eikonal_tria_3d ( + _p1, _p2, _p3 , _hb, + _h1, _h2, _h3 , + _g1, _g2, _g3 ) ) + _clip = true ; + + if (eikonal_tria_3d ( + _p1, _p3, _p4 , _hb, + _h1, _h3, _h4 , + _g1, _g3, _g4 ) ) + _clip = true ; + } + + if (true) + { + /*--------------------------------- 2nd tria ordering */ + if (eikonal_tria_3d ( + _p1, _p2, _p4 , _hb, + _h1, _h2, _h4 , + _g1, _g2, _g4 ) ) + _clip = true ; + + if (eikonal_tria_3d ( + _p2, _p3, _p4 , _hb, + _h2, _h3, _h4 , + _g2, _g3, _g4 ) ) _clip = true ; } @@ -691,6 +847,7 @@ __const_ptr (real_type) /*_p2*/ , __const_ptr (real_type) /*_p3*/ , __const_ptr (real_type) /*_p4*/ , + vals_type /*_hb*/ , // current anchor vals_type& /*_h1*/ , vals_type& /*_h2*/ , vals_type& /*_h3*/ , diff --git a/external/jigsaw/src/libcpp/mesh_func/hfun_constant_value_k.hpp b/external/jigsaw/src/libcpp/interpolate/hfun_constant_value_k.hpp similarity index 84% rename from external/jigsaw/src/libcpp/mesh_func/hfun_constant_value_k.hpp rename to external/jigsaw/src/libcpp/interpolate/hfun_constant_value_k.hpp index bd9ac7c..0f557a6 100644 --- a/external/jigsaw/src/libcpp/mesh_func/hfun_constant_value_k.hpp +++ b/external/jigsaw/src/libcpp/interpolate/hfun_constant_value_k.hpp @@ -22,16 +22,20 @@ * how they can obtain it for free, then you are not * required to make any arrangement with me.) * - * Disclaimer: Neither I nor: Columbia University, The - * Massachusetts Institute of Technology, The - * University of Sydney, nor The National Aeronautics - * and Space Administration warrant this code in any - * way whatsoever. This code is provided "as-is" to be - * used at your own risk. + * Disclaimer: Neither I nor THE CONTRIBUTORS warrant + * this code in any way whatsoever. This code is + * provided "as-is" to be used at your own risk. + * + * THE CONTRIBUTORS include: + * (a) The University of Sydney + * (b) The Massachusetts Institute of Technology + * (c) Columbia University + * (d) The National Aeronautics & Space Administration + * (e) Los Alamos National Laboratory * -------------------------------------------------------- * - * Last updated: 21 August, 2017 + * Last updated: 21 Aug., 2017 * * Copyright 2013-2017 * Darren Engwirda diff --git a/external/jigsaw/src/libcpp/mesh_func/hfun_grid_ellipsoid_3.hpp b/external/jigsaw/src/libcpp/interpolate/hfun_grid_ellipsoid_3.hpp similarity index 80% rename from external/jigsaw/src/libcpp/mesh_func/hfun_grid_ellipsoid_3.hpp rename to external/jigsaw/src/libcpp/interpolate/hfun_grid_ellipsoid_3.hpp index 391782e..7b3bd24 100644 --- a/external/jigsaw/src/libcpp/mesh_func/hfun_grid_ellipsoid_3.hpp +++ b/external/jigsaw/src/libcpp/interpolate/hfun_grid_ellipsoid_3.hpp @@ -22,18 +22,22 @@ * how they can obtain it for free, then you are not * required to make any arrangement with me.) * - * Disclaimer: Neither I nor: Columbia University, The - * Massachusetts Institute of Technology, The - * University of Sydney, nor The National Aeronautics - * and Space Administration warrant this code in any - * way whatsoever. This code is provided "as-is" to be - * used at your own risk. + * Disclaimer: Neither I nor THE CONTRIBUTORS warrant + * this code in any way whatsoever. This code is + * provided "as-is" to be used at your own risk. + * + * THE CONTRIBUTORS include: + * (a) The University of Sydney + * (b) The Massachusetts Institute of Technology + * (c) Columbia University + * (d) The National Aeronautics & Space Administration + * (e) Los Alamos National Laboratory * -------------------------------------------------------- * - * Last updated: 20 Apr., 2021 + * Last updated: 15 Jun., 2022 * - * Copyright 2013-2021 + * Copyright 2013-2022 * Darren Engwirda * d.engwirda@gmail.com * https://github.com/dengwirda/ @@ -197,8 +201,9 @@ ) { real_type static const _FTOL = - std::pow(std::numeric_limits - ::epsilon(), (real_type)+.80) ; + std::pow ( + std::numeric_limits + ::epsilon(), (real_type) +.75) ; this->_xvar = false ; this->_yvar = false ; @@ -303,13 +308,11 @@ { /*-------------------- "LESS-THAN" operator for queue */ public : - typename - vals_list::_write_it _hptr; + typename vals_list::_write_it _hptr ; public : __inline_call less_than ( - typename - vals_list::_write_it _hsrc + typename vals_list::_write_it _hsrc ) : _hptr(_hsrc) {} __inline_call @@ -322,23 +325,20 @@ } } ; - typedef typename - allocator:: size_type uint_type ; - - uint_type static constexpr - _null = - std::numeric_limits::max() ; + size_t static constexpr _imax = + std::numeric_limits::max() ; - containers::prioritymap < + containers::priorityidx < + iptr_type , iptr_type , less_than , allocator > _sort((less_than(this->_hmat.head()))); - containers:: array < - typename - allocator:: size_type, - allocator > _keys; + /*-------------------- check matrix size against type */ + if (this->_hmat.count() >= _imax) + throw std::out_of_range( + "hfun.clip: data size limit exceeded"); /*-------------------- init. values for periodic bc's */ iptr_type IBEG = +0; @@ -374,10 +374,6 @@ } /*-------------------- push nodes onto priority queue */ - _keys.set_count ( - _hmat.count(), - containers::tight_alloc, _null) ; - { iptr_type _inum = +0; for (auto _iter = @@ -386,7 +382,7 @@ this->_hmat.tend() ; ++_iter , ++_inum) { - _keys[_inum] = _sort.push(_inum); + _sort.push(_inum, _inum ) ; } } @@ -432,12 +428,20 @@ } /*-------------------- compute h(x) via fast-marching */ + vals_type static _FTOL = + (vals_type)std::pow( + std::numeric_limits::epsilon(), .75) ; + + # define ISALIVE(__idx) \ + (_sort.keys(__idx) != _sort.null()) + + # define UPDATED(__new, __old) \ + std::abs(__new - __old) > _FTOL*std::abs(__new) + for ( ; !_sort.empty() ; ) { - iptr_type _base ; - _sort._pop_root(_base) ; - - _keys[_base] = _null ; + iptr_type _base, _bidx; + _sort._pop_root( _bidx, _base) ; iptr_type _ipos, _jpos ; subs_from_indx( @@ -445,6 +449,8 @@ vals_type _hnow = _hmat[_base] ; + if (_hnow < (vals_type)+0.) continue ; + for (auto _IPOS = _ipos - 1 ; _IPOS < _ipos + 1 ; ++_IPOS ) @@ -484,17 +490,16 @@ indx_from_subs( _lpii, _lpjj, _lnod); - /*-------------------- skip any cells with null nodes */ - if (_keys[_inod] == _null && - _inod != _base) continue ; - if (_keys[_jnod] == _null && - _jnod != _base) continue ; - if (_keys[_knod] == _null && - _knod != _base) continue ; - if (_keys[_lnod] == _null && - _lnod != _base) continue ; - /*-------------------- skip cells due to sorted order */ + if (_inod != _base && + !ISALIVE(_inod)) continue ; + if (_jnod != _base && + !ISALIVE(_jnod)) continue ; + if (_knod != _base && + !ISALIVE(_knod)) continue ; + if (_lnod != _base && + !ISALIVE(_lnod)) continue ; + vals_type _hmax; _hmax = this->_hmat[_inod] ; _hmax = std::max( @@ -557,41 +562,63 @@ vals_type _lold = this->_hmat[_lnod] ; + vals_type _inew = + this->_hmat[_inod] ; + vals_type _jnew = + this->_hmat[_jnod] ; + vals_type _knew = + this->_hmat[_knod] ; + vals_type _lnew = + this->_hmat[_lnod] ; + if (this->_dhdx.count() >1) { /*-------------------- update adj. set, g = g(x) case */ - if (eikonal_quad_3d ( + if (eikonal_grid_3d ( _IXYZ , _JXYZ , - _KXYZ , _LXYZ , - this->_hmat[_inod], - this->_hmat[_jnod], - this->_hmat[_knod], - this->_hmat[_lnod], + _KXYZ , _LXYZ , _hnow , + _inew , _jnew , + _knew , _lnew , this->_dhdx[_inod], this->_dhdx[_jnod], this->_dhdx[_knod], this->_dhdx[_lnod]) ) { - if (_keys[_inod] != _null) - if (_hmat[_inod] != _iold) - _sort.update( - _keys[_inod] , _inod) ; + // push updates one-at-a-time to ensure heap + // maintains its sorted order - if (_keys[_jnod] != _null) - if (_hmat[_jnod] != _jold) - _sort.update( - _keys[_jnod] , _jnod) ; + if (_sort. + keys(_inod) != _sort.null()) + if ( UPDATED(_inew, _iold) ) + { + _hmat[_inod] = _inew; + _sort.reduce(_inod , _inod) ; + } - if (_keys[_knod] != _null) - if (_hmat[_knod] != _kold) - _sort.update( - _keys[_knod] , _knod) ; + if (_sort. + keys(_jnod) != _sort.null()) + if ( UPDATED(_jnew, _jold) ) + { + _hmat[_jnod] = _jnew; + _sort.reduce(_jnod , _jnod) ; + } - if (_keys[_lnod] != _null) - if (_hmat[_lnod] != _lold) - _sort.update( - _keys[_lnod] , _lnod) ; + if (_sort. + keys(_knod) != _sort.null()) + if ( UPDATED(_knew, _kold) ) + { + _hmat[_knod] = _knew; + _sort.reduce(_knod , _knod) ; + } + + if (_sort. + keys(_lnod) != _sort.null()) + if ( UPDATED(_lnew, _lold) ) + { + _hmat[_lnod] = _lnew; + _sort.reduce(_lnod , _lnod) ; + } if (this->_wrap) { @@ -605,10 +632,10 @@ this->_hmat [_pair] = this->_hmat [_inod] ; - if (_keys[_pair] != _null) + if (_sort. + keys(_pair) != _sort.null()) if (_hmat[_inod] != _iold) - _sort.update( - _keys[_pair] , _pair) ; + _sort.reduce(_pair , _pair) ; } if (_jpjj==JEND) @@ -620,10 +647,10 @@ this->_hmat [_pair] = this->_hmat [_jnod] ; - if (_keys[_pair] != _null) + if (_sort. + keys(_pair) != _sort.null()) if (_hmat[_jnod] != _jold) - _sort.update( - _keys[_pair] , _pair) ; + _sort.reduce(_pair , _pair) ; } if (_kpjj==JEND) @@ -635,10 +662,10 @@ this->_hmat [_pair] = this->_hmat [_knod] ; - if (_keys[_pair] != _null) + if (_sort. + keys(_pair) != _sort.null()) if (_hmat[_knod] != _kold) - _sort.update( - _keys[_pair] , _pair) ; + _sort.reduce(_pair , _pair) ; } if (_lpjj==JBEG) @@ -650,10 +677,10 @@ this->_hmat [_pair] = this->_hmat [_lnod] ; - if (_keys[_pair] != _null) + if (_sort. + keys(_pair) != _sort.null()) if (_hmat[_lnod] != _lold) - _sort.update( - _keys[_pair] , _pair) ; + _sort.reduce(_pair , _pair) ; } } @@ -663,38 +690,51 @@ if (this->_dhdx.count()==1) { /*-------------------- update adj. set, const. g case */ - if (eikonal_quad_3d ( + if (eikonal_grid_3d ( _IXYZ , _JXYZ , - _KXYZ , _LXYZ , - this->_hmat[_inod], - this->_hmat[_jnod], - this->_hmat[_knod], - this->_hmat[_lnod], + _KXYZ , _LXYZ , _hnow , + _inew , _jnew , + _knew , _lnew , this->_dhdx[ +0 ], this->_dhdx[ +0 ], this->_dhdx[ +0 ], this->_dhdx[ +0 ]) ) { - if (_keys[_inod] != _null) - if (_hmat[_inod] != _iold) - _sort.update( - _keys[_inod] , _inod) ; + // push updates one-at-a-time to ensure heap + // maintains its sorted order - if (_keys[_jnod] != _null) - if (_hmat[_jnod] != _jold) - _sort.update( - _keys[_jnod] , _jnod) ; + if (_sort. + keys(_inod) != _sort.null()) + if ( UPDATED(_inew, _iold) ) + { + _hmat[_inod] = _inew; + _sort.reduce(_inod , _inod) ; + } - if (_keys[_knod] != _null) - if (_hmat[_knod] != _kold) - _sort.update( - _keys[_knod] , _knod) ; + if (_sort. + keys(_jnod) != _sort.null()) + if ( UPDATED(_jnew, _jold) ) + { + _hmat[_jnod] = _jnew; + _sort.reduce(_jnod , _jnod) ; + } - if (_keys[_lnod] != _null) - if (_hmat[_lnod] != _lold) - _sort.update( - _keys[_lnod] , _lnod) ; + if (_sort. + keys(_knod) != _sort.null()) + if ( UPDATED(_knew, _kold) ) + { + _hmat[_knod] = _knew; + _sort.reduce(_knod , _knod) ; + } + + if (_sort. + keys(_lnod) != _sort.null()) + if ( UPDATED(_lnew, _lold) ) + { + _hmat[_lnod] = _lnew; + _sort.reduce(_lnod , _lnod) ; + } if (this->_wrap) { @@ -708,10 +748,10 @@ this->_hmat [_pair] = this->_hmat [_inod] ; - if (_keys[_pair] != _null) + if (_sort. + keys(_pair) != _sort.null()) if (_hmat[_inod] != _iold) - _sort.update( - _keys[_pair] , _pair) ; + _sort.reduce(_pair , _pair) ; } if (_jpjj==JEND) @@ -723,10 +763,10 @@ this->_hmat [_pair] = this->_hmat [_jnod] ; - if (_keys[_pair] != _null) + if (_sort. + keys(_pair) != _sort.null()) if (_hmat[_jnod] != _jold) - _sort.update( - _keys[_pair] , _pair) ; + _sort.reduce(_pair , _pair) ; } if (_kpjj==JEND) @@ -738,10 +778,10 @@ this->_hmat [_pair] = this->_hmat [_knod] ; - if (_keys[_pair] != _null) + if (_sort. + keys(_pair) != _sort.null()) if (_hmat[_knod] != _kold) - _sort.update( - _keys[_pair] , _pair) ; + _sort.reduce(_pair , _pair) ; } if (_lpjj==JBEG) @@ -753,10 +793,10 @@ this->_hmat [_pair] = this->_hmat [_lnod] ; - if (_keys[_pair] != _null) + if (_sort. + keys(_pair) != _sort.null()) if (_hmat[_lnod] != _lold) - _sort.update( - _keys[_pair] , _pair) ; + _sort.reduce(_pair , _pair) ; } } @@ -767,6 +807,8 @@ } } + # undef ISALIVE + # undef UPDATED } /* @@ -874,8 +916,8 @@ } /*---------------------------- find enclosing x-range */ - iptr_type _ipos = (iptr_type) -1 ; - iptr_type _jpos = (iptr_type) -1 ; + auto _ipos = this-> null_hint() ; + auto _jpos = this-> null_hint() ; if (this->_xvar) { diff --git a/external/jigsaw/src/libcpp/mesh_func/hfun_grid_euclidean_2.hpp b/external/jigsaw/src/libcpp/interpolate/hfun_grid_euclidean_2.hpp similarity index 73% rename from external/jigsaw/src/libcpp/mesh_func/hfun_grid_euclidean_2.hpp rename to external/jigsaw/src/libcpp/interpolate/hfun_grid_euclidean_2.hpp index 162391d..0619b53 100644 --- a/external/jigsaw/src/libcpp/mesh_func/hfun_grid_euclidean_2.hpp +++ b/external/jigsaw/src/libcpp/interpolate/hfun_grid_euclidean_2.hpp @@ -22,18 +22,22 @@ * how they can obtain it for free, then you are not * required to make any arrangement with me.) * - * Disclaimer: Neither I nor: Columbia University, The - * Massachusetts Institute of Technology, The - * University of Sydney, nor The National Aeronautics - * and Space Administration warrant this code in any - * way whatsoever. This code is provided "as-is" to be - * used at your own risk. + * Disclaimer: Neither I nor THE CONTRIBUTORS warrant + * this code in any way whatsoever. This code is + * provided "as-is" to be used at your own risk. + * + * THE CONTRIBUTORS include: + * (a) The University of Sydney + * (b) The Massachusetts Institute of Technology + * (c) Columbia University + * (d) The National Aeronautics & Space Administration + * (e) Los Alamos National Laboratory * -------------------------------------------------------- * - * Last updated: 09. Feb, 2021 + * Last updated: 15 Jun., 2022 * - * Copyright 2013-2021 + * Copyright 2013-2022 * Darren Engwirda * d.engwirda@gmail.com * https://github.com/dengwirda/ @@ -140,13 +144,11 @@ { /*-------------------- "LESS-THAN" operator for queue */ public : - typename - vals_list::_write_it _hptr; + typename vals_list::_write_it _hptr ; public : __inline_call less_than ( - typename - vals_list::_write_it _hsrc + typename vals_list::_write_it _hsrc ) : _hptr(_hsrc) {} __inline_call @@ -159,29 +161,14 @@ } } ; - typedef typename - allocator:: size_type uint_type ; - - uint_type static constexpr - _null = - std::numeric_limits::max() ; - - containers::prioritymap < + containers::priorityidx < + iptr_type , iptr_type , less_than , allocator > _sort((less_than(this->_hmat.head()))); - containers:: array < - typename - allocator:: size_type, - allocator > _keys; - /*-------------------- push nodes onto priority queue */ - _keys.set_count ( - _hmat.count(), - containers::tight_alloc, _null) ; - iptr_type _inum = +0; for (auto _iter = this->_hmat.head() ; @@ -189,10 +176,14 @@ this->_hmat.tend() ; ++_iter , ++_inum) { - _keys[_inum] = _sort.push (_inum) ; + _sort.push(_inum, _inum ) ; } /*-------------------- compute h(x) via fast-marching */ + vals_type static _FTOL = + (vals_type)std::pow( + std::numeric_limits::epsilon(), .75) ; + iptr_type IBEG = +0; iptr_type IEND = (iptr_type)this->_ypos.count() - 1 ; @@ -201,12 +192,16 @@ iptr_type JEND = (iptr_type)this->_xpos.count() - 1 ; + # define ISALIVE(__idx) \ + (_sort.keys(__idx) != _sort.null()) + + # define UPDATED(__new, __old) \ + std::abs(__new - __old) > _FTOL*std::abs(__new) + for ( ; !_sort.empty() ; ) { - iptr_type _base ; - _sort._pop_root(_base) ; - - _keys[_base] = _null ; + iptr_type _base, _bidx; + _sort._pop_root( _bidx, _base) ; iptr_type _ipos, _jpos ; subs_from_indx( @@ -253,17 +248,16 @@ indx_from_subs( _lpii, _lpjj, _lnod); - /*-------------------- skip any cells with null nodes */ - if (_keys[_inod] == _null && - _inod != _base) continue ; - if (_keys[_jnod] == _null && - _jnod != _base) continue ; - if (_keys[_knod] == _null && - _knod != _base) continue ; - if (_keys[_lnod] == _null && - _lnod != _base) continue ; - /*-------------------- skip cells due to sorted order */ + if (_inod != _base && + !ISALIVE(_inod)) continue ; + if (_jnod != _base && + !ISALIVE(_jnod)) continue ; + if (_knod != _base && + !ISALIVE(_knod)) continue ; + if (_lnod != _base && + !ISALIVE(_lnod)) continue ; + vals_type _hmax; _hmax = this->_hmat[_inod] ; _hmax = std::max( @@ -302,41 +296,63 @@ vals_type _lold = this->_hmat[_lnod] ; + vals_type _inew = + this->_hmat[_inod] ; + vals_type _jnew = + this->_hmat[_jnod] ; + vals_type _knew = + this->_hmat[_knod] ; + vals_type _lnew = + this->_hmat[_lnod] ; + if (this->_dhdx.count() >1) { /*-------------------- update adj. set, g = g(x) case */ - if (eikonal_quad_2d ( + if (eikonal_grid_2d ( _IXYZ , _JXYZ , - _KXYZ , _LXYZ , - this->_hmat[_inod], - this->_hmat[_jnod], - this->_hmat[_knod], - this->_hmat[_lnod], + _KXYZ , _LXYZ , _hnow , + _inew , _jnew , + _knew , _lnew , this->_dhdx[_inod], this->_dhdx[_jnod], this->_dhdx[_knod], this->_dhdx[_lnod]) ) { - if (_keys[_inod] != _null) - if (_hmat[_inod] != _iold) - _sort.update( - _keys[_inod] , _inod) ; + // push updates one-at-a-time to ensure heap + // maintains its sorted order - if (_keys[_jnod] != _null) - if (_hmat[_jnod] != _jold) - _sort.update( - _keys[_jnod] , _jnod) ; + if (_sort. + keys(_inod) != _sort.null()) + if ( UPDATED(_inew, _iold) ) + { + _hmat[_inod] = _inew; + _sort.reduce(_inod , _inod) ; + } - if (_keys[_knod] != _null) - if (_hmat[_knod] != _kold) - _sort.update( - _keys[_knod] , _knod) ; + if (_sort. + keys(_jnod) != _sort.null()) + if ( UPDATED(_jnew, _jold) ) + { + _hmat[_jnod] = _jnew; + _sort.reduce(_jnod , _jnod) ; + } - if (_keys[_lnod] != _null) - if (_hmat[_lnod] != _lold) - _sort.update( - _keys[_lnod] , _lnod) ; + if (_sort. + keys(_knod) != _sort.null()) + if ( UPDATED(_knew, _kold) ) + { + _hmat[_knod] = _knew; + _sort.reduce(_knod , _knod) ; + } + + if (_sort. + keys(_lnod) != _sort.null()) + if ( UPDATED(_lnew, _lold) ) + { + _hmat[_lnod] = _lnew; + _sort.reduce(_lnod , _lnod) ; + } } } @@ -344,38 +360,51 @@ if (this->_dhdx.count()==1) { /*-------------------- update adj. set, const. g case */ - if (eikonal_quad_2d ( + if (eikonal_grid_2d ( _IXYZ , _JXYZ , - _KXYZ , _LXYZ , - this->_hmat[_inod], - this->_hmat[_jnod], - this->_hmat[_knod], - this->_hmat[_lnod], + _KXYZ , _LXYZ , _hnow , + _inew , _jnew , + _knew , _lnew , this->_dhdx[ +0 ], this->_dhdx[ +0 ], this->_dhdx[ +0 ], this->_dhdx[ +0 ]) ) { - if (_keys[_inod] != _null) - if (_hmat[_inod] != _iold) - _sort.update( - _keys[_inod] , _inod) ; + // push updates one-at-a-time to ensure heap + // maintains its sorted order + + if (_sort. + keys(_inod) != _sort.null()) + if ( UPDATED(_inew, _iold) ) + { + _hmat[_inod] = _inew; + _sort.reduce(_inod , _inod) ; + } - if (_keys[_jnod] != _null) - if (_hmat[_jnod] != _jold) - _sort.update( - _keys[_jnod] , _jnod) ; + if (_sort. + keys(_jnod) != _sort.null()) + if ( UPDATED(_jnew, _jold) ) + { + _hmat[_jnod] = _jnew; + _sort.reduce(_jnod , _jnod) ; + } - if (_keys[_knod] != _null) - if (_hmat[_knod] != _kold) - _sort.update( - _keys[_knod] , _knod) ; + if (_sort. + keys(_knod) != _sort.null()) + if ( UPDATED(_knew, _kold) ) + { + _hmat[_knod] = _knew; + _sort.reduce(_knod , _knod) ; + } - if (_keys[_lnod] != _null) - if (_hmat[_lnod] != _lold) - _sort.update( - _keys[_lnod] , _lnod) ; + if (_sort. + keys(_lnod) != _sort.null()) + if ( UPDATED(_lnew, _lold) ) + { + _hmat[_lnod] = _lnew; + _sort.reduce(_lnod , _lnod) ; + } } } @@ -384,6 +413,8 @@ } } + # undef ISALIVE + # undef UPDATED } /* @@ -393,11 +424,14 @@ */ __inline_call void_type init ( + float _xoff = + 0.f , + float _yoff = + 0.f ) { real_type static const _FTOL = - std::pow(std::numeric_limits - ::epsilon(), (real_type).8); + std::pow ( + std::numeric_limits + ::epsilon(), (real_type) +.75) ; this->_xvar = false ; this->_yvar = false ; @@ -405,6 +439,14 @@ if (this->_xpos.empty()) return ; if (this->_ypos.empty()) return ; + for (auto + _iter = this->_xpos.head() ; + _iter != this->_xpos.tend() ; + ++_iter ) + { + *_iter -= _xoff ; + } + real_type _xbar, _xmin, _xmax ; _xbar = *this->_xpos.tail() - *this->_xpos.head() ; @@ -414,6 +456,14 @@ _xmin = _xbar - _FTOL * _xbar ; _xmax = _xbar + _FTOL * _xbar ; + for (auto + _iter = this->_ypos.head() ; + _iter != this->_ypos.tend() ; + ++_iter ) + { + *_iter -= _yoff ; + } + real_type _ybar, _ymin, _ymax ; _ybar = *this->_ypos.tail() - *this->_ypos.head() ; @@ -492,8 +542,8 @@ _YPOS = *this->_ypos.tail() ; /*---------------------------- find enclosing x-range */ - iptr_type _ipos = (iptr_type)-1 ; - iptr_type _jpos = (iptr_type)-1 ; + auto _ipos = this-> null_hint() ; + auto _jpos = this-> null_hint() ; if (this->_xvar == true) { diff --git a/external/jigsaw/src/libcpp/mesh_func/hfun_grid_euclidean_3.hpp b/external/jigsaw/src/libcpp/interpolate/hfun_grid_euclidean_3.hpp similarity index 89% rename from external/jigsaw/src/libcpp/mesh_func/hfun_grid_euclidean_3.hpp rename to external/jigsaw/src/libcpp/interpolate/hfun_grid_euclidean_3.hpp index 84e0b39..c56f854 100644 --- a/external/jigsaw/src/libcpp/mesh_func/hfun_grid_euclidean_3.hpp +++ b/external/jigsaw/src/libcpp/interpolate/hfun_grid_euclidean_3.hpp @@ -22,18 +22,22 @@ * how they can obtain it for free, then you are not * required to make any arrangement with me.) * - * Disclaimer: Neither I nor: Columbia University, The - * Massachusetts Institute of Technology, The - * University of Sydney, nor The National Aeronautics - * and Space Administration warrant this code in any - * way whatsoever. This code is provided "as-is" to be - * used at your own risk. + * Disclaimer: Neither I nor THE CONTRIBUTORS warrant + * this code in any way whatsoever. This code is + * provided "as-is" to be used at your own risk. + * + * THE CONTRIBUTORS include: + * (a) The University of Sydney + * (b) The Massachusetts Institute of Technology + * (c) Columbia University + * (d) The National Aeronautics & Space Administration + * (e) Los Alamos National Laboratory * -------------------------------------------------------- * - * Last updated: 09 Feb., 2021 + * Last updated: 15 Jun., 2022 * - * Copyright 2013-2021 + * Copyright 2013-2022 * Darren Engwirda * d.engwirda@gmail.com * https://github.com/dengwirda/ @@ -128,11 +132,15 @@ */ __inline_call void_type init ( + float _xoff = + 0.f , + float _yoff = + 0.f , + float _zoff = + 0.f ) { real_type static const _FTOL = - std::pow(std::numeric_limits - ::epsilon(), (real_type).8); + std::pow ( + std::numeric_limits + ::epsilon(), (real_type) +.75) ; this->_xvar = false ; this->_yvar = false ; @@ -142,6 +150,14 @@ if (this->_ypos.empty()) return ; if (this->_zpos.empty()) return ; + for (auto + _iter = this->_xpos.head() ; + _iter != this->_xpos.tend() ; + ++_iter ) + { + *_iter -= _xoff ; + } + real_type _xbar, _xmin, _xmax ; _xbar = *this->_xpos.tail() - *this->_xpos.head() ; @@ -151,6 +167,14 @@ _xmin = _xbar - _FTOL * _xbar ; _xmax = _xbar + _FTOL * _xbar ; + for (auto + _iter = this->_ypos.head() ; + _iter != this->_ypos.tend() ; + ++_iter ) + { + *_iter -= _yoff ; + } + real_type _ybar, _ymin, _ymax ; _ybar = *this->_ypos.tail() - *this->_ypos.head() ; @@ -160,6 +184,14 @@ _ymin = _ybar - _FTOL * _ybar ; _ymax = _ybar + _FTOL * _ybar ; + for (auto + _iter = this->_zpos.head() ; + _iter != this->_zpos.tend() ; + ++_iter ) + { + *_iter -= _zoff ; + } + real_type _zbar, _zmin, _zmax ; _zbar = *this->_zpos.tail() - *this->_zpos.head() ; @@ -263,9 +295,9 @@ _ZPOS = *this->_zpos.tail() ; /*---------------------------- find enclosing x-range */ - iptr_type _ipos = (iptr_type)-1 ; - iptr_type _jpos = (iptr_type)-1 ; - iptr_type _kpos = (iptr_type)-1 ; + auto _ipos = this-> null_hint() ; + auto _jpos = this-> null_hint() ; + auto _kpos = this-> null_hint() ; if (this->_xvar == true) { diff --git a/external/jigsaw/src/libcpp/mesh_func/hfun_mesh_ellipsoid_3.hpp b/external/jigsaw/src/libcpp/interpolate/hfun_mesh_ellipsoid_3.hpp similarity index 84% rename from external/jigsaw/src/libcpp/mesh_func/hfun_mesh_ellipsoid_3.hpp rename to external/jigsaw/src/libcpp/interpolate/hfun_mesh_ellipsoid_3.hpp index 6410da7..36c3a5a 100644 --- a/external/jigsaw/src/libcpp/mesh_func/hfun_mesh_ellipsoid_3.hpp +++ b/external/jigsaw/src/libcpp/interpolate/hfun_mesh_ellipsoid_3.hpp @@ -22,18 +22,22 @@ * how they can obtain it for free, then you are not * required to make any arrangement with me.) * - * Disclaimer: Neither I nor: Columbia University, The - * Massachusetts Institute of Technology, The - * University of Sydney, nor The National Aeronautics - * and Space Administration warrant this code in any - * way whatsoever. This code is provided "as-is" to be - * used at your own risk. + * Disclaimer: Neither I nor THE CONTRIBUTORS warrant + * this code in any way whatsoever. This code is + * provided "as-is" to be used at your own risk. + * + * THE CONTRIBUTORS include: + * (a) The University of Sydney + * (b) The Massachusetts Institute of Technology + * (c) Columbia University + * (d) The National Aeronautics & Space Administration + * (e) Los Alamos National Laboratory * -------------------------------------------------------- * - * Last updated: 31 Mar., 2021 + * Last updated: 15 Jun., 2022 * - * Copyright 2013-2021 + * Copyright 2013-2022 * Darren Engwirda * d.engwirda@gmail.com * https://github.com/dengwirda/ @@ -59,7 +63,7 @@ { public : - /*------------------------- euclidean size-fun in R^2 */ + /*------------------------- ellipsoid size-fun in S^2 */ typedef R real_type ; typedef V vals_type ; @@ -267,7 +271,7 @@ float static const _RTOL = std::pow ( std::numeric_limits - ::epsilon(), (float) +0.8) ; + ::epsilon(), (float) +.75) ; iptr_type static constexpr _NBOX=(iptr_type)+8 ; @@ -306,13 +310,11 @@ { /*-------------------- "LESS-THAN" operator for queue */ public : - typename - vals_list::_write_it _hptr; + typename vals_list::_write_it _hptr ; public : __inline_call less_than ( - typename - vals_list::_write_it _hsrc + typename vals_list::_write_it _hsrc ) : _hptr(_hsrc) {} __inline_call @@ -325,32 +327,17 @@ } } ; - typedef typename - allocator:: size_type uint_type ; - - uint_type static constexpr - _null = - std::numeric_limits::max() ; - - containers::prioritymap < + containers::priorityidx < + iptr_type , iptr_type , less_than , allocator > _sort((less_than(this->_hval.head()))); - containers:: array < - typename - allocator:: size_type, - allocator > _keys; - typename mesh_type::connector _conn; /*-------------------- push nodes onto priority queue */ - _keys.set_count ( - _mesh.node().count() , - containers::tight_alloc, _null) ; - iptr_type _inum = +0; for (auto _iter = this->_mesh.node().head(); @@ -360,18 +347,25 @@ { if (_iter->mark() >= +0 ) { - _keys[_inum] = - _sort.push(_inum) ; + _sort.push(_inum, _inum) ; } } /*-------------------- compute h(x) via fast-marching */ + vals_type static _FTOL = + (vals_type)std::pow( + std::numeric_limits::epsilon(), .75) ; + + # define ISALIVE(__idx) \ + (_sort.keys(__idx) != _sort.null()) + + # define UPDATED(__new, __old) \ + std::abs(__new - __old) > _FTOL*std::abs(__new) + for ( ; !_sort.empty() ; ) { - iptr_type _base ; - _sort._pop_root(_base) ; - - _keys[_base] = _null ; + iptr_type _base, _bidx ; + _sort._pop_root( _bidx , _base); _conn.set_count( +0) ; this->_mesh. @@ -395,15 +389,14 @@ auto _knod = this-> _mesh. tri3( _cell).node(2); - /*-------------------- skip any cells with null nodes */ - if (_keys[_inod] == _null && - _inod != _base) continue ; - if (_keys[_jnod] == _null && - _jnod != _base) continue ; - if (_keys[_knod] == _null && - _knod != _base) continue ; - /*-------------------- skip cells due to sorted order */ + if (_inod != _base && + !ISALIVE(_inod)) continue ; + if (_jnod != _base && + !ISALIVE(_jnod)) continue ; + if (_knod != _base && + !ISALIVE(_knod)) continue ; + vals_type _hmax; _hmax = this->_hval[_inod] ; _hmax = std::max( @@ -421,6 +414,13 @@ vals_type _kold = this->_hval[_knod] ; + vals_type _inew = + this->_hval[_inod] ; + vals_type _jnew = + this->_hval[_jnod] ; + vals_type _knew = + this->_hval[_knod] ; + if (this->_dhdx.count() >1) { /*-------------------- update adj. set, g = g(x) case */ @@ -431,28 +431,39 @@ _mesh. node( _jnod).pval(0), &this-> _mesh. node( _knod).pval(0), - this->_hval[_inod], - this->_hval[_jnod], - this->_hval[_knod], + _hnow, + _inew, _jnew, _knew, this->_dhdx[_inod], this->_dhdx[_jnod], this->_dhdx[_knod]) ) { - if (_keys[_inod] != _null) - if (_hval[_inod] != _iold) - _sort.update( - _keys[_inod] , _inod) ; + // push updates one-at-a-time to ensure heap + // maintains its sorted order - if (_keys[_jnod] != _null) - if (_hval[_jnod] != _jold) - _sort.update( - _keys[_jnod] , _jnod) ; + if (_sort. + keys(_inod) != _sort.null()) + if ( UPDATED(_inew, _iold) ) + { + _hval[_inod] = _inew; + _sort.reduce(_inod , _inod) ; + } + + if (_sort. + keys(_jnod) != _sort.null()) + if ( UPDATED(_jnew, _jold) ) + { + _hval[_jnod] = _jnew; + _sort.reduce(_jnod , _jnod) ; + } - if (_keys[_knod] != _null) - if (_hval[_knod] != _kold) - _sort.update( - _keys[_knod] , _knod) ; + if (_sort. + keys(_knod) != _sort.null()) + if ( UPDATED(_knew, _kold) ) + { + _hval[_knod] = _knew; + _sort.reduce(_knod , _knod) ; + } } } @@ -467,28 +478,39 @@ _mesh. node( _jnod).pval(0), &this-> _mesh. node( _knod).pval(0), - this->_hval[_inod], - this->_hval[_jnod], - this->_hval[_knod], + _hnow, + _inew, _jnew, _knew, this->_dhdx[ +0 ], this->_dhdx[ +0 ], this->_dhdx[ +0 ]) ) { - if (_keys[_inod] != _null) - if (_hval[_inod] != _iold) - _sort.update( - _keys[_inod] , _inod) ; + // push updates one-at-a-time to ensure heap + // maintains its sorted order + + if (_sort. + keys(_inod) != _sort.null()) + if ( UPDATED(_inew, _iold) ) + { + _hval[_inod] = _inew; + _sort.reduce(_inod , _inod) ; + } - if (_keys[_jnod] != _null) - if (_hval[_jnod] != _jold) - _sort.update( - _keys[_jnod] , _jnod) ; + if (_sort. + keys(_jnod) != _sort.null()) + if ( UPDATED(_jnew, _jold) ) + { + _hval[_jnod] = _jnew; + _sort.reduce(_jnod , _jnod) ; + } - if (_keys[_knod] != _null) - if (_hval[_knod] != _kold) - _sort.update( - _keys[_knod] , _knod) ; + if (_sort. + keys(_knod) != _sort.null()) + if ( UPDATED(_knew, _kold) ) + { + _hval[_knod] = _knew; + _sort.reduce(_knod , _knod) ; + } } } @@ -505,6 +527,8 @@ } } + # undef ISALIVE + # undef UPDATED } /* @@ -533,7 +557,8 @@ ) : _ppos(_psrc) , _mesh(_msrc) , _find(false) , - _tpos( -1) {} + _tpos( + hfun_type::null_hint()) {} /*------------------------ call pred. on tree matches */ __inline_call @@ -593,16 +618,21 @@ ::infinity()) , _mesh(_msrc) , _find(false) , - _tpos( -1) {} + _tpos( + hfun_type::null_hint()) {} /*------------------------ call pred. on tree matches */ __inline_call float operator () ( typename + tree_type::node_type *_lptr, + typename tree_type::item_data *_iptr ) { if (this->_find) return +0. ; + __unreferenced(_lptr); + for ( ; _iptr != nullptr; _iptr = _iptr->_next) { diff --git a/external/jigsaw/src/libcpp/mesh_func/hfun_mesh_euclidean_2.hpp b/external/jigsaw/src/libcpp/interpolate/hfun_mesh_euclidean_2.hpp similarity index 82% rename from external/jigsaw/src/libcpp/mesh_func/hfun_mesh_euclidean_2.hpp rename to external/jigsaw/src/libcpp/interpolate/hfun_mesh_euclidean_2.hpp index e93c824..b7c0e56 100644 --- a/external/jigsaw/src/libcpp/mesh_func/hfun_mesh_euclidean_2.hpp +++ b/external/jigsaw/src/libcpp/interpolate/hfun_mesh_euclidean_2.hpp @@ -22,18 +22,22 @@ * how they can obtain it for free, then you are not * required to make any arrangement with me.) * - * Disclaimer: Neither I nor: Columbia University, The - * Massachusetts Institute of Technology, The - * University of Sydney, nor The National Aeronautics - * and Space Administration warrant this code in any - * way whatsoever. This code is provided "as-is" to be - * used at your own risk. + * Disclaimer: Neither I nor THE CONTRIBUTORS warrant + * this code in any way whatsoever. This code is + * provided "as-is" to be used at your own risk. + * + * THE CONTRIBUTORS include: + * (a) The University of Sydney + * (b) The Massachusetts Institute of Technology + * (c) Columbia University + * (d) The National Aeronautics & Space Administration + * (e) Los Alamos National Laboratory * -------------------------------------------------------- * - * Last updated: 31 Mar., 2021 + * Last updated: 15 Jun., 2022 * - * Copyright 2013-2021 + * Copyright 2013-2022 * Darren Engwirda * d.engwirda@gmail.com * https://github.com/dengwirda/ @@ -140,6 +144,8 @@ */ __normal_call void_type init ( + float _xoff = + 0.f , + float _yoff = + 0.f ) { class tria_pred @@ -175,6 +181,9 @@ { if (_iter->mark() >= +0) { + _iter->pval(0) -= _xoff; + _iter->pval(1) -= _yoff; + this->_bmin[0] = std::min ( this->_bmin[0] , _iter->pval(0) ) ; @@ -194,7 +203,7 @@ float static const _RTOL = std::pow ( std::numeric_limits - ::epsilon(), (float) +0.8) ; + ::epsilon(), (float) +.75) ; iptr_type static constexpr _NBOX=(iptr_type)+4 ; @@ -229,13 +238,11 @@ { /*-------------------- "LESS-THAN" operator for queue */ public : - typename - vals_list::_write_it _hptr; + typename vals_list::_write_it _hptr ; public : __inline_call less_than ( - typename - vals_list::_write_it _hsrc + typename vals_list::_write_it _hsrc ) : _hptr(_hsrc) {} __inline_call @@ -248,32 +255,17 @@ } } ; - typedef typename - allocator:: size_type uint_type ; - - uint_type static constexpr - _null = - std::numeric_limits::max() ; - - containers::prioritymap < + containers::priorityidx < + iptr_type , iptr_type , less_than , allocator > _sort((less_than(this->_hval.head()))); - containers:: array < - typename - allocator:: size_type, - allocator > _keys; - typename mesh_type::connector _conn; /*-------------------- push nodes onto priority queue */ - _keys.set_count ( - _mesh.node().count() , - containers::tight_alloc, _null) ; - iptr_type _inum = +0; for (auto _iter = this->_mesh.node().head(); @@ -283,18 +275,25 @@ { if (_iter->mark() >= +0 ) { - _keys[_inum] = - _sort.push(_inum) ; + _sort.push(_inum, _inum) ; } } /*-------------------- compute h(x) via fast-marching */ + vals_type static _FTOL = + (vals_type)std::pow( + std::numeric_limits::epsilon(), .75) ; + + # define ISALIVE(__idx) \ + (_sort.keys(__idx) != _sort.null()) + + # define UPDATED(__new, __old) \ + std::abs(__new - __old) > _FTOL*std::abs(__new) + for ( ; !_sort.empty() ; ) { - iptr_type _base ; - _sort._pop_root(_base) ; - - _keys[_base] = _null ; + iptr_type _base, _bidx ; + _sort._pop_root( _bidx , _base); _conn.set_count( +0) ; this->_mesh. @@ -318,15 +317,14 @@ auto _knod = this-> _mesh. tri3( _cell).node(2); - /*-------------------- skip any cells with null nodes */ - if (_keys[_inod] == _null && - _inod != _base) continue ; - if (_keys[_jnod] == _null && - _jnod != _base) continue ; - if (_keys[_knod] == _null && - _knod != _base) continue ; - /*-------------------- skip cells due to sorted order */ + if (_inod != _base && + !ISALIVE(_inod)) continue ; + if (_jnod != _base && + !ISALIVE(_jnod)) continue ; + if (_knod != _base && + !ISALIVE(_knod)) continue ; + vals_type _hmax; _hmax = this->_hval[_inod] ; _hmax = std::max( @@ -344,6 +342,13 @@ vals_type _kold = this->_hval[_knod] ; + vals_type _inew = + this->_hval[_inod] ; + vals_type _jnew = + this->_hval[_jnod] ; + vals_type _knew = + this->_hval[_knod] ; + if (this->_dhdx.count() >1) { /*-------------------- update adj. set, g = g(x) case */ @@ -354,28 +359,39 @@ _mesh. node( _jnod).pval(0), &this-> _mesh. node( _knod).pval(0), - this->_hval[_inod], - this->_hval[_jnod], - this->_hval[_knod], + _hnow, + _inew, _jnew, _knew, this->_dhdx[_inod], this->_dhdx[_jnod], this->_dhdx[_knod]) ) { - if (_keys[_inod] != _null) - if (_hval[_inod] != _iold) - _sort.update( - _keys[_inod] , _inod) ; + // push updates one-at-a-time to ensure heap + // maintains its sorted order - if (_keys[_jnod] != _null) - if (_hval[_jnod] != _jold) - _sort.update( - _keys[_jnod] , _jnod) ; + if (_sort. + keys(_inod) != _sort.null()) + if ( UPDATED(_inew, _iold) ) + { + _hval[_inod] = _inew; + _sort.reduce(_inod , _inod) ; + } + + if (_sort. + keys(_jnod) != _sort.null()) + if ( UPDATED(_jnew, _jold) ) + { + _hval[_jnod] = _jnew; + _sort.reduce(_jnod , _jnod) ; + } - if (_keys[_knod] != _null) - if (_hval[_knod] != _kold) - _sort.update( - _keys[_knod] , _knod) ; + if (_sort. + keys(_knod) != _sort.null()) + if ( UPDATED(_knew, _kold) ) + { + _hval[_knod] = _knew; + _sort.reduce(_knod , _knod) ; + } } } @@ -390,28 +406,39 @@ _mesh. node( _jnod).pval(0), &this-> _mesh. node( _knod).pval(0), - this->_hval[_inod], - this->_hval[_jnod], - this->_hval[_knod], + _hnow, + _inew, _jnew, _knew, this->_dhdx[ +0 ], this->_dhdx[ +0 ], this->_dhdx[ +0 ]) ) { - if (_keys[_inod] != _null) - if (_hval[_inod] != _iold) - _sort.update( - _keys[_inod] , _inod) ; + // push updates one-at-a-time to ensure heap + // maintains its sorted order + + if (_sort. + keys(_inod) != _sort.null()) + if ( UPDATED(_inew, _iold) ) + { + _hval[_inod] = _inew; + _sort.reduce(_inod , _inod) ; + } - if (_keys[_jnod] != _null) - if (_hval[_jnod] != _jold) - _sort.update( - _keys[_jnod] , _jnod) ; + if (_sort. + keys(_jnod) != _sort.null()) + if ( UPDATED(_jnew, _jold) ) + { + _hval[_jnod] = _jnew; + _sort.reduce(_jnod , _jnod) ; + } - if (_keys[_knod] != _null) - if (_hval[_knod] != _kold) - _sort.update( - _keys[_knod] , _knod) ; + if (_sort. + keys(_knod) != _sort.null()) + if ( UPDATED(_knew, _kold) ) + { + _hval[_knod] = _knew; + _sort.reduce(_knod , _knod) ; + } } } @@ -428,6 +455,8 @@ } } + # undef ISALIVE + # undef UPDATED } /* @@ -456,7 +485,8 @@ ) : _ppos(_psrc) , _mesh(_msrc) , _find(false) , - _tpos( -1) {} + _tpos( + hfun_type::null_hint()) {} /*------------------------ call pred. on tree matches */ __inline_call @@ -516,16 +546,21 @@ ::infinity()) , _mesh(_msrc) , _find(false) , - _tpos( -1) {} + _tpos( + hfun_type::null_hint()) {} /*------------------------ call pred. on tree matches */ __inline_call float operator () ( typename + tree_type::node_type *_lptr, + typename tree_type::item_data *_iptr ) { if (this->_find) return +0. ; + __unreferenced(_lptr); + for ( ; _iptr != nullptr; _iptr = _iptr->_next) { diff --git a/external/jigsaw/src/libcpp/mesh_func/hfun_mesh_euclidean_3.hpp b/external/jigsaw/src/libcpp/interpolate/hfun_mesh_euclidean_3.hpp similarity index 80% rename from external/jigsaw/src/libcpp/mesh_func/hfun_mesh_euclidean_3.hpp rename to external/jigsaw/src/libcpp/interpolate/hfun_mesh_euclidean_3.hpp index f513303..2b5f3e3 100644 --- a/external/jigsaw/src/libcpp/mesh_func/hfun_mesh_euclidean_3.hpp +++ b/external/jigsaw/src/libcpp/interpolate/hfun_mesh_euclidean_3.hpp @@ -22,18 +22,22 @@ * how they can obtain it for free, then you are not * required to make any arrangement with me.) * - * Disclaimer: Neither I nor: Columbia University, The - * Massachusetts Institute of Technology, The - * University of Sydney, nor The National Aeronautics - * and Space Administration warrant this code in any - * way whatsoever. This code is provided "as-is" to be - * used at your own risk. + * Disclaimer: Neither I nor THE CONTRIBUTORS warrant + * this code in any way whatsoever. This code is + * provided "as-is" to be used at your own risk. + * + * THE CONTRIBUTORS include: + * (a) The University of Sydney + * (b) The Massachusetts Institute of Technology + * (c) Columbia University + * (d) The National Aeronautics & Space Administration + * (e) Los Alamos National Laboratory * -------------------------------------------------------- * - * Last updated: 31 Mar., 2021 + * Last updated: 15 Jun., 2022 * - * Copyright 2013-2021 + * Copyright 2013-2022 * Darren Engwirda * d.engwirda@gmail.com * https://github.com/dengwirda/ @@ -59,7 +63,7 @@ { public : - /*------------------------- euclidean size-fun in R^3 */ + /*------------------------- euclidean size-fun in E^3 */ typedef R real_type ; typedef V vals_type ; @@ -146,6 +150,9 @@ */ __normal_call void_type init ( + float _xoff = + 0.f , + float _yoff = + 0.f , + float _zoff = + 0.f ) { class tria_pred @@ -181,6 +188,10 @@ { if (_iter->mark() >= +0) { + _iter->pval(0) -= _xoff; + _iter->pval(1) -= _yoff; + _iter->pval(2) -= _zoff; + this->_bmin[0] = std::min ( this->_bmin[0] , _iter->pval(0) ) ; @@ -206,7 +217,7 @@ float static const _RTOL = std::pow ( std::numeric_limits - ::epsilon(), (float) +0.8) ; + ::epsilon(), (float) +.75) ; iptr_type static constexpr _NBOX=(iptr_type)+8 ; @@ -245,13 +256,11 @@ { /*-------------------- "LESS-THAN" operator for queue */ public : - typename - vals_list::_write_it _hptr; + typename vals_list::_write_it _hptr ; public : __inline_call less_than ( - typename - vals_list::_write_it _hsrc + typename vals_list::_write_it _hsrc ) : _hptr(_hsrc) {} __inline_call @@ -264,32 +273,17 @@ } } ; - typedef typename - allocator:: size_type uint_type ; - - uint_type static constexpr - _null = - std::numeric_limits::max() ; - - containers::prioritymap < + containers::priorityidx < + iptr_type , iptr_type , less_than , allocator > _sort((less_than(this->_hval.head()))); - containers:: array < - typename - allocator:: size_type, - allocator > _keys; - typename mesh_type::connector _conn; /*-------------------- push nodes onto priority queue */ - _keys.set_count ( - _mesh.node().count() , - containers::tight_alloc, _null) ; - iptr_type _inum = +0; for (auto _iter = this->_mesh.node().head(); @@ -299,18 +293,25 @@ { if (_iter->mark() >= +0 ) { - _keys[_inum] = - _sort.push(_inum) ; + _sort.push(_inum, _inum) ; } } /*-------------------- compute h(x) via fast-marching */ + vals_type static _FTOL = + (vals_type)std::pow( + std::numeric_limits::epsilon(), .75) ; + + # define ISALIVE(__idx) \ + (_sort.keys(__idx) != _sort.null()) + + # define UPDATED(__new, __old) \ + std::abs(__new - __old) > _FTOL*std::abs(__new) + for ( ; !_sort.empty() ; ) { - iptr_type _base ; - _sort._pop_root(_base) ; - - _keys[_base] = _null ; + iptr_type _base, _bidx ; + _sort._pop_root( _bidx , _base); _conn.set_count( +0) ; this->_mesh. @@ -336,17 +337,16 @@ auto _lnod = this-> _mesh. tri4( _cell).node(3); - /*-------------------- skip any cells with null nodes */ - if (_keys[_inod] == _null && - _inod != _base) continue ; - if (_keys[_jnod] == _null && - _jnod != _base) continue ; - if (_keys[_knod] == _null && - _knod != _base) continue ; - if (_keys[_lnod] == _null && - _lnod != _base) continue ; - /*-------------------- skip cells due to sorted order */ + if (_inod != _base && + !ISALIVE(_inod)) continue ; + if (_jnod != _base && + !ISALIVE(_jnod)) continue ; + if (_knod != _base && + !ISALIVE(_knod)) continue ; + if (_lnod != _base && + !ISALIVE(_lnod)) continue ; + vals_type _hmax; _hmax = this->_hval[_inod] ; _hmax = std::max( @@ -368,6 +368,15 @@ vals_type _lold = this->_hval[_lnod] ; + vals_type _inew = + this->_hval[_inod] ; + vals_type _jnew = + this->_hval[_jnod] ; + vals_type _knew = + this->_hval[_knod] ; + vals_type _lnew = + this->_hval[_lnod] ; + if (this->_dhdx.count() >1) { /*-------------------- update adj. set, g = g(x) case */ @@ -380,35 +389,48 @@ _mesh. node( _knod).pval(0), &this-> _mesh. node( _lnod).pval(0), - this->_hval[_inod], - this->_hval[_jnod], - this->_hval[_knod], - this->_hval[_lnod], + _hnow, + _inew, _jnew, _knew, _lnew , this->_dhdx[_inod], this->_dhdx[_jnod], this->_dhdx[_knod], this->_dhdx[_lnod]) ) { - if (_keys[_inod] != _null) - if (_hval[_inod] != _iold) - _sort.update( - _keys[_inod] , _inod) ; + // push updates one-at-a-time to ensure heap + // maintains its sorted order + + if (_sort. + keys(_inod) != _sort.null()) + if ( UPDATED(_inew, _iold) ) + { + _hval[_inod] = _inew; + _sort.reduce(_inod , _inod) ; + } - if (_keys[_jnod] != _null) - if (_hval[_jnod] != _jold) - _sort.update( - _keys[_jnod] , _jnod) ; + if (_sort. + keys(_jnod) != _sort.null()) + if ( UPDATED(_jnew, _jold) ) + { + _hval[_jnod] = _jnew; + _sort.reduce(_jnod , _jnod) ; + } - if (_keys[_knod] != _null) - if (_hval[_knod] != _kold) - _sort.update( - _keys[_knod] , _knod) ; + if (_sort. + keys(_knod) != _sort.null()) + if ( UPDATED(_knew, _kold) ) + { + _hval[_knod] = _knew; + _sort.reduce(_knod , _knod) ; + } - if (_keys[_lnod] != _null) - if (_hval[_lnod] != _lold) - _sort.update( - _keys[_lnod] , _lnod) ; + if (_sort. + keys(_lnod) != _sort.null()) + if ( UPDATED(_lnew, _lold) ) + { + _hval[_lnod] = _lnew; + _sort.reduce(_lnod , _lnod) ; + } } } @@ -425,35 +447,48 @@ _mesh. node( _knod).pval(0), &this-> _mesh. node( _lnod).pval(0), - this->_hval[_inod], - this->_hval[_jnod], - this->_hval[_knod], - this->_hval[_lnod], + _hnow, + _inew, _jnew, _knew, _lnew , this->_dhdx[ +0 ], this->_dhdx[ +0 ], this->_dhdx[ +0 ], this->_dhdx[ +0 ]) ) { - if (_keys[_inod] != _null) - if (_hval[_inod] != _iold) - _sort.update( - _keys[_inod] , _inod) ; + // push updates one-at-a-time to ensure heap + // maintains its sorted order - if (_keys[_jnod] != _null) - if (_hval[_jnod] != _jold) - _sort.update( - _keys[_jnod] , _jnod) ; + if (_sort. + keys(_inod) != _sort.null()) + if ( UPDATED(_inew, _iold) ) + { + _hval[_inod] = _inew; + _sort.reduce(_inod , _inod) ; + } - if (_keys[_knod] != _null) - if (_hval[_knod] != _kold) - _sort.update( - _keys[_knod] , _knod) ; + if (_sort. + keys(_jnod) != _sort.null()) + if ( UPDATED(_jnew, _jold) ) + { + _hval[_jnod] = _jnew; + _sort.reduce(_jnod , _jnod) ; + } - if (_keys[_lnod] != _null) - if (_hval[_lnod] != _lold) - _sort.update( - _keys[_lnod] , _lnod) ; + if (_sort. + keys(_knod) != _sort.null()) + if ( UPDATED(_knew, _kold) ) + { + _hval[_knod] = _knew; + _sort.reduce(_knod , _knod) ; + } + + if (_sort. + keys(_lnod) != _sort.null()) + if ( UPDATED(_lnew, _lold) ) + { + _hval[_lnod] = _lnew; + _sort.reduce(_lnod , _lnod) ; + } } } @@ -470,6 +505,8 @@ } } + # undef ISALIVE + # undef UPDATED } /* @@ -498,7 +535,8 @@ ) : _ppos(_psrc) , _mesh(_msrc) , _find(false) , - _tpos( -1) {} + _tpos( + hfun_type::null_hint()) {} /*------------------------ call pred. on tree matches */ __inline_call @@ -558,16 +596,21 @@ ::infinity()) , _mesh(_msrc) , _find(false) , - _tpos( -1) {} + _tpos( + hfun_type::null_hint()) {} /*------------------------ call pred. on tree matches */ __inline_call float operator () ( typename + tree_type::node_type *_lptr, + typename tree_type::item_data *_iptr ) { if (this->_find) return +0. ; + __unreferenced(_lptr); + for ( ; _iptr != nullptr; _iptr = _iptr->_next) { diff --git a/external/jigsaw/src/libcpp/iter_mesh/_bfs_mesh_2.inc b/external/jigsaw/src/libcpp/iter_mesh/_bfs_mesh_2.inc new file mode 100644 index 0000000..7e35ec3 --- /dev/null +++ b/external/jigsaw/src/libcpp/iter_mesh/_bfs_mesh_2.inc @@ -0,0 +1,283 @@ + + /* + -------------------------------------------------------- + * _BFS-MESH-2: breadth-first-search mesh flips. + -------------------------------------------------------- + * + * This program may be freely redistributed under the + * condition that the copyright notices (including this + * entire header) are not removed, and no compensation + * is received through use of the software. Private, + * research, and institutional use is free. You may + * distribute modified versions of this code UNDER THE + * CONDITION THAT THIS CODE AND ANY MODIFICATIONS MADE + * TO IT IN THE SAME FILE REMAIN UNDER COPYRIGHT OF THE + * ORIGINAL AUTHOR, BOTH SOURCE AND OBJECT CODE ARE + * MADE FREELY AVAILABLE WITHOUT CHARGE, AND CLEAR + * NOTICE IS GIVEN OF THE MODIFICATIONS. Distribution + * of this code as part of a commercial system is + * permissible ONLY BY DIRECT ARRANGEMENT WITH THE + * AUTHOR. (If you are not directly supplying this + * code to a customer, and you are instead telling them + * how they can obtain it for free, then you are not + * required to make any arrangement with me.) + * + * Disclaimer: Neither I nor THE CONTRIBUTORS warrant + * this code in any way whatsoever. This code is + * provided "as-is" to be used at your own risk. + * + * THE CONTRIBUTORS include: + * (a) The University of Sydney + * (b) The Massachusetts Institute of Technology + * (c) Columbia University + * (d) The National Aeronautics & Space Administration + * (e) Los Alamos National Laboratory + * + -------------------------------------------------------- + * + * Last updated: 10 Jun., 2022 + * + * Copyright 2013-2022 + * Darren Engwirda + * d.engwirda@gmail.com + * https://github.com/dengwirda/ + * + -------------------------------------------------------- + */ + + // from iter_mesh_2.hpp + + + /* + -------------------------------------------------------- + * FLIP-SIGN: flip cells for +ve iter. cost fn. + -------------------------------------------------------- + */ + + __static_call + __normal_call void_type flip_next ( + mesh_type &_mesh, + conn_list &_list, + iptr_type _icel, + iptr_type *_inod, + mark_list &_seen, + conn_list &_conn + ) + { + /*------------------------- flip to match cell "sign" */ + _conn.set_count(0) ; + _mesh.connect_2( + _inod, EDGE2_tag, _conn); + + if (_conn.count() != 2) return; + + iptr_type _jcel, _jfac; + char_type _kind; + if ((iptr_type) + _conn[0]._cell == _icel) + { + _jcel = _conn[ 1]._cell ; + _kind = _conn[ 1]._kind ; + } + else + { + _jcel = _conn[ 0]._cell ; + _kind = _conn[ 0]._kind ; + } + + /*------------------------- match indexing along edge */ + if (_kind == TRIA3_tag) + { + if (_seen._tri3[_jcel] == +0) + { + _list.push_tail(typename + conn_list::data_type(_jcel, _kind)) ; + + _seen._tri3[_jcel] = +1; + + iptr_type _jnod[3] ; + for(_jfac = 3 ; _jfac-- != 0; ) + { + mesh_type::tri3_type:: + face_node(_jnod, _jfac, 2, 1) ; + _jnod[ 0] = _mesh. + tri3(_jcel).node(_jnod[0]) ; + _jnod[ 1] = _mesh. + tri3(_jcel).node(_jnod[1]) ; + _jnod[ 2] = _mesh. + tri3(_jcel).node(_jnod[2]) ; + + if (_jnod[ 2] != _inod[ 0]) + if (_jnod[ 2] != _inod[ 1]) + break ; + } + + if (_jnod[ 0] == _inod[ 0] && + _jnod[ 1] == _inod[ 1]) + { + std::swap ( + _mesh.tri3(_jcel).node( 0), + _mesh.tri3(_jcel).node( 1)) ; + } + } + } + else + if (_kind == QUAD4_tag) + { + if (_seen._quad[_jcel] == +0) + { + _list.push_tail(typename + conn_list::data_type(_jcel, _kind)) ; + + _seen._quad[_jcel] = +1; + + // TODO: reverse quad indexes + } + } + } + + __static_call + __normal_call void_type flip_bfs_ ( + mesh_type &_mesh, + conn_list &_list, + mark_list &_seen + ) + { + conn_list _conn; + for ( ; !_list.empty() ; ) + { + /*------------------------- flip via BFS on cell adj. */ + typename conn_list::data_type _cell ; + _list._pop_tail(_cell) ; + + if (_cell._kind == TRIA3_tag) + { + for(auto _enum = +3; _enum-- != +0; ) + { + auto _cpos = _cell._cell; + + iptr_type _enod[3] ; + mesh_type::tri3_type:: + face_node(_enod, _enum, +2, +1) ; + _enod[ 0] = _mesh.tri3( + _cpos).node( _enod[ 0]) ; + _enod[ 1] = _mesh.tri3( + _cpos).node( _enod[ 1]) ; + + flip_next( _mesh, _list, + _cpos, _enod, _seen, _conn) ; + } + } + else + if (_cell._kind == QUAD4_tag) + { + for(auto _enum = +4; _enum-- != +0; ) + { + auto _cpos = _cell._cell; + + iptr_type _enod[4] ; + mesh_type::quad_type:: + face_node(_enod, _enum, +2, +1) ; + _enod[ 0] = _mesh.quad( + _cpos).node( _enod[ 0]) ; + _enod[ 1] = _mesh.quad( + _cpos).node( _enod[ 1]) ; + + flip_next( _mesh, _list, + _cpos, _enod, _seen, _conn) ; + } + } + } + } + + __static_call + __normal_call void_type flip_sign ( + mesh_type &_mesh + ) + { + # define SEENTRI3( _CELL) _seen._tri3[_CELL] + # define SEENQUAD( _CELL) _seen._quad[_CELL] + + conn_list _list; + mark_list _seen; + init_mark(_mesh, _seen, +0) ; + + /*------------------------- flip to correct mesh sign */ + iptr_type _tnum = +0 ; + for (auto _tria = _mesh.tri3().head(); + _tria != _mesh.tri3().tend(); + ++_tria, ++_tnum ) + { + if (_tria->mark () < +0) continue; + if (SEENTRI3(_tnum) > +0) continue; + + /*--------------------- flip seed for +ve quality */ + real_type _cost = + pred_type::tri3_cost ( + &_mesh. node( + _tria->node(0)).pval(0), + &_mesh. node( + _tria->node(1)).pval(0), + &_mesh. node( + _tria->node(2)).pval(0), + typename + pred_type::cell_kind()) ; + + if (_cost < (real_type) +0.) + { + std::swap ( + _tria->node(0), + _tria->node(1)) ; + } + + /*--------------------- a BFS from seed via topo. */ + _list.push_tail(typename conn_list + ::data_type (_tnum, TRIA3_tag)) ; + + SEENTRI3( _tnum ) = 1 ; + + flip_bfs_(_mesh, _list, _seen) ; + } + + iptr_type _qnum = +0 ; + for (auto _quad = _mesh.quad().head(); + _quad != _mesh.quad().tend(); + ++_quad, ++_qnum ) + { + if (_quad->mark () < +0) continue; + if (SEENQUAD(_qnum) > +0) continue; + + /*--------------------- flip seed for +ve quality */ + real_type _cost = + pred_type::quad_cost ( + &_mesh. node( + _quad->node(0)).pval(0), + &_mesh. node( + _quad->node(1)).pval(0), + &_mesh. node( + _quad->node(2)).pval(0), + &_mesh. node( + _quad->node(3)).pval(0), + typename + pred_type::cell_kind()) ; + + if (_cost < (real_type) +0.) + { + // TODO: reverse quad indexes + } + + /*--------------------- a BFS from seed via topo. */ + _list.push_tail(typename conn_list + ::data_type (_qnum, QUAD4_tag)) ; + + SEENQUAD( _qnum ) = 1 ; + + flip_bfs_(_mesh, _list, _seen) ; + } + + # undef SEENQUAD + # undef SEENTRI3 + } + + + diff --git a/external/jigsaw/src/libcpp/iter_mesh/_zip_mesh_2.inc b/external/jigsaw/src/libcpp/iter_mesh/_zip_mesh_2.inc new file mode 100644 index 0000000..ebaad39 --- /dev/null +++ b/external/jigsaw/src/libcpp/iter_mesh/_zip_mesh_2.inc @@ -0,0 +1,642 @@ + + /* + -------------------------------------------------------- + * _ZIP-MESH-2: merge/split operations. + -------------------------------------------------------- + * + * This program may be freely redistributed under the + * condition that the copyright notices (including this + * entire header) are not removed, and no compensation + * is received through use of the software. Private, + * research, and institutional use is free. You may + * distribute modified versions of this code UNDER THE + * CONDITION THAT THIS CODE AND ANY MODIFICATIONS MADE + * TO IT IN THE SAME FILE REMAIN UNDER COPYRIGHT OF THE + * ORIGINAL AUTHOR, BOTH SOURCE AND OBJECT CODE ARE + * MADE FREELY AVAILABLE WITHOUT CHARGE, AND CLEAR + * NOTICE IS GIVEN OF THE MODIFICATIONS. Distribution + * of this code as part of a commercial system is + * permissible ONLY BY DIRECT ARRANGEMENT WITH THE + * AUTHOR. (If you are not directly supplying this + * code to a customer, and you are instead telling them + * how they can obtain it for free, then you are not + * required to make any arrangement with me.) + * + * Disclaimer: Neither I nor THE CONTRIBUTORS warrant + * this code in any way whatsoever. This code is + * provided "as-is" to be used at your own risk. + * + * THE CONTRIBUTORS include: + * (a) The University of Sydney + * (b) The Massachusetts Institute of Technology + * (c) Columbia University + * (d) The National Aeronautics & Space Administration + * (e) Los Alamos National Laboratory + * + -------------------------------------------------------- + * + * Last updated: 11 Dec., 2022 + * + * Copyright 2013-2022 + * Darren Engwirda + * d.engwirda@gmail.com + * https://github.com/dengwirda/ + * + -------------------------------------------------------- + */ + + // from iter_mesh_2.hpp + + + /* + -------------------------------------------------------- + * _ZIP-MESH: edge merge/split operations. + -------------------------------------------------------- + */ + + #include "iter_zips_2.inc" + #include "iter_divs_2.inc" + + __static_call + __normal_call void_type _zip_fcel ( + geom_type &_geom , // geometry object + mesh_type &_mesh , // mesh object + hfun_type &_hfun , // spacing object + char_type _kern , + real_list &_hval , // cached node spacing array + iptr_list &_nset , // list of nodes active + mark_list &_mark , // sets of node/cell flags + iptr_type _imrk , // outer iteration marker + iter_opts &_opts , // user options + real_type _QLIM , // cell quality threshold + real_type _DLIM , // dual quality threshold + size_t &_nzip , // number of successful zip's + size_t &_ndiv , // number of successful div's + iter_stat &_tcpu // CPU timers/info + ) + { + class sort_data + { + public : + /*------------------------ tuple for edge re-ordering */ + iptr_type _inod , _jnod , + _knod ; + float _cost ; + public : + __inline_call sort_data ( + iptr_type _isrc , + iptr_type _jsrc , + iptr_type _ksrc , + float _csrc + ) : _inod(_isrc), _jnod(_jsrc), + _knod(_ksrc), + _cost(_csrc) {} + } ; + class sort_less + { + public : + /*------------------------ less-than op. for cost-tup */ + __inline_call + bool_type operator () ( + sort_data const&_idat , + sort_data const&_jdat + ) const + { return _idat._cost < _jdat._cost; + } + } ; + + # define MARKNODE(_NODE) _mark._node[_NODE] + + # define PUSHMARK \ + init_mark( _mesh, _mark, \ + std::max(_imrk - 1, +0)); \ + if (std::abs( \ + _mark._node[_nnew])!= _imrk+1) \ + { \ + if (_mark._node[_nnew] >= +0) \ + { \ + _mark._node[_nnew] = +_imrk+1; \ + } \ + else \ + { \ + _mark._node[_nnew] = -_imrk-1; \ + } \ + _nset.push_tail(_nnew) ; \ + } \ + + # ifdef __use_timers + typename std ::chrono:: + high_resolution_clock::time_point _ttic; + typename std ::chrono:: + high_resolution_clock::time_point _ttoc; + typename std ::chrono:: + high_resolution_clock _time ; + + __unreferenced(_time) ; // why does MSVC need this?? + # endif//__use_timers + + /*------------------------ add/pop nodes to fix topo. */ + typedef containers:: + array sort_list ; + + __unreferenced ( _DLIM ); + + sort_list _sort ; + conn_list _iadj , _jadj, _kadj ; + conn_list _conn , _cset; + conn_list _iset , _jset, _kset ; + real_list _qold , _qnew, _qtmp ; + + _nzip = +0 ; _ndiv = +0 ; + + // assemble list of faces attached to "recent" nodes + + # ifdef __use_timers + _ttic = _time.now() ; + # endif//__use_timers + + _sort.set_alloc( + _mesh.tri3().count()) ; + + for (auto _iter = _mesh.tri3().head() ; + _iter != _mesh.tri3().tend() ; + ++_iter ) + { + auto _inod = _iter->node(0) ; + auto _jnod = _iter->node(1) ; + auto _knod = _iter->node(2) ; + + auto _iptr = _mesh. + node().head()+_iter->node(0) ; + auto _jptr = _mesh. + node().head()+_iter->node(1) ; + auto _kptr = _mesh. + node().head()+_iter->node(2) ; + + auto _flag = _imrk - 2 ; // recent + + if (_iter->mark() >= +0 && + ( std::abs( + _mark._node[_inod]) > _flag || + std::abs( + _mark._node[_jnod]) > _flag || + std::abs( + _mark._node[_knod]) > _flag )) + { + float _area = + (float)pred_type::tri3_mass ( + & _iptr->pval(0) , + & _jptr->pval(0) , + & _kptr->pval(0) ) ; + + auto _ndeg = _iptr->ndeg() + + _jptr->ndeg() + + _kptr->ndeg() ; + + _area *= (float) _ndeg; + + _sort.push_tail( + sort_data( + _inod, _jnod, _knod, _area)) ; + } + } + + if (_sort.empty()) return ; + + algorithms::qsort( // sort edge list by lsqr + _sort.head() , + _sort.tend() , sort_less()); + + # ifdef __use_timers + _ttoc = _time.now() ; + _tcpu._init_zips += _tcpu.time_span(_ttic, _ttoc) ; + # endif//__use_timers + + // scan cells largest-to-smallest and try to div any + // unvisited cells + + # ifdef __use_timers + _ttic = _time.now() ; + # endif//__use_timers + + for (auto _iter = _sort.tail(); + _iter != _sort.hend(); + --_iter ) + { + /*--------------------------- try to "div" local edge */ + iptr_type _tadj, _tnod[3] ; + _tnod[0] = _iter->_inod; + _tnod[1] = _iter->_jnod; + _tnod[2] = _iter->_knod; + + if (MARKNODE(_tnod[0]) < +0 && + MARKNODE(_tnod[1]) < +0 && + MARKNODE(_tnod[2]) < +0 ) continue ; + + if (MARKNODE(_tnod[0])>_imrk|| + MARKNODE(_tnod[1])>_imrk|| + MARKNODE(_tnod[2])>_imrk) continue ; + + if(!_mesh.find_tri3( + _tnod, _tadj) ) continue ; + + if (_opts.div_()) + { + /*--------------------------- "div" for topo. + score */ + iptr_type _nnew = -1; + + bool_type _move = false ; + // _div_tri3( ... + + if (_move) + { + PUSHMARK; _ndiv += +1; + } + } + } + + # ifdef __use_timers + _ttoc = _time.now() ; + _tcpu._core_divs += _tcpu.time_span(_ttic, _ttoc) ; + # endif//__use_timers + + // scan cells smallest-to-largest and try to zip any + // unvisited cells + + # ifdef __use_timers + _ttic = _time.now() ; + # endif//__use_timers + + for (auto _iter = _sort.head(); + _iter != _sort.tend(); + ++_iter ) + { + /*--------------------------- try to "zip" local edge */ + iptr_type _tadj, _tnod[3] ; + _tnod[0] = _iter->_inod; + _tnod[1] = _iter->_jnod; + _tnod[2] = _iter->_knod; + + if (MARKNODE(_tnod[0]) < +0 || + MARKNODE(_tnod[1]) < +0 || + MARKNODE(_tnod[2]) < +0 ) continue ; + + if (MARKNODE(_tnod[0])>_imrk|| + MARKNODE(_tnod[1])>_imrk|| + MARKNODE(_tnod[2])>_imrk) continue ; + + if(!_mesh.find_tri3( + _tnod, _tadj) ) continue ; + + if (_opts.zip_()) + { + /*--------------------------- "zip" for topo. + score */ + iptr_type _nnew = -1; + + bool_type _move = false ; + _zip_tri3( _geom, _mesh, + _hfun, _hval, _opts, + _mark. _node, + _imrk, _tadj, + _kern, _move, _nnew, + _iset, _jset, _kset, + _iadj, _jadj, _kadj, + _cset, _qold, _qnew, + _qtmp, _QLIM, _tcpu) ; + + if (_move) + { + PUSHMARK; _nzip += +1; + } + } + } + + # ifdef __use_timers + _ttoc = _time.now() ; + _tcpu._core_zips += _tcpu.time_span(_ttic, _ttoc) ; + # endif//__use_timers + + # undef PUSHMARK + # undef MARKNODE + } + + __static_call + __normal_call void_type _zip_ecel ( + geom_type &_geom , // geometry object + mesh_type &_mesh , // mesh object + hfun_type &_hfun , // spacing object + char_type _kern , + real_list &_hval , // cached node spacing array + iptr_list &_nset , // list of nodes active + mark_list &_mark , // sets of node/cell flags + iptr_type _imrk , // outer iteration marker + iter_opts &_opts , // user options + real_type _QLIM , // cell quality threshold + real_type _DLIM , // dual quality threshold + size_t &_nzip , // number of successful zip's + size_t &_ndiv , // number of successful div's + iter_stat &_tcpu // CPU timers/info + ) + { + class sort_data + { + public : + /*------------------------ tuple for edge re-ordering */ + iptr_type _inod ; + iptr_type _jnod ; + float _cost ; + public : + __inline_call sort_data ( + iptr_type _isrc , + iptr_type _jsrc , + float _csrc + ) : _inod(_isrc), _jnod(_jsrc), + _cost(_csrc) {} + } ; + class sort_less + { + public : + /*------------------------ less-than op. for cost-tup */ + __inline_call + bool_type operator () ( + sort_data const&_idat , + sort_data const&_jdat + ) const + { return _idat._cost < _jdat._cost; + } + } ; + + # define MARKNODE(_NODE) _mark._node[_NODE] + + # define PUSHMARK \ + init_mark( _mesh, _mark, \ + std::max(_imrk - 1, +0)); \ + if (std::abs( \ + _mark._node[_nnew])!= _imrk+1) \ + { \ + if (_mark._node[_nnew] >= +0) \ + { \ + _mark._node[_nnew] = +_imrk+1; \ + } \ + else \ + { \ + _mark._node[_nnew] = -_imrk-1; \ + } \ + _nset.push_tail(_nnew) ; \ + } \ + + # ifdef __use_timers + typename std ::chrono:: + high_resolution_clock::time_point _ttic; + typename std ::chrono:: + high_resolution_clock::time_point _ttoc; + typename std ::chrono:: + high_resolution_clock _time ; + + __unreferenced(_time) ; // why does MSVC need this?? + # endif//__use_timers + + /*------------------------ add/pop nodes to fix topo. */ + typedef containers:: + array sort_list ; + + __unreferenced ( _DLIM ); + + sort_list _sort ; + conn_list _aset , _bset, _cset ; + conn_list _conn , _iset, _jset ; + real_list _qold , _qnew, _qtmp ; + + _nzip = +0 ; _ndiv = +0 ; + + // assemble list of edges attached to "recent" nodes + + # ifdef __use_timers + _ttic = _time.now() ; + # endif//__use_timers + + _sort.set_alloc( + _mesh.edge().count()) ; + + for (auto _iter = _mesh.edge().head() ; + _iter != _mesh.edge().tend() ; + ++_iter ) + { + auto _inod = _iter->node(0) ; + auto _jnod = _iter->node(1) ; + + auto _iptr = _mesh. + node().head()+_iter->node(0) ; + auto _jptr = _mesh. + node().head()+_iter->node(1) ; + + auto _flag = _imrk - 2 ; // recent + + if (_iter->mark() >= +0 && + ( std::abs( + _mark._node[_inod]) > _flag || + std::abs( + _mark._node[_jnod]) > _flag )) + { + float _lsqr = + (float)pred_type::length_sq ( + & _iptr->pval(0) , + & _jptr->pval(0) ) ; + + auto _ndeg = _iptr->ndeg() + + _jptr->ndeg() ; + + _lsqr *= (float) _ndeg; + + _sort.push_tail( + sort_data(_inod, _jnod, _lsqr)) ; + } + } + + if (_sort.empty()) return ; + + algorithms::qsort( // sort edge list by lsqr + _sort.head() , + _sort.tend() , sort_less()); + + # ifdef __use_timers + _ttoc = _time.now() ; + _tcpu._init_zips += _tcpu.time_span(_ttic, _ttoc) ; + # endif//__use_timers + + // scan edges longest-to-shortest and try to div any + // unvisited edges + + # ifdef __use_timers + _ttic = _time.now() ; + # endif//__use_timers + + for (auto _iter = _sort.tail(); + _iter != _sort.hend(); + --_iter ) + { + /*--------------------------- try to "div" local edge */ + iptr_type _eadj, _enod[2] ; + _enod[0] = _iter->_inod; + _enod[1] = _iter->_jnod; + + if (MARKNODE(_enod[0]) < +0 && + MARKNODE(_enod[1]) < +0 ) continue ; + + if (MARKNODE(_enod[0])>_imrk|| + MARKNODE(_enod[1])>_imrk) continue ; + + if(!_mesh.find_edge( + _enod, _eadj) ) continue ; + + if (_opts.div_()) + { + /*--------------------------- "div" for topo. + score */ + iptr_type _nnew = -1; + + bool_type _move = false ; + _div_edge( _geom, _mesh, + _hfun, _hval, _opts, + _imrk, _eadj, + _kern, _move, _nnew, + _iset, _jset, + _aset, _bset, + _qold, _qnew, + _qtmp, _QLIM, _tcpu) ; + + if (_move) + { + PUSHMARK; _ndiv += +1; + } + } + } + + # ifdef __use_timers + _ttoc = _time.now() ; + _tcpu._core_divs += _tcpu.time_span(_ttic, _ttoc) ; + # endif//__use_timers + + // scan edges shortest-to-longest and try to zip any + // unvisited edges + + # ifdef __use_timers + _ttic = _time.now() ; + # endif//__use_timers + + for (auto _iter = _sort.head(); + _iter != _sort.tend(); + ++_iter ) + { + /*--------------------------- try to "zip" local edge */ + iptr_type _eadj, _enod[2] ; + _enod[0] = _iter->_inod; + _enod[1] = _iter->_jnod; + + if (MARKNODE(_enod[0]) < +0 || + MARKNODE(_enod[1]) < +0 ) continue ; + + if (MARKNODE(_enod[0])>_imrk|| + MARKNODE(_enod[1])>_imrk) continue ; + + if(!_mesh.find_edge( + _enod, _eadj) ) continue ; + + if (_opts.zip_()) + { + /*--------------------------- "zip" for topo. + score */ + iptr_type _nnew = -1; + + bool_type _move = false ; + _zip_edge( _geom, _mesh, + _hfun, _hval, _opts, + _mark. _node, + _imrk, _eadj, + _kern, _move, _nnew, + _iset, _jset, + _aset, _bset, _cset, + _qold, _qnew, + _qtmp, _QLIM, _tcpu) ; + + if (_move) + { + PUSHMARK; _nzip += +1; + } + } + } + + # ifdef __use_timers + _ttoc = _time.now() ; + _tcpu._core_zips += _tcpu.time_span(_ttic, _ttoc) ; + # endif//__use_timers + + # undef PUSHMARK + # undef MARKNODE + } + + __static_call + __normal_call void_type _zip_mesh ( + geom_type &_geom , // geometry object + mesh_type &_mesh , // mesh object + hfun_type &_hfun , // spacing object + char_type _kern , + real_list &_hval , // cached node spacing array + iptr_list &_nset , // list of nodes active + mark_list &_mark , // sets of node/cell flags + iptr_type _imrk , // outer iteration marker + iter_opts &_opts , // user options + real_type _QLIM , // cell quality threshold + real_type _DLIM , // dual quality threshold + size_t &_nzip , // number of successful zip's + size_t &_ndiv , // number of successful div's + iter_stat &_tcpu // CPU timers/info + ) + { + # ifdef __use_timers + typename std ::chrono:: + high_resolution_clock::time_point _ttic; + typename std ::chrono:: + high_resolution_clock::time_point _ttoc; + typename std ::chrono:: + high_resolution_clock _time ; + + __unreferenced(_time) ; // why does MSVC need this?? + # endif//__use_timers + + /*--------------------- zip//div topo. cell hierarchy */ + _zip_fcel( _geom, _mesh, _hfun, + _kern, _hval, + _nset, _mark, _imrk, + _opts, _QLIM, _DLIM, + _nzip, _ndiv, _tcpu) ; + + _zip_ecel( _geom, _mesh, _hfun, + _kern, _hval, + _nset, _mark, _imrk, + _opts, _QLIM, _DLIM, + _nzip, _ndiv, _tcpu) ; + + # ifdef __use_timers + _ttic = _time.now() ; + # endif//__use_timers + + for (auto _iter = _mark._node.head() ; + _iter != _mark._node.tend() ; + ++_iter ) + { + /*--------------------- undo local inc. on node flags */ + if (*_iter > + _imrk) + *_iter = + _imrk; + else + if (*_iter < - _imrk) + *_iter = - _imrk; + } + + # ifdef __use_timers + _ttoc = _time.now() ; + _tcpu._init_zips += _tcpu.time_span(_ttic, _ttoc) ; + # endif//__use_timers + + } + + + diff --git a/external/jigsaw/src/libcpp/iter_mesh/cost_mesh_2.inc b/external/jigsaw/src/libcpp/iter_mesh/cost_mesh_2.inc new file mode 100644 index 0000000..6e49f3f --- /dev/null +++ b/external/jigsaw/src/libcpp/iter_mesh/cost_mesh_2.inc @@ -0,0 +1,293 @@ + + /* + -------------------------------------------------------- + * COST-MESH-2: utilities to manip. cell cost vectors. + -------------------------------------------------------- + * + * This program may be freely redistributed under the + * condition that the copyright notices (including this + * entire header) are not removed, and no compensation + * is received through use of the software. Private, + * research, and institutional use is free. You may + * distribute modified versions of this code UNDER THE + * CONDITION THAT THIS CODE AND ANY MODIFICATIONS MADE + * TO IT IN THE SAME FILE REMAIN UNDER COPYRIGHT OF THE + * ORIGINAL AUTHOR, BOTH SOURCE AND OBJECT CODE ARE + * MADE FREELY AVAILABLE WITHOUT CHARGE, AND CLEAR + * NOTICE IS GIVEN OF THE MODIFICATIONS. Distribution + * of this code as part of a commercial system is + * permissible ONLY BY DIRECT ARRANGEMENT WITH THE + * AUTHOR. (If you are not directly supplying this + * code to a customer, and you are instead telling them + * how they can obtain it for free, then you are not + * required to make any arrangement with me.) + * + * Disclaimer: Neither I nor THE CONTRIBUTORS warrant + * this code in any way whatsoever. This code is + * provided "as-is" to be used at your own risk. + * + * THE CONTRIBUTORS include: + * (a) The University of Sydney + * (b) The Massachusetts Institute of Technology + * (c) Columbia University + * (d) The National Aeronautics & Space Administration + * (e) Los Alamos National Laboratory + * + -------------------------------------------------------- + * + * Last updated: 10 Jun., 2022 + * + * Copyright 2013-2022 + * Darren Engwirda + * d.engwirda@gmail.com + * https://github.com/dengwirda/ + * + -------------------------------------------------------- + */ + + // from iter_mesh_2.hpp + + + /* + -------------------------------------------------------- + * MOVE-OKAY: TRUE if state sufficiently good. + -------------------------------------------------------- + */ + + __static_call + __normal_call void_type move_okay ( + real_list &_cdst , // list of new adj. costs + real_list &_csrc , // list of old adj. costs + iptr_type &_move , // > +0 if move acceptable + real_type _good = +9.25E-01, + real_type _qtol = +1.00E-04, + real_type _xdel = +0.00E+00, + real_type _xtol = + std::numeric_limits::infinity() + ) + { + _move = (iptr_type) -1; + + if (_cdst.empty()) return ; + if (_csrc.empty()) return ; + + /*--------------------- calc. min. + mean metrics */ + real_type _zero = + +std::numeric_limits + ::epsilon (); + real_type _0src = + +std::numeric_limits + ::infinity(); + real_type _0dst = + +std::numeric_limits + ::infinity(); + + /*--------------------- compute harmonic averages */ + _good = std::pow(_good, +7./8.); + + real_type _msrc, _mdst; + _msrc = (real_type) +0. ; + _mdst = (real_type) +0. ; + + for (auto _iter = _csrc.head(), + _tend = _csrc.tend(); + _iter != _tend; + ++_iter ) + { + _0src = + std::min(_0src, *_iter) ; + + _msrc += std::pow( + (real_type)1. / *_iter, +8); + } + for (auto _iter = _cdst.head(), + _tend = _cdst.tend(); + _iter != _tend; + ++_iter ) + { + _0dst = + std::min(_0dst, *_iter) ; + + _mdst += std::pow ( + (real_type)1. / *_iter, +8); + } + + _msrc = std::pow( + _csrc.count() / _msrc, +1./8.0); + _mdst = std::pow( + _cdst.count() / _mdst, +1./8.0); + + _qtol /= + std::pow(_csrc.count(), 1./8.0); + _qtol /= + std::pow(_cdst.count(), 1./8.0); + + /*---------------------------- test move = "okay" */ + if (_0dst >= _good) + { + /*--------------------- okay if moves unconverged */ + if (_xdel > _xtol) + _move = +1; + else + _move = +0; // no iter; too short + + if (_move > +0) return ; + } + + if (_0dst >= _zero) + { + /*--------------------- okay if mean is improving */ + if (_mdst > _msrc+_qtol) + _move = +1; + + if (_move > +0) return ; + } + + } + + /* + -------------------------------------------------------- + * LOOP-COST: cost vector for 1-neighbourhood. + -------------------------------------------------------- + */ + + __static_call + __normal_call real_type loop_cost ( + mesh_type &_mesh , // mesh object + conn_list &_cset , // list of adj. cells + real_list &_cost , // list of adj. costs + cell_kind const& // cell costs on CSET + ) + { + real_type _qmin = (real_type)1. ; + + for (auto _next = _cset.head() , + _tend = _cset.tend() ; + _next != _tend; + ++_next ) + { + real_type _cscr = (real_type)+1. ; + + iptr_type _cell = _next->_cell ; + iptr_type _kind = _next->_kind ; + + switch (_kind) + { + case TRIA3_tag: + { + _cscr = pred_type::tri3_cost ( + &_mesh .node( + _mesh .tri3( + _cell).node(0)).pval(0), + &_mesh .node( + _mesh .tri3( + _cell).node(1)).pval(0), + &_mesh .node( + _mesh .tri3( + _cell).node(2)).pval(0), + typename + pred_type::cell_kind ()) ; + break ; + } + + case QUAD4_tag: + { + _cscr = pred_type::quad_cost ( + &_mesh .node( + _mesh .quad( + _cell).node(0)).pval(0), + &_mesh .node( + _mesh .quad( + _cell).node(1)).pval(0), + &_mesh .node( + _mesh .quad( + _cell).node(2)).pval(0), + &_mesh .node( + _mesh .quad( + _cell).node(3)).pval(0), + typename + pred_type::cell_kind ()) ; + break ; + } + } + + _qmin = + std::min (_qmin, _cscr) ; + + _cost.push_tail (_cscr) ; + } + + return ( _qmin ) ; + } + + __static_call + __normal_call real_type loop_cost ( + mesh_type &_mesh , // mesh object + conn_list &_cset , // list of adj. cells + real_list &_cost , // list of adj. costs + dual_kind const& // dual costs on CSET + ) + { + real_type _qmin = (real_type)1. ; + + for (auto _next = _cset.head() , + _tend = _cset.tend() ; + _next != _tend; + ++_next ) + { + real_type _cscr = (real_type)+1. ; + + iptr_type _cell = _next->_cell ; + iptr_type _kind = _next->_kind ; + + switch (_kind) + { + case TRIA3_tag: + { + _cscr = pred_type::tri3_cost ( + &_mesh .node( + _mesh .tri3( + _cell).node(0)).pval(0), + &_mesh .node( + _mesh .tri3( + _cell).node(1)).pval(0), + &_mesh .node( + _mesh .tri3( + _cell).node(2)).pval(0), + typename + pred_type::dual_kind ()) ; + break ; + } + + case QUAD4_tag: + { + _cscr = pred_type::quad_cost ( + &_mesh .node( + _mesh .quad( + _cell).node(0)).pval(0), + &_mesh .node( + _mesh .quad( + _cell).node(1)).pval(0), + &_mesh .node( + _mesh .quad( + _cell).node(2)).pval(0), + &_mesh .node( + _mesh .quad( + _cell).node(3)).pval(0), + typename + pred_type::dual_kind ()) ; + break ; + } + } + + _qmin = + std::min (_qmin, _cscr) ; + + _cost.push_tail (_cscr) ; + } + + return ( _qmin ) ; + } + + + diff --git a/external/jigsaw/src/libcpp/iter_mesh/flip_mesh_2.inc b/external/jigsaw/src/libcpp/iter_mesh/flip_mesh_2.inc new file mode 100644 index 0000000..4689e43 --- /dev/null +++ b/external/jigsaw/src/libcpp/iter_mesh/flip_mesh_2.inc @@ -0,0 +1,523 @@ + + /* + -------------------------------------------------------- + * FLIP-MESH-2: update mesh topologies. + -------------------------------------------------------- + * + * This program may be freely redistributed under the + * condition that the copyright notices (including this + * entire header) are not removed, and no compensation + * is received through use of the software. Private, + * research, and institutional use is free. You may + * distribute modified versions of this code UNDER THE + * CONDITION THAT THIS CODE AND ANY MODIFICATIONS MADE + * TO IT IN THE SAME FILE REMAIN UNDER COPYRIGHT OF THE + * ORIGINAL AUTHOR, BOTH SOURCE AND OBJECT CODE ARE + * MADE FREELY AVAILABLE WITHOUT CHARGE, AND CLEAR + * NOTICE IS GIVEN OF THE MODIFICATIONS. Distribution + * of this code as part of a commercial system is + * permissible ONLY BY DIRECT ARRANGEMENT WITH THE + * AUTHOR. (If you are not directly supplying this + * code to a customer, and you are instead telling them + * how they can obtain it for free, then you are not + * required to make any arrangement with me.) + * + * Disclaimer: Neither I nor THE CONTRIBUTORS warrant + * this code in any way whatsoever. This code is + * provided "as-is" to be used at your own risk. + * + * THE CONTRIBUTORS include: + * (a) The University of Sydney + * (b) The Massachusetts Institute of Technology + * (c) Columbia University + * (d) The National Aeronautics & Space Administration + * (e) Los Alamos National Laboratory + * + -------------------------------------------------------- + * + * Last updated: 11 Jun., 2022 + * + * Copyright 2013-2022 + * Darren Engwirda + * d.engwirda@gmail.com + * https://github.com/dengwirda/ + * + -------------------------------------------------------- + */ + + // from iter_mesh_2.hpp + + + /* + -------------------------------------------------------- + * FLIP-TRI3: "flip" mesh topology. + -------------------------------------------------------- + */ + + __static_call + __inline_call void_type flip_tri3 ( + geom_type &_geom , // geometry object + mesh_type &_mesh , // mesh object + iptr_list &_nmrk , // sets of node/cell flags + iptr_type _cell , // cell to flip + bool_type &_flip , // true if flip + conn_list &_conn , // space for adj. lists + conn_list &_next , // space for adj. lists + real_list &_qold , // list of old adj. costs + real_list &_qnew , // list of new adj. costs + flip_kind _kind + ) + { + auto _coin = (std::rand() % 3) + 1 ; + for (auto _enum = _coin; _enum-- > 0; ) + { + _flip = false ; + /*----------------------------- flip cells about edge */ + iptr_type _enod[3] ; + mesh_type::tri3_type:: + face_node(_enod, _enum, +2, +1) ; + _enod[ 0] = _mesh.tri3( + _cell).node( _enod[ 0]) ; + _enod[ 1] = _mesh.tri3( + _cell).node( _enod[ 1]) ; + + _conn.set_count(0) ; + _next.set_count(0) ; + _mesh.connect_2( + &_enod[0], EDGE2_tag, _conn) ; + + if (_conn.count() != +2) continue ; + + if (_conn[0]._kind==TRIA3_tag && + _conn[1]._kind==TRIA3_tag ) + { + flip_t2t2( _geom, _mesh, _nmrk, _enod, + _conn, _next, _flip, + _qold, _qnew, _kind) ; + + if (_flip) return ; + } + else + { + // flip_t1q1( _geom, _mesh, _nmrk, _enod, + // _conn, _next, _flip, + // _qold, _qnew, _kind) ; + + if (_flip) return ; + } + } + + for (auto _enum = 3; _enum-- > _coin; ) + { + _flip = false ; + /*----------------------------- flip cells about edge */ + iptr_type _enod[3] ; + mesh_type::tri3_type:: + face_node(_enod, _enum, +2, +1) ; + _enod[ 0] = _mesh.tri3( + _cell).node( _enod[ 0]) ; + _enod[ 1] = _mesh.tri3( + _cell).node( _enod[ 1]) ; + + _conn.set_count(0) ; + _next.set_count(0) ; + _mesh.connect_2( + &_enod[0], EDGE2_tag, _conn) ; + + if (_conn.count() != +2) continue ; + + if (_conn[0]._kind==TRIA3_tag && + _conn[1]._kind==TRIA3_tag ) + { + flip_t2t2( _geom, _mesh, _nmrk, _enod, + _conn, _next, _flip, + _qold, _qnew, _kind) ; + + if (_flip) return ; + } + else + { + // flip_t1q1( _geom, _mesh, _nmrk, _enod, + // _conn, _next, _flip, + // _qold, _qnew, _kind) ; + + if (_flip) return ; + } + } + + } + + /* + -------------------------------------------------------- + * FLIP-QUAD: "flip" mesh topology. + -------------------------------------------------------- + */ + + __static_call + __inline_call void_type flip_quad ( + geom_type/*_geom*/ ,// geometry object + mesh_type &_mesh , // mesh object + iptr_list/*_nmrk*/ ,// sets of node/cell flags + iptr_type _cell , // cell to flip + bool_type &_flip , // true if flip + conn_list &_conn , // space for adj. lists + conn_list &_next , // space for adj. lists + real_list/*_qold*/ ,// list of old adj. costs + real_list/*_qnew*/ ,// list of new adj. costs + flip_kind/*_kind*/ + ) + { + auto _coin = (std::rand() % 4) + 1 ; + for (auto _enum = _coin; _enum-- > 0; ) + { + _flip = false ; + /*----------------------------- flip cells about edge */ + iptr_type _enod[4] ; + mesh_type::quad_type:: + face_node(_enod, _enum, +2, +1) ; + _enod[ 0] = _mesh.quad( + _cell).node( _enod[ 0]) ; + _enod[ 1] = _mesh.quad( + _cell).node( _enod[ 1]) ; + + _conn.set_count(0) ; + _next.set_count(0) ; + _mesh.connect_2( + &_enod[0], EDGE2_tag, _conn) ; + + if (_conn.count() != +2) continue ; + + if (_conn[0]._kind==QUAD4_tag && + _conn[1]._kind==QUAD4_tag ) + { + // flip_q2q2( _geom, _mesh, _enod, _nmrk, + // _conn, _next, _flip, + // _qold, _qnew, _kind) ; + + if (_flip) return ; + } + else + { + // flip_t1q1( _geom, _mesh, _enod, _nmrk, + // _conn, _next, _flip, + // _qold, _qnew, _kind) ; + + if (_flip) return ; + } + } + + for (auto _enum = 4; _enum-- > _coin; ) + { + _flip = false ; + /*----------------------------- flip cells about edge */ + iptr_type _enod[4] ; + mesh_type::quad_type:: + face_node(_enod, _enum, +2, +1) ; + _enod[ 0] = _mesh.quad( + _cell).node( _enod[ 0]) ; + _enod[ 1] = _mesh.quad( + _cell).node( _enod[ 1]) ; + + _conn.set_count(0) ; + _next.set_count(0) ; + _mesh.connect_2( + &_enod[0], EDGE2_tag, _conn) ; + + if (_conn.count() != +2) continue ; + + if (_conn[0]._kind==QUAD4_tag && + _conn[1]._kind==QUAD4_tag ) + { + // flip_q2q2( _geom, _mesh, _enod, _nmrk, + // _conn, _next, _flip, + // _qold, _qnew, _kind) ; + + if (_flip) return ; + } + else + { + // flip_t1q1( _geom, _mesh, _enod, _nmrk, + // _conn, _next, _flip, + // _qold, _qnew, _kind) ; + + if (_flip) return ; + } + } + + } + + /* + -------------------------------------------------------- + * FLIP-MESH: "flip" mesh topology. + -------------------------------------------------------- + */ + + #include "iter_flip_2.inc" + + __static_call + __normal_call void_type flip_mesh ( + geom_type &_geom , // geometry object + mesh_type &_mesh , // mesh object + hfun_type &_hfun , // spacing object + iptr_list &_nset , // list of nodes active + mark_list &_mark , // sets of node/cell flags + iptr_type _imrk , // outer iteration marker + size_t &_nflp , // number of successful flips + iter_stat &_tcpu // CPU timers/info + ) + { + # ifdef __use_timers + typename std ::chrono:: + high_resolution_clock::time_point _ttic; + typename std ::chrono:: + high_resolution_clock::time_point _ttoc; + typename std ::chrono:: + high_resolution_clock _time ; + + __unreferenced(_time) ; // why does MSVC need this?? + # endif//__use_timers + + # define MARKTRI3(_CELL) \ + _mark._tri3[_CELL->_cell] + + # define MARKQUAD(_CELL) \ + _mark._quad[_CELL->_cell] + + _nflp = (iptr_type) +0 ; + + init_mark(_mesh, + _mark, std::max(+0 , _imrk - 1) ) ; + + # ifdef __use_timers + _ttic = _time.now() ; + # endif//__use_timers + + /*--------------------- init. flip stack as ADJ(NSET) */ + conn_list _flip, _conn ; + for (auto _iter = _nset.head(); + _iter != _nset.tend(); + ++_iter ) + { + if (_mesh.node(*_iter).mark() >= 0) + { + _conn.set_count(0); + _mesh.connect_2( + &*_iter, POINT_tag, _conn) ; + + for (auto _cell = _conn.head(); + _cell != _conn.tend(); + ++_cell ) + { + if (_cell->_kind == TRIA3_tag) + { + if (MARKTRI3( _cell ) != _imrk) + { + MARKTRI3( _cell ) = _imrk ; + + _flip.push_tail( *_cell) ; + } + } + else + if (_cell->_kind == QUAD4_tag) + { + if (MARKQUAD( _cell ) != _imrk) + { + MARKQUAD( _cell ) = _imrk ; + + _flip.push_tail( *_cell) ; + } + } + } + } + } + + # ifdef __use_timers + _ttoc = _time.now() ; + _tcpu._init_flip + += _tcpu.time_span (_ttic, _ttoc) ; + # endif//__use_timers + + flip_core(_geom, _mesh, _hfun, _flip, _mark, + _nflp,_tcpu) ; + + # undef MARKQUAD + # undef MARKTRI3 + } + + __static_call + __normal_call void_type flip_mesh ( + geom_type &_geom , // geometry object + mesh_type &_mesh , // mesh object + hfun_type &_hfun , // spacing object + conn_sets &_CONN , // cached node adj. indexing + iptr_list &_nset , // list of nodes active + mark_list &_mark , // sets of node/cell flags + iptr_type _imrk , // outer iteration marker + size_t &_nflp , // number of successful flips + iter_stat &_tcpu // CPU timers/info + ) + { + # ifdef __use_timers + typename std ::chrono:: + high_resolution_clock::time_point _ttic; + typename std ::chrono:: + high_resolution_clock::time_point _ttoc; + typename std ::chrono:: + high_resolution_clock _time ; + + __unreferenced(_time) ; // why does MSVC need this?? + # endif//__use_timers + + # define MARKTRI3(_CELL) \ + _mark._tri3[_CELL->_cell] + + # define MARKQUAD(_CELL) \ + _mark._quad[_CELL->_cell] + + _nflp = (iptr_type) +0 ; + + init_mark(_mesh, + _mark, std::max(+0 , _imrk - 1) ) ; + + # ifdef __use_timers + _ttic = _time.now() ; + # endif//__use_timers + + /*--------------------- init. flip stack as ADJ(NSET) */ + conn_list _flip ; + for (auto _iter = _nset.head(); + _iter != _nset.tend(); + ++_iter ) + { + if (_mesh.node(*_iter).mark() >= 0) + { + for (auto _cell = + _CONN._adj2.head()+_CONN._idx2[*_iter+0] ; + _cell != + _CONN._adj2.head()+_CONN._idx2[*_iter+1] ; + ++_cell ) + { + if (_cell->_kind == TRIA3_tag) + { + if (MARKTRI3( _cell ) != _imrk) + { + MARKTRI3( _cell ) = _imrk ; + + _flip.push_tail( *_cell) ; + } + } + else + if (_cell->_kind == QUAD4_tag) + { + if (MARKQUAD( _cell ) != _imrk) + { + MARKQUAD( _cell ) = _imrk ; + + _flip.push_tail( *_cell) ; + } + } + } + } + } + + # ifdef __use_timers + _ttoc = _time.now() ; + _tcpu._init_flip + += _tcpu.time_span (_ttic, _ttoc) ; + # endif//__use_timers + + flip_core(_geom, _mesh, _hfun, _flip, _mark, + _nflp,_tcpu) ; + + # undef MARKQUAD + # undef MARKTRI3 + } + + __static_call + __normal_call void_type flip_core ( + geom_type &_geom , // geometry object + mesh_type &_mesh , // mesh object + hfun_type &_hfun , // spacing object + conn_list &_flip , // list of cells to flip + mark_list &_mark , // sets of node/cell flags + size_t &_nflp , // number of successful flips + iter_stat &_tcpu // CPU timers/info + ) + { + # ifdef __use_timers + typename std ::chrono:: + high_resolution_clock::time_point _ttic; + typename std ::chrono:: + high_resolution_clock::time_point _ttoc; + typename std ::chrono:: + high_resolution_clock _time ; + + __unreferenced(_time) ; // why does MSVC need this?? + # endif//__use_timers + + __unreferenced(_hfun) ; + + # ifdef __use_timers + _ttic = _time.now() ; + # endif//__use_timers + + /*--------------------- exhaustive, incremental flips */ + conn_list _next, _conn, _CONN; + real_list _qold, _qnew ; + for ( ; !_flip.empty() ; ) + { + for (auto _cell = _flip.head(); + _cell != _flip.tend(); + ++_cell ) + { + if (_cell->_kind == TRIA3_tag) + { + if ( _mesh. + tri3(_cell->_cell).mark() >= +0) + { + bool_type _okay = false ; + flip_tri3( _geom, _mesh, + _mark. _node, + _cell->_cell, + _okay, _conn, _CONN, + _qold, _qnew, + (flip_kind)laguerre_flip) ; + + if (_okay) _nflp += +1 ; + + _next.push_tail( + _CONN.head(), _CONN.tend()); + } + } + else + if (_cell->_kind == QUAD4_tag) + { + if ( _mesh. + quad(_cell->_cell).mark() >= +0) + { + bool_type _okay = false ; + // flip_quad( _geom, _mesh, + // _mark. _node, + // _cell->_cell, + // _okay, _conn, _CONN, + // _qold, _qnew, + // (flip_kind)laguerre_flip) ; + + if (_okay) _nflp += +1 ; + + _next.push_tail( + _CONN.head(), _CONN.tend()); + } + } + } + _flip = std::move (_next) ; + } + + # ifdef __use_timers + _ttoc = _time.now() ; + _tcpu._core_flip += _tcpu.time_span(_ttic, _ttoc) ; + # endif//__use_timers + } + + + diff --git a/external/jigsaw/src/libcpp/iter_mesh/iter_divs_2.inc b/external/jigsaw/src/libcpp/iter_mesh/iter_divs_2.inc index 0dcd350..843aa1c 100644 --- a/external/jigsaw/src/libcpp/iter_mesh/iter_divs_2.inc +++ b/external/jigsaw/src/libcpp/iter_mesh/iter_divs_2.inc @@ -22,18 +22,22 @@ * how they can obtain it for free, then you are not * required to make any arrangement with me.) * - * Disclaimer: Neither I nor: Columbia University, The - * Massachusetts Institute of Technology, The - * University of Sydney, nor The National Aeronautics - * and Space Administration warrant this code in any - * way whatsoever. This code is provided "as-is" to be - * used at your own risk. + * Disclaimer: Neither I nor THE CONTRIBUTORS warrant + * this code in any way whatsoever. This code is + * provided "as-is" to be used at your own risk. + * + * THE CONTRIBUTORS include: + * (a) The University of Sydney + * (b) The Massachusetts Institute of Technology + * (c) Columbia University + * (d) The National Aeronautics & Space Administration + * (e) Los Alamos National Laboratory * -------------------------------------------------------- * - * Last updated: 27 Dec., 2020 + * Last updated: 11 Jun., 2022 * - * Copyright 2013-2020 + * Copyright 2013-2022 * Darren Engwirda * d.engwirda@gmail.com * https://github.com/dengwirda/ @@ -52,32 +56,33 @@ __static_call __normal_call void_type _div_edge ( - geom_type &_geom , - mesh_type &_mesh , - hfun_type &_hfun , - real_list &_hval , - iter_opts &_opts , - iptr_type _iout , - iptr_type _enum , - char_type _kern , - bool_type &_okay , - iptr_type &_inew , - conn_list &_cset , - conn_list &_cnew , - conn_list &_iset , - conn_list &_jset , - real_list &_qsrc , - real_list &_qdst , - real_list &_qtmp , - real_type _QLIM , - real_type _lmin - = (real_type) +1.00E+00 , - real_type _qinc - = (real_type) +2.50E-02 + geom_type &_geom , // geometry object + mesh_type &_mesh , // mesh object + hfun_type &_hfun , // spacing object + real_list &_hval , // cached node spacing array + iter_opts &_opts , // user options + iptr_type _iout , // outer iteration marker + iptr_type _enum , // edge number to div. + kern_kind _kern , // optim. kernel selector + bool_type &_okay , // TRUE if div. successful + iptr_type &_inew , // new node index added + conn_list &_cset , // space for adj. cells + conn_list &_cnew , // space for adj. cells + conn_list &_iset , // space for adj. cells + conn_list &_jset , // space for adj. cells + real_list &_qsrc , // space for adj. costs + real_list &_qdst , // space for adj. costs + real_list &_qtmp , // space for adj. costs + real_type _QLIM , // cell quality threshold + iter_stat &_tcpu , // cpu timers/info + real_type _lmin // div. spacing threshold + = (real_type) +1.000E+00 , + real_type _qinc // div. quality threshold + = (real_type) +3.333E-03 ) { iptr_type static constexpr - _last = pred_type::geom_dims+0 ; + _last = pred_type::geom_dims + 0 ; iptr_type static constexpr _DEG_TRIA3 = (iptr_type)+6 ; @@ -86,7 +91,7 @@ /*--------------------------------- get edge indexing */ auto _eptr = - _mesh. edge().head()+_enum ; + _mesh. edge().head()+_enum ; iptr_type _enod[2] ; _enod[ 0] = _eptr->node(0) ; @@ -121,20 +126,23 @@ if (_cset.count()<=1) return ; /*--------------------------------- get edge h-sizing */ - real_type _pmid[_last + 1] ; + real_type _ball[_last + 1] ; for (auto _idim = pred_type::real_dims; _idim-- != 0; ) { - _pmid[_idim] = (real_type)0. ; - _pmid[_idim] += + _ball[_idim] = (real_type) +0. ; + _ball[_idim] += _iptr->pval(_idim) ; - _pmid[_idim] += + _ball[_idim] += _jptr->pval(_idim) ; - _pmid[_idim] /= (real_type)2. ; + _ball[_idim] /= (real_type) +2. ; } - real_type _isiz, _jsiz, _msiz ; + pred_type:: + proj_node(_geom, _ball, _ball); + + real_type _isiz, _jsiz, _bsiz ; _isiz = _hfun.eval( &_iptr->pval(0), _iptr->hidx()) ; _jsiz = _hfun.eval( @@ -142,7 +150,7 @@ auto _hint = _iptr->hidx(); - _msiz = _hfun.eval(_pmid , _hint) ; + _bsiz = _hfun.eval(_ball , _hint) ; real_type _lsqr = pred_type::length_sq ( @@ -151,70 +159,74 @@ real_type _hbar = _isiz * (real_type)(1./4.) + _jsiz * (real_type)(1./4.) + - _msiz * (real_type)(2./4.) ; + _bsiz * (real_type)(2./4.) ; /*--------------------------------- exit if too small */ if (_lsqr <= _hbar * _lmin * _hbar * _lmin ) return ; + auto _ideg = _mesh. + node(_enod[0]).ndeg(TRIA3_tag ) ; + auto _ierr = + (iptr_type)(_ideg-_DEG_TRIA3) ; + + auto _jdeg = _mesh. + node(_enod[1]).ndeg(TRIA3_tag ) ; + auto _jerr = + (iptr_type)(_jdeg-_DEG_TRIA3) ; + /*--------------------------------- split if too long */ real_type static constexpr - _lBIG = (real_type) +1.38750 ; + _lBIG = (real_type)+1.375 ; - if (_lsqr >= _hbar * _lBIG * - _hbar * _lBIG ) + real_type _lmax = // no oscl. wrt. zip + _lBIG *std::pow( _iout , +1./4.) ; + + if (_lsqr >= _hbar * _lmax * + _hbar * _lmax ) { // if more regular geom. is constructed via the edge // div, make it easier to do so! - _qinc = 0.5 * (_hbar / std::sqrt(_lsqr) - 1.0) ; - - _qinc /= std::abs( _iout ) ; // no oscl. wrt. zip + _qinc = (real_type)(1./2. * + (_hbar / std::sqrt(_lsqr) - 1.0)) ; } else + if ( _ierr >= 2 || _jerr >= 2 ) { - /*--------------------------------- get adjacent face */ - _mesh.connect_2(_eptr->node(+0), - POINT_tag , _iset) ; - _mesh.connect_2(_eptr->node(+1), - POINT_tag , _jset) ; - - /*--------------------------------- calc. local topo. */ - auto _ideg = _iset.count() ; - auto _ierr = - (iptr_type)(_ideg-_DEG_TRIA3) ; - - auto _jdeg = _jset.count() ; - auto _jerr = - (iptr_type)(_jdeg-_DEG_TRIA3) ; + // try to reduce large vertex valence via refinement - if (std::max(_ierr, _jerr) < 2) - return ; + real_type _qerr = (real_type) -1./16. ; + _qerr*= std::max (_ierr, _jerr ) ; + _qerr/= std::pow (_iout, +1./2.) ; // stop oscl. + _qinc = std::min (_qinc, + _qinc + _qerr) ; - } // if (_lBIG) + } + else + if ( _ierr > 0 && _jerr > 0 && + (_ierr + _jerr) >= 3 ) + { + // try to reduce large vertex valence via refinement - /*--------------------------------- get adjacent cost */ - real_type _qmin = loop_cost( - _mesh, _cset, _qsrc, cell_kind()) ; + real_type _qerr = (real_type) -1./16. ; + _qerr*= std::max (_ierr, _jerr ) ; + _qerr/= std::pow (_iout, +1./2.) ; // stop oscl. + _qinc = std::min (_qinc, + _qinc + _qerr) ; - /*--------------------------------- get adjacent ball */ - real_type _ball[_last + 1] ; - for (auto _idim = - pred_type::real_dims; _idim-- != 0; ) + } + else { - _ball[_idim] = (real_type) +0. ; - _ball[_idim] += - _iptr->pval(_idim) ; - _ball[_idim] += - _jptr->pval(_idim) ; - - _ball[_idim] /= (real_type) +2. ; + // don't refine otherwise: bail-out early! + return ; } - pred_type:: - proj_node(_geom, _ball, _ball); + /*--------------------------------- get adjacent cost */ + real_type _qmin = loop_cost( + _mesh, _cset, _qsrc, cell_kind()) ; /*--------------------------------- try to split edge */ # define NULLFEAT null_feat @@ -358,6 +370,9 @@ iptr_type static constexpr _INUM = (iptr_type) +4; + real_type _prev[_last + 1] = + {(real_type)+0.}; + iptr_type _move = -1; for (auto _iloc = +0; _iloc != _INUM; ++_iloc ) @@ -372,12 +387,13 @@ move_node( _geom, _mesh, _hfun, _hval, - _opts, _nptr, _kern, - _move, _cnew, + _opts, _nptr, _prev, + _kern, _move, _cnew, _qtmp, _qdst, - _minC, _QLIM ) ; + _minC, _QLIM, _QLIM, + _tcpu) ; - if (_move <= +0) break ; + if (_move <= +0 ) break; } /*--------------------------------- is cost improved? */ diff --git a/external/jigsaw/src/libcpp/iter_mesh/iter_divs_3.inc b/external/jigsaw/src/libcpp/iter_mesh/iter_divs_3.inc index 5eba1ae..1b0d8e7 100644 --- a/external/jigsaw/src/libcpp/iter_mesh/iter_divs_3.inc +++ b/external/jigsaw/src/libcpp/iter_mesh/iter_divs_3.inc @@ -22,16 +22,20 @@ * how they can obtain it for free, then you are not * required to make any arrangement with me.) * - * Disclaimer: Neither I nor: Columbia University, The - * Massachusetts Institute of Technology, The - * University of Sydney, nor The National Aeronautics - * and Space Administration warrant this code in any - * way whatsoever. This code is provided "as-is" to be - * used at your own risk. + * Disclaimer: Neither I nor THE CONTRIBUTORS warrant + * this code in any way whatsoever. This code is + * provided "as-is" to be used at your own risk. + * + * THE CONTRIBUTORS include: + * (a) The University of Sydney + * (b) The Massachusetts Institute of Technology + * (c) Columbia University + * (d) The National Aeronautics & Space Administration + * (e) Los Alamos National Laboratory * -------------------------------------------------------- * - * Last updated: 12 August, 2018 + * Last updated: 12 Aug., 2018 * * Copyright 2013-2018 * Darren Engwirda @@ -41,7 +45,7 @@ -------------------------------------------------------- */ - // from iter_mesh_2.hpp + // from iter_mesh_3.hpp /* diff --git a/external/jigsaw/src/libcpp/iter_mesh/iter_dual_2.inc b/external/jigsaw/src/libcpp/iter_mesh/iter_dual_2.inc index 3c2b6d0..833eebb 100644 --- a/external/jigsaw/src/libcpp/iter_mesh/iter_dual_2.inc +++ b/external/jigsaw/src/libcpp/iter_mesh/iter_dual_2.inc @@ -22,18 +22,22 @@ * how they can obtain it for free, then you are not * required to make any arrangement with me.) * - * Disclaimer: Neither I nor: Columbia University, The - * Massachusetts Institute of Technology, The - * University of Sydney, nor The National Aeronautics - * and Space Administration warrant this code in any - * way whatsoever. This code is provided "as-is" to be - * used at your own risk. + * Disclaimer: Neither I nor THE CONTRIBUTORS warrant + * this code in any way whatsoever. This code is + * provided "as-is" to be used at your own risk. + * + * THE CONTRIBUTORS include: + * (a) The University of Sydney + * (b) The Massachusetts Institute of Technology + * (c) Columbia University + * (d) The National Aeronautics & Space Administration + * (e) Los Alamos National Laboratory * -------------------------------------------------------- * - * Last updated: 30 April, 2020 + * Last updated: 11 Jun., 2022 * - * Copyright 2013-2020 + * Copyright 2013-2022 * Darren Engwirda * d.engwirda@gmail.com * https://github.com/dengwirda/ @@ -61,7 +65,9 @@ real_type _COST , real_type _STEP , real_type _SAVE , - real_type &_DQDW + real_type &_DQDW , + real_type &_dmin , + real_type &_dmax ) { iptr_type static constexpr @@ -71,14 +77,6 @@ std::pow(std::numeric_limits ::epsilon(), .50) ; - real_type static const _RMIN = - std::pow(std::numeric_limits - ::epsilon(), .75) ; - - real_type static const _RMAX = - std::pow(std::numeric_limits - ::epsilon(), .25) ; - /*------------------------------------- cell indexing */ auto _ppos = &_node->pval(0); @@ -87,21 +85,11 @@ /*------------------ local iter. on finite-diff. step */ real_type _wdel = _WINC * _STEP; - - real_type _wsum = (real_type)0.; - - real_type _sdel = (real_type)0.; - real_type _sabs = (real_type)0.; - real_type _sbar = (real_type)0.; - - for (auto _iter = +0; _iter++ != +2; ) + real_type _dsup , _dsdn , _dqdw; { /*------------------ centred finite-diff. for dQ / dw */ _ppos[_last] = _SAVE + _wdel; - _wsum = (real_type)+0. ; - _wsum += _ppos[_last] - _SAVE; - real_type _scr1 = pred_type::tri3_cost ( &_mesh. node( @@ -114,9 +102,9 @@ pred_type::dual_kind () ) ; - _ppos[_last] = _SAVE - _wdel; + _dsup = (_scr1-_COST) / _wdel; - _wsum -= _ppos[_last] - _SAVE; + _ppos[_last] = _SAVE - _wdel; real_type _scr0 = pred_type::tri3_cost ( @@ -130,33 +118,21 @@ pred_type::dual_kind () ) ; - _sdel = _scr1 - _scr0 ; - - _sbar = std::abs(_COST) ; - _sabs = std::abs(_sdel) ; - - /*------------------ try to adjust step on rel. diff. */ - if (_sabs > (real_type)0.) - { - if (_sabs > _RMAX * _sbar) - { - _wdel/= (real_type) +10. ; - } - else - if (_sabs < _RMIN * _sbar) - { - _wdel*= (real_type) +10. ; - } - else { break ; } - } - else { break ; } + _dsdn = (_COST-_scr0) / _wdel; } _ppos [_last] = _SAVE ; /*------------------ finalise gradient and accumulate */ + if (_dsup * _dsdn > (real_type)0.) + { + _dqdw = +.5 * (_dsup + _dsdn) ; - _DQDW += _sdel / _wsum ; + _DQDW += _dqdw ; + + _dmin = std::min(_dmin, _dqdw) ; + _dmax = std::max(_dmax, _dqdw) ; + } } /* @@ -176,7 +152,9 @@ real_type _COST , real_type _STEP , real_type _SAVE , - real_type &_DQDW + real_type &_DQDW , + real_type &_dmin , + real_type &_dmax ) { iptr_type static constexpr @@ -186,14 +164,6 @@ std::pow(std::numeric_limits ::epsilon(), .50) ; - real_type static const _RMIN = - std::pow(std::numeric_limits - ::epsilon(), .75) ; - - real_type static const _RMAX = - std::pow(std::numeric_limits - ::epsilon(), .25) ; - /*------------------------------------- cell indexing */ auto _ppos = &_node->pval(0); @@ -202,21 +172,11 @@ /*------------------ local iter. on finite-diff. step */ real_type _wdel = _WINC * _STEP; - - real_type _wsum = (real_type)0.; - - real_type _sdel = (real_type)0.; - real_type _sabs = (real_type)0.; - real_type _sbar = (real_type)0.; - - for (auto _iter = +0; _iter++ != +2; ) + real_type _dsup , _dsdn , _dqdw; { /*------------------ centred finite-diff. for dQ / dw */ _ppos[_last] = _SAVE + _wdel; - _wsum = (real_type)+0. ; - _wsum += _ppos[_last] - _SAVE; - real_type _scr1 = pred_type::quad_cost ( &_mesh. node( @@ -231,9 +191,9 @@ pred_type::dual_kind () ) ; - _ppos[_last] = _SAVE - _wdel; + _dsup = (_scr1-_COST) / _wdel; - _wsum -= _ppos[_last] - _SAVE; + _ppos[_last] = _SAVE - _wdel; real_type _scr0 = pred_type::quad_cost ( @@ -249,33 +209,21 @@ pred_type::dual_kind () ) ; - _sdel = _scr1 - _scr0 ; - - _sbar = std::abs(_COST) ; - _sabs = std::abs(_sdel) ; - - /*------------------ try to adjust step on rel. diff. */ - if (_sabs > (real_type)0.) - { - if (_sabs > _RMAX * _sbar) - { - _wdel/= (real_type) +10. ; - } - else - if (_sabs < _RMIN * _sbar) - { - _wdel*= (real_type) +10. ; - } - else { break ; } - } - else { break ; } + _dsdn = (_COST-_scr0) / _wdel; } _ppos [_last] = _SAVE ; /*------------------ finalise gradient and accumulate */ + if (_dsup * _dsdn > (real_type)0.) + { + _dqdw = +.5 * (_dsup + _dsdn) ; + + _DQDW += _dqdw ; - _DQDW += _sdel / _wsum ; + _dmin = std::min(_dmin, _dqdw) ; + _dmax = std::max(_dmax, _dqdw) ; + } } /* @@ -355,6 +303,11 @@ real_type _qlim = _qmin + (real_type)+1.0E-002 ; + real_type _dmax = + -std::numeric_limits::infinity() ; + real_type _dmin = + +std::numeric_limits::infinity() ; + real_type _DQDW = (real_type) 0.; real_type _SAVE = @@ -363,7 +316,7 @@ real_type _qbar = (real_type) 1.; real_type _qlow = (real_type) 0.; - iptr_type _lnum = 0, _hnum = 1, _nnum = 0; + iptr_type _lnum = 0, _hnum = 1, _nnum = 0 ; for (auto _next = _conn.head() , _tend = _conn.tend() ; _next != _tend ; @@ -380,14 +333,14 @@ { dqdw_tri3_k(_mesh, _cell, _node , _COST, _wadj, _SAVE, - _DQDW ) ; + _DQDW , _dmin, _dmax) ; } else if (_kind == QUAD4_tag) { dqdw_quad_k(_mesh, _cell, _node , _COST, _wadj, _SAVE, - _DQDW ) ; + _DQDW , _dmin, _dmax) ; } _qlow += _COST ; _lnum += +1 ; @@ -398,7 +351,11 @@ } } - if (_nnum > +0) + if (_dmin * + _dmax <=(real_type) +0. ) // check monotone? + _DQDW =(real_type) +0. ; + + if (_nnum != +0) { _DQDW /= _lnum ; _qlow /= _lnum ; diff --git a/external/jigsaw/src/libcpp/iter_mesh/iter_dual_3.inc b/external/jigsaw/src/libcpp/iter_mesh/iter_dual_3.inc index 5d85728..88b5dfb 100644 --- a/external/jigsaw/src/libcpp/iter_mesh/iter_dual_3.inc +++ b/external/jigsaw/src/libcpp/iter_mesh/iter_dual_3.inc @@ -22,16 +22,20 @@ * how they can obtain it for free, then you are not * required to make any arrangement with me.) * - * Disclaimer: Neither I nor: Columbia University, The - * Massachusetts Institute of Technology, The - * University of Sydney, nor The National Aeronautics - * and Space Administration warrant this code in any - * way whatsoever. This code is provided "as-is" to be - * used at your own risk. + * Disclaimer: Neither I nor THE CONTRIBUTORS warrant + * this code in any way whatsoever. This code is + * provided "as-is" to be used at your own risk. + * + * THE CONTRIBUTORS include: + * (a) The University of Sydney + * (b) The Massachusetts Institute of Technology + * (c) Columbia University + * (d) The National Aeronautics & Space Administration + * (e) Los Alamos National Laboratory * -------------------------------------------------------- * - * Last updated: 12 August, 2018 + * Last updated: 12 Aug., 2018 * * Copyright 2013-2018 * Darren Engwirda diff --git a/external/jigsaw/src/libcpp/iter_mesh/iter_flip_2.inc b/external/jigsaw/src/libcpp/iter_mesh/iter_flip_2.inc index 821c9b3..4d2fad3 100644 --- a/external/jigsaw/src/libcpp/iter_mesh/iter_flip_2.inc +++ b/external/jigsaw/src/libcpp/iter_mesh/iter_flip_2.inc @@ -22,18 +22,22 @@ * how they can obtain it for free, then you are not * required to make any arrangement with me.) * - * Disclaimer: Neither I nor: Columbia University, The - * Massachusetts Institute of Technology, The - * University of Sydney, nor The National Aeronautics - * and Space Administration warrant this code in any - * way whatsoever. This code is provided "as-is" to be - * used at your own risk. + * Disclaimer: Neither I nor THE CONTRIBUTORS warrant + * this code in any way whatsoever. This code is + * provided "as-is" to be used at your own risk. + * + * THE CONTRIBUTORS include: + * (a) The University of Sydney + * (b) The Massachusetts Institute of Technology + * (c) Columbia University + * (d) The National Aeronautics & Space Administration + * (e) Los Alamos National Laboratory * -------------------------------------------------------- * - * Last updated: 30 April, 2020 + * Last updated: 01 Sept., 2021 * - * Copyright 2013-2020 + * Copyright 2013-2021 * Darren Engwirda * d.engwirda@gmail.com * https://github.com/dengwirda/ @@ -44,12 +48,6 @@ // from iter_mesh_2.hpp - /* - __static_call - __normal_call bool_type need_flip_costfunc ( - */ - - __static_call __normal_call bool_type need_flip_delaunay ( geom_type &_geom, @@ -227,6 +225,71 @@ } } + __static_call + __normal_call bool_type need_flip_topology ( + geom_type &/*_geom*/ , + mesh_type &_mesh, + iptr_list &_nmrk, + __const_ptr(iptr_type) _enod, + __const_ptr(iptr_type) _inod, + __const_ptr(iptr_type) _jnod + ) + { + iptr_type static constexpr + _DEG_TRIA3 = (iptr_type)+6 ; + // iptr_type static constexpr + // _DEG_QUAD4 = (iptr_type)+4 ; + + /*----------------------------- assess flip criterion */ + auto _ideg = _mesh. + node(_enod[0]).ndeg(TRIA3_tag); + auto _jdeg = _mesh. + node(_enod[1]).ndeg(TRIA3_tag); + auto _adeg = _mesh. + node(_inod[2]).ndeg(TRIA3_tag); + auto _bdeg = _mesh. + node(_jnod[2]).ndeg(TRIA3_tag); + + if(_nmrk[_enod[0]] < 0) return false ; + if(_nmrk[_enod[1]] < 0) return false ; + if(_nmrk[_inod[2]] < 0) return false ; + if(_nmrk[_jnod[2]] < 0) return false ; + + auto _ierr = + (iptr_type)(_DEG_TRIA3-_ideg) ; + auto _jerr = + (iptr_type)(_DEG_TRIA3-_jdeg) ; + auto _aerr = + (iptr_type)(_DEG_TRIA3-_adeg) ; + auto _berr = + (iptr_type)(_DEG_TRIA3-_bdeg) ; + + auto _IDEG = _ideg - 1; + auto _IERR = + (iptr_type)(_DEG_TRIA3-_IDEG) ; + auto _JDEG = _jdeg - 1; + auto _JERR = + (iptr_type)(_DEG_TRIA3-_JDEG) ; + auto _ADEG = _adeg + 1; + auto _AERR = + (iptr_type)(_DEG_TRIA3-_ADEG) ; + auto _BDEG = _bdeg + 1; + auto _BERR = + (iptr_type)(_DEG_TRIA3-_BDEG) ; + + auto _dnow = std::abs(_ierr) + // current defect + std::abs(_jerr) + + std::abs(_aerr) + + std::abs(_berr) ; + + auto _dnew = std::abs(_IERR) + // updated defect + std::abs(_JERR) + + std::abs(_AERR) + + std::abs(_BERR) ; + + return _dnew < _dnow - 1 ? true : false ; + } + /* -------------------------------------------------------- * FLIP-T2T2: 2-simplex topological flip. @@ -243,12 +306,14 @@ __normal_call void_type flip_t2t2 ( geom_type &_geom , mesh_type &_mesh , + iptr_list &_nmrk , iptr_type *_enod , conn_list &_conn , conn_list &_next , bool_type &_flip , real_list &_qold , - real_list &_qnew + real_list &_qnew , + flip_kind _kind ) { iptr_type _epos = -1 ; @@ -315,10 +380,49 @@ "ITER.FLIP-T2T2: bad orientation!") ; /*----------------------------- flip cells about edge */ + if ( _kind == laguerre_flip ) + { if(!need_flip_laguerre ( _geom, _mesh , _inod, _jnod)) return ; + } + else + if ( _kind == delaunay_flip ) + { + if(!need_flip_delaunay ( + _geom, _mesh , + _inod, _jnod)) return ; + } + else + if ( _kind == topology_flip ) + { + if(!need_flip_topology ( + _geom, _mesh , + _nmrk, _enod , + _inod, _jnod)) return ; + } + + /*----------------------------- break if cells tangle */ + real_type _ivec[ +3 ] ; + pred_type::tri3_norm ( + &_mesh.node(_inod[0]).pval(0), + &_mesh.node(_jnod[2]).pval(0), + &_mesh.node(_inod[2]).pval(0), + &_ivec[0] ) ; + + real_type _jvec[ +3 ] ; + pred_type::tri3_norm ( + &_mesh.node(_jnod[0]).pval(0), + &_mesh.node(_inod[2]).pval(0), + &_mesh.node(_jnod[2]).pval(0), + &_jvec[0] ) ; + real_type _sign = + geometry::dot_3d (_ivec, _jvec) ; + + if (_sign <= (real_type)+0.) return ; + + /*----------------------------- update local topology */ _mesh._pop_tri3(_itri) ; _mesh._pop_tri3(_jtri) ; @@ -346,199 +450,5 @@ _mesh.push_tri3(_tdat), TRIA3_tag)) ; } - /* - -------------------------------------------------------- - * FLIP-TRI3: "flip" mesh topology. - -------------------------------------------------------- - */ - - __static_call - __inline_call void_type flip_tri3 ( - geom_type &_geom , - mesh_type &_mesh , - iptr_type _cell , - bool_type &_flip , - conn_list &_conn , - conn_list &_next , - real_list &_qold , - real_list &_qnew - ) - { - auto _coin = (std::rand() % 3) + 1 ; - for (auto _enum = _coin; _enum-- > 0; ) - { - _flip = false ; - /*----------------------------- flip cells about edge */ - iptr_type _enod[3] ; - mesh_type::tri3_type:: - face_node(_enod, _enum, +2, +1) ; - _enod[ 0] = _mesh.tri3( - _cell).node( _enod[ 0]) ; - _enod[ 1] = _mesh.tri3( - _cell).node( _enod[ 1]) ; - - _conn.set_count(0) ; - _next.set_count(0) ; - _mesh.connect_2( - &_enod[0], EDGE2_tag, _conn) ; - - if (_conn.count() != +2) continue ; - - if (_conn[0]._kind==TRIA3_tag && - _conn[1]._kind==TRIA3_tag ) - { - flip_t2t2( _geom, _mesh, _enod, - _conn, _next, _flip, - _qold, _qnew) ; - - if (_flip) return ; - } - else - { - // flip_t1q1( _geom, _mesh, _enod, - // _conn, _next, _flip, - // _qold, _qnew) ; - - if (_flip) return ; - } - } - - for (auto _enum = 3; _enum-- > _coin; ) - { - _flip = false ; - /*----------------------------- flip cells about edge */ - iptr_type _enod[3] ; - mesh_type::tri3_type:: - face_node(_enod, _enum, +2, +1) ; - _enod[ 0] = _mesh.tri3( - _cell).node( _enod[ 0]) ; - _enod[ 1] = _mesh.tri3( - _cell).node( _enod[ 1]) ; - - _conn.set_count(0) ; - _next.set_count(0) ; - _mesh.connect_2( - &_enod[0], EDGE2_tag, _conn) ; - - if (_conn.count() != +2) continue ; - - if (_conn[0]._kind==TRIA3_tag && - _conn[1]._kind==TRIA3_tag ) - { - flip_t2t2( _geom, _mesh, _enod, - _conn, _next, _flip, - _qold, _qnew) ; - - if (_flip) return ; - } - else - { - // flip_t1q1( _geom, _mesh, _enod, - // _conn, _next, _flip, - // _qold, _qnew) ; - - if (_flip) return ; - } - } - - } - - /* - -------------------------------------------------------- - * FLIP-QUAD: "flip" mesh topology. - -------------------------------------------------------- - */ - - __static_call - __inline_call void_type flip_quad ( - geom_type &/*_geom*/ , - mesh_type &_mesh , - iptr_type _cell , - bool_type &_flip , - conn_list &_conn , - conn_list &_next , - real_list &/*_qold*/ , - real_list &/*_qnew*/ - ) - { - auto _coin = (std::rand() % 4) + 1 ; - for (auto _enum = _coin; _enum-- > 0; ) - { - _flip = false ; - /*----------------------------- flip cells about edge */ - iptr_type _enod[4] ; - mesh_type::quad_type:: - face_node(_enod, _enum, +2, +1) ; - _enod[ 0] = _mesh.quad( - _cell).node( _enod[ 0]) ; - _enod[ 1] = _mesh.quad( - _cell).node( _enod[ 1]) ; - - _conn.set_count(0) ; - _next.set_count(0) ; - _mesh.connect_2( - &_enod[0], EDGE2_tag, _conn) ; - - if (_conn.count() != +2) continue ; - - if (_conn[0]._kind==QUAD4_tag && - _conn[1]._kind==QUAD4_tag ) - { - // flip_q2q2( _geom, _mesh, _enod, - // _conn, _next, _flip, - // _qold, _qnew) ; - - if (_flip) return ; - } - else - { - // flip_t1q1( _geom, _mesh, _enod, - // _conn, _next, _flip, - // _qold, _qnew) ; - - if (_flip) return ; - } - } - - for (auto _enum = 4; _enum-- > _coin; ) - { - _flip = false ; - /*----------------------------- flip cells about edge */ - iptr_type _enod[4] ; - mesh_type::quad_type:: - face_node(_enod, _enum, +2, +1) ; - _enod[ 0] = _mesh.quad( - _cell).node( _enod[ 0]) ; - _enod[ 1] = _mesh.quad( - _cell).node( _enod[ 1]) ; - - _conn.set_count(0) ; - _next.set_count(0) ; - _mesh.connect_2( - &_enod[0], EDGE2_tag, _conn) ; - - if (_conn.count() != +2) continue ; - - if (_conn[0]._kind==QUAD4_tag && - _conn[1]._kind==QUAD4_tag ) - { - // flip_q2q2( _geom, _mesh, _enod, - // _conn, _next, _flip, - // _qold, _qnew) ; - - if (_flip) return ; - } - else - { - // flip_t1q1( _geom, _mesh, _enod, - // _conn, _next, _flip, - // _qold, _qnew) ; - - if (_flip) return ; - } - } - - } - diff --git a/external/jigsaw/src/libcpp/iter_mesh/iter_flip_3.inc b/external/jigsaw/src/libcpp/iter_mesh/iter_flip_3.inc index 5fea529..2440e58 100644 --- a/external/jigsaw/src/libcpp/iter_mesh/iter_flip_3.inc +++ b/external/jigsaw/src/libcpp/iter_mesh/iter_flip_3.inc @@ -22,16 +22,20 @@ * how they can obtain it for free, then you are not * required to make any arrangement with me.) * - * Disclaimer: Neither I nor: Columbia University, The - * Massachusetts Institute of Technology, The - * University of Sydney, nor The National Aeronautics - * and Space Administration warrant this code in any - * way whatsoever. This code is provided "as-is" to be - * used at your own risk. + * Disclaimer: Neither I nor THE CONTRIBUTORS warrant + * this code in any way whatsoever. This code is + * provided "as-is" to be used at your own risk. + * + * THE CONTRIBUTORS include: + * (a) The University of Sydney + * (b) The Massachusetts Institute of Technology + * (c) Columbia University + * (d) The National Aeronautics & Space Administration + * (e) Los Alamos National Laboratory * -------------------------------------------------------- * - * Last updated: 12 August, 2018 + * Last updated: 12 Aug., 2018 * * Copyright 2013-2018 * Darren Engwirda diff --git a/external/jigsaw/src/libcpp/iter_mesh/iter_mesh_2.hpp b/external/jigsaw/src/libcpp/iter_mesh/iter_mesh_2.hpp index 718aed6..268af63 100644 --- a/external/jigsaw/src/libcpp/iter_mesh/iter_mesh_2.hpp +++ b/external/jigsaw/src/libcpp/iter_mesh/iter_mesh_2.hpp @@ -22,19 +22,24 @@ * how they can obtain it for free, then you are not * required to make any arrangement with me.) * - * Disclaimer: Neither I nor: Columbia University, The - * Massachusetts Institute of Technology, The - * University of Sydney, nor The National Aeronautics - * and Space Administration warrant this code in any - * way whatsoever. This code is provided "as-is" to be - * used at your own risk. + * Disclaimer: Neither I nor THE CONTRIBUTORS warrant + * this code in any way whatsoever. This code is + * provided "as-is" to be used at your own risk. + * + * THE CONTRIBUTORS include: + * (a) The University of Sydney + * (b) The Massachusetts Institute of Technology + * (c) Columbia University + * (d) The National Aeronautics & Space Administration + * (e) Los Alamos National Laboratory * -------------------------------------------------------- * - * Last updated: 31 Mar., 2021 + * Last updated: 12 Dec., 2022 * - * Copyright 2013-2021 - * Darren Engwirda + * Copyright 2013-2022 + * Darren Engwirda, + * Marc Tunnell * d.engwirda@gmail.com * https://github.com/dengwirda/ * @@ -73,6 +78,9 @@ typedef typename mesh_type::iptr_type iptr_type ; + iptr_type static constexpr min_subit = +2 ; + iptr_type static constexpr max_subit = +8 ; + iptr_type static constexpr topo_dims = pred_type::topo_dims ; iptr_type static constexpr @@ -80,1701 +88,150 @@ iptr_type static constexpr real_dims = pred_type::real_dims ; - char_type static // optim. kern. selector - constexpr _odt_kern = +1 ; + typedef char_type kern_kind ; + + char_type static // optm. kern. selector + constexpr _odt_optimise = +1 ; char_type static - constexpr _cvt_kern = +2 ; + constexpr _cvt_optimise = +2 ; char_type static - constexpr _h95_kern = +3 ; + constexpr _h95_optimise = +3 ; char_type static - constexpr dqdx_kern = +5 ; + constexpr dqdx_optimise = +5 ; + + typedef char_type flip_kind ; - class cell_kind {} ; // dummies for overload - class dual_kind {} ; + flip_kind static // optm. kern. selector + constexpr laguerre_flip = +1 ; + flip_kind static + constexpr delaunay_flip = +2 ; + flip_kind static + constexpr topology_flip = +3 ; + + class cell_kind{} ; // dummies for overload + class dual_kind{} ; typedef mesh::iter_params < real_type , iptr_type > iter_opts ; - typedef mesh::iter_timers < - real_type , - iptr_type > iter_stat ; + typedef mesh::iter_timers iter_stat ; typedef containers ::array< iptr_type > iptr_list ; + typedef containers + ::array< size_t > uint_list ; typedef containers ::array< real_type > real_list ; - class mark_list // integer cell markers + typedef containers::fixed_array < + real_type , + geom_dims > line_data ; + + typedef containers + ::array< line_data > line_list ; + + class mark_list // integer cell markers { public : iptr_list _node; iptr_list _edge; iptr_list _tri3; iptr_list _quad; - }; - - typedef typename - mesh_type::connector conn_list ; - - public : - - /* - -------------------------------------------------------- - * FLIP-SIGN: flip cells for +ve iter. cost fn. - -------------------------------------------------------- - */ - - __static_call - __normal_call void_type flip_next ( - mesh_type &_mesh, - conn_list &_list, - iptr_type _icel, - iptr_type *_inod, - mark_list &_seen, - conn_list &_conn - ) - { - /*------------------------- flip to match cell "sign" */ - _conn.set_count(0) ; - _mesh.connect_2( - _inod, EDGE2_tag, _conn); - - if (_conn.count() != 2) return; - - iptr_type _jcel, _jfac; - char_type _kind; - if ((iptr_type) - _conn[0]._cell == _icel) - { - _jcel = _conn[ 1]._cell ; - _kind = _conn[ 1]._kind ; - } - else - { - _jcel = _conn[ 0]._cell ; - _kind = _conn[ 0]._kind ; - } - - /*------------------------- match indexing along edge */ - if (_kind == TRIA3_tag) - { - if (_seen._tri3[_jcel] == +0) - { - _list.push_tail(typename - conn_list::data_type(_jcel, _kind)) ; - - _seen._tri3[_jcel] = +1; - - iptr_type _jnod[3] ; - for(_jfac = 3 ; _jfac-- != 0; ) - { - mesh_type::tri3_type:: - face_node(_jnod, _jfac, 2, 1) ; - _jnod[ 0] = _mesh. - tri3(_jcel).node(_jnod[0]) ; - _jnod[ 1] = _mesh. - tri3(_jcel).node(_jnod[1]) ; - _jnod[ 2] = _mesh. - tri3(_jcel).node(_jnod[2]) ; - - if (_jnod[ 2] != _inod[ 0]) - if (_jnod[ 2] != _inod[ 1]) - break ; - } - - if (_jnod[ 0] == _inod[ 0] && - _jnod[ 1] == _inod[ 1]) - { - std::swap ( - _mesh.tri3(_jcel).node( 0), - _mesh.tri3(_jcel).node( 1)) ; - } - } - } - else - if (_kind == QUAD4_tag) - { - if (_seen._quad[_jcel] == +0) - { - _list.push_tail(typename - conn_list::data_type(_jcel, _kind)) ; - - _seen._quad[_jcel] = +1; - - // TODO: reverse quad indexes - } - } - } - - __static_call - __normal_call void_type flip_bfs_ ( - mesh_type &_mesh, - conn_list &_list, - mark_list &_seen - ) - { - conn_list _conn; - for ( ; !_list.empty() ; ) - { - /*------------------------- flip via BFS on cell adj. */ - typename conn_list::data_type _cell ; - _list._pop_tail(_cell) ; - - if (_cell._kind == TRIA3_tag) - { - for(auto _enum = +3; _enum-- != +0; ) - { - auto _cpos = _cell._cell; - - iptr_type _enod[3] ; - mesh_type::tri3_type:: - face_node(_enod, _enum, +2, +1) ; - _enod[ 0] = _mesh.tri3( - _cpos).node( _enod[ 0]) ; - _enod[ 1] = _mesh.tri3( - _cpos).node( _enod[ 1]) ; - - flip_next( _mesh, _list, - _cpos, _enod, _seen, _conn) ; - } - } - else - if (_cell._kind == QUAD4_tag) - { - for(auto _enum = +4; _enum-- != +0; ) - { - auto _cpos = _cell._cell; - - iptr_type _enod[4] ; - mesh_type::quad_type:: - face_node(_enod, _enum, +2, +1) ; - _enod[ 0] = _mesh.quad( - _cpos).node( _enod[ 0]) ; - _enod[ 1] = _mesh.quad( - _cpos).node( _enod[ 1]) ; - - flip_next( _mesh, _list, - _cpos, _enod, _seen, _conn) ; - } - } - } - } - - __static_call - __normal_call void_type flip_sign ( - mesh_type &_mesh - ) - { - # define SEENTRI3( _CELL) _seen._tri3[_CELL] - # define SEENQUAD( _CELL) _seen._quad[_CELL] - - conn_list _list; - mark_list _seen; - init_mark(_mesh, _seen, +0) ; - - /*------------------------- flip to correct mesh sign */ - iptr_type _tnum = +0 ; - for (auto _tria = _mesh.tri3().head(); - _tria != _mesh.tri3().tend(); - ++_tria, ++_tnum ) - { - if (_tria->mark () < +0) continue; - if (SEENTRI3(_tnum) > +0) continue; - - /*--------------------- flip seed for +ve quality */ - real_type _cost = - pred_type::tri3_cost ( - &_mesh. node( - _tria->node(0)).pval(0), - &_mesh. node( - _tria->node(1)).pval(0), - &_mesh. node( - _tria->node(2)).pval(0), - typename - pred_type::cell_kind()) ; - - if (_cost < (real_type) +0.) - { - std::swap ( - _tria->node(0), - _tria->node(1)) ; - } - - /*--------------------- a BFS from seed via topo. */ - _list.push_tail(typename conn_list - ::data_type (_tnum, TRIA3_tag)) ; - - SEENTRI3( _tnum ) = 1 ; - - flip_bfs_(_mesh, _list, _seen) ; - } - - iptr_type _qnum = +0 ; - for (auto _quad = _mesh.quad().head(); - _quad != _mesh.quad().tend(); - ++_quad, ++_qnum ) - { - if (_quad->mark () < +0) continue; - if (SEENQUAD(_qnum) > +0) continue; - - /*--------------------- flip seed for +ve quality */ - real_type _cost = - pred_type::quad_cost ( - &_mesh. node( - _quad->node(0)).pval(0), - &_mesh. node( - _quad->node(1)).pval(0), - &_mesh. node( - _quad->node(2)).pval(0), - &_mesh. node( - _quad->node(3)).pval(0), - typename - pred_type::cell_kind()) ; - - if (_cost < (real_type) +0.) - { - // TODO: reverse quad indexes - } - - /*--------------------- a BFS from seed via topo. */ - _list.push_tail(typename conn_list - ::data_type (_qnum, QUAD4_tag)) ; - - SEENQUAD( _qnum ) = 1 ; - - flip_bfs_(_mesh, _list, _seen) ; - } - # undef SEENQUAD - # undef SEENTRI3 - } - - /* - -------------------------------------------------------- - * MOVE-OKAY: TRUE if state sufficiently good. - -------------------------------------------------------- - */ - - __static_call - __normal_call void_type move_okay ( - real_list &_cdst , - real_list &_csrc , - iptr_type &_move , - real_type _good = +9.25E-01, - real_type _qtol = +1.00E-04, - real_type _xdel = +0.00E+00, - real_type _xtol = - std::numeric_limits::infinity() - ) - { - _move = (iptr_type) -1; - - if (_cdst.empty()) return ; - if (_csrc.empty()) return ; - - /*--------------------- calc. min. + mean metrics */ - real_type _zero = - +std::numeric_limits - ::epsilon (); - real_type _0src = - +std::numeric_limits - ::infinity(); - real_type _0dst = - +std::numeric_limits - ::infinity(); - - real_type _GOOD = - +std::pow(_good, +7./8.); - - real_type _msrc, _mdst; - _msrc = (real_type) +0. ; - _mdst = (real_type) +0. ; - - for (auto _iter = _csrc.head(), - _tend = _csrc.tend(); - _iter != _tend; - ++_iter ) - { - _0src = - std::min(_0src, *_iter) ; - - _msrc += std::pow( - (real_type)1. / *_iter, +9); - } - for (auto _iter = _cdst.head(), - _tend = _cdst.tend(); - _iter != _tend; - ++_iter ) - { - _0dst = - std::min(_0dst, *_iter) ; - - _mdst += std::pow ( - (real_type)1. / *_iter, +9); - } - - _qtol *= std::max(_0src, _zero); - - _msrc = std::pow( - _csrc.count() / _msrc, +1./9.0); - _mdst = std::pow( - _cdst.count() / _mdst, +1./9.0); - - _qtol /= - std::pow(_csrc.count(), 1./9.0); - _qtol /= - std::pow(_cdst.count(), 1./9.0); - - /*---------------------------- test move = "okay" */ - if (_0dst >= _GOOD) - if (_0src >= _GOOD) - { - /*--------------------- okay if moves unconverged */ - if (_xdel > _xtol) - _move = +1; - else - _move = +0; // no iter; too short - - if (_move > +0) return ; - } - - if (_0dst >= _zero) - { - /*--------------------- okay if mean is improving */ - if (_mdst > _msrc+_qtol) - _move = +1; - - if (_move > +0) return ; - } - - } - - /* - -------------------------------------------------------- - * LOOP-COST: cost vector for 1-neighbourhood. - -------------------------------------------------------- - */ - - __static_call - __normal_call real_type loop_cost ( - mesh_type &_mesh , - conn_list &_cset , - real_list &_cost , - cell_kind const& // cell costs on CSET - ) - { - real_type _qmin = (real_type)1. ; - - for (auto _next = _cset.head() , - _tend = _cset.tend() ; - _next != _tend; - ++_next ) - { - real_type _cscr = (real_type)+1. ; - - iptr_type _cell = _next->_cell ; - iptr_type _kind = _next->_kind ; - - switch (_kind) - { - case TRIA3_tag: - { - _cscr = pred_type::tri3_cost ( - &_mesh .node( - _mesh .tri3( - _cell).node(0)).pval(0), - &_mesh .node( - _mesh .tri3( - _cell).node(1)).pval(0), - &_mesh .node( - _mesh .tri3( - _cell).node(2)).pval(0), - typename - pred_type::cell_kind ()) ; - break ; - } - - case QUAD4_tag: - { - _cscr = pred_type::quad_cost ( - &_mesh .node( - _mesh .quad( - _cell).node(0)).pval(0), - &_mesh .node( - _mesh .quad( - _cell).node(1)).pval(0), - &_mesh .node( - _mesh .quad( - _cell).node(2)).pval(0), - &_mesh .node( - _mesh .quad( - _cell).node(3)).pval(0), - typename - pred_type::cell_kind ()) ; - break ; - } - } - - _qmin = - std::min (_qmin, _cscr) ; - - _cost.push_tail (_cscr) ; - } - - return ( _qmin ) ; - } + } ; - __static_call - __normal_call real_type loop_cost ( - mesh_type &_mesh , - conn_list &_cset , - real_list &_cost , - dual_kind const& // dual costs on CSET - ) - { - real_type _qmin = (real_type)1. ; - - for (auto _next = _cset.head() , - _tend = _cset.tend() ; - _next != _tend; - ++_next ) + class part_sets // mesh parallel decomp. { - real_type _cscr = (real_type)+1. ; - - iptr_type _cell = _next->_cell ; - iptr_type _kind = _next->_kind ; - - switch (_kind) - { - case TRIA3_tag: - { - _cscr = pred_type::tri3_cost ( - &_mesh .node( - _mesh .tri3( - _cell).node(0)).pval(0), - &_mesh .node( - _mesh .tri3( - _cell).node(1)).pval(0), - &_mesh .node( - _mesh .tri3( - _cell).node(2)).pval(0), - typename - pred_type::dual_kind ()) ; - break ; - } - - case QUAD4_tag: - { - _cscr = pred_type::quad_cost ( - &_mesh .node( - _mesh .quad( - _cell).node(0)).pval(0), - &_mesh .node( - _mesh .quad( - _cell).node(1)).pval(0), - &_mesh .node( - _mesh .quad( - _cell).node(2)).pval(0), - &_mesh .node( - _mesh .quad( - _cell).node(3)).pval(0), - typename - pred_type::dual_kind ()) ; - break ; - } - } - - _qmin = - std::min (_qmin, _cscr) ; - - _cost.push_tail (_cscr) ; - } - - return ( _qmin ) ; - } - - /* - -------------------------------------------------------- - * MOVE-NODE: "limited" single node coord. update. - -------------------------------------------------------- - */ - - #include "iter_node_2.inc" - - template < - typename node_iter - > - __static_call - __inline_call void_type move_node ( - geom_type &_geom , - mesh_type &_mesh , - hfun_type &_hfun , - real_list &_hval , - iter_opts &_opts , - node_iter _node , - char_type _kern , - iptr_type &_move , - conn_list &_conn , - real_list &_qold , - real_list &_qnew , - real_type _QMIN , - real_type _QLIM - ) - { - /*---------------- try variational; fallback on dQ/dx */ - real_type _last[geom_dims] = - {(real_type) +0.00}; - - move_kern( _geom, _mesh, _hfun, - _hval, _opts, _node, _last, - _kern, _move, _conn, - _qold, _qnew, - _QMIN, _QLIM) ; // variational - - if (_move >= +0 ) return ; - - move_kern( _geom, _mesh, _hfun, - _hval, _opts, _node, _last, - dqdx_kern, _move, _conn, - _qold, _qnew, - _QMIN, _QLIM) ; // local dQ/dx - - if (_move >= +0 ) return ; - } - - template < - typename node_iter - > - __static_call - __normal_call void_type move_kern ( - geom_type &_geom , - mesh_type &_mesh , - hfun_type &_hfun , - real_list &_hval , - iter_opts &_opts , - node_iter _node , - real_type *_last , - char_type _kern , - iptr_type &_move , - conn_list &_conn , - real_list &_qold , - real_list &_qnew , - real_type _QMIN , - real_type _QLIM - ) - { - /*---------------- optimise single node's coordinates */ - iptr_type static - constexpr _ITER = (iptr_type) +4 ; - - _move = (iptr_type)-1 ; - - /*---------------- calc. line search direction vector */ - real_type _line[geom_dims] = - {(real_type)+0.0} ; - - real_type _save[geom_dims] = - {(real_type)+0.0} ; - - real_type _proj[geom_dims] = - {(real_type)+0.0} ; - - real_type _ladj = (real_type) +0. ; - - if (_kern == _odt_kern) - { - /*--------------------------- ODT-style update vector */ - _odt_move_2 ( - _geom, _mesh, _hfun, _hval, - _conn, _node, - _line, _ladj) ; - } - else - if (_kern == _cvt_kern) - { - /*--------------------------- CVT-style update vector */ - _cvt_move_2 ( - _geom, _mesh, _hfun, _hval, - _conn, _node, - _line, _ladj) ; - } - else - if (_kern == dqdx_kern) - { - if (_QMIN<=_QLIM) - { - /*--------------------------- d./dx Q^T update vector */ - dqdx_move_2 ( - _mesh, _conn, _node, _qold, - _line, _ladj) ; - } - else { return ; } - } - - /*---------------- scale line search direction vector */ - real_type _xeps = // delta_x ~= 0.0 - (real_type)+0.01*_opts.qtol() ; - - real_type _xtol = // delta_x reltol - +std::sqrt(_opts.qtol()) / +10.0 ; - - if (_kern == dqdx_kern) // test cost-only - { - _QLIM = - +std::numeric_limits::infinity() ; - } - - auto _ppos = &_node->pval(0) ; - - real_type _lsqr ; - _lsqr = std::pow(_ladj, 2) ; - _xeps = std::pow(_xeps, 2) ; - _xtol = std::pow(_xtol, 2) ; - - real_type _scal = // overrelaxation - (real_type) std::sqrt( 2.0 ); - - /*---------------- do backtracking line search iter's */ - - if (_kern == dqdx_kern) // "relax" dQ./dx - { - real_type _BIAS = - (real_type) std::sqrt( 0.5 ); - - for (auto _idim = - pred_type::geom_dims; _idim-- != +0; ) - { - _line[_idim] = - (+0. + _BIAS) * _line [_idim] + - (+1. - _BIAS) * _last [_idim] ; - } - } - - for (auto _idim = - pred_type::geom_dims; _idim-- != +0; ) - { - _save[_idim] = _ppos [_idim] ; - _last[_idim] = _line [_idim] ; - } - - for (auto _iter = +0 ; - _iter != _ITER; ++_iter ) - { - /*---------------- push update along search direction */ - for (auto _idim = - pred_type::geom_dims; _idim-- != +0; ) - { - _proj[_idim] = - _save[_idim] + - _scal* _line[_idim] ; - } - - pred_type:: - proj_node (_geom, _save, _proj) ; - - for (auto _idim = - pred_type::geom_dims; _idim-- != +0; ) - { - _ppos[_idim] = _proj[_idim] ; - } - - real_type _XEPS = _xeps * _scal ; - real_type _XTOL = _xtol * _scal ; - - real_type _lmov = - pred_type::length_sq(_save, _proj) ; - - _lmov = _lmov / _lsqr; - - if (_lmov <= _XEPS) break ; - - //_move = +1 ; return ; - - _scal *= (real_type).5 ; - - /*---------------- test quasi-monotonicity w.r.t. Q^T */ - _qnew.set_count(0) ; - - loop_cost( _mesh, _conn, _qnew, - cell_kind ()) ; - - move_okay( _qnew, _qold, _move, - _QLIM, _opts.qtol(), - _lmov, _XTOL ) ; - - if (_move >= +0) break ; - } - - /*---------------- swap with the saved coord. if fail */ - if (_move <= +0) - { - for (auto _idim = - pred_type::geom_dims; _idim-- != +0; ) - { - _ppos[_idim] = _save[_idim] ; - } - } - - } - - /* - -------------------------------------------------------- - * MOVE-DUAL: "limited" single node weight update. - -------------------------------------------------------- - */ - - #include "iter_dual_2.inc" - - template < - typename node_iter - > - __static_call - __normal_call void_type move_dual ( - geom_type &_geom , - mesh_type &_mesh , - hfun_type &_hfun , - real_list &_hval , - iter_opts &_opts , - node_iter _node , - iptr_type &_move , - conn_list &_conn , - real_list &_dold , - real_list &_dnew , - real_type _DMIN , - real_type _DLIM - ) - { - /*---------------- optimise single node's coordinates */ - iptr_type static - constexpr _ITER = (iptr_type) +4 ; - - __unreferenced(_geom); - __unreferenced(_hfun); - __unreferenced(_hval); - - _move = (iptr_type)-1; - - real_type _wadj, _step, _save; - - /*---------------- calc. line search direction vector */ - if (_DMIN <= _DLIM) - { - dqdw_move_2 ( - _mesh, _conn, _node, _dold, - _step, _wadj) ; - } - else { return ; } - - /*---------------- scale line search direction vector */ - real_type _weps = // delta_w ~= 0.0 - (real_type)+0.01*_opts.qtol() ; - - real_type _scal = // overrelaxation - (real_type) std::sqrt( 2.0 ); - - _save = _node->pval( - pred_type::real_dims- 1) ; - - /*---------------- do backtracking line search iter's */ - - for (auto _iter = +0 ; - _iter != _ITER; ++_iter ) - { - _node->pval(real_dims-1) = - _save + ( _scal * _step ) ; - - _node->pval(real_dims-1) = - std::max(-_wadj , - _node->pval(real_dims-1)); - - _node->pval(real_dims-1) = - std::min(+_wadj , - _node->pval(real_dims-1)); - - real_type _wmov = - std::abs (_save - - _node->pval(real_dims-1)); - - if (_wmov <= - _weps * _scal * _wadj) break; - - _scal *= (real_type).5 ; - - /*---------------- test quasi-monotonicity w.r.t. Q^D */ - _dnew.set_count(0) ; - - loop_cost( _mesh, _conn, _dnew, - dual_kind ()) ; - - move_okay( _dnew, _dold, _move, - +1. , _opts.qtol()) ; - - if (_move >= +0) break ; - } - - /*---------------- swap with the saved coord. if fail */ - if (_move <= +0) - { - _node->pval(real_dims-1) = _save ; - } - - } - - /* - -------------------------------------------------------- - * SORT-NODE: permutations for node optimisation. - -------------------------------------------------------- - */ - - __static_call - __normal_call void_type sort_node ( - mesh_type &_mesh , - iptr_list &_nset , - iptr_list &_aset , - iptr_list &_nmrk , - iptr_list &_amrk , - iptr_type _iout , - iptr_type _isub , - iter_opts &_opts - ) - { - # define PUSHSORT(_NODE) \ - if (_amrk[_NODE] != _isub) \ - { \ - _amrk[_NODE] = _isub; \ - _sset.push_tail( \ - cost_pair(_NODE, 1.)) ; \ - } - - # define PUSHCONN(_NODE) \ - if (_amrk[_NODE] != _isub) \ - { \ - _amrk[_NODE] = _isub; \ - _aset.push_tail(_NODE) ; \ - } - - # define PUSHCOST(_NODE , _COST) \ - _qbar[_NODE] += _COST ; \ - _nadj[_NODE] += +1 ;\ - _qmin[_NODE] = \ - std::min (_qmin[_NODE], _COST) ; - - class cost_pair - { - public : - /*------------------------ tuple for node re-ordering */ - iptr_type _node ; - float _cost ; - - /*------------------------ construct inline from src. */ - __inline_call cost_pair ( - iptr_type const&_nsrc , - real_type const&_csrc - ) : - _node (_nsrc), - _cost((float)_csrc) {} - } ; - - class cost_pred - { - public : - /*------------------------ less-than op. for cost-tup */ - __inline_call - bool_type operator () ( - cost_pair const&_idat , - cost_pair const&_jdat - ) const - { return _idat._cost > _jdat._cost ; - } - } ; - - typedef - containers::array cost_list ; - - real_list _qbar, _qmin ; - iptr_list _nadj ; - conn_list _conn ; - cost_list _sset ; - - __unreferenced(_opts) ; - - if (_isub == (iptr_type) +0) - { - /*-------------------- 1ST SUB-ITER: build full init. */ - _qbar.set_count( - _mesh.node().count(), - containers::tight_alloc, +0.0) ; - - _qmin.set_count( - _mesh.node().count(), - containers::tight_alloc, +1.0) ; - - _nadj.set_count( - _mesh.node().count(), - containers::tight_alloc, + 0 ) ; - - for (auto _tria = _mesh.tri3().head() ; - _tria != _mesh.tri3().tend() ; - ++_tria ) - { - if (_tria->mark() >= +0) - { - /*-------------------- calc. min. scores at nodes */ - iptr_type _inod, _jnod, _knod; - _inod = _tria->node( 0); - _jnod = _tria->node( 1); - _knod = _tria->node( 2); - - real_type _cost; - _cost = pred_type::tri3_cost ( - &_mesh .node( - _tria->node(0)).pval(0), - &_mesh .node( - _tria->node(1)).pval(0), - &_mesh .node( - _tria->node(2)).pval(0), - typename - pred_type::cell_kind ()) ; - - PUSHSORT( _inod ) - PUSHCOST( _inod, _cost ) - PUSHSORT( _jnod ) - PUSHCOST( _jnod, _cost ) - PUSHSORT( _knod ) - PUSHCOST( _knod, _cost ) - } - } - - for (auto _quad = _mesh.quad().head() ; - _quad != _mesh.quad().tend() ; - ++_quad ) - { - if (_quad->mark() >= +0) - { - /*-------------------- calc. min. scores at nodes */ - iptr_type _inod, _jnod, _knod, - _lnod; - _inod = _quad->node( 0); - _jnod = _quad->node( 1); - _knod = _quad->node( 2); - _lnod = _quad->node( 3); - - real_type _cost; - _cost = pred_type::quad_cost ( - &_mesh .node( - _quad->node(0)).pval(0), - &_mesh .node( - _quad->node(1)).pval(0), - &_mesh .node( - _quad->node(2)).pval(0), - &_mesh .node( - _quad->node(3)).pval(0), - typename - pred_type::cell_kind ()) ; - - PUSHSORT( _inod ) - PUSHCOST( _inod, _cost ) - PUSHSORT( _jnod ) - PUSHCOST( _jnod, _cost ) - PUSHSORT( _knod ) - PUSHCOST( _knod, _cost ) - PUSHSORT( _lnod ) - PUSHCOST( _lnod, _cost ) - } - } - - for (auto _iter = - _qbar.count(); _iter-- != +0; ) - { - /*------------------------ assign score for each node */ - _qbar[_iter] /= - std::max(+1, _nadj [_iter]) ; - } - - for (auto _iter = _sset.head() ; - _iter != _sset.tend() ; - ++_iter ) - { - _iter->_cost = - (float)_qbar [_iter->_node] - - (float)_qmin [_iter->_node] ; - } - - algorithms::qsort( _sset.head() , - _sset.tend() , - cost_pred () ) ; - - iptr_type _FLAG = _iout - 8 ; // append "recent" - - for (auto _iter = _sset.head() ; - _iter != _sset.tend() ; - ++_iter ) - { - /*------------------------ push sorted wrt. min.-cost */ - if (std::abs( - _nmrk[_iter->_node]) >= _FLAG ) - { - _aset.push_tail( _iter->_node ) ; - } - } - - } - else - { - /*-------------------- NTH sub-iter: init. from prev. */ - for (auto _iter = _nset.head() ; - _iter != _nset.tend() ; - ++_iter ) - { - _amrk[*_iter] = _isub; - _aset.push_tail(*_iter) ; - } - - for (auto _iter = _nset.head() ; - _iter != _nset.tend() ; - ++_iter ) - { - /*-------------------- push any 1-cell neighbours */ - _conn.set_count(0) ; - _mesh.connect_1( - &*_iter, POINT_tag, _conn); - - for (auto _next = _conn.head(); - _next != _conn.tend(); - ++_next ) - { - if (_next->_kind == EDGE2_tag) - { - auto _eptr = - _mesh. edge().head()+_next->_cell ; - - PUSHCONN( _eptr->node(0) ) - PUSHCONN( _eptr->node(1) ) - } - } - - /*-------------------- push any 2-cell neighbours */ - _conn.set_count(0) ; - _mesh.connect_2( - &*_iter, POINT_tag, _conn); - - for (auto _next = _conn.head(); - _next != _conn.tend(); - ++_next ) - { - if (_next->_kind == TRIA3_tag) - { - auto _tptr = - _mesh. tri3().head()+_next->_cell ; - - PUSHCONN( _tptr->node(0) ) - PUSHCONN( _tptr->node(1) ) - PUSHCONN( _tptr->node(2) ) - } - else - if (_next->_kind == QUAD4_tag) - { - auto _qptr = - _mesh. quad().head()+_next->_cell ; - - PUSHCONN( _qptr->node(0) ) - PUSHCONN( _qptr->node(1) ) - PUSHCONN( _qptr->node(2) ) - PUSHCONN( _qptr->node(3) ) - } - } - } - - } - # undef PUSHCOST - # undef PUSHSORT - # undef PUSHCONN - } - - /* - -------------------------------------------------------- - * MOVE-NODE: do a single node smoothing pass. - -------------------------------------------------------- - */ - - __static_call - __normal_call void_type move_node ( - geom_type &_geom , - mesh_type &_mesh , - hfun_type &_hfun , - char_type _kern , - real_list &_hval , - iptr_list &_nset , - iptr_list &_amrk , - mark_list &_mark , - iptr_type _iout , - iptr_type _isub , - iter_opts &_opts , - iptr_type &_nmov , - real_type _QLIM - ) - { - # define MARK(_NODE) _mark._node[_NODE] - - # define HEAD(_PASS)(_PASS == +0 ? \ - _aset.head() : \ - _aset.tail()) - - # define STOP(_PASS)(_PASS == +0 ? \ - _aset.tend() : \ - _aset.hend()) - - # define ITER(_PASS)(_PASS == +0 ? +1 : -1) - - iptr_list _aset; - conn_list _conn; - real_list _qold, _qnew, _dold, _dnew; - - /*-------------------- permute nodes for optimisation */ - sort_node(_mesh, _nset, _aset, - _mark._node, _amrk, _iout, _isub, - _opts) ; - - _nmov = (iptr_type) +0; - - /*-------------------- SYMMETRIC GAUSS-SEIDEL on CELL */ - if (_opts .tria()) - { - for (auto _pass = 0; _pass < 2; ++_pass) - for (auto _apos = HEAD(_pass) ; - _apos != STOP(_pass) ; - _apos += ITER(_pass) ) - { - auto _node = - _mesh.node().head()+ *_apos ; - - /*---------------- assemble a local tria. stencil */ - _conn.set_count( +0) ; - _mesh.connect_2( - &*_apos, POINT_tag, _conn); - - if (_conn.empty()) continue ; - - if (_mark._node[*_apos] >= +0) - { - /*---------------- attempt to optimise CELL geom. */ - _qold.set_count( +0) ; - _qnew.set_count( +0) ; - - real_type _QMIN = - loop_cost( _mesh, - _conn, _qold, cell_kind()); - - iptr_type _move = -1 ; - - if(_move < +0) - { - /*---------------- do optimisation of node coord. */ - move_node( _geom, _mesh, - _hfun, _hval, - _opts, _node, _kern, - _move, _conn, - _qold, _qnew, - _QMIN, _QLIM ) ; - } - - if (_move > +0) - { - /*---------------- update when state is improving */ - _hval[*_apos] = (real_type)-1; - - if (std::abs( - MARK( *_apos )) != _iout) - { - if (MARK( *_apos ) >= 0) - MARK( *_apos ) = +_iout; - else - MARK( *_apos ) = -_iout; - - _nset.push_tail (*_apos) ; - } - - _nmov += +1 ; - } - } - } - } - # undef MARK - # undef HEAD - # undef STOP - # undef ITER - } - - /* - -------------------------------------------------------- - * MOVE-DUAL: do a single dual smoothing pass. - -------------------------------------------------------- - */ - - __static_call - __normal_call void_type move_dual ( - geom_type &_geom , - mesh_type &_mesh , - hfun_type &_hfun , - real_list &_hval , - iptr_list &_nset , - iptr_list &_amrk , - mark_list &_mark , - iptr_type _iout , - iptr_type _isub , - iter_opts &_opts , - iptr_type &_nmov , - real_type _DLIM - ) - { - # define MARK(_NODE) _mark._node[_NODE] - - # define HEAD(_PASS)(_PASS == +0 ? \ - _aset.head() : \ - _aset.tail()) - - # define STOP(_PASS)(_PASS == +0 ? \ - _aset.tend() : \ - _aset.hend()) - - # define ITER(_PASS)(_PASS == +0 ? +1 : -1) - - iptr_list _aset; - conn_list _conn; - real_list _qold, _qnew, _dold, _dnew; - - /*-------------------- permute nodes for optimisation */ - sort_node(_mesh, _nset, _aset, - _mark._node, _amrk, _iout, _isub, - _opts) ; - - _nmov = (iptr_type) +0; - - /*-------------------- SYMMETRIC GAUSS-SEIDEL on DUAL */ - if (_opts .dual()) - { - for (auto _pass = 0; _pass < 2; ++_pass) - for (auto _apos = HEAD(_pass) ; - _apos != STOP(_pass) ; - _apos += ITER(_pass) ) - { - auto _node = - _mesh.node().head()+ *_apos ; - - /*---------------- assemble a local tria. stencil */ - _conn.set_count( +0) ; - _mesh.connect_2( - &*_apos, POINT_tag, _conn); - - if (_conn.empty()) continue ; - - /*---------------- attempt to optimise DUAL geom. */ - _dold.set_count( +0) ; - _dnew.set_count( +0) ; - - real_type _DMIN = - loop_cost( _mesh, - _conn, _dold, dual_kind()); - - iptr_type _move = -1 ; - - if(_move < +0) - { - /*---------------- do optimisation of node weight */ - move_dual( _geom, _mesh, - _hfun, _hval, - _opts, _node, - _move, _conn, - _dold, _dnew, - _DMIN, _DLIM ) ; - } - - if (_move > +0) - { - /*---------------- update when state is improving */ - if (std::abs( - MARK( *_apos )) != _iout) - { - if (MARK( *_apos ) >= 0) - MARK( *_apos ) = +_iout; - else - MARK( *_apos ) = -_iout; - - _nset.push_tail (*_apos) ; - } - - _nmov += +1 ; - } - } - } - # undef MARK - # undef HEAD - # undef STOP - # undef ITER - } - - /* - -------------------------------------------------------- - * FLIP-MESH: "flip" mesh topology. - -------------------------------------------------------- - */ - - #include "iter_flip_2.inc" - - __static_call - __normal_call void_type flip_mesh ( - geom_type &_geom , - mesh_type &_mesh , - hfun_type &_hfun , - iptr_list &_nset , - mark_list &_mark , - iptr_type _imrk , - iptr_type &_nflp - ) - { - # define MARKTRI3(_CELL) \ - _mark._tri3[_CELL->_cell] - - # define MARKQUAD(_CELL) \ - _mark._quad[_CELL->_cell] - - init_mark(_mesh, _mark , - std::max(+0, _imrk - 1) ) ; - - __unreferenced ( _hfun); - - /*--------------------- init. flip stack as ADJ(NSET) */ - conn_list _flip, _next ; - conn_list _conn, _CONN ; - real_list _qold, _qnew ; + public : + uint_list _lptr; + iptr_list _list; + iptr_list _part; + iptr_list _seqs; + } ; - for (auto _iter = _nset.head(); - _iter != _nset.tend(); - ++_iter ) + class part_data { - if (_mesh.node(*_iter).mark() >= +0) - { - _conn.set_count(0); - _mesh.connect_2( - &*_iter, POINT_tag, _conn); - - for (auto _cell = _conn.head(); - _cell != _conn.tend(); - ++_cell ) - { - if (_cell->_kind == TRIA3_tag) - { - if (MARKTRI3( _cell ) != _imrk) - { - MARKTRI3( _cell ) = _imrk; - _flip.push_tail(*_cell) ; - } - } - else - if (_cell->_kind == QUAD4_tag) - { - if (MARKQUAD( _cell ) != _imrk) - { - MARKQUAD( _cell ) = _imrk; - _flip.push_tail(*_cell) ; - } - } - } - } - } + public : + part_sets _full; + part_sets _bnds; + } ; - /*--------------------- exhaustive, incremental flips */ - _nflp = +0 ; + typedef typename + mesh_type::connector conn_list ; - for ( ; !_flip.empty() ; ) + class conn_sets // cache neighbourhoods { - for (auto _cell = _flip.head(); - _cell != _flip.tend(); - ++_cell ) - { - if (_cell->_kind == TRIA3_tag) - { - if ( _mesh. - tri3(_cell->_cell).mark() >= +0) - { - bool_type _okay = false ; + public : + conn_list _adj1; + uint_list _idx1; + conn_list _adj2; + uint_list _idx2; + } ; - flip_tri3( _geom, _mesh, - _cell->_cell, - _okay, _conn, _CONN, - _qold, _qnew ); + public : - if (_okay) _nflp += +1 ; + /* + -------------------------------------------------------- + * FLIP-SIGN: flip cells for +ve iter. cost fn. + -------------------------------------------------------- + */ - for (auto _iter = _CONN.head(); - _iter != _CONN.tend(); - ++_iter ) - { - _next. push_tail(*_iter) ; - } - } - } - else - if (_cell->_kind == QUAD4_tag) - { - if ( _mesh. - quad(_cell->_cell).mark() >= +0) - { - bool_type _okay = false ; + #include "_bfs_mesh_2.inc" - //flip_quad( _geom, _mesh, - // _cell->_cell, - // _okay, _conn, _CONN, - // _qold, _qnew ); - if (_okay) _nflp += +1 ; + /* + -------------------------------------------------------- + * COST-MESH: 1-neighbourhood cost vector util. + -------------------------------------------------------- + */ - for (auto _iter = _CONN.head(); - _iter != _CONN.tend(); - ++_iter ) - { - _next. push_tail(*_iter) ; - } - } - } - } - _flip = std::move (_next) ; - } + #include "cost_mesh_2.inc" - # undef MARKQUAD - # undef MARKTRI3 - } /* -------------------------------------------------------- - * _ZIP-MESH: edge merge/split operations. + * PART-MESH: paritions for parallel decomposition. -------------------------------------------------------- */ - #include "iter_zips_2.inc" - #include "iter_divs_2.inc" - - __static_call - __normal_call void_type _zip_mesh ( - geom_type &_geom , - mesh_type &_mesh , - hfun_type &_hfun , - char_type _kern , - real_list &_hval , - iptr_list &_nset , - mark_list &_mark , - iptr_type _imrk , - iter_opts &_opts , - real_type _QLIM , - real_type _DLIM , - iptr_type &_nzip , - iptr_type &_ndiv - ) - { - class sort_pair - { - public : - /*------------------------ tuple for edge re-ordering */ - iptr_type _inod ; - iptr_type _jnod ; - float _cost ; - public : - __inline_call sort_pair ( - iptr_type _isrc , - iptr_type _jsrc , - float _csrc - ) : _inod(_isrc), _jnod(_jsrc), - _cost(_csrc) {} - } ; - class sort_less - { - public : - /*------------------------ less-than op. for cost-tup */ - __inline_call - bool_type operator () ( - sort_pair const&_idat , - sort_pair const&_jdat - ) const - { return _idat._cost < _jdat._cost; - } - } ; - - # define MARKNODE(_NODE) _mark._node[_NODE] - - # define PUSHMARK \ - init_mark( _mesh, _mark, \ - std::max(_imrk - 1, +0)); \ - if (std::abs( \ - _mark._node[_nnew])!= _imrk+1) \ - { \ - if (_mark._node[_nnew] >= +0) \ - { \ - _mark._node[_nnew] = +_imrk+1; \ - } \ - else \ - { \ - _mark._node[_nnew] = -_imrk-1; \ - } \ - _nset.push_tail(_nnew) ; \ - } \ - - /*------------------------ add/pop nodes to fix topo. */ - typedef containers:: - array sort_list ; - - __unreferenced ( _DLIM ); - - sort_list _sort ; - conn_list _aset , _bset, _cset ; - conn_list _conn , _iset, _jset ; - real_list _qold , _qnew, _qtmp ; - - _nzip = +0 ; _ndiv = +0 ; - - // assemble list of edges attached to "recent" nodes - - for (auto _iter = _mesh.edge().head() ; - _iter != _mesh.edge().tend() ; - ++_iter ) - { - auto _inod = _iter->node(0) ; - auto _jnod = _iter->node(1) ; - - auto _iptr = _mesh. - node().head()+_iter->node(0) ; - auto _jptr = _mesh. - node().head()+_iter->node(1) ; - - if (_iter->mark() >= +0 && - ( std::abs ( - _mark._node[_inod]) > _imrk - 4 || - std::abs ( - _mark._node[_jnod]) > _imrk - 4 )) - { - float _lsqr = - (float)pred_type::length_sq ( - & _iptr->pval(0) , - & _jptr->pval(0) ) ; - - _iset.set_count( - 0, containers::loose_alloc); - _jset.set_count( - 0, containers::loose_alloc); - - _mesh.connect_2(_iter->node(0) , - POINT_tag , _iset) ; - _mesh.connect_2(_iter->node(1) , - POINT_tag , _jset) ; - - _lsqr *= (_iset.count() + - _jset.count() ) / 2 ; - - _sort.push_tail( - sort_pair(_inod, _jnod, _lsqr)) ; - } - } - - if (_sort.empty()) return ; + #include "part_mesh_2.inc" - algorithms::qsort( // sort edge list by lsqr - _sort.head() , - _sort.tend() , sort_less()); - // scan edges longest-to-shortest and try to div any - // unvisited edges + /* + -------------------------------------------------------- + * SORT-MESH: greedy ordering for optimisation ops. + -------------------------------------------------------- + */ - for (auto _iter = _sort.tail(); - _iter != _sort.hend(); - --_iter ) - { - /*--------------------------- try to "div" local edge */ - iptr_type _eadj, _enod[2] ; - _enod[0] = _iter->_inod; - _enod[1] = _iter->_jnod; + #include "sort_mesh_2.inc" - if (MARKNODE(_enod[0]) < +0 && - MARKNODE(_enod[1]) < +0 ) continue ; - if(!_mesh.find_edge( - _enod, _eadj) ) continue ; + /* + -------------------------------------------------------- + * MOVE-MESH: do single cell/dual smoothing passes. + -------------------------------------------------------- + */ - if (_opts.div_()) - { - /*--------------------------- "div" for topo. + score */ - iptr_type _nnew = -1; - - bool_type _move; - _div_edge( _geom, _mesh, - _hfun, _hval, _opts, - _imrk, _eadj, - _kern, _move, _nnew, - _iset, _jset, - _aset, _bset, - _qold, _qnew, - _qtmp, _QLIM) ; - - if (_move) - { - PUSHMARK; _ndiv += +1; - } - } - } + #include "move_mesh_2.inc" - // scan edges shortest-to-longest and try to zip any - // unvisited edges - for (auto _iter = _sort.head(); - _iter != _sort.tend(); - ++_iter ) - { - /*--------------------------- try to "zip" local edge */ - iptr_type _eadj, _enod[2] ; - _enod[0] = _iter->_inod; - _enod[1] = _iter->_jnod; + /* + -------------------------------------------------------- + * FLIP-MESH: "flip" mesh topology until Delaunay. + -------------------------------------------------------- + */ - if (MARKNODE(_enod[0]) < +0 || - MARKNODE(_enod[1]) < +0 ) continue ; + #include "flip_mesh_2.inc" - if(!_mesh.find_edge( - _enod, _eadj) ) continue ; - if (_opts.zip_()) - { - /*--------------------------- "zip" for topo. + score */ - iptr_type _nnew = -1; - - bool_type _move; - _zip_edge( _geom, _mesh, - _hfun, _hval, _opts, - _eadj, - _kern, _move, _nnew, - _iset, _jset, - _aset, _bset, _cset, - _qold, _qnew, - _qtmp, _QLIM) ; - - if (_move) - { - PUSHMARK; _nzip += +1; - } - } - } + /* + -------------------------------------------------------- + * _ZIP-MESH: merge/split operations on cells. + -------------------------------------------------------- + */ - for (auto _iter = _mark._node.head() ; - _iter != _mark._node.tend() ; - ++_iter ) - { - /*--------------------- undo local inc. on node flags */ - if (*_iter > + _imrk) - *_iter = + _imrk; - else - if (*_iter < - _imrk) - *_iter = - _imrk; - } + #include "_zip_mesh_2.inc" - # undef PUSHMARK - # undef MARKNODE - } /*------------------------------ helper: init. marker */ @@ -1815,58 +272,16 @@ containers::loose_alloc, _flag) ; } - /* - -------------------------------------------------------- - * ITER-MESH: "hill-climbing" type mesh optimisation. - -------------------------------------------------------- - */ + /*------------------------------ helper: init. bounds */ - template < - typename text_dump - > __static_call - __normal_call void_type iter_mesh ( - geom_type &_geom , - hfun_type &_hfun , + __normal_call void_type init_bnds ( mesh_type &_mesh , - char_type _kern , - iter_opts &_opts , - text_dump &_dump + mark_list &_mark ) { - iter_stat _tcpu ; - - /*------------------------------ push log-file header */ - if (_opts.verb() >= 0 ) - { - _dump.push( - "#------------------------------------------------------------\n" - "# |MOVE.| |FLIP.| |MERGE| |SPLIT| \n" - "#------------------------------------------------------------\n" - ) ; - } - - # ifdef __use_timers - typename std ::chrono:: - high_resolution_clock::time_point _ttic ; - typename std ::chrono:: - high_resolution_clock::time_point _ttoc ; - typename std ::chrono:: - high_resolution_clock _time ; - - __unreferenced(_time) ; // why does MSVC need this?? - # endif//__use_timers - - /*------------------------------ ensure deterministic */ - std::srand( +1 ) ; - - /*------------------------------ push boundary marker */ - iptr_list _nset ; + /*------------------------------ mark bnd. item <= -1 */ conn_list _conn ; - mark_list _mark ; - - init_mark(_mesh, _mark) ; - iptr_type _nnN1 = +0 ; for (auto _node = _mesh.node().head() ; _node != _mesh.node().tend() ; @@ -1913,24 +328,34 @@ } } } + } - flip_sign(_mesh) ; - - /*------------------------------ do optimisation loop */ - bool_type - static constexpr ITER_FLIP = true; + /*------------------------------ helper: init. scores */ - iptr_type - static constexpr ITER_MIN_ = +1 ; - iptr_type - static constexpr ITER_MAX_ = +8 ; + __static_call + __normal_call real_type init_cost ( + mesh_type &_mesh, + iter_opts &_opts + ) + { + # ifdef __use_openmp + omp_set_num_threads(_opts.nprt()) ; + # endif//__use_openmp - real_type _QMIN = (real_type) +1.; + real_type _QMIN = (real_type) +1. ; - for (auto _cell = _mesh.tri3().head() ; - _cell != _mesh.tri3().tend() ; - ++_cell ) + # pragma omp parallel default(none) \ + shared(_mesh, _opts, _QMIN) + { + real_type _qmin = (real_type) +1. ; + # pragma omp for nowait schedule(static) + for (auto _cpos = +0u ; + _cpos < _mesh.tri3().count() ; + ++_cpos ) { + auto _cell = + _mesh. tri3().head() + _cpos ; + if (_cell->mark() >= +0 ) { /*--------------------- test initial cell quality */ @@ -1945,16 +370,20 @@ typename pred_type::cell_kind ()) ; - _QMIN = std::min (_QMIN, _cost) ; - _QMIN = std::max (_QMIN, + _qmin = std::min (_qmin, _cost) ; + _qmin = std::max (_qmin, _opts.qlim()) ; } } - for (auto _cell = _mesh.quad().head() ; - _cell != _mesh.quad().tend() ; - ++_cell ) + # pragma omp for nowait schedule(static) + for (auto _cpos = +0u ; + _cpos < _mesh.quad().count() ; + ++_cpos ) { + auto _cell = + _mesh. quad().head() + _cpos ; + if (_cell->mark() >= +0 ) { /*--------------------- test initial cell quality */ @@ -1971,54 +400,140 @@ typename pred_type::cell_kind ()) ; - _QMIN = std::min (_QMIN, _cost) ; - _QMIN = std::max (_QMIN, + _qmin = std::min (_qmin, _cost) ; + _qmin = std::max (_qmin, _opts.qlim()) ; } } - for (auto _iter = +1 ; - _iter <= _opts.iter(); ++_iter) + # ifdef __use_openmp + auto _nprt = omp_get_num_threads(); + + # pragma omp for ordered schedule(static,1) + for (auto _rank = 0 ; _rank <_nprt; + ++_rank ) { - /*------------------------------ set-up current iter. */ - init_mark(_mesh, _mark, - std::max(_iter-1, +0)) ; + # pragma omp ordered + { + _QMIN = std::min (_QMIN, _qmin) ; + } + } + # endif//__use_openmp + } + + return _QMIN ; + } + + /* + -------------------------------------------------------- + * ITER-MESH: "hill-climbing" type mesh optimisation. + -------------------------------------------------------- + */ + + template < + typename text_dump + > + __static_call + __normal_call void_type iter_mesh ( + geom_type &_geom , // geometry object + hfun_type &_hfun , // spacing object + mesh_type &_mesh , // mesh object + kern_kind _kern , // optim. kernel selector + iter_opts &_opts , // user options + text_dump &_dump // log-file object + ) + { + iter_stat _tcpu ; + + /*------------------------------ push log-file header */ + if (_opts.verb() >= 0 ) + { + _dump.push( + "#------------------------------------------------------------\n" + "# |MOVE.| |FLIP.| |MERGE| |SPLIT| \n" + "#------------------------------------------------------------\n" + ) ; + } + + # ifdef __use_timers + typename std ::chrono:: + high_resolution_clock::time_point _ttic ; + typename std ::chrono:: + high_resolution_clock::time_point _ttoc ; + typename std ::chrono:: + high_resolution_clock _time ; + + __unreferenced(_time) ; // why does MSVC need this?? + # endif//__use_timers + + /*------------------------------ ensure deterministic */ + std::srand( +1 ) ; + + /*------------------------------ push boundary marker */ + iptr_list _nset ; + mark_list _mark ; + + init_mark(_mesh, _mark) ; + init_bnds(_mesh, _mark) ; + + flip_sign(_mesh); + + /*------------------------------ do optimisation loop */ + bool_type + static constexpr ITER_FLIP = true; + + iptr_type + static constexpr ITER_MIN_ = min_subit ; + iptr_type + static constexpr ITER_MAX_ = max_subit ; - real_list _hval; - _hval.set_count( - _mesh. node().count(), - containers::tight_alloc, (real_type)-1.); + real_type _QMIN = init_cost (_mesh, _opts) ; + real_type _QMOV = +0. ; + real_type _DMOV = +0. ; - iptr_list _amrk; - _amrk.set_count( - _mesh. node().count(), - containers::tight_alloc, (iptr_type)-1 ); + real_list _hval ; // cache h(x) node val. + _hval.set_count( + _mesh. node().count(), + containers::loose_alloc, (real_type) -1.0) ; + + for (auto _iter = +1; + _iter <= _opts.iter(); ++_iter) + { + /*------------------------------ set-up current iter. */ + init_mark(_mesh , + _mark,std::max(_iter - 1, +0)) ; _nset.set_count( +0); - iptr_type _nmov = +0 ; - iptr_type _nflp = +0 ; - iptr_type _nzip = +0 ; - iptr_type _ndiv = +0 ; + size_t _nmov = +0 ; + size_t _nflp = +0 ; + size_t _nzip = +0 ; + size_t _ndiv = +0 ; - /*------------------------------ scale quality thresh */ - iptr_type _nsub = _iter +0 ; + /*------------------------------ scale quality limits */ + iptr_type _nsub = _iter +1 ; _nsub = std::min(ITER_MAX_, _nsub) ; _nsub = std::max(ITER_MIN_, _nsub) ; - real_type _QLIM = - (real_type)+.750 * _QMIN + - (real_type)+.075 * _iter ; - - _QLIM = std::min( - _opts.qlim(), _QLIM); + real_type _RMIN = _QMIN * + (real_type)(0.90 + 1./20 * (_iter - 1)) ; + real_type _RMAX = _QMIN * + (real_type)(0.90 + 1./30 * (_iter - 1)) ; real_type _DLIM = - (real_type)(1. - - .5 * std::pow(1.0-_QLIM, +2)) ; + (real_type)+1.-_opts.qtol() ; + + _DMOV = std::max(_DMOV, _DLIM) ; + _DMOV = std::min(_DMOV, _RMAX) ; + + real_type _QLIM = std::min ( + _opts.qlim(),_RMIN) ; + + _QMOV = std::max(_QMOV, _QLIM) ; + _QMOV = std::min(_QMOV, _RMAX) ; /*------------------------------ 1. CELL GEOM. PASSES */ @@ -2029,30 +544,41 @@ _ttic = _time.now() ; # endif//__use_timers - for (auto _isub = + 0 ; - _isub != _nsub/1; ++_isub ) + line_data _zero ; + _zero.fill((real_type) +0.) ; + + line_list _last ; // for momentum updates + _last.set_count( + _mesh.node().count() , + containers::tight_alloc, _zero) ; + + iptr_list _aset ; + _aset.set_alloc( // set of "active" node + _mesh.node().count()); + + part_data _part ; + conn_sets _conn ; + for (auto _isub = 0; _isub != _nsub; ++_isub) { if (_opts.verb() >= +3) _dump.push( "**CALL MOVE-NODE...\n" ) ; - iptr_type _nloc; - move_node( _geom, _mesh , - _hfun, _kern, _hval , - _nset, _amrk, _mark , - _iter, _isub, - _opts, _nloc, _QLIM ) ; - - _nloc = _nloc / 2 ; - - _nmov = std::max (_nmov , - _nloc ) ; + move_node( _geom, _mesh , _conn , + _hfun, _kern, _hval , _last , + _nset, _aset, _mark , + _part, _iter, _isub , + _opts, + _QLIM, _QMOV, _DLIM , _DMOV , + _tcpu) ; } + _nmov = _nset.count() ; + # ifdef __use_timers _ttoc = _time.now() ; _tcpu._move_node += - _tcpu.time_span(_ttic, _ttoc); + _tcpu.time_span(_ttic , _ttoc); # endif//__use_timers /*------------------------------ update mesh topology */ @@ -2066,10 +592,10 @@ _dump.push( "**CALL FLIP-MESH...\n" ) ; - iptr_type _nloc; - flip_mesh( _geom, _mesh , - _hfun, _nset, _mark , - +3 * _iter - 2 , _nloc ) ; + size_t _nloc; + flip_mesh( _geom, _mesh , _hfun , + _conn, _nset, _mark , + +3 * _iter - 2 , _nloc , _tcpu); _nflp += _nloc; } @@ -2077,7 +603,7 @@ # ifdef __use_timers _ttoc = _time.now() ; _tcpu._topo_flip += - _tcpu.time_span(_ttic, _ttoc); + _tcpu.time_span(_ttic , _ttoc); # endif//__use_timers } @@ -2090,32 +616,40 @@ _ttic = _time.now() ; # endif//__use_timers - _amrk.fill( -1 ); + real_list _last ; // for momentum updates + _last.set_count( + _mesh.node().count() , + containers::tight_alloc, +0. ) ; - for (auto _isub = + 0 ; - _isub != _nsub/2; ++_isub ) + iptr_list _aset ; + _aset.set_alloc( // set of "active" node + _mesh.node().count()); + + _nsub = std::max(_nsub/2, +1) ; + + part_data _part ; + conn_sets _conn ; + for (auto _isub = 0; _isub != _nsub; ++_isub) { if (_opts.verb() >= +3) _dump.push( "**CALL MOVE-DUAL...\n" ) ; - iptr_type _nloc; - move_dual( _geom, _mesh , - _hfun, _hval, - _nset, _amrk, _mark , - _iter, _isub, - _opts, _nloc, _DLIM ) ; - - _nloc = _nloc / 2 ; - - _nmov = std::max (_nmov , - _nloc ) ; + move_dual( _geom, _mesh , _conn , + _hfun, _hval, _last , + _nset, _aset, _mark , + _part, _iter, _isub , + _opts, + _QLIM, _QMOV, _DLIM , _DMOV , + _tcpu) ; } + _nmov = _nset.count() ; + # ifdef __use_timers _ttoc = _time.now() ; _tcpu._move_dual += - _tcpu.time_span(_ttic, _ttoc); + _tcpu.time_span(_ttic , _ttoc); # endif//__use_timers /*------------------------------ update mesh topology */ @@ -2129,10 +663,10 @@ _dump.push( "**CALL FLIP-MESH...\n" ) ; - iptr_type _nloc; - flip_mesh( _geom, _mesh , - _hfun, _nset, _mark , - +3 * _iter - 1 , _nloc ) ; + size_t _nloc; + flip_mesh( _geom, _mesh , _hfun , + _conn, _nset, _mark , + +3 * _iter - 1 , _nloc , _tcpu); _nflp += _nloc; } @@ -2140,19 +674,22 @@ # ifdef __use_timers _ttoc = _time.now() ; _tcpu._topo_flip += - _tcpu.time_span(_ttic, _ttoc); + _tcpu.time_span(_ttic , _ttoc); # endif//__use_timers + } /*------------------------------ 3. ZIP + DIV SUBFACE */ + if (_iter < _opts.iter()) + { + /*------------------------------ change mesh topology */ # ifdef __use_timers _ttic = _time.now() ; # endif//__use_timers _nset.set_count(+0) ; // don't flip twice! - if (_iter < _opts.iter()) if (_opts.zip_ () || _opts.div_ () ) { @@ -2160,21 +697,21 @@ _dump.push( "**CALL _ZIP-MESH...\n" ) ; - _zip_mesh( _geom, _mesh , - _hfun, _kern, - _hval, _nset, + _zip_mesh( _geom, _mesh , _hfun , + _kern, _hval, _nset , _mark, _iter, _opts , _QLIM, _DLIM, - _nzip, _ndiv) ; + _nzip, _ndiv, _tcpu ) ; } # ifdef __use_timers _ttoc = _time.now() ; _tcpu._topo_zips += - _tcpu.time_span(_ttic, _ttoc); + _tcpu.time_span(_ttic , _ttoc); # endif//__use_timers /*------------------------------ update mesh topology */ + # ifdef __use_timers _ttic = _time.now() ; # endif//__use_timers @@ -2185,10 +722,10 @@ _dump.push( "**CALL FLIP-MESH...\n" ) ; - iptr_type _nloc; - flip_mesh( _geom, _mesh , - _hfun, _nset, _mark , - +3 * _iter - 0 , _nloc ) ; + size_t _nloc; + flip_mesh( _geom, _mesh , _hfun , + _nset, _mark, + +3 * _iter - 0 , _nloc , _tcpu); _nflp += _nloc; } @@ -2196,9 +733,11 @@ # ifdef __use_timers _ttoc = _time.now() ; _tcpu._topo_flip += - _tcpu.time_span(_ttic, _ttoc); + _tcpu.time_span(_ttic , _ttoc); # endif//__use_timers + } // if (_iter < _opts.iter()) + /*------------------------------ dump optim. progress */ if (_opts.verb() >= 0) { @@ -2212,6 +751,14 @@ } /*------------------------------ has iter. converged? */ + _QMOV = std::max(_QLIM, 1. - + ((real_type) _nmov) / + _mesh.node().count()) ; + + _DMOV = std::max(_DLIM, 1. - + ((real_type) _nmov) / + _mesh.node().count()) ; + // if (_nset.count() == 0) break ; if (_nmov == +0 && _nzip == +0 && @@ -2223,29 +770,124 @@ { /*------------------------------ print method metrics */ _dump.push("\n"); - - _dump.push("**FUNCTION timing: ") ; - _dump.push("\n"); + _dump.push("**TIMING statistics...\n") ; _dump.push(" MOVE-NODE: "); _dump.push( std::to_string(_tcpu._move_node)) ; _dump.push("\n"); + _dump.push(" *init-node: "); + _dump.push( + std::to_string(_tcpu._init_node)) ; + _dump.push("\n"); + _dump.push(" *part-node: "); + _dump.push( + std::to_string(_tcpu._part_node)) ; + _dump.push("\n"); + _dump.push(" *core-node: "); + _dump.push( + std::to_string(_tcpu._core_node)) ; + _dump.push("\n"); + _dump.push(" *seqs-node: "); + _dump.push( + std::to_string(_tcpu._seqs_node)) ; + _dump.push("\n"); + _dump.push(" *para-node: "); + _dump.push( + std::to_string(_tcpu._para_node)) ; + // _dump.push("\n"); + // _dump.push(" *xDIR-node: "); + // _dump.push( + // std::to_string(_tcpu._ldir_node)) ; + // _dump.push("\n"); + // _dump.push(" *xOPT-node: "); + // _dump.push( + // std::to_string(_tcpu._lopt_node)) ; + _dump.push("\n\n"); _dump.push(" MOVE-DUAL: "); _dump.push( std::to_string(_tcpu._move_dual)) ; _dump.push("\n"); + _dump.push(" *init-dual: "); + _dump.push( + std::to_string(_tcpu._init_dual)) ; + _dump.push("\n"); + _dump.push(" *part-dual: "); + _dump.push( + std::to_string(_tcpu._part_dual)) ; + _dump.push("\n"); + _dump.push(" *core-dual: "); + _dump.push( + std::to_string(_tcpu._core_dual)) ; + _dump.push("\n"); + _dump.push(" *seqs-dual: "); + _dump.push( + std::to_string(_tcpu._seqs_dual)) ; + _dump.push("\n"); + _dump.push(" *para-dual: "); + _dump.push( + std::to_string(_tcpu._para_dual)) ; + // _dump.push("\n"); + // _dump.push(" *xDIR-dual: "); + // _dump.push( + // std::to_string(_tcpu._ldir_dual)) ; + // _dump.push("\n"); + // _dump.push(" *xOPT-dual: "); + // _dump.push( + // std::to_string(_tcpu._lopt_dual)) ; + _dump.push("\n\n"); _dump.push(" TOPO-FLIP: "); _dump.push( std::to_string(_tcpu._topo_flip)) ; _dump.push("\n"); + _dump.push(" *init-flip: "); + _dump.push( + std::to_string(_tcpu._init_flip)) ; + _dump.push("\n"); + _dump.push(" *core-flip: "); + _dump.push( + std::to_string(_tcpu._core_flip)) ; + _dump.push("\n\n"); _dump.push(" TOPO-ZIPS: "); _dump.push( std::to_string(_tcpu._topo_zips)) ; _dump.push("\n"); + _dump.push(" *init-zips: "); + _dump.push( + std::to_string(_tcpu._init_zips)) ; + _dump.push("\n"); + _dump.push(" *core-divs: "); + _dump.push( + std::to_string(_tcpu._core_divs)) ; + _dump.push("\n"); + _dump.push(" *core-zips: "); + _dump.push( + std::to_string(_tcpu._core_zips)) ; + _dump.push("\n\n"); + + _dump.push(" PARTITION: "); + _dump.push( + std::to_string(_tcpu._full_part)) ; + _dump.push("\n"); + _dump.push(" *tree-part: "); + _dump.push( + std::to_string(_tcpu._tree_part)) ; + // _dump.push("\n"); + // _dump.push(" *redo-part: "); + // _dump.push( + // std::to_string(_tcpu._redo_part)) ; + _dump.push("\n"); + _dump.push(" *part-part: "); + _dump.push( + std::to_string(_tcpu._part_part)) ; + _dump.push("\n"); + _dump.push(" *seqs-part: "); + _dump.push( + std::to_string(_tcpu._seqs_part)) ; + _dump.push("\n"); _dump.push("\n"); } diff --git a/external/jigsaw/src/libcpp/iter_mesh/iter_mesh_3.hpp b/external/jigsaw/src/libcpp/iter_mesh/iter_mesh_3.hpp index 6db6b79..ff77988 100644 --- a/external/jigsaw/src/libcpp/iter_mesh/iter_mesh_3.hpp +++ b/external/jigsaw/src/libcpp/iter_mesh/iter_mesh_3.hpp @@ -22,16 +22,20 @@ * how they can obtain it for free, then you are not * required to make any arrangement with me.) * - * Disclaimer: Neither I nor: Columbia University, The - * Massachusetts Institute of Technology, The - * University of Sydney, nor The National Aeronautics - * and Space Administration warrant this code in any - * way whatsoever. This code is provided "as-is" to be - * used at your own risk. + * Disclaimer: Neither I nor THE CONTRIBUTORS warrant + * this code in any way whatsoever. This code is + * provided "as-is" to be used at your own risk. + * + * THE CONTRIBUTORS include: + * (a) The University of Sydney + * (b) The Massachusetts Institute of Technology + * (c) Columbia University + * (d) The National Aeronautics & Space Administration + * (e) Los Alamos National Laboratory * -------------------------------------------------------- * - * Last updated: 9 August, 2018 + * Last updated: 9 Aug., 2018 * * Copyright 2013-2018 * Darren Engwirda diff --git a/external/jigsaw/src/libcpp/iter_mesh/iter_mesh_euclidean_2.hpp b/external/jigsaw/src/libcpp/iter_mesh/iter_mesh_euclidean_2.hpp index 4460c3e..d70b6f2 100644 --- a/external/jigsaw/src/libcpp/iter_mesh/iter_mesh_euclidean_2.hpp +++ b/external/jigsaw/src/libcpp/iter_mesh/iter_mesh_euclidean_2.hpp @@ -22,16 +22,20 @@ * how they can obtain it for free, then you are not * required to make any arrangement with me.) * - * Disclaimer: Neither I nor: Columbia University, The - * Massachusetts Institute of Technology, The - * University of Sydney, nor The National Aeronautics - * and Space Administration warrant this code in any - * way whatsoever. This code is provided "as-is" to be - * used at your own risk. + * Disclaimer: Neither I nor THE CONTRIBUTORS warrant + * this code in any way whatsoever. This code is + * provided "as-is" to be used at your own risk. + * + * THE CONTRIBUTORS include: + * (a) The University of Sydney + * (b) The Massachusetts Institute of Technology + * (c) Columbia University + * (d) The National Aeronautics & Space Administration + * (e) Los Alamos National Laboratory * -------------------------------------------------------- * - * Last updated: 24 Feb., 2021 + * Last updated: 15 Jul., 2021 * * Copyright 2013-2021 * Darren Engwirda @@ -125,7 +129,7 @@ /*------------------------- edge type for ITER-MESH-2 */ public : - iptr_type _itag ; + iptr_type _itag = 0 ; public : @@ -144,7 +148,7 @@ /*------------------------- face type for ITER-MESH-2 */ public : - iptr_type _itag ; + iptr_type _itag = 0 ; public : @@ -163,7 +167,7 @@ /*------------------------- face type for ITER-MESH-2 */ public : - iptr_type _itag ; + iptr_type _itag = 0 ; public : @@ -187,6 +191,33 @@ mesh_type _mesh ; + public : + + /* + -------------------------------------------------------- + * INIT-MESH: impose (optional) offsets + -------------------------------------------------------- + */ + + __normal_call void_type init ( + float _xoff = + 0.f , + float _yoff = + 0.f + ) + { + for (auto _iter = + this->_mesh.node().head () ; + _iter != + this->_mesh.node().tend () ; + ++_iter ) + { + if (_iter->mark() >= +0) + { + _iter->pval(0) -= _xoff ; + _iter->pval(1) -= _yoff ; + } + } + } + } ; diff --git a/external/jigsaw/src/libcpp/iter_mesh/iter_mesh_euclidean_3.hpp b/external/jigsaw/src/libcpp/iter_mesh/iter_mesh_euclidean_3.hpp index 23cb733..30fd6cf 100644 --- a/external/jigsaw/src/libcpp/iter_mesh/iter_mesh_euclidean_3.hpp +++ b/external/jigsaw/src/libcpp/iter_mesh/iter_mesh_euclidean_3.hpp @@ -22,16 +22,20 @@ * how they can obtain it for free, then you are not * required to make any arrangement with me.) * - * Disclaimer: Neither I nor: Columbia University, The - * Massachusetts Institute of Technology, The - * University of Sydney, nor The National Aeronautics - * and Space Administration warrant this code in any - * way whatsoever. This code is provided "as-is" to be - * used at your own risk. + * Disclaimer: Neither I nor THE CONTRIBUTORS warrant + * this code in any way whatsoever. This code is + * provided "as-is" to be used at your own risk. + * + * THE CONTRIBUTORS include: + * (a) The University of Sydney + * (b) The Massachusetts Institute of Technology + * (c) Columbia University + * (d) The National Aeronautics & Space Administration + * (e) Los Alamos National Laboratory * -------------------------------------------------------- * - * Last updated: 24 Feb., 2021 + * Last updated: 15 Jul., 2021 * * Copyright 2013-2021 * Darren Engwirda @@ -134,7 +138,7 @@ template < /*------------------------- edge type for ITER-MESH-3 */ public : - iptr_type _itag ; + iptr_type _itag = 0 ; public : @@ -153,7 +157,7 @@ template < /*------------------------- face type for ITER-MESH-3 */ public : - iptr_type _itag ; + iptr_type _itag = 0 ; public : @@ -172,7 +176,7 @@ template < /*------------------------- face type for ITER-MESH-3 */ public : - iptr_type _itag ; + iptr_type _itag = 0 ; public : @@ -191,7 +195,7 @@ template < /*------------------------- cell type for ITER-MESH-3 */ public : - iptr_type _itag ; + iptr_type _itag = 0 ; public : @@ -210,7 +214,7 @@ template < /*------------------------- cell type for ITER-MESH-3 */ public : - iptr_type _itag ; + iptr_type _itag = 0 ; public : @@ -229,7 +233,7 @@ template < /*------------------------- cell type for ITER-MESH-3 */ public : - iptr_type _itag ; + iptr_type _itag = 0 ; public : @@ -248,7 +252,7 @@ template < /*------------------------- cell type for ITER-MESH-3 */ public : - iptr_type _itag ; + iptr_type _itag = 0 ; public : @@ -274,6 +278,35 @@ template < mesh_type _mesh ; + public : + + /* + -------------------------------------------------------- + * INIT-MESH: impose (optional) offsets + -------------------------------------------------------- + */ + + __normal_call void_type init ( + float _xoff = + 0.f , + float _yoff = + 0.f , + float _zoff = + 0.f + ) + { + for (auto _iter = + this->_mesh.node().head () ; + _iter != + this->_mesh.node().tend () ; + ++_iter ) + { + if (_iter->mark() >= +0) + { + _iter->pval(0) -= _xoff ; + _iter->pval(1) -= _yoff ; + _iter->pval(2) -= _zoff ; + } + } + } + } ; diff --git a/external/jigsaw/src/libcpp/iter_mesh/iter_node_1.inc b/external/jigsaw/src/libcpp/iter_mesh/iter_node_1.inc index 2d4b86c..af3b245 100644 --- a/external/jigsaw/src/libcpp/iter_mesh/iter_node_1.inc +++ b/external/jigsaw/src/libcpp/iter_mesh/iter_node_1.inc @@ -22,16 +22,20 @@ * how they can obtain it for free, then you are not * required to make any arrangement with me.) * - * Disclaimer: Neither I nor: Columbia University, The - * Massachusetts Institute of Technology, The - * University of Sydney, nor The National Aeronautics - * and Space Administration warrant this code in any - * way whatsoever. This code is provided "as-is" to be - * used at your own risk. + * Disclaimer: Neither I nor THE CONTRIBUTORS warrant + * this code in any way whatsoever. This code is + * provided "as-is" to be used at your own risk. + * + * THE CONTRIBUTORS include: + * (a) The University of Sydney + * (b) The Massachusetts Institute of Technology + * (c) Columbia University + * (d) The National Aeronautics & Space Administration + * (e) Los Alamos National Laboratory * -------------------------------------------------------- * - * Last updated: 12 August, 2018 + * Last updated: 12 Aug., 2018 * * Copyright 2013-2018 * Darren Engwirda diff --git a/external/jigsaw/src/libcpp/iter_mesh/iter_node_2.inc b/external/jigsaw/src/libcpp/iter_mesh/iter_node_2.inc index 402f1e3..3d44a8b 100644 --- a/external/jigsaw/src/libcpp/iter_mesh/iter_node_2.inc +++ b/external/jigsaw/src/libcpp/iter_mesh/iter_node_2.inc @@ -22,18 +22,22 @@ * how they can obtain it for free, then you are not * required to make any arrangement with me.) * - * Disclaimer: Neither I nor: Columbia University, The - * Massachusetts Institute of Technology, The - * University of Sydney, nor The National Aeronautics - * and Space Administration warrant this code in any - * way whatsoever. This code is provided "as-is" to be - * used at your own risk. + * Disclaimer: Neither I nor THE CONTRIBUTORS warrant + * this code in any way whatsoever. This code is + * provided "as-is" to be used at your own risk. + * + * THE CONTRIBUTORS include: + * (a) The University of Sydney + * (b) The Massachusetts Institute of Technology + * (c) Columbia University + * (d) The National Aeronautics & Space Administration + * (e) Los Alamos National Laboratory * -------------------------------------------------------- * - * Last updated: 30 Mar., 2021 + * Last updated: 30 Dec., 2022 * - * Copyright 2013-2021 + * Copyright 2013-2022 * Darren Engwirda * d.engwirda@gmail.com * https://github.com/dengwirda/ @@ -75,8 +79,8 @@ &_NPTR->pval(0), _NPTR->hidx()) ; # define LOOPDIMS( _ITER ) \ - for ( auto _idim = \ - pred_type::geom_dims; _idim-- != 0; ) + for ( auto _ITER = \ + pred_type::geom_dims; _ITER-- != 0; ) __unreferenced(_node) ; @@ -124,6 +128,9 @@ EVALHFUN( _jnod , _jptr ) EVALHFUN( _knod , _kptr ) + real_type _hbal = _hfun.eval( + &_ball[0], _node->hidx()) ; + real_type _irho = _hval[_imid] / _hval[_inod] ; real_type _jrho = @@ -131,10 +138,14 @@ real_type _krho = _hval[_imid] / _hval[_knod] ; + real_type _0rho = + _hval[_imid] / _hbal ; + real_type _hrho = - _irho * (real_type)1./3. + - _jrho * (real_type)1./3. + - _krho * (real_type)1./3. ; + _irho * (real_type)2./9. + + _jrho * (real_type)2./9. + + _krho * (real_type)2./9. + + _0rho * (real_type)3./9. ; _hrho = _tmag * std::pow(_hrho, +3) ; @@ -183,8 +194,8 @@ &_NPTR->pval(0), _NPTR->hidx()) ; # define LOOPDIMS( _ITER ) \ - for ( auto _idim = \ - pred_type::geom_dims; _idim-- != 0; ) + for ( auto _ITER = \ + pred_type::geom_dims; _ITER-- != 0; ) __unreferenced(_node) ; @@ -238,6 +249,9 @@ EVALHFUN( _knod , _kptr ) EVALHFUN( _lnod , _lptr ) + real_type _hbal = _hfun.eval( + &_ball[0], _node->hidx()) ; + real_type _irho = _hval[_imid] / _hval[_inod] ; real_type _jrho = @@ -247,11 +261,15 @@ real_type _lrho = _hval[_imid] / _hval[_lnod] ; + real_type _0rho = + _hval[_imid] / _hbal ; + real_type _hrho = - _irho * (real_type)1./4. + - _jrho * (real_type)1./4. + - _krho * (real_type)1./4. + - _lrho * (real_type)1./4. ; + _irho * (real_type)2./12 + + _jrho * (real_type)2./12 + + _krho * (real_type)2./12 + + _lrho * (real_type)2./12 + + _0rho * (real_type)4./12 ; _hrho = _qmag * std::pow(_hrho, +3) ; @@ -379,8 +397,8 @@ &_NPTR->pval(0), _NPTR->hidx()) ; # define LOOPDIMS( _ITER ) \ - for ( auto _idim = \ - pred_type::geom_dims; _idim-- != 0; ) + for ( auto _ITER = \ + pred_type::geom_dims; _ITER-- != 0; ) /*------------------------------------- cell indexing */ auto _tptr = @@ -456,7 +474,7 @@ real_type _lsqr = std::max( _0bal[_last], (real_type) +0.); - EVALHFUN( _inod , _iptr ) + EVALHFUN( _inod , _iptr ) // eval. at node EVALHFUN( _jnod , _jptr ) EVALHFUN( _knod , _kptr ) @@ -474,6 +492,17 @@ _hval[_inod] * (real_type)1./2. + _hval[_knod] * (real_type)1./2. ; + real_type _0val = _hfun.eval( // eval. on dual + &_0bal[0], _node->hidx()) ; + real_type _1val = _hfun.eval( + &_1bal[0], _node->hidx()) ; + real_type _2val = _hfun.eval( + &_2bal[0], _node->hidx()) ; + + _0rho = +.5 * (_0rho + _0val) ; + _1rho = +.5 * (_1rho + _1val) ; + _2rho = +.5 * (_2rho + _2val) ; + _0rho = std::pow( _hval[_inod] / _0rho, +3) ; _1rho = std::pow( @@ -540,8 +569,8 @@ &_NPTR->pval(0), _NPTR->hidx()) ; # define LOOPDIMS( _ITER ) \ - for ( auto _idim = \ - pred_type::geom_dims; _idim-- != 0; ) + for ( auto _ITER = \ + pred_type::geom_dims; _ITER-- != 0; ) /*------------------------------------- cell indexing */ auto _qptr = @@ -631,7 +660,7 @@ real_type _lsqr = std::max( _0bal[_last], (real_type) +0.); - EVALHFUN( _inod , _iptr ) + EVALHFUN( _inod , _iptr ) // eval. at node EVALHFUN( _jnod , _jptr ) EVALHFUN( _knod , _kptr ) EVALHFUN( _lnod , _lptr ) @@ -651,6 +680,17 @@ _hval[_inod] * (real_type)1./2. + _hval[_lnod] * (real_type)1./2. ; + real_type _0val = _hfun.eval( // eval. on dual + &_0bal[0], _node->hidx()) ; + real_type _1val = _hfun.eval( + &_1bal[0], _node->hidx()) ; + real_type _2val = _hfun.eval( + &_2bal[0], _node->hidx()) ; + + _0rho = +.5 * (_0rho + _0val) ; + _1rho = +.5 * (_1rho + _1val) ; + _2rho = +.5 * (_2rho + _2val) ; + _0rho = std::pow( _hval[_inod] / _0rho, +3) ; _1rho = std::pow( @@ -859,14 +899,6 @@ std::pow(std::numeric_limits ::epsilon(), .50) ; - real_type static const _RMIN = - std::pow(std::numeric_limits - ::epsilon(), .75) ; - - real_type static const _RMAX = - std::pow(std::numeric_limits - ::epsilon(), .25) ; - /*------------------------------------- cell indexing */ auto _ppos = &_node->pval(0); @@ -881,23 +913,12 @@ _bmin[_idim] ; real_type _hdel = _HINC*_binc; - - real_type _hsum = (real_type)0.; - - real_type _sdel = (real_type)0.; - real_type _sabs = (real_type)0.; - real_type _sbar = (real_type)0.; - - for (auto _iter = +0; _iter++ != +2; ) + real_type _dsup , _dsdn ; { /*------------------ centred finite-diff. for dQ / dx */ _ppos[_idim] = _SAVE[_idim] + _hdel; - _hsum = (real_type)+0. ; - _hsum += - _ppos[_idim] - _SAVE[_idim]; - real_type _scr1 = pred_type::tri3_cost ( &_mesh. node( @@ -910,12 +931,11 @@ pred_type::cell_kind () ) ; + _dsup = (_scr1 - _COST) / _hdel ; + _ppos[_idim] = _SAVE[_idim] - _hdel; - _hsum -= - _ppos[_idim] - _SAVE[_idim]; - real_type _scr0 = pred_type::tri3_cost ( &_mesh. node( @@ -928,33 +948,15 @@ pred_type::cell_kind () ) ; - _sdel = _scr1 - _scr0 ; - - _sbar = std::abs(_COST) ; - _sabs = std::abs(_sdel) ; - - /*------------------ try to adjust step on rel. diff. */ - if (_sabs > (real_type)0.) - { - if (_sabs > _RMAX * _sbar) - { - _hdel/= (real_type) +10. ; - } - else - if (_sabs < _RMIN * _sbar) - { - _hdel*= (real_type) +10. ; - } - else { break ; } - } - else { break ; } + _dsdn = (_COST - _scr0) / _hdel ; } - _ppos[_idim] = _SAVE [_idim]; + _ppos[_idim] = _SAVE [_idim] ; /*------------------ finalise gradient and accumulate */ - - _DQDX[_idim] += _sdel / _hsum ; + if (_dsup * _dsdn > (real_type)0.) + _DQDX [ _idim ] += + (real_type)+.5 * (_dsup + _dsdn) ; } } @@ -1061,14 +1063,6 @@ std::pow(std::numeric_limits ::epsilon(), .50) ; - real_type static const _RMIN = - std::pow(std::numeric_limits - ::epsilon(), .75) ; - - real_type static const _RMAX = - std::pow(std::numeric_limits - ::epsilon(), .25) ; - /*------------------------------------- cell indexing */ auto _ppos = &_node->pval(0); @@ -1083,22 +1077,11 @@ _bmin[_idim] ; real_type _hdel = _HINC*_binc; - - real_type _hsum = (real_type)0.; - - real_type _sdel = (real_type)0.; - real_type _sabs = (real_type)0.; - real_type _sbar = (real_type)0.; - - for (auto _iter = +0; _iter++ != +2; ) + real_type _dsup , _dsdn ; { /*------------------ centred finite-diff. for dQ / dx */ _ppos[_idim] = - _SAVE[_idim] + _hdel; - - _hsum = (real_type)+0. ; - _hsum += - _ppos[_idim] - _SAVE[_idim]; + _SAVE[_idim] + _hdel ; real_type _scr1 = pred_type::quad_cost ( @@ -1114,11 +1097,10 @@ pred_type::cell_kind () ) ; - _ppos[_idim] = - _SAVE[_idim] - _hdel; + _dsup = (_scr1 - _COST) / _hdel ; - _hsum -= - _ppos[_idim] - _SAVE[_idim]; + _ppos[_idim] = + _SAVE[_idim] - _hdel ; real_type _scr0 = pred_type::quad_cost ( @@ -1134,33 +1116,15 @@ pred_type::cell_kind () ) ; - _sdel = _scr1 - _scr0 ; - - _sbar = std::abs(_COST) ; - _sabs = std::abs(_sdel) ; - - /*------------------ try to adjust step on rel. diff. */ - if (_sabs > (real_type)0.) - { - if (_sabs > _RMAX * _sbar) - { - _hdel/= (real_type) +10. ; - } - else - if (_sabs < _RMIN * _sbar) - { - _hdel*= (real_type) +10. ; - } - else { break ; } - } - else { break ; } + _dsdn = (_COST - _scr0) / _hdel ; } - _ppos[_idim] = _SAVE [_idim]; + _ppos[_idim] = _SAVE [_idim] ; /*------------------ finalise gradient and accumulate */ - - _DQDX[_idim] += _sdel / _hsum ; + if (_dsup * _dsdn > (real_type)0.) + _DQDX [ _idim ] += + (real_type)+.5 * (_dsup + _dsdn) ; } } diff --git a/external/jigsaw/src/libcpp/iter_mesh/iter_node_3.inc b/external/jigsaw/src/libcpp/iter_mesh/iter_node_3.inc index 84f795e..b2cd660 100644 --- a/external/jigsaw/src/libcpp/iter_mesh/iter_node_3.inc +++ b/external/jigsaw/src/libcpp/iter_mesh/iter_node_3.inc @@ -22,16 +22,20 @@ * how they can obtain it for free, then you are not * required to make any arrangement with me.) * - * Disclaimer: Neither I nor: Columbia University, The - * Massachusetts Institute of Technology, The - * University of Sydney, nor The National Aeronautics - * and Space Administration warrant this code in any - * way whatsoever. This code is provided "as-is" to be - * used at your own risk. + * Disclaimer: Neither I nor THE CONTRIBUTORS warrant + * this code in any way whatsoever. This code is + * provided "as-is" to be used at your own risk. + * + * THE CONTRIBUTORS include: + * (a) The University of Sydney + * (b) The Massachusetts Institute of Technology + * (c) Columbia University + * (d) The National Aeronautics & Space Administration + * (e) Los Alamos National Laboratory * -------------------------------------------------------- * - * Last updated: 12 August, 2018 + * Last updated: 12 Aug., 2018 * * Copyright 2013-2018 * Darren Engwirda diff --git a/external/jigsaw/src/libcpp/iter_mesh/iter_pred_ellipsoid_3.hpp b/external/jigsaw/src/libcpp/iter_mesh/iter_pred_ellipsoid_3.hpp index a8be9e2..4a1176e 100644 --- a/external/jigsaw/src/libcpp/iter_mesh/iter_pred_ellipsoid_3.hpp +++ b/external/jigsaw/src/libcpp/iter_mesh/iter_pred_ellipsoid_3.hpp @@ -22,18 +22,22 @@ * how they can obtain it for free, then you are not * required to make any arrangement with me.) * - * Disclaimer: Neither I nor: Columbia University, The - * Massachusetts Institute of Technology, The - * University of Sydney, nor The National Aeronautics - * and Space Administration warrant this code in any - * way whatsoever. This code is provided "as-is" to be - * used at your own risk. + * Disclaimer: Neither I nor THE CONTRIBUTORS warrant + * this code in any way whatsoever. This code is + * provided "as-is" to be used at your own risk. + * + * THE CONTRIBUTORS include: + * (a) The University of Sydney + * (b) The Massachusetts Institute of Technology + * (c) Columbia University + * (d) The National Aeronautics & Space Administration + * (e) Los Alamos National Laboratory * -------------------------------------------------------- * - * Last updated: 26 July, 2020 + * Last updated: 01 Sept., 2021 * - * Copyright 2013-2020 + * Copyright 2013-2021 * Darren Engwirda * d.engwirda@gmail.com * https://github.com/dengwirda/ @@ -50,6 +54,7 @@ template < typename G , + size_t C , typename M > class iter_pred_ellipsoid_3d @@ -68,6 +73,8 @@ struct cell_kind {}; struct dual_kind {}; + size_t static constexpr _cost = C ; + iptr_type static constexpr topo_dims = +2 ; iptr_type static @@ -160,6 +167,21 @@ } } + __static_call + __inline_call void_type tri3_norm ( + __const_ptr(real_type) _ipos , + __const_ptr(real_type) _jpos , + __const_ptr(real_type) _kpos , + __write_ptr(real_type) _nvec + ) + { + geometry::tria_norm_3d ( + &_ipos[0] , + &_jpos[0] , + &_kpos[0] , + &_nvec[0] ) ; + } + __static_call __inline_call real_type tri3_mass ( __const_ptr(real_type) _ipos , @@ -244,10 +266,23 @@ cell_kind const& ) { + if constexpr ( + _cost == JIGSAW_KERN_AREA_LEN) + { return geometry::tria_quality_3d ( &_ipos[0] , &_jpos[0] , &_kpos[0] ) ; + } + + if constexpr ( + _cost == JIGSAW_KERN_SKEW_COS) + { + return geometry::tria_skewcos_3d ( + &_ipos[0] , + &_jpos[0] , + &_kpos[0] ) ; + } } __static_call diff --git a/external/jigsaw/src/libcpp/iter_mesh/iter_pred_euclidean_2.hpp b/external/jigsaw/src/libcpp/iter_mesh/iter_pred_euclidean_2.hpp index 01f356b..c89f223 100644 --- a/external/jigsaw/src/libcpp/iter_mesh/iter_pred_euclidean_2.hpp +++ b/external/jigsaw/src/libcpp/iter_mesh/iter_pred_euclidean_2.hpp @@ -22,18 +22,22 @@ * how they can obtain it for free, then you are not * required to make any arrangement with me.) * - * Disclaimer: Neither I nor: Columbia University, The - * Massachusetts Institute of Technology, The - * University of Sydney, nor The National Aeronautics - * and Space Administration warrant this code in any - * way whatsoever. This code is provided "as-is" to be - * used at your own risk. + * Disclaimer: Neither I nor THE CONTRIBUTORS warrant + * this code in any way whatsoever. This code is + * provided "as-is" to be used at your own risk. + * + * THE CONTRIBUTORS include: + * (a) The University of Sydney + * (b) The Massachusetts Institute of Technology + * (c) Columbia University + * (d) The National Aeronautics & Space Administration + * (e) Los Alamos National Laboratory * -------------------------------------------------------- * - * Last updated: 26 July, 2020 + * Last updated: 01 Sept., 2021 * - * Copyright 2013-2020 + * Copyright 2013-2021 * Darren Engwirda * d.engwirda@gmail.com * https://github.com/dengwirda/ @@ -50,6 +54,7 @@ template < typename G , + size_t C , typename M > class iter_pred_euclidean_2d @@ -68,6 +73,8 @@ struct cell_kind {}; struct dual_kind {}; + size_t static constexpr _cost = C ; + iptr_type static constexpr topo_dims = +2 ; iptr_type static @@ -115,6 +122,21 @@ __unreferenced (_proj) ; } + __static_call + __inline_call void_type tri3_norm ( + __const_ptr(real_type) _ipos , + __const_ptr(real_type) _jpos , + __const_ptr(real_type) _kpos , + __write_ptr(real_type) _nvec + ) + { + geometry::tria_norm_2d ( + &_ipos[0] , + &_jpos[0] , + &_kpos[0] , + &_nvec[0] ) ; + } + __static_call __inline_call real_type tri3_mass ( __const_ptr(real_type) _ipos , @@ -199,10 +221,23 @@ cell_kind const& ) { + if constexpr ( + _cost == JIGSAW_KERN_AREA_LEN) + { return geometry::tria_quality_2d ( &_ipos[0] , &_jpos[0] , &_kpos[0] ) ; + } + + if constexpr ( + _cost == JIGSAW_KERN_SKEW_COS) + { + return geometry::tria_skewcos_2d ( + &_ipos[0] , + &_jpos[0] , + &_kpos[0] ) ; + } } __static_call diff --git a/external/jigsaw/src/libcpp/iter_mesh/iter_timers.hpp b/external/jigsaw/src/libcpp/iter_mesh/iter_timers.hpp index 0906cc5..bc6c9fb 100644 --- a/external/jigsaw/src/libcpp/iter_mesh/iter_timers.hpp +++ b/external/jigsaw/src/libcpp/iter_mesh/iter_timers.hpp @@ -22,18 +22,22 @@ * how they can obtain it for free, then you are not * required to make any arrangement with me.) * - * Disclaimer: Neither I nor: Columbia University, The - * Massachusetts Institute of Technology, The - * University of Sydney, nor The National Aeronautics - * and Space Administration warrant this code in any - * way whatsoever. This code is provided "as-is" to be - * used at your own risk. + * Disclaimer: Neither I nor THE CONTRIBUTORS warrant + * this code in any way whatsoever. This code is + * provided "as-is" to be used at your own risk. + * + * THE CONTRIBUTORS include: + * (a) The University of Sydney + * (b) The Massachusetts Institute of Technology + * (c) Columbia University + * (d) The National Aeronautics & Space Administration + * (e) Los Alamos National Laboratory * -------------------------------------------------------- * - * Last updated: 30 April, 2020 + * Last updated: 12 Dec., 2022 * - * Copyright 2013-2020 + * Copyright 2013-2022 * Darren Engwirda * d.engwirda@gmail.com * https://github.com/dengwirda/ @@ -54,25 +58,49 @@ -------------------------------------------------------- */ - template < - typename R , - typename I - > class iter_timers { public : - typedef R real_type ; - typedef I iptr_type ; - - typedef iter_timers self_type ; - - real_type _iter_full = (real_type) +0. ; - - real_type _move_node = (real_type) +0. ; - real_type _move_dual = (real_type) +0. ; - real_type _topo_flip = (real_type) +0. ; - real_type _topo_zips = (real_type) +0. ; + double _iter_full = (double ) +0. ; + + double _init_iter = (double ) +0. ; + + double _move_node = (double ) +0. ; + double _init_node = (double ) +0. ; + double _core_node = (double ) +0. ; + double _seqs_node = (double ) +0. ; + double _para_node = (double ) +0. ; + double _ldir_node = (double ) +0. ; + double _lopt_node = (double ) +0. ; + + double _move_dual = (double ) +0. ; + double _init_dual = (double ) +0. ; + double _core_dual = (double ) +0. ; + double _seqs_dual = (double ) +0. ; + double _para_dual = (double ) +0. ; + double _ldir_dual = (double ) +0. ; + double _lopt_dual = (double ) +0. ; + + double _topo_flip = (double ) +0. ; + double _init_flip = (double ) +0. ; + double _core_flip = (double ) +0. ; + + double _topo_zips = (double ) +0. ; + double _init_zips = (double ) +0. ; + double _core_zips = (double ) +0. ; + double _core_divs = (double ) +0. ; + + double _full_part = (double ) +0. ; + double _tree_part = (double ) +0. ; + double _redo_part = (double ) +0. ; + double _part_part = (double ) +0. ; + double _seqs_part = (double ) +0. ; + + double _part_node = (double ) +0. ; + double _part_dual = (double ) +0. ; + double _part_flip = (double ) +0. ; + double _part_topo = (double ) +0. ; public : @@ -95,6 +123,21 @@ (_ttoc-_ttic).count()) / +1.0E+06 ; } + __inline_call double nano_span ( + typename std:: + chrono::high_resolution_clock + ::time_point const& _ttic, + typename std:: + chrono::high_resolution_clock + ::time_point const& _ttoc + ) + { + return (double)( + std::chrono::duration_cast< + std::chrono:: nanoseconds > + (_ttoc-_ttic).count()) / +1.0E+09 ; + } + # endif//__use_timers } ; diff --git a/external/jigsaw/src/libcpp/iter_mesh/iter_zips_2.inc b/external/jigsaw/src/libcpp/iter_mesh/iter_zips_2.inc index c194594..2c494fd 100644 --- a/external/jigsaw/src/libcpp/iter_mesh/iter_zips_2.inc +++ b/external/jigsaw/src/libcpp/iter_mesh/iter_zips_2.inc @@ -22,18 +22,22 @@ * how they can obtain it for free, then you are not * required to make any arrangement with me.) * - * Disclaimer: Neither I nor: Columbia University, The - * Massachusetts Institute of Technology, The - * University of Sydney, nor The National Aeronautics - * and Space Administration warrant this code in any - * way whatsoever. This code is provided "as-is" to be - * used at your own risk. + * Disclaimer: Neither I nor THE CONTRIBUTORS warrant + * this code in any way whatsoever. This code is + * provided "as-is" to be used at your own risk. + * + * THE CONTRIBUTORS include: + * (a) The University of Sydney + * (b) The Massachusetts Institute of Technology + * (c) Columbia University + * (d) The National Aeronautics & Space Administration + * (e) Los Alamos National Laboratory * -------------------------------------------------------- * - * Last updated: 23 Apr., 2021 + * Last updated: 11 Dec., 2022 * - * Copyright 2013-2021 + * Copyright 2013-2022 * Darren Engwirda * d.engwirda@gmail.com * https://github.com/dengwirda/ @@ -44,6 +48,258 @@ // from iter_mesh_2.hpp + __static_call + __normal_call void_type _pop_sets ( + mesh_type &_mesh , // mesh object + conn_list &_ladj // space for adj. cells + ) + { + for (auto _cell = _ladj.head() ; + _cell != _ladj.tend() ; + ++_cell ) + { + if (_cell->_kind == TRIA3_tag) + { + _mesh. + _pop_tri3(_cell->_cell) ; + } + else + if (_cell->_kind == QUAD4_tag) + { + _mesh. + _pop_quad(_cell->_cell) ; + } + } + } + + template < + typename cell_type + > + __static_call + __normal_call void_type _adj_sets ( + mesh_type &_mesh , // mesh object + cell_type &_cdat , // cell to zip + iptr_type _nnod , // no. nodes in cell + conn_list &_list , // space for adj. cells + conn_list &_ladj // space for adj. cells + ) + { + for (auto _cell = _list.head(); + _cell != _list.tend(); + ++_cell ) + { + if (_cell->_kind == TRIA3_tag) + { + /*--------------------------------- set a = { i \ t } */ + auto _tptr = + _mesh. tri3().head()+_cell->_cell; + + iptr_type _nnum, _mnum; + iptr_type _M = _nnod, _same = +0 ; + for(_nnum = 3; _nnum-- != 0; ) + for(_mnum =_M; _mnum-- != 0; ) + { + if (_tptr->node(_nnum) == + _cdat. node(_mnum) ) + { + _same += +1 ; + } + } + + if (_same > +1 ) continue; + } + else + if (_cell->_kind == QUAD4_tag) + { + /*--------------------------------- set a = { i \ q } */ + auto _qptr = + _mesh. quad().head()+_cell->_cell; + + iptr_type _nnum, _mnum; + iptr_type _M = _nnod, _same = +0 ; + for(_nnum = 4; _nnum-- != 0; ) + for(_mnum =_M; _mnum-- != 0; ) + { + if (_qptr->node(_nnum) == + _cdat. node(_mnum) ) + { + _same += +1 ; + } + } + + if (_same > +1 ) continue; + } + + /*----------------- if we got this far, add adj. cell */ + _ladj.push_tail( *_cell ); + } + } + + template < + typename cell_type + > + __static_call + __normal_call void_type _adj_redo ( + mesh_type &_mesh , // mesh object + cell_type &_cdat , // cell to zip + iptr_type _inod , // old node in cell + iptr_type _inew , // new node to push + conn_list &_ladj , // space for adj. cells + conn_list &_lcav // space for adj. cells + ) + { + typename mesh_type::tri3_type _tdat; + typename mesh_type::quad_type _qdat; + + for (auto _cell = _ladj.head(); + _cell != _ladj.tend(); + ++_cell ) + { + if (_cell->_kind == TRIA3_tag) + { + auto _tptr = + _mesh. tri3().head()+_cell->_cell ; + + _tdat.node(0) = _tptr->node(0) ; + _tdat.node(1) = _tptr->node(1) ; + _tdat.node(2) = _tptr->node(2) ; + + _tdat.itag () = _tptr->itag () ; + + iptr_type _nnum ; + for(_nnum = 3; _nnum-- != 0; ) + { + if (_tdat. node(_nnum) == + _cdat. node(_inod) ) + _tdat. node(_nnum) = _inew ; + } + + auto _tnum = + _mesh.push_tri3(_tdat) ; + + _lcav.push_tail( typename + conn_list::data_type(_tnum,TRIA3_tag)); + } + else + if (_cell->_kind == QUAD4_tag) + { + auto _qptr = + _mesh. quad().head()+_cell->_cell ; + + _qdat.node(0) = _qptr->node(0) ; + _qdat.node(1) = _qptr->node(1) ; + _qdat.node(2) = _qptr->node(2) ; + _qdat.node(3) = _qptr->node(3) ; + + _qdat.itag () = _qptr->itag () ; + + iptr_type _nnum ; + for(_nnum = 4; _nnum-- != 0; ) + { + if (_qdat. node(_nnum) == + _cdat. node(_inod) ) + _qdat. node(_nnum) = _inew ; + } + + auto _qnum = + _mesh.push_quad(_qdat) ; + + _lcav.push_tail( typename + conn_list::data_type(_qnum,QUAD4_tag)); + } + } + } + + __static_call + __normal_call void_type _adj_ball ( + mesh_type &_mesh , // mesh object + conn_list &_ladj , // space for adj. cells + real_type *_ball , // accumulate cell ball + real_type &_mass // accumulate cell mass + ) + { + iptr_type static constexpr + _last = pred_type::geom_dims + 0 ; + + for (auto _cell = _ladj.head() ; + _cell != _ladj.tend() ; + ++_cell ) + { + real_type _BALL [_last + 1] = {0}; + real_type _MASS = 0 ; + if (_cell->_kind == TRIA3_tag) + { + /*--------------------------------- accum. ball; tri3 */ + auto _tptr = + _mesh. tri3().head() + _cell->_cell ; + + auto _INOD = _tptr->node(0) ; + auto _JNOD = _tptr->node(1) ; + auto _KNOD = _tptr->node(2) ; + + auto _IPTR = + _mesh. node().head() + _INOD ; + auto _JPTR = + _mesh. node().head() + _JNOD ; + auto _KPTR = + _mesh. node().head() + _KNOD ; + + _MASS = std::abs( + pred_type::tri3_mass( + &_IPTR->pval(+0), + &_JPTR->pval(+0), + &_KPTR->pval(+0)) ) ; + + pred_type::tri3_ball(_BALL, + &_IPTR->pval(+0), + &_JPTR->pval(+0), + &_KPTR->pval(+0), true) ; + } + else + if (_cell->_kind == QUAD4_tag) + { + /*--------------------------------- accum. ball; quad */ + auto _qptr = + _mesh. quad().head() + _cell->_cell ; + + auto _INOD = _qptr->node(0) ; + auto _JNOD = _qptr->node(1) ; + auto _KNOD = _qptr->node(2) ; + auto _LNOD = _qptr->node(3) ; + + auto _IPTR = + _mesh. node().head() + _INOD ; + auto _JPTR = + _mesh. node().head() + _JNOD ; + auto _KPTR = + _mesh. node().head() + _KNOD ; + auto _LPTR = + _mesh. node().head() + _LNOD ; + + _MASS = std::abs( + pred_type::quad_mass( + &_IPTR->pval(+0), + &_JPTR->pval(+0), + &_KPTR->pval(+0), + &_LPTR->pval(+0)) ) ; + + pred_type::quad_ball(_BALL, + &_IPTR->pval(+0), + &_JPTR->pval(+0), + &_KPTR->pval(+0), + &_LPTR->pval(+0), true) ; + } + + for (auto _idim = _last; + _idim-- != +0; ) + { + _ball[_idim] += _MASS * _BALL[_idim] ; + } + _mass += _MASS ; + } + } + + /* -------------------------------------------------------- * _ZIP-EDGE: try edge merge to improve adj. cost-fun. @@ -52,32 +308,35 @@ __static_call __normal_call void_type _zip_edge ( - geom_type &_geom , - mesh_type &_mesh , - hfun_type &_hfun , - real_list &_hval , - iter_opts &_opts , - iptr_type _edge , - char_type _kern , - bool_type &_okay , - iptr_type &_nnew , - conn_list &_iset , - conn_list &_jset , - conn_list &_aset , - conn_list &_bset , - conn_list &_cset , - real_list &_qsrc , - real_list &_qdst , - real_list &_qtmp , - real_type _QLIM , - real_type _lmax - = (real_type) +8.00E-01 , - real_type _qinc - = (real_type) +2.50E-02 + geom_type &_geom , // geometry object + mesh_type &_mesh , // mesh object + hfun_type &_hfun , // spacing object + real_list &_hval , // cached node spacing array + iter_opts &_opts , // user options + iptr_list &_nmrk , // list of node flags + iptr_type _iout , // outer iteration marker + iptr_type _edge , // edge number to zip. + kern_kind _kern , // optim. kernel selector + bool_type &_okay , // TRUE if zip. successful + iptr_type &_nnew , // new node index added + conn_list &_iset , // space for adj. cells + conn_list &_jset , // space for adj. cells + conn_list &_iadj , // space for adj. cells + conn_list &_jadj , // space for adj. cells + conn_list &_cset , // space for adj. cells + real_list &_qsrc , // space for adj. costs + real_list &_qdst , // space for adj. costs + real_list &_qtmp , // space for adj. costs + real_type _QLIM , // cell quality threshold + iter_stat &_tcpu , // cpu timers/info + real_type _lmax // zip. spacing threshold + = (real_type) +8.888E-01 , + real_type _qinc // zip. quality threshold + = (real_type) +3.333E-03 ) { iptr_type static constexpr - _last = pred_type::geom_dims+0 ; + _last = pred_type::geom_dims + 0 ; iptr_type static constexpr _DEG_TRIA3 = (iptr_type)+6 ; @@ -106,10 +365,11 @@ 0, containers::loose_alloc); _jset.set_count( 0, containers::loose_alloc); - _aset.set_count( + _iadj.set_count( 0, containers::loose_alloc); - _bset.set_count( + _jadj.set_count( 0, containers::loose_alloc); + _cset.set_count( 0, containers::loose_alloc); @@ -127,49 +387,114 @@ return ; /*--------------------------------- get adjacent face */ - _mesh.connect_2(_eptr->node(+0), - POINT_tag , _iset) ; - _mesh.connect_2(_eptr->node(+1), - POINT_tag , _jset) ; + _mesh.connect_2(&_eptr->node(0), + EDGE2_tag , _cset) ; + + if (_cset.count() != 2) return ; + + auto _atri = + _mesh.tri3().head()+_cset[0]._cell ; + auto _btri = + _mesh.tri3().head()+_cset[1]._cell ; + + iptr_type _anod = -1; // find cell apex + if (_atri->node(0) != _inod && + _atri->node(0) != _jnod ) + _anod = _atri->node( 0 ) ; + if (_atri->node(1) != _inod && + _atri->node(1) != _jnod ) + _anod = _atri->node( 1 ) ; + if (_atri->node(2) != _inod && + _atri->node(2) != _jnod ) + _anod = _atri->node( 2 ) ; + + iptr_type _bnod = -1; // find cell apex + if (_btri->node(0) != _inod && + _btri->node(0) != _jnod ) + _bnod = _btri->node( 0 ) ; + if (_btri->node(1) != _inod && + _btri->node(1) != _jnod ) + _bnod = _btri->node( 1 ) ; + if (_btri->node(2) != _inod && + _btri->node(2) != _jnod ) + _bnod = _btri->node( 2 ) ; /*--------------------------------- calc. local topo. */ - auto _ndeg = _iset.count() - + _jset.count() - 4 ; + auto _ideg = + _mesh .node(_inod).ndeg(TRIA3_tag) ; + auto _jdeg = + _mesh .node(_jnod).ndeg(TRIA3_tag) ; + auto _adeg = + _mesh .node(_anod).ndeg(TRIA3_tag) ; + auto _bdeg = + _mesh .node(_bnod).ndeg(TRIA3_tag) ; + + if (_nmrk[_inod] < 0) _ideg = 6 ; + if (_nmrk[_jnod] < 0) _jdeg = 6 ; + if (_nmrk[_anod] < 0) _adeg = 6 ; + if (_nmrk[_bnod] < 0) _bdeg = 6 ; - auto _ideg = _iset.count() ; auto _ierr = (iptr_type)(_DEG_TRIA3-_ideg) ; - - auto _jdeg = _jset.count() ; auto _jerr = (iptr_type)(_DEG_TRIA3-_jdeg) ; - - auto _iabs = std::abs(_ierr) ; - auto _jabs = std::abs(_jerr) ; - - auto _nerr = std::abs( - (iptr_type)(_DEG_TRIA3-_ndeg)); + auto _aerr = + (iptr_type)(_DEG_TRIA3-_adeg) ; + auto _berr = + (iptr_type)(_DEG_TRIA3-_bdeg) ; + + auto _ndeg = _ideg + _jdeg - 4 ; + auto _ADEG = _adeg - 1 ; + auto _BDEG = _bdeg - 1 ; + + auto _nerr = + (iptr_type)(_DEG_TRIA3-_ndeg) ; + auto _AERR = + (iptr_type)(_DEG_TRIA3-_ADEG) ; + auto _BERR = + (iptr_type)(_DEG_TRIA3-_BDEG) ; + + auto _dnow = std::abs(_ierr) + // current defect + std::abs(_jerr) + + std::abs(_aerr) + + std::abs(_berr) ; + + auto _dnew = std::abs(_nerr) + // updated defect + std::abs(_AERR) + + std::abs(_BERR) ; // bail-out early if the topological defect would be // made worse if the zip is done - if (_nerr> std::max(_ierr, _jerr)) - return ; + if (_dnew > _dnow + 1) return; // if more regular topo. is constructed via the edge // zip, make it easier to do so! - real_type _qerr = (real_type)( - -2./16.*1./2.*(_ierr + _jerr)); + real_type _qerr = (real_type) + -1./16.*std::max (_ierr, _jerr) ; + + real_type _lerr = (real_type) + +1./16.*std::max (_ierr, _jerr) ; + + if (_dnew < _dnow - 0) + { // no oscl. wrt. div + _qerr/= std::pow ( _iout, +1./4.) ; + _qinc = std::min ( _qinc, + _qinc + _qerr) ; + + _lerr/= std::pow ( _iout, +1./4.) ; + _lmax = std::max ( _lmax, + _lmax + _lerr) ; + } - real_type _lerr = (real_type)( - +1./16.*1./2.*(_ierr + _jerr)); + iptr_type static constexpr + _dMIN = (iptr_type)+2 ; - if (2 * _nerr < _iabs + _jabs) + if (_ierr >= _dMIN || _jerr >= _dMIN) { - _qinc = std::min(_qinc, _qerr); - _lmax = std::max(_lmax, - _lmax+ _lerr); + _qinc = (real_type) -0.250 ; // force a quad. zip + _lmax = (real_type) +1.250 ; } /*--------------------------------- get edge h-sizing */ @@ -186,6 +511,9 @@ _pmid[_idim] /= (real_type)2. ; } + pred_type:: + proj_node(_geom, _pmid, _pmid); + real_type _isiz, _jsiz, _msiz ; _isiz = _hfun.eval( &_iptr->pval(0), _iptr->hidx()) ; @@ -211,211 +539,50 @@ return ; /*--------------------------------- get disjoint sets */ - for (auto _cell = _iset.head(); - _cell != _iset.tend(); - ++_cell ) - { - /*--------------------------------- set a = { i \ e } */ - if (_cell->_kind == TRIA3_tag) - { - auto _tptr = - _mesh. tri3().head()+_cell->_cell ; - - iptr_type _nnum, _same = +0; - for(_nnum = 3; _nnum-- != 0; ) - { - if (_tptr->node(_nnum) == - _eptr->node( 0) ) - _same += +1 ; - - if (_tptr->node(_nnum) == - _eptr->node( 1) ) - _same += +1 ; - } - - if (_same >= +2) continue ; - } - else - if (_cell->_kind == QUAD4_tag) - { - auto _qptr = - _mesh. quad().head()+_cell->_cell ; - - iptr_type _nnum, _same = +0; - for(_nnum = 4; _nnum-- != 0; ) - { - if (_qptr->node(_nnum) == - _eptr->node( 0) ) - _same += +1 ; - - if (_qptr->node(_nnum) == - _eptr->node( 1) ) - _same += +1 ; - } - - if (_same >= +2) continue ; - } - - _aset.push_tail( *_cell ) ; - } - - for (auto _cell = _jset.head(); - _cell != _jset.tend(); - ++_cell ) - { - /*--------------------------------- set b = { j \ e } */ - if (_cell->_kind == TRIA3_tag) - { - auto _tptr = - _mesh. tri3().head()+_cell->_cell ; - - iptr_type _nnum, _same = +0; - for(_nnum = 3; _nnum-- != 0; ) - { - if (_tptr->node(_nnum) == - _eptr->node( 0) ) - _same += +1 ; - - if (_tptr->node(_nnum) == - _eptr->node( 1) ) - _same += +1 ; - } - - if (_same >= +2) continue ; - } - else - if (_cell->_kind == QUAD4_tag) - { - auto _qptr = - _mesh. quad().head()+_cell->_cell ; - - iptr_type _nnum, _same = +0; - for(_nnum = 4; _nnum-- != 0; ) - { - if (_qptr->node(_nnum) == - _eptr->node( 0) ) - _same += +1 ; + _mesh.connect_2(_eptr->node(+0), + POINT_tag , _iset) ; - if (_qptr->node(_nnum) == - _eptr->node( 1) ) - _same += +1 ; - } + _adj_sets( + _mesh, _edat, 2, _iset, _iadj) ; - if (_same >= +2) continue ; - } + _mesh.connect_2(_eptr->node(+1), + POINT_tag , _jset) ; - _bset.push_tail( *_cell ) ; - } + _adj_sets( + _mesh, _edat, 2, _jset, _jadj) ; /*--------------------------------- get adjacent cost */ real_type _amin = loop_cost( - _mesh, _iset, _qsrc, cell_kind()) ; + _mesh, + _iset, _qsrc, cell_kind()) ; real_type _bmin = loop_cost( - _mesh, _bset, _qsrc, cell_kind()) ; + _mesh, + _jadj, _qsrc, cell_kind()) ; real_type _qmin = std::min(_amin, _bmin) ; /*--------------------------------- get adjacent ball */ - real_type _ball[_last + 1] = + real_type _ball[_last + 1] = + {(real_type) 0.} ; + real_type _prev[_last + 1] = {(real_type) 0.} ; real_type _mass = (real_type)0.; - for (auto _cell = _iset.head(); - _cell != _iset.tend(); - ++_cell ) - { - if (_cell->_kind == TRIA3_tag) - { - auto _tptr = - _mesh. tri3().head() + _cell->_cell ; - - auto _INOD = _tptr->node(0) ; - auto _JNOD = _tptr->node(1) ; - auto _KNOD = _tptr->node(2) ; - - auto _IPTR = - _mesh. node().head() + _INOD ; - auto _JPTR = - _mesh. node().head() + _JNOD ; - auto _KPTR = - _mesh. node().head() + _KNOD ; - - real_type _BALL [_last + 1] ; - pred_type::tri3_ball(_BALL, - &_IPTR->pval(+0), - &_JPTR->pval(+0), - &_KPTR->pval(+0), true) ; - - real_type _MASS = - std::abs(pred_type::tri3_mass ( - &_IPTR->pval(+0), - &_JPTR->pval(+0), - &_KPTR->pval(+0)) ) ; - - _mass += _MASS ; - - for (auto _idim = - pred_type::geom_dims; _idim-- != 0; ) - { - _ball[_idim] += - _MASS * _BALL[_idim]; - } - } - } - - for (auto _cell = _jset.head(); - _cell != _jset.tend(); - ++_cell ) - { - if (_cell->_kind == TRIA3_tag) - { - auto _tptr = - _mesh. tri3().head() + _cell->_cell ; - - auto _INOD = _tptr->node(0) ; - auto _JNOD = _tptr->node(1) ; - auto _KNOD = _tptr->node(2) ; - - auto _IPTR = - _mesh. node().head() + _INOD ; - auto _JPTR = - _mesh. node().head() + _JNOD ; - auto _KPTR = - _mesh. node().head() + _KNOD ; - - real_type _BALL [_last + 1] ; - pred_type::tri3_ball(_BALL, - &_IPTR->pval(+0), - &_JPTR->pval(+0), - &_KPTR->pval(+0), true) ; - - real_type _MASS = - std::abs(pred_type::tri3_mass ( - &_IPTR->pval(+0), - &_JPTR->pval(+0), - &_KPTR->pval(+0)) ) ; - - _mass += _MASS ; - - for (auto _idim = - pred_type::geom_dims; _idim-- != 0; ) - { - _ball[_idim] += - _MASS * _BALL[_idim]; - } - } - } + _adj_ball( + _mesh,_iset, _ball, _mass) ; + _adj_ball( + _mesh,_jset, _ball, _mass) ; for (auto _idim = pred_type::geom_dims; _idim-- != 0; ) { - _ball[_idim] /= _mass; + _ball[_idim] /= _mass ; } pred_type:: - proj_node(_geom, _ball, _ball); + proj_node(_geom, _ball, _ball) ; /*--------------------------------- try to merge edge */ # define NULLHINT hfun_type::null_hint() @@ -423,9 +590,6 @@ typename mesh_type::node_type _ndat ; - typename mesh_type::tri3_type _tdat ; - typename mesh_type::quad_type _qdat ; - for (auto _idim = pred_type::real_dims; _idim-- != 0; ) { @@ -441,130 +605,347 @@ _mesh. node().head () + _nnew ; _hval.set_count( std::max( - _nnew + 1, (iptr_type)_hval.count())) ; + _nnew+1, (iptr_type)_hval.count())) ; _hval[_nnew] = (real_type)-1. ; /*--------------------------------- push a new cavity */ - for (auto _cell = _aset.head(); - _cell != _aset.tend(); - ++_cell ) - { - if (_cell->_kind == TRIA3_tag) - { - auto _tptr = - _mesh. tri3().head()+_cell->_cell ; + _cset.set_count( +0 ) ; + _adj_redo( _mesh, + _edat, +0, _nnew, _iadj, _cset) ; - _tdat.node(0) = _tptr->node(0) ; - _tdat.node(1) = _tptr->node(1) ; - _tdat.node(2) = _tptr->node(2) ; + _adj_redo( _mesh, + _edat, +1, _nnew, _jadj, _cset) ; - _tdat.itag () = _tptr->itag () ; + /*--------------------------------- optim. node coord */ + iptr_type static + constexpr _INUM = (iptr_type) +4; - iptr_type _nnum ; - for(_nnum = 3; _nnum-- != 0; ) - { - if (_tdat. node(_nnum) == - _edat. node(0) ) - _tdat. node(_nnum) = _nnew ; - } + iptr_type _move = -1; + for (auto _iter = +0; _iter != _INUM; + ++_iter ) + { + _qtmp.set_count( + +0, containers::loose_alloc); - auto _tnum = - _mesh.push_tri3(_tdat) ; + real_type _minC = + loop_cost( _mesh, + _cset, _qtmp, cell_kind() + ) ; - _cset.push_tail( typename - conn_list::data_type(_tnum,TRIA3_tag)); - } - else - if (_cell->_kind == QUAD4_tag) - { - auto _qptr = - _mesh. quad().head()+_cell->_cell ; + move_node( _geom, _mesh, + _hfun, _hval, + _opts, _nptr, _prev, + _kern, _move, _cset, + _qtmp, _qdst, + _minC, _QLIM, _QLIM, + _tcpu) ; - _qdat.node(0) = _qptr->node(0) ; - _qdat.node(1) = _qptr->node(1) ; - _qdat.node(2) = _qptr->node(2) ; - _qdat.node(3) = _qptr->node(3) ; + if (_move <= +0 ) break; + } - _qdat.itag () = _qptr->itag () ; + /*--------------------------------- is cost improved? */ + _qdst.set_count( + 0, containers::loose_alloc) ; - iptr_type _nnum ; - for(_nnum = 4; _nnum-- != 0; ) - { - if (_qdat. node(_nnum) == - _edat. node(0) ) - _qdat. node(_nnum) = _nnew ; - } + real_type _QMIN = + loop_cost( _mesh, + _cset, _qdst, cell_kind()) ; - auto _qnum = - _mesh.push_quad(_qdat) ; + move_okay( _qdst, _qsrc, _move, + std::sqrt( _QLIM) , + _qinc) ; - _cset.push_tail( typename - conn_list::data_type(_qnum,QUAD4_tag)); - } - } + if((_okay = _move > 0 && + _QMIN >= _qmin+_qinc)) + { + /*--------------------------------- delete old cavity */ + _pop_sets( _mesh , _iset ); + _pop_sets( _mesh , _jset ); - for (auto _cell = _bset.head(); - _cell != _bset.tend(); - ++_cell ) + _mesh._pop_node ( &_inod ); + _mesh._pop_node ( &_jnod ); + } + else { - if (_cell->_kind == TRIA3_tag) - { - auto _tptr = - _mesh. tri3().head()+_cell->_cell ; + /*--------------------------------- delete new cavity */ + _pop_sets( _mesh , _cset ); - _tdat.node(0) = _tptr->node(0) ; - _tdat.node(1) = _tptr->node(1) ; - _tdat.node(2) = _tptr->node(2) ; + _mesh._pop_node ( &_nnew ); + } - _tdat.itag () = _tptr->itag () ; + # undef NULLHINT + # undef NULLFEAT + } - iptr_type _nnum ; - for(_nnum = 3; _nnum-- != 0; ) - { - if (_tdat. node(_nnum) == - _edat. node(1) ) - _tdat. node(_nnum) = _nnew ; - } + /* + -------------------------------------------------------- + * _ZIP-TRI3: try tri3 merge to improve adj. cost-fun. + -------------------------------------------------------- + */ - auto _tnum = - _mesh.push_tri3(_tdat) ; + __static_call + __normal_call void_type _zip_tri3 ( + geom_type &_geom , // geometry object + mesh_type &_mesh , // mesh object + hfun_type &_hfun , // spacing object + real_list &_hval , // cached node spacing array + iter_opts &_opts , // user options + iptr_list &_nmrk , // list of node flags + iptr_type _iout , // outer iteration marker + iptr_type _tri3 , // tri3 number to zip. + kern_kind _kern , // optim. kernel selector + bool_type &_okay , // TRUE if zip. successful + iptr_type &_nnew , // new node index added + conn_list &_iset , // space for adj. cells + conn_list &_jset , // space for adj. cells + conn_list &_kset , // space for adj. cells + conn_list &_iadj , // space for adj. cells + conn_list &_jadj , // space for adj. cells + conn_list &_kadj , // space for adj. cells + conn_list &_cset , // space for adj. cells + real_list &_qsrc , // space for adj. costs + real_list &_qdst , // space for adj. costs + real_list &_qtmp , // space for adj. costs + real_type _QLIM , // cell quality threshold + iter_stat &_tcpu , // cpu timers/info + real_type _lmax // zip. spacing threshold + = (real_type) +8.666E-01 , + real_type _qinc // zip. quality threshold + = (real_type) +3.333E-03 + ) + { + iptr_type static constexpr + _last = pred_type::geom_dims + 0 ; - _cset.push_tail( typename - conn_list::data_type(_tnum,TRIA3_tag)); - } - else - if (_cell->_kind == QUAD4_tag) - { - auto _qptr = - _mesh. quad().head()+_cell->_cell ; + iptr_type static constexpr + _DEG_TRIA3 = (iptr_type)+6 ; + // iptr_type static constexpr + // _DEG_QUAD4 = (iptr_type)+4 ; - _qdat.node(0) = _qptr->node(0) ; - _qdat.node(1) = _qptr->node(1) ; - _qdat.node(2) = _qptr->node(2) ; - _qdat.node(3) = _qptr->node(3) ; + __unreferenced (_iout) ; - _qdat.itag () = _qptr->itag () ; + /*--------------------------------- get face indexing */ + auto _fptr = + _mesh. tri3().head()+_tri3 ; - iptr_type _nnum ; - for(_nnum = 4; _nnum-- != 0; ) - { - if (_qdat. node(_nnum) == - _edat. node(1) ) - _qdat. node(_nnum) = _nnew ; - } + typename mesh_type:: + tri3_type _fdat(*_fptr) ; - auto _qnum = - _mesh.push_quad(_qdat) ; + iptr_type _inod, _jnod, _knod ; + _inod = _fptr->node(0) ; + _jnod = _fptr->node(1) ; + _knod = _fptr->node(2) ; - _cset.push_tail( typename - conn_list::data_type(_qnum,QUAD4_tag)); - } + auto _iptr = _mesh. + node().head() + _fptr->node(0); + auto _jptr = _mesh. + node().head() + _fptr->node(1); + auto _kptr = _mesh. + node().head() + _fptr->node(2); + + _okay = false ; + + _iset.set_count( + 0, containers::loose_alloc); + _jset.set_count( + 0, containers::loose_alloc); + _kset.set_count( + 0, containers::loose_alloc); + _iadj.set_count( + 0, containers::loose_alloc); + _jadj.set_count( + 0, containers::loose_alloc); + _kadj.set_count( + 0, containers::loose_alloc); + + _cset.set_count( + 0, containers::loose_alloc); + + _qsrc.set_count( + 0, containers::loose_alloc); + _qdst.set_count( + 0, containers::loose_alloc); + _qtmp.set_count( + 0, containers::loose_alloc); + + /*--------------------------------- exit if FEAT node */ + if (_iptr->feat() != null_feat) + return ; + if (_jptr->feat() != null_feat) + return ; + if (_kptr->feat() != null_feat) + return ; + + /*--------------------------------- calc. local topo. */ + auto _ideg = + _mesh .node(_inod).ndeg(TRIA3_tag) ; + auto _jdeg = + _mesh .node(_jnod).ndeg(TRIA3_tag) ; + auto _kdeg = + _mesh .node(_knod).ndeg(TRIA3_tag) ; + + if (_nmrk[_inod] < 0) _ideg = 6 ; + if (_nmrk[_jnod] < 0) _jdeg = 6 ; + if (_nmrk[_knod] < 0) _kdeg = 6 ; + + auto _ierr = + (iptr_type)(_DEG_TRIA3-_ideg) ; + auto _jerr = + (iptr_type)(_DEG_TRIA3-_jdeg) ; + auto _kerr = + (iptr_type)(_DEG_TRIA3-_kdeg) ; + + auto _ndeg = _ideg + _jdeg + _kdeg - 3*3 ; + + auto _nerr = + (iptr_type)(_DEG_TRIA3-_ndeg) ; + + auto _dnew = std::abs(_nerr) ; + auto _dnow = std::abs(_ierr) + + std::abs(_jerr) + + std::abs(_kerr) ; + + // bail-out early if the topological defect would be + // made worse if the zip is done + + if (_dnew > _dnow + 0) return ; + + /*--------------------------------- get face h-sizing */ + real_type _pbal[ _last + 1 ] ; + pred_type::tri3_ball ( _pbal , + &_iptr->pval( +0 ) , + &_jptr->pval( +0 ) , + &_kptr->pval( +0 ) , true) ; + + pred_type:: + proj_node(_geom, _pbal, _pbal); + + real_type _isiz, _jsiz, _ksiz ; + real_type _bsiz; + _isiz = _hfun.eval( + &_iptr->pval(0), _iptr->hidx()) ; + _jsiz = _hfun.eval( + &_jptr->pval(0), _jptr->hidx()) ; + _ksiz = _hfun.eval( + &_kptr->pval(0), _kptr->hidx()) ; + + auto _hint = _iptr->hidx() ; + + _bsiz = _hfun.eval(_pbal , _hint) ; + + real_type _lsqr = + _pbal[_last] * (real_type)+3. ; + real_type _hbar = + _isiz * (real_type)(2./9.) + + _jsiz * (real_type)(2./9.) + + _ksiz * (real_type)(2./9.) + + _bsiz * (real_type)(3./9.) ; + + /*--------------------------------- exit if too large */ + if (_lsqr >= _hbar * _lmax * + _hbar * _lmax ) + return ; + + /*--------------------------------- get disjoint sets */ + _mesh.connect_2(_fptr->node(+0), + POINT_tag , _iset) ; + + _adj_sets( + _mesh, _fdat, 3, _iset, _iadj) ; + + _mesh.connect_2(_fptr->node(+1), + POINT_tag , _jset) ; + + _adj_sets( + _mesh, _fdat, 3, _jset, _jadj) ; + + _mesh.connect_2(_fptr->node(+2), + POINT_tag , _kset) ; + + _adj_sets( + _mesh, _fdat, 3, _kset, _kadj) ; + + /*--------------------------------- get adjacent cost */ + real_type _amin = loop_cost( + _mesh, + _iset, _qsrc, cell_kind()) ; + + real_type _bmin = loop_cost( + _mesh, + _jadj, _qsrc, cell_kind()) ; + + real_type _cmin = loop_cost( + _mesh, + _kadj, _qsrc, cell_kind()) ; + + real_type _qmin = + std::min( {_amin, _bmin, _cmin} ) ; + + /*--------------------------------- get adjacent ball */ + real_type _ball[_last + 1] = + {(real_type) 0.} ; + real_type _prev[_last + 1] = + {(real_type) 0.} ; + real_type _mass = (real_type)0.; + + _adj_ball( + _mesh,_iset, _ball, _mass) ; + _adj_ball( + _mesh,_jset, _ball, _mass) ; + _adj_ball( + _mesh,_kset, _ball, _mass) ; + + for (auto _idim = + pred_type::geom_dims; _idim-- != 0; ) + { + _ball[_idim] /= _mass ; } + pred_type:: + proj_node(_geom, _ball, _ball) ; + + /*--------------------------------- try to merge face */ + # define NULLHINT hfun_type::null_hint() + # define NULLFEAT null_feat + + typename mesh_type::node_type _ndat ; + + typename mesh_type::tri3_type _tdat ; + typename mesh_type::quad_type _qdat ; + + for (auto _idim = + pred_type::real_dims; _idim-- != 0; ) + { + _ndat.pval(_idim) = _ball[_idim]; + } + + _ndat.fdim() = (iptr_type) +2 ; + _ndat.feat() = NULLFEAT ; + _ndat.hidx() = NULLHINT ; + _nnew = _mesh.push_node(_ndat); + + auto _nptr = + _mesh. node().head () + _nnew ; + + _hval.set_count( std::max( + _nnew+1, (iptr_type)_hval.count())) ; + + _hval[_nnew] = (real_type)-1. ; + + /*--------------------------------- push a new cavity */ + _adj_redo( _mesh, + _fdat, +0, _nnew, _iadj, _cset) ; + + _adj_redo( _mesh, + _fdat, +1, _nnew, _jadj, _cset) ; + + _adj_redo( _mesh, + _fdat, +2, _nnew, _kadj, _cset) ; + /*--------------------------------- optim. node coord */ iptr_type static - constexpr _INUM = (iptr_type) +8; + constexpr _INUM = (iptr_type) +4; iptr_type _move = -1; for (auto _iter = +0; _iter != _INUM; @@ -580,12 +961,13 @@ move_node( _geom, _mesh, _hfun, _hval, - _opts, _nptr, _kern, - _move, _cset, + _opts, _nptr, _prev, + _kern, _move, _cset, _qtmp, _qdst, - _minC, _QLIM ) ; + _minC, _QLIM, _QLIM, + _tcpu) ; - if (_move <= +0) break ; + if (_move <= +0 ) break; } /*--------------------------------- is cost improved? */ @@ -604,61 +986,18 @@ _QMIN >= _qmin+_qinc)) { /*--------------------------------- delete old cavity */ - for (auto _cell = _aset.head() ; - _cell != _aset.tend() ; - ++_cell ) - { - if (_cell->_kind == TRIA3_tag) - { - _mesh. - _pop_tri3(_cell->_cell) ; - } - else - if (_cell->_kind == QUAD4_tag) - { - _mesh. - _pop_quad(_cell->_cell) ; - } - } - for (auto _cell = _jset.head() ; - _cell != _jset.tend() ; - ++_cell ) - { - if (_cell->_kind == TRIA3_tag) - { - _mesh. - _pop_tri3(_cell->_cell) ; - } - else - if (_cell->_kind == QUAD4_tag) - { - _mesh. - _pop_quad(_cell->_cell) ; - } - } + _pop_sets( _mesh , _iset ); + _pop_sets( _mesh , _jset ); + _pop_sets( _mesh , _kset ); _mesh._pop_node ( &_inod ); _mesh._pop_node ( &_jnod ); + _mesh._pop_node ( &_knod ); } else { /*--------------------------------- delete new cavity */ - for (auto _cell = _cset.head() ; - _cell != _cset.tend() ; - ++_cell ) - { - if (_cell->_kind == TRIA3_tag) - { - _mesh. - _pop_tri3(_cell->_cell) ; - } - else - if (_cell->_kind == QUAD4_tag) - { - _mesh. - _pop_quad(_cell->_cell) ; - } - } + _pop_sets( _mesh , _cset ); _mesh._pop_node ( &_nnew ); } diff --git a/external/jigsaw/src/libcpp/iter_mesh/iter_zips_3.inc b/external/jigsaw/src/libcpp/iter_mesh/iter_zips_3.inc index ac6ff75..3ccada6 100644 --- a/external/jigsaw/src/libcpp/iter_mesh/iter_zips_3.inc +++ b/external/jigsaw/src/libcpp/iter_mesh/iter_zips_3.inc @@ -22,16 +22,20 @@ * how they can obtain it for free, then you are not * required to make any arrangement with me.) * - * Disclaimer: Neither I nor: Columbia University, The - * Massachusetts Institute of Technology, The - * University of Sydney, nor The National Aeronautics - * and Space Administration warrant this code in any - * way whatsoever. This code is provided "as-is" to be - * used at your own risk. + * Disclaimer: Neither I nor THE CONTRIBUTORS warrant + * this code in any way whatsoever. This code is + * provided "as-is" to be used at your own risk. + * + * THE CONTRIBUTORS include: + * (a) The University of Sydney + * (b) The Massachusetts Institute of Technology + * (c) Columbia University + * (d) The National Aeronautics & Space Administration + * (e) Los Alamos National Laboratory * -------------------------------------------------------- * - * Last updated: 12 August, 2018 + * Last updated: 12 Aug., 2018 * * Copyright 2013-2018 * Darren Engwirda diff --git a/external/jigsaw/src/libcpp/iter_mesh/move_mesh_2.inc b/external/jigsaw/src/libcpp/iter_mesh/move_mesh_2.inc new file mode 100644 index 0000000..97f1289 --- /dev/null +++ b/external/jigsaw/src/libcpp/iter_mesh/move_mesh_2.inc @@ -0,0 +1,1466 @@ + + /* + -------------------------------------------------------- + * MOVE-MESH-2: update cell/dual geometries. + -------------------------------------------------------- + * + * This program may be freely redistributed under the + * condition that the copyright notices (including this + * entire header) are not removed, and no compensation + * is received through use of the software. Private, + * research, and institutional use is free. You may + * distribute modified versions of this code UNDER THE + * CONDITION THAT THIS CODE AND ANY MODIFICATIONS MADE + * TO IT IN THE SAME FILE REMAIN UNDER COPYRIGHT OF THE + * ORIGINAL AUTHOR, BOTH SOURCE AND OBJECT CODE ARE + * MADE FREELY AVAILABLE WITHOUT CHARGE, AND CLEAR + * NOTICE IS GIVEN OF THE MODIFICATIONS. Distribution + * of this code as part of a commercial system is + * permissible ONLY BY DIRECT ARRANGEMENT WITH THE + * AUTHOR. (If you are not directly supplying this + * code to a customer, and you are instead telling them + * how they can obtain it for free, then you are not + * required to make any arrangement with me.) + * + * Disclaimer: Neither I nor THE CONTRIBUTORS warrant + * this code in any way whatsoever. This code is + * provided "as-is" to be used at your own risk. + * + * THE CONTRIBUTORS include: + * (a) The University of Sydney + * (b) The Massachusetts Institute of Technology + * (c) Columbia University + * (d) The National Aeronautics & Space Administration + * (e) Los Alamos National Laboratory + * + -------------------------------------------------------- + * + * Last updated: 11 Dec., 2022 + * + * Copyright 2013-2022 + * Darren Engwirda, + * Marc Tunnell + * d.engwirda@gmail.com + * https://github.com/dengwirda/ + * + -------------------------------------------------------- + */ + + // from iter_mesh_2.hpp + + + /* + -------------------------------------------------------- + * MOVE-NODE: "limited" single node coord. update. + -------------------------------------------------------- + */ + + #include "iter_node_2.inc" + + template < + typename node_iter + > + __static_call + __inline_call void_type move_node ( + geom_type &_geom , // geometry object + mesh_type &_mesh , // mesh object + hfun_type &_hfun , // spacing object + real_list &_hval , // cached node spacing array + iter_opts &_opts , // user options + node_iter _node , // iterator to node to iter. + real_type *_last , // lagged line direction + kern_kind _kern , // optim. kernel selector + iptr_type &_move , // > 0 if move successful + conn_list &_conn , // list of adj. cells + real_list &_qold , // list of old adj. costs + real_list &_qnew , // list of new adj. costs + real_type _QMIN , // minimum adj. old costs + real_type _QLIM , // cell quality threshold + real_type _QMOV , + iter_stat &_tcpu // CPU timers/info + ) + { + /*---------------- try variational; fallback on dQ/dx */ + move_kern( _geom, _mesh, _hfun, + _hval, _opts, _node, _last, + _kern, _move, _conn, + _qold, _qnew, + _QMIN, _QLIM, _QMOV, _tcpu) ; // variational + + if (_move >= +0 ) return ; + + move_kern( _geom, _mesh, _hfun, + _hval, _opts, _node, _last, + dqdx_optimise, + _move, _conn, + _qold, _qnew, + _QMIN, _QLIM, _QMOV, _tcpu) ; // local dQ/dx + + if (_move >= +0 ) return ; + } + + template < + typename node_iter + > + __static_call + __normal_call void_type move_kern ( + geom_type &_geom , // geometry object + mesh_type &_mesh , // mesh object + hfun_type &_hfun , // spacing object + real_list &_hval , // cached node spacing array + iter_opts &_opts , // user options + node_iter _node , // iterator to node to iter. + real_type *_last , // lagged line direction + kern_kind _kern , // optim. kernel selector + iptr_type &_move , // > 0 if move successful + conn_list &_conn , // list of adj. cells + real_list &_qold , // list of old adj. costs + real_list &_qnew , // list of new adj. costs + real_type _QMIN , // minimum adj. old costs + real_type _QLIM , // cell quality threshold + real_type _QMOV , + iter_stat &_tcpu // CPU timers/info + ) + { + /*---------------- optimise single node's coordinates */ + iptr_type static + constexpr _ITER = (iptr_type) +5 ; + + // ifdef __use_timers + // typename std ::chrono:: + // high_resolution_clock::time_point _ttic ; + // typename std ::chrono:: + // high_resolution_clock::time_point _ttoc ; + // typename std ::chrono:: + // high_resolution_clock _time ; + + // __unreferenced(_time) ; // why does MSVC need this?? + // endif//__use_timers + + __unreferenced(_tcpu) ; + + _move = (iptr_type)-1 ; + + real_type _line[geom_dims] = + {(real_type)+0.0} ; + real_type _step[geom_dims] = + {(real_type)+0.0} ; + real_type _save[geom_dims] = + {(real_type)+0.0} ; + real_type _proj[geom_dims] = + {(real_type)+0.0} ; + + /*---------------- calc. line search direction vector */ + + // ifdef __use_timers + // _ttic = _time.now() ; + // endif//__use_timers + + real_type _ladj = (real_type) +0. ; + + if (_kern == _odt_optimise) + { + /*--------------------------- ODT-style update vector */ + _odt_move_2 ( + _geom, _mesh, _hfun, _hval, + _conn, _node, + _line, _ladj) ; + } + else + if (_kern == _cvt_optimise) + { + /*--------------------------- CVT-style update vector */ + _cvt_move_2 ( + _geom, _mesh, _hfun, _hval, + _conn, _node, + _line, _ladj) ; + } + else + if (_kern == dqdx_optimise) + { + if (_QMIN<=_QLIM) + { + /*--------------------------- d./dx Q^T update vector */ + dqdx_move_2 ( + _mesh, _conn, _node, _qold, + _line, _ladj) ; + } + else { return ; } + } + + // ifdef __use_timers + // _ttoc = _time.now() ; + // _tcpu._ldir_node += _tcpu.nano_span(_ttic, _ttoc) ; + // endif//__use_timers + + /*---------------- scale line search direction vector */ + real_type _xeps = // delta_x ~= 0.0 + (real_type)+0.01*_opts.qtol() ; + + real_type _xtol = // delta_x reltol + +std::sqrt(_opts.qtol()) / +10.0 ; + + auto _ppos = &_node->pval(0) ; + + real_type _lsqr ; + _lsqr = std::pow(_ladj, 2) ; + _xeps = std::pow(_xeps, 2) ; + _xtol = std::pow(_xtol, 2) ; + + real_type _SCAL[_ITER] = { // overrelaxation + (real_type) std::sqrt( 2.0 ) , + (real_type) +1.00, + (real_type) +0.50, + (real_type) +0.25, + (real_type) +.125 } ; + + /*---------------- do backtracking line search iter's */ + + // ifdef __use_timers + // _ttic = _time.now() ; + // endif//__use_timers + + if (_kern == dqdx_optimise) // test cost-only + { + _QMOV = + +std::numeric_limits::infinity() ; + } + + for (auto _idim = + pred_type::geom_dims; _idim-- != +0; ) + { + _save[_idim] = _ppos [_idim] ; + } + + for (auto _iter = +0 ; + _iter != _ITER; ++_iter ) + { + /*---------------- push update along search direction */ + real_type _scal = _SCAL[_iter]; + + real_type _zeta = _opts._zeta * + std::min ((real_type)1.,_scal) ; + + real_type _beta = _opts._beta ; + + for (auto _idim = + pred_type::geom_dims; _idim-- != +0; ) + { + /*---------------- momentum-type bias for search dir. */ + _step[_idim] = + _last[_idim]*((real_type)0.+_beta) + + _line[_idim]*((real_type)1.-_beta) ; + + _proj[_idim] = + _save[_idim] + _scal * ( + _step[_idim]*((real_type)0.+_zeta) + + _line[_idim]*((real_type)1.-_zeta)); + } + + /*---------------- ensure projection is on to surface */ + pred_type:: + proj_node (_geom, _save, _proj) ; + + for (auto _idim = + pred_type::geom_dims; _idim-- != +0; ) + { + _ppos[_idim] = _proj[_idim] ; + } + + real_type _XTOL = _xtol * _scal; // armijo + real_type _XEPS = _xeps * + std::min ((real_type)1.,_scal) ; + + real_type _lmov = + pred_type::length_sq(_save, _proj) ; + + if (_lmov <= _XEPS * _lsqr) break; + + //_move = +1 ; return ; + + /*---------------- test quasi-monotonicity w.r.t. Q^T */ + _qnew.set_count(0) ; + + loop_cost( _mesh, _conn, _qnew, + cell_kind ()) ; + + move_okay( _qnew, _qold, _move, + _QMOV, _opts.qtol(), + _lmov, _XTOL* _lsqr) ; + + if (_move >= +0) break ; + } + + if (_move <= +0) + { + /*---------------- swap with the saved coord. if fail */ + for (auto _idim = + pred_type::geom_dims; _idim-- != +0; ) + { + _ppos[_idim] = _save[_idim] ; + + _last[_idim]/= (real_type)4.; // reset! + } + } + else + { + /*---------------- save line dir. for momentum update */ + for (auto _idim = + pred_type::geom_dims; _idim-- != +0; ) + { + _last[_idim] = _step[_idim] ; + } + } + + // ifdef __use_timers + // _ttoc = _time.now() ; + // _tcpu._lopt_node += _tcpu.nano_span(_ttic, _ttoc) ; + // endif//__use_timers + + } + + /* + -------------------------------------------------------- + * MOVE-DUAL: "limited" single node weight update. + -------------------------------------------------------- + */ + + #include "iter_dual_2.inc" + + template < + typename node_iter + > + __static_call + __normal_call void_type move_dual ( + geom_type &_geom , // geometry object + mesh_type &_mesh , // mesh object + hfun_type &_hfun , // spacing object + real_list &_hval , // cached node spacing array + iter_opts &_opts , // user options + node_iter _node , // iterator to node to iter. + real_type _last , // lagged line direction + iptr_type &_move , // > 0 if move successful + conn_list &_conn , // list of adj. cells + real_list &_dold , // list of old adj. costs + real_list &_dnew , // list of new adj. costs + real_type _DMIN , // minimum adj. old costs + real_type _DLIM , // dual quality threshold + real_type _DMOV , + iter_stat &_tcpu // CPU timers/info + ) + { + /*---------------- optimise single node's coordinates */ + iptr_type static + constexpr _ITER = (iptr_type) +5 ; + + // ifdef __use_timers + // typename std ::chrono:: + // high_resolution_clock::time_point _ttic ; + // typename std ::chrono:: + // high_resolution_clock::time_point _ttoc ; + // typename std ::chrono:: + // high_resolution_clock _time ; + + // __unreferenced(_time) ; // why does MSVC need this?? + // endif//__use_timers + + __unreferenced(_geom) ; + __unreferenced(_hfun) ; + __unreferenced(_hval) ; + __unreferenced(_tcpu) ; + + _move = (iptr_type)-1 ; + + real_type _wadj, _line, _step; + + /*---------------- calc. line search direction vector */ + + // ifdef __use_timers + // _ttic = _time.now() ; + // endif//__use_timers + + if (_DMIN <= _DLIM) + { + dqdw_move_2 ( + _mesh, _conn, _node, _dold, + _line, _wadj) ; + } + else { return ; } + + // ifdef __use_timers + // _ttoc = _time.now() ; + // _tcpu._ldir_dual += _tcpu.nano_span(_ttic, _ttoc) ; + // endif//__use_timers + + /*---------------- scale line search direction vector */ + real_type _weps = // delta_w ~= 0.0 + (real_type)+.01*_opts.qtol() ; + + real_type _save = + _node->pval( + pred_type::real_dims - 1); + + real_type _SCAL[_ITER] = { // overrelaxation + (real_type) std::sqrt( 2.0 ) , + (real_type) +1.00, + (real_type) +0.50, + (real_type) +0.25, + (real_type) +.125 } ; + + /*---------------- do backtracking line search iter's */ + + // ifdef __use_timers + // _ttic = _time.now() ; + // endif//__use_timers + + _DMOV = + +std::numeric_limits::infinity() ; + + for (auto _iter = +0 ; + _iter != _ITER; ++_iter ) + { + real_type _scal = _SCAL[_iter]; + + real_type _zeta = _opts._zeta * + (real_type)3./4. * + std::min((real_type)1.,_scal) ; + + real_type _beta = _opts._beta ; + + /*---------------- momentum-type bias for search dir. */ + _step = + _last * ((real_type)0.+_beta) + + _line * ((real_type)1.-_beta) ; + + _node->pval(real_dims-1) = + _save + _scal * ( + _step * ((real_type)0.+_zeta) + + _line * ((real_type)1.-_zeta)); + + _node->pval(real_dims-1) = + std::max(-_wadj , + _node->pval(real_dims-1)); + + _node->pval(real_dims-1) = + std::min(+_wadj , + _node->pval(real_dims-1)); + + real_type _wmov = + std::abs (_save - + _node->pval(real_dims-1)); + + real_type _wtol = _weps * _wadj * + std::min ((real_type)1.0, _scal); + + if (_wmov <= _wtol) break; + + /*---------------- test quasi-monotonicity w.r.t. Q^D */ + _dnew.set_count(0) ; + + loop_cost( _mesh, _conn, _dnew , + dual_kind ()) ; + + move_okay( _dnew, _dold, _move , + _DMOV, _opts.qtol()) ; + + if (_move >= +0) break ; + } + + /*---------------- swap with the saved coord. if fail */ + if (_move <= +0) + { + _node->pval(real_dims-1) = _save ; + + _last/= (real_type) 4. ; // reset dir., fail + } + else + { + _last = _step ; + } + + // ifdef __use_timers + // _ttoc = _time.now() ; + // _tcpu._lopt_dual += _tcpu.nano_span(_ttic, _ttoc) ; + // endif//__use_timers + + } + + /* + -------------------------------------------------------- + * MOVE-NODE: do a single node smoothing pass. + -------------------------------------------------------- + */ + + __static_call + __normal_call void_type move_node ( + geom_type &_geom , // geometry object + mesh_type &_mesh , // mesh object + conn_sets &_CONN , // cached node adj. indexing + hfun_type &_hfun , // spacing object + char_type _kern , // optim. kernel selector + real_list &_hval , // cached node spacing array + line_list &_last , // lagged line direction + iptr_list &_nset , // list of nodes active + iptr_list &_aset , // space for new active list + mark_list &_mark , // sets of node/cell flags + part_data &_part , // mesh parallel partition + iptr_type _iout , // outer iteration marker + iptr_type _isub , // inner iteration marker + iter_opts &_opts , // user options + real_type _QLIM , // cell quality threshold + real_type _QMOV , + real_type _DLIM , // dual quality threshold + real_type _DMOV , + iter_stat &_tcpu // CPU timers/info + ) + { + # define MARK(_NODE) _mark._node[_NODE] + + class move_task // inner loop: MOVE-NODE + { + public : + __inline_call void operator() ( + geom_type &_geom , // geometry object + mesh_type &_mesh , // mesh object + iptr_type _apos , // index of node to update + hfun_type &_hfun , // spacing object + real_list &_hval , // cached node spacing array + conn_sets &_CONN , // cached node adj. indexing + char_type _kern , // optim. kernel selector + line_list &_last , // lagged line direction + iptr_list &_nset , // list of nodes active + mark_list &_mark , // sets of node/cell flags + iptr_type _iout , // outer iteration marker + iter_opts &_opts , // user options + conn_list &_conn , // space for connectivity + real_list &_qold , // space for adj. costs + real_list &_qnew , // space for adj. costs + real_type _QLIM , // cell quality threshold + real_type _QMOV , + iter_stat &_tcpu // CPU timers/info + ) const + { + /*---------------- apply single move-node updates */ + auto _node = + _mesh.node().head()+ _apos ; + + /*---------------- assemble a local tria. stencil */ + _conn.set_count( +0) ; + _conn.push_tail( + _CONN._adj2.head()+_CONN._idx2[_apos+0], + _CONN._adj2.head()+_CONN._idx2[_apos+1] + ) ; + + if (_conn.empty() ) return ; + + if (_mark._node[_apos] >= +0) + { + /*---------------- attempt to optimise CELL geom. */ + _qold.set_count( +0) ; + _qnew.set_count( +0) ; + + real_type _QMIN = + loop_cost( _mesh, + _conn, _qold, cell_kind()); + + iptr_type _move = -1 ; + + if (_move < +0 ) + { + /*---------------- do optimisation of node coord. */ + move_node( _geom, _mesh, + _hfun, _hval, + _opts, _node, + &_last[ _apos][ +0 ], + _kern, _move, _conn, + _qold, _qnew, + _QMIN, _QLIM, _QMOV, + _tcpu) ; + } + + if (_move > +0 ) + { + /*---------------- update when state is improving */ + _hval[_apos] = (real_type)-1 ; + + if (std::abs( + MARK( _apos )) !=_iout) + { + if (MARK( _apos ) >= 0) + MARK( _apos ) = +_iout; + else + MARK( _apos ) = -_iout; + + // pragma omp critical(NS) + { + _nset.push_tail (_apos) ; + } + } + + } + } + } + } ; + + iptr_type constexpr PART_SCAL = +32 ; + iptr_type constexpr BNDS_SCAL = 4096 ; + + # define SBEG(_PASS)(_PASS == +0 ? \ + _aset.head() : _aset.tail()) + + # define SEND(_PASS)(_PASS == +0 ? \ + _aset.tend() : _aset.hend()) + + # define PBEG(_PART, _PASS, _RANK)( \ + _PASS == +0 ? \ + _PART._lptr[_RANK + 0] + 0 : \ + _PART._lptr[_RANK + 1] - 1) + + # define PEND(_PART, _PASS, _RANK)( \ + _PASS == +0 ? \ + _PART._lptr[_RANK + 1] + 0 : \ + _PART._lptr[_RANK + 0] - 1) + + # define ITER(_PASS)(_PASS == +0 ? +1 : -1) + + iptr_type _pful, _pbnd; + conn_list _conn; + real_list _qold, _qnew; + + # ifdef __use_timers + typename std ::chrono:: + high_resolution_clock::time_point _ttic; + typename std ::chrono:: + high_resolution_clock::time_point _ttoc; + typename std ::chrono:: + high_resolution_clock _time ; + + __unreferenced(_time) ; // why does MSVC need this?? + # endif//__use_timers + + /*-------------------- permute nodes for optimisation */ + + # ifdef __use_timers + _ttic = _time.now() ; + # endif//__use_timers + + if (_isub == +0) + sort_node( _mesh, _CONN, _aset, + _mark. _node, + _iout, _isub, _QLIM, _QMOV, _DLIM, _DMOV, + _opts) ; + + _pful =(iptr_type)( + std::sqrt(_aset.count ()) / + PART_SCAL ) ; + _pful = std::min( + _opts. nprt(), _pful + 1) ; + + # ifdef __use_timers + _ttoc = _time.now() ; + _tcpu._init_node += _tcpu.time_span(_ttic, _ttoc) ; + # endif//__use_timers + + if (_pful <= +1 ) + { + /*-------------------- single part: sequential scheme */ + + # ifdef __use_timers + _ttic = _time.now() ; + # endif//__use_timers + + /*-------------------- SYMMETRIC GAUSS-SEIDEL on CELL */ + + if (_opts .tria()) // 1=>GS, 2=>SGS + { + for (auto _pass = 0; _pass < 2; ++_pass) + for (auto _apos = SBEG(_pass) ; + _apos != SEND(_pass) ; + _apos += ITER(_pass) ) + { + move_task()(_geom, _mesh,*_apos, + _hfun , _hval, + _CONN , _kern, _last, + _nset , _mark, + _iout , _opts, + _conn , _qold, _qnew, _QLIM, + _QMOV , _tcpu) ; + } + } + + # ifdef __use_timers + _ttoc = _time.now() ; + _tcpu._core_node += _tcpu.time_span(_ttic, _ttoc) ; + # endif//__use_timers + + } + else + { + /*-------------------- multiple-part: thread-parallel */ + + # ifdef __use_timers + _ttic = _time.now() ; + # endif//__use_timers + + auto _pi = std::atan(+1.) * +4. ; + + if (_isub == +0) + part_mesh(_mesh, _part._full, _pful, + _aset, + _isub, _pi*0,_tcpu) ; + + _pbnd =(iptr_type)( + _part._full._seqs.count() / + BNDS_SCAL ) ; + _pbnd = std::min( + _opts. nprt(), _pbnd + 1) ; + + if (_isub == +0) + part_mesh(_mesh, _part._bnds, _pbnd, + _part. _full._seqs, + _isub, _pi/4,_tcpu) ; + + # ifdef __use_timers + _ttoc = _time.now() ; + _tcpu._part_node += _tcpu.time_span(_ttic, _ttoc) ; + # endif//__use_timers + + /*-------------------- SYMMETRIC GAUSS-SEIDEL on CELL */ + + if (_opts .tria()) // 1=>GS, 2=>SGS + { + /*--------------------------------- purely sequential */ + # ifdef __use_timers + _ttic = _time.now() ; + # endif//__use_timers + + for (auto _apos = + _part._bnds._seqs.head(); + _apos != + _part._bnds._seqs.tend(); + _apos += +1) + { + move_task()(_geom, _mesh,*_apos, + _hfun , _hval, + _CONN , _kern, _last, + _nset , _mark, + _iout , _opts, + _conn , _qold, _qnew, _QLIM, + _QMOV , _tcpu) ; + } + + # ifdef __use_timers + _ttoc = _time.now() ; + _tcpu._seqs_node += _tcpu.time_span(_ttic, _ttoc) ; + _tcpu._core_node += _tcpu.time_span(_ttic, _ttoc) ; + # endif//__use_timers + + /*--------------------------------- parallel on outer */ + # ifdef __use_timers + _ttic = _time.now() ; + # endif//__use_timers + + # ifdef __use_openmp + omp_set_num_threads( + (int)_part._bnds._lptr.count()-1) ; + # endif//__use_openmp + + # pragma omp parallel default(none) \ + shared(_part, _geom, _mesh, \ + _hfun, _hval, \ + _CONN, _kern, _last, \ + _nset, _mark, \ + _iout, _isub, _opts, \ + _QLIM, _QMOV, _tcpu) + { + conn_list _CSET; // thread-local arrays + real_list _QOLD, _QNEW; + iptr_list _NSET; + iptr_type _pass = 0u ; + iptr_type _anum; + # pragma omp for nowait schedule(static,1) + for (auto _rank = 0u ; + _rank < + _part._bnds._lptr.count()-1; ++_rank) + { + for (auto _apos = PBEG(_part. _bnds, + _pass, _rank) ; + _apos != PEND(_part. _bnds, + _pass, _rank) ; + _apos += ITER(_pass) ) + { + _anum = _part._bnds._list [_apos] ; + + if (_part._bnds._part[_anum] < 0) + continue ; // skip if interface + + move_task()(_geom, _mesh, _anum, + _hfun , _hval, + _CONN , _kern, _last, + _NSET , _mark, + _iout , _opts, + _CSET , _QOLD, _QNEW, _QLIM, + _QMOV , _tcpu) ; + } + } + + # pragma omp for ordered schedule(static,1) + for (auto _rank = 0u ; + _rank < + _part._bnds._lptr.count()-1; ++_rank) + { + # pragma omp ordered + { + _nset.push_tail( + _NSET.head(), _NSET.tend()); + } + } + } + + /*--------------------------------- parallel on inner */ + # ifdef __use_openmp + omp_set_num_threads( + (int)_part._full._lptr.count()-1) ; + # endif//__use_openmp + + # pragma omp parallel default(none) \ + shared(_part, _geom, _mesh, \ + _hfun, _hval, \ + _CONN, _kern, _last, \ + _nset, _mark, \ + _iout, _isub, _opts, \ + _QLIM, _QMOV, _tcpu) + { + conn_list _CSET; // thread-local arrays + real_list _QOLD, _QNEW; + iptr_list _NSET; + iptr_type _anum; + # pragma omp for nowait schedule(static,1) + for (auto _rank = 0u ; + _rank < + _part._full._lptr.count()-1; ++_rank) + { + for (auto _pass = 0; _pass < 2; ++_pass) + for (auto _apos = PBEG(_part. _full, + _pass, _rank) ; + _apos != PEND(_part. _full, + _pass, _rank) ; + _apos += ITER(_pass) ) + { + _anum = _part._full._list [_apos] ; + + if (_part._full._part[_anum] < 0) + continue ; // skip if interface + + move_task()(_geom, _mesh, _anum, + _hfun , _hval, + _CONN , _kern, _last, + _NSET , _mark, + _iout , _opts, + _CSET , _QOLD, _QNEW, _QLIM, + _QMOV , _tcpu) ; + } + } + + # pragma omp for ordered schedule(static,1) + for (auto _rank = 0u ; + _rank < + _part._full._lptr.count()-1; ++_rank) + { + # pragma omp ordered + { + _nset.push_tail( + _NSET.head(), _NSET.tend()); + } + } + } + + /*--------------------------------- parallel on outer */ + # ifdef __use_openmp + omp_set_num_threads( + (int)_part._bnds._lptr.count()-1) ; + # endif//__use_openmp + + # pragma omp parallel default(none) \ + shared(_part, _geom, _mesh, \ + _hfun, _hval, \ + _CONN, _kern, _last, \ + _nset, _mark, \ + _iout, _isub, _opts, \ + _QLIM, _QMOV, _tcpu) + { + conn_list _CSET; // thread-local arrays + real_list _QOLD, _QNEW; + iptr_list _NSET; + iptr_type _pass = 1u ; + iptr_type _anum; + # pragma omp for nowait schedule(static,1) + for (auto _rank = 0u ; + _rank < + _part._bnds._lptr.count()-1; ++_rank) + { + for (auto _apos = PBEG(_part. _bnds, + _pass, _rank) ; + _apos != PEND(_part. _bnds, + _pass, _rank) ; + _apos += ITER(_pass) ) + { + _anum = _part._bnds._list [_apos] ; + + if (_part._bnds._part[_anum] < 0) + continue ; // skip if interface + + move_task()(_geom, _mesh, _anum, + _hfun , _hval, + _CONN , _kern, _last, + _NSET , _mark, + _iout , _opts, + _CSET , _QOLD, _QNEW, _QLIM, + _QMOV , _tcpu) ; + } + } + + # pragma omp for ordered schedule(static,1) + for (auto _rank = 0u ; + _rank < + _part._bnds._lptr.count()-1; ++_rank) + { + # pragma omp ordered + { + _nset.push_tail( + _NSET.head(), _NSET.tend()); + } + } + } + + # ifdef __use_timers + _ttoc = _time.now() ; + _tcpu._para_node += _tcpu.time_span(_ttic, _ttoc) ; + _tcpu._core_node += _tcpu.time_span(_ttic, _ttoc) ; + # endif//__use_timers + + /*--------------------------------- purely sequential */ + # ifdef __use_timers + _ttic = _time.now() ; + # endif//__use_timers + + for (auto _apos = + _part._bnds._seqs.tail(); + _apos != + _part._bnds._seqs.hend(); + _apos += -1) + { + move_task()(_geom, _mesh,*_apos, + _hfun , _hval, + _CONN , _kern, _last, + _nset , _mark, + _iout , _opts, + _conn , _qold, _qnew, _QLIM, + _QMOV , _tcpu) ; + } + + # ifdef __use_timers + _ttoc = _time.now() ; + _tcpu._seqs_node += _tcpu.time_span(_ttic, _ttoc) ; + _tcpu._core_node += _tcpu.time_span(_ttic, _ttoc) ; + # endif//__use_timers + + } //if opts.tria + + } //if _nptr > 1 + + # undef MARK + # undef SBEG + # undef SEND + # undef PBEG + # undef PEND + # undef ITER + } + + /* + -------------------------------------------------------- + * MOVE-DUAL: do a single dual smoothing pass. + -------------------------------------------------------- + */ + + __static_call + __normal_call void_type move_dual ( + geom_type &_geom , // geometry object + mesh_type &_mesh , // mesh object + conn_sets &_CONN , // cached node adj. indexing + hfun_type &_hfun , // spacing object + real_list &_hval , // cached node spacing array + real_list &_last , // lagged line direction + iptr_list &_nset , // list of nodes active + iptr_list &_aset , // space for new active list + mark_list &_mark , // sets of node/cell flags + part_data &_part , // mesh parallel partition + iptr_type _iout , // outer iteration marker + iptr_type _isub , // inner iteration marker + iter_opts &_opts , // user options + real_type _QLIM , // cell quality threshold + real_type _QMOV , + real_type _DLIM , // dual quality threshold + real_type _DMOV , + iter_stat &_tcpu // CPU timers/info + ) + { + # define MARK(_NODE) _mark._node[_NODE] + + class move_task // inner loop: MOVE-DUAL + { + public : + __inline_call void operator() ( + geom_type &_geom , // geometry object + mesh_type &_mesh , // mesh object + iptr_type _apos , // index of node to update + hfun_type &_hfun , // spacing object + real_list &_hval , // cached node spacing array + conn_sets &_CONN , // cached node adj. indexing + real_list &_last , // lagged line direction + iptr_list &_nset , // list of nodes active + mark_list &_mark , // sets of node/cell flags + iptr_type _iout , // outer iteration marker + iter_opts &_opts , // user options + conn_list &_conn , // space for connectivity + real_list &_dold , // space for adj. costs + real_list &_dnew , // space for adj. costs + real_type _DLIM , // dual quality threshold + real_type _DMOV , + iter_stat &_tcpu // CPU timers/info + ) const + { + /*---------------- apply single move-dual updates */ + auto _node = + _mesh.node().head()+ _apos ; + + /*---------------- assemble a local tria. stencil */ + _conn.set_count( +0) ; + _conn.push_tail( + _CONN._adj2.head()+_CONN._idx2[_apos+0], + _CONN._adj2.head()+_CONN._idx2[_apos+1] + ) ; + + if (_conn.empty() ) return ; + + /*---------------- attempt to optimise DUAL geom. */ + _dold.set_count( +0) ; + _dnew.set_count( +0) ; + + real_type _DMIN = + loop_cost( _mesh, + _conn, _dold, dual_kind()); + + iptr_type _move = -1 ; + + if (_move < +0 ) + { + /*---------------- do optimisation of node weight */ + move_dual( _geom, _mesh, + _hfun, _hval, + _opts, _node, + _last[ _apos] , + _move, _conn, + _dold, _dnew, + _DMIN, _DLIM, _DMOV, + _tcpu) ; + } + + if (_move > +0 ) + { + /*---------------- update when state is improving */ + if (std::abs( + MARK( _apos )) !=_iout) + { + if (MARK( _apos ) >= 0) + MARK( _apos ) = +_iout; + else + MARK( _apos ) = -_iout; + + // pragma omp critical(NS) + { + _nset.push_tail (_apos) ; + } + } + + } + } + } ; + + iptr_type constexpr PART_SCAL = +32 ; + iptr_type constexpr BNDS_SCAL = 4096; + + # define SBEG(_PASS)(_PASS == +0 ? \ + _aset.head() : _aset.tail()) + + # define SEND(_PASS)(_PASS == +0 ? \ + _aset.tend() : _aset.hend()) + + # define PBEG(_PART, _PASS, _RANK)( \ + _PASS == +0 ? \ + _PART._lptr[_RANK + 0] + 0 : \ + _PART._lptr[_RANK + 1] - 1) + + # define PEND(_PART, _PASS, _RANK)( \ + _PASS == +0 ? \ + _PART._lptr[_RANK + 1] + 0 : \ + _PART._lptr[_RANK + 0] - 1) + + # define ITER(_PASS)(_PASS == +0 ? +1 : -1) + + iptr_type _pful, _pbnd; + conn_list _conn; + real_list _dold, _dnew; + + # ifdef __use_timers + typename std ::chrono:: + high_resolution_clock::time_point _ttic ; + typename std ::chrono:: + high_resolution_clock::time_point _ttoc ; + typename std ::chrono:: + high_resolution_clock _time ; + + __unreferenced(_time) ; // why does MSVC need this?? + # endif//__use_timers + + /*-------------------- permute nodes for optimisation */ + + # ifdef __use_timers + _ttic = _time.now() ; + # endif//__use_timers + + if (_isub == +0) + sort_node( _mesh, _CONN, _aset, + _mark. _node, + _iout, _isub, _QLIM, _QMOV, _DLIM, _DMOV, + _opts) ; + + _pful =(iptr_type)( + std::sqrt(_aset.count ()) / + PART_SCAL ) ; + _pful = std::min( + _opts. nprt(), _pful + 1) ; + + # ifdef __use_timers + _ttoc = _time.now() ; + _tcpu._init_dual += _tcpu.time_span(_ttic, _ttoc) ; + # endif//__use_timers + + if (_pful <= +1 ) + { + /*-------------------- single part: sequential scheme */ + + # ifdef __use_timers + _ttic = _time.now() ; + # endif//__use_timers + + /*-------------------- SYMMETRIC GAUSS-SEIDEL on DUAL */ + + if (_opts .dual()) // 1=>GS, 2=>SGS + { + for (auto _pass = 0; _pass < 2; ++_pass) + for (auto _apos = SBEG(_pass) ; + _apos != SEND(_pass) ; + _apos += ITER(_pass) ) + { + move_task()(_geom, _mesh,*_apos, + _hfun , _hval, + _CONN , _last, + _nset , _mark, + _iout , _opts, + _conn , _dold, _dnew, _DLIM, + _DMOV , _tcpu) ; + } + } + + # ifdef __use_timers + _ttoc = _time.now() ; + _tcpu._core_dual += _tcpu.time_span(_ttic, _ttoc) ; + # endif//__use_timers + + } + else + { + /*-------------------- multiple-part: thread-parallel */ + + # ifdef __use_timers + _ttic = _time.now() ; + # endif//__use_timers + + auto _pi = std::atan(+1.) * +4. ; + + if (_isub == +0) + part_mesh(_mesh, _part._full, _pful, + _aset, + _isub, _pi*0,_tcpu) ; + + _pbnd =(iptr_type)( + _part._full._seqs.count() / + BNDS_SCAL ) ; + _pbnd = std::min( + _opts. nprt(), _pbnd + 1) ; + + if (_isub == +0) + part_mesh(_mesh, _part._bnds, _pbnd, + _part. _full._seqs, + _isub, _pi/4,_tcpu) ; + + # ifdef __use_timers + _ttoc = _time.now() ; + _tcpu._part_dual += _tcpu.time_span(_ttic, _ttoc) ; + # endif//__use_timers + + /*-------------------- SYMMETRIC GAUSS-SEIDEL on DUAL */ + + if (_opts .dual()) // 1=>GS, 2=>SGS + { + /*--------------------------------- purely sequential */ + # ifdef __use_timers + _ttic = _time.now() ; + # endif//__use_timers + + for (auto _apos = + _part._bnds._seqs.head(); + _apos != + _part._bnds._seqs.tend(); + _apos += +1) + { + move_task()(_geom, _mesh,*_apos, + _hfun , _hval, + _CONN , _last, + _nset , _mark, + _iout , _opts, + _conn , _dold, _dnew, _DLIM, + _DMOV , _tcpu) ; + } + + # ifdef __use_timers + _ttoc = _time.now() ; + _tcpu._seqs_dual += _tcpu.time_span(_ttic, _ttoc) ; + _tcpu._core_dual += _tcpu.time_span(_ttic, _ttoc) ; + # endif//__use_timers + + /*--------------------------------- parallel on outer */ + # ifdef __use_timers + _ttic = _time.now() ; + # endif//__use_timers + + # ifdef __use_openmp + omp_set_num_threads( + (int)_part._bnds._lptr.count()-1) ; + # endif//__use_openmp + + # pragma omp parallel default(none) \ + shared(_part, _geom, _mesh, \ + _hfun, _hval, \ + _CONN, _last, \ + _nset, _mark, \ + _iout, _isub, _opts, \ + _DLIM, _DMOV, _tcpu) + { + conn_list _CSET; // thread-local arrays + real_list _DOLD, _DNEW; + iptr_list _NSET; + iptr_type _pass = 0u ; + iptr_type _anum; + # pragma omp for nowait schedule(static,1) + for (auto _rank = 0u ; + _rank < + _part._bnds._lptr.count()-1; ++_rank) + { + for (auto _apos = PBEG(_part. _bnds, + _pass, _rank) ; + _apos != PEND(_part. _bnds, + _pass, _rank) ; + _apos += ITER(_pass) ) + { + _anum = _part._bnds._list [_apos] ; + + if (_part._bnds._part[_anum] < 0) + continue ; // skip if interface + + move_task()(_geom, _mesh, _anum, + _hfun , _hval, + _CONN , _last, + _NSET , _mark, + _iout , _opts, + _CSET , _DOLD, _DNEW, _DLIM, + _DMOV , _tcpu) ; + } + } + + # pragma omp for ordered schedule(static,1) + for (auto _rank = 0u ; + _rank < + _part._bnds._lptr.count()-1; ++_rank) + { + # pragma omp ordered + { + _nset.push_tail( + _NSET.head(), _NSET.tend()); + } + } + } + + /*--------------------------------- parallel on inner */ + # ifdef __use_openmp + omp_set_num_threads( + (int)_part._full._lptr.count()-1) ; + # endif//__use_openmp + + # pragma omp parallel default(none) \ + shared(_part, _geom, _mesh, \ + _hfun, _hval, \ + _CONN, _last, \ + _nset, _mark, \ + _iout, _isub, _opts, \ + _DLIM, _DMOV, _tcpu) + { + conn_list _CSET; // thread-local arrays + real_list _DOLD, _DNEW; + iptr_list _NSET; + iptr_type _anum; + # pragma omp for nowait schedule(static,1) + for (auto _rank = 0u ; + _rank < + _part._full._lptr.count()-1; ++_rank) + { + for (auto _pass = 0; _pass < 2; ++_pass) + for (auto _apos = PBEG(_part. _full, + _pass, _rank) ; + _apos != PEND(_part. _full, + _pass, _rank) ; + _apos += ITER(_pass) ) + { + _anum = _part._full._list [_apos] ; + + if (_part._full._part[_anum] < 0) + continue ; // skip if interface + + move_task()(_geom, _mesh, _anum, + _hfun , _hval, + _CONN , _last, + _NSET , _mark, + _iout , _opts, + _CSET , _DOLD, _DNEW, _DLIM, + _DMOV , _tcpu) ; + } + } + + # pragma omp for ordered schedule(static,1) + for (auto _rank = 0u ; + _rank < + _part._full._lptr.count()-1; ++_rank) + { + # pragma omp ordered + { + _nset.push_tail( + _NSET.head(), _NSET.tend()); + } + } + } + + /*--------------------------------- parallel on outer */ + # ifdef __use_openmp + omp_set_num_threads( + (int)_part._bnds._lptr.count()-1) ; + # endif//__use_openmp + + # pragma omp parallel default(none) \ + shared(_part, _geom, _mesh, \ + _hfun, _hval, \ + _CONN, _last, \ + _nset, _mark, \ + _iout, _isub, _opts, \ + _DLIM, _DMOV, _tcpu) + { + conn_list _CSET; // thread-local arrays + real_list _DOLD, _DNEW; + iptr_list _NSET; + iptr_type _pass = 1u ; + iptr_type _anum; + # pragma omp for nowait schedule(static,1) + for (auto _rank = 0u ; + _rank < + _part._bnds._lptr.count()-1; ++_rank) + { + for (auto _apos = PBEG(_part. _bnds, + _pass, _rank) ; + _apos != PEND(_part. _bnds, + _pass, _rank) ; + _apos += ITER(_pass) ) + { + _anum = _part._bnds._list [_apos] ; + + if (_part._bnds._part[_anum] < 0) + continue ; // skip if interface + + move_task()(_geom, _mesh, _anum, + _hfun , _hval, + _CONN , _last, + _NSET , _mark, + _iout , _opts, + _CSET , _DOLD, _DNEW, _DLIM, + _DMOV , _tcpu) ; + } + } + + # pragma omp for ordered schedule(static,1) + for (auto _rank = 0u ; + _rank < + _part._bnds._lptr.count()-1; ++_rank) + { + # pragma omp ordered + { + _nset.push_tail( + _NSET.head(), _NSET.tend()); + } + } + } + + # ifdef __use_timers + _ttoc = _time.now() ; + _tcpu._para_dual += _tcpu.time_span(_ttic, _ttoc) ; + _tcpu._core_dual += _tcpu.time_span(_ttic, _ttoc) ; + # endif//__use_timers + + /*--------------------------------- purely sequential */ + # ifdef __use_timers + _ttic = _time.now() ; + # endif//__use_timers + + for (auto _apos = + _part._bnds._seqs.tail(); + _apos != + _part._bnds._seqs.hend(); + _apos += -1) + { + move_task()(_geom, _mesh,*_apos, + _hfun , _hval, + _CONN , _last, + _nset , _mark, + _iout , _opts, + _conn , _dold, _dnew, _DLIM, + _DMOV , _tcpu) ; + } + + # ifdef __use_timers + _ttoc = _time.now() ; + _tcpu._seqs_dual += _tcpu.time_span(_ttic, _ttoc) ; + _tcpu._core_dual += _tcpu.time_span(_ttic, _ttoc) ; + # endif//__use_timers + + } //if opts.dual + + } //if _nptr > 1 + + # undef MARK + # undef SBEG + # undef SEND + # undef PBEG + # undef PEND + # undef ITER + } + + + diff --git a/external/jigsaw/src/libcpp/iter_mesh/part_mesh_2.inc b/external/jigsaw/src/libcpp/iter_mesh/part_mesh_2.inc new file mode 100644 index 0000000..7a6ca27 --- /dev/null +++ b/external/jigsaw/src/libcpp/iter_mesh/part_mesh_2.inc @@ -0,0 +1,395 @@ + + /* + -------------------------------------------------------- + * PART-MESH-2: form dynamic parallel partitions. + -------------------------------------------------------- + * + * This program may be freely redistributed under the + * condition that the copyright notices (including this + * entire header) are not removed, and no compensation + * is received through use of the software. Private, + * research, and institutional use is free. You may + * distribute modified versions of this code UNDER THE + * CONDITION THAT THIS CODE AND ANY MODIFICATIONS MADE + * TO IT IN THE SAME FILE REMAIN UNDER COPYRIGHT OF THE + * ORIGINAL AUTHOR, BOTH SOURCE AND OBJECT CODE ARE + * MADE FREELY AVAILABLE WITHOUT CHARGE, AND CLEAR + * NOTICE IS GIVEN OF THE MODIFICATIONS. Distribution + * of this code as part of a commercial system is + * permissible ONLY BY DIRECT ARRANGEMENT WITH THE + * AUTHOR. (If you are not directly supplying this + * code to a customer, and you are instead telling them + * how they can obtain it for free, then you are not + * required to make any arrangement with me.) + * + * Disclaimer: Neither I nor THE CONTRIBUTORS warrant + * this code in any way whatsoever. This code is + * provided "as-is" to be used at your own risk. + * + * THE CONTRIBUTORS include: + * (a) The University of Sydney + * (b) The Massachusetts Institute of Technology + * (c) Columbia University + * (d) The National Aeronautics & Space Administration + * (e) Los Alamos National Laboratory + * + -------------------------------------------------------- + * + * Last updated: 23 Dec., 2022 + * + * Copyright 2013-2022 + * Marc Tunnell, + * Darren Engwirda + * d.engwirda@gmail.com + * https://github.com/dengwirda/ + * + -------------------------------------------------------- + */ + + // from iter_mesh_2.hpp + + + __static_call + __normal_call void_type part_mesh ( + mesh_type &_mesh, // full mesh obj. + part_sets &_part, // partition data-structure + iptr_type _nprt, // number of partitions to make + iptr_list _aset, // list of active nodes + iptr_type _isub, // inner iteration marker + real_type _arot, + iter_stat &_tcpu // CPU timers/info + ) + { + # define PUSH_BNDS( _PNUM ) \ + __isflip(_PNUM) ? _PNUM : __doflip(_PNUM) + + # define PART_LIMS( _PNUM ) \ + if (_PNUM != -1) \ + { \ + _have += +1 ; \ + _pmin = std::min( \ + _pmin, __unflip(_PNUM)); \ + _pmax = std::max( \ + _pmax, __unflip(_PNUM)); \ + } + + # ifdef __use_timers + typename std ::chrono:: + high_resolution_clock::time_point _ttic; + typename std ::chrono:: + high_resolution_clock::time_point _ttoc; + typename std ::chrono:: + high_resolution_clock _time ; + + __unreferenced(_time) ; // why does MSVC need this?? + # endif//__use_timers + + __unreferenced(_isub) ; + + if (_nprt > +1) + { + /*------ define AABB-tree for recursive partition */ + # ifdef __use_timers + _ttic = _time.now() ; + # endif//__use_timers + + typedef geom_tree::aabb_item_node_k < + real_type, + iptr_type, + pred_type::geom_dims> tree_item ; + + typedef geom_tree::aabb_tree< + tree_item, + pred_type::geom_dims> tree_type ; + + tree_type _tree; + + iptr_type _npop = // no. nodes per partition + (iptr_type)((8 * _aset.count()) / _nprt / 3) ; + + /*-------------------- populate tree: xyz + index */ + containers::array _item ; + for (auto _apos = _aset.tail() ; + _apos != _aset.hend() ; + --_apos ) // backward maintains sort? + { + auto _aptr = + _mesh.node().head() + *_apos; + + if (_aptr->mark() >= 0 && + (_aptr->ndeg(TRIA3_tag) > 0 || + _aptr->ndeg(QUAD4_tag) > 0 )) + { + _item.push_tail(); + _item.tail()->ipos() = *_apos; + + if (geom_dims == 2) + { + /*-------------------- rotate to stop realignment */ + real_type _xcos = std::cos (_arot) ; + real_type _xsin = std::sin (_arot) ; + + real_type _xmat[2][2]; // 2d rotation + _xmat[0][0] = +_xcos ; + _xmat[0][1] = -_xsin ; + _xmat[1][0] = +_xsin ; + _xmat[1][1] = +_xcos ; + + _item.tail()->pval(0) = + _xmat[0][0] * _aptr->pval(0) + + _xmat[0][1] * _aptr->pval(1) ; + _item.tail()->pval(1) = + _xmat[1][0] * _aptr->pval(0) + + _xmat[1][1] * _aptr->pval(1) ; + } + else + if (geom_dims == 3) + { + /*-------------------- rotate to stop realignment */ + real_type _xcos = std::cos (_arot) ; + real_type _xsin = std::sin (_arot) ; + + real_type _xmat[3][3]; // 3d rotation + _xmat[0][0] = +1. ; + _xmat[0][1] = +1. - _xcos - _xsin; + _xmat[0][2] = +1. - _xcos + _xsin; + _xmat[1][0] = +1. - _xcos + _xsin; + _xmat[1][1] = +1. ; + _xmat[1][2] = +1. - _xcos - _xsin; + _xmat[2][0] = +1. - _xcos - _xsin; + _xmat[2][1] = +1. - _xcos + _xsin; + _xmat[2][2] = +1. ; + + _item.tail()->pval(0) = + _xmat[0][0] * _aptr->pval(0) + + _xmat[0][1] * _aptr->pval(1) + + _xmat[0][2] * _aptr->pval(2) ; + _item.tail()->pval(1) = + _xmat[1][0] * _aptr->pval(0) + + _xmat[1][1] * _aptr->pval(1) + + _xmat[1][2] * _aptr->pval(2) ; + _item.tail()->pval(2) = + _xmat[2][0] * _aptr->pval(0) + + _xmat[2][1] * _aptr->pval(1) + + _xmat[2][2] * _aptr->pval(2) ; + } + } + } + + /*-------------------- split: npop nodes per leaf */ + _tree.load( + _item.head(), _item.tend(), + _npop , // pop. threshold, for leaf div. + _tree.median_split , + +1.0 , // set LONG=1, only div. by pop. + +0.0) ; // set VTOL=0, only div. by pop. + + /*-------------------- form sparse lists for part */ + + // LIST[LPTR[K]:LPTR[K+1]-1]: list of nodes that + // comprise the K-th partition + + _part._lptr.clear() ; + _part._list.clear() ; + _part._part.clear() ; + _part._seqs.clear() ; + + _tree.dcmp(_part._lptr,_part._list) ; + + # ifdef __use_timers + _ttoc = _time.now() ; + _tcpu._tree_part += + _tcpu.time_span(_ttic, _ttoc) ; + _tcpu._full_part += + _tcpu.time_span(_ttic, _ttoc) ; + # endif//__use_timers + + /*-------------------- and build reverse indexing */ + # ifdef __use_timers + _ttic = _time.now() ; + # endif//__use_timers + + _part._part.set_count( + _mesh.node().count(), + containers::loose_alloc, -1) ; + + // PART[J] = K: the partition for J-th mesh node + + for (auto + _lnum = _part._lptr.count() - 1 ; + _lnum-- != 0 ; ) + { + for (auto _iptr = _part._lptr[_lnum+0]; + _iptr < _part._lptr[_lnum+1]; + ++_iptr ) + _part._part[ + _part._list[_iptr]] = (iptr_type) _lnum ; + } + + // PART[J] =-1: the J-th node is on an interface + + for (auto _tria = _mesh.tri3().head() ; + _tria != _mesh.tri3().tend() ; + ++_tria ) + { + if (_tria->mark() >= +0) + { + /*-------------- interface if cell straddles part */ + iptr_type _inod, _jnod, _knod; + _inod = _tria->node( 0); + _jnod = _tria->node( 1); + _knod = _tria->node( 2); + + iptr_type _have = 0; + iptr_type _pmin = + std::numeric_limits::max() ; + iptr_type _pmax = + std::numeric_limits::min() ; + + PART_LIMS(_part._part[_inod]); + PART_LIMS(_part._part[_jnod]); + PART_LIMS(_part._part[_knod]); + + if (_have==0 || _pmin == _pmax) + continue ; + + _part._part[_inod] = PUSH_BNDS ( + _part._part[_inod]); + _part._part[_jnod] = PUSH_BNDS ( + _part._part[_jnod]); + _part._part[_knod] = PUSH_BNDS ( + _part._part[_knod]); + } + } + + for (auto _quad = _mesh.quad().head() ; + _quad != _mesh.quad().tend() ; + ++_quad ) + { + if (_quad->mark() >= +0) + { + /*-------------- interface if cell straddles part */ + iptr_type _inod, _jnod, _knod, + _lnod; + _inod = _quad->node( 0); + _jnod = _quad->node( 1); + _knod = _quad->node( 2); + _lnod = _quad->node( 3); + + iptr_type _have = 0; + iptr_type _pmin = + std::numeric_limits::max() ; + iptr_type _pmax = + std::numeric_limits::min() ; + + PART_LIMS(_part._part[_inod]); + PART_LIMS(_part._part[_jnod]); + PART_LIMS(_part._part[_knod]); + PART_LIMS(_part._part[_lnod]); + + if (_have==0 || _pmin == _pmax) + continue ; + + _part._part[_inod] = PUSH_BNDS ( + _part._part[_inod]); + _part._part[_jnod] = PUSH_BNDS ( + _part._part[_jnod]); + _part._part[_knod] = PUSH_BNDS ( + _part._part[_knod]); + _part._part[_lnod] = PUSH_BNDS ( + _part._part[_lnod]); + } + } + + # ifdef __use_timers + _ttoc = _time.now() ; + _tcpu._part_part += + _tcpu.time_span(_ttic, _ttoc) ; + _tcpu._full_part += + _tcpu.time_span(_ttic, _ttoc) ; + # endif//__use_timers + + /*-------------- add interface to sequential list */ + # ifdef __use_timers + _ttic = _time.now() ; + # endif//__use_timers + + for (auto _apos = _aset.head() ; + _apos != _aset.tend() ; + ++_apos ) // aset sweep ensures sort + { + if (_part._part[*_apos] < -1) + { + _part._seqs.push_tail(*_apos); + } + } + + # ifdef __use_timers + _ttoc = _time.now() ; + _tcpu._seqs_part += + _tcpu.time_span(_ttic, _ttoc) ; + _tcpu._full_part += + _tcpu.time_span(_ttic, _ttoc) ; + # endif//__use_timers + } + else + { + /*-------------- dummy part lists for single part */ + # ifdef __use_timers + _ttic = _time.now() ; + # endif//__use_timers + + _part._lptr.set_count(+2); + _part._list.set_alloc(_aset.count()) ; + _part._part.set_count( + _mesh.node().count(), + containers::loose_alloc, +0) ; + + _part._lptr[0] = +0; + _part._lptr[1] = _aset.count() ; + _part._list.push_tail( + _aset.head(), _aset.tend()); + + # ifdef __use_timers + _ttoc = _time.now() ; + _tcpu._seqs_part += + _tcpu.time_span(_ttic, _ttoc) ; + _tcpu._full_part += + _tcpu.time_span(_ttic, _ttoc) ; + # endif//__use_timers + } + + /* + iptr_type _ipos = +0; + for (auto _iter = _mesh.node().head(); + _iter != _mesh.node().tend(); + ++_iter, ++_ipos) + { + // just for debug: output part idx. to node itag + if (_iter->mark() >= 0) + { + _iter->itag() = _part._part[_ipos]; + } + } + + iptr_type _pmin = + std::numeric_limits::max(); + iptr_type _pmax = + std::numeric_limits::min(); + for (auto _rank = 0u ; + _rank<_part._lptr.count()-1; ++_rank) + { + // just for debug: output min/max sizes of part's + iptr_type _size = + _part._lptr[_rank+1] - + _part._lptr[_rank+0] ; + _pmin = std::min(_pmin, _size); + _pmax = std::max(_pmax, _size); + } + std::cout << _pmin << ", " << _pmax << std::endl; + */ + + # undef PART_LIMS + # undef PUSH_BNDS + } + diff --git a/external/jigsaw/src/libcpp/iter_mesh/sort_mesh_2.inc b/external/jigsaw/src/libcpp/iter_mesh/sort_mesh_2.inc new file mode 100644 index 0000000..7286b29 --- /dev/null +++ b/external/jigsaw/src/libcpp/iter_mesh/sort_mesh_2.inc @@ -0,0 +1,367 @@ + + /* + -------------------------------------------------------- + * SORT-MESH-2: greedy ordering for mesh optim. + -------------------------------------------------------- + * + * This program may be freely redistributed under the + * condition that the copyright notices (including this + * entire header) are not removed, and no compensation + * is received through use of the software. Private, + * research, and institutional use is free. You may + * distribute modified versions of this code UNDER THE + * CONDITION THAT THIS CODE AND ANY MODIFICATIONS MADE + * TO IT IN THE SAME FILE REMAIN UNDER COPYRIGHT OF THE + * ORIGINAL AUTHOR, BOTH SOURCE AND OBJECT CODE ARE + * MADE FREELY AVAILABLE WITHOUT CHARGE, AND CLEAR + * NOTICE IS GIVEN OF THE MODIFICATIONS. Distribution + * of this code as part of a commercial system is + * permissible ONLY BY DIRECT ARRANGEMENT WITH THE + * AUTHOR. (If you are not directly supplying this + * code to a customer, and you are instead telling them + * how they can obtain it for free, then you are not + * required to make any arrangement with me.) + * + * Disclaimer: Neither I nor THE CONTRIBUTORS warrant + * this code in any way whatsoever. This code is + * provided "as-is" to be used at your own risk. + * + * THE CONTRIBUTORS include: + * (a) The University of Sydney + * (b) The Massachusetts Institute of Technology + * (c) Columbia University + * (d) The National Aeronautics & Space Administration + * (e) Los Alamos National Laboratory + * + -------------------------------------------------------- + * + * Last updated: 18 Dec., 2022 + * + * Copyright 2013-2022 + * Darren Engwirda, + * Marc Tunnell + * d.engwirda@gmail.com + * https://github.com/dengwirda/ + * + -------------------------------------------------------- + */ + + // from iter_mesh_2.hpp + + + /* + -------------------------------------------------------- + * PULL-CONN: cache node-to-cell adjacency lists. + -------------------------------------------------------- + */ + + __static_call + __normal_call void_type pull_conn ( + mesh_type &_mesh , // mesh object + iptr_list &_aset , // list of nodes active + iptr_list &_amrk , // >= 0 if nodes active + conn_sets &_conn // cached node spacing array + ) + { + _conn._adj1.set_count( +0 ) ; + _conn._idx1.set_count( + _mesh.node().count() + 1, + containers::tight_alloc , +0 ) ; + + _conn._adj2.set_count( +0 ) ; + _conn._idx2.set_count( + _mesh.node().count() + 1, + containers::tight_alloc , +0 ) ; + + auto _scal = + ((double)_aset.count()) / + _mesh.node().count() ; + + _conn._adj1.set_alloc( + (size_t)(_scal * ( + _mesh.edge().count() * 2) ) ) ; + _conn._adj2.set_alloc( + (size_t)(_scal * ( + _mesh.tri3().count() * 3 + + _mesh.quad().count() * 4) ) ) ; + + iptr_type _npos = +0 ; + for (auto _node = _mesh.node().head() ; + _node != _mesh.node().tend() ; + ++_node, ++_npos) + { + if (_node->mark() >= 0 && + _amrk[_npos ] >= 0) + { + /*-------------------- append adj. lists per node */ + _mesh.connect_1( + _npos, POINT_tag, _conn._adj1) ; + + _conn._idx1[_npos+1] = + _conn._adj1.count() ; + + _mesh.connect_2( + _npos, POINT_tag, _conn._adj2) ; + + _conn._idx2[_npos+1] = + _conn._adj2.count() ; + } + else + { + /*-------------------- empty lists for null nodes */ + _conn._idx1[_npos+1] = + _conn._idx1[ _npos] ; + + _conn._idx2[_npos+1] = + _conn._idx2[ _npos] ; + } + } + } + + /* + -------------------------------------------------------- + * SORT-NODE: permutations for node optimisation. + -------------------------------------------------------- + */ + + __static_call + __normal_call void_type sort_node ( + mesh_type &_mesh , // mesh object + conn_sets &_CONN , // cached node adj. indexing + iptr_list &_aset , // list of nodes to try next + iptr_list &_nmrk , // sets of node flags + iptr_type _iout , // outer iteration marker + iptr_type _isub , // inner iteration marker + real_type _QLIM , // cell quality threshold + real_type _QMOV , + real_type _DLIM , // dual quality threshold + real_type _DMOV , + iter_opts &_opts // user options + ) + { + # define PUSHCOST(_NODE , _COST) \ + _qbar[_NODE] += _COST ; \ + _qmin[_NODE] = \ + std::min (_qmin[_NODE], _COST) ; + + class cost_pair + { + public : + /*------------------------ tuple for node re-ordering */ + iptr_type _node ; + float _cost ; + + /*------------------------ construct inline from src. */ + __inline_call cost_pair ( + iptr_type const&_nsrc , + real_type const&_csrc + ) : + _node (_nsrc), + _cost((float)_csrc) {} + } ; + + class cost_pred + { + public : + /*------------------------ less-than op. for cost-tup */ + __inline_call + bool_type operator () ( + cost_pair const&_idat , + cost_pair const&_jdat + ) const + { return _idat._cost > _jdat._cost ; + } + } ; + + typedef + containers::array cost_list ; + + real_list _qbar, _qmin, _cost ; + iptr_list _amrk ; + cost_list _sset ; + + __unreferenced ( _QMOV ) ; + __unreferenced ( _DMOV ) ; + __unreferenced ( _DLIM ) ; + __unreferenced ( _opts ) ; + __unreferenced ( _isub ) ; + + /*-------------------- 1ST SUB-ITER: build full init. */ + _qbar.set_count( + _mesh.node().count(), + containers::tight_alloc, +0.0) ; + _qmin.set_count( + _mesh.node().count(), + containers::tight_alloc, +1.0) ; + + _amrk.set_count( + _mesh.node().count(), + containers::tight_alloc, -1) ; + + # ifdef __use_openmp + omp_set_num_threads(_opts.nprt()) ; + # endif//__use_openmp + + _cost.set_count( + _mesh.tri3().count(), + containers::loose_alloc, +0.0) ; + + # pragma omp parallel for schedule(static) \ + default(none) \ + shared(_mesh, _cost) + for (auto _tpos = +0u ; + _tpos < _mesh.tri3().count() ; + ++_tpos ) + { + auto _tria = + _mesh.tri3().head() + _tpos; + + if (_tria->mark() >= +0) + { + /*-------------------- calc. min. scores at cells */ + _cost[_tpos] = + pred_type::tri3_cost ( + &_mesh .node( + _tria->node(0)).pval(0), + &_mesh .node( + _tria->node(1)).pval(0), + &_mesh .node( + _tria->node(2)).pval(0), + typename + pred_type::cell_kind ()) ; + } + } + + iptr_type _tpos = 0; + for (auto _tria = _mesh.tri3().head() ; + _tria != _mesh.tri3().tend() ; + ++_tria, ++_tpos) + { + if (_tria->mark() >= +0) + { + /*-------------------- dist. min. scores to nodes */ + iptr_type _inod, _jnod, _knod; + _inod = _tria->node( 0); + _jnod = _tria->node( 1); + _knod = _tria->node( 2); + + real_type _cval = _cost[_tpos] ; + + PUSHCOST( _inod, _cval ) + PUSHCOST( _jnod, _cval ) + PUSHCOST( _knod, _cval ) + } + } + + _cost.set_count( + _mesh.quad().count(), + containers::loose_alloc, +0.0) ; + + # pragma omp parallel for schedule(static) \ + default(none) \ + shared(_mesh, _cost) + for (auto _qpos = +0u ; + _qpos < _mesh.quad().count() ; + ++_qpos ) + { + auto _quad = + _mesh.quad().head() + _qpos; + + if (_quad->mark() >= +0) + { + /*-------------------- calc. min. scores at cells */ + _cost[_qpos] = + pred_type::quad_cost ( + &_mesh .node( + _quad->node(0)).pval(0), + &_mesh .node( + _quad->node(1)).pval(0), + &_mesh .node( + _quad->node(2)).pval(0), + &_mesh .node( + _quad->node(3)).pval(0), + typename + pred_type::cell_kind ()) ; + } + } + + iptr_type _qpos = 0; + for (auto _quad = _mesh.quad().head() ; + _quad != _mesh.quad().tend() ; + ++_quad, ++_qpos) + { + if (_quad->mark() >= +0) + { + /*-------------------- dist. min. scores to nodes */ + iptr_type _inod, _jnod, _knod, + _lnod; + _inod = _quad->node( 0); + _jnod = _quad->node( 1); + _knod = _quad->node( 2); + _lnod = _quad->node( 3); + + real_type _cval = _cost[_qpos] ; + + PUSHCOST( _inod, _cval ) + PUSHCOST( _jnod, _cval ) + PUSHCOST( _knod, _cval ) + PUSHCOST( _lnod, _cval ) + } + } + + iptr_type _FLAG = _iout - 2 ; // only "recent" + + _sset.set_alloc( + _mesh.node().count()) ; + + iptr_type _ipos = +0 ; + for (auto _node = _mesh.node().head() ; + _node != _mesh.node().tend() ; + ++_node, ++_ipos) + { + /*------------------------ assign score for each node */ + if (_node->mark() >= +0) + { + if (std::abs( + _nmrk[_ipos]) >= _FLAG || // recent + _qmin[_ipos] <= _QLIM ) // skewed + { + auto _nadj = + _node->ndeg(TRIA3_tag) + + _node->ndeg(QUAD4_tag) ; + + _nadj = std::max(1, _nadj) ; + + float _cval = + (float)_qbar[_ipos]/_nadj - + (float)_qmin[_ipos] ; + + _sset.push_tail ( + cost_pair(_ipos , _cval)) ; + } + } + } + + algorithms::qsort( _sset.head() , + _sset.tend() , + cost_pred () ) ; + + for (auto _iter = _sset.head() ; + _iter != _sset.tend() ; + ++_iter ) + { + /*------------------------ push sorted wrt. min.-cost */ + auto _spos = _iter->_node ; + _amrk[_spos] = _isub ; + _aset.push_tail(_spos) ; + } + + /*------------------------ cache adj. for active node */ + pull_conn( + _mesh, _aset, _amrk, _CONN) ; + + # undef PUSHCOST + } + + + diff --git a/external/jigsaw/src/libcpp/itermesh.hpp b/external/jigsaw/src/libcpp/itermesh.hpp index 61f373e..c9eed90 100644 --- a/external/jigsaw/src/libcpp/itermesh.hpp +++ b/external/jigsaw/src/libcpp/itermesh.hpp @@ -22,16 +22,20 @@ * how they can obtain it for free, then you are not * required to make any arrangement with me.) * - * Disclaimer: Neither I nor: Columbia University, The - * Massachusetts Institute of Technology, The - * University of Sydney, nor The National Aeronautics - * and Space Administration warrant this code in any - * way whatsoever. This code is provided "as-is" to be - * used at your own risk. + * Disclaimer: Neither I nor THE CONTRIBUTORS warrant + * this code in any way whatsoever. This code is + * provided "as-is" to be used at your own risk. + * + * THE CONTRIBUTORS include: + * (a) The University of Sydney + * (b) The Massachusetts Institute of Technology + * (c) Columbia University + * (d) The National Aeronautics & Space Administration + * (e) Los Alamos National Laboratory * ------------------------------------------------------------ * - * Last updated: 02 March, 2019 + * Last updated: 02 Mar., 2019 * * Copyright 2013-2019 * Darren Engwirda @@ -51,9 +55,10 @@ # include "geometry.hpp" -# include "geomtype.hpp" -# include "meshfunc.hpp" -# include "meshtype.hpp" +# include "geomreps.hpp" +# include "meshreps.hpp" + +# include "interpolate.hpp" # include "iter_mesh/iter_timers.hpp" diff --git a/external/jigsaw/src/libcpp/mathutil.hpp b/external/jigsaw/src/libcpp/mathutil.hpp index 60d7948..4e717dc 100644 --- a/external/jigsaw/src/libcpp/mathutil.hpp +++ b/external/jigsaw/src/libcpp/mathutil.hpp @@ -22,12 +22,16 @@ * how they can obtain it for free, then you are not * required to make any arrangement with me.) * - * Disclaimer: Neither I nor: Columbia University, The - * Massachusetts Institute of Technology, The - * University of Sydney, nor The National Aeronautics - * and Space Administration warrant this code in any - * way whatsoever. This code is provided "as-is" to be - * used at your own risk. + * Disclaimer: Neither I nor THE CONTRIBUTORS warrant + * this code in any way whatsoever. This code is + * provided "as-is" to be used at your own risk. + * + * THE CONTRIBUTORS include: + * (a) The University of Sydney + * (b) The Massachusetts Institute of Technology + * (c) Columbia University + * (d) The National Aeronautics & Space Administration + * (e) Los Alamos National Laboratory * -------------------------------------------------------- * diff --git a/external/jigsaw/src/libcpp/mesh_type/base_complex_k.hpp b/external/jigsaw/src/libcpp/mesh_reps/base_complex_k.hpp similarity index 93% rename from external/jigsaw/src/libcpp/mesh_type/base_complex_k.hpp rename to external/jigsaw/src/libcpp/mesh_reps/base_complex_k.hpp index f1ee5d7..a14be4a 100644 --- a/external/jigsaw/src/libcpp/mesh_type/base_complex_k.hpp +++ b/external/jigsaw/src/libcpp/mesh_reps/base_complex_k.hpp @@ -22,18 +22,22 @@ * how they can obtain it for free, then you are not * required to make any arrangement with me.) * - * Disclaimer: Neither I nor: Columbia University, The - * Massachusetts Institute of Technology, The - * University of Sydney, nor The National Aeronautics - * and Space Administration warrant this code in any - * way whatsoever. This code is provided "as-is" to be - * used at your own risk. + * Disclaimer: Neither I nor THE CONTRIBUTORS warrant + * this code in any way whatsoever. This code is + * provided "as-is" to be used at your own risk. + * + * THE CONTRIBUTORS include: + * (a) The University of Sydney + * (b) The Massachusetts Institute of Technology + * (c) Columbia University + * (d) The National Aeronautics & Space Administration + * (e) Los Alamos National Laboratory * -------------------------------------------------------- * - * Last updated: 11 Sept., 2020 + * Last updated: 11 Dec., 2022 * - * Copyright 2020-- + * Copyright 2020--2022 * Darren Engwirda * d.engwirda@gmail.com * https://github.com/dengwirda/ @@ -569,6 +573,7 @@ _ipos = (IPTR_TYPE)_get_node(_mesh) ; _mesh._llN1[_ipos] = _ndat ; + _mesh._llN1[_ipos].null() ; _mesh._llN1[_ipos].mark() = 0 ; _mesh._llN1[_ipos].self() = 1 ; @@ -589,6 +594,7 @@ _ipos = (IPTR_TYPE)_get_node(_mesh) ; _mesh._llN1[_ipos] = _ndat ; + _mesh._llN1[_ipos].null() ; _mesh._llN1[_ipos].mark() = 0 ; _mesh._llN1[_ipos].self() = 1 ; @@ -643,6 +649,14 @@ IPTR_TYPE _ipos = -1, _npos; + if (_itop == -1) + { + _mesh.node(_edat.node(0)). + ndeg(EDGE2_tag) += 1 ; + _mesh.node(_edat.node(1)). + ndeg(EDGE2_tag) += 1 ; + } + if (!_link) { @@ -759,6 +773,16 @@ IPTR_TYPE _ipos = -1, _epos; + if (_itop == -1) + { + _mesh.node(_tdat.node(0)). + ndeg(TRIA3_tag) += 1 ; + _mesh.node(_tdat.node(1)). + ndeg(TRIA3_tag) += 1 ; + _mesh.node(_tdat.node(2)). + ndeg(TRIA3_tag) += 1 ; + } + if (!_link) { @@ -883,6 +907,18 @@ IPTR_TYPE _ipos = -1, _epos; + if (_itop == -1) + { + _mesh.node(_qdat.node(0)). + ndeg(QUAD4_tag) += 1 ; + _mesh.node(_qdat.node(1)). + ndeg(QUAD4_tag) += 1 ; + _mesh.node(_qdat.node(2)). + ndeg(QUAD4_tag) += 1 ; + _mesh.node(_qdat.node(3)). + ndeg(QUAD4_tag) += 1 ; + } + if (!_link) { @@ -1007,6 +1043,18 @@ IPTR_TYPE _ipos = -1, _fpos; + if (_itop == -1) + { + _mesh.node(_tdat.node(0)). + ndeg(TRIA4_tag) += 1 ; + _mesh.node(_tdat.node(1)). + ndeg(TRIA4_tag) += 1 ; + _mesh.node(_tdat.node(2)). + ndeg(TRIA4_tag) += 1 ; + _mesh.node(_tdat.node(3)). + ndeg(TRIA4_tag) += 1 ; + } + if (!_link) { @@ -1444,14 +1492,20 @@ { __unreferenced(_kind); // maybe, per TOPODIM + if (_mesh. + _llN1[_npos].mark() < +0 ) + return ; // is already removed + if (_itop != -1) { /*---- deleteing (d+k)-face: scan adj. and _pop _itop */ if constexpr ( TOPO_DIMS > 0 ) + { _pop_list(_mesh. _aaN1 , _npos, conn_pair(_itop, _kind)) ; } + } else { /*---- deleting (d+0)-face: set "self" marker to null */ @@ -1512,6 +1566,18 @@ __unreferenced(_kind); // maybe, per TOPODIM + if (_mesh. + _llE2[_epos].mark() < +0 ) + return ; // is already removed + + if (_itop == -1) + { + _mesh.node(_mesh.edge(_epos).node(0)). + ndeg(EDGE2_tag) -= 1 ; + _mesh.node(_mesh.edge(_epos).node(1)). + ndeg(EDGE2_tag) -= 1 ; + } + if (_itop != -1) { /*---- deleteing (d+k)-face: scan adj. and _pop _itop */ @@ -1597,6 +1663,20 @@ __unreferenced(_kind); // maybe, per TOPODIM + if (_mesh. + _llT3[_tpos].mark() < +0 ) + return ; // is already removed + + if (_itop == -1) + { + _mesh.node(_mesh.tri3(_tpos).node(0)). + ndeg(TRIA3_tag) -= 1 ; + _mesh.node(_mesh.tri3(_tpos).node(1)). + ndeg(TRIA3_tag) -= 1 ; + _mesh.node(_mesh.tri3(_tpos).node(2)). + ndeg(TRIA3_tag) -= 1 ; + } + if (_itop != -1) { /*---- deleteing (d+k)-face: scan adj. and _pop _itop */ @@ -1694,6 +1774,22 @@ __unreferenced(_kind); // maybe, per TOPODIM + if (_mesh. + _llQ4[_qpos].mark() < +0 ) + return ; // is already removed + + if (_itop == -1) + { + _mesh.node(_mesh.quad(_qpos).node(0)). + ndeg(QUAD4_tag) -= 1 ; + _mesh.node(_mesh.quad(_qpos).node(1)). + ndeg(QUAD4_tag) -= 1 ; + _mesh.node(_mesh.quad(_qpos).node(2)). + ndeg(QUAD4_tag) -= 1 ; + _mesh.node(_mesh.quad(_qpos).node(3)). + ndeg(QUAD4_tag) -= 1 ; + } + if (_itop != -1) { /*---- deleteing (d+k)-face: scan adj. and _pop _itop */ @@ -1793,6 +1889,22 @@ __unreferenced(_kind); // maybe, per TOPODIM + if (_mesh. + _llT4[_tpos].mark() < +0 ) + return ; // is already removed + + if (_itop == -1) + { + _mesh.node(_mesh.tri4(_tpos).node(0)). + ndeg(TRIA4_tag) -= 1 ; + _mesh.node(_mesh.tri4(_tpos).node(1)). + ndeg(TRIA4_tag) -= 1 ; + _mesh.node(_mesh.tri4(_tpos).node(2)). + ndeg(TRIA4_tag) -= 1 ; + _mesh.node(_mesh.tri4(_tpos).node(3)). + ndeg(TRIA4_tag) -= 1 ; + } + if (_itop != -1) { /*---- deleteing (d+k)-face: scan adj. and _pop _itop */ @@ -2523,28 +2635,20 @@ _mesh._aaN1.tend(_iter->_cell); ++_iadj ) { - if(_iadj->_kind == EDGE2_tag && - _mesh. _llE2[ - _iadj->_cell].mark() == 0) - { + // 1-adj. list is disjoint, guaranteed + // if(_iadj->_kind == EDGE2_tag && + // _mesh. _llE2[ + // _iadj->_cell].mark() == 0) + // { _conn.push_tail (*_iadj) ; - _mesh. _llE2[ - _iadj->_cell].mark() += 1; - } + // _mesh. _llE2[ + // _iadj->_cell].mark() += 1; + // } } } /*-------------------------- flip d-face marker lists */ - for (auto _iter = _conn.head() ; - _iter != _conn.tend() ; - ++_iter ) - { - if(_iter->_kind == EDGE2_tag) - { - _mesh. _llE2[ - _iter->_cell].mark() = 0 ; - } - } + // done! } template < @@ -2584,28 +2688,20 @@ _mesh._aaN1.tend(_iter->_cell); ++_iadj ) { - if(_iadj->_kind == EDGE2_tag && - _mesh. _llE2[ - _iadj->_cell].mark() == 0) - { + // 1-adj. list is disjoint, guaranteed + // if(_iadj->_kind == EDGE2_tag && + // _mesh. _llE2[ + // _iadj->_cell].mark() == 0) + // { _conn.push_tail (*_iadj) ; - _mesh. _llE2[ - _iadj->_cell].mark() += 1; - } + // _mesh. _llE2[ + // _iadj->_cell].mark() += 1; + // } } } /*-------------------------- flip d-face marker lists */ - for (auto _iter = _conn.head() ; - _iter != _conn.tend() ; - ++_iter ) - { - if(_iter->_kind == EDGE2_tag) - { - _mesh. _llE2[ - _iter->_cell].mark() = 0 ; - } - } + // done! } /* @@ -2673,6 +2769,8 @@ _mesh._tmp1.set_count( +0 ) ; _mesh._tmp2.set_count( +0 ) ; + auto _ioff = _conn.count () ; + switch ( _kind ) { /*-------------------------- init. "source" adj. list */ @@ -2703,15 +2801,16 @@ _mesh._aaN1.tend(_iter->_cell); ++_iadj ) { - if(_iadj->_kind == EDGE2_tag && - _mesh. _llE2[ - _iadj->_cell].mark() == 0) - { + // 1-adj. list is disjoint, guaranteed + // if(_iadj->_kind == EDGE2_tag && + // _mesh. _llE2[ + // _iadj->_cell].mark() == 0) + // { _mesh. _tmp2.push_tail (*_iadj); - _mesh. _llE2[ - _iadj->_cell].mark() += 1; - } + // _mesh. _llE2[ + // _iadj->_cell].mark() += 1; + // } } } @@ -2739,7 +2838,7 @@ } /*-------------------------- flip d-face marker lists */ - for (auto _iter = _conn.head() ; + for (auto _iter = _conn.head()+_ioff ; _iter != _conn.tend() ; ++_iter ) { @@ -2749,17 +2848,6 @@ _iter->_cell].mark() = 0 ; } } - - for (auto _iter = _mesh._tmp2.head(); - _iter != _mesh._tmp2.tend(); - ++_iter ) - { - if(_iter->_kind == EDGE2_tag) - { - _mesh. _llE2[ - _iter->_cell].mark() = 0 ; - } - } } template < @@ -2777,6 +2865,8 @@ _mesh._tmp1.set_count( +0 ) ; _mesh._tmp2.set_count( +0 ) ; + auto _ioff = _conn.count () ; + switch ( _kind ) { /*-------------------------- init. "source" adj. list */ @@ -2807,15 +2897,16 @@ _mesh._aaN1.tend(_iter->_cell); ++_iadj ) { - if(_iadj->_kind == EDGE2_tag && - _mesh. _llE2[ - _iadj->_cell].mark() == 0) - { + // 1-adj. list is disjoint, guaranteed + // if(_iadj->_kind == EDGE2_tag && + // _mesh. _llE2[ + // _iadj->_cell].mark() == 0) + // { _mesh. _tmp2.push_tail (*_iadj); - _mesh. _llE2[ - _iadj->_cell].mark() += 1; - } + // _mesh. _llE2[ + // _iadj->_cell].mark() += 1; + // } } } @@ -2852,7 +2943,7 @@ } /*-------------------------- flip d-face marker lists */ - for (auto _iter = _conn.head() ; + for (auto _iter = _conn.head()+_ioff ; _iter != _conn.tend() ; ++_iter ) { @@ -2868,17 +2959,6 @@ _iter->_cell].mark() = 0 ; } } - - for (auto _iter = _mesh._tmp2.head(); - _iter != _mesh._tmp2.tend(); - ++_iter ) - { - if(_iter->_kind == EDGE2_tag) - { - _mesh. _llE2[ - _iter->_cell].mark() = 0 ; - } - } } /* @@ -2947,6 +3027,8 @@ _mesh._tmp2.set_count( +0 ) ; _mesh._tmp3.set_count( +0 ) ; + auto _ioff = _conn.count () ; + switch ( _kind ) { /*-------------------------- init. "source" adj. list */ @@ -2984,15 +3066,16 @@ _mesh._aaN1.tend(_iter->_cell); ++_iadj ) { - if(_iadj->_kind == EDGE2_tag && - _mesh. _llE2[ - _iadj->_cell].mark() == 0) - { + // 1-adj. list is disjoint, guaranteed + // if(_iadj->_kind == EDGE2_tag && + // _mesh. _llE2[ + // _iadj->_cell].mark() == 0) + // { _mesh. _tmp2.push_tail (*_iadj); - _mesh. _llE2[ - _iadj->_cell].mark() += 1; - } + // _mesh. _llE2[ + // _iadj->_cell].mark() += 1; + // } } } @@ -3044,7 +3127,7 @@ } /*-------------------------- flip d-face marker lists */ - for (auto _iter = _conn.head() ; + for (auto _iter = _conn.head()+_ioff ; _iter != _conn.tend() ; ++_iter ) { @@ -3065,17 +3148,6 @@ _iter->_cell].mark() = 0 ; } } - - for (auto _iter = _mesh._tmp2.head(); - _iter != _mesh._tmp2.tend(); - ++_iter ) - { - if(_iter->_kind == EDGE2_tag) - { - _mesh. _llE2[ - _iter->_cell].mark() = 0 ; - } - } } template < @@ -3094,6 +3166,8 @@ _mesh._tmp2.set_count( +0 ) ; _mesh._tmp3.set_count( +0 ) ; + auto _ioff = _conn.count () ; + switch ( _kind ) { /*-------------------------- init. "source" adj. list */ @@ -3132,15 +3206,16 @@ _mesh._aaN1.tend(_iter->_cell); ++_iadj ) { - if(_iadj->_kind == EDGE2_tag && - _mesh. _llE2[ - _iadj->_cell].mark() == 0) - { + // 1-adj. list is disjoint, guaranteed + // if(_iadj->_kind == EDGE2_tag && + // _mesh. _llE2[ + // _iadj->_cell].mark() == 0) + // { _mesh. _tmp2.push_tail (*_iadj); - _mesh. _llE2[ - _iadj->_cell].mark() += 1; - } + // _mesh. _llE2[ + // _iadj->_cell].mark() += 1; + // } } } @@ -3255,7 +3330,7 @@ } /*-------------------------- flip d-face marker lists */ - for (auto _iter = _conn.head() ; + for (auto _iter = _conn.head()+_ioff ; _iter != _conn.tend() ; ++_iter ) { @@ -3300,17 +3375,6 @@ _iter->_cell].mark() = 0 ; } } - - for (auto _iter = _mesh._tmp2.head(); - _iter != _mesh._tmp2.tend(); - ++_iter ) - { - if(_iter->_kind == EDGE2_tag) - { - _mesh. _llE2[ - _iter->_cell].mark() = 0 ; - } - } } # undef TOPO_DIMS diff --git a/external/jigsaw/src/libcpp/mesh_type/hash_complex_k.hpp b/external/jigsaw/src/libcpp/mesh_reps/hash_complex_k.hpp similarity index 98% rename from external/jigsaw/src/libcpp/mesh_type/hash_complex_k.hpp rename to external/jigsaw/src/libcpp/mesh_reps/hash_complex_k.hpp index 57b1ef0..1c70d07 100644 --- a/external/jigsaw/src/libcpp/mesh_type/hash_complex_k.hpp +++ b/external/jigsaw/src/libcpp/mesh_reps/hash_complex_k.hpp @@ -22,16 +22,20 @@ * how they can obtain it for free, then you are not * required to make any arrangement with me.) * - * Disclaimer: Neither I nor: Columbia University, The - * Massachusetts Institute of Technology, The - * University of Sydney, nor The National Aeronautics - * and Space Administration warrant this code in any - * way whatsoever. This code is provided "as-is" to be - * used at your own risk. + * Disclaimer: Neither I nor THE CONTRIBUTORS warrant + * this code in any way whatsoever. This code is + * provided "as-is" to be used at your own risk. + * + * THE CONTRIBUTORS include: + * (a) The University of Sydney + * (b) The Massachusetts Institute of Technology + * (c) Columbia University + * (d) The National Aeronautics & Space Administration + * (e) Los Alamos National Laboratory * -------------------------------------------------------- * - * Last updated: 27 April, 2020 + * Last updated: 27 Apr., 2020 * * Copyright 2020-- * Darren Engwirda diff --git a/external/jigsaw/src/libcpp/mesh_type/mesh_complex_1.hpp b/external/jigsaw/src/libcpp/mesh_reps/mesh_complex_1.hpp similarity index 94% rename from external/jigsaw/src/libcpp/mesh_type/mesh_complex_1.hpp rename to external/jigsaw/src/libcpp/mesh_reps/mesh_complex_1.hpp index 32c5b8c..c769db6 100644 --- a/external/jigsaw/src/libcpp/mesh_type/mesh_complex_1.hpp +++ b/external/jigsaw/src/libcpp/mesh_reps/mesh_complex_1.hpp @@ -22,16 +22,20 @@ * how they can obtain it for free, then you are not * required to make any arrangement with me.) * - * Disclaimer: Neither I nor: Columbia University, The - * Massachusetts Institute of Technology, The - * University of Sydney, nor The National Aeronautics - * and Space Administration warrant this code in any - * way whatsoever. This code is provided "as-is" to be - * used at your own risk. + * Disclaimer: Neither I nor THE CONTRIBUTORS warrant + * this code in any way whatsoever. This code is + * provided "as-is" to be used at your own risk. + * + * THE CONTRIBUTORS include: + * (a) The University of Sydney + * (b) The Massachusetts Institute of Technology + * (c) Columbia University + * (d) The National Aeronautics & Space Administration + * (e) Los Alamos National Laboratory * -------------------------------------------------------- * - * Last updated: 28 April, 2020 + * Last updated: 28 Apr., 2020 * * Copyright 2020-- * Darren Engwirda @@ -128,8 +132,8 @@ public : - pool_base _hsrc ; - pool_base _csrc ; + pool_base _e2pl ; + pool_base _a0pl ; conn_list _aaN1 ; @@ -205,17 +209,18 @@ __normal_call mesh_complex_1 ( allocator const& _asrc = allocator() - ) : _hsrc(sizeof ( + ) : _e2pl(sizeof ( typename edge_maps::item_type)), - _csrc(sizeof ( + + _a0pl(sizeof ( typename conn_list::item_type)), /*---------------------------------- init. adj. lists */ - _aaN1(pool_wrap(&_csrc)), + _aaN1(pool_wrap(&_a0pl)), /*---------------------------------- init. hash lists */ _mmE2( edge_hash(& this->_llE2) , edge_pred(& this->_llE2) , - +.8, (pool_wrap(&_hsrc))) , + +.8, (pool_wrap(&_e2pl))) , /*---------------------------------- init. face lists */ _llN1(_asrc),_llE2(_asrc) , /*---------------------------------- init. free lists */ @@ -253,9 +258,6 @@ this->_ffE2.clear (_kind) ; this->_tmp1.clear (_kind) ; - - this->_hsrc.clear (); - this->_csrc.clear (); } /* diff --git a/external/jigsaw/src/libcpp/mesh_type/mesh_complex_2.hpp b/external/jigsaw/src/libcpp/mesh_reps/mesh_complex_2.hpp similarity index 93% rename from external/jigsaw/src/libcpp/mesh_type/mesh_complex_2.hpp rename to external/jigsaw/src/libcpp/mesh_reps/mesh_complex_2.hpp index 9302dc1..c6e50fc 100644 --- a/external/jigsaw/src/libcpp/mesh_type/mesh_complex_2.hpp +++ b/external/jigsaw/src/libcpp/mesh_reps/mesh_complex_2.hpp @@ -22,16 +22,20 @@ * how they can obtain it for free, then you are not * required to make any arrangement with me.) * - * Disclaimer: Neither I nor: Columbia University, The - * Massachusetts Institute of Technology, The - * University of Sydney, nor The National Aeronautics - * and Space Administration warrant this code in any - * way whatsoever. This code is provided "as-is" to be - * used at your own risk. + * Disclaimer: Neither I nor THE CONTRIBUTORS warrant + * this code in any way whatsoever. This code is + * provided "as-is" to be used at your own risk. + * + * THE CONTRIBUTORS include: + * (a) The University of Sydney + * (b) The Massachusetts Institute of Technology + * (c) Columbia University + * (d) The National Aeronautics & Space Administration + * (e) Los Alamos National Laboratory * -------------------------------------------------------- * - * Last updated: 28 April, 2020 + * Last updated: 28 Apr., 2020 * * Copyright 2020-- * Darren Engwirda @@ -160,8 +164,12 @@ public : - pool_base _hsrc ; - pool_base _csrc ; + pool_base _e2pl ; + pool_base _t3pl ; + pool_base _q4pl ; + + pool_base _a0pl ; + pool_base _a1pl ; conn_list _aaN1 ; conn_list _aaE2 ; @@ -289,26 +297,33 @@ __normal_call mesh_complex_2 ( allocator const& _asrc = allocator() - ) : _hsrc(sizeof ( + ) : _e2pl(sizeof ( typename edge_maps::item_type)), - _csrc(sizeof ( + _t3pl(sizeof ( + typename tri3_maps::item_type)), + _q4pl(sizeof ( + typename quad_maps::item_type)), + + _a0pl(sizeof ( + typename conn_list::item_type)), + _a1pl(sizeof ( typename conn_list::item_type)), /*---------------------------------- init. adj. lists */ - _aaN1(pool_wrap(&_csrc)), - _aaE2(pool_wrap(&_csrc)), + _aaN1(pool_wrap(&_a0pl)), + _aaE2(pool_wrap(&_a1pl)), /*---------------------------------- init. hash lists */ _mmE2( edge_hash(& this->_llE2) , edge_pred(& this->_llE2) , - +.8, (pool_wrap(&_hsrc))) , + +.8, (pool_wrap(&_e2pl))) , _mmT3( tri3_hash(& this->_llT3) , tri3_pred(& this->_llT3) , - +.8, (pool_wrap(&_hsrc))) , + +.8, (pool_wrap(&_t3pl))) , _mmQ4( quad_hash(& this->_llQ4) , quad_pred(& this->_llQ4) , - +.8, (pool_wrap(&_hsrc))) , + +.8, (pool_wrap(&_q4pl))) , /*---------------------------------- init. face lists */ _llN1(_asrc),_llE2(_asrc) , _llT3(_asrc),_llQ4(_asrc) , @@ -356,9 +371,6 @@ this->_tmp1.clear (_kind) ; this->_tmp2.clear (_kind) ; - - this->_hsrc.clear (); - this->_csrc.clear (); } /* diff --git a/external/jigsaw/src/libcpp/mesh_type/mesh_complex_3.hpp b/external/jigsaw/src/libcpp/mesh_reps/mesh_complex_3.hpp similarity index 93% rename from external/jigsaw/src/libcpp/mesh_type/mesh_complex_3.hpp rename to external/jigsaw/src/libcpp/mesh_reps/mesh_complex_3.hpp index 37034fd..0e41833 100644 --- a/external/jigsaw/src/libcpp/mesh_type/mesh_complex_3.hpp +++ b/external/jigsaw/src/libcpp/mesh_reps/mesh_complex_3.hpp @@ -22,16 +22,20 @@ * how they can obtain it for free, then you are not * required to make any arrangement with me.) * - * Disclaimer: Neither I nor: Columbia University, The - * Massachusetts Institute of Technology, The - * University of Sydney, nor The National Aeronautics - * and Space Administration warrant this code in any - * way whatsoever. This code is provided "as-is" to be - * used at your own risk. + * Disclaimer: Neither I nor THE CONTRIBUTORS warrant + * this code in any way whatsoever. This code is + * provided "as-is" to be used at your own risk. + * + * THE CONTRIBUTORS include: + * (a) The University of Sydney + * (b) The Massachusetts Institute of Technology + * (c) Columbia University + * (d) The National Aeronautics & Space Administration + * (e) Los Alamos National Laboratory * -------------------------------------------------------- * - * Last updated: 28 April, 2020 + * Last updated: 28 Apr., 2020 * * Copyright 2020-- * Darren Engwirda @@ -224,8 +228,17 @@ public : - pool_base _hsrc ; - pool_base _csrc ; + pool_base _e2pl ; + pool_base _t3pl ; + pool_base _q4pl ; + pool_base _t4pl ; + pool_base _h8pl ; + pool_base _w6pl ; + pool_base _p5pl ; + + pool_base _a0pl ; + pool_base _a1pl ; + pool_base _a2pl ; conn_list _aaN1 ; conn_list _aaE2 ; @@ -456,44 +469,61 @@ __normal_call mesh_complex_3 ( allocator const& _asrc = allocator() - ) : _hsrc(sizeof ( + ) : _e2pl(sizeof ( typename edge_maps::item_type)), - _csrc(sizeof ( + _t3pl(sizeof ( + typename tri3_maps::item_type)), + _q4pl(sizeof ( + typename quad_maps::item_type)), + _t4pl(sizeof ( + typename tri4_maps::item_type)), + _h8pl(sizeof ( + typename hexa_maps::item_type)), + _w6pl(sizeof ( + typename wedg_maps::item_type)), + _p5pl(sizeof ( + typename pyra_maps::item_type)), + + _a0pl(sizeof ( + typename conn_list::item_type)), + _a1pl(sizeof ( + typename conn_list::item_type)), + _a2pl(sizeof ( typename conn_list::item_type)), /*---------------------------------- init. adj. lists */ - _aaN1(pool_wrap(&_csrc)), - _aaE2(pool_wrap(&_csrc)), - _aaT3(pool_wrap(&_csrc)), - _aaQ4(pool_wrap(&_csrc)), + _aaN1(pool_wrap(&_a0pl)), + _aaE2(pool_wrap(&_a1pl)), + _aaT3(pool_wrap(&_a2pl)), + _aaQ4(pool_wrap(&_a2pl)), /*---------------------------------- init. hash lists */ _mmE2( edge_hash(& this->_llE2) , edge_pred(& this->_llE2) , - +.8, (pool_wrap(&_hsrc))) , + +.8, (pool_wrap(&_e2pl))) , _mmT3( tri3_hash(& this->_llT3) , tri3_pred(& this->_llT3) , - +.8, (pool_wrap(&_hsrc))) , + +.8, (pool_wrap(&_t3pl))) , _mmQ4( quad_hash(& this->_llQ4) , quad_pred(& this->_llQ4) , - +.8, (pool_wrap(&_hsrc))) , + +.8, (pool_wrap(&_q4pl))) , _mmT4( tri4_hash(& this->_llT4) , tri4_pred(& this->_llT4) , - +.8, (pool_wrap(&_hsrc))) , + +.8, (pool_wrap(&_t4pl))) , _mmH8( hexa_hash(& this->_llH8) , hexa_pred(& this->_llH8) , - +.8, (pool_wrap(&_hsrc))) , + +.8, (pool_wrap(&_h8pl))) , _mmW6( wedg_hash(& this->_llW6) , wedg_pred(& this->_llW6) , - +.8, (pool_wrap(&_hsrc))) , + +.8, (pool_wrap(&_w6pl))) , _mmP5( pyra_hash(& this->_llP5) , pyra_pred(& this->_llP5) , - +.8, (pool_wrap(&_hsrc))) , + +.8, (pool_wrap(&_p5pl))) , /*---------------------------------- init. face lists */ _llN1(_asrc),_llE2(_asrc) , _llT3(_asrc),_llQ4(_asrc) , @@ -560,9 +590,6 @@ this->_tmp1.clear (_kind) ; this->_tmp2.clear (_kind) ; this->_tmp3.clear (_kind) ; - - this->_hsrc.clear (); - this->_csrc.clear (); } /* diff --git a/external/jigsaw/src/libcpp/mesh_type/mesh_complex_type_k.hpp b/external/jigsaw/src/libcpp/mesh_reps/mesh_complex_type_k.hpp similarity index 89% rename from external/jigsaw/src/libcpp/mesh_type/mesh_complex_type_k.hpp rename to external/jigsaw/src/libcpp/mesh_reps/mesh_complex_type_k.hpp index 7b7b196..47dece0 100644 --- a/external/jigsaw/src/libcpp/mesh_type/mesh_complex_type_k.hpp +++ b/external/jigsaw/src/libcpp/mesh_reps/mesh_complex_type_k.hpp @@ -22,18 +22,22 @@ * how they can obtain it for free, then you are not * required to make any arrangement with me.) * - * Disclaimer: Neither I nor: Columbia University, The - * Massachusetts Institute of Technology, The - * University of Sydney, nor The National Aeronautics - * and Space Administration warrant this code in any - * way whatsoever. This code is provided "as-is" to be - * used at your own risk. + * Disclaimer: Neither I nor THE CONTRIBUTORS warrant + * this code in any way whatsoever. This code is + * provided "as-is" to be used at your own risk. + * + * THE CONTRIBUTORS include: + * (a) The University of Sydney + * (b) The Massachusetts Institute of Technology + * (c) Columbia University + * (d) The National Aeronautics & Space Administration + * (e) Los Alamos National Laboratory * -------------------------------------------------------- * - * Last updated: 04 March, 2020 + * Last updated: 10 Jun., 2022 * - * Copyright 2013-2020 + * Copyright 2013-2022 * Darren Engwirda * d.engwirda@gmail.com * https://github.com/dengwirda/ @@ -48,6 +52,30 @@ namespace mesh { + /*------------------- helper: cell-to-degree indexing */ + + template < + typename iptr_type + > + __inline_call iptr_type _tag_to_ndeg ( + iptr_type _cell + ) + { + switch (_cell) + { + case POINT_tag : return +0 ; + case EDGE2_tag : return +1 ; + case TRIA3_tag : return +2 ; + case QUAD4_tag : return +3 ; + case TRIA4_tag : return +4 ; + case HEXA8_tag : return +5 ; + case WEDG6_tag : return +6 ; + case PYRA5_tag : return +7 ; + + default: return -1;// suppress compiler warning + } + } + /* -------------------------------------------------------- * BASE-NODE-2: node-type for mesh complexes in R^2. @@ -69,7 +97,9 @@ typedef R real_type ; typedef I iptr_type ; - iptr_type static constexpr _dims = +2 ; + iptr_type static constexpr _dims = +2 ; + + typedef std::uint16_t ndeg_type ; containers:: fixed_array _pval ; // node coord.'s @@ -80,7 +110,16 @@ char _mark ; char _self ; + containers:: + fixed_array _ndeg ; + public : +/*---------------------------------------- obj. utilities */ + __inline_call void_type null ( + ) + { this->_ndeg.fill(0) ; + } + /*---------------------------------------- "write" access */ __inline_call real_type & pval ( iptr_type _ipos @@ -93,6 +132,13 @@ { return this->_ndat [_ipos]; } + __inline_call ndeg_type & ndeg ( + iptr_type _cell + ) + { return + this->_ndeg[_tag_to_ndeg (_cell)] ; + } + __inline_call char & mark ( ) { return this->_mark ; @@ -111,7 +157,24 @@ __inline_call iptr_type const& node ( iptr_type _ipos ) const - { return this->_ndat[_ipos]; + { return this->_ndat [_ipos]; + } + + __inline_call size_t ndeg ( + ) const + { + size_t _ntot = 0; + for (auto _ipos = 8; _ipos-- != 0 ; ) + _ntot += this->_ndeg [_ipos ] ; + + return _ntot ; + } + + __inline_call ndeg_type const& ndeg ( + iptr_type _cell + ) const + { return + this->_ndeg[_tag_to_ndeg (_cell)] ; } __inline_call char const& mark ( @@ -146,7 +209,9 @@ typedef R real_type ; typedef I iptr_type ; - iptr_type static constexpr _dims = +3 ; + typedef std::uint16_t ndeg_type ; + + iptr_type static constexpr _dims = +3 ; containers:: fixed_array _pval ; // node coord.'s @@ -157,7 +222,16 @@ char _mark ; char _self ; + containers:: + fixed_array _ndeg ; + public : +/*---------------------------------------- obj. utilities */ + __inline_call void_type null ( + ) + { this->_ndeg.fill(0) ; + } + /*---------------------------------------- "write" access */ __inline_call real_type & pval ( iptr_type _ipos @@ -170,6 +244,13 @@ { return this->_ndat [_ipos]; } + __inline_call ndeg_type & ndeg ( + iptr_type _cell + ) + { return + this->_ndeg[_tag_to_ndeg (_cell)] ; + } + __inline_call char & mark ( ) { return this->_mark ; @@ -188,7 +269,24 @@ __inline_call iptr_type const& node ( iptr_type _ipos ) const - { return this->_ndat[_ipos]; + { return this->_ndat [_ipos]; + } + + __inline_call size_t ndeg ( + ) const + { + size_t _ntot = 0; + for (auto _ipos = 8; _ipos-- != 0 ; ) + _ntot += this->_ndeg [_ipos ] ; + + return _ntot ; + } + + __inline_call ndeg_type const& ndeg ( + iptr_type _cell + ) const + { return + this->_ndeg[_tag_to_ndeg (_cell)] ; } __inline_call char const& mark ( @@ -223,7 +321,9 @@ typedef R real_type ; typedef I iptr_type ; - iptr_type static constexpr _dims = +4 ; + typedef std::uint16_t ndeg_type ; + + iptr_type static constexpr _dims = +4 ; containers:: fixed_array _pval ; // node coord.'s @@ -234,7 +334,16 @@ char _mark ; char _self ; + containers:: + fixed_array _ndeg ; + public : +/*---------------------------------------- obj. utilities */ + __inline_call void_type null ( + ) + { this->_ndeg.fill(0) ; + } + /*---------------------------------------- "write" access */ __inline_call real_type & pval ( iptr_type _ipos @@ -247,6 +356,13 @@ { return this->_ndat [_ipos]; } + __inline_call ndeg_type & ndeg ( + iptr_type _cell + ) + { return + this->_ndeg[_tag_to_ndeg (_cell)] ; + } + __inline_call char & mark ( ) { return this->_mark ; @@ -265,7 +381,24 @@ __inline_call iptr_type const& node ( iptr_type _ipos ) const - { return this->_ndat[_ipos]; + { return this->_ndat [_ipos]; + } + + __inline_call size_t ndeg ( + ) const + { + size_t _ntot = 0; + for (auto _ipos = 8; _ipos-- != 0 ; ) + _ntot += this->_ndeg [_ipos ] ; + + return _ntot ; + } + + __inline_call ndeg_type const& ndeg ( + iptr_type _cell + ) const + { return + this->_ndeg[_tag_to_ndeg (_cell)] ; } __inline_call char const& mark ( diff --git a/external/jigsaw/src/libcpp/mesh_type/tria_complex_1.hpp b/external/jigsaw/src/libcpp/mesh_reps/tria_complex_1.hpp similarity index 94% rename from external/jigsaw/src/libcpp/mesh_type/tria_complex_1.hpp rename to external/jigsaw/src/libcpp/mesh_reps/tria_complex_1.hpp index f2ad6b6..c05ee19 100644 --- a/external/jigsaw/src/libcpp/mesh_type/tria_complex_1.hpp +++ b/external/jigsaw/src/libcpp/mesh_reps/tria_complex_1.hpp @@ -22,16 +22,20 @@ * how they can obtain it for free, then you are not * required to make any arrangement with me.) * - * Disclaimer: Neither I nor: Columbia University, The - * Massachusetts Institute of Technology, The - * University of Sydney, nor The National Aeronautics - * and Space Administration warrant this code in any - * way whatsoever. This code is provided "as-is" to be - * used at your own risk. + * Disclaimer: Neither I nor THE CONTRIBUTORS warrant + * this code in any way whatsoever. This code is + * provided "as-is" to be used at your own risk. + * + * THE CONTRIBUTORS include: + * (a) The University of Sydney + * (b) The Massachusetts Institute of Technology + * (c) Columbia University + * (d) The National Aeronautics & Space Administration + * (e) Los Alamos National Laboratory * -------------------------------------------------------- * - * Last updated: 28 April, 2020 + * Last updated: 28 Apr., 2020 * * Copyright 2013-2020 * Darren Engwirda @@ -128,8 +132,8 @@ public : - pool_base _hsrc ; - pool_base _csrc ; + pool_base _e2pl ; + pool_base _a0pl ; conn_list _aaN1 ; @@ -205,17 +209,18 @@ __normal_call tria_complex_1 ( allocator const& _asrc = allocator() - ) : _hsrc(sizeof ( + ) : _e2pl(sizeof ( typename edge_maps::item_type)), - _csrc(sizeof ( + + _a0pl(sizeof ( typename conn_list::item_type)), /*---------------------------------- init. adj. lists */ - _aaN1(pool_wrap(&_csrc)), + _aaN1(pool_wrap(&_a0pl)), /*---------------------------------- init. hash lists */ _mmE2( edge_hash(& this->_llE2) , edge_pred(& this->_llE2) , - +.8, (pool_wrap(&_hsrc))) , + +.8, (pool_wrap(&_e2pl))) , /*---------------------------------- init. face lists */ _llN1(_asrc),_llE2(_asrc) , /*---------------------------------- init. free lists */ @@ -253,9 +258,6 @@ this->_ffE2.clear (_kind) ; this->_tmp1.clear (_kind) ; - - this->_hsrc.clear (); - this->_csrc.clear (); } /* diff --git a/external/jigsaw/src/libcpp/mesh_type/tria_complex_2.hpp b/external/jigsaw/src/libcpp/mesh_reps/tria_complex_2.hpp similarity index 93% rename from external/jigsaw/src/libcpp/mesh_type/tria_complex_2.hpp rename to external/jigsaw/src/libcpp/mesh_reps/tria_complex_2.hpp index 2508804..64edff3 100644 --- a/external/jigsaw/src/libcpp/mesh_type/tria_complex_2.hpp +++ b/external/jigsaw/src/libcpp/mesh_reps/tria_complex_2.hpp @@ -22,16 +22,20 @@ * how they can obtain it for free, then you are not * required to make any arrangement with me.) * - * Disclaimer: Neither I nor: Columbia University, The - * Massachusetts Institute of Technology, The - * University of Sydney, nor The National Aeronautics - * and Space Administration warrant this code in any - * way whatsoever. This code is provided "as-is" to be - * used at your own risk. + * Disclaimer: Neither I nor THE CONTRIBUTORS warrant + * this code in any way whatsoever. This code is + * provided "as-is" to be used at your own risk. + * + * THE CONTRIBUTORS include: + * (a) The University of Sydney + * (b) The Massachusetts Institute of Technology + * (c) Columbia University + * (d) The National Aeronautics & Space Administration + * (e) Los Alamos National Laboratory * -------------------------------------------------------- * - * Last updated: 28 April, 2020 + * Last updated: 28 Apr., 2020 * * Copyright 2013-2020 * Darren Engwirda @@ -144,8 +148,11 @@ public : - pool_base _hsrc ; - pool_base _csrc ; + pool_base _e2pl ; + pool_base _t3pl ; + + pool_base _a0pl ; + pool_base _a1pl ; conn_list _aaN1 ; conn_list _aaE2 ; @@ -248,22 +255,27 @@ __normal_call tria_complex_2 ( allocator const& _asrc = allocator() - ) : _hsrc(sizeof ( + ) : _e2pl(sizeof ( typename edge_maps::item_type)), - _csrc(sizeof ( + _t3pl(sizeof ( + typename tri3_maps::item_type)), + + _a0pl(sizeof ( + typename conn_list::item_type)), + _a1pl(sizeof ( typename conn_list::item_type)), /*---------------------------------- init. adj. lists */ - _aaN1(pool_wrap(&_csrc)), - _aaE2(pool_wrap(&_csrc)), + _aaN1(pool_wrap(&_a0pl)), + _aaE2(pool_wrap(&_a1pl)), /*---------------------------------- init. hash lists */ _mmE2( edge_hash(& this->_llE2) , edge_pred(& this->_llE2) , - +.8, (pool_wrap(&_hsrc))) , + +.8, (pool_wrap(&_e2pl))) , _mmT3( tri3_hash(& this->_llT3) , tri3_pred(& this->_llT3) , - +.8, (pool_wrap(&_hsrc))) , + +.8, (pool_wrap(&_t3pl))) , /*---------------------------------- init. face lists */ _llN1(_asrc),_llE2(_asrc) , _llT3(_asrc), @@ -308,9 +320,6 @@ this->_tmp1.clear (_kind) ; this->_tmp2.clear (_kind) ; - - this->_hsrc.clear (); - this->_csrc.clear (); } /* diff --git a/external/jigsaw/src/libcpp/mesh_type/tria_complex_3.hpp b/external/jigsaw/src/libcpp/mesh_reps/tria_complex_3.hpp similarity index 93% rename from external/jigsaw/src/libcpp/mesh_type/tria_complex_3.hpp rename to external/jigsaw/src/libcpp/mesh_reps/tria_complex_3.hpp index 08db9de..bb98415 100644 --- a/external/jigsaw/src/libcpp/mesh_type/tria_complex_3.hpp +++ b/external/jigsaw/src/libcpp/mesh_reps/tria_complex_3.hpp @@ -22,16 +22,20 @@ * how they can obtain it for free, then you are not * required to make any arrangement with me.) * - * Disclaimer: Neither I nor: Columbia University, The - * Massachusetts Institute of Technology, The - * University of Sydney, nor The National Aeronautics - * and Space Administration warrant this code in any - * way whatsoever. This code is provided "as-is" to be - * used at your own risk. + * Disclaimer: Neither I nor THE CONTRIBUTORS warrant + * this code in any way whatsoever. This code is + * provided "as-is" to be used at your own risk. + * + * THE CONTRIBUTORS include: + * (a) The University of Sydney + * (b) The Massachusetts Institute of Technology + * (c) Columbia University + * (d) The National Aeronautics & Space Administration + * (e) Los Alamos National Laboratory * -------------------------------------------------------- * - * Last updated: 28 April, 2020 + * Last updated: 28 Apr., 2020 * * Copyright 2013-2020 * Darren Engwirda @@ -160,8 +164,13 @@ public : - pool_base _hsrc ; - pool_base _csrc ; + pool_base _e2pl ; + pool_base _t3pl ; + pool_base _t4pl ; + + pool_base _a0pl ; + pool_base _a1pl ; + pool_base _a2pl ; conn_list _aaN1 ; conn_list _aaE2 ; @@ -291,27 +300,36 @@ __normal_call tria_complex_3 ( allocator const& _asrc = allocator() - ) : _hsrc(sizeof ( + ) : _e2pl(sizeof ( typename edge_maps::item_type)), - _csrc(sizeof ( + _t3pl(sizeof ( + typename tri3_maps::item_type)), + _t4pl(sizeof ( + typename tri4_maps::item_type)), + + _a0pl(sizeof ( + typename conn_list::item_type)), + _a1pl(sizeof ( + typename conn_list::item_type)), + _a2pl(sizeof ( typename conn_list::item_type)), /*---------------------------------- init. adj. lists */ - _aaN1(pool_wrap(&_csrc)), - _aaE2(pool_wrap(&_csrc)), - _aaT3(pool_wrap(&_csrc)), + _aaN1(pool_wrap(&_a0pl)), + _aaE2(pool_wrap(&_a1pl)), + _aaT3(pool_wrap(&_a2pl)), /*---------------------------------- init. hash lists */ _mmE2( edge_hash(& this->_llE2) , edge_pred(& this->_llE2) , - +.8, (pool_wrap(&_hsrc))) , + +.8, (pool_wrap(&_e2pl))) , _mmT3( tri3_hash(& this->_llT3) , tri3_pred(& this->_llT3) , - +.8, (pool_wrap(&_hsrc))) , + +.8, (pool_wrap(&_t3pl))) , _mmT4( tri4_hash(& this->_llT4) , tri4_pred(& this->_llT4) , - +.8, (pool_wrap(&_hsrc))) , + +.8, (pool_wrap(&_t4pl))) , /*---------------------------------- init. face lists */ _llN1(_asrc),_llE2(_asrc) , _llT3(_asrc),_llT4(_asrc) , @@ -361,9 +379,6 @@ this->_tmp1.clear (_kind) ; this->_tmp2.clear (_kind) ; this->_tmp3.clear (_kind) ; - - this->_hsrc.clear (); - this->_csrc.clear (); } /* diff --git a/external/jigsaw/src/libcpp/meshtype.hpp b/external/jigsaw/src/libcpp/meshreps.hpp similarity index 51% rename from external/jigsaw/src/libcpp/meshtype.hpp rename to external/jigsaw/src/libcpp/meshreps.hpp index fcf5faf..7ca2505 100644 --- a/external/jigsaw/src/libcpp/meshtype.hpp +++ b/external/jigsaw/src/libcpp/meshreps.hpp @@ -22,18 +22,22 @@ * how they can obtain it for free, then you are not * required to make any arrangement with me.) * - * Disclaimer: Neither I nor: Columbia University, The - * Massachusetts Institute of Technology, The - * University of Sydney, nor The National Aeronautics - * and Space Administration warrant this code in any - * way whatsoever. This code is provided "as-is" to be - * used at your own risk. + * Disclaimer: Neither I nor THE CONTRIBUTORS warrant + * this code in any way whatsoever. This code is + * provided "as-is" to be used at your own risk. + * + * THE CONTRIBUTORS include: + * (a) The University of Sydney + * (b) The Massachusetts Institute of Technology + * (c) Columbia University + * (d) The National Aeronautics & Space Administration + * (e) Los Alamos National Laboratory * ------------------------------------------------------------ * - * Last updated: 27 April, 2020 + * Last updated: 01 Sept., 2021 * - * Copyright 2013-2020 + * Copyright 2013-2021 * Darren Engwirda * d.engwirda@gmail.com * https://github.com/dengwirda/ @@ -43,41 +47,49 @@ # pragma once -# ifndef __MESHTYPE__ -# define __MESHTYPE__ +# ifndef __MESHREPS__ +# define __MESHREPS__ namespace mesh { /*-------------------------- classification of mesh cells */ char_type constexpr EMPTY_tag = +0 ; - char_type constexpr POINT_tag = 10 ; - char_type constexpr EDGE2_tag = 20 ; - char_type constexpr TRIA3_tag = 30 ; - char_type constexpr QUAD4_tag = 40 ; - char_type constexpr TRIA4_tag = 50 ; - char_type constexpr HEXA8_tag = 60 ; - char_type constexpr WEDG6_tag = 70 ; - char_type constexpr PYRA5_tag = 80 ; + char_type constexpr + POINT_tag = JIGSAW_POINT_TAG ; + char_type constexpr + EDGE2_tag = JIGSAW_EDGE2_TAG ; + char_type constexpr + TRIA3_tag = JIGSAW_TRIA3_TAG ; + char_type constexpr + QUAD4_tag = JIGSAW_QUAD4_TAG ; + char_type constexpr + TRIA4_tag = JIGSAW_TRIA4_TAG ; + char_type constexpr + HEXA8_tag = JIGSAW_HEXA8_TAG ; + char_type constexpr + WEDG6_tag = JIGSAW_WEDG6_TAG ; + char_type constexpr + PYRA5_tag = JIGSAW_PYRA5_TAG ; } # include "containers.hpp" # include "hashfunc.hpp" -# include "mesh_type/mesh_complex_type_k.hpp" +# include "mesh_reps/mesh_complex_type_k.hpp" -# include "mesh_type/hash_complex_k.hpp" -# include "mesh_type/base_complex_k.hpp" +# include "mesh_reps/hash_complex_k.hpp" +# include "mesh_reps/base_complex_k.hpp" -# include "mesh_type/tria_complex_1.hpp" -# include "mesh_type/tria_complex_2.hpp" -# include "mesh_type/tria_complex_3.hpp" +# include "mesh_reps/tria_complex_1.hpp" +# include "mesh_reps/tria_complex_2.hpp" +# include "mesh_reps/tria_complex_3.hpp" -# include "mesh_type/mesh_complex_1.hpp" -# include "mesh_type/mesh_complex_2.hpp" -# include "mesh_type/mesh_complex_3.hpp" +# include "mesh_reps/mesh_complex_1.hpp" +# include "mesh_reps/mesh_complex_2.hpp" +# include "mesh_reps/mesh_complex_3.hpp" -# endif//__MESHTYPE__ +# endif//__MESHREPS__ diff --git a/external/jigsaw/src/libcpp/mpfloats.hpp b/external/jigsaw/src/libcpp/mpfloats.hpp index df2a796..367ef28 100644 --- a/external/jigsaw/src/libcpp/mpfloats.hpp +++ b/external/jigsaw/src/libcpp/mpfloats.hpp @@ -22,16 +22,20 @@ * how they can obtain it for free, then you are not * required to make any arrangement with me.) * - * Disclaimer: Neither I nor: Columbia University, The - * Massachusetts Institute of Technology, The - * University of Sydney, nor The National Aeronautics - * and Space Administration warrant this code in any - * way whatsoever. This code is provided "as-is" to be - * used at your own risk. + * Disclaimer: Neither I nor THE CONTRIBUTORS warrant + * this code in any way whatsoever. This code is + * provided "as-is" to be used at your own risk. + * + * THE CONTRIBUTORS include: + * (a) The University of Sydney + * (b) The Massachusetts Institute of Technology + * (c) Columbia University + * (d) The National Aeronautics & Space Administration + * (e) Los Alamos National Laboratory * ------------------------------------------------------------ * - * Last updated: 11 April, 2020 + * Last updated: 11 Apr., 2020 * * Copyright 2020-- * Darren Engwirda diff --git a/external/jigsaw/src/libcpp/parameters/iter_params.hpp b/external/jigsaw/src/libcpp/parameters/iter_params.hpp index 2637b43..65bffab 100644 --- a/external/jigsaw/src/libcpp/parameters/iter_params.hpp +++ b/external/jigsaw/src/libcpp/parameters/iter_params.hpp @@ -22,18 +22,22 @@ * how they can obtain it for free, then you are not * required to make any arrangement with me.) * - * Disclaimer: Neither I nor: Columbia University, The - * Massachusetts Institute of Technology, The - * University of Sydney, nor The National Aeronautics - * and Space Administration warrant this code in any - * way whatsoever. This code is provided "as-is" to be - * used at your own risk. + * Disclaimer: Neither I nor THE CONTRIBUTORS warrant + * this code in any way whatsoever. This code is + * provided "as-is" to be used at your own risk. + * + * THE CONTRIBUTORS include: + * (a) The University of Sydney + * (b) The Massachusetts Institute of Technology + * (c) Columbia University + * (d) The National Aeronautics & Space Administration + * (e) Los Alamos National Laboratory * -------------------------------------------------------- * - * Last updated: 10 Jul., 2021 + * Last updated: 12 Dec., 2022 * - * Copyright 2013-2021 + * Copyright 2013-2022 * Darren Engwirda * d.engwirda@gmail.com * https://github.com/dengwirda/ @@ -69,17 +73,21 @@ typedef iter_params self_type ; - iptr_type _verb ; + iptr_type _verb ; // logfile output verbosity + iptr_type _nprt ; // no. threads + + iptr_type _iter ; // no. iterations - iptr_type _iter ; + real_type _beta ; // QHM momentum coeff. + real_type _zeta ; // QHM momentum coeff. - real_type _qtol ; - real_type _qlim ; + real_type _qtol ; // convergence tolerance + real_type _qlim ; // fallback score threshold - bool_type _zip_ ; - bool_type _div_ ; - bool_type _tria ; - bool_type _dual ; + bool_type _zip_ ; // do cell merge operations + bool_type _div_ ; // do cell split operations + bool_type _tria ; // mesh cell optimisation + bool_type _dual ; // dual cell optimisation public : @@ -90,12 +98,19 @@ jigsaw_jig_t _jjig ; jigsaw_null_jig_t( &_jjig ) ; - this->_verb = + this->_verb = iptr_type(_jjig._verbosity) ; - - this->_iter = + this->_nprt = + iptr_type(_jjig._numthread) ; + + this->_iter = iptr_type(_jjig._optm_iter) ; + this->_beta = + real_type(_jjig._optm_beta) ; + this->_zeta = + real_type(_jjig._optm_zeta) ; + this->_qtol = real_type(_jjig._optm_qtol) ; this->_qlim = @@ -116,12 +131,25 @@ ) { return this->_verb ; } + __inline_call iptr_type & nprt ( + ) + { return this->_nprt ; + } __inline_call iptr_type & iter ( ) { return this->_iter ; } + __inline_call real_type & beta ( + ) + { return this->_beta ; + } + __inline_call real_type & zeta ( + ) + { return this->_zeta ; + } + __inline_call real_type & qtol ( ) { return this->_qtol ; @@ -153,12 +181,25 @@ ) const { return this->_verb ; } + __inline_call iptr_type const& nprt ( + ) const + { return this->_nprt ; + } __inline_call iptr_type const& iter ( ) const { return this->_iter ; } + __inline_call real_type const& beta ( + ) const + { return this->_beta ; + } + __inline_call real_type const& zeta ( + ) const + { return this->_zeta ; + } + __inline_call real_type const& qtol ( ) const { return this->_qtol ; diff --git a/external/jigsaw/src/libcpp/parameters/mesh_params.hpp b/external/jigsaw/src/libcpp/parameters/mesh_params.hpp index 44df3bc..a1ffa5e 100644 --- a/external/jigsaw/src/libcpp/parameters/mesh_params.hpp +++ b/external/jigsaw/src/libcpp/parameters/mesh_params.hpp @@ -22,18 +22,22 @@ * how they can obtain it for free, then you are not * required to make any arrangement with me.) * - * Disclaimer: Neither I nor: Columbia University, The - * Massachusetts Institute of Technology, The - * University of Sydney, nor The National Aeronautics - * and Space Administration warrant this code in any - * way whatsoever. This code is provided "as-is" to be - * used at your own risk. + * Disclaimer: Neither I nor THE CONTRIBUTORS warrant + * this code in any way whatsoever. This code is + * provided "as-is" to be used at your own risk. + * + * THE CONTRIBUTORS include: + * (a) The University of Sydney + * (b) The Massachusetts Institute of Technology + * (c) Columbia University + * (d) The National Aeronautics & Space Administration + * (e) Los Alamos National Laboratory * -------------------------------------------------------- * - * Last updated: 10 Jul., 2021 + * Last updated: 12 Dec., 2022 * - * Copyright 2013-2021 + * Copyright 2013-2022 * Darren Engwirda * d.engwirda@gmail.com * https://github.com/dengwirda/ @@ -81,6 +85,7 @@ last_kind } ; iptr_type _verb ; // logfile output verbosity + iptr_type _nprt ; // no. threads iptr_type _seed ; // no. init. "seed" nodes @@ -112,7 +117,7 @@ real_type _off2 ; // 2-off. radius-edge ratio real_type _off3 ; // 3-off. radius-edge ratio - + real_type _snk2 ; // 2-dim. sink "safe" ratio real_type _snk3 ; // 3-dim. sink "safe" ratio @@ -145,67 +150,69 @@ jigsaw_jig_t _jjig ; jigsaw_null_jig_t( &_jjig ) ; - this->_verb = + this->_verb = iptr_type(_jjig._verbosity) ; + this->_nprt = + iptr_type(_jjig._numthread) ; - this->_seed = + this->_seed = iptr_type(_jjig._geom_seed) ; this->_phi1 = real_type(60) ; this->_phi2 = real_type(60) ; - this->_eta1 = + this->_eta1 = real_type(_jjig._geom_eta1) ; - this->_eta2 = + this->_eta2 = real_type(_jjig._geom_eta2) ; - this->_feat = + this->_feat = bool_type(_jjig._geom_feat) ; - this->_near = + this->_near = real_type(_jjig._init_near) ; - this->_dims = + this->_dims = iptr_type(_jjig._mesh_dims) ; - this->_iter = + this->_iter = iptr_type(_jjig._mesh_iter) ; - this->_rule = + this->_rule = iptr_type(init_rule()) ; - this->_siz1 = + this->_siz1 = real_type(_jjig._mesh_siz1) ; - this->_siz2 = + this->_siz2 = real_type(_jjig._mesh_siz2) ; - this->_siz3 = + this->_siz3 = real_type(_jjig._mesh_siz3) ; - this->_eps1 = + this->_eps1 = real_type(_jjig._mesh_eps1) ; - this->_eps2 = + this->_eps2 = real_type(_jjig._mesh_eps2) ; - this->_rad2 = + this->_rad2 = real_type(_jjig._mesh_rad2) ; - this->_rad3 = + this->_rad3 = real_type(_jjig._mesh_rad3) ; this->_off2 = real_type(_jjig._mesh_off2) ; - this->_off3 = + this->_off3 = real_type(_jjig._mesh_off3) ; - this->_snk2 = + this->_snk2 = real_type(_jjig._mesh_snk2) ; - this->_snk3 = + this->_snk3 = real_type(_jjig._mesh_snk3) ; - this->_vol3 = + this->_vol3 = real_type(_jjig._mesh_vol3) ; this->_top1 = bool_type(_jjig._mesh_top1) ; - this->_top2 = + this->_top2 = bool_type(_jjig._mesh_top2) ; } @@ -214,6 +221,10 @@ ) { return this->_verb ; } + __inline_call iptr_type & nprt ( + ) + { return this->_nprt ; + } __inline_call iptr_type & rule ( ) @@ -331,6 +342,10 @@ ) const { return this->_verb ; } + __inline_call iptr_type const& nprt ( + ) const + { return this->_nprt ; + } __inline_call iptr_type const& rule ( ) const diff --git a/external/jigsaw/src/libcpp/predicate/bisect_k.hpp b/external/jigsaw/src/libcpp/predicate/bisect_k.hpp index d1504ea..bb3a730 100644 --- a/external/jigsaw/src/libcpp/predicate/bisect_k.hpp +++ b/external/jigsaw/src/libcpp/predicate/bisect_k.hpp @@ -22,16 +22,20 @@ * how they can obtain it for free, then you are not * required to make any arrangement with me.) * - * Disclaimer: Neither I nor: Columbia University, The - * Massachusetts Institute of Technology, The - * University of Sydney, nor The National Aeronautics - * and Space Administration warrant this code in any - * way whatsoever. This code is provided "as-is" to be - * used at your own risk. + * Disclaimer: Neither I nor THE CONTRIBUTORS warrant + * this code in any way whatsoever. This code is + * provided "as-is" to be used at your own risk. + * + * THE CONTRIBUTORS include: + * (a) The University of Sydney + * (b) The Massachusetts Institute of Technology + * (c) Columbia University + * (d) The National Aeronautics & Space Administration + * (e) Los Alamos National Laboratory * -------------------------------------------------------- * - * Last updated: 30 April, 2020 + * Last updated: 30 Apr., 2020 * * Copyright 2020-- * Darren Engwirda diff --git a/external/jigsaw/src/libcpp/predicate/inball_k.hpp b/external/jigsaw/src/libcpp/predicate/inball_k.hpp index 9d7db0e..fbc7dfe 100644 --- a/external/jigsaw/src/libcpp/predicate/inball_k.hpp +++ b/external/jigsaw/src/libcpp/predicate/inball_k.hpp @@ -22,16 +22,20 @@ * how they can obtain it for free, then you are not * required to make any arrangement with me.) * - * Disclaimer: Neither I nor: Columbia University, The - * Massachusetts Institute of Technology, The - * University of Sydney, nor The National Aeronautics - * and Space Administration warrant this code in any - * way whatsoever. This code is provided "as-is" to be - * used at your own risk. + * Disclaimer: Neither I nor THE CONTRIBUTORS warrant + * this code in any way whatsoever. This code is + * provided "as-is" to be used at your own risk. + * + * THE CONTRIBUTORS include: + * (a) The University of Sydney + * (b) The Massachusetts Institute of Technology + * (c) Columbia University + * (d) The National Aeronautics & Space Administration + * (e) Los Alamos National Laboratory * -------------------------------------------------------- * - * Last updated: 30 April, 2020 + * Last updated: 30 Apr., 2020 * * Copyright 2020-- * Darren Engwirda diff --git a/external/jigsaw/src/libcpp/predicate/orient_k.hpp b/external/jigsaw/src/libcpp/predicate/orient_k.hpp index 7fcac4b..fe6505d 100644 --- a/external/jigsaw/src/libcpp/predicate/orient_k.hpp +++ b/external/jigsaw/src/libcpp/predicate/orient_k.hpp @@ -22,16 +22,20 @@ * how they can obtain it for free, then you are not * required to make any arrangement with me.) * - * Disclaimer: Neither I nor: Columbia University, The - * Massachusetts Institute of Technology, The - * University of Sydney, nor The National Aeronautics - * and Space Administration warrant this code in any - * way whatsoever. This code is provided "as-is" to be - * used at your own risk. + * Disclaimer: Neither I nor THE CONTRIBUTORS warrant + * this code in any way whatsoever. This code is + * provided "as-is" to be used at your own risk. + * + * THE CONTRIBUTORS include: + * (a) The University of Sydney + * (b) The Massachusetts Institute of Technology + * (c) Columbia University + * (d) The National Aeronautics & Space Administration + * (e) Los Alamos National Laboratory * -------------------------------------------------------- * - * Last updated: 30 April, 2020 + * Last updated: 30 Apr., 2020 * * Copyright 2020-- * Darren Engwirda diff --git a/external/jigsaw/src/libcpp/predicate/predicate_k.hpp b/external/jigsaw/src/libcpp/predicate/predicate_k.hpp index 114303d..dfb2b05 100644 --- a/external/jigsaw/src/libcpp/predicate/predicate_k.hpp +++ b/external/jigsaw/src/libcpp/predicate/predicate_k.hpp @@ -47,16 +47,20 @@ * how they can obtain it for free, then you are not * required to make any arrangement with me.) * - * Disclaimer: Neither I nor: Columbia University, The - * Massachusetts Institute of Technology, The - * University of Sydney, nor The National Aeronautics - * and Space Administration warrant this code in any - * way whatsoever. This code is provided "as-is" to be - * used at your own risk. + * Disclaimer: Neither I nor THE CONTRIBUTORS warrant + * this code in any way whatsoever. This code is + * provided "as-is" to be used at your own risk. + * + * THE CONTRIBUTORS include: + * (a) The University of Sydney + * (b) The Massachusetts Institute of Technology + * (c) Columbia University + * (d) The National Aeronautics & Space Administration + * (e) Los Alamos National Laboratory * -------------------------------------------------------- * - * Last updated: 30 April, 2020 + * Last updated: 30 Apr., 2020 * * Copyright 2020-- * Darren Engwirda diff --git a/external/jigsaw/src/libcpp/rdel_mesh/rdel_base_2.hpp b/external/jigsaw/src/libcpp/rdel_mesh/rdel_base_2.hpp index 58b3ad8..bc38cb3 100644 --- a/external/jigsaw/src/libcpp/rdel_mesh/rdel_base_2.hpp +++ b/external/jigsaw/src/libcpp/rdel_mesh/rdel_base_2.hpp @@ -22,16 +22,20 @@ * how they can obtain it for free, then you are not * required to make any arrangement with me.) * - * Disclaimer: Neither I nor: Columbia University, The - * Massachusetts Institute of Technology, The - * University of Sydney, nor The National Aeronautics - * and Space Administration warrant this code in any - * way whatsoever. This code is provided "as-is" to be - * used at your own risk. + * Disclaimer: Neither I nor THE CONTRIBUTORS warrant + * this code in any way whatsoever. This code is + * provided "as-is" to be used at your own risk. + * + * THE CONTRIBUTORS include: + * (a) The University of Sydney + * (b) The Massachusetts Institute of Technology + * (c) Columbia University + * (d) The National Aeronautics & Space Administration + * (e) Los Alamos National Laboratory * -------------------------------------------------------- * - * Last updated: 21 Apr., 2021 + * Last updated: 12 Jul., 2021 * * Copyright 2013-2021 * Darren Engwirda @@ -138,9 +142,9 @@ > __static_call __normal_call bool_type clip_dual ( - mesh_type &_mesh, - half_list &_hset, - real_type *_ppos, + mesh_type &_mesh, // mesh object + half_list &_hset, // list of halfspace objects + real_type *_ppos, // point to test bool_type &_safe, real_type _rtol ) @@ -205,15 +209,15 @@ __static_call __normal_call bool_type edge_ball ( - geom_type &_geom, - mesh_type &_mesh, - iptr_type _tadj, - iptr_type _eadj, - real_type *_ebal, - real_type *_sbal, - char_type &_feat, - char_type &_topo, - iptr_type &_part + geom_type &_geom, // geometry object + mesh_type &_mesh, // mesh object + iptr_type _tadj, // index of adj. simplex + iptr_type _eadj, // index of edge in adj. cell + real_type *_ebal, // circumball on edge + real_type *_sbal, // circumball on geometry + char_type &_feat, // returned feature kind + char_type *_topo, // returned topology tag + iptr_type &_part // returned geometry tag ) { real_type static const _rEPS = @@ -379,27 +383,22 @@ /*--------------------------- test loc. intersections */ auto _iful = _pred._list.tend() ; - auto _imin = _pred._list.tend() ; + auto _imax = _pred._list.tend() ; real_type _RTOL = _rEPS*_radj; - real_type _dmin = - +std::numeric_limits - ::infinity() ; + real_type _dmax = + -std::numeric_limits::infinity() ; real_type _dful = - -std::numeric_limits - ::infinity() ; + -std::numeric_limits::infinity() ; bool_type _safe ; - for (auto _iter = - _pred._list.head() ; - _iter != - _pred._list.tend() ; + for (auto _iter = _pred._list.head() ; + _iter != _pred._list.tend() ; ++_iter ) { - if (clip_dual( _mesh, _hset , - &_iter->pval( 0), - _safe, _RTOL) ) + if (clip_dual( _mesh, _hset, + &_iter->pval(0), _safe, _RTOL) ) { /*--------------------------- prune near-degeneracies */ if(!_safe) @@ -430,10 +429,10 @@ &_iter->pval( 0)) ; /*--------------------------- keep furthest from ball */ - if (_dsqr < _dmin ) + if (_dsqr > _dmax ) { - _dmin = _dsqr ; - _imin = _iter ; + _dmax = _dsqr ; + _imax = _iter ; } if (_dsqr > _dful && @@ -445,8 +444,7 @@ } } - if (_iful != - _pred._list.tend() ) + if (_iful != _pred._list.tend() ) { /*--------------------------- keep best intersections */ _sbal[ 0] = _iful->pval(0); @@ -454,7 +452,9 @@ _part = _iful->itag (); _feat = _iful->feat (); - _topo = _iful->topo (); + + _topo[ 0] = _iful->topo(0); + _topo[ 1] = _iful->topo(1); /*--------------------------- eval. surf. ball radius */ _sbal[ 2]+= @@ -472,16 +472,17 @@ return ( true ) ; } else - if (_imin != - _pred._list.tend() ) + if (_imax != _pred._list.tend() ) { /*--------------------------- keep best intersections */ - _sbal[ 0] = _imin->pval(0); - _sbal[ 1] = _imin->pval(1); + _sbal[ 0] = _imax->pval(0); + _sbal[ 1] = _imax->pval(1); - _part = _imin->itag (); - _feat = _imin->feat (); - _topo = _imin->topo (); + _part = _imax->itag (); + _feat = _imax->feat (); + + _topo[ 0] = _imax->topo(0); + _topo[ 1] = _imax->topo(1); /*--------------------------- eval. surf. ball radius */ _sbal[ 2]+= @@ -510,11 +511,11 @@ __static_call __inline_call bool_type tria_ball ( - geom_type &_geom, - mesh_type &_mesh, - iptr_type _tpos, - real_type *_tbal, - iptr_type &_part + geom_type &_geom, // geometry object + mesh_type &_mesh, // mesh object + iptr_type _tpos, // index of adj. simplex + real_type *_tbal, // circumball on cell + iptr_type &_part // returned geometry tag ) { /*--------------------------- assemble local indexing */ @@ -549,9 +550,35 @@ _tbal[2]/= (real_type)+3. ; + /*--------------------------- init. local inpoly ball */ + + // nudge away from orthoball, to sanitise degenerate + // cases adj. to sharp boundaries + + real_type static const _bump = + std::pow(std::numeric_limits + ::epsilon(), +0.5) ; + + real_type _test[2] ; + _test[0] = (real_type)1./3. * ( + _mesh._tria.node(_tnod[0])->pval(0) + + _mesh._tria.node(_tnod[1])->pval(0) + + _mesh._tria.node(_tnod[2])->pval(0) + ) ; + _test[1] = (real_type)1./3. * ( + _mesh._tria.node(_tnod[0])->pval(1) + + _mesh._tria.node(_tnod[1])->pval(1) + + _mesh._tria.node(_tnod[2])->pval(1) + ) ; + + _test[0] = (1.0 - _bump) * _tbal[0] + + (0.0 + _bump) * _test[0] ; + _test[1] = (1.0 - _bump) * _tbal[1] + + (0.0 + _bump) * _test[1] ; + /*------------------------- evaluate "in--out" status */ if (_part <= -1 && (_part = - _geom.is_inside(_tbal)) < +0) + _geom.is_inside(_test)) < +0) { /*------------------------- is not a restricted facet */ return false ; diff --git a/external/jigsaw/src/libcpp/rdel_mesh/rdel_base_3.hpp b/external/jigsaw/src/libcpp/rdel_mesh/rdel_base_3.hpp index 97ac901..06799d6 100644 --- a/external/jigsaw/src/libcpp/rdel_mesh/rdel_base_3.hpp +++ b/external/jigsaw/src/libcpp/rdel_mesh/rdel_base_3.hpp @@ -22,16 +22,20 @@ * how they can obtain it for free, then you are not * required to make any arrangement with me.) * - * Disclaimer: Neither I nor: Columbia University, The - * Massachusetts Institute of Technology, The - * University of Sydney, nor The National Aeronautics - * and Space Administration warrant this code in any - * way whatsoever. This code is provided "as-is" to be - * used at your own risk. + * Disclaimer: Neither I nor THE CONTRIBUTORS warrant + * this code in any way whatsoever. This code is + * provided "as-is" to be used at your own risk. + * + * THE CONTRIBUTORS include: + * (a) The University of Sydney + * (b) The Massachusetts Institute of Technology + * (c) Columbia University + * (d) The National Aeronautics & Space Administration + * (e) Los Alamos National Laboratory * -------------------------------------------------------- * - * Last updated: 21 Apr., 2021 + * Last updated: 12 Jul., 2021 * * Copyright 2013-2021 * Darren Engwirda @@ -150,9 +154,9 @@ > __static_call __normal_call bool_type clip_dual ( - mesh_type &_mesh, - half_list &_hset, - real_type *_ppos, + mesh_type &_mesh, // mesh object + half_list &_hset, // list of halfspace objects + real_type *_ppos, // point to test bool_type &_safe, real_type _rtol ) @@ -225,11 +229,11 @@ > __static_call __normal_call void_type edge_loop ( - mesh_type &_mesh, - iptr_type *_enod, - iptr_type _tadj, - iptr_type _fadj, - list_type &_loop + mesh_type &_mesh, // mesh object + iptr_type *_enod, // array of edge node indexing + iptr_type _tadj, // index of adj. simplex + iptr_type _fadj, // index of face in adj. cell + list_type &_loop // list of cells adj. to edge ) { /*----------------- assemble edge-adj. cells in-order */ @@ -292,15 +296,15 @@ __static_call __normal_call bool_type edge_ball ( - geom_type &_geom, - mesh_type &_mesh, - iptr_type _tadj, - iptr_type _eadj, - real_type *_ebal, - real_type *_sbal, - char_type &_feat, - char_type &_topo, - iptr_type &_part + geom_type &_geom, // geometry object + mesh_type &_mesh, // mesh object + iptr_type _tadj, // index of adj. simplex + iptr_type _eadj, // index of edge in adj. cell + real_type *_ebal, // circumball on edge + real_type *_sbal, // circumball on geometry + char_type &_feat, // returned feature kind + char_type *_topo, // returned topology tag + iptr_type &_part // returned geometry tag ) { real_type static const _rEPS = @@ -498,27 +502,22 @@ /*--------------------------- test loc. intersections */ auto _iful = _pred._list.tend() ; - auto _imin = _pred._list.tend() ; + auto _imax = _pred._list.tend() ; real_type _RTOL = _rEPS*_radj; - real_type _dmin = - +std::numeric_limits - ::infinity() ; + real_type _dmax = + -std::numeric_limits::infinity() ; real_type _dful = - -std::numeric_limits - ::infinity() ; + -std::numeric_limits::infinity() ; bool_type _safe ; - for (auto _iter = - _pred._list.head() ; - _iter != - _pred._list.tend() ; + for (auto _iter = _pred._list.head() ; + _iter != _pred._list.tend() ; ++_iter ) { - if (clip_dual( _mesh, _hset , - &_iter->pval( 0), - _safe, _RTOL) ) + if (clip_dual( _mesh, _hset, + &_iter->pval(0), _safe, _RTOL) ) { /*--------------------------- prune near-degeneracies */ if(!_safe) @@ -555,10 +554,10 @@ &_iter->pval( 0)) ; /*--------------------------- keep furthest from ball */ - if (_dsqr < _dmin ) + if (_dsqr > _dmax ) { - _dmin = _dsqr ; - _imin = _iter ; + _dmax = _dsqr ; + _imax = _iter ; } if (_dsqr > _dful && @@ -570,8 +569,7 @@ } } - if (_iful != - _pred._list.tend() ) + if(_iful != _pred._list.tend() ) { /*--------------------------- keep best intersections */ _sbal[ 0] = _iful->pval(0); @@ -580,7 +578,9 @@ _part = _iful->itag (); _feat = _iful->feat (); - _topo = _iful->topo (); + + _topo[ 0] = _iful->topo(0); + _topo[ 1] = _iful->topo(1); /*--------------------------- eval. surf. ball radius */ _sbal[ 3]+= @@ -598,17 +598,18 @@ return ( true ) ; } else - if (_imin != - _pred._list.tend() ) + if(_imax != _pred._list.tend() ) { /*--------------------------- keep best intersections */ - _sbal[ 0] = _imin->pval(0); - _sbal[ 1] = _imin->pval(1); - _sbal[ 2] = _imin->pval(2); + _sbal[ 0] = _imax->pval(0); + _sbal[ 1] = _imax->pval(1); + _sbal[ 2] = _imax->pval(2); + + _part = _imax->itag (); + _feat = _imax->feat (); - _part = _imin->itag (); - _feat = _imin->feat (); - _topo = _imin->topo (); + _topo[ 0] = _imax->topo(0); + _topo[ 1] = _imax->topo(1); /*--------------------------- eval. surf. ball radius */ _sbal[ 3]+= @@ -637,15 +638,15 @@ __static_call __normal_call bool_type face_ball ( - geom_type &_geom, - mesh_type &_mesh, - iptr_type _tadj, - iptr_type _fadj, - real_type *_fbal, - real_type *_sbal, - char_type &_feat, - char_type &_topo, - iptr_type &_part + geom_type &_geom, // geometry object + mesh_type &_mesh, // mesh object + iptr_type _tadj, // index of adj. simplex + iptr_type _fadj, // index of face in adj. cell + real_type *_fbal, // circumball on edge + real_type *_sbal, // circumball on geometry + char_type &_feat, // returned feature kind + char_type *_topo, // returned topology tag + iptr_type &_part // returned geometry tag ) { real_type static const _rEPS = @@ -840,27 +841,22 @@ /*--------------------------- test loc. intersections */ auto _iful = _pred._list.tend() ; - auto _imin = _pred._list.tend() ; + auto _imax = _pred._list.tend() ; real_type _RTOL = _rEPS*_radj; - real_type _dmin = - +std::numeric_limits - ::infinity() ; + real_type _dmax = + -std::numeric_limits::infinity() ; real_type _dful = - -std::numeric_limits - ::infinity() ; + -std::numeric_limits::infinity() ; bool_type _safe ; - for (auto _iter = - _pred._list.head() ; - _iter != - _pred._list.tend() ; + for (auto _iter = _pred._list.head() ; + _iter != _pred._list.tend() ; ++_iter ) { - if (clip_dual( _mesh, _hset , - &_iter->pval( 0), - _safe, _RTOL) ) + if (clip_dual( _mesh, _hset, + &_iter->pval(0), _safe, _RTOL) ) { /*--------------------------- prune near-degeneracies */ if(!_safe) @@ -892,10 +888,10 @@ &_iter->pval( 0)) ; /*--------------------------- keep furthest from ball */ - if (_dsqr < _dmin ) + if (_dsqr > _dmax ) { - _dmin = _dsqr ; - _imin = _iter ; + _dmax = _dsqr ; + _imax = _iter ; } if (_dsqr > _dful && @@ -907,8 +903,7 @@ } } - if (_iful != - _pred._list.tend() ) + if(_iful != _pred._list.tend() ) { /*--------------------------- keep best intersections */ _sbal[ 0] = _iful->pval(0); @@ -917,7 +912,9 @@ _part = _iful->itag (); _feat = _iful->feat (); - _topo = _iful->topo (); + + _topo[ 0] = _iful->topo(0); + _topo[ 1] = _iful->topo(1); /*--------------------------- eval. surf. ball radius */ _sbal[ 3]+= @@ -939,17 +936,18 @@ return ( true ) ; } else - if (_imin != - _pred._list.tend() ) + if(_imax != _pred._list.tend() ) { /*--------------------------- keep best intersections */ - _sbal[ 0] = _imin->pval(0); - _sbal[ 1] = _imin->pval(1); - _sbal[ 2] = _imin->pval(2); + _sbal[ 0] = _imax->pval(0); + _sbal[ 1] = _imax->pval(1); + _sbal[ 2] = _imax->pval(2); + + _part = _imax->itag (); + _feat = _imax->feat (); - _part = _imin->itag (); - _feat = _imin->feat (); - _topo = _imin->topo (); + _topo[ 0] = _imax->topo(0); + _topo[ 1] = _imax->topo(1); /*--------------------------- eval. surf. ball radius */ _sbal[ 3]+= @@ -982,11 +980,11 @@ __static_call __inline_call bool_type tria_ball ( - geom_type &_geom, - mesh_type &_mesh, - iptr_type _tpos, - real_type *_tbal, - iptr_type &_part + geom_type &_geom, // geometry object + mesh_type &_mesh, // mesh object + iptr_type _tpos, // index of adj. simplex + real_type *_tbal, // circumball on cell + iptr_type &_part // returned geometry tag ) { /*--------------------------- assemble local indexing */ @@ -1029,9 +1027,45 @@ _tbal[3]/= (real_type)+4. ; + /*--------------------------- init. local inpoly ball */ + + // nudge away from orthoball, to sanitise degenerate + // cases adj. to sharp boundaries + + real_type static const _bump = + std::pow(std::numeric_limits + ::epsilon(), +0.5) ; + + real_type _test[3] ; + _test[0] = (real_type)1./4. * ( + _mesh._tria.node(_tnod[0])->pval(0) + + _mesh._tria.node(_tnod[1])->pval(0) + + _mesh._tria.node(_tnod[2])->pval(0) + + _mesh._tria.node(_tnod[3])->pval(0) + ) ; + _test[1] = (real_type)1./4. * ( + _mesh._tria.node(_tnod[0])->pval(1) + + _mesh._tria.node(_tnod[1])->pval(1) + + _mesh._tria.node(_tnod[2])->pval(1) + + _mesh._tria.node(_tnod[3])->pval(1) + ) ; + _test[2] = (real_type)1./4. * ( + _mesh._tria.node(_tnod[0])->pval(2) + + _mesh._tria.node(_tnod[1])->pval(2) + + _mesh._tria.node(_tnod[2])->pval(2) + + _mesh._tria.node(_tnod[3])->pval(2) + ) ; + + _test[0] = (1.0 - _bump) * _tbal[0] + + (0.0 + _bump) * _test[0] ; + _test[1] = (1.0 - _bump) * _tbal[1] + + (0.0 + _bump) * _test[1] ; + _test[2] = (1.0 - _bump) * _tbal[2] + + (0.0 + _bump) * _test[2] ; + /*------------------------- evaluate "in--out" status */ if (_part <= -1 && (_part = - _geom.is_inside(_tbal)) < +0) + _geom.is_inside(_test)) < +0) { /*------------------------- is not a restricted facet */ return false ; diff --git a/external/jigsaw/src/libcpp/rdel_mesh/rdel_complex_2.hpp b/external/jigsaw/src/libcpp/rdel_mesh/rdel_complex_2.hpp index 318b00f..f93a07b 100644 --- a/external/jigsaw/src/libcpp/rdel_mesh/rdel_complex_2.hpp +++ b/external/jigsaw/src/libcpp/rdel_mesh/rdel_complex_2.hpp @@ -22,18 +22,22 @@ * how they can obtain it for free, then you are not * required to make any arrangement with me.) * - * Disclaimer: Neither I nor: Columbia University, The - * Massachusetts Institute of Technology, The - * University of Sydney, nor The National Aeronautics - * and Space Administration warrant this code in any - * way whatsoever. This code is provided "as-is" to be - * used at your own risk. + * Disclaimer: Neither I nor THE CONTRIBUTORS warrant + * this code in any way whatsoever. This code is + * provided "as-is" to be used at your own risk. + * + * THE CONTRIBUTORS include: + * (a) The University of Sydney + * (b) The Massachusetts Institute of Technology + * (c) Columbia University + * (d) The National Aeronautics & Space Administration + * (e) Los Alamos National Laboratory * -------------------------------------------------------- * - * Last updated: 24 Feb., 2021 + * Last updated: 02 Aug., 2022 * - * Copyright 2013-2021 + * Copyright 2013-2022 * Darren Engwirda * d.engwirda@gmail.com * https://github.com/dengwirda/ @@ -77,61 +81,57 @@ iptr_type _part = 0 ; char_type _fdim = 0 ; - char_type _feat = 0 ; - char_type _topo = 0 ; + + char_type _topo [ 2] = {+2} ; public : __inline_call iptr_type & idxh ( ) - { - return this->_idxh ; + { return this->_idxh ; } __inline_call iptr_type const& idxh ( ) const - { - return this->_idxh ; + { return this->_idxh ; } __inline_call iptr_type & part ( ) - { - return this->_part ; + { return this->_part ; } __inline_call iptr_type const& part ( ) const - { - return this->_part ; + { return this->_part ; } __inline_call char_type & fdim ( ) - { - return this->_fdim ; + { return this->_fdim ; } __inline_call char_type const& fdim ( ) const - { - return this->_fdim ; + { return this->_fdim ; } __inline_call char_type & feat ( ) - { - return this->_feat ; + { return this->_feat ; } __inline_call char_type const& feat ( ) const - { - return this->_feat ; + { return this->_feat ; } __inline_call char_type & topo ( + char_type _kind = filt_topo ) - { - return this->_topo ; + { return ( _kind == filt_topo ) ? + this->_topo[ +0] : + this->_topo[ +1] ; } __inline_call char_type const& topo ( + char_type _kind = filt_topo ) const - { - return this->_topo ; + { return ( _kind == filt_topo ) ? + this->_topo[ +0] : + this->_topo[ +1] ; } } ; @@ -146,14 +146,12 @@ __inline_call real_type & circ ( iptr_type _ipos ) - { - return this->_circ[ _ipos] ; + { return this->_circ[ _ipos] ; } __inline_call real_type const& circ ( iptr_type _ipos ) const - { - return this->_circ[ _ipos] ; + { return this->_circ[ _ipos] ; } } ; @@ -389,12 +387,12 @@ pool_base _npol ; pool_base _bpol ; - pool_base _epol ; + pool_base _epol, _e2nd ; pool_base _tpol ; node_list _nset ; ball_list _bset ; - edge_list _eset ; + edge_list _eset, _etwo ; tria_list _tset ; public : @@ -406,6 +404,8 @@ _bpol( sizeof(typename ball_list::item_type)) , _epol( + sizeof(typename edge_list::item_type)) , + _e2nd( sizeof(typename edge_list::item_type)) , _tpol( sizeof(typename tria_list::item_type)) , @@ -419,6 +419,9 @@ _eset(edge_hash(), edge_pred(), +.8, (pool_wrap(&_epol))) , + _etwo(edge_hash(), + edge_pred(), + +.8, (pool_wrap(&_e2nd))) , _tset(tria_hash(), tria_pred(), +.8, (pool_wrap(&_tpol))) diff --git a/external/jigsaw/src/libcpp/rdel_mesh/rdel_complex_3.hpp b/external/jigsaw/src/libcpp/rdel_mesh/rdel_complex_3.hpp index 7e0451b..0f5b8d7 100644 --- a/external/jigsaw/src/libcpp/rdel_mesh/rdel_complex_3.hpp +++ b/external/jigsaw/src/libcpp/rdel_mesh/rdel_complex_3.hpp @@ -22,18 +22,22 @@ * how they can obtain it for free, then you are not * required to make any arrangement with me.) * - * Disclaimer: Neither I nor: Columbia University, The - * Massachusetts Institute of Technology, The - * University of Sydney, nor The National Aeronautics - * and Space Administration warrant this code in any - * way whatsoever. This code is provided "as-is" to be - * used at your own risk. + * Disclaimer: Neither I nor THE CONTRIBUTORS warrant + * this code in any way whatsoever. This code is + * provided "as-is" to be used at your own risk. + * + * THE CONTRIBUTORS include: + * (a) The University of Sydney + * (b) The Massachusetts Institute of Technology + * (c) Columbia University + * (d) The National Aeronautics & Space Administration + * (e) Los Alamos National Laboratory * -------------------------------------------------------- * - * Last updated: 24 Feb., 2021 + * Last updated: 02 Aug., 2022 * - * Copyright 2013-2021 + * Copyright 2013-2022 * Darren Engwirda * d.engwirda@gmail.com * https://github.com/dengwirda/ @@ -79,59 +83,56 @@ char_type _fdim = 0 ; char_type _feat = 0 ; - char_type _topo = 0 ; + + char_type _topo [ 2] = {+2} ; public : __inline_call iptr_type & idxh ( ) - { - return this->_idxh ; + { return this->_idxh ; } __inline_call iptr_type const& idxh ( ) const - { - return this->_idxh ; + { return this->_idxh ; } __inline_call iptr_type & part ( ) - { - return this->_part ; + { return this->_part ; } __inline_call iptr_type const& part ( ) const - { - return this->_part ; + { return this->_part ; } __inline_call char_type & fdim ( ) - { - return this->_fdim ; + { return this->_fdim ; } __inline_call char_type const& fdim ( ) const - { - return this->_fdim ; + { return this->_fdim ; } __inline_call char_type & feat ( ) - { - return this->_feat ; + { return this->_feat ; } __inline_call char_type const& feat ( ) const - { - return this->_feat ; + { return this->_feat ; } __inline_call char_type & topo ( + char_type _kind = filt_topo ) - { - return this->_topo ; + { return ( _kind == filt_topo ) ? + this->_topo[ +0] : + this->_topo[ +1] ; } __inline_call char_type const& topo ( + char_type _kind = filt_topo ) const - { - return this->_topo ; + { return ( _kind == filt_topo ) ? + this->_topo[ +0] : + this->_topo[ +1] ; } } ; @@ -152,8 +153,7 @@ __inline_call real_type const& circ ( iptr_type _ipos ) const - { - return this->_circ[ _ipos] ; + { return this->_circ[ _ipos] ; } } ; @@ -207,7 +207,7 @@ char_type _kind; char_type _feat; - char_type _topo; + char_type _topo[ 2]; char_type _eadj; iptr_type _tadj; @@ -444,14 +444,14 @@ pool_base _npol ; pool_base _bpol ; - pool_base _epol ; - pool_base _fpol ; + pool_base _epol, _e2nd ; + pool_base _fpol, _f2nd ; pool_base _tpol ; node_list _nset ; ball_list _bset ; - edge_list _eset ; - face_list _fset ; + edge_list _eset, _etwo ; + face_list _fset, _ftwo ; tria_list _tset ; public : @@ -463,8 +463,12 @@ _bpol( sizeof(typename ball_list::item_type)) , _epol( + sizeof(typename edge_list::item_type)) , + _e2nd( sizeof(typename edge_list::item_type)) , _fpol( + sizeof(typename face_list::item_type)) , + _f2nd( sizeof(typename face_list::item_type)) , _tpol( sizeof(typename tria_list::item_type)) , @@ -478,9 +482,15 @@ _eset(edge_hash(), edge_pred(), +.8, (pool_wrap(&_epol))) , + _etwo(edge_hash(), + edge_pred(), + +.8, (pool_wrap(&_e2nd))) , _fset(face_hash(), face_pred(), +.8, (pool_wrap(&_fpol))) , + _ftwo(face_hash(), + face_pred(), + +.8, (pool_wrap(&_f2nd))) , _tset(tria_hash(), tria_pred(), +.8, (pool_wrap(&_tpol))) diff --git a/external/jigsaw/src/libcpp/rdel_mesh/rdel_cost_delaunay_2.inc b/external/jigsaw/src/libcpp/rdel_mesh/rdel_cost_delaunay_2.inc index 567fcbc..49e3be9 100644 --- a/external/jigsaw/src/libcpp/rdel_mesh/rdel_cost_delaunay_2.inc +++ b/external/jigsaw/src/libcpp/rdel_mesh/rdel_cost_delaunay_2.inc @@ -22,18 +22,22 @@ * how they can obtain it for free, then you are not * required to make any arrangement with me.) * - * Disclaimer: Neither I nor: Columbia University, The - * Massachusetts Institute of Technology, The - * University of Sydney, nor The National Aeronautics - * and Space Administration warrant this code in any - * way whatsoever. This code is provided "as-is" to be - * used at your own risk. + * Disclaimer: Neither I nor THE CONTRIBUTORS warrant + * this code in any way whatsoever. This code is + * provided "as-is" to be used at your own risk. + * + * THE CONTRIBUTORS include: + * (a) The University of Sydney + * (b) The Massachusetts Institute of Technology + * (c) Columbia University + * (d) The National Aeronautics & Space Administration + * (e) Los Alamos National Laboratory * -------------------------------------------------------- * - * Last updated: 21 Apr., 2021 + * Last updated: 29 Dec., 2022 * - * Copyright 2013-2021 + * Copyright 2013-2022 * Darren Engwirda * d.engwirda@gmail.com * https://github.com/dengwirda/ @@ -61,7 +65,7 @@ edge_data &_edat, iptr_type &_part, char_type &_feat, - char_type &_topo, + char_type *_topo, char_type &_kind, real_type *_ebal, real_type *_pmax @@ -69,6 +73,8 @@ { _kind = mesh::null_item ; + _edat._mark = (iptr_type)+0; + if (_args.dims() < +1) return; /*--------------------------- assemble local indexing */ @@ -88,17 +94,22 @@ /*--------------------------------- is not restricted */ return ; + /*------------------------- eval. surface-disc.-error */ + float _srat = (float) + geometry::lensqr_2d(_ebal, _pmax) ; + /*------------------------- calc. refinement priority */ - _edat._cost = (float) _pmax[2] ; + _edat._cost = (float) ( + (float)_pmax[2] * (_srat + 1.f ) ) ; /*------------------------- eval. size func. at _tbal */ real_type _esiz = (real_type)+0.; - _esiz += (real_type)+1.*_hfun.eval( + _esiz += (real_type)1./4.*_hfun.eval( &_mesh._tria. node(_enod[0])->pval(0) , _mesh._tria. node(_enod[0])->idxh()) ; - _esiz += (real_type)+1.*_hfun.eval( + _esiz += (real_type)1./4.*_hfun.eval( &_mesh._tria. node(_enod[1])->pval(0) , _mesh._tria. @@ -107,31 +118,23 @@ auto _hint = _mesh._tria.node(_enod[ 1])->idxh() ; - _esiz += (real_type)+1.0 * + _esiz += (real_type)2./4. * _hfun.eval( _pmax, _hint) ; - _esiz /= (real_type)+3.0 ; + _srat /= (float)(_esiz * _esiz) ; real_type _eave =_pmax [ +2] ; _eave /= _esiz * _esiz ; - _eave *= (real_type)+4.0 ; - - /*------------------------- eval. surface-disc.-error */ - real_type _srat = - geometry::lensqr_2d( - _ebal, _pmax)/(_esiz * _esiz) ; + _eave *= (real_type)4./1. ; /*------------------------- refinement classification */ - + // flag cells "trapped" between boundaries -- having - // all nodes on lower dimensional facets and with at - // least one boundary face. + // all nodes on lower dimensional facets... bool_type _trap = - _mesh._tria. - node(_enod[0])->fdim() < +1 && - _mesh._tria. - node(_enod[1])->fdim() < +1 ; + _mesh._tria.node(_enod[0])->fdim() < 1 && + _mesh._tria.node(_enod[1])->fdim() < 1 ; real_type _scal = 1. + _trap * .100 ; @@ -168,6 +171,8 @@ { _kind = mesh::null_item ; + _tdat._mark = (iptr_type)+0 ; + if (_args.dims() < +2) return ; /*--------------------------------- get nodes in tria */ @@ -222,13 +227,12 @@ } /*------------------------- calc. refinement priority */ - bool_type _trap = false ; - - _tdat._mark = (iptr_type) +0; + iptr_type _nbnd = +0 ; # ifdef __bias_bnds for(_enum = +3; _enum-- != +0; ) { + /*------------------------- are there bnd-adj. faces? */ iptr_type _enod[ +3]; mesh_type::tria_type:: tria_type:: @@ -250,27 +254,26 @@ item_type *_eptr = nullptr ; if (_mesh.find_edge(_edat,_eptr)) { - _trap = true ; - + _nbnd += +1 ; _tdat._mark -= +1 ; } } # endif /*------------------------- eval. radius--edge ratios */ - real_type _erat = _tbal[ 2] / - _llen[_emin] ; + float _erat = (float) ( + (float)_tbal [2] / _llen [_emin] ) ; /*------------------------- calc. refinement priority */ - _tdat._cost = (float) _erat; + _tdat._cost = (float) _erat; /*------------------------- refinement classification */ - + // flag cells "trapped" between boundaries -- having // all nodes on lower dimensional facets and with at // least one boundary face. - _trap = _trap && + bool_type _trap =_nbnd > +0 && _mesh._tria. node(_tnod[0])->fdim() < +2 && _mesh._tria. @@ -286,19 +289,24 @@ _kind = mesh::ring_item; return ; } + if (_nbnd >= +3 ) + { + _kind = mesh::ring_item; return ; + } + /*------------------------- eval. size func. at _tbal */ real_type _tsiz = (real_type)+0.; - _tsiz += (real_type)+1.*_hfun.eval( + _tsiz += (real_type)2./9.*_hfun.eval( &_mesh._tria. node(_tnod[0])->pval(0) , _mesh._tria. node(_tnod[0])->idxh()) ; - _tsiz += (real_type)+1.*_hfun.eval( + _tsiz += (real_type)2./9.*_hfun.eval( &_mesh._tria. node(_tnod[1])->pval(0) , _mesh._tria. node(_tnod[1])->idxh()) ; - _tsiz += (real_type)+1.*_hfun.eval( + _tsiz += (real_type)2./9.*_hfun.eval( &_mesh._tria. node(_tnod[2])->pval(0) , _mesh._tria. @@ -307,14 +315,12 @@ auto _hint = _mesh._tria.node(_tnod[ 2])->idxh() ; - _tsiz += (real_type)+1.0 * + _tsiz += (real_type)3./9. * _hfun.eval( _tbal, _hint) ; - _tsiz /= (real_type)+4.0 ; - real_type _eave = _tbal[ +2] ; _eave /= _tsiz * _tsiz; - _eave *= (real_type)+3.0 ; + _eave *= (real_type)3./1. ; /*------------------------- refinement classification */ _scal += (real_type)(_trap * 0.100) ; diff --git a/external/jigsaw/src/libcpp/rdel_mesh/rdel_cost_delaunay_3.inc b/external/jigsaw/src/libcpp/rdel_mesh/rdel_cost_delaunay_3.inc index c5fd417..10c2042 100644 --- a/external/jigsaw/src/libcpp/rdel_mesh/rdel_cost_delaunay_3.inc +++ b/external/jigsaw/src/libcpp/rdel_mesh/rdel_cost_delaunay_3.inc @@ -22,18 +22,22 @@ * how they can obtain it for free, then you are not * required to make any arrangement with me.) * - * Disclaimer: Neither I nor: Columbia University, The - * Massachusetts Institute of Technology, The - * University of Sydney, nor The National Aeronautics - * and Space Administration warrant this code in any - * way whatsoever. This code is provided "as-is" to be - * used at your own risk. + * Disclaimer: Neither I nor THE CONTRIBUTORS warrant + * this code in any way whatsoever. This code is + * provided "as-is" to be used at your own risk. + * + * THE CONTRIBUTORS include: + * (a) The University of Sydney + * (b) The Massachusetts Institute of Technology + * (c) Columbia University + * (d) The National Aeronautics & Space Administration + * (e) Los Alamos National Laboratory * -------------------------------------------------------- * - * Last updated: 21 Apr., 2021 + * Last updated: 29 Dec., 2022 * - * Copyright 2013-2021 + * Copyright 2013-2022 * Darren Engwirda * d.engwirda@gmail.com * https://github.com/dengwirda/ @@ -61,7 +65,7 @@ edge_data &_edat, iptr_type &_part, char_type &_feat, - char_type &_topo, + char_type *_topo, char_type &_kind, real_type *_ebal, real_type *_pmax @@ -69,6 +73,8 @@ { _kind = mesh::null_item ; + _edat._mark = (iptr_type)+0; + if (_args.dims() < +1) return; /*--------------------------- assemble local indexing */ @@ -88,17 +94,22 @@ /*--------------------------------- is not restricted */ return ; + /*------------------------- eval. surface-disc.-error */ + float _srat = (float) + geometry::lensqr_3d(_ebal, _pmax) ; + /*------------------------- calc. refinement priority */ - _edat._cost = (float) _pmax[3] ; + _edat._cost = (float) ( + (float)_pmax[3] * (_srat + 1.f ) ) ; /*------------------------- eval. size func. at _tbal */ real_type _esiz = (real_type)+0.; - _esiz += (real_type)+1.*_hfun.eval( + _esiz += (real_type)1./4.*_hfun.eval( &_mesh._tria. node(_enod[0])->pval(0) , _mesh._tria. node(_enod[0])->idxh()) ; - _esiz += (real_type)+1.*_hfun.eval( + _esiz += (real_type)1./4.*_hfun.eval( &_mesh._tria. node(_enod[1])->pval(0) , _mesh._tria. @@ -107,31 +118,23 @@ auto _hint = _mesh._tria.node(_enod[ 1])->idxh() ; - _esiz += (real_type)+1.0 * + _esiz += (real_type)2./4. * _hfun.eval( _pmax, _hint) ; - _esiz /= (real_type)+3.0 ; + _srat /= (float)(_esiz * _esiz) ; real_type _eave =_pmax [ +3] ; _eave /= _esiz * _esiz ; - _eave *= (real_type)+4.0 ; - - /*------------------------- eval. surface-disc.-error */ - real_type _srat = - geometry::lensqr_3d( - _ebal, _pmax)/(_esiz * _esiz) ; + _eave *= (real_type)4./1. ; /*------------------------- refinement classification */ - + // flag cells "trapped" between boundaries -- having - // all nodes on lower dimensional facets and with at - // least one boundary face. + // all nodes on lower dimensional facets... bool_type _trap = - _mesh._tria. - node(_enod[0])->fdim() < +1 && - _mesh._tria. - node(_enod[1])->fdim() < +1 ; + _mesh._tria.node(_enod[0])->fdim() < 1 && + _mesh._tria.node(_enod[1])->fdim() < 1 ; real_type _scal = 1. + _trap * .100 ; @@ -165,7 +168,7 @@ face_data &_fdat, iptr_type &_part, char_type &_feat, - char_type &_topo, + char_type *_topo, char_type &_kind, real_type *_tbal, real_type *_pmax @@ -173,6 +176,8 @@ { _kind = mesh::null_item ; + _fdat._mark = (iptr_type)+0; + if (_args.dims() < +2) return; /*--------------------------- assemble local indexing */ @@ -225,9 +230,7 @@ } /*------------------------- calc. refinement priority */ - bool_type _trap = false ; - - _fdat._mark = (iptr_type) +0; + iptr_type _nbnd = +0 ; # ifdef __bias_bnds for(_enum = +3; _enum-- != +0; ) @@ -253,33 +256,31 @@ item_type *_eptr = nullptr ; if (_mesh.find_edge(_edat,_eptr)) { - _trap = true ; - + _nbnd += +1 ; _fdat._mark -= +1 ; } } # endif - /*------------------------- eval. radius--edge ratios */ - real_type _prat = _pmax[ 3] / - _llen[_emin] ; - - real_type _erat = _tbal[ 3] / - _llen[_emin] ; + /*------------------------- eval. surface-disc.-error */ + float _srat = (float) + geometry::lensqr_3d(_tbal, _pmax) ; - __unreferenced(_prat); - __unreferenced(_erat); + /*------------------------- eval. radius--edge ratios */ + float _prat = (float) ( + (float)_pmax[3] / _llen[_emin] ) ; /*------------------------- calc. refinement priority */ - _fdat._cost = (float) _prat; + _fdat._cost = (float) ( + (float)_prat * (+1.f + _srat) ) ; /*------------------------- refinement classification */ - + // flag cells "trapped" between boundaries -- having // all nodes on lower dimensional facets and with at // least one boundary face. - _trap = _trap && + bool_type _trap =_nbnd > +0 && _mesh._tria. node(_fnod[0])->fdim() < +2 && _mesh._tria. @@ -295,19 +296,24 @@ _kind = mesh::ring_item; return ; } + if (_nbnd >= +3 ) + { + _kind = mesh::ring_item; return ; + } + /*------------------------- eval. size func. at _tbal */ real_type _tsiz = (real_type)+0.; - _tsiz += (real_type)+1.*_hfun.eval( + _tsiz += (real_type)2./9.*_hfun.eval( &_mesh._tria. node(_fnod[0])->pval(0) , _mesh._tria. node(_fnod[0])->idxh()) ; - _tsiz += (real_type)+1.*_hfun.eval( + _tsiz += (real_type)2./9.*_hfun.eval( &_mesh._tria. node(_fnod[1])->pval(0) , _mesh._tria. node(_fnod[1])->idxh()) ; - _tsiz += (real_type)+1.*_hfun.eval( + _tsiz += (real_type)2./9.*_hfun.eval( &_mesh._tria. node(_fnod[2])->pval(0) , _mesh._tria. @@ -316,19 +322,14 @@ auto _hint = _mesh._tria.node(_fnod[ 2])->idxh() ; - _tsiz += (real_type)+1.0 * + _tsiz += (real_type)3./9. * _hfun.eval( _pmax, _hint) ; - _tsiz /= (real_type)+4.0 ; + _srat /= (float)(_tsiz * _tsiz) ; real_type _eave =_pmax [ +3] ; _eave /= _tsiz * _tsiz; - _eave *= (real_type)+3.0 ; - - /*------------------------- eval. surface-disc/-error */ - real_type _srat = - geometry::lensqr_3d( - _tbal, _pmax)/(_tsiz * _tsiz) ; + _eave *= (real_type)3./1. ; /*------------------------- refinement classification */ _scal += (real_type)(_trap * 0.100) ; @@ -366,6 +367,8 @@ { _kind = mesh::null_item ; + _tdat._mark = (iptr_type)+0; + if (_args.dims() < +3) return; /*--------------------------------- get nodes in tria */ @@ -459,13 +462,12 @@ } /*------------------------- calc. refinement priority */ - bool_type _trap = false ; - - _tdat._mark = (iptr_type) +0; + iptr_type _nbnd = +0 ; # ifdef __bias_bnds for(_fnum = +4; _fnum-- != +0; ) { + /*------------------------- are there bnd-adj. faces? */ iptr_type _fnod[ +4]; mesh_type::tria_type::tria_type:: face_node(_fnod, _fnum, 3, 2); @@ -491,27 +493,26 @@ item_type *_fptr = nullptr ; if (_mesh.find_face(_fdat,_fptr)) { - _trap = true ; - + _nbnd += +1 ; _tdat._mark -= +1 ; } } # endif /*------------------------- eval. radius--edge ratios */ - real_type _erat = _tbal[ 3] / - _llen[_emin] ; + float _erat = (float) ( + (float)_tbal [3] / _llen [_emin] ) ; /*------------------------- calc. refinement priority */ - _tdat._cost = (float) _erat; + _tdat._cost = (float) _erat; /*------------------------- refinement classification */ - + // flag cells "trapped" between boundaries -- having // all nodes on lower dimensional facets and with at // least one boundary face. - _trap = _trap && + bool_type _trap =_nbnd > +0 && _mesh._tria. node(_tnod[0])->fdim() < +3 && _mesh._tria. @@ -529,24 +530,29 @@ _kind = mesh::ring_item; return ; } + if (_nbnd >= +4 ) + { + _kind = mesh::ring_item; return ; + } + /*------------------------- eval. size func. at _tbal */ real_type _tsiz = (real_type)+0.; - _tsiz += (real_type)+1.*_hfun.eval( + _tsiz += (real_type)3./16*_hfun.eval( &_mesh._tria. node(_tnod[0])->pval(0) , _mesh._tria. node(_tnod[0])->idxh()) ; - _tsiz += (real_type)+1.*_hfun.eval( + _tsiz += (real_type)3./16*_hfun.eval( &_mesh._tria. node(_tnod[1])->pval(0) , _mesh._tria. node(_tnod[1])->idxh()) ; - _tsiz += (real_type)+1.*_hfun.eval( + _tsiz += (real_type)3./16*_hfun.eval( &_mesh._tria. node(_tnod[2])->pval(0) , _mesh._tria. node(_tnod[2])->idxh()) ; - _tsiz += (real_type)+1.*_hfun.eval( + _tsiz += (real_type)3./16*_hfun.eval( &_mesh._tria. node(_tnod[3])->pval(0) , _mesh._tria. @@ -555,15 +561,12 @@ auto _hint = _mesh._tria.node(_tnod[ 3])->idxh() ; - _tsiz += (real_type)+1.0 * + _tsiz += (real_type)4./16 * _hfun.eval( _tbal, _hint) ; - _tsiz /= (real_type)+5.0 ; - real_type _eave = _tbal[ +3] ; _eave /= (_tsiz*_tsiz) ; - _eave *= (real_type)+8.0 / - (real_type)+3.0 ; + _eave *= (real_type)8./3. ; /*------------------------- refinement classification */ _scal += (real_type)(_trap * 0.100) ; diff --git a/external/jigsaw/src/libcpp/rdel_mesh/rdel_cost_delfront_2.inc b/external/jigsaw/src/libcpp/rdel_mesh/rdel_cost_delfront_2.inc index 6ef1bb9..2cdd16a 100644 --- a/external/jigsaw/src/libcpp/rdel_mesh/rdel_cost_delfront_2.inc +++ b/external/jigsaw/src/libcpp/rdel_mesh/rdel_cost_delfront_2.inc @@ -22,18 +22,22 @@ * how they can obtain it for free, then you are not * required to make any arrangement with me.) * - * Disclaimer: Neither I nor: Columbia University, The - * Massachusetts Institute of Technology, The - * University of Sydney, nor The National Aeronautics - * and Space Administration warrant this code in any - * way whatsoever. This code is provided "as-is" to be - * used at your own risk. + * Disclaimer: Neither I nor THE CONTRIBUTORS warrant + * this code in any way whatsoever. This code is + * provided "as-is" to be used at your own risk. + * + * THE CONTRIBUTORS include: + * (a) The University of Sydney + * (b) The Massachusetts Institute of Technology + * (c) Columbia University + * (d) The National Aeronautics & Space Administration + * (e) Los Alamos National Laboratory * -------------------------------------------------------- * - * Last updated: 21 Apr., 2020 + * Last updated: 29 Dec., 2022 * - * Copyright 2013-2020 + * Copyright 2013-2022 * Darren Engwirda * d.engwirda@gmail.com * https://github.com/dengwirda/ @@ -61,7 +65,7 @@ edge_data &_edat, iptr_type &_part, char_type &_feat, - char_type &_topo, + char_type *_topo, char_type &_kind, real_type *_ebal, real_type *_pmax @@ -69,6 +73,8 @@ { _kind = mesh::null_item ; + _edat._mark = (iptr_type)+0; + if (_args.dims() < +1) return; /*--------------------------- assemble local indexing */ @@ -88,31 +94,22 @@ /*--------------------------------- is not restricted */ return ; - /*------------------------- calc. refinement priority */ - _edat._mark = - _mesh._tria.node(_enod[0])->fdim() + - _mesh._tria.node(_enod[1])->fdim() ; - - _edat._cost = - (float) _pmax[2] ; - - // scaling via node numbering seems to make slightly - // better (more topologically regular) meshes - // this implicitly boosts the refinement priority of - // "old" cells, which typically produces meshes with - // fewer "seams"... + /*------------------------- eval. surface-disc.-error */ + float _srat = (float) + geometry::lensqr_2d(_ebal, _pmax) ; - _edat._cost/= _enod[0]+1 ; - _edat._cost/= _enod[1]+1 ; + /*------------------------- calc. refinement priority */ + _edat._cost = (float) ( + (float)_pmax[2] * (_srat + 1.f ) ) ; /*------------------------- eval. size func. at _tbal */ real_type _esiz = (real_type)+0.; - _esiz += (real_type)+1.*_hfun.eval( + _esiz += (real_type)1./4.*_hfun.eval( &_mesh._tria. node(_enod[0])->pval(0) , _mesh._tria. node(_enod[0])->idxh()) ; - _esiz += (real_type)+1.*_hfun.eval( + _esiz += (real_type)1./4.*_hfun.eval( &_mesh._tria. node(_enod[1])->pval(0) , _mesh._tria. @@ -121,31 +118,23 @@ auto _hint = _mesh._tria.node(_enod[ 1])->idxh() ; - _esiz += (real_type)+1.0 * + _esiz += (real_type)2./4. * _hfun.eval( _pmax, _hint) ; - _esiz /= (real_type)+3.0 ; + _srat /= (float)(_esiz * _esiz) ; real_type _eave =_pmax [ +2] ; _eave /= _esiz * _esiz ; - _eave *= (real_type)+4.0 ; - - /*------------------------- eval. surface-disc.-error */ - real_type _srat = - geometry::lensqr_2d( - _ebal, _pmax)/(_esiz * _esiz) ; + _eave *= (real_type)4./1. ; /*------------------------- refinement classification */ // flag cells "trapped" between boundaries -- having - // all nodes on lower dimensional facets and with at - // least one boundary face. + // all nodes on lower dimensional facets... bool_type _trap = - _mesh._tria. - node(_enod[0])->fdim() < +1 && - _mesh._tria. - node(_enod[1])->fdim() < +1 ; + _mesh._tria.node(_enod[0])->fdim() < 1 && + _mesh._tria.node(_enod[1])->fdim() < 1 ; real_type _scal = 1. + _trap * .100 ; @@ -182,6 +171,8 @@ { _kind = mesh::null_item ; + _tdat._mark = (iptr_type)+0; + if (_args.dims() < +2) return ; /*--------------------------------- get nodes in tria */ @@ -233,21 +224,14 @@ } /*------------------------- calc. refinement priority */ - iptr_type _ebnd = _emin ; - real_type _best = - std::numeric_limits - ::infinity () ; - - bool_type _trap = false ; - - _tdat._mark = (iptr_type) +0; + iptr_type _nbnd = +0 ; # ifdef __bias_bnds for(_enum = +3; _enum-- != +0; ) { + /*------------------------- are there bnd-adj. faces? */ iptr_type _enod[ +3]; - mesh_type::tria_type:: - tria_type:: + mesh_type::tria_type::tria_type:: face_node(_enod, _enum, 2, 1); _enod[ +0] = _tnod[_enod[+0]]; _enod[ +1] = _tnod[_enod[+1]]; @@ -266,48 +250,39 @@ item_type *_eptr = nullptr ; if (_mesh.find_edge(_edat,_eptr)) { - if (_best > _llen[_enum]) - { - _trap = true ; - _ebnd = _enum ; - _best = _llen[_enum]; - } - + _nbnd += +1 ; _tdat._mark -= +1 ; } } # endif + if ((hash_ball(_tbal) % 3 == +0) && + _nbnd == +0 ) // add quasi-random re-order + _tdat._mark += +1 ; + /*------------------------- eval. radius--edge ratios */ - real_type _erat = _tbal[ 2] / - _llen[_emin] ; + float _erat = (float) ( + (float)_tbal [2] / _llen [_emin] ) ; /*------------------------- calc. refinement priority */ - _tdat._cost = - (float) (_tbal[2] * _erat) ; + _tdat._cost = (float) ( + (float)_tbal [2] * _erat ) ; - // scaling via node numbering seems to make slightly - // better (more topologically regular) meshes - // this implicitly boosts the refinement priority of - // "old" cells, which typically produces meshes with - // fewer "seams"... + /*------------------------- refinement classification */ - iptr_type _enod[ +3]; - mesh_type::tria_type::tria_type:: - face_node(_enod, _ebnd, 2, 1); - _enod[ +0] = _tnod[_enod[+0]]; - _enod[ +1] = _tnod[_enod[+1]]; + // add a scaling with "age" to help prioritise older + // cells on the front. - _tdat._cost/= _enod[0] + 1 ; - _tdat._cost/= _enod[1] + 1 ; - - /*------------------------- refinement classification */ + _tdat._cost/= + _mesh._tria._nset.count() + 1 ; + _tdat._cost/= + _mesh._tria._nset.count() + 1 ; // flag cells "trapped" between boundaries -- having // all nodes on lower dimensional facets and with at // least one boundary face. - _trap = _trap && + bool_type _trap =_nbnd > +0 && _mesh._tria. node(_tnod[0])->fdim() < +2 && _mesh._tria. @@ -323,19 +298,24 @@ _kind = mesh::ring_item; return ; } + if (_nbnd >= +3 ) + { + _kind = mesh::ring_item; return ; + } + /*------------------------- eval. size func. at _tbal */ real_type _tsiz = (real_type)+0.; - _tsiz += (real_type)+1.*_hfun.eval( + _tsiz += (real_type)2./9.*_hfun.eval( &_mesh._tria. node(_tnod[0])->pval(0) , _mesh._tria. node(_tnod[0])->idxh()) ; - _tsiz += (real_type)+1.*_hfun.eval( + _tsiz += (real_type)2./9.*_hfun.eval( &_mesh._tria. node(_tnod[1])->pval(0) , _mesh._tria. node(_tnod[1])->idxh()) ; - _tsiz += (real_type)+1.*_hfun.eval( + _tsiz += (real_type)2./9.*_hfun.eval( &_mesh._tria. node(_tnod[2])->pval(0) , _mesh._tria. @@ -344,14 +324,12 @@ auto _hint = _mesh._tria.node(_tnod[ 2])->idxh() ; - _tsiz += (real_type)+1.0 * + _tsiz += (real_type)3./9. * _hfun.eval( _tbal, _hint) ; - _tsiz /= (real_type)+4.0 ; - real_type _eave = _tbal[ +2] ; _eave /= _tsiz * _tsiz; - _eave *= (real_type)+3.0 ; + _eave *= (real_type)3./1. ; /*------------------------- refinement classification */ _scal += (real_type)(_trap * 0.100) ; diff --git a/external/jigsaw/src/libcpp/rdel_mesh/rdel_cost_delfront_3.inc b/external/jigsaw/src/libcpp/rdel_mesh/rdel_cost_delfront_3.inc index d21c5db..db3c8a4 100644 --- a/external/jigsaw/src/libcpp/rdel_mesh/rdel_cost_delfront_3.inc +++ b/external/jigsaw/src/libcpp/rdel_mesh/rdel_cost_delfront_3.inc @@ -22,18 +22,22 @@ * how they can obtain it for free, then you are not * required to make any arrangement with me.) * - * Disclaimer: Neither I nor: Columbia University, The - * Massachusetts Institute of Technology, The - * University of Sydney, nor The National Aeronautics - * and Space Administration warrant this code in any - * way whatsoever. This code is provided "as-is" to be - * used at your own risk. + * Disclaimer: Neither I nor THE CONTRIBUTORS warrant + * this code in any way whatsoever. This code is + * provided "as-is" to be used at your own risk. + * + * THE CONTRIBUTORS include: + * (a) The University of Sydney + * (b) The Massachusetts Institute of Technology + * (c) Columbia University + * (d) The National Aeronautics & Space Administration + * (e) Los Alamos National Laboratory * -------------------------------------------------------- * - * Last updated: 21 Apr., 2021 + * Last updated: 29 Dec., 2022 * - * Copyright 2013-2021 + * Copyright 2013-2022 * Darren Engwirda * d.engwirda@gmail.com * https://github.com/dengwirda/ @@ -61,7 +65,7 @@ edge_data &_edat, iptr_type &_part, char_type &_feat, - char_type &_topo, + char_type *_topo, char_type &_kind, real_type *_ebal, real_type *_pmax @@ -69,6 +73,8 @@ { _kind = mesh::null_item ; + _edat._mark = (iptr_type)+0; + if (_args.dims() < +1) return; /*--------------------------- assemble local indexing */ @@ -88,31 +94,22 @@ /*--------------------------------- is not restricted */ return ; - /*------------------------- calc. refinement priority */ - _edat._mark = - _mesh._tria.node(_enod[0])->fdim() + - _mesh._tria.node(_enod[1])->fdim() ; - - _edat._cost = - (float) _pmax[3] ; - - // scaling via node numbering seems to make slightly - // better (more topologically regular) meshes - // this implicitly boosts the refinement priority of - // "old" cells, which typically produces meshes with - // fewer "seams"... + /*------------------------- eval. surface-disc.-error */ + float _srat = (float) + geometry::lensqr_3d(_ebal, _pmax) ; - _edat._cost/= _enod[0]+1 ; - _edat._cost/= _enod[1]+1 ; + /*------------------------- calc. refinement priority */ + _edat._cost = (float) ( + (float)_pmax[3] * (_srat + 1.f ) ) ; /*------------------------- eval. size func. at _tbal */ real_type _esiz = (real_type)+0.; - _esiz += (real_type)+1.*_hfun.eval( + _esiz += (real_type)1./4.*_hfun.eval( &_mesh._tria. node(_enod[0])->pval(0) , _mesh._tria. node(_enod[0])->idxh()) ; - _esiz += (real_type)+1.*_hfun.eval( + _esiz += (real_type)1./4.*_hfun.eval( &_mesh._tria. node(_enod[1])->pval(0) , _mesh._tria. @@ -121,31 +118,23 @@ auto _hint = _mesh._tria.node(_enod[ 1])->idxh() ; - _esiz += (real_type)+1.0 * + _esiz += (real_type)2./4. * _hfun.eval( _pmax, _hint) ; - _esiz /= (real_type)+3.0 ; + _srat /= (float)(_esiz * _esiz) ; real_type _eave =_pmax [ +3] ; _eave /= _esiz * _esiz ; - _eave *= (real_type)+4.0 ; - - /*------------------------- eval. surface-disc.-error */ - real_type _srat = - geometry::lensqr_3d ( - _ebal, _pmax)/(_esiz * _esiz) ; + _eave *= (real_type)4./1. ; /*------------------------- refinement classification */ // flag cells "trapped" between boundaries -- having - // all nodes on lower dimensional facets and with at - // least one boundary face. + // all nodes on lower dimensional facets... bool_type _trap = - _mesh._tria. - node(_enod[0])->fdim() < +1 && - _mesh._tria. - node(_enod[1])->fdim() < +1 ; + _mesh._tria.node(_enod[0])->fdim() < 1 && + _mesh._tria.node(_enod[1])->fdim() < 1 ; real_type _scal = 1. + _trap * .100 ; @@ -179,7 +168,7 @@ face_data &_fdat, iptr_type &_part, char_type &_feat, - char_type &_topo, + char_type *_topo, char_type &_kind, real_type *_tbal, real_type *_pmax @@ -187,6 +176,8 @@ { _kind = mesh::null_item ; + _fdat._mark = (iptr_type)+0; + if (_args.dims() < +2) return; /*--------------------------- assemble local indexing */ @@ -239,14 +230,7 @@ } /*------------------------- calc. refinement priority */ - iptr_type _ebnd = _emin ; - real_type _best = - std::numeric_limits - ::infinity () ; - - bool_type _trap = false ; - - _fdat._mark = (iptr_type) +0; + iptr_type _nbnd = +0 ; # ifdef __bias_bnds for(_enum = +3; _enum-- != +0; ) @@ -272,48 +256,44 @@ item_type *_eptr = nullptr ; if (_mesh.find_edge(_edat,_eptr)) { - if (_best > _llen[_enum]) - { - _trap = true ; - _ebnd = _enum ; - _best = _llen[_enum]; - } - + _nbnd += +1 ; _fdat._mark -= +1 ; } } # endif + if ((hash_ball(_pmax) % 3 == +0) && + _nbnd == +0 ) // add quasi-random re-order + _fdat._mark += +1 ; + + /*------------------------- eval. surface-disc.-error */ + float _srat = (float) + geometry::lensqr_3d(_tbal, _pmax) ; + /*------------------------- eval. radius--edge ratios */ - real_type _prat = _pmax[ 3] / - _llen[_emin] ; + float _prat = (float) ( + (float)_pmax[3] / _llen[_emin] ) ; /*------------------------- calc. refinement priority */ - _fdat._cost = - (float) (_pmax[3] * _prat) ; + _fdat._cost = (float) ( + (float)_pmax[3] * _prat + * (+1.0f + _srat) ) ; - // scaling via node numbering seems to make slightly - // better (more topologically regular) meshes - // this implicitly boosts the refinement priority of - // "old" cells, which typically produces meshes with - // fewer "seams"... - - iptr_type _enod[ +3]; - mesh_type::tria_type::tria_type:: - face_node(_enod, _ebnd, 2, 1); - _enod[ +0] = _fnod[_enod[+0]]; - _enod[ +1] = _fnod[_enod[+1]]; + /*------------------------- refinement classification */ - _fdat._cost/= _enod[0] + 1 ; - _fdat._cost/= _enod[1] + 1 ; + // add a scaling with "age" to help prioritise older + // cells on the front. - /*------------------------- refinement classification */ + _fdat._cost/= + _mesh._tria._nset.count() + 1 ; + _fdat._cost/= + _mesh._tria._nset.count() + 1 ; // flag cells "trapped" between boundaries -- having // all nodes on lower dimensional facets and with at // least one boundary face. - _trap = _trap && + bool_type _trap =_nbnd > +0 && _mesh._tria. node(_fnod[0])->fdim() < +2 && _mesh._tria. @@ -329,19 +309,24 @@ _kind = mesh::ring_item; return ; } + if (_nbnd >= +3 ) + { + _kind = mesh::ring_item; return ; + } + /*------------------------- eval. size func. at _fbal */ real_type _tsiz = (real_type)+0.; - _tsiz += (real_type)+1.*_hfun.eval( + _tsiz += (real_type)2./9.*_hfun.eval( &_mesh._tria. node(_fnod[0])->pval(0) , _mesh._tria. node(_fnod[0])->idxh()) ; - _tsiz += (real_type)+1.*_hfun.eval( + _tsiz += (real_type)2./9.*_hfun.eval( &_mesh._tria. node(_fnod[1])->pval(0) , _mesh._tria. node(_fnod[1])->idxh()) ; - _tsiz += (real_type)+1.*_hfun.eval( + _tsiz += (real_type)2./9.*_hfun.eval( &_mesh._tria. node(_fnod[2])->pval(0) , _mesh._tria. @@ -350,19 +335,14 @@ auto _hint = _mesh._tria.node(_fnod[ 2])->idxh() ; - _tsiz += (real_type)+1.0 * + _tsiz += (real_type)3./9. * _hfun.eval( _pmax, _hint) ; - _tsiz /= (real_type)+4.0 ; + _srat /= (float)(_tsiz * _tsiz) ; real_type _eave =_pmax [ +3] ; _eave /= _tsiz * _tsiz; - _eave *= (real_type)+3.0 ; - - /*------------------------- eval. surface-disc.-error */ - real_type _srat = - geometry::lensqr_3d( - _tbal, _pmax)/(_tsiz * _tsiz) ; + _eave *= (real_type)3./1. ; /*------------------------- refinement classification */ _scal += (real_type)(_trap * 0.100) ; @@ -400,8 +380,7 @@ { _kind = mesh::null_item ; - __unreferenced(_geom); - __unreferenced(_part); + _tdat._mark = (iptr_type)+0; if (_args.dims() < +3) return ; @@ -496,18 +475,12 @@ } /*------------------------- calc. refinement priority */ - iptr_type _fbnd = _fmin ; - real_type _best = - std::numeric_limits - ::infinity () ; - - bool_type _trap = false ; - - _tdat._mark = (iptr_type) +0; + iptr_type _nbnd = +0 ; # ifdef __bias_bnds for(_fnum = +4; _fnum-- != +0; ) { + /*------------------------- are there bnd-adj. faces? */ iptr_type _fnod[ +4]; mesh_type::tria_type::tria_type:: face_node(_fnod, _fnum, 3, 2); @@ -533,55 +506,44 @@ item_type *_fptr = nullptr ; if (_mesh.find_face(_fdat,_fptr)) { - if (_best > _frad[_fnum]) - { - _trap = true ; - _fbnd = _fnum ; - _best = _frad[_fnum]; - } - + _nbnd += +1 ; _tdat._mark -= +1 ; } } # endif + if ((hash_ball(_tbal) % 3 == +0) && + _nbnd == +0 ) // add quasi-random re-order + _tdat._mark += +1 ; + /*------------------------- eval. radius--edge ratios */ - real_type _erat = _tbal[ +3] / - _llen[_emin] ; + float _erat = (float) ( + (float)_tbal [3] / _llen [_emin] ) ; - real_type _frat = _tbal[ +3] / - _frad[_fmin] ; + float _frat = (float) ( + (float)_tbal [3] / _frad [_fmin] ) ; - real_type _trat = _erat*_frat; + float _trat = _erat *_frat; /*------------------------- calc. refinement priority */ - _tdat._cost = - (float) (_tbal[3] * _trat) ; - - // scaling via node numbering seems to make slightly - // better (more topologically regular) meshes - // this implicitly boosts the refinement priority of - // "old" cells, which typically produces meshes with - // fewer "seams"... + _tdat._cost = (float) ( + (float)_tbal [3] * _trat ) ; - iptr_type _fnod[ +4]; - mesh_type::tria_type::tria_type:: - face_node(_fnod, _fbnd, 3, 2); - _fnod[ +0] = _tnod[_fnod[+0]]; - _fnod[ +1] = _tnod[_fnod[+1]]; - _fnod[ +2] = _tnod[_fnod[+2]]; + /*------------------------- refinement classification */ - _tdat._cost/= _fnod[0] + 1 ; - _tdat._cost/= _fnod[1] + 1 ; - _tdat._cost/= _fnod[2] + 1 ; + // add a scaling with "age" to help prioritise older + // cells on the front. - /*------------------------- refinement classification */ + _tdat._cost/= + _mesh._tria._nset.count() + 1 ; + _tdat._cost/= + _mesh._tria._nset.count() + 1 ; // flag cells "trapped" between boundaries -- having // all nodes on lower dimensional facets and with at // least one boundary face. - _trap = _trap && + bool_type _trap =_nbnd > +0 && _mesh._tria. node(_tnod[0])->fdim() < +3 && _mesh._tria. @@ -599,24 +561,29 @@ _kind = mesh::ring_item; return ; } + if (_nbnd >= +4 ) + { + _kind = mesh::ring_item; return ; + } + /*------------------------- eval. size func. at _tbal */ real_type _tsiz = (real_type)+0.; - _tsiz += (real_type)+1.*_hfun.eval( + _tsiz += (real_type)3./16*_hfun.eval( &_mesh._tria. node(_tnod[0])->pval(0) , _mesh._tria. node(_tnod[0])->idxh()) ; - _tsiz += (real_type)+1.*_hfun.eval( + _tsiz += (real_type)3./16*_hfun.eval( &_mesh._tria. node(_tnod[1])->pval(0) , _mesh._tria. node(_tnod[1])->idxh()) ; - _tsiz += (real_type)+1.*_hfun.eval( + _tsiz += (real_type)3./16*_hfun.eval( &_mesh._tria. node(_tnod[2])->pval(0) , _mesh._tria. node(_tnod[2])->idxh()) ; - _tsiz += (real_type)+1.*_hfun.eval( + _tsiz += (real_type)3./16*_hfun.eval( &_mesh._tria. node(_tnod[3])->pval(0) , _mesh._tria. @@ -625,15 +592,12 @@ auto _hint = _mesh._tria.node(_tnod[ 3])->idxh() ; - _tsiz += (real_type)+1.0 * + _tsiz += (real_type)4./16 * _hfun.eval( _tbal, _hint) ; - _tsiz /= (real_type)+5.0 ; - real_type _eave = _tbal [+3] ; _eave /= (_tsiz*_tsiz) ; - _eave *= (real_type)+8.0 / - (real_type)+3.0 ; + _eave *= (real_type)8./3. ; /*------------------------- refinement classification */ _scal += (real_type)(_trap * 0.100) ; diff --git a/external/jigsaw/src/libcpp/rdel_mesh/rdel_create_init_2.inc b/external/jigsaw/src/libcpp/rdel_mesh/rdel_create_init_2.inc index 46a2a08..4695294 100644 --- a/external/jigsaw/src/libcpp/rdel_mesh/rdel_create_init_2.inc +++ b/external/jigsaw/src/libcpp/rdel_mesh/rdel_create_init_2.inc @@ -22,16 +22,20 @@ * how they can obtain it for free, then you are not * required to make any arrangement with me.) * - * Disclaimer: Neither I nor: Columbia University, The - * Massachusetts Institute of Technology, The - * University of Sydney, nor The National Aeronautics - * and Space Administration warrant this code in any - * way whatsoever. This code is provided "as-is" to be - * used at your own risk. + * Disclaimer: Neither I nor THE CONTRIBUTORS warrant + * this code in any way whatsoever. This code is + * provided "as-is" to be used at your own risk. + * + * THE CONTRIBUTORS include: + * (a) The University of Sydney + * (b) The Massachusetts Institute of Technology + * (c) Columbia University + * (d) The National Aeronautics & Space Administration + * (e) Los Alamos National Laboratory * -------------------------------------------------------- * - * Last updated: 10 Jul., 2021 + * Last updated: 15 Jul., 2021 * * Copyright 2013-2021 * Darren Engwirda @@ -479,6 +483,9 @@ _edat._node[1] = _imap[_iter->node( 1 )] ; + _edat._pass = +0 ; + _edat._kind = + mesh::good_item; _edat._part = _iter->itag() ; @@ -490,7 +497,9 @@ _edat._node.tend(), std::less()) ; - _epro.push(_edat) ; + _epro.push ( _edat) ; + + _mesh.push_edge( _edat) ; } else @@ -505,7 +514,7 @@ _edat._part = _iter->itag() ; - _ebad.push(_edat) ; + _ebad.push ( _edat) ; } diff --git a/external/jigsaw/src/libcpp/rdel_mesh/rdel_create_init_3.inc b/external/jigsaw/src/libcpp/rdel_mesh/rdel_create_init_3.inc index 8bfb543..367f1f4 100644 --- a/external/jigsaw/src/libcpp/rdel_mesh/rdel_create_init_3.inc +++ b/external/jigsaw/src/libcpp/rdel_mesh/rdel_create_init_3.inc @@ -22,16 +22,20 @@ * how they can obtain it for free, then you are not * required to make any arrangement with me.) * - * Disclaimer: Neither I nor: Columbia University, The - * Massachusetts Institute of Technology, The - * University of Sydney, nor The National Aeronautics - * and Space Administration warrant this code in any - * way whatsoever. This code is provided "as-is" to be - * used at your own risk. + * Disclaimer: Neither I nor THE CONTRIBUTORS warrant + * this code in any way whatsoever. This code is + * provided "as-is" to be used at your own risk. + * + * THE CONTRIBUTORS include: + * (a) The University of Sydney + * (b) The Massachusetts Institute of Technology + * (c) Columbia University + * (d) The National Aeronautics & Space Administration + * (e) Los Alamos National Laboratory * -------------------------------------------------------- * - * Last updated: 10 Jul., 2021 + * Last updated: 15 Jul., 2021 * * Copyright 2013-2021 * Darren Engwirda @@ -621,6 +625,9 @@ _edat._node[1] = _imap[_iter->node( 1 )] ; + _edat._pass = +0 ; + _edat._kind = + mesh::good_item; _edat._part = _iter->itag() ; @@ -628,11 +635,13 @@ _edat._tadj = _tadj ; algorithms::isort ( - &_edat._node[0], - &_edat._node[2], + _edat._node.head(), + _edat._node.tend(), std::less()) ; - _epro.push(_edat) ; + _epro.push ( _edat) ; + + _mesh.push_edge( _edat) ; } else @@ -647,7 +656,7 @@ _edat._part = _iter->itag() ; - _ebad.push(_edat) ; + _ebad.push ( _edat) ; } @@ -680,6 +689,9 @@ _fdat._node[2] = _imap[_iter->node( 2 )] ; + _fdat._pass = +0 ; + _fdat._kind = + mesh::good_item; _fdat._part = _iter->itag() ; @@ -691,7 +703,9 @@ _fdat._node.tend(), std::less()) ; - _fpro.push(_fdat) ; + _fpro.push ( _fdat) ; + + _mesh.push_face( _fdat) ; } else @@ -708,7 +722,7 @@ _fdat._part = _iter->itag() ; - _fbad.push(_fdat) ; + _fbad.push ( _fdat) ; } diff --git a/external/jigsaw/src/libcpp/rdel_mesh/rdel_filt_k.hpp b/external/jigsaw/src/libcpp/rdel_mesh/rdel_filt_k.hpp index 7dbc09a..0b79f8d 100644 --- a/external/jigsaw/src/libcpp/rdel_mesh/rdel_filt_k.hpp +++ b/external/jigsaw/src/libcpp/rdel_mesh/rdel_filt_k.hpp @@ -22,18 +22,22 @@ * how they can obtain it for free, then you are not * required to make any arrangement with me.) * - * Disclaimer: Neither I nor: Columbia University, The - * Massachusetts Institute of Technology, The - * University of Sydney, nor The National Aeronautics - * and Space Administration warrant this code in any - * way whatsoever. This code is provided "as-is" to be - * used at your own risk. + * Disclaimer: Neither I nor THE CONTRIBUTORS warrant + * this code in any way whatsoever. This code is + * provided "as-is" to be used at your own risk. + * + * THE CONTRIBUTORS include: + * (a) The University of Sydney + * (b) The Massachusetts Institute of Technology + * (c) Columbia University + * (d) The National Aeronautics & Space Administration + * (e) Los Alamos National Laboratory * -------------------------------------------------------- * - * Last updated: 04 October, 2017 + * Last updated: 18 Aug., 2021 * - * Copyright 2013-2017 + * Copyright 2013-2021 * Darren Engwirda * d.engwirda@gmail.com * https://github.com/dengwirda/ @@ -63,12 +67,12 @@ { /*----------------------- internal "co-ord." type */ public : - real_type _ppos[2]={(real_type)0.} ; + real_type _ppos[2]={0.}; char_type _hits ; char_type _feat ; - char_type _topo ; + char_type _topo[2]={+0}; iptr_type _itag ; public : @@ -85,14 +89,17 @@ ) { return this-> _feat ; } - __inline_call char_type & topo ( - ) - { return this-> _topo ; - } __inline_call iptr_type & itag ( ) { return this-> _itag ; } + __inline_call char_type & topo ( + char_type _kind = filt_topo + ) + { return ( _kind == filt_topo ) ? + this-> _topo[ +0 ] : + this-> _topo[ +1 ] ; + } __inline_call real_type const& pval ( iptr_type _ipos ) const @@ -106,14 +113,17 @@ ) const { return this-> _feat ; } - __inline_call char_type const& topo ( - ) const - { return this-> _topo ; - } __inline_call iptr_type const& itag ( ) const { return this-> _itag ; } + __inline_call char_type const& topo ( + char_type _kind = filt_topo + ) const + { return ( _kind == filt_topo ) ? + this-> _topo[ +0 ] : + this-> _topo[ +1 ] ; + } } ; } ; @@ -132,12 +142,12 @@ { /*----------------------- internal "co-ord." type */ public : - real_type _ppos[3]={(real_type)0.} ; + real_type _ppos[3]={0.}; char_type _hits ; char_type _feat ; - char_type _topo ; + char_type _topo[2]={+0}; iptr_type _itag ; public : @@ -154,14 +164,17 @@ ) { return this-> _feat ; } - __inline_call char_type & topo ( - ) - { return this-> _topo ; - } __inline_call iptr_type & itag ( ) { return this-> _itag ; } + __inline_call char_type & topo ( + char_type _kind = filt_topo + ) + { return ( _kind == filt_topo ) ? + this-> _topo[ +0 ] : + this-> _topo[ +1 ] ; + } __inline_call real_type const& pval ( iptr_type _ipos ) const @@ -175,14 +188,17 @@ ) const { return this-> _feat ; } - __inline_call char_type const& topo ( - ) const - { return this-> _topo ; - } __inline_call iptr_type const& itag ( ) const { return this-> _itag ; } + __inline_call char_type const& topo ( + char_type _kind = filt_topo + ) const + { return ( _kind == filt_topo ) ? + this-> _topo[ +0 ] : + this-> _topo[ +1 ] ; + } } ; } ; @@ -231,7 +247,7 @@ __const_ptr ( real_type) _xpos, char_type _hits, char_type _feat, - char_type _topo, + __const_ptr ( char_type) _topo, iptr_type _itag ) { @@ -242,8 +258,12 @@ ->hits () = _hits ; this->_list.tail() ->feat () = _feat ; + this->_list.tail() - ->topo () = _topo ; + ->topo(0) = _topo[0]; + this->_list.tail() + ->topo(1) = _topo[1]; + this->_list.tail() ->itag () = _itag ; @@ -301,7 +321,7 @@ __const_ptr ( real_type) _xpos, char_type _hits, char_type _feat, - char_type _topo, + __const_ptr ( char_type) _topo, iptr_type _itag ) { @@ -312,8 +332,202 @@ ->hits () = _hits ; this->_list.tail() ->feat () = _feat ; + this->_list.tail() - ->topo () = _topo ; + ->topo(0) = _topo[0]; + this->_list.tail() + ->topo(1) = _topo[1]; + + this->_list.tail() + ->itag () = _itag ; + + this->_list.tail() + ->pval(0) = _xpos[0]; + this->_list.tail() + ->pval(1) = _xpos[1]; + this->_list.tail() + ->pval(2) = _xpos[2]; + + this->_find = true ; + } + } ; + + template < + typename R, + typename I + > + class filt_all_2d : public keep_base_2d + { +/*----------------- "filt-all" intersection predicate */ + public : + typedef R real_type ; + typedef I iptr_type ; + + typedef keep_base_2d < + real_type , + iptr_type > pred_base ; + + public : + containers::array < + typename pred_base::node_data> _list ; + + real_type _near ; + + iptr_type _inum ; + bool_type _find ; + + public : +/*------------------------------ construct from _src. */ + __inline_call filt_all_2d ( + real_type _nsrc + ) + { + this->_near = std::pow( _nsrc, 2) ; + + this->_find = false; + this->_inum = +0 ; + } +/*------------------------------ nullify intersection */ + __inline_call void_type clear ( + ) + { + this->_list.clear(); + + this->_find = false; + this->_inum = +0 ; + } +/*------------------------------ process intersection */ + __inline_call + void_type operator() ( + __const_ptr ( real_type) _xpos, + char_type _hits, + char_type _feat, + __const_ptr ( char_type) _topo, + iptr_type _itag + ) + { + for (auto + _iter = this->_list.head() ; + _iter != this->_list.tend() ; + ++_iter ) + { + /*----------------------------- exit if too close */ + real_type _dsqr = + geometry::lensqr_2d ( + _xpos, + &_iter->pval(0)) ; + + if (_dsqr < this->_near) return; + } + + /*----------------------------- if well-separated */ + this->_inum += +1 ; + + this->_list.push_tail() ; + this->_list.tail() + ->hits () = _hits ; + this->_list.tail() + ->feat () = _feat ; + + this->_list.tail() + ->topo(0) = _topo[0]; + this->_list.tail() + ->topo(1) = _topo[1]; + + this->_list.tail() + ->itag () = _itag ; + + this->_list.tail() + ->pval(0) = _xpos[0]; + this->_list.tail() + ->pval(1) = _xpos[1]; + + this->_find = true ; + } + } ; + + template < + typename R, + typename I + > + class filt_all_3d : public keep_base_3d + { +/*----------------- "filt-all" intersection predicate */ + public : + typedef R real_type ; + typedef I iptr_type ; + + typedef keep_base_3d < + real_type , + iptr_type > pred_base ; + + public : + containers::array < + typename pred_base::node_data> _list ; + + real_type _near ; + + iptr_type _inum ; + bool_type _find ; + + public : +/*------------------------------ construct from _src. */ + __inline_call filt_all_3d ( + real_type _nsrc + ) + { + this->_near = std::pow( _nsrc, 2) ; + + this->_find = false; + this->_inum = +0 ; + } +/*------------------------------ nullify intersection */ + __inline_call void_type clear ( + ) + { + this->_list.clear(); + + this->_find = false; + this->_inum = +0 ; + } +/*------------------------------ process intersection */ + __inline_call + void_type operator() ( + __const_ptr ( real_type) _xpos, + char_type _hits, + char_type _feat, + __const_ptr ( char_type) _topo, + iptr_type _itag + ) + { + for (auto + _iter = this->_list.head() ; + _iter != this->_list.tend() ; + ++_iter ) + { + /*----------------------------- exit if too close */ + real_type _dsqr = + geometry::lensqr_3d ( + _xpos, + &_iter->pval(0)) ; + + if (_dsqr < this->_near) return; + } + + /*----------------------------- if well-separated */ + this->_inum += +1 ; + + this->_list.push_tail() ; + this->_list.tail() + ->hits () = _hits ; + this->_list.tail() + ->feat () = _feat ; + + this->_list.tail() + ->topo(0) = _topo[0]; + this->_list.tail() + ->topo(1) = _topo[1]; + this->_list.tail() ->itag () = _itag ; @@ -384,7 +598,7 @@ __const_ptr ( real_type) _xpos, char_type _hits, char_type _feat, - char_type _topo, + __const_ptr ( char_type) _topo, iptr_type _itag ) { @@ -405,8 +619,12 @@ _pmin.hits () = _hits; this-> _pmin.feat () = _feat; + + this-> + _pmin.topo(0) = _topo[0]; this-> - _pmin.topo () = _topo; + _pmin.topo(1) = _topo[1]; + this-> _pmin.itag () = _itag; @@ -429,8 +647,12 @@ _pmax.hits () = _hits; this-> _pmax.feat () = _feat; + + this-> + _pmax.topo(0) = _topo[0]; this-> - _pmax.topo () = _topo; + _pmax.topo(1) = _topo[1]; + this-> _pmax.itag () = _itag; @@ -503,7 +725,7 @@ __const_ptr ( real_type) _xpos, char_type _hits, char_type _feat, - char_type _topo, + __const_ptr ( char_type) _topo, iptr_type _itag ) { @@ -526,8 +748,12 @@ _pmin.hits () = _hits; this-> _pmin.feat () = _feat; + + this-> + _pmin.topo(0) = _topo[0]; this-> - _pmin.topo () = _topo; + _pmin.topo(1) = _topo[1]; + this-> _pmin.itag () = _itag; @@ -549,8 +775,12 @@ _pmax.hits () = _hits; this-> _pmax.feat () = _feat; + + this-> + _pmax.topo(0) = _topo[0]; this-> - _pmax.topo () = _topo; + _pmax.topo(1) = _topo[1]; + this-> _pmax.itag () = _itag; @@ -620,7 +850,7 @@ __const_ptr ( real_type) _xpos, char_type _hits, char_type _feat, - char_type _topo, + __const_ptr ( char_type) _topo, iptr_type _itag ) { @@ -651,8 +881,12 @@ _proj.hits () = _hits; this-> _proj.feat () = _feat; + + this-> + _proj.topo(0) = _topo[0]; this-> - _proj.topo () = _topo; + _proj.topo(1) = _topo[1]; + this-> _proj.itag () = _itag; @@ -724,7 +958,7 @@ __const_ptr ( real_type) _xpos, char_type _hits, char_type _feat, - char_type _topo, + __const_ptr ( char_type) _topo, iptr_type _itag ) { @@ -759,8 +993,12 @@ _proj.hits () = _hits; this-> _proj.feat () = _feat; + + this-> + _proj.topo(0) = _topo[0]; this-> - _proj.topo () = _topo; + _proj.topo(1) = _topo[1]; + this-> _proj.itag () = _itag; diff --git a/external/jigsaw/src/libcpp/rdel_mesh/rdel_make_2.hpp b/external/jigsaw/src/libcpp/rdel_mesh/rdel_make_2.hpp index 549df04..1bba337 100644 --- a/external/jigsaw/src/libcpp/rdel_mesh/rdel_make_2.hpp +++ b/external/jigsaw/src/libcpp/rdel_mesh/rdel_make_2.hpp @@ -22,12 +22,16 @@ * how they can obtain it for free, then you are not * required to make any arrangement with me.) * - * Disclaimer: Neither I nor: Columbia University, The - * Massachusetts Institute of Technology, The - * University of Sydney, nor The National Aeronautics - * and Space Administration warrant this code in any - * way whatsoever. This code is provided "as-is" to be - * used at your own risk. + * Disclaimer: Neither I nor THE CONTRIBUTORS warrant + * this code in any way whatsoever. This code is + * provided "as-is" to be used at your own risk. + * + * THE CONTRIBUTORS include: + * (a) The University of Sydney + * (b) The Massachusetts Institute of Technology + * (c) Columbia University + * (d) The National Aeronautics & Space Administration + * (e) Los Alamos National Laboratory * -------------------------------------------------------- * @@ -115,6 +119,8 @@ typedef typename mesh_type::tria_data tria_data ; + typedef mesh::rdel_timers rdel_stat ; + typedef containers::array < iptr_type > iptr_list ; @@ -126,10 +132,6 @@ real_type, iptr_type > rdel_opts ; - typedef mesh::rdel_timers < - real_type , - iptr_type > rdel_stat ; - /* -------------------------------------------------------- * PUSH-EDGE: add new edge to restricted-tria. @@ -199,7 +201,7 @@ // only in hash-set /*--------------------------- call face predicate */ - char_type _feat, _topo; + char_type _topo[ 2], _feat; real_type _fbal[ 3]; real_type _sbal[ 3]; @@ -386,7 +388,7 @@ /*---------------------- calc. ball in floating-point */ real_type _tbal[3] ; - geometry::circ_ball_2d ( + geometry::perp_ball_2d ( _tbal , &_mesh._tria. node(_tnod[0])->pval(0) , @@ -645,8 +647,8 @@ _pmax[ 0] - _pmin[ 0] , _pmax[ 1] - _pmin[ 1] , } ; - _plen[ 0]*= (real_type)+4.0 ; - _plen[ 1]*= (real_type)+4.0 ; + _plen[ 0]*= (real_type)+8.0 ; + _plen[ 1]*= (real_type)+8.0 ; _pmin[ 0]-= _plen[ 0] ; _pmin[ 1]-= _plen[ 1] ; @@ -856,105 +858,94 @@ /*------------------------- push rDEL scheme metrics */ _dump.push("\n") ; - _dump.push("**DELTRI statistics... \n") ; - _dump.push("\n") ; + _dump.push("**TIMING statistics...\n") ; - _dump.push("**FUNCTION timing: ") ; - _dump.push("\n") ; - - _dump.push(" MESH-SEED = ") ; + _dump.push(" *mesh-seed = ") ; _dump.push( std::to_string (_tcpu._mesh_seed)); _dump.push("\n") ; - - _dump.push(" EDGE-INIT = ") ; + _dump.push(" *edge-init = ") ; _dump.push( std::to_string (_tcpu._edge_init)); _dump.push("\n") ; - _dump.push(" TRIA-INIT = ") ; + _dump.push(" *tria-init = ") ; _dump.push( std::to_string (_tcpu._tria_init)); _dump.push("\n") ; - _dump.push("\n") ; - _dump.push("**RESTRICTED-TRIA: ") ; _dump.push("\n") ; + _dump.push("**rDT(x) statistics...\n") ; - _dump.push(" rDEL-EDGE = "); + _dump.push(" *rDEL-edge = "); _dump.push(std::to_string (_nedg)); _dump.push("\n") ; - - _dump.push(" rDEL-TRIA = "); + _dump.push(" *rDEL-tria = "); _dump.push(std::to_string (_ntri)); _dump.push("\n") ; - _dump.push("\n") ; + _dump.push("\n") ; } - if (_args.verb() >= +3 ) + if (_args.verb() >= +2 ) { - /*------------------------- push rDEL memory metrics */ - - _dump.push("\n") ; - _dump.push("**MEMORY statistics... \n") ; - _dump.push("\n") ; + /*------------------------- more rDEL scheme metrics */ - _dump.push("**DELAUNAY-OBJECT: ") ; _dump.push("\n") ; + _dump.push("**MEMORY statistics...\n") ; - _dump.push(" NODE-BYTE = ") ; + _dump.push(" xDEL-type:\n") ; + _dump.push(" *node-byte = ") ; _dump.push(std::to_string( sizeof(typename mesh_type:: tria_type:: node_type)) ) ; _dump.push("\n") ; - _dump.push(" NODE-LIST = ") ; + _dump.push(" *nset-size = ") ; _dump.push(std::to_string( _mesh._tria._nset.alloc())) ; _dump.push("\n") ; - - _dump.push(" TRIA-BYTE = ") ; + _dump.push(" *tria-byte = ") ; _dump.push(std::to_string( sizeof(typename mesh_type:: tria_type:: tria_type)) ) ; _dump.push("\n") ; - _dump.push(" TRIA-LIST = ") ; + _dump.push(" *tset-size = ") ; _dump.push(std::to_string( _mesh._tria._tset.alloc())) ; _dump.push("\n") ; + _dump.push(" *pool-byte = ") ; + _dump.push(std::to_string( + _mesh._tria._fpol.bytes())) ; _dump.push("\n") ; - _dump.push("**RESTRICTED-TRIA: ") ; - _dump.push("\n") ; - - _dump.push(" EDGE-BYTE = ") ; + _dump.push(" rDEL-type:\n") ; + _dump.push(" *edge-byte = ") ; _dump.push(std::to_string( sizeof( typename mesh_type::edge_item)) ) ; _dump.push("\n") ; - _dump.push(" EDGE-HASH = ") ; + _dump.push(" *eset-size = ") ; _dump.push(std::to_string( _mesh._eset._lptr.alloc())) ; _dump.push("\n") ; - _dump.push(" POOL-BYTE = ") ; - _dump.push(std::to_string( - _mesh._epol.bytes () ) ) ; + _dump.push(" *pool-byte = ") ; + _dump.push( + std::to_string(_mesh._epol.bytes())) ; _dump.push("\n") ; - - _dump.push(" TRIA-BYTE = ") ; + _dump.push(" *tria-byte = ") ; _dump.push(std::to_string( sizeof( typename mesh_type::tria_item)) ) ; _dump.push("\n") ; - _dump.push(" TRIA-HASH = ") ; + _dump.push(" *tset-size = ") ; _dump.push(std::to_string( _mesh._tset._lptr.alloc())) ; _dump.push("\n") ; - _dump.push(" POOL-BYTE = ") ; - _dump.push(std::to_string( - _mesh._tpol.bytes () ) ) ; - _dump.push("\n") ; + _dump.push(" *pool-byte = ") ; + _dump.push( + std::to_string(_mesh._tpol.bytes())) ; _dump.push("\n") ; + _dump.push("\n") ; } } diff --git a/external/jigsaw/src/libcpp/rdel_mesh/rdel_make_3.hpp b/external/jigsaw/src/libcpp/rdel_mesh/rdel_make_3.hpp index ca8508e..9f5fe4e 100644 --- a/external/jigsaw/src/libcpp/rdel_mesh/rdel_make_3.hpp +++ b/external/jigsaw/src/libcpp/rdel_mesh/rdel_make_3.hpp @@ -22,16 +22,20 @@ * how they can obtain it for free, then you are not * required to make any arrangement with me.) * - * Disclaimer: Neither I nor: Columbia University, The - * Massachusetts Institute of Technology, The - * University of Sydney, nor The National Aeronautics - * and Space Administration warrant this code in any - * way whatsoever. This code is provided "as-is" to be - * used at your own risk. + * Disclaimer: Neither I nor THE CONTRIBUTORS warrant + * this code in any way whatsoever. This code is + * provided "as-is" to be used at your own risk. + * + * THE CONTRIBUTORS include: + * (a) The University of Sydney + * (b) The Massachusetts Institute of Technology + * (c) Columbia University + * (d) The National Aeronautics & Space Administration + * (e) Los Alamos National Laboratory * -------------------------------------------------------- * - * Last updated: 10 Jul., 2021 + * Last updated: 12 Jul., 2021 * * Copyright 2013-2021 * Darren Engwirda @@ -117,6 +121,8 @@ typedef typename mesh_type::tria_data tria_data ; + typedef mesh::rdel_timers rdel_stat ; + typedef containers::array < iptr_type > iptr_list ; @@ -128,10 +134,6 @@ real_type, iptr_type > rdel_opts ; - typedef mesh::rdel_timers < - real_type , - iptr_type > rdel_stat ; - /* -------------------------------------------------------- * PUSH-EDGE: add new edge to restricted-tria. @@ -292,7 +294,7 @@ // only in hash-set /*--------------------------- call face predicate */ - char_type _feat, _topo; + char_type _topo[ 2], _feat; real_type _fbal[ 4]; real_type _sbal[ 4]; @@ -489,7 +491,7 @@ /*---------------------- calc. ball in floating-point */ real_type _tbal[4] ; - geometry::circ_ball_3d ( + geometry::perp_ball_3d ( _tbal , &_mesh._tria. node(_tnod[0])->pval(0) , @@ -766,9 +768,9 @@ _pmax[ 1] - _pmin[ 1] , _pmax[ 2] - _pmin[ 2] , } ; - _plen[ 0]*= (real_type)+4.0 ; - _plen[ 1]*= (real_type)+4.0 ; - _plen[ 2]*= (real_type)+4.0 ; + _plen[ 0]*= (real_type)+8.0 ; + _plen[ 1]*= (real_type)+8.0 ; + _plen[ 2]*= (real_type)+8.0 ; _pmin[ 0]-= _plen[ 0] ; _pmin[ 1]-= _plen[ 1] ; @@ -1020,124 +1022,110 @@ { /*------------------------- push rDEL scheme metrics */ _dump.push("\n") ; - _dump.push("**DELTRI statistics... \n") ; - _dump.push("\n") ; + _dump.push("**TIMING statistics...\n") ; - _dump.push("**FUNCTION timing: ") ; - _dump.push("\n") ; - - _dump.push(" MESH-SEED = ") ; + _dump.push(" *mesh-seed = ") ; _dump.push( std::to_string (_tcpu._mesh_seed)); _dump.push("\n") ; - - _dump.push(" EDGE-INIT = ") ; + _dump.push(" *edge-init = ") ; _dump.push( std::to_string (_tcpu._edge_init)); _dump.push("\n") ; - _dump.push(" FACE-INIT = ") ; + _dump.push(" *face-init = ") ; _dump.push( std::to_string (_tcpu._face_init)); _dump.push("\n") ; - _dump.push(" TRIA-INIT = ") ; + _dump.push(" *tria-init = ") ; _dump.push( std::to_string (_tcpu._tria_init)); _dump.push("\n") ; - _dump.push("\n") ; - _dump.push("**RESTRICTED-TRIA: ") ; _dump.push("\n") ; + _dump.push("**rDT(x) statistics...\n") ; - _dump.push(" rDEL-EDGE = "); + _dump.push(" *rDEL-edge = "); _dump.push(std::to_string (_nedg)); _dump.push("\n") ; - - _dump.push(" rDEL-FACE = "); + _dump.push(" *rDEL-face = "); _dump.push(std::to_string (_nfac)); _dump.push("\n") ; - - _dump.push(" rDEL-TRIA = "); + _dump.push(" *rDEL-tria = "); _dump.push(std::to_string (_ntri)); _dump.push("\n") ; - _dump.push("\n") ; } - if (_args.verb() >= +3 ) + if (_args.verb() >= +2 ) { - /*------------------------- push rDEL memory metrics */ - _dump.push("\n") ; - _dump.push("**MEMORY statistics... \n") ; + /*------------------------- more rDEL scheme metrics */ _dump.push("\n") ; + _dump.push("**MEMORY statistics...\n") ; - _dump.push("**DELAUNAY-OBJECT: ") ; - _dump.push("\n") ; - - _dump.push(" NODE-BYTE = ") ; + _dump.push(" xDEL-type:\n") ; + _dump.push(" *node-byte = ") ; _dump.push(std::to_string( sizeof(typename mesh_type:: tria_type:: node_type)) ) ; _dump.push("\n") ; - _dump.push(" NODE-LIST = ") ; + _dump.push(" *nset-size = ") ; _dump.push(std::to_string( _mesh._tria._nset.alloc())) ; _dump.push("\n") ; - - _dump.push(" TRIA-BYTE = ") ; + _dump.push(" *tria-byte = ") ; _dump.push(std::to_string( sizeof(typename mesh_type:: tria_type:: tria_type)) ) ; _dump.push("\n") ; - _dump.push(" TRIA-LIST = ") ; + _dump.push(" *tset-size = ") ; _dump.push(std::to_string( _mesh._tria._tset.alloc())) ; _dump.push("\n") ; + _dump.push(" *pool-byte = ") ; + _dump.push(std::to_string( + _mesh._tria._fpol.bytes())) ; _dump.push("\n") ; - _dump.push("**RESTRICTED-TRIA: ") ; _dump.push("\n") ; - - _dump.push(" EDGE-BYTE = ") ; + _dump.push(" rDEL-type:\n") ; + _dump.push(" *edge-byte = ") ; _dump.push(std::to_string( sizeof( typename mesh_type::edge_item)) ) ; _dump.push("\n") ; - _dump.push(" EDGE-HASH = ") ; + _dump.push(" *eset-size = ") ; _dump.push(std::to_string( _mesh._eset._lptr.alloc())) ; _dump.push("\n") ; - _dump.push(" POOL-BYTE = ") ; - _dump.push(std::to_string( - _mesh._epol.bytes () ) ) ; + _dump.push(" *pool-byte = ") ; + _dump.push( + std::to_string(_mesh._epol.bytes())) ; _dump.push("\n") ; - - _dump.push(" FACE-BYTE = ") ; + _dump.push(" *face-byte = ") ; _dump.push(std::to_string( sizeof( typename mesh_type::face_item)) ) ; _dump.push("\n") ; - _dump.push(" FACE-HASH = ") ; + _dump.push(" *fset-size = ") ; _dump.push(std::to_string( _mesh._fset._lptr.alloc())) ; _dump.push("\n") ; - _dump.push(" POOL-BYTE = ") ; - _dump.push(std::to_string( - _mesh._fpol.bytes () ) ) ; + _dump.push(" *pool-byte = ") ; + _dump.push( + std::to_string(_mesh._fpol.bytes())) ; _dump.push("\n") ; - - _dump.push(" TRIA-BYTE = ") ; + _dump.push(" *tria-byte = ") ; _dump.push(std::to_string( sizeof( typename mesh_type::tria_item)) ) ; _dump.push("\n") ; - _dump.push(" TRIA-HASH = ") ; + _dump.push(" *tset-size = ") ; _dump.push(std::to_string( _mesh._tset._lptr.alloc())) ; _dump.push("\n") ; - _dump.push(" POOL-BYTE = ") ; - _dump.push(std::to_string( - _mesh._tpol.bytes () ) ) ; - _dump.push("\n") ; + _dump.push(" *pool-byte = ") ; + _dump.push( + std::to_string(_mesh._tpol.bytes())) ; _dump.push("\n") ; } diff --git a/external/jigsaw/src/libcpp/rdel_mesh/rdel_mesh_2.hpp b/external/jigsaw/src/libcpp/rdel_mesh/rdel_mesh_2.hpp index 3c4b670..f7e5831 100644 --- a/external/jigsaw/src/libcpp/rdel_mesh/rdel_mesh_2.hpp +++ b/external/jigsaw/src/libcpp/rdel_mesh/rdel_mesh_2.hpp @@ -22,16 +22,20 @@ * how they can obtain it for free, then you are not * required to make any arrangement with me.) * - * Disclaimer: Neither I nor: Columbia University, The - * Massachusetts Institute of Technology, The - * University of Sydney, nor The National Aeronautics - * and Space Administration warrant this code in any - * way whatsoever. This code is provided "as-is" to be - * used at your own risk. + * Disclaimer: Neither I nor THE CONTRIBUTORS warrant + * this code in any way whatsoever. This code is + * provided "as-is" to be used at your own risk. + * + * THE CONTRIBUTORS include: + * (a) The University of Sydney + * (b) The Massachusetts Institute of Technology + * (c) Columbia University + * (d) The National Aeronautics & Space Administration + * (e) Los Alamos National Laboratory * -------------------------------------------------------- * - * Last updated: 02 Feb., 2021 + * Last updated: 12 Jul., 2021 * * Copyright 2013-2021 * Darren Engwirda @@ -176,14 +180,12 @@ typedef typename mesh_type::tria_list tria_hash ; + typedef mesh::rdel_timers rdel_stat ; + typedef mesh::mesh_params < real_type, iptr_type > rdel_opts ; - typedef mesh::rdel_timers < - real_type , - iptr_type > rdel_stat ; - typedef containers::array < iptr_type > iptr_list ; @@ -359,8 +361,7 @@ if(!_eepq.empty()) { - iptr_type _dead = +0 ; - iptr_type _okay = +0 ; + iptr_type _dead = +0, _okay = +0 ; for (auto _hpos = _eepq.count() - 1 ; _hpos > +0 ; @@ -420,8 +421,7 @@ if(!_ttpq.empty()) { - iptr_type _dead = +0 ; - iptr_type _okay = +0 ; + iptr_type _dead = +0, _okay = +0 ; for (auto _hpos = _ttpq.count() - 1 ; _hpos > +0 ; @@ -588,8 +588,8 @@ _scal = std::max( _scal , _plen[ 1]); - _plen[ 0]*= (real_type)+4.0 ; - _plen[ 1]*= (real_type)+4.0 ; + _plen[ 0]*= (real_type)+8.0 ; + _plen[ 1]*= (real_type)+8.0 ; _pmin[ 0]-= _plen[ 0] ; _pmin[ 1]-= _plen[ 1] ; @@ -788,7 +788,13 @@ # ifdef _DEBUG iptr_type _jlog_freq = +250 ; # else - iptr_type _jlog_freq = +50000 ; + iptr_type _jlog_tens = + (iptr_type) std::log10(_pass) ; + + iptr_type _jlog_freq = // logarithmic updates + (+1 * std::max(10000, + (+5 * std::max(1000, + (iptr_type)std::pow(10, _jlog_tens))) / 2)) ; # endif if(++_pass>_args.iter()) break; @@ -951,7 +957,7 @@ # ifdef __use_timers _ttoc = _time.now() ; _tcpu._node_rule += - _tcpu.time_span(_ttic,_ttoc) ; + _tcpu.nano_span(_ttic,_ttoc) ; # endif//__use_timers } else @@ -974,7 +980,7 @@ # ifdef __use_timers _ttoc = _time.now() ; _tcpu._edge_rule += - _tcpu.time_span(_ttic,_ttoc) ; + _tcpu.nano_span(_ttic,_ttoc) ; # endif//__use_timers } else @@ -998,7 +1004,7 @@ # ifdef __use_timers _ttoc = _time.now() ; _tcpu._edge_rule += - _tcpu.time_span(_ttic,_ttoc) ; + _tcpu.nano_span(_ttic,_ttoc) ; # endif//__use_timers } else @@ -1021,7 +1027,7 @@ # ifdef __use_timers _ttoc = _time.now() ; _tcpu._tria_rule += - _tcpu.time_span(_ttic,_ttoc) ; + _tcpu.nano_span(_ttic,_ttoc) ; # endif//__use_timers } /*----------------------------- meshing converged */ @@ -1062,6 +1068,10 @@ if (_pass%_trim_freq == +0 ) { /*--------------- trim null PQ items "on-the-fly" */ + # ifdef __use_timers + _ttic = _time.now() ; + # endif//__use_timers + trim_list( _nbpq ) ; trim_eepq( _mesh , _eepq ) ; @@ -1081,13 +1091,30 @@ trim_list( _tscr ) ; trim_list( _bscr ) ; trim_list( _bdat ) ; + + # ifdef __use_timers + _ttoc = _time.now() ; + _tcpu._list_trim += + _tcpu.time_span(_ttic,_ttoc) ; + # endif//__use_timers } + { /*--------------- enqueue nodes for topol. checks */ + # ifdef __use_timers + _ttic = _time.now() ; + # endif//__use_timers + + fill_topo( _mesh, _pass, + _etpq, _emrk, + _edat, _eprv, _args) ; - fill_topo( _mesh, _pass, - _etpq, _emrk, - _edat, _eprv, _args) ; + # ifdef __use_timers + _ttoc = _time.now() ; + _tcpu._topo_init += + _tcpu.time_span(_ttic,_ttoc) ; + # endif//__use_timers + } /*--------------- update restricted triangulation */ @@ -1162,200 +1189,264 @@ /*-------------------- push refinement scheme metrics */ _dump.push("\n") ; - _dump.push("**REFINE statistics... \n") ; - _dump.push("\n") ; + _dump.push("**TIMING statistics...\n") ; - _dump.push("**FUNCTION timing: ") ; - _dump.push("\n") ; - - _dump.push(" MESH-SEED = ") ; + _dump.push(" *mesh-seed = ") ; _dump.push( std::to_string (_tcpu._mesh_seed)); _dump.push("\n") ; - - _dump.push(" NODE-INIT = ") ; + _dump.push(" *node-init = ") ; _dump.push( std::to_string (_tcpu._node_init)); _dump.push("\n") ; - _dump.push(" NODE-RULE = ") ; + _dump.push(" *node-rule = ") ; _dump.push( std::to_string (_tcpu._node_rule)); _dump.push("\n") ; - - _dump.push(" EDGE-INIT = ") ; + _dump.push(" *edge-init = ") ; _dump.push( std::to_string (_tcpu._edge_init)); _dump.push("\n") ; - _dump.push(" EDGE-RULE = ") ; + _dump.push(" *edge-rule = ") ; _dump.push( std::to_string (_tcpu._edge_rule)); _dump.push("\n") ; - - _dump.push(" TRIA-INIT = ") ; + _dump.push(" *tria-init = ") ; _dump.push( std::to_string (_tcpu._tria_init)); _dump.push("\n") ; - _dump.push(" TRIA-RULE = ") ; + _dump.push(" *tria-rule = ") ; _dump.push( std::to_string (_tcpu._tria_rule)); _dump.push("\n") ; + _dump.push(" *list-init = ") ; + _dump.push( + std::to_string (_tcpu._list_trim)); _dump.push("\n") ; + _dump.push(" *topo-init = ") ; + _dump.push( + std::to_string (_tcpu._topo_init)); + _dump.push("\n\n"); - _dump.push("**INSERTION rules: ") ; - _dump.push("\n") ; - - _dump.push(" EDGE-CIRC = ") ; + _dump.push("**REFINE statistics...\n") ; + _dump.push(" *edge-circ = ") ; _dump.push(std::to_string( _enod[rdel_opts::circ_kind])); _dump.push("\n") ; - _dump.push(" EDGE-OFFH = ") ; + _dump.push(" *edge-offH = ") ; _dump.push(std::to_string( _enod[rdel_opts::offH_kind])); _dump.push("\n") ; - _dump.push(" EDGE-OFFT = ") ; + _dump.push(" *edge-offT = ") ; _dump.push(std::to_string( _enod[rdel_opts::offT_kind])); _dump.push("\n") ; - _dump.push("\n") ; - - _dump.push(" TRIA-CIRC = ") ; + _dump.push(" *tria-circ = ") ; _dump.push(std::to_string( _tnod[rdel_opts::circ_kind])); _dump.push("\n") ; - _dump.push(" TRIA-SINK = ") ; + _dump.push(" *tria-sink = ") ; _dump.push(std::to_string( _tnod[rdel_opts::sink_kind])); _dump.push("\n") ; - _dump.push(" TRIA-OFFH = ") ; + _dump.push(" *tria-offH = ") ; _dump.push(std::to_string( _tnod[rdel_opts::offH_kind])); _dump.push("\n") ; - _dump.push(" TRIA-OFFC = ") ; + _dump.push(" *tria-offC = ") ; _dump.push(std::to_string( _tnod[rdel_opts::offC_kind])); _dump.push("\n") ; - _dump.push("\n") ; } - if (_args.verb() >= +3 ) + if (_args.verb() >= +2 ) { - /*-------------------- push refinement memory metrics */ - - _dump.push("\n") ; - _dump.push("**MEMORY statistics... \n") ; - _dump.push("\n") ; + /*-------------------- more refinement scheme metrics */ - _dump.push("**DELAUNAY-OBJECT: ") ; _dump.push("\n") ; + _dump.push("**MEMORY statistics...\n") ; - _dump.push(" NODE-BYTE = ") ; + _dump.push(" xDEL-type:\n") ; + _dump.push(" *node-byte = ") ; _dump.push(std::to_string( sizeof(typename mesh_type:: tria_type:: node_type)) ) ; _dump.push("\n") ; - _dump.push(" NODE-LIST = ") ; + _dump.push(" *nset-size = ") ; _dump.push(std::to_string( _mesh._tria._nset.alloc())) ; _dump.push("\n") ; - - _dump.push(" TRIA-BYTE = ") ; + _dump.push(" *tria-byte = ") ; _dump.push(std::to_string( sizeof(typename mesh_type:: tria_type:: tria_type)) ) ; _dump.push("\n") ; - _dump.push(" TRIA-LIST = ") ; + _dump.push(" *tset-size = ") ; _dump.push(std::to_string( _mesh._tria._tset.alloc())) ; _dump.push("\n") ; + _dump.push(" *pool-byte = ") ; + _dump.push(std::to_string( + _mesh._tria._fpol.bytes())) ; _dump.push("\n") ; - _dump.push("**RESTRICTED-TRIA: ") ; - _dump.push("\n") ; - - _dump.push(" BALL-BYTE = ") ; + _dump.push(" rDEL-type:\n") ; + _dump.push(" *ball-byte = ") ; _dump.push(std::to_string( sizeof( typename mesh_type::ball_item)) ) ; _dump.push("\n") ; - _dump.push(" BALL-HASH = ") ; + _dump.push(" *bset-size = ") ; _dump.push(std::to_string( _mesh._bset._lptr.alloc())) ; _dump.push("\n") ; - _dump.push(" POOL-BYTE = ") ; - _dump.push(std::to_string( - _mesh._bpol.bytes () ) ) ; + _dump.push(" *pool-byte = ") ; + _dump.push( + std::to_string(_mesh._bpol.bytes())) ; _dump.push("\n") ; - - _dump.push(" NODE-BYTE = ") ; + _dump.push(" *node-byte = ") ; _dump.push(std::to_string( sizeof( typename mesh_type::node_item)) ) ; _dump.push("\n") ; - _dump.push(" NODE-HASH = ") ; + _dump.push(" *nset-size = ") ; _dump.push(std::to_string( _mesh._nset._lptr.alloc())) ; _dump.push("\n") ; - _dump.push(" POOL-BYTE = ") ; - _dump.push(std::to_string( - _mesh._npol.bytes () ) ) ; + _dump.push(" *pool-byte = ") ; + _dump.push( + std::to_string(_mesh._npol.bytes())) ; _dump.push("\n") ; - - _dump.push(" EDGE-BYTE = ") ; + _dump.push(" *edge-byte = ") ; _dump.push(std::to_string( sizeof( typename mesh_type::edge_item)) ) ; _dump.push("\n") ; - _dump.push(" EDGE-HASH = ") ; + _dump.push(" *eset-size = ") ; _dump.push(std::to_string( _mesh._eset._lptr.alloc())) ; _dump.push("\n") ; - _dump.push(" POOL-BYTE = ") ; - _dump.push(std::to_string( - _mesh._epol.bytes () ) ) ; + _dump.push(" *pool-byte = ") ; + _dump.push( + std::to_string(_mesh._epol.bytes())) ; _dump.push("\n") ; - - _dump.push(" TRIA-BYTE = ") ; + _dump.push(" *tria-byte = ") ; _dump.push(std::to_string( sizeof( typename mesh_type::tria_item)) ) ; _dump.push("\n") ; - _dump.push(" TRIA-HASH = ") ; + _dump.push(" *tset-size = ") ; _dump.push(std::to_string( _mesh._tset._lptr.alloc())) ; _dump.push("\n") ; - _dump.push(" POOL-BYTE = ") ; - _dump.push(std::to_string( - _mesh._tpol.bytes () ) ) ; - _dump.push("\n") ; - _dump.push("\n") ; - - _dump.push("**PRIORITY-QUEUES: ") ; + _dump.push(" *pool-byte = ") ; + _dump.push( + std::to_string(_mesh._tpol.bytes())) ; _dump.push("\n") ; - _dump.push(" BSCR-BYTE = ") ; + _dump.push(" xxPQ-type:\n") ; + _dump.push(" *bscr-byte = ") ; _dump.push( std::to_string(sizeof(ball_data))); _dump.push("\n") ; - _dump.push(" BBPQ-ITEM = ") ; + _dump.push(" *bset-peak = ") ; _dump.push(std::to_string(_Nbpq)) ; _dump.push("\n") ; - - _dump.push(" ESCR-BYTE = ") ; + _dump.push(" *escr-byte = ") ; _dump.push( std::to_string(sizeof(edge_cost))); _dump.push("\n") ; - _dump.push(" EEPQ-ITEM = ") ; + _dump.push(" *eset-peak = ") ; _dump.push(std::to_string(_Nepq)) ; _dump.push("\n") ; - - _dump.push(" TSCR-BYTE = ") ; + _dump.push(" *tscr-byte = ") ; _dump.push( std::to_string(sizeof(tria_cost))); _dump.push("\n") ; - _dump.push(" TTPQ-ITEM = ") ; + _dump.push(" *tset-peak = ") ; _dump.push(std::to_string(_Ntpq)) ; _dump.push("\n") ; + + _dump.push("\n") ; + _dump.push("**FPMATH statistics...\n") ; + + _dump.push(" *orient2Df = ") ; + _dump.push(std::to_string( + geompred::_nn_calls [ + geompred::ORIENT2D_f])) ; + _dump.push("\n") ; + _dump.push(" *orient2Di = ") ; + _dump.push(std::to_string( + geompred::_nn_calls [ + geompred::ORIENT2D_i])) ; + _dump.push("\n") ; + _dump.push(" *orient2De = ") ; + _dump.push(std::to_string( + geompred::_nn_calls [ + geompred::ORIENT2D_e])) ; + _dump.push("\n") ; + + _dump.push(" *bisect2Df = ") ; + _dump.push(std::to_string( + geompred::_nn_calls [ + geompred::BISECT2D_f])) ; + _dump.push("\n") ; + _dump.push(" *bisect2Di = ") ; + _dump.push(std::to_string( + geompred::_nn_calls [ + geompred::BISECT2D_i])) ; + _dump.push("\n") ; + _dump.push(" *bisect2De = ") ; + _dump.push(std::to_string( + geompred::_nn_calls [ + geompred::BISECT2D_e])) ; + _dump.push("\n") ; + _dump.push(" *bisect2Wf = ") ; + _dump.push(std::to_string( + geompred::_nn_calls [ + geompred::BISECT2W_f])) ; + _dump.push("\n") ; + _dump.push(" *bisect2Wi = ") ; + _dump.push(std::to_string( + geompred::_nn_calls [ + geompred::BISECT2W_i])) ; + _dump.push("\n") ; + _dump.push(" *bisect2We = ") ; + _dump.push(std::to_string( + geompred::_nn_calls [ + geompred::BISECT2W_e])) ; + _dump.push("\n") ; + + _dump.push(" *inball2Df = ") ; + _dump.push(std::to_string( + geompred::_nn_calls [ + geompred::INBALL2D_f])) ; + _dump.push("\n") ; + _dump.push(" *inball2Di = ") ; + _dump.push(std::to_string( + geompred::_nn_calls [ + geompred::INBALL2D_i])) ; + _dump.push("\n") ; + _dump.push(" *inball2De = ") ; + _dump.push(std::to_string( + geompred::_nn_calls [ + geompred::INBALL2D_e])) ; + _dump.push("\n") ; + _dump.push(" *inball2Wf = ") ; + _dump.push(std::to_string( + geompred::_nn_calls [ + geompred::INBALL2W_f])) ; + _dump.push("\n") ; + _dump.push(" *inball2Wi = ") ; + _dump.push(std::to_string( + geompred::_nn_calls [ + geompred::INBALL2W_i])) ; + _dump.push("\n") ; + _dump.push(" *inball2We = ") ; + _dump.push(std::to_string( + geompred::_nn_calls [ + geompred::INBALL2W_e])) ; _dump.push("\n") ; } diff --git a/external/jigsaw/src/libcpp/rdel_mesh/rdel_mesh_3.hpp b/external/jigsaw/src/libcpp/rdel_mesh/rdel_mesh_3.hpp index 6113a2e..bfb2bd2 100644 --- a/external/jigsaw/src/libcpp/rdel_mesh/rdel_mesh_3.hpp +++ b/external/jigsaw/src/libcpp/rdel_mesh/rdel_mesh_3.hpp @@ -22,16 +22,20 @@ * how they can obtain it for free, then you are not * required to make any arrangement with me.) * - * Disclaimer: Neither I nor: Columbia University, The - * Massachusetts Institute of Technology, The - * University of Sydney, nor The National Aeronautics - * and Space Administration warrant this code in any - * way whatsoever. This code is provided "as-is" to be - * used at your own risk. + * Disclaimer: Neither I nor THE CONTRIBUTORS warrant + * this code in any way whatsoever. This code is + * provided "as-is" to be used at your own risk. + * + * THE CONTRIBUTORS include: + * (a) The University of Sydney + * (b) The Massachusetts Institute of Technology + * (c) Columbia University + * (d) The National Aeronautics & Space Administration + * (e) Los Alamos National Laboratory * -------------------------------------------------------- * - * Last updated: 02 Feb., 2021 + * Last updated: 12 Jul., 2021 * * Copyright 2013-2021 * Darren Engwirda @@ -182,14 +186,12 @@ typedef typename mesh_type::tria_data tria_data ; + typedef mesh::rdel_timers rdel_stat ; + typedef mesh::mesh_params < real_type, iptr_type > rdel_opts ; - typedef mesh::rdel_timers < - real_type , - iptr_type > rdel_stat ; - typedef containers::array < iptr_type > iptr_list ; @@ -387,8 +389,7 @@ if(!_eepq.empty()) { - iptr_type _dead = +0 ; - iptr_type _okay = +0 ; + iptr_type _dead = +0, _okay = +0 ; for (auto _hpos = _eepq.count() - 1 ; _hpos > +0 ; @@ -448,8 +449,7 @@ if(!_ffpq.empty()) { - iptr_type _dead = +0 ; - iptr_type _okay = +0 ; + iptr_type _dead = +0, _okay = +0 ; for (auto _hpos = _ffpq.count() - 1 ; _hpos > +0 ; @@ -511,8 +511,7 @@ if(!_ttpq.empty()) { - iptr_type _dead = +0 ; - iptr_type _okay = +0 ; + iptr_type _dead = +0, _okay = +0 ; for (auto _hpos = _ttpq.count() - 1 ; _hpos > +0 ; @@ -698,9 +697,9 @@ _scal = std::max( _scal , _plen[ 2]); - _plen[ 0]*= (real_type)+4.0 ; - _plen[ 1]*= (real_type)+4.0 ; - _plen[ 2]*= (real_type)+4.0 ; + _plen[ 0]*= (real_type)+8.0 ; + _plen[ 1]*= (real_type)+8.0 ; + _plen[ 2]*= (real_type)+8.0 ; _pmin[ 0]-= _plen[ 0] ; _pmin[ 1]-= _plen[ 1] ; @@ -767,9 +766,6 @@ mesh_type &_mesh ) { - - //return; - iptr_list _nsum; _nsum.set_count( _mesh._tria._nset.count(), @@ -1009,7 +1005,13 @@ # ifdef _DEBUG iptr_type _jlog_freq = +250 ; # else - iptr_type _jlog_freq = +12500 ; + iptr_type _jlog_tens = + (iptr_type) std::log10(_pass) ; + + iptr_type _jlog_freq = // logarithmic updates + (+1 * std::max(10000, + (+5 * std::max(1000, + (iptr_type)std::pow(10, _jlog_tens))) / 2)) ; # endif if(++_pass>_args.iter()) break; @@ -1140,9 +1142,9 @@ _mesh, _epro, _fpro, _pass, _mode, _args) ; - */ - //init_dual( _mesh) ; + init_dual( _mesh) ; + */ init_rdel( _geom, _hfun, _mesh, true, @@ -1232,7 +1234,7 @@ # ifdef __use_timers _ttoc = _time.now() ; _tcpu._node_rule += - _tcpu.time_span(_ttic,_ttoc) ; + _tcpu.nano_span(_ttic,_ttoc) ; # endif//__use_timers } else @@ -1257,7 +1259,7 @@ # ifdef __use_timers _ttoc = _time.now() ; _tcpu._edge_rule += - _tcpu.time_span(_ttic,_ttoc) ; + _tcpu.nano_span(_ttic,_ttoc) ; # endif//__use_timers } else @@ -1283,7 +1285,7 @@ # ifdef __use_timers _ttoc = _time.now() ; _tcpu._edge_rule += - _tcpu.time_span(_ttic,_ttoc) ; + _tcpu.nano_span(_ttic,_ttoc) ; # endif//__use_timers } else @@ -1308,7 +1310,7 @@ # ifdef __use_timers _ttoc = _time.now() ; _tcpu._face_rule += - _tcpu.time_span(_ttic,_ttoc) ; + _tcpu.nano_span(_ttic,_ttoc) ; # endif//__use_timers } else @@ -1334,7 +1336,7 @@ # ifdef __use_timers _ttoc = _time.now() ; _tcpu._face_rule += - _tcpu.time_span(_ttic,_ttoc) ; + _tcpu.nano_span(_ttic,_ttoc) ; # endif//__use_timers } else @@ -1359,7 +1361,7 @@ # ifdef __use_timers _ttoc = _time.now() ; _tcpu._tria_rule += - _tcpu.time_span(_ttic,_ttoc) ; + _tcpu.nano_span(_ttic,_ttoc) ; # endif//__use_timers } /*----------------------------- meshing converged */ @@ -1407,6 +1409,10 @@ if (_pass%_trim_freq == +0 ) { /*--------------- trim null PQ items "on-the-fly" */ + # ifdef __use_timers + _ttic = _time.now() ; + # endif//__use_timers + trim_list( _nbpq ) ; trim_eepq( _mesh , _eepq ) ; @@ -1432,15 +1438,32 @@ trim_list( _tscr ) ; trim_list( _bdat ) ; trim_list( _bscr ) ; + + # ifdef __use_timers + _ttoc = _time.now() ; + _tcpu._list_trim += + _tcpu.time_span(_ttic,_ttoc) ; + # endif//__use_timers } + { /*--------------- enqueue nodes for topol. checks */ + # ifdef __use_timers + _ttic = _time.now() ; + # endif//__use_timers + + fill_topo( _mesh, _pass, + _etpq, _emrk, + _ftpq, _fmrk, + _edat, _eprv, + _fdat, _fprv, _args) ; - fill_topo( _mesh, _pass, - _etpq, _emrk, - _ftpq, _fmrk, - _edat, _eprv, - _fdat, _fprv, _args) ; + # ifdef __use_timers + _ttoc = _time.now() ; + _tcpu._topo_init += + _tcpu.time_span(_ttic,_ttoc) ; + # endif//__use_timers + } /*--------------- update restricted triangulation */ @@ -1528,253 +1551,312 @@ /*-------------------- push refinement scheme metrics */ _dump.push("\n") ; - _dump.push("**REFINE statistics... \n") ; - _dump.push("\n") ; - - _dump.push("**FUNCTION timing: ") ; - _dump.push("\n") ; + _dump.push("**TIMING statistics...\n") ; - _dump.push(" MESH-SEED = ") ; + _dump.push(" *mesh-seed = ") ; _dump.push( std::to_string (_tcpu._mesh_seed)); _dump.push("\n") ; - - _dump.push(" NODE-INIT = ") ; + _dump.push(" *node-init = ") ; _dump.push( std::to_string (_tcpu._node_init)); _dump.push("\n") ; - _dump.push(" NODE-RULE = ") ; + _dump.push(" *node-rule = ") ; _dump.push( std::to_string (_tcpu._node_rule)); _dump.push("\n") ; - - _dump.push(" EDGE-INIT = ") ; + _dump.push(" *edge-init = ") ; _dump.push( std::to_string (_tcpu._edge_init)); _dump.push("\n") ; - _dump.push(" EDGE-RULE = ") ; + _dump.push(" *edge-rule = ") ; _dump.push( std::to_string (_tcpu._edge_rule)); _dump.push("\n") ; - - _dump.push(" FACE-INIT = ") ; + _dump.push(" *face-init = ") ; _dump.push( std::to_string (_tcpu._face_init)); _dump.push("\n") ; - _dump.push(" FACE-RULE = ") ; + _dump.push(" *face-rule = ") ; _dump.push( std::to_string (_tcpu._face_rule)); _dump.push("\n") ; - - _dump.push(" TRIA-INIT = ") ; + _dump.push(" *tria-init = ") ; _dump.push( std::to_string (_tcpu._tria_init)); _dump.push("\n") ; - _dump.push(" TRIA-RULE = ") ; + _dump.push(" *tria-rule = ") ; _dump.push( std::to_string (_tcpu._tria_rule)); _dump.push("\n") ; + _dump.push(" *list-init = ") ; + _dump.push( + std::to_string (_tcpu._list_trim)); _dump.push("\n") ; + _dump.push(" *topo-init = ") ; + _dump.push( + std::to_string (_tcpu._topo_init)); + _dump.push("\n\n"); - _dump.push("**INSERTION rules: ") ; - _dump.push("\n") ; - - _dump.push(" EDGE-CIRC = ") ; + _dump.push("**REFINE statistics...\n") ; + _dump.push(" *edge-circ = ") ; _dump.push(std::to_string( _enod[rdel_opts::circ_kind])); _dump.push("\n") ; - _dump.push(" EDGE-OFFH = ") ; + _dump.push(" *edge-offH = ") ; _dump.push(std::to_string( _enod[rdel_opts::offH_kind])); _dump.push("\n") ; - _dump.push(" EDGE-OFFT = ") ; + _dump.push(" *edge-offT = ") ; _dump.push(std::to_string( _enod[rdel_opts::offT_kind])); _dump.push("\n") ; - _dump.push("\n") ; - - _dump.push(" FACE-CIRC = ") ; + _dump.push(" *face-circ = ") ; _dump.push(std::to_string( _fnod[rdel_opts::circ_kind])); _dump.push("\n") ; - _dump.push(" FACE-SINK = ") ; + _dump.push(" *face-sink = ") ; _dump.push(std::to_string( _fnod[rdel_opts::sink_kind])); _dump.push("\n") ; - _dump.push(" FACE-OFFH = ") ; + _dump.push(" *face-offH = ") ; _dump.push(std::to_string( _fnod[rdel_opts::offH_kind])); _dump.push("\n") ; - _dump.push(" FACE-OFFC = ") ; + _dump.push(" *face-offC = ") ; _dump.push(std::to_string( _fnod[rdel_opts::offC_kind])); _dump.push("\n") ; - _dump.push(" FACE-OFFT = ") ; + _dump.push(" *face-offT = ") ; _dump.push(std::to_string( _fnod[rdel_opts::offT_kind])); _dump.push("\n") ; - _dump.push("\n") ; - - _dump.push(" TRIA-CIRC = ") ; + _dump.push(" *tria-circ = ") ; _dump.push(std::to_string( _tnod[rdel_opts::circ_kind])); _dump.push("\n") ; - _dump.push(" TRIA-SINK = ") ; + _dump.push(" *tria-sink = ") ; _dump.push(std::to_string( _tnod[rdel_opts::sink_kind])); _dump.push("\n") ; - _dump.push(" TRIA-OFFH = ") ; + _dump.push(" *tria-offH = ") ; _dump.push(std::to_string( _tnod[rdel_opts::offH_kind])); _dump.push("\n") ; - _dump.push(" TRIA-OFFC = ") ; + _dump.push(" *tria-offC = ") ; _dump.push(std::to_string( _tnod[rdel_opts::offC_kind])); _dump.push("\n") ; - _dump.push("\n") ; } - if (_args.verb() >= +3 ) + if (_args.verb() >= +2 ) { - /*-------------------- push refinement memory metrics */ + /*-------------------- more refinement scheme metrics */ _dump.push("\n") ; - _dump.push("**MEMORY statistics... \n") ; - _dump.push("\n") ; + _dump.push("**MEMORY statistics...\n") ; - _dump.push("**DELAUNAY-OBJECT: ") ; - _dump.push("\n") ; - - _dump.push(" NODE-BYTE = ") ; + _dump.push(" xDEL-type:\n") ; + _dump.push(" *node-byte = ") ; _dump.push(std::to_string( sizeof(typename mesh_type:: tria_type:: node_type)) ) ; _dump.push("\n") ; - _dump.push(" NODE-LIST = ") ; + _dump.push(" *nset-size = ") ; _dump.push(std::to_string( _mesh._tria._nset.alloc())) ; _dump.push("\n") ; - - _dump.push(" TRIA-BYTE = ") ; + _dump.push(" *tria-byte = ") ; _dump.push(std::to_string( sizeof(typename mesh_type:: tria_type:: tria_type)) ) ; _dump.push("\n") ; - _dump.push(" TRIA-LIST = ") ; + _dump.push(" *tset-size = ") ; _dump.push(std::to_string( _mesh._tria._tset.alloc())) ; _dump.push("\n") ; + _dump.push(" *pool-byte = ") ; + _dump.push(std::to_string( + _mesh._tria._fpol.bytes())) ; _dump.push("\n") ; - _dump.push("**RESTRICTED-TRIA: ") ; - _dump.push("\n") ; - - _dump.push(" BALL-BYTE = ") ; + _dump.push(" rDEL-type:\n") ; + _dump.push(" *ball-byte = ") ; _dump.push(std::to_string( sizeof( typename mesh_type::ball_item)) ) ; _dump.push("\n") ; - _dump.push(" BALL-HASH = ") ; + _dump.push(" *bset-size = ") ; _dump.push(std::to_string( _mesh._bset._lptr.alloc())) ; _dump.push("\n") ; - _dump.push(" POOL-BYTE = ") ; - _dump.push(std::to_string( - _mesh._bpol.bytes () ) ) ; + _dump.push(" *pool-byte = ") ; + _dump.push( + std::to_string(_mesh._bpol.bytes())) ; _dump.push("\n") ; - - _dump.push(" NODE-BYTE = ") ; + _dump.push(" *node-byte = ") ; _dump.push(std::to_string( sizeof( typename mesh_type::node_item)) ) ; _dump.push("\n") ; - _dump.push(" NODE-HASH = ") ; + _dump.push(" *nset-size = ") ; _dump.push(std::to_string( _mesh._nset._lptr.alloc())) ; _dump.push("\n") ; - _dump.push(" POOL-BYTE = ") ; + _dump.push(" *pool-byte = ") ; _dump.push(std::to_string( _mesh._npol.bytes () ) ) ; _dump.push("\n") ; - - _dump.push(" EDGE-BYTE = ") ; + _dump.push(" *edge-byte = ") ; _dump.push(std::to_string( sizeof( typename mesh_type::edge_item)) ) ; _dump.push("\n") ; - _dump.push(" EDGE-HASH = ") ; + _dump.push(" *eset-size = ") ; _dump.push(std::to_string( _mesh._eset._lptr.alloc())) ; _dump.push("\n") ; - _dump.push(" POOL-BYTE = ") ; - _dump.push(std::to_string( - _mesh._epol.bytes () ) ) ; + _dump.push(" *pool-byte = ") ; + _dump.push( + std::to_string(_mesh._epol.bytes())) ; _dump.push("\n") ; - - _dump.push(" FACE-BYTE = ") ; + _dump.push(" *face-byte = ") ; _dump.push(std::to_string( sizeof( typename mesh_type::face_item)) ) ; _dump.push("\n") ; - _dump.push(" FACE-HASH = ") ; + _dump.push(" *fset-size = ") ; _dump.push(std::to_string( _mesh._fset._lptr.alloc())) ; _dump.push("\n") ; - _dump.push(" POOL-BYTE = ") ; - _dump.push(std::to_string( - _mesh._fpol.bytes () ) ) ; + _dump.push(" *pool-byte = ") ; + _dump.push( + std::to_string(_mesh._fpol.bytes())) ; _dump.push("\n") ; - - _dump.push(" TRIA-BYTE = ") ; + _dump.push(" *tria-byte = ") ; _dump.push(std::to_string( sizeof( typename mesh_type::tria_item)) ) ; _dump.push("\n") ; - _dump.push(" TRIA-HASH = ") ; + _dump.push(" *tset-size = ") ; _dump.push(std::to_string( _mesh._tset._lptr.alloc())) ; _dump.push("\n") ; - _dump.push(" POOL-BYTE = ") ; - _dump.push(std::to_string( - _mesh._tpol.bytes () ) ) ; - _dump.push("\n") ; - _dump.push("\n") ; - - _dump.push("**PRIORITY-QUEUES: ") ; + _dump.push(" *pool-byte = ") ; + _dump.push( + std::to_string(_mesh._tpol.bytes())) ; _dump.push("\n") ; - _dump.push(" BSCR-BYTE = ") ; + _dump.push(" xxPQ-type:\n") ; + _dump.push(" *bscr-byte = ") ; _dump.push( std::to_string(sizeof(ball_data))); _dump.push("\n") ; - _dump.push(" BBPQ-ITEM = ") ; + _dump.push(" *bset-peak = ") ; _dump.push(std::to_string(_Nbpq)) ; _dump.push("\n") ; - - _dump.push(" ESCR-BYTE = ") ; + _dump.push(" *escr-byte = ") ; _dump.push( std::to_string(sizeof(edge_cost))); _dump.push("\n") ; - _dump.push(" EEPQ-ITEM = ") ; + _dump.push(" *eset-peak = ") ; _dump.push(std::to_string(_Nepq)) ; _dump.push("\n") ; - - _dump.push(" FSCR-BYTE = ") ; + _dump.push(" *fscr-byte = ") ; _dump.push( std::to_string(sizeof(face_cost))); _dump.push("\n") ; - _dump.push(" FFPQ-ITEM = ") ; + _dump.push(" *fset-peak = ") ; _dump.push(std::to_string(_Nfpq)) ; _dump.push("\n") ; - - _dump.push(" TSCR-BYTE = ") ; + _dump.push(" *tscr-byte = ") ; _dump.push( std::to_string(sizeof(tria_cost))); _dump.push("\n") ; - _dump.push(" TTPQ-ITEM = ") ; + _dump.push(" *tset-peak = ") ; _dump.push(std::to_string(_Ntpq)) ; _dump.push("\n") ; + + _dump.push("\n") ; + _dump.push("**FPMATH statistics...\n") ; + + _dump.push(" *orient3Df = ") ; + _dump.push(std::to_string( + geompred::_nn_calls [ + geompred::ORIENT3D_f])) ; + _dump.push("\n") ; + _dump.push(" *orient3Di = ") ; + _dump.push(std::to_string( + geompred::_nn_calls [ + geompred::ORIENT3D_i])) ; + _dump.push("\n") ; + _dump.push(" *orient3De = ") ; + _dump.push(std::to_string( + geompred::_nn_calls [ + geompred::ORIENT3D_e])) ; + _dump.push("\n") ; + + _dump.push(" *bisect3Df = ") ; + _dump.push(std::to_string( + geompred::_nn_calls [ + geompred::BISECT3D_f])) ; + _dump.push("\n") ; + _dump.push(" *bisect3Di = ") ; + _dump.push(std::to_string( + geompred::_nn_calls [ + geompred::BISECT3D_i])) ; + _dump.push("\n") ; + _dump.push(" *bisect3De = ") ; + _dump.push(std::to_string( + geompred::_nn_calls [ + geompred::BISECT3D_e])) ; + _dump.push("\n") ; + _dump.push(" *bisect3Wf = ") ; + _dump.push(std::to_string( + geompred::_nn_calls [ + geompred::BISECT3W_f])) ; + _dump.push("\n") ; + _dump.push(" *bisect3Wi = ") ; + _dump.push(std::to_string( + geompred::_nn_calls [ + geompred::BISECT3W_i])) ; + _dump.push("\n") ; + _dump.push(" *bisect3We = ") ; + _dump.push(std::to_string( + geompred::_nn_calls [ + geompred::BISECT3W_e])) ; + _dump.push("\n") ; + + _dump.push(" *inball3Df = ") ; + _dump.push(std::to_string( + geompred::_nn_calls [ + geompred::INBALL3D_f])) ; + _dump.push("\n") ; + _dump.push(" *inball3Di = ") ; + _dump.push(std::to_string( + geompred::_nn_calls [ + geompred::INBALL3D_i])) ; + _dump.push("\n") ; + _dump.push(" *inball3De = ") ; + _dump.push(std::to_string( + geompred::_nn_calls [ + geompred::INBALL3D_e])) ; + _dump.push("\n") ; + _dump.push(" *inball3Wf = ") ; + _dump.push(std::to_string( + geompred::_nn_calls [ + geompred::INBALL3W_f])) ; + _dump.push("\n") ; + _dump.push(" *inball3Wi = ") ; + _dump.push(std::to_string( + geompred::_nn_calls [ + geompred::INBALL3W_i])) ; + _dump.push("\n") ; + _dump.push(" *inball3We = ") ; + _dump.push(std::to_string( + geompred::_nn_calls [ + geompred::INBALL3W_e])) ; _dump.push("\n") ; } diff --git a/external/jigsaw/src/libcpp/rdel_mesh/rdel_offh_delfront_2.inc b/external/jigsaw/src/libcpp/rdel_mesh/rdel_offh_delfront_2.inc index c29253b..37ffab6 100644 --- a/external/jigsaw/src/libcpp/rdel_mesh/rdel_offh_delfront_2.inc +++ b/external/jigsaw/src/libcpp/rdel_mesh/rdel_offh_delfront_2.inc @@ -22,18 +22,22 @@ * how they can obtain it for free, then you are not * required to make any arrangement with me.) * - * Disclaimer: Neither I nor: Columbia University, The - * Massachusetts Institute of Technology, The - * University of Sydney, nor The National Aeronautics - * and Space Administration warrant this code in any - * way whatsoever. This code is provided "as-is" to be - * used at your own risk. + * Disclaimer: Neither I nor THE CONTRIBUTORS warrant + * this code in any way whatsoever. This code is + * provided "as-is" to be used at your own risk. + * + * THE CONTRIBUTORS include: + * (a) The University of Sydney + * (b) The Massachusetts Institute of Technology + * (c) Columbia University + * (d) The National Aeronautics & Space Administration + * (e) Los Alamos National Laboratory * -------------------------------------------------------- * - * Last updated: 31 Mar., 2021 + * Last updated: 28 Dec., 2022 * - * Copyright 2013-2021 + * Copyright 2013-2022 * Darren Engwirda * d.engwirda@gmail.com * https://github.com/dengwirda/ @@ -66,25 +70,23 @@ _kind = rdel_opts::null_kind; typename hfun_type::hint_type - _hint = _hfun .null_hint() ; + _hint = _hfun .null_hint() , + _HINT = _hfun .null_hint() ; real_type static const _rtol = (real_type)+1.00E-003 ; real_type static const - _dtol = (real_type)+8.00E-001 ; + _dtol = (real_type)+8.33E-001 ; real_type static const - _lgap = (real_type)+9.00E-001 ; + _lgap = (real_type)+8./9. ; real_type static const - _ugap = (real_type)+1.10E+000 ; + _ugap = (real_type)+9./8. ; __unreferenced(_args) ; - if (_enod[1] < _enod[0]) - std::swap( _enod[0], _enod[1]); - real_type _hsiz [ 4] ; _hsiz[ 0] = _hfun.eval ( &_mesh._tria.node(_enod[0])->pval(0) , @@ -93,13 +95,19 @@ &_mesh._tria.node(_enod[1])->pval(0) , _mesh._tria.node(_enod[1])->idxh()) ; + if (_hsiz[1] < _hsiz[0]) + { + std::swap( _enod[0], _enod[1]); + std::swap( _hsiz[0], _hsiz[1]); + } + real_type _dvec[3] ; real_type _base[2] = { _mesh._tria.node(_enod[0])->pval(0) , _mesh._tria.node(_enod[0])->pval(1) , } ; - _hint = + _hint = _HINT = _mesh._tria.node (_enod[0])->idxh() ; _dvec[ 0] = @@ -140,8 +148,6 @@ (real_type)+.5 * (_base[1]+_ppos[1]) , } ; - typename hfun_type::hint_type - _HINT = _hint ; _hsiz[3] = _hfun.eval(_PMID, _HINT) ; real_type _hval = @@ -154,11 +160,10 @@ if (_dist >= _dvec[2] * _lgap && _dist <= _dvec[2] * _ugap ) { // circumball cushion - _dist += _dvec[2] ; - _dist /= (real_type)2.; + _dist = + .5 *(_dist + _dvec[2] ) ; - _kind = - rdel_opts::offH_kind ; + _kind = rdel_opts::offH_kind; } if (_dist >= _dvec[2] * _ugap ) @@ -166,31 +171,28 @@ _ppos[0]=_sbal[0] ; _ppos[1]=_sbal[1] ; - _kind = - rdel_opts::circ_kind ; - + _kind = rdel_opts::circ_kind; return _kind ; } else // adv.-front limiter { - _kind = - rdel_opts::offH_kind ; + _kind = rdel_opts::offH_kind; } _dist -= _pert * _dist ; iptr_type _dual = -1 ; - cosine_intersect _pred(_base,_dvec); + cosine_intersect _pred(_base,_dvec) ; _ball._rrad = _dist ; if (!_geom.intersect ( _ball, _pred) ) - return rdel_opts::null_kind ; + return rdel_opts::null_kind; if (!_pred. _find ) - return rdel_opts::null_kind ; + return rdel_opts::null_kind; real_type _move = geometry::length_2d( - _ppos,&_pred._proj.pval(0)); + _ppos,&_pred._proj.pval(0)) ; _ppos[ 0] = _pred._proj.pval(0); _ppos[ 1] = _pred._proj.pval(1); @@ -198,15 +200,17 @@ _mesh._tria.find_node ( // test voro. limiter &_ppos[0], _dual, _enod[ 0]) ; + if (_dual != _enod [ +0] ) + { real_type _dlen = geometry::length_2d( _ppos, &_mesh._tria. node(_dual)->pval(0)) ; - if (_dual != _enod [ +0] ) if (_dlen <= _dtol*_hval ) { - return rdel_opts::null_kind ; + return rdel_opts::null_kind; + } } if (_move <= _rtol*_hval ) break ; @@ -239,7 +243,8 @@ _kind = rdel_opts::null_kind; typename hfun_type::hint_type - _hint = _hfun .null_hint() ; + _hint = _hfun .null_hint() , + _HINT = _hfun .null_hint() ; real_type static const _rtol = (real_type)+1.00E-003 ; @@ -248,13 +253,13 @@ (real_type)std::sqrt(3.)/2. ; real_type static const - _dtol = (real_type)+8.00E-001 ; + _dtol = (real_type)+8.33E-001 ; real_type static const - _lgap = (real_type)+9.00E-001 ; + _lgap = (real_type)+8./9. ; real_type static const - _ugap = (real_type)+1.10E+000 ; + _ugap = (real_type)+9./8. ; __unreferenced(_geom) ; __unreferenced(_args) ; @@ -267,7 +272,7 @@ &_mesh._tria.node(_fnod[1])->pval(0) , _mesh._tria.node(_fnod[1])->idxh()) ; - _hint = + _hint = _HINT = _mesh._tria.node(_fnod[0])->idxh () ; real_type _bias[2] = { @@ -308,15 +313,13 @@ (real_type)+.5 * (_base[1]+_ppos[1]) , } ; - typename hfun_type::hint_type - _HINT = _hint ; _hsiz[3] = _hfun.eval(_PMID, _HINT) ; real_type _hmid = - _hsiz[0] * (real_type)1./6. + - _hsiz[1] * (real_type)1./6. + - _hsiz[2] * (real_type)1./6. + - _hsiz[3] * (real_type)3./6. ; + _hsiz[0] * (real_type)2./9. + + _hsiz[1] * (real_type)2./9. + + _hsiz[2] * (real_type)2./9. + + _hsiz[3] * (real_type)3./9. ; _kind = rdel_opts::offH_kind ; @@ -338,28 +341,28 @@ (real_type)std::sqrt(_dsqr) ; } - if (_dist > _alth * _hmid) + if (_dist >= _alth * _hmid) { // adv.-front limiter - _dist = _alth * _hmid ; - _kind = - rdel_opts::offH_kind ; + _dist = _alth * _hmid ; + _kind = rdel_opts::offH_kind; } if (_dist >= _dvec[3]) // off-centre limiter { - _dist = _dvec[3] ; - _kind = - rdel_opts::offC_kind ; + _dist = + 2. * _dist * _dvec[3] + / (_dist + _dvec[3] ) ; + + _kind = rdel_opts::offC_kind; } if (_dist >= _dvec[2] * _lgap && _dist <= _dvec[2] * _ugap ) { // circumball cushion - _dist += _dvec[2] ; - _dist /= (real_type)2.; + _dist = + .5 *(_dist + _dvec[2] ) ; - _kind = - rdel_opts::offH_kind ; + _kind = rdel_opts::offH_kind; } if (_dist >= _dvec[2] * _ugap ) @@ -367,9 +370,7 @@ _ppos[0]=_tbal[0] ; _ppos[1]=_tbal[1] ; - _kind = - rdel_opts::circ_kind ; - + _kind = rdel_opts::circ_kind; return _kind ; } @@ -391,16 +392,18 @@ _mesh._tria.find_node ( // test voro. limiter &_ppos[0], _dual, _fnod[ 0]) ; + if (_dual != _fnod [ +0] && + _dual != _fnod [ +1] ) + { real_type _dlen = geometry::length_2d( _ppos, &_mesh._tria. node(_dual)->pval(0)) ; - if (_dual != _fnod [ +0] && - _dual != _fnod [ +1] ) if (_dlen <= _dtol*_hmid ) { - return rdel_opts::null_kind ; + return rdel_opts::null_kind; + } } if (_move < _rtol * _hmid) break ; diff --git a/external/jigsaw/src/libcpp/rdel_mesh/rdel_offh_delfront_3.inc b/external/jigsaw/src/libcpp/rdel_mesh/rdel_offh_delfront_3.inc index ec6a273..99072a4 100644 --- a/external/jigsaw/src/libcpp/rdel_mesh/rdel_offh_delfront_3.inc +++ b/external/jigsaw/src/libcpp/rdel_mesh/rdel_offh_delfront_3.inc @@ -22,18 +22,22 @@ * how they can obtain it for free, then you are not * required to make any arrangement with me.) * - * Disclaimer: Neither I nor: Columbia University, The - * Massachusetts Institute of Technology, The - * University of Sydney, nor The National Aeronautics - * and Space Administration warrant this code in any - * way whatsoever. This code is provided "as-is" to be - * used at your own risk. + * Disclaimer: Neither I nor THE CONTRIBUTORS warrant + * this code in any way whatsoever. This code is + * provided "as-is" to be used at your own risk. + * + * THE CONTRIBUTORS include: + * (a) The University of Sydney + * (b) The Massachusetts Institute of Technology + * (c) Columbia University + * (d) The National Aeronautics & Space Administration + * (e) Los Alamos National Laboratory * -------------------------------------------------------- * - * Last updated: 31 Mar., 2021 + * Last updated: 28 Dec., 2022 * - * Copyright 2013-2021 + * Copyright 2013-2022 * Darren Engwirda * d.engwirda@gmail.com * https://github.com/dengwirda/ @@ -66,25 +70,23 @@ _kind = rdel_opts::null_kind; typename hfun_type::hint_type - _hint = _hfun .null_hint() ; + _hint = _hfun .null_hint() , + _HINT = _hfun .null_hint() ; real_type static const _rtol = (real_type)+1.00E-003 ; real_type static const - _dtol = (real_type)+8.00E-001 ; + _dtol = (real_type)+8.33E-001 ; real_type static const - _lgap = (real_type)+9.00E-001 ; + _lgap = (real_type)+8./9. ; real_type static const - _ugap = (real_type)+1.10E+000 ; + _ugap = (real_type)+9./8. ; __unreferenced(_args) ; - if (_enod[1] < _enod[0]) - std::swap (_enod[0], _enod[1]); - real_type _hsiz [ 4] ; _hsiz[ 0] = _hfun.eval ( &_mesh._tria.node(_enod[0])->pval(0) , @@ -93,6 +95,12 @@ &_mesh._tria.node(_enod[1])->pval(0) , _mesh._tria.node(_enod[1])->idxh()) ; + if (_hsiz[1] < _hsiz[0]) + { + std::swap( _enod[0], _enod[1]); + std::swap( _hsiz[0], _hsiz[1]); + } + real_type _dvec[4] ; real_type _base[3] = { _mesh._tria.node(_enod[0])->pval(0) , @@ -100,7 +108,7 @@ _mesh._tria.node(_enod[0])->pval(2) , } ; - _hint = + _hint = _HINT = _mesh._tria.node (_enod[0])->idxh() ; _dvec[ 0] = @@ -147,8 +155,6 @@ (real_type)+.5 * (_base[2]+_ppos[2]) , } ; - typename hfun_type::hint_type - _HINT = _hint ; _hsiz[3] = _hfun.eval(_PMID, _HINT) ; real_type _hval = @@ -161,11 +167,10 @@ if (_dist >= _dvec[3] * _lgap && _dist <= _dvec[3] * _ugap ) { // circumball cushion - _dist += _dvec[3] ; - _dist /= (real_type)2.; + _dist = + .5 *(_dist + _dvec[3] ) ; - _kind = - rdel_opts::offH_kind ; + _kind = rdel_opts::offH_kind; } if (_dist >= _dvec[3] * _ugap ) @@ -174,31 +179,28 @@ _ppos[1]=_sbal[1] ; _ppos[2]=_sbal[2] ; - _kind = - rdel_opts::circ_kind ; - + _kind = rdel_opts::circ_kind; return _kind ; } else // adv.-front limiter { - _kind = - rdel_opts::offH_kind ; + _kind = rdel_opts::offH_kind; } _dist -= _pert * _dist ; iptr_type _dual = -1 ; - cosine_intersect _pred(_base,_dvec); + cosine_intersect _pred(_base,_dvec) ; _ball._rrad = _dist ; if (!_geom.intersect ( _ball, _pred) ) - return rdel_opts::null_kind ; + return rdel_opts::null_kind; if (!_pred. _find ) - return rdel_opts::null_kind ; + return rdel_opts::null_kind; real_type _move = geometry::length_3d( - _ppos,&_pred._proj.pval(0)); + _ppos,&_pred._proj.pval(0)) ; _ppos[ 0] = _pred._proj.pval(0); _ppos[ 1] = _pred._proj.pval(1); @@ -207,15 +209,17 @@ _mesh._tria.find_node ( // test voro. limiter &_ppos[0], _dual, _enod[ 0]) ; + if (_dual != _enod [ +0] ) + { real_type _dlen = geometry::length_3d( _ppos, &_mesh._tria. node(_dual)->pval(0)) ; - if (_dual != _enod [ +0] ) if (_dlen <= _dtol*_hval ) { - return rdel_opts::null_kind ; + return rdel_opts::null_kind; + } } if (_move <= _rtol*_hval ) break ; @@ -248,7 +252,8 @@ _kind = rdel_opts::null_kind; typename hfun_type::hint_type - _hint = _hfun .null_hint() ; + _hint = _hfun .null_hint() , + _HINT = _hfun .null_hint() ; real_type static const _rtol = (real_type)+1.00E-003 ; @@ -257,13 +262,13 @@ (real_type)std::sqrt(3.)/2. ; real_type static const - _dtol = (real_type)+8.00E-001 ; + _dtol = (real_type)+8.33E-001 ; real_type static const - _lgap = (real_type)+9.00E-001 ; + _lgap = (real_type)+8./9. ; real_type static const - _ugap = (real_type)+1.10E+000 ; + _ugap = (real_type)+9./8. ; __unreferenced(_args) ; @@ -275,7 +280,7 @@ &_mesh._tria.node(_enod[1])->pval(0) , _mesh._tria.node(_enod[1])->idxh()) ; - _hint = + _hint = _HINT = _mesh._tria.node(_enod[0])->idxh () ; real_type _bias[2] = { @@ -340,15 +345,13 @@ (real_type)+.5 * (_base[2]+_ppos[2]) , } ; - typename hfun_type::hint_type - _HINT = _hint ; _hsiz[3] = _hfun.eval(_PMID, _HINT) ; real_type _hval = - _hsiz[0] * (real_type)1./6. + - _hsiz[1] * (real_type)1./6. + - _hsiz[2] * (real_type)1./6. + - _hsiz[3] * (real_type)3./6. ; + _hsiz[0] * (real_type)2./9. + + _hsiz[1] * (real_type)2./9. + + _hsiz[2] * (real_type)2./9. + + _hsiz[3] * (real_type)3./9. ; real_type _hmin ; _hmin = std::min (_hval , _epsh); @@ -376,28 +379,28 @@ (real_type)std::sqrt(_dsqr) ; } - if (_dist > _alth * _hval) + if (_dist >= _alth * _hval) { // adv.-front limiter - _dist = _alth * _hval ; - _kind = - rdel_opts::offH_kind ; + _dist = _alth * _hval ; + _kind = rdel_opts::offH_kind; } if (_dist >= _dvec[4]) // off-centre limiter { - _dist = _dvec[4] ; - _kind = - rdel_opts::offC_kind ; + _dist = + 2. * _dist * _dvec[4] + / (_dist + _dvec[4] ) ; + + _kind = rdel_opts::offC_kind; } if (_dist >= _dvec[3] * _lgap && _dist <= _dvec[3] * _ugap ) { // circumball cushion - _dist += _dvec[3] ; - _dist /= (real_type)2.; + _dist = + .5 *(_dist + _dvec[3] ) ; - _kind = - rdel_opts::offH_kind ; + _kind = rdel_opts::offH_kind; } if (_dist >= _dvec[3] * _ugap ) @@ -406,27 +409,24 @@ _ppos[1]=_sbal[1] ; _ppos[2]=_sbal[2] ; - _kind = - rdel_opts::circ_kind ; - + _kind = rdel_opts::circ_kind; return _kind ; } _dist -= _pert * _dist ; iptr_type _dual = -1 ; - cosine_intersect _pred(_base,_dvec); + cosine_intersect _pred(_base,_dvec) ; _disc._rrad = _dist ; if (!_geom.intersect ( - _disc, - _sbal, _pred) ) - return rdel_opts::null_kind ; + _disc, _sbal, _pred) ) + return rdel_opts::null_kind; if (!_pred. _find ) - return rdel_opts::null_kind ; + return rdel_opts::null_kind; real_type _move = geometry::length_3d( - _ppos,&_pred._proj.pval(0)); + _ppos,&_pred._proj.pval(0)) ; _ppos[ 0] = _pred._proj.pval(0); _ppos[ 1] = _pred._proj.pval(1); @@ -435,16 +435,18 @@ _mesh._tria.find_node ( // test voro. limiter &_ppos[0], _dual, _enod[ 0]) ; + if (_dual != _enod [ +0] && + _dual != _enod [ +1] ) + { real_type _dlen = geometry::length_3d( _ppos, &_mesh._tria. node(_dual)->pval(0)) ; - if (_dual != _enod [ +0] && - _dual != _enod [ +1] ) if (_dlen <= _dtol*_hmin ) { - return rdel_opts::null_kind ; + return rdel_opts::null_kind; + } } if (_move <= _rtol*_hmin ) break ; @@ -477,7 +479,8 @@ _kind = rdel_opts::null_kind; typename hfun_type::hint_type - _hint = _hfun .null_hint() ; + _hint = _hfun .null_hint() , + _HINT = _hfun .null_hint() ; real_type static const _rtol = (real_type)+1.00E-003 ; @@ -486,13 +489,13 @@ (real_type)std::sqrt(6.)/3. ; real_type static const - _dtol = (real_type)+8.00E-001 ; + _dtol = (real_type)+8.33E-001 ; real_type static const - _lgap = (real_type)+9.00E-001 ; + _lgap = (real_type)+8./9. ; real_type static const - _ugap = (real_type)+1.10E+000 ; + _ugap = (real_type)+9./8. ; __unreferenced(_geom) ; __unreferenced(_args) ; @@ -536,16 +539,14 @@ (real_type)+.5 * (_fbal[2]+_ppos[2]) , } ; - typename hfun_type::hint_type - _HINT = _hint ; _hsiz[4] = _hfun.eval(_PMID, _HINT) ; real_type _hmid = - _hsiz[0] * (real_type)1./8. + - _hsiz[1] * (real_type)1./8. + - _hsiz[2] * (real_type)1./8. + - _hsiz[3] * (real_type)1./8. + - _hsiz[4] * (real_type)4./8. ; + _hsiz[0] * (real_type)3./16 + + _hsiz[1] * (real_type)3./16 + + _hsiz[2] * (real_type)3./16 + + _hsiz[3] * (real_type)3./16 + + _hsiz[4] * (real_type)4./16 ; _kind = rdel_opts::offH_kind ; @@ -567,28 +568,28 @@ (real_type)std::sqrt(_dsqr) ; } - if (_dist > _alth * _hmid) + if (_dist >= _alth * _hmid) { // adv.-front limiter - _dist = _alth * _hmid ; - _kind = - rdel_opts::offH_kind ; + _dist = _alth * _hmid ; + _kind = rdel_opts::offH_kind; } if (_dist >= _dvec[4]) // off-centre limiter { - _dist = _dvec[4]; - _kind = - rdel_opts::offC_kind ; + _dist = + 2. * _dist * _dvec[4] + / (_dist + _dvec[4] ) ; + + _kind = rdel_opts::offC_kind; } if (_dist >= _dvec[3] * _lgap && _dist <= _dvec[3] * _ugap ) { // circumball cushion - _dist += _dvec[3] ; - _dist /= (real_type)2.; + _dist = + .5 *(_dist + _dvec[3] ) ; - _kind = - rdel_opts::offH_kind ; + _kind = rdel_opts::offH_kind; } if (_dist >= _dvec[3] * _ugap ) @@ -597,9 +598,7 @@ _ppos[1]=_tbal[1] ; _ppos[2]=_tbal[2] ; - _kind = - rdel_opts::circ_kind ; - + _kind = rdel_opts::circ_kind; return _kind ; } @@ -624,17 +623,19 @@ _mesh._tria.find_node ( // test voro. limiter &_ppos[0], _dual, _fnod[ 0]) ; + if (_dual != _fnod [ +0] && + _dual != _fnod [ +1] && + _dual != _fnod [ +2] ) + { real_type _dlen = geometry::length_3d( _ppos, &_mesh._tria. node(_dual)->pval(0)) ; - if (_dual != _fnod [ +0] && - _dual != _fnod [ +1] && - _dual != _fnod [ +2] ) if (_dlen <= _dtol*_hmid ) { - return rdel_opts::null_kind ; + return rdel_opts::null_kind; + } } if (_move < _rtol * _hmid) break ; diff --git a/external/jigsaw/src/libcpp/rdel_mesh/rdel_pred_delaunay_2.hpp b/external/jigsaw/src/libcpp/rdel_mesh/rdel_pred_delaunay_2.hpp index 1be4ef1..c5c4bd6 100644 --- a/external/jigsaw/src/libcpp/rdel_mesh/rdel_pred_delaunay_2.hpp +++ b/external/jigsaw/src/libcpp/rdel_mesh/rdel_pred_delaunay_2.hpp @@ -22,12 +22,16 @@ * how they can obtain it for free, then you are not * required to make any arrangement with me.) * - * Disclaimer: Neither I nor: Columbia University, The - * Massachusetts Institute of Technology, The - * University of Sydney, nor The National Aeronautics - * and Space Administration warrant this code in any - * way whatsoever. This code is provided "as-is" to be - * used at your own risk. + * Disclaimer: Neither I nor THE CONTRIBUTORS warrant + * this code in any way whatsoever. This code is + * provided "as-is" to be used at your own risk. + * + * THE CONTRIBUTORS include: + * (a) The University of Sydney + * (b) The Massachusetts Institute of Technology + * (c) Columbia University + * (d) The National Aeronautics & Space Administration + * (e) Los Alamos National Laboratory * -------------------------------------------------------- * @@ -197,10 +201,11 @@ __unreferenced(_args); /*--------------------------------- calc. circumballs */ - char_type _feat, _topo ; + char_type _feat; + char_type _topo[ +2] ; iptr_type _part; - real_type _ebal[ +3]; - real_type _pmax[ +3]; + real_type _ebal[ +3] ; + real_type _pmax[ +3] ; if (!base_type::edge_ball ( _geom, _mesh, _tadj, _eadj, _ebal, _pmax, diff --git a/external/jigsaw/src/libcpp/rdel_mesh/rdel_pred_delaunay_3.hpp b/external/jigsaw/src/libcpp/rdel_mesh/rdel_pred_delaunay_3.hpp index ccd4701..392251e 100644 --- a/external/jigsaw/src/libcpp/rdel_mesh/rdel_pred_delaunay_3.hpp +++ b/external/jigsaw/src/libcpp/rdel_mesh/rdel_pred_delaunay_3.hpp @@ -22,12 +22,16 @@ * how they can obtain it for free, then you are not * required to make any arrangement with me.) * - * Disclaimer: Neither I nor: Columbia University, The - * Massachusetts Institute of Technology, The - * University of Sydney, nor The National Aeronautics - * and Space Administration warrant this code in any - * way whatsoever. This code is provided "as-is" to be - * used at your own risk. + * Disclaimer: Neither I nor THE CONTRIBUTORS warrant + * this code in any way whatsoever. This code is + * provided "as-is" to be used at your own risk. + * + * THE CONTRIBUTORS include: + * (a) The University of Sydney + * (b) The Massachusetts Institute of Technology + * (c) Columbia University + * (d) The National Aeronautics & Space Administration + * (e) Los Alamos National Laboratory * -------------------------------------------------------- * @@ -214,7 +218,8 @@ __unreferenced(_args); /*--------------------------------- calc. circumballs */ - char_type _feat, _topo ; + char_type _feat; + char_type _topo[ +2] ; iptr_type _part; real_type _ebal[ +4] ; real_type _pmax[ +4] ; @@ -262,7 +267,8 @@ __unreferenced(_args); /*--------------------------------- calc. circumballs */ - char_type _feat, _topo ; + char_type _feat; + char_type _topo[ +2] ; iptr_type _part; real_type _fbal[ +4] ; real_type _pmax[ +4] ; diff --git a/external/jigsaw/src/libcpp/rdel_mesh/rdel_pred_delfront_2.hpp b/external/jigsaw/src/libcpp/rdel_mesh/rdel_pred_delfront_2.hpp index 185d1ae..5fea2e6 100644 --- a/external/jigsaw/src/libcpp/rdel_mesh/rdel_pred_delfront_2.hpp +++ b/external/jigsaw/src/libcpp/rdel_mesh/rdel_pred_delfront_2.hpp @@ -22,12 +22,16 @@ * how they can obtain it for free, then you are not * required to make any arrangement with me.) * - * Disclaimer: Neither I nor: Columbia University, The - * Massachusetts Institute of Technology, The - * University of Sydney, nor The National Aeronautics - * and Space Administration warrant this code in any - * way whatsoever. This code is provided "as-is" to be - * used at your own risk. + * Disclaimer: Neither I nor THE CONTRIBUTORS warrant + * this code in any way whatsoever. This code is + * provided "as-is" to be used at your own risk. + * + * THE CONTRIBUTORS include: + * (a) The University of Sydney + * (b) The Massachusetts Institute of Technology + * (c) Columbia University + * (d) The National Aeronautics & Space Administration + * (e) Los Alamos National Laboratory * -------------------------------------------------------- * @@ -207,14 +211,18 @@ __const_ptr(real_type) _ball ) { - uint32_t _rsiz = - sizeof(real_type) * +2 ; - uint32_t _usiz = + uint32_t constexpr _rsiz = + sizeof(float ) * +2 ; + uint32_t constexpr _usiz = sizeof(uint32_t ) * +1 ; + float volatile _fbal[2]; // volatile, gcc-11 bug... + _fbal[0] =(float) _ball [0]; + _fbal[1] =(float) _ball [1]; + uint32_t _hash ; _hash = hash::hashword ( - (uint32_t*)_ball, _rsiz + (uint32_t*)_fbal, _rsiz / _usiz, +13) ; return ( _hash ) ; @@ -360,7 +368,8 @@ tria(_tadj)->node(_enod[ 1]) ; /*--------------------------------- calc. circumballs */ - char_type _feat, _topo ; + char_type _feat; + char_type _topo[ +2] ; iptr_type _part; real_type _ebal[ +3] ; real_type _pmax[ +3] ; @@ -449,8 +458,11 @@ _tria.tria(_tpos)->circ(0); _tbal[1] = _mesh. _tria.tria(_tpos)->circ(1); - _tbal[2] = (real_type)+0. ; + + auto _hash = + _mesh._tria._nset.count(); + _tbal[2]+= geometry::lensqr_2d (_tbal, &_mesh._tria.node( @@ -481,7 +493,7 @@ tria(_tpos)->node(_enod[ 1]); _llen[_enum] = - geometry::lensqr_2d ( + (float)geometry::lensqr_2d ( &_mesh._tria. node(_enod[0])->pval(0), &_mesh._tria. @@ -489,8 +501,9 @@ } /*--------------------------------- find min/max edge */ - iptr_type _emin = +0; - iptr_type _emax = +0; + iptr_type _emin = +0, _emax = +0 ; + if (_hash % +2 == +0) // rnd. tie-break + { for(_enum = +3; _enum-- != +1; ) { if (_llen[_emax] < _llen[_enum]) @@ -498,6 +511,17 @@ if (_llen[_emin] > _llen[_enum]) _emin = _enum ; } + } + else + { + for(_enum = +0; _enum++ != +2; ) + { + if (_llen[_emax] < _llen[_enum]) + _emax = _enum ; + if (_llen[_emin] > _llen[_enum]) + _emin = _enum ; + } + } /*-------------------------- ask for "frontal" status */ if(!base_edge(_mesh, _tpos, _emin)) @@ -506,7 +530,7 @@ { /*---------------------- reject as "void" element */ uint32_t _push = - (hash_ball(_tbal) % _STEP) + 1; + (_hash % _STEP) + 1 ; _tdat._mark += _push; @@ -599,7 +623,7 @@ { /*---------------------- reject as "void" element */ uint32_t _push = - (hash_ball(_tbal) % _STEP) + 1; + (_hash % _STEP) + 1 ; _tdat._mark += _push ; diff --git a/external/jigsaw/src/libcpp/rdel_mesh/rdel_pred_delfront_3.hpp b/external/jigsaw/src/libcpp/rdel_mesh/rdel_pred_delfront_3.hpp index 993ee98..ed14380 100644 --- a/external/jigsaw/src/libcpp/rdel_mesh/rdel_pred_delfront_3.hpp +++ b/external/jigsaw/src/libcpp/rdel_mesh/rdel_pred_delfront_3.hpp @@ -22,12 +22,16 @@ * how they can obtain it for free, then you are not * required to make any arrangement with me.) * - * Disclaimer: Neither I nor: Columbia University, The - * Massachusetts Institute of Technology, The - * University of Sydney, nor The National Aeronautics - * and Space Administration warrant this code in any - * way whatsoever. This code is provided "as-is" to be - * used at your own risk. + * Disclaimer: Neither I nor THE CONTRIBUTORS warrant + * this code in any way whatsoever. This code is + * provided "as-is" to be used at your own risk. + * + * THE CONTRIBUTORS include: + * (a) The University of Sydney + * (b) The Massachusetts Institute of Technology + * (c) Columbia University + * (d) The National Aeronautics & Space Administration + * (e) Los Alamos National Laboratory * -------------------------------------------------------- * @@ -227,14 +231,19 @@ __const_ptr(real_type) _ball ) { - uint32_t _rsiz = - sizeof(real_type) * +3 ; - uint32_t _usiz = + uint32_t constexpr _rsiz = + sizeof(float ) * +3 ; + uint32_t constexpr _usiz = sizeof(uint32_t ) * +1 ; + float volatile _fbal[3]; // volatile, gcc-11 bug... + _fbal[0] =(float) _ball [0]; + _fbal[1] =(float) _ball [1]; + _fbal[2] =(float) _ball [2]; + uint32_t _hash ; _hash = hash::hashword ( - (uint32_t*)_ball, _rsiz + (uint32_t*)_fbal, _rsiz / _usiz, +13) ; return ( _hash ) ; @@ -502,7 +511,8 @@ tria(_tadj)->node(_enod[ 1]) ; /*--------------------------------- calc. circumballs */ - char_type _feat, _topo ; + char_type _feat; + char_type _topo[ +2] ; iptr_type _part; real_type _ebal[ +4] ; real_type _pmax[ +4] ; @@ -585,7 +595,8 @@ tria(_tadj)->node(_fnod[ 2]) ; /*--------------------------------- calc. circumballs */ - char_type _feat, _topo ; + char_type _feat; + char_type _topo[ +2] ; iptr_type _part; real_type _fbal[ +4] ; real_type _pmax[ +4] ; @@ -601,6 +612,9 @@ return ( _kind ) ; } + auto _hash = + _mesh._tria._nset.count() ; + /*--------------------------------- find edge lengths */ real_type _llen[3] ; iptr_type _enum ; @@ -614,7 +628,7 @@ _enod[ 1] = _fnod[_enod[1]] ; _llen[_enum] = - geometry::lensqr_3d ( + (float)geometry::lensqr_3d ( &_mesh._tria. node(_enod[0])->pval(0), &_mesh._tria. @@ -622,8 +636,9 @@ } /*--------------------------------- find min/max edge */ - iptr_type _emin = +0; - iptr_type _emax = +0; + iptr_type _emin = +0, _emax = +0 ; + if (_hash % +2 == +0) // rnd. tie-break + { for(_enum = +3; _enum-- != +1; ) { if (_llen[_emax] < _llen[_enum]) @@ -631,6 +646,17 @@ if (_llen[_emin] > _llen[_enum]) _emin = _enum ; } + } + else + { + for(_enum = +0; _enum++ != +2; ) + { + if (_llen[_emax] < _llen[_enum]) + _emax = _enum ; + if (_llen[_emin] > _llen[_enum]) + _emin = _enum ; + } + } /*-------------------------- ask for "frontal" status */ if(!base_edge(_mesh, _fnod, _tadj , @@ -640,7 +666,7 @@ { /*---------------------- reject as "void" element */ uint32_t _push = - (hash_ball(_pmax) % _STEP) + 1; + (_hash % _STEP) + 1 ; _fdat._mark += _push; @@ -757,7 +783,7 @@ { /*---------------------- reject as "void" element */ uint32_t _push = - (hash_ball(_pmax) % _STEP) + 1; + (_hash % _STEP) + 1 ; _fdat._mark += _push ; @@ -823,23 +849,26 @@ _tria.tria(_tpos)->circ(1); _tbal[2] = _mesh. _tria.tria(_tpos)->circ(2); - _tbal[3] = (real_type)+0. ; + + auto _hash = + _mesh._tria._nset.count(); + _tbal[3]+= geometry::lensqr_3d (_tbal, - &_mesh._tria.node( + &_mesh._tria.node( _tnod[0])->pval( 0)) ; _tbal[3]+= geometry::lensqr_3d (_tbal, - &_mesh._tria.node( + &_mesh._tria.node( _tnod[1])->pval( 0)) ; _tbal[3]+= geometry::lensqr_3d (_tbal, - &_mesh._tria.node( + &_mesh._tria.node( _tnod[2])->pval( 0)) ; _tbal[3]+= geometry::lensqr_3d (_tbal, - &_mesh._tria.node( + &_mesh._tria.node( _tnod[3])->pval( 0)) ; _tbal[3]/= (real_type)+4. ; @@ -859,7 +888,7 @@ tria(_tpos)->node(_enod[ 1]); _llen[_enum] = - geometry::lensqr_3d ( + (float)geometry::lensqr_3d ( &_mesh._tria. node(_enod[0])->pval(0), &_mesh._tria. @@ -867,8 +896,9 @@ } /*--------------------------------- find min/max edge */ - iptr_type _emin = +0; - iptr_type _emax = +0; + iptr_type _emin = +0, _emax = +0 ; + if (_hash % +2 == +0) // rnd. tie-break + { for(_enum = +6; _enum-- != +1; ) { if (_llen[_emax] < _llen[_enum]) @@ -876,6 +906,17 @@ if (_llen[_emin] > _llen[_enum]) _emin = _enum ; } + } + else + { + for(_enum = +0; _enum++ != +5; ) + { + if (_llen[_emax] < _llen[_enum]) + _emax = _enum ; + if (_llen[_emin] > _llen[_enum]) + _emin = _enum ; + } + } /*--------------------------------- find 2-face radii */ real_type _frad[4] ; @@ -902,12 +943,13 @@ &_mesh._tria. node(_fnod[2])->pval(0)) ; - _frad[_fpos] = _fbal[3]; + _frad[_fpos] = (float)_fbal[3] ; } /*--------------------------------- find min/max face */ - iptr_type _fmin = +0; - iptr_type _fmax = +0; + iptr_type _fmin = +0, _fmax = +0 ; + if (_hash % +2 == +0) // rnd. tie-break + { for(_fpos = +4; _fpos-- != +1; ) { if (_frad[_fmax] < _frad[_fpos]) @@ -915,6 +957,17 @@ if (_frad[_fmin] > _frad[_fpos]) _fmin = _fpos ; } + } + else + { + for(_fpos = +0; _fpos++ != +3; ) + { + if (_frad[_fmax] < _frad[_fpos]) + _fmax = _fpos ; + if (_frad[_fmin] > _frad[_fpos]) + _fmin = _fpos ; + } + } /*-------------------------- ask for "frontal" status */ if(!base_face(_mesh, _tpos, _fmin)) @@ -923,7 +976,7 @@ { /*---------------------- reject as "void" element */ uint32_t _push = - (hash_ball(_tbal) % _STEP) + 1; + (_hash % _STEP) + 1 ; _tdat._mark += _push; @@ -1037,7 +1090,7 @@ { /*---------------------- reject as "void" element */ uint32_t _push = - (hash_ball(_tbal) % _STEP) + 1; + (_hash % _STEP) + 1 ; _tdat._mark += _push ; diff --git a/external/jigsaw/src/libcpp/rdel_mesh/rdel_refine_ball_2.inc b/external/jigsaw/src/libcpp/rdel_mesh/rdel_refine_ball_2.inc index 563b5e2..a420c1d 100644 --- a/external/jigsaw/src/libcpp/rdel_mesh/rdel_refine_ball_2.inc +++ b/external/jigsaw/src/libcpp/rdel_mesh/rdel_refine_ball_2.inc @@ -22,16 +22,20 @@ * how they can obtain it for free, then you are not * required to make any arrangement with me.) * - * Disclaimer: Neither I nor: Columbia University, The - * Massachusetts Institute of Technology, The - * University of Sydney, nor The National Aeronautics - * and Space Administration warrant this code in any - * way whatsoever. This code is provided "as-is" to be - * used at your own risk. + * Disclaimer: Neither I nor THE CONTRIBUTORS warrant + * this code in any way whatsoever. This code is + * provided "as-is" to be used at your own risk. + * + * THE CONTRIBUTORS include: + * (a) The University of Sydney + * (b) The Massachusetts Institute of Technology + * (c) Columbia University + * (d) The National Aeronautics & Space Administration + * (e) Los Alamos National Laboratory * -------------------------------------------------------- * - * Last updated: 20 Apr., 2021 + * Last updated: 18 Aug., 2021 * * Copyright 2013-2021 * Darren Engwirda @@ -251,8 +255,8 @@ _ball._ball[2] = std::sqrt ( _ball._ball [ 2]) ; - auto _ndeg = - _mesh._tria.node(_base)->topo() ; + auto _topo = + _mesh._tria.node(_base)->topo(1); /*--------------------- find intersections with GEOM. */ typename @@ -295,7 +299,7 @@ continue ; } else - if (_pred._inum != _ndeg) + if (_pred._inum != _topo) { _ball._ball[2] *= // reduce R for TOPO. (real_type) +.67 ; @@ -312,7 +316,7 @@ continue ; } else - if (_halo._inum != _ndeg) + if (_halo._inum != _topo) { _ball._ball[2] *= // reduce R for TOPO. (real_type) +.67 ; @@ -346,7 +350,6 @@ __unreferenced(_hfun) ; __unreferenced(_mode) ; __unreferenced(_pass) ; - __unreferenced(_args) ; iptr_list _mark ; for (auto @@ -374,13 +377,17 @@ iptr_type _base = _ball->_data._node[0] ; - mesh::keep_all_2d < - real_type, iptr_type> _halo ; + real_type _near = + _hdat._rrad * _args.near() ; + + mesh::filt_all_2d < + real_type, + iptr_type > _halo( _near) ; _geom.intersect( _hdat, _halo) ; iptr_type _inum = +0 ; - for (auto + for (auto _iter = _halo._list.head () ; _iter != _halo._list.tend () ; ++_iter, ++_inum) diff --git a/external/jigsaw/src/libcpp/rdel_mesh/rdel_refine_ball_3.inc b/external/jigsaw/src/libcpp/rdel_mesh/rdel_refine_ball_3.inc index 0d3ede5..7bd61d0 100644 --- a/external/jigsaw/src/libcpp/rdel_mesh/rdel_refine_ball_3.inc +++ b/external/jigsaw/src/libcpp/rdel_mesh/rdel_refine_ball_3.inc @@ -22,16 +22,20 @@ * how they can obtain it for free, then you are not * required to make any arrangement with me.) * - * Disclaimer: Neither I nor: Columbia University, The - * Massachusetts Institute of Technology, The - * University of Sydney, nor The National Aeronautics - * and Space Administration warrant this code in any - * way whatsoever. This code is provided "as-is" to be - * used at your own risk. + * Disclaimer: Neither I nor THE CONTRIBUTORS warrant + * this code in any way whatsoever. This code is + * provided "as-is" to be used at your own risk. + * + * THE CONTRIBUTORS include: + * (a) The University of Sydney + * (b) The Massachusetts Institute of Technology + * (c) Columbia University + * (d) The National Aeronautics & Space Administration + * (e) Los Alamos National Laboratory * -------------------------------------------------------- * - * Last updated: 20 Apr., 2021 + * Last updated: 18 Aug., 2021 * * Copyright 2013-2021 * Darren Engwirda @@ -263,8 +267,8 @@ _ball._ball[3] = std::sqrt ( _ball._ball [ 3]) ; - auto _ndeg = - _mesh._tria.node(_base)->topo() ; + auto _topo = + _mesh._tria.node(_base)->topo(1); /*--------------------- find intersections with geom. */ typename @@ -309,7 +313,7 @@ continue ; } else - if (_pred._inum != _ndeg) + if (_pred._inum != _topo) { _ball._ball[3] *= // reduce rad. for topo. (real_type) +.67 ; @@ -326,7 +330,7 @@ continue ; } else - if (_halo._inum != _ndeg) + if (_halo._inum != _topo) { _ball._ball[3] *= // reduce rad. for topo. (real_type) +.67 ; @@ -393,13 +397,17 @@ iptr_type _base = _ball->_data._node[0] ; - mesh::keep_all_3d < - real_type, iptr_type> _halo ; + real_type _near = + _hdat._rrad * _args.near() ; + + mesh::filt_all_3d < + real_type, + iptr_type > _halo( _near) ; _geom.intersect( _hdat, _halo) ; iptr_type _inum = +0 ; - for (auto + for (auto _iter = _halo._list.head () ; _iter != _halo._list.tend () ; ++_iter, ++_inum) @@ -517,14 +525,18 @@ _hdat._rrad = _DTOL * std::sqrt(_ebal[3]) ; - mesh::keep_all_3d < - real_type, iptr_type> _halo ; + real_type _near = + _hdat._rrad * _args.near() ; + + mesh::filt_all_3d < + real_type, + iptr_type > _halo( _near) ; real_type _junk[3] = { +0. } ; _geom.intersect(_hdat, _junk, _halo) ; - for (auto + for (auto _iter = _halo._list.head() ; _iter != _halo._list.tend() ; ++_iter ) diff --git a/external/jigsaw/src/libcpp/rdel_mesh/rdel_refine_base_2.inc b/external/jigsaw/src/libcpp/rdel_mesh/rdel_refine_base_2.inc index 339c7da..b2a4768 100644 --- a/external/jigsaw/src/libcpp/rdel_mesh/rdel_refine_base_2.inc +++ b/external/jigsaw/src/libcpp/rdel_mesh/rdel_refine_base_2.inc @@ -22,16 +22,20 @@ * how they can obtain it for free, then you are not * required to make any arrangement with me.) * - * Disclaimer: Neither I nor: Columbia University, The - * Massachusetts Institute of Technology, The - * University of Sydney, nor The National Aeronautics - * and Space Administration warrant this code in any - * way whatsoever. This code is provided "as-is" to be - * used at your own risk. + * Disclaimer: Neither I nor THE CONTRIBUTORS warrant + * this code in any way whatsoever. This code is + * provided "as-is" to be used at your own risk. + * + * THE CONTRIBUTORS include: + * (a) The University of Sydney + * (b) The Massachusetts Institute of Technology + * (c) Columbia University + * (d) The National Aeronautics & Space Administration + * (e) Los Alamos National Laboratory * -------------------------------------------------------- * - * Last updated: 24 Feb., 2021 + * Last updated: 01 Sept., 2021 * * Copyright 2013-2021 * Darren Engwirda @@ -157,13 +161,15 @@ hfun_type::null_hint() ; _mesh._tria. - node(_node)->fdim() = 0 ; + node(_node)->fdim () = 0 ; + _mesh._tria. + node(_node)->feat () = 0 ; _mesh._tria. - node(_node)->feat() = 0 ; + node(_node)->topo(0) = 2 ; _mesh._tria. - node(_node)->topo() = 0 ; + node(_node)->topo(1) = 2 ; _mesh._tria. - node(_node)->part() = 0 ; + node(_node)->part () = 0 ; iptr_type _sign = -1 ; if (_told.count() > +0 ) @@ -189,6 +195,7 @@ _mesh._tria.node( _node)->fdim() = _tdim ; + /*------------------------- test "new" rDT cavity */ real_type _pnow[2] ; _pnow[0] = _ppos[0] ; _pnow[1] = _ppos[1] ; diff --git a/external/jigsaw/src/libcpp/rdel_mesh/rdel_refine_base_3.inc b/external/jigsaw/src/libcpp/rdel_mesh/rdel_refine_base_3.inc index af0b3c4..2c3f743 100644 --- a/external/jigsaw/src/libcpp/rdel_mesh/rdel_refine_base_3.inc +++ b/external/jigsaw/src/libcpp/rdel_mesh/rdel_refine_base_3.inc @@ -22,16 +22,20 @@ * how they can obtain it for free, then you are not * required to make any arrangement with me.) * - * Disclaimer: Neither I nor: Columbia University, The - * Massachusetts Institute of Technology, The - * University of Sydney, nor The National Aeronautics - * and Space Administration warrant this code in any - * way whatsoever. This code is provided "as-is" to be - * used at your own risk. + * Disclaimer: Neither I nor THE CONTRIBUTORS warrant + * this code in any way whatsoever. This code is + * provided "as-is" to be used at your own risk. + * + * THE CONTRIBUTORS include: + * (a) The University of Sydney + * (b) The Massachusetts Institute of Technology + * (c) Columbia University + * (d) The National Aeronautics & Space Administration + * (e) Los Alamos National Laboratory * -------------------------------------------------------- * - * Last updated: 24 Feb., 2021 + * Last updated: 01 Sept., 2021 * * Copyright 2013-2021 * Darren Engwirda @@ -170,13 +174,15 @@ hfun_type::null_hint() ; _mesh._tria. - node(_node)->fdim() = 0 ; + node(_node)->fdim () = 0 ; + _mesh._tria. + node(_node)->feat () = 0 ; _mesh._tria. - node(_node)->feat() = 0 ; + node(_node)->topo(0) = 2 ; _mesh._tria. - node(_node)->topo() = 0 ; + node(_node)->topo(1) = 2 ; _mesh._tria. - node(_node)->part() = 0 ; + node(_node)->part () = 0 ; iptr_type _sign = -1 ; if (_told.count() > +0 ) @@ -203,6 +209,7 @@ _mesh._tria.node( _node)->fdim() = _tdim; + /*------------------------- test "new" rDT cavity */ real_type _pnow[3] ; _pnow[0] = _ppos[0] ; _pnow[1] = _ppos[1] ; diff --git a/external/jigsaw/src/libcpp/rdel_mesh/rdel_refine_face_2.inc b/external/jigsaw/src/libcpp/rdel_mesh/rdel_refine_face_2.inc index 5d0926a..8fb39f3 100644 --- a/external/jigsaw/src/libcpp/rdel_mesh/rdel_refine_face_2.inc +++ b/external/jigsaw/src/libcpp/rdel_mesh/rdel_refine_face_2.inc @@ -22,12 +22,16 @@ * how they can obtain it for free, then you are not * required to make any arrangement with me.) * - * Disclaimer: Neither I nor: Columbia University, The - * Massachusetts Institute of Technology, The - * University of Sydney, nor The National Aeronautics - * and Space Administration warrant this code in any - * way whatsoever. This code is provided "as-is" to be - * used at your own risk. + * Disclaimer: Neither I nor THE CONTRIBUTORS warrant + * this code in any way whatsoever. This code is + * provided "as-is" to be used at your own risk. + * + * THE CONTRIBUTORS include: + * (a) The University of Sydney + * (b) The Massachusetts Institute of Technology + * (c) Columbia University + * (d) The National Aeronautics & Space Administration + * (e) Los Alamos National Laboratory * -------------------------------------------------------- * @@ -169,7 +173,7 @@ _mesh. _tria.roll_back(_tnew, _told); - _qdat._mark = + _qdat._mark = std::max(1,_qdat._mark+1) ; _kind = rdel_opts::null_kind ; @@ -320,7 +324,7 @@ _mesh. _tria.roll_back(_tnew, _told); - _qdat._mark = + _qdat._mark = std::max(1,_qdat._mark+1) ; _kind = rdel_opts::null_kind ; diff --git a/external/jigsaw/src/libcpp/rdel_mesh/rdel_refine_face_3.inc b/external/jigsaw/src/libcpp/rdel_mesh/rdel_refine_face_3.inc index 8402b6e..d4676d1 100644 --- a/external/jigsaw/src/libcpp/rdel_mesh/rdel_refine_face_3.inc +++ b/external/jigsaw/src/libcpp/rdel_mesh/rdel_refine_face_3.inc @@ -22,12 +22,16 @@ * how they can obtain it for free, then you are not * required to make any arrangement with me.) * - * Disclaimer: Neither I nor: Columbia University, The - * Massachusetts Institute of Technology, The - * University of Sydney, nor The National Aeronautics - * and Space Administration warrant this code in any - * way whatsoever. This code is provided "as-is" to be - * used at your own risk. + * Disclaimer: Neither I nor THE CONTRIBUTORS warrant + * this code in any way whatsoever. This code is + * provided "as-is" to be used at your own risk. + * + * THE CONTRIBUTORS include: + * (a) The University of Sydney + * (b) The Massachusetts Institute of Technology + * (c) Columbia University + * (d) The National Aeronautics & Space Administration + * (e) Los Alamos National Laboratory * -------------------------------------------------------- * @@ -180,7 +184,7 @@ _mesh. _tria.roll_back(_tnew, _told); - _qdat._mark = + _qdat._mark = std::max(1,_qdat._mark+1) ; _kind = rdel_opts::null_kind ; @@ -346,7 +350,7 @@ _mesh. _tria.roll_back(_tnew, _told); - _qdat._mark = + _qdat._mark = std::max(1,_qdat._mark+1) ; _kind = rdel_opts::null_kind ; @@ -512,8 +516,8 @@ _mesh. _tria.roll_back(_tnew, _told); - _qdat._mark = - std::max(1,_qdat._mark+1) ; + _qdat._mark = + std::max(1,_qdat._mark+1) ; _kind = rdel_opts::null_kind ; diff --git a/external/jigsaw/src/libcpp/rdel_mesh/rdel_refine_topo_2.inc b/external/jigsaw/src/libcpp/rdel_mesh/rdel_refine_topo_2.inc index e25fa8d..2ee2b59 100644 --- a/external/jigsaw/src/libcpp/rdel_mesh/rdel_refine_topo_2.inc +++ b/external/jigsaw/src/libcpp/rdel_mesh/rdel_refine_topo_2.inc @@ -22,16 +22,20 @@ * how they can obtain it for free, then you are not * required to make any arrangement with me.) * - * Disclaimer: Neither I nor: Columbia University, The - * Massachusetts Institute of Technology, The - * University of Sydney, nor The National Aeronautics - * and Space Administration warrant this code in any - * way whatsoever. This code is provided "as-is" to be - * used at your own risk. + * Disclaimer: Neither I nor THE CONTRIBUTORS warrant + * this code in any way whatsoever. This code is + * provided "as-is" to be used at your own risk. + * + * THE CONTRIBUTORS include: + * (a) The University of Sydney + * (b) The Massachusetts Institute of Technology + * (c) Columbia University + * (d) The National Aeronautics & Space Administration + * (e) Los Alamos National Laboratory * -------------------------------------------------------- * - * Last updated: 20 Apr., 2021 + * Last updated: 15 Jul., 2021 * * Copyright 2013-2021 * Darren Engwirda @@ -125,7 +129,7 @@ } } - return ( _eset.count() == _topo ) ; + return ( _eset.count() <= _topo ) ; } /* @@ -140,6 +144,8 @@ geom_type &_geom, mesh_type &_mesh, edat_list &_eset, + typename + mesh_type::edge_list &_epro , iptr_type _npos, real_type *_ppos, real_type *_pmax, @@ -183,7 +189,22 @@ auto _jptr = _mesh._tria.node(_enod[1]) ; - char_type _feat, _topo ; + algorithms::isort ( + &_enod[0], &_enod[2], + std::less()) ; + + edge_data _edat; + _edat._node[0] = _enod[ 0] ; + _edat._node[1] = _enod[ 1] ; + + typename mesh_type:: // skip protected + edge_list:: + item_type *_same = nullptr ; + if(_epro.find( + _edat, _same)) continue ; + + char_type _feat; + char_type _topo[ +2] ; iptr_type _part; real_type _fbal[ +3] ; real_type _sbal[ +3] ; @@ -473,7 +494,7 @@ _tria.node (_npos)->pval(0) ; _kind = topo_node( _geom, - _mesh , _eset, + _mesh , _eset, _epro, _npos , _ppos, _pmax, _tmax , _hint, _args) ; diff --git a/external/jigsaw/src/libcpp/rdel_mesh/rdel_refine_topo_3.inc b/external/jigsaw/src/libcpp/rdel_mesh/rdel_refine_topo_3.inc index 3fc7f66..69dcba4 100644 --- a/external/jigsaw/src/libcpp/rdel_mesh/rdel_refine_topo_3.inc +++ b/external/jigsaw/src/libcpp/rdel_mesh/rdel_refine_topo_3.inc @@ -22,16 +22,20 @@ * how they can obtain it for free, then you are not * required to make any arrangement with me.) * - * Disclaimer: Neither I nor: Columbia University, The - * Massachusetts Institute of Technology, The - * University of Sydney, nor The National Aeronautics - * and Space Administration warrant this code in any - * way whatsoever. This code is provided "as-is" to be - * used at your own risk. + * Disclaimer: Neither I nor THE CONTRIBUTORS warrant + * this code in any way whatsoever. This code is + * provided "as-is" to be used at your own risk. + * + * THE CONTRIBUTORS include: + * (a) The University of Sydney + * (b) The Massachusetts Institute of Technology + * (c) Columbia University + * (d) The National Aeronautics & Space Administration + * (e) Los Alamos National Laboratory * -------------------------------------------------------- * - * Last updated: 20 Apr., 2021 + * Last updated: 15 Jul., 2021 * * Copyright 2013-2021 * Darren Engwirda @@ -408,8 +412,7 @@ find_edge(*_edge, _eptr)) { /*------------------- "external" topo. degree */ - _topo = - _eptr->_data. _topo ; + _topo = _eptr->_data._topo[0] ; } if (_aset.count () != _topo ) @@ -433,6 +436,8 @@ geom_type &_geom, mesh_type &_mesh, edat_list &_eset, + typename + mesh_type::edge_list &_epro , iptr_type _npos, real_type *_ppos, real_type *_pmax, @@ -477,7 +482,22 @@ auto _jptr = _mesh._tria.node(_enod[1]) ; - char_type _feat, _topo ; + algorithms::isort ( + &_enod[0], &_enod[2], + std::less()) ; + + edge_data _edat; + _edat._node[0] = _enod[ 0] ; + _edat._node[1] = _enod[ 1] ; + + typename mesh_type:: // skip protected + edge_list:: + item_type *_same = nullptr ; + if(_epro.find( + _edat, _same)) continue ; + + char_type _feat; + char_type _topo[ +2] ; iptr_type _part; real_type _fbal[ +4] ; real_type _sbal[ +4] ; @@ -635,6 +655,8 @@ geom_type &_geom, mesh_type &_mesh, fdat_list &_fset, + typename + mesh_type::face_list &_fpro , iptr_type _npos, real_type *_ppos, real_type *_pmax, @@ -684,7 +706,23 @@ auto _kptr = _mesh._tria.node(_fnod[2]) ; - char_type _feat, _topo ; + algorithms::isort ( + &_fnod[0], &_fnod[3], + std::less()) ; + + face_data _fdat; + _fdat._node[0] = _fnod[ 0] ; + _fdat._node[1] = _fnod[ 1] ; + _fdat._node[2] = _fnod[ 2] ; + + typename mesh_type:: // skip protected + face_list:: + item_type *_same = nullptr ; + if(_fpro.find( + _fdat, _same)) continue ; + + char_type _feat; + char_type _topo[ +2] ; iptr_type _part; real_type _fbal[ +4] ; real_type _sbal[ +4] ; @@ -997,7 +1035,7 @@ _tria.node (_npos)->pval(0) ; _kind = etop_node( _geom, - _mesh , _eset, + _mesh , _eset, _epro, _npos , _ppos, _pmax, _tmax , _hint, _args) ; @@ -1163,7 +1201,7 @@ _tria.node (_npos)->pval(0) ; _kind = ftop_node( _geom, - _mesh , _fset, + _mesh , _fset, _fpro, _npos , _ppos, _pmax, _tmax , _hint, _args) ; diff --git a/external/jigsaw/src/libcpp/rdel_mesh/rdel_sink_delfront_2.inc b/external/jigsaw/src/libcpp/rdel_mesh/rdel_sink_delfront_2.inc index 7ae736f..b387e94 100644 --- a/external/jigsaw/src/libcpp/rdel_mesh/rdel_sink_delfront_2.inc +++ b/external/jigsaw/src/libcpp/rdel_mesh/rdel_sink_delfront_2.inc @@ -22,16 +22,20 @@ * how they can obtain it for free, then you are not * required to make any arrangement with me.) * - * Disclaimer: Neither I nor: Columbia University, The - * Massachusetts Institute of Technology, The - * University of Sydney, nor The National Aeronautics - * and Space Administration warrant this code in any - * way whatsoever. This code is provided "as-is" to be - * used at your own risk. + * Disclaimer: Neither I nor THE CONTRIBUTORS warrant + * this code in any way whatsoever. This code is + * provided "as-is" to be used at your own risk. + * + * THE CONTRIBUTORS include: + * (a) The University of Sydney + * (b) The Massachusetts Institute of Technology + * (c) Columbia University + * (d) The National Aeronautics & Space Administration + * (e) Los Alamos National Laboratory * -------------------------------------------------------- * - * Last updated: 03 July, 2019 + * Last updated: 03 Jul., 2019 * * Copyright 2013-2019 * Darren Engwirda diff --git a/external/jigsaw/src/libcpp/rdel_mesh/rdel_sink_delfront_3.inc b/external/jigsaw/src/libcpp/rdel_mesh/rdel_sink_delfront_3.inc index 361fe12..c144982 100644 --- a/external/jigsaw/src/libcpp/rdel_mesh/rdel_sink_delfront_3.inc +++ b/external/jigsaw/src/libcpp/rdel_mesh/rdel_sink_delfront_3.inc @@ -22,16 +22,20 @@ * how they can obtain it for free, then you are not * required to make any arrangement with me.) * - * Disclaimer: Neither I nor: Columbia University, The - * Massachusetts Institute of Technology, The - * University of Sydney, nor The National Aeronautics - * and Space Administration warrant this code in any - * way whatsoever. This code is provided "as-is" to be - * used at your own risk. + * Disclaimer: Neither I nor THE CONTRIBUTORS warrant + * this code in any way whatsoever. This code is + * provided "as-is" to be used at your own risk. + * + * THE CONTRIBUTORS include: + * (a) The University of Sydney + * (b) The Massachusetts Institute of Technology + * (c) Columbia University + * (d) The National Aeronautics & Space Administration + * (e) Los Alamos National Laboratory * -------------------------------------------------------- * - * Last updated: 03 July, 2019 + * Last updated: 03 Jul., 2019 * * Copyright 2013-2019 * Darren Engwirda @@ -216,10 +220,11 @@ } /*-------------------------------- sink must inc ball */ - char_type _feat, _topo; - iptr_type _itag; - real_type _sbal[4]; - real_type _junk[4]; + char_type _feat; + char_type _topo[ +2] ; + iptr_type _itag; + real_type _sbal[ +4] ; + real_type _junk[ +4] ; base_type::face_ball(_geom , _mesh , *_tpos , _fpos , _junk , _sbal , _feat , diff --git a/external/jigsaw/src/libcpp/rdel_mesh/rdel_test_bounds_2.inc b/external/jigsaw/src/libcpp/rdel_mesh/rdel_test_bounds_2.inc index 29a8223..cec0044 100644 --- a/external/jigsaw/src/libcpp/rdel_mesh/rdel_test_bounds_2.inc +++ b/external/jigsaw/src/libcpp/rdel_mesh/rdel_test_bounds_2.inc @@ -22,18 +22,22 @@ * how they can obtain it for free, then you are not * required to make any arrangement with me.) * - * Disclaimer: Neither I nor: Columbia University, The - * Massachusetts Institute of Technology, The - * University of Sydney, nor The National Aeronautics - * and Space Administration warrant this code in any - * way whatsoever. This code is provided "as-is" to be - * used at your own risk. + * Disclaimer: Neither I nor THE CONTRIBUTORS warrant + * this code in any way whatsoever. This code is + * provided "as-is" to be used at your own risk. + * + * THE CONTRIBUTORS include: + * (a) The University of Sydney + * (b) The Massachusetts Institute of Technology + * (c) Columbia University + * (d) The National Aeronautics & Space Administration + * (e) Los Alamos National Laboratory * -------------------------------------------------------- * - * Last updated: 03 July, 2019 + * Last updated: 03 Aug., 2022 * - * Copyright 2013-2019 + * Copyright 2013-2022 * Darren Engwirda * d.engwirda@gmail.com * https://github.com/dengwirda/ @@ -138,7 +142,8 @@ ++_epos ) { /*----------------- compute restricted surf. ball */ - char_type _feat, _topo ; + char_type _feat; + char_type _topo[ +2] ; iptr_type _part; real_type _fbal[ +3] ; real_type _sbal[ +3] ; @@ -230,16 +235,11 @@ if (_mode > +0) { /*------------------------- init. for local hash obj. */ - typename - mesh_type::edge_list _eset ( - typename mesh_type::edge_hash(), - typename mesh_type::edge_pred(), - +.8, _mesh._eset.get_alloc()) ; + _mesh._etwo.clear(); + _mesh._etwo. + set_slots(_enew.count() * +2) ; - /*------------------------- push alloc. for hash obj. */ - _eset.set_slots ( - _enew.count() * +2 , - containers::tight_alloc) ; + auto& _eset = _mesh. _etwo; /*---------------------------------------- test edges */ for ( auto _epos = _enew.head(); @@ -253,7 +253,8 @@ ++_epos ) { /*----------------- compute restricted surf. ball */ - char_type _feat, _topo ; + char_type _feat; + char_type _topo[ +2] ; iptr_type _part; real_type _fbal[ +3] ; real_type _sbal[ +3] ; @@ -337,17 +338,13 @@ if (_epro.count() > +0) { /*------------------------- init. for local hash obj. */ - typename - mesh_type::edge_list _eset ( - typename mesh_type::edge_hash(), - typename mesh_type::edge_pred(), - +.8, _mesh._eset.get_alloc()) ; + _mesh._etwo.clear(); + _mesh._etwo. + set_slots(_enew.count() * +2) ; - /*------------------------- push alloc. for hash obj. */ - _eset.set_slots ( - _enew.count() * +2 , - containers::tight_alloc) ; + auto& _eset = _mesh. _etwo; + /*------------------------- push alloc. for hash obj. */ for ( auto _epos = _enew.head(); _epos != _enew.tend(); ++_epos ) diff --git a/external/jigsaw/src/libcpp/rdel_mesh/rdel_test_bounds_3.inc b/external/jigsaw/src/libcpp/rdel_mesh/rdel_test_bounds_3.inc index daa0110..59b3c63 100644 --- a/external/jigsaw/src/libcpp/rdel_mesh/rdel_test_bounds_3.inc +++ b/external/jigsaw/src/libcpp/rdel_mesh/rdel_test_bounds_3.inc @@ -22,18 +22,22 @@ * how they can obtain it for free, then you are not * required to make any arrangement with me.) * - * Disclaimer: Neither I nor: Columbia University, The - * Massachusetts Institute of Technology, The - * University of Sydney, nor The National Aeronautics - * and Space Administration warrant this code in any - * way whatsoever. This code is provided "as-is" to be - * used at your own risk. + * Disclaimer: Neither I nor THE CONTRIBUTORS warrant + * this code in any way whatsoever. This code is + * provided "as-is" to be used at your own risk. + * + * THE CONTRIBUTORS include: + * (a) The University of Sydney + * (b) The Massachusetts Institute of Technology + * (c) Columbia University + * (d) The National Aeronautics & Space Administration + * (e) Los Alamos National Laboratory * -------------------------------------------------------- * - * Last updated: 03 July, 2019 + * Last updated: 03 Aug., 2022 * - * Copyright 2013-2019 + * Copyright 2013-2022 * Darren Engwirda * d.engwirda@gmail.com * https://github.com/dengwirda/ @@ -179,7 +183,8 @@ ++_epos ) { /*----------------- compute restricted surf. ball */ - char_type _feat, _topo ; + char_type _feat; + char_type _topo[ +2] ; iptr_type _part; real_type _fbal[ +4] ; real_type _sbal[ +4] ; @@ -248,7 +253,8 @@ ++_fpos ) { /*----------------- compute restricted surf. ball */ - char_type _feat, _topo ; + char_type _feat; + char_type _topo[ +2] ; iptr_type _part; real_type _fbal[ +4] ; real_type _sbal[ +4] ; @@ -344,16 +350,11 @@ if (_mode > +0) { /*------------------------- init. for local hash obj. */ - typename - mesh_type::edge_list _eset ( - typename mesh_type::edge_hash(), - typename mesh_type::edge_pred(), - +.8, _mesh._eset.get_alloc()) ; + _mesh._etwo.clear(); + _mesh._etwo. + set_slots(_enew.count() * +2) ; - /*------------------------- push alloc. for hash obj. */ - _eset.set_slots ( - _enew.count() * +2 , - containers::tight_alloc) ; + auto& _eset = _mesh. _etwo; /*---------------------------------------- test edges */ for ( auto _epos = _enew.head(); @@ -367,7 +368,8 @@ ++_epos ) { /*----------------- compute restricted surf. ball */ - char_type _feat, _topo ; + char_type _feat; + char_type _topo[ +2] ; iptr_type _part; real_type _fbal[ +4] ; real_type _sbal[ +4] ; @@ -378,7 +380,7 @@ _fbal, _sbal , _feat, _topo , _part ) ) __assert( false && - "_old_bnds: edge-ball" ); + "_OLD-BNDS: edge-ball" ); real_type _blen = geometry::lensqr_3d(_ppos, @@ -430,16 +432,11 @@ if (_mode > +1) { /*------------------------- init. for local hash obj. */ - typename - mesh_type::face_list _fset ( - typename mesh_type::face_hash(), - typename mesh_type::face_pred(), - +.8, _mesh._fset.get_alloc()) ; + _mesh._ftwo.clear(); + _mesh._ftwo. + set_slots(_fnew.count() * +2) ; - /*------------------------- push alloc. for hash obj. */ - _fset.set_slots ( - _fnew.count() * +2 , - containers::tight_alloc) ; + auto& _fset = _mesh. _ftwo; /*---------------------------------------- test faces */ for ( auto _fpos = _fnew.head(); @@ -453,7 +450,8 @@ ++_fpos ) { /*----------------- compute restricted surf. ball */ - char_type _feat, _topo ; + char_type _feat; + char_type _topo[ +2] ; iptr_type _part; real_type _fbal[ +4] ; real_type _sbal[ +4] ; @@ -543,17 +541,13 @@ if (_epro.count() > +0) { /*------------------------- init. for local hash obj. */ - typename - mesh_type::edge_list _eset ( - typename mesh_type::edge_hash(), - typename mesh_type::edge_pred(), - +.8, _mesh._eset.get_alloc()) ; + _mesh._etwo.clear(); + _mesh._etwo. + set_slots(_enew.count() * +2) ; - /*------------------------- push alloc. for hash obj. */ - _eset.set_slots ( - _enew.count() * +2 , - containers::tight_alloc) ; + auto& _eset = _mesh. _etwo; + /*------------------------- push alloc. for hash obj. */ for ( auto _epos = _enew.head(); _epos != _enew.tend(); ++_epos ) @@ -582,17 +576,13 @@ if (_fpro.count() > +0) { /*------------------------- init. for local hash obj. */ - typename - mesh_type::face_list _fset ( - typename mesh_type::face_hash(), - typename mesh_type::face_pred(), - +.8, _mesh._fset.get_alloc()) ; + _mesh._ftwo.clear(); + _mesh._ftwo. + set_slots(_fnew.count() * +2) ; - /*------------------------- push alloc. for hash obj. */ - _fset.set_slots ( - _fnew.count() * +2 , - containers::tight_alloc) ; + auto& _fset = _mesh. _ftwo; + /*------------------------- push alloc. for hash obj. */ for ( auto _fpos = _fnew.head(); _fpos != _fnew.tend(); ++_fpos ) diff --git a/external/jigsaw/src/libcpp/rdel_mesh/rdel_timers.hpp b/external/jigsaw/src/libcpp/rdel_mesh/rdel_timers.hpp index c7ca32a..e2a3928 100644 --- a/external/jigsaw/src/libcpp/rdel_mesh/rdel_timers.hpp +++ b/external/jigsaw/src/libcpp/rdel_mesh/rdel_timers.hpp @@ -22,18 +22,22 @@ * how they can obtain it for free, then you are not * required to make any arrangement with me.) * - * Disclaimer: Neither I nor: Columbia University, The - * Massachusetts Institute of Technology, The - * University of Sydney, nor The National Aeronautics - * and Space Administration warrant this code in any - * way whatsoever. This code is provided "as-is" to be - * used at your own risk. + * Disclaimer: Neither I nor THE CONTRIBUTORS warrant + * this code in any way whatsoever. This code is + * provided "as-is" to be used at your own risk. + * + * THE CONTRIBUTORS include: + * (a) The University of Sydney + * (b) The Massachusetts Institute of Technology + * (c) Columbia University + * (d) The National Aeronautics & Space Administration + * (e) Los Alamos National Laboratory * -------------------------------------------------------- * - * Last updated: 20 February, 2019 + * Last updated: 20 Jul., 2022 * - * Copyright 2013-2019 + * Copyright 2013-2022 * Darren Engwirda * d.engwirda@gmail.com * https://github.com/dengwirda/ @@ -54,28 +58,23 @@ -------------------------------------------------------- */ - template < - typename R , - typename I - > class rdel_timers { public : + double _mesh_seed = (double ) +0. ; - typedef R real_type ; - typedef I iptr_type ; + double _node_init = (double ) +0. ; + double _node_rule = (double ) +0. ; + double _edge_init = (double ) +0. ; + double _edge_rule = (double ) +0. ; + double _face_init = (double ) +0. ; + double _face_rule = (double ) +0. ; + double _tria_init = (double ) +0. ; + double _tria_rule = (double ) +0. ; - typedef rdel_timers self_type ; + double _list_trim = (double ) +0. ; - real_type _mesh_seed = (real_type) +0. ; - real_type _node_init = (real_type) +0. ; - real_type _node_rule = (real_type) +0. ; - real_type _edge_init = (real_type) +0. ; - real_type _edge_rule = (real_type) +0. ; - real_type _face_init = (real_type) +0. ; - real_type _face_rule = (real_type) +0. ; - real_type _tria_init = (real_type) +0. ; - real_type _tria_rule = (real_type) +0. ; + double _topo_init = (double ) +0. ; public : @@ -83,6 +82,7 @@ # ifdef __use_timers + __static_call __inline_call double time_span ( typename std:: chrono::high_resolution_clock @@ -98,6 +98,22 @@ (_ttoc-_ttic).count()) / +1.0E+06 ; } + __static_call + __inline_call double nano_span ( + typename std:: + chrono::high_resolution_clock + ::time_point const& _ttic, + typename std:: + chrono::high_resolution_clock + ::time_point const& _ttoc + ) + { + return (double)( + std::chrono::duration_cast< + std::chrono:: nanoseconds > + (_ttoc-_ttic).count()) / +1.0E+09 ; + } + # endif//__use_timers } ; diff --git a/external/jigsaw/src/libcpp/rdel_mesh/rdel_update_face_2.inc b/external/jigsaw/src/libcpp/rdel_mesh/rdel_update_face_2.inc index 7e31b96..767c3c0 100644 --- a/external/jigsaw/src/libcpp/rdel_mesh/rdel_update_face_2.inc +++ b/external/jigsaw/src/libcpp/rdel_mesh/rdel_update_face_2.inc @@ -22,18 +22,22 @@ * how they can obtain it for free, then you are not * required to make any arrangement with me.) * - * Disclaimer: Neither I nor: Columbia University, The - * Massachusetts Institute of Technology, The - * University of Sydney, nor The National Aeronautics - * and Space Administration warrant this code in any - * way whatsoever. This code is provided "as-is" to be - * used at your own risk. + * Disclaimer: Neither I nor THE CONTRIBUTORS warrant + * this code in any way whatsoever. This code is + * provided "as-is" to be used at your own risk. + * + * THE CONTRIBUTORS include: + * (a) The University of Sydney + * (b) The Massachusetts Institute of Technology + * (c) Columbia University + * (d) The National Aeronautics & Space Administration + * (e) Los Alamos National Laboratory * -------------------------------------------------------- * - * Last updated: 06 July, 2019 + * Last updated: 02 Aug., 2022 * - * Copyright 2013-2019 + * Copyright 2013-2022 * Darren Engwirda * d.engwirda@gmail.com * https://github.com/dengwirda/ @@ -56,6 +60,8 @@ iptr_type _tpos ) { + if(_mesh._eset._size == +0) return ; + for(auto _fpos =+3; _fpos-- != +0; ) { /*--------------------------------- get edge indexing */ @@ -93,6 +99,8 @@ iptr_type _tpos ) { + if (_mesh._tset._size == 0) return; + { /*--------------------------------- get tria indexing */ tria_data _tdat; @@ -250,7 +258,7 @@ // only in hash-set /*--------------------------- call face predicate */ - char_type _feat, _topo; + char_type _topo[ 2], _feat; real_type _fbal[ 3]; real_type _sbal[ 3]; mesh_pred::edge_cost ( @@ -404,7 +412,7 @@ /*---------------------- calc. ball in floating-point */ real_type _tbal[3] ; - geometry::circ_ball_2d ( + geometry::perp_ball_2d ( _tbal , &_mesh._tria. node(_tnod[0])->pval(0) , @@ -450,7 +458,6 @@ /*------------------------- no. "restricted" subfaces */ iptr_type _nedg = +0 ; iptr_type _ntri = +0 ; - iptr_type _ndup = +0 ; /*------------------------- calc. voronoi-dual points */ @@ -483,12 +490,8 @@ if (_dim0 <= edge_mode && _dim1 >= edge_mode ) { - typename - mesh_type::edge_list _eset ( - typename mesh_type::edge_hash(), - typename mesh_type::edge_pred(), - +.8, _mesh._eset.get_alloc(), - _tnew.count() * +3) ; + _mesh._etwo.clear(); + _mesh._etwo.set_slots(_tnew.count() * +3) ; for( auto _iter = _tnew.head(); _iter != _tnew.tend(); @@ -497,8 +500,8 @@ push_edge(_mesh, _geom , _hfun,*_iter , _edat, _escr , - _eset, _nedg , - _ndup, + _mesh. _etwo , + _nedg, _ndup , _pass, _opts) ; } } @@ -506,18 +509,14 @@ if (_dim0 <= tria_mode && _dim1 >= tria_mode ) { - //typename - // mesh_type::tria_list _tset ( - //typename mesh_type::tria_hash(), - //typename mesh_type::tria_pred(), - // +.8, _mesh._tset.get_alloc(), - // _tnew.count() * +1) ; + // _mesh._ttwo.clear(); + // _mesh._ttwo.set_slots(_tnew.count() * +1) ; bool_type _safe = true ; if (_dim0 > +0) _safe = false ; - //if (_nedg >= +1) _safe = false ; + // if (_nedg >= +1) _safe = false ; if (_ndup >= +1) _safe = false ; for( auto _iter = _tnew.head(); diff --git a/external/jigsaw/src/libcpp/rdel_mesh/rdel_update_face_3.inc b/external/jigsaw/src/libcpp/rdel_mesh/rdel_update_face_3.inc index dfe7fe1..766598f 100644 --- a/external/jigsaw/src/libcpp/rdel_mesh/rdel_update_face_3.inc +++ b/external/jigsaw/src/libcpp/rdel_mesh/rdel_update_face_3.inc @@ -22,18 +22,22 @@ * how they can obtain it for free, then you are not * required to make any arrangement with me.) * - * Disclaimer: Neither I nor: Columbia University, The - * Massachusetts Institute of Technology, The - * University of Sydney, nor The National Aeronautics - * and Space Administration warrant this code in any - * way whatsoever. This code is provided "as-is" to be - * used at your own risk. + * Disclaimer: Neither I nor THE CONTRIBUTORS warrant + * this code in any way whatsoever. This code is + * provided "as-is" to be used at your own risk. + * + * THE CONTRIBUTORS include: + * (a) The University of Sydney + * (b) The Massachusetts Institute of Technology + * (c) Columbia University + * (d) The National Aeronautics & Space Administration + * (e) Los Alamos National Laboratory * -------------------------------------------------------- * - * Last updated: 06 July, 2019 + * Last updated: 02 Aug., 2022 * - * Copyright 2013-2019 + * Copyright 2013-2022 * Darren Engwirda * d.engwirda@gmail.com * https://github.com/dengwirda/ @@ -56,6 +60,8 @@ iptr_type _tpos ) { + if(_mesh._eset._size == +0) return ; + for(auto _fpos =+6; _fpos-- != +0; ) { /*--------------------------------- get edge indexing */ @@ -93,6 +99,8 @@ iptr_type _tpos ) { + if(_mesh._fset._size == +0) return ; + for(auto _fpos =+4; _fpos-- != +0; ) { /*--------------------------------- get face indexing */ @@ -133,6 +141,8 @@ iptr_type _tpos ) { + if (_mesh._tset._size == 0) return; + { /*--------------------------------- get tria indexing */ tria_data _tdat; @@ -418,7 +428,7 @@ // only in hash-set /*--------------------------- call face predicate */ - char_type _feat, _topo; + char_type _topo[ 2], _feat; real_type _fbal[ 4]; real_type _sbal[ 4]; mesh_pred::face_cost ( @@ -633,7 +643,6 @@ iptr_type _nedg = +0 ; iptr_type _nfac = +0 ; iptr_type _ntri = +0 ; - iptr_type _ndup = +0 ; /*------------------------- calc. voronoi-dual points */ @@ -666,12 +675,8 @@ if (_dim0 <= edge_mode && _dim1 >= edge_mode ) { - typename - mesh_type::edge_list _eset ( - typename mesh_type::edge_hash(), - typename mesh_type::edge_pred(), - +.8, _mesh._eset.get_alloc(), - _tnew.count() * +6) ; + _mesh._etwo.clear(); + _mesh._etwo.set_slots(_tnew.count() * +6) ; for( auto _iter = _tnew.head(); _iter != _tnew.tend(); @@ -680,7 +685,8 @@ push_edge(_mesh, _geom , _hfun,*_iter , _edat, _escr , - _eset, _nedg , + _mesh. _etwo , + _nedg, _pass, _opts) ; } } @@ -688,12 +694,8 @@ if (_dim0 <= face_mode && _dim1 >= face_mode ) { - typename - mesh_type::face_list _fset ( - typename mesh_type::face_hash(), - typename mesh_type::face_pred(), - +.8, _mesh._fset.get_alloc(), - _tnew.count() * +4) ; + _mesh._ftwo.clear(); + _mesh._ftwo.set_slots(_tnew.count() * +4) ; for( auto _iter = _tnew.head(); _iter != _tnew.tend(); @@ -702,8 +704,8 @@ push_face(_mesh, _geom , _hfun,*_iter , _fdat, _fscr , - _fset, _nfac , - _ndup, + _mesh. _ftwo , + _nfac, _ndup , _pass, _opts) ; } } @@ -711,18 +713,14 @@ if (_dim0 <= tria_mode && _dim1 >= tria_mode ) { - //typename - // mesh_type::tria_list _tset ( - //typename mesh_type::tria_hash(), - //typename mesh_type::tria_pred(), - // +.8, _mesh._tset.get_alloc(), - // _tnew.count() * +1) ; + // _mesh._ttwo.clear(); + // _mesh._ttwo.set_slots(_tnew.count() * +1) ; bool_type _safe = true ; if (_dim0 > +0) _safe = false ; - //if (_nfac >= +1) _safe = false ; + // if (_nfac >= +1) _safe = false ; if (_ndup >= +1) _safe = false ; for( auto _iter = _tnew.head(); diff --git a/external/jigsaw/src/libcpp/rdel_mesh/rdel_update_topo_2.inc b/external/jigsaw/src/libcpp/rdel_mesh/rdel_update_topo_2.inc index 3249d4f..557d71b 100644 --- a/external/jigsaw/src/libcpp/rdel_mesh/rdel_update_topo_2.inc +++ b/external/jigsaw/src/libcpp/rdel_mesh/rdel_update_topo_2.inc @@ -22,18 +22,22 @@ * how they can obtain it for free, then you are not * required to make any arrangement with me.) * - * Disclaimer: Neither I nor: Columbia University, The - * Massachusetts Institute of Technology, The - * University of Sydney, nor The National Aeronautics - * and Space Administration warrant this code in any - * way whatsoever. This code is provided "as-is" to be - * used at your own risk. + * Disclaimer: Neither I nor THE CONTRIBUTORS warrant + * this code in any way whatsoever. This code is + * provided "as-is" to be used at your own risk. + * + * THE CONTRIBUTORS include: + * (a) The University of Sydney + * (b) The Massachusetts Institute of Technology + * (c) Columbia University + * (d) The National Aeronautics & Space Administration + * (e) Los Alamos National Laboratory * -------------------------------------------------------- * - * Last updated: 03 July, 2019 + * Last updated: 03 Aug., 2022 * - * Copyright 2013-2019 + * Copyright 2013-2022 * Darren Engwirda * d.engwirda@gmail.com * https://github.com/dengwirda/ @@ -106,16 +110,11 @@ { /*------------------------- init. for local hash obj. */ - typename - mesh_type::edge_list _eset ( - typename mesh_type::edge_hash(), - typename mesh_type::edge_pred(), - +.8, _mesh._eset.get_alloc()) ; + _mesh._etwo.clear(); + _mesh._etwo. + set_slots(_enew.count() * 2) ; - /*------------------------- push alloc. for hash obj. */ - _eset.set_slots ( - _enew.count() * 2 , - containers::tight_alloc) ; + auto& _eset = _mesh. _etwo; /*------------------------- add "old" absent in "new" */ node_data _ndat ; @@ -135,7 +134,6 @@ item_type *_mptr = nullptr ; if(!_eset.find(*_iter, _mptr)) { - if (_emrk[_iter->_node[0]] == -1) { _emrk[_iter->_node[0]] = +1; @@ -155,23 +153,17 @@ _etpq.push(_ndat) ; } - } } } { /*------------------------- init. for local hash obj. */ - typename - mesh_type::edge_list _eset ( - typename mesh_type::edge_hash(), - typename mesh_type::edge_pred(), - +.8, _mesh._eset.get_alloc()) ; + _mesh._etwo.clear(); + _mesh._etwo. + set_slots(_eold.count() * 2) ; - /*------------------------- push alloc. for hash obj. */ - _eset.set_slots ( - _eold.count() * 2 , - containers::tight_alloc) ; + auto& _eset = _mesh. _etwo; /*------------------------- add "new" absent in "old" */ node_data _ndat ; @@ -191,7 +183,6 @@ item_type *_mptr = nullptr ; if(!_eset.find(*_iter, _mptr)) { - if (_emrk[_iter->_node[0]] == -1) { _emrk[_iter->_node[0]] = +1; @@ -211,7 +202,6 @@ _etpq.push(_ndat) ; } - } } } diff --git a/external/jigsaw/src/libcpp/rdel_mesh/rdel_update_topo_3.inc b/external/jigsaw/src/libcpp/rdel_mesh/rdel_update_topo_3.inc index a2dc264..0ac030e 100644 --- a/external/jigsaw/src/libcpp/rdel_mesh/rdel_update_topo_3.inc +++ b/external/jigsaw/src/libcpp/rdel_mesh/rdel_update_topo_3.inc @@ -22,18 +22,22 @@ * how they can obtain it for free, then you are not * required to make any arrangement with me.) * - * Disclaimer: Neither I nor: Columbia University, The - * Massachusetts Institute of Technology, The - * University of Sydney, nor The National Aeronautics - * and Space Administration warrant this code in any - * way whatsoever. This code is provided "as-is" to be - * used at your own risk. + * Disclaimer: Neither I nor THE CONTRIBUTORS warrant + * this code in any way whatsoever. This code is + * provided "as-is" to be used at your own risk. + * + * THE CONTRIBUTORS include: + * (a) The University of Sydney + * (b) The Massachusetts Institute of Technology + * (c) Columbia University + * (d) The National Aeronautics & Space Administration + * (e) Los Alamos National Laboratory * -------------------------------------------------------- * - * Last updated: 03 July, 2019 + * Last updated: 03 Aug., 2022 * - * Copyright 2013-2019 + * Copyright 2013-2022 * Darren Engwirda * d.engwirda@gmail.com * https://github.com/dengwirda/ @@ -111,16 +115,11 @@ { /*------------------------- init. for local hash obj. */ - typename - mesh_type::edge_list _eset ( - typename mesh_type::edge_hash(), - typename mesh_type::edge_pred(), - +.8, _mesh._eset.get_alloc()) ; + _mesh._etwo.clear(); + _mesh._etwo. + set_slots(_enew.count() * 2) ; - /*------------------------- push alloc. for hash obj. */ - _eset.set_slots ( - _enew.count() * 2 , - containers::tight_alloc) ; + auto& _eset = _mesh. _etwo; /*------------------------- add "old" absent in "new" */ node_data _ndat ; @@ -140,7 +139,6 @@ item_type *_mptr = nullptr ; if(!_eset.find(*_iter, _mptr)) { - if (_emrk[_iter->_node[0]] == -1) { _emrk[_iter->_node[0]] = +1; @@ -160,23 +158,17 @@ _etpq.push(_ndat) ; } - } } } { /*------------------------- init. for local hash obj. */ - typename - mesh_type::edge_list _eset ( - typename mesh_type::edge_hash(), - typename mesh_type::edge_pred(), - +.8, _mesh._eset.get_alloc()) ; + _mesh._etwo.clear(); + _mesh._etwo. + set_slots(_eold.count() * 2) ; - /*------------------------- push alloc. for hash obj. */ - _eset.set_slots ( - _eold.count() * 2 , - containers::tight_alloc) ; + auto& _eset = _mesh. _etwo; /*------------------------- add "new" absent in "old" */ node_data _ndat ; @@ -196,7 +188,6 @@ item_type *_mptr = nullptr ; if(!_eset.find(*_iter, _mptr)) { - if (_emrk[_iter->_node[0]] == -1) { _emrk[_iter->_node[0]] = +1; @@ -216,7 +207,6 @@ _etpq.push(_ndat) ; } - } } } @@ -279,16 +269,11 @@ { /*------------------------- init. for local hash obj. */ - typename - mesh_type::face_list _fset ( - typename mesh_type::face_hash(), - typename mesh_type::face_pred(), - +.8, _mesh._fset.get_alloc()) ; + _mesh._ftwo.clear(); + _mesh._ftwo. + set_slots(_fnew.count() * 2) ; - /*------------------------- push alloc. for hash obj. */ - _fset.set_slots ( - _fnew.count() * 2 , - containers::tight_alloc) ; + auto& _fset = _mesh. _ftwo; /*------------------------- add "old" absent in "new" */ node_data _ndat ; @@ -308,7 +293,6 @@ item_type *_mptr = nullptr ; if(!_fset.find(*_iter, _mptr)) { - if (_fmrk[_iter->_node[0]] == -1) { _fmrk[_iter->_node[0]] = +1; @@ -338,23 +322,17 @@ _ftpq.push(_ndat) ; } - } } } { /*------------------------- init. for local hash obj. */ - typename - mesh_type::face_list _fset ( - typename mesh_type::face_hash(), - typename mesh_type::face_pred(), - +.8, _mesh._fset.get_alloc()) ; + _mesh._ftwo.clear(); + _mesh._ftwo. + set_slots(_fold.count() * 2) ; - /*------------------------- push alloc. for hash obj. */ - _fset.set_slots ( - _fold.count() * 2 , - containers::tight_alloc) ; + auto& _fset = _mesh. _ftwo; /*------------------------- add "new" absent in "old" */ node_data _ndat ; @@ -374,7 +352,6 @@ item_type *_mptr = nullptr ; if(!_fset.find(*_iter, _mptr)) { - if (_fmrk[_iter->_node[0]] == -1) { _fmrk[_iter->_node[0]] = +1; @@ -404,7 +381,6 @@ _ftpq.push(_ndat) ; } - } } } diff --git a/external/jigsaw/src/libcpp/rdelmesh.hpp b/external/jigsaw/src/libcpp/rdelmesh.hpp index 1437ee6..aec8dd0 100644 --- a/external/jigsaw/src/libcpp/rdelmesh.hpp +++ b/external/jigsaw/src/libcpp/rdelmesh.hpp @@ -22,18 +22,22 @@ * how they can obtain it for free, then you are not * required to make any arrangement with me.) * - * Disclaimer: Neither I nor: Columbia University, The - * Massachusetts Institute of Technology, The - * University of Sydney, nor The National Aeronautics - * and Space Administration warrant this code in any - * way whatsoever. This code is provided "as-is" to be - * used at your own risk. + * Disclaimer: Neither I nor THE CONTRIBUTORS warrant + * this code in any way whatsoever. This code is + * provided "as-is" to be used at your own risk. + * + * THE CONTRIBUTORS include: + * (a) The University of Sydney + * (b) The Massachusetts Institute of Technology + * (c) Columbia University + * (d) The National Aeronautics & Space Administration + * (e) Los Alamos National Laboratory * ------------------------------------------------------------ * - * Last updated: 20 February, 2019 + * Last updated: 18 Aug., 2021 * - * Copyright 2013-2019 + * Copyright 2013-2021 * Darren Engwirda * d.engwirda@gmail.com * https://github.com/dengwirda/ @@ -56,6 +60,9 @@ char_type constexpr null_ball = 0 ; char_type constexpr feat_ball = 1 ; + + char_type constexpr filt_topo = 0 ; + char_type constexpr full_topo = 1 ; } # include "containers.hpp" @@ -66,9 +73,10 @@ # include "tessellate.hpp" -# include "geomtype.hpp" -# include "meshfunc.hpp" -# include "meshtype.hpp" +# include "geomreps.hpp" +# include "meshreps.hpp" + +# include "interpolate.hpp" # include "rdel_mesh/rdel_complex_2.hpp" # include "rdel_mesh/rdel_complex_3.hpp" diff --git a/external/jigsaw/src/libcpp/tessellate.hpp b/external/jigsaw/src/libcpp/tessellate.hpp index f2a2b9d..fdffbcc 100644 --- a/external/jigsaw/src/libcpp/tessellate.hpp +++ b/external/jigsaw/src/libcpp/tessellate.hpp @@ -22,12 +22,16 @@ * how they can obtain it for free, then you are not * required to make any arrangement with me.) * - * Disclaimer: Neither I nor: Columbia University, The - * Massachusetts Institute of Technology, The - * University of Sydney, nor The National Aeronautics - * and Space Administration warrant this code in any - * way whatsoever. This code is provided "as-is" to be - * used at your own risk. + * Disclaimer: Neither I nor THE CONTRIBUTORS warrant + * this code in any way whatsoever. This code is + * provided "as-is" to be used at your own risk. + * + * THE CONTRIBUTORS include: + * (a) The University of Sydney + * (b) The Massachusetts Institute of Technology + * (c) Columbia University + * (d) The National Aeronautics & Space Administration + * (e) Los Alamos National Laboratory * ------------------------------------------------------------ * diff --git a/external/jigsaw/src/libcpp/tessellate/delaunay_scan_tria.inc b/external/jigsaw/src/libcpp/tessellate/delaunay_scan_tria.inc index 23e0b0b..fdaa6cf 100644 --- a/external/jigsaw/src/libcpp/tessellate/delaunay_scan_tria.inc +++ b/external/jigsaw/src/libcpp/tessellate/delaunay_scan_tria.inc @@ -22,16 +22,20 @@ * how they can obtain it for free, then you are not * required to make any arrangement with me.) * - * Disclaimer: Neither I nor: Columbia University, The - * Massachusetts Institute of Technology, The - * University of Sydney, nor The National Aeronautics - * and Space Administration warrant this code in any - * way whatsoever. This code is provided "as-is" to be - * used at your own risk. + * Disclaimer: Neither I nor THE CONTRIBUTORS warrant + * this code in any way whatsoever. This code is + * provided "as-is" to be used at your own risk. + * + * THE CONTRIBUTORS include: + * (a) The University of Sydney + * (b) The Massachusetts Institute of Technology + * (c) Columbia University + * (d) The National Aeronautics & Space Administration + * (e) Los Alamos National Laboratory * -------------------------------------------------------- * - * Last updated: 17 March, 2018 + * Last updated: 17 Mar., 2018 * * Copyright 2013-2018 * Darren Engwirda diff --git a/external/jigsaw/src/libcpp/tessellate/delaunay_star_void.inc b/external/jigsaw/src/libcpp/tessellate/delaunay_star_void.inc index 94765e7..02a7c1f 100644 --- a/external/jigsaw/src/libcpp/tessellate/delaunay_star_void.inc +++ b/external/jigsaw/src/libcpp/tessellate/delaunay_star_void.inc @@ -22,16 +22,20 @@ * how they can obtain it for free, then you are not * required to make any arrangement with me.) * - * Disclaimer: Neither I nor: Columbia University, The - * Massachusetts Institute of Technology, The - * University of Sydney, nor The National Aeronautics - * and Space Administration warrant this code in any - * way whatsoever. This code is provided "as-is" to be - * used at your own risk. + * Disclaimer: Neither I nor THE CONTRIBUTORS warrant + * this code in any way whatsoever. This code is + * provided "as-is" to be used at your own risk. + * + * THE CONTRIBUTORS include: + * (a) The University of Sydney + * (b) The Massachusetts Institute of Technology + * (c) Columbia University + * (d) The National Aeronautics & Space Administration + * (e) Los Alamos National Laboratory * -------------------------------------------------------- * - * Last updated: 03 July, 2019 + * Last updated: 03 Jul., 2019 * * Copyright 2013-2019 * Darren Engwirda diff --git a/external/jigsaw/src/libcpp/tessellate/delaunay_tri_k.hpp b/external/jigsaw/src/libcpp/tessellate/delaunay_tri_k.hpp index b0dc5c7..fb498a5 100644 --- a/external/jigsaw/src/libcpp/tessellate/delaunay_tri_k.hpp +++ b/external/jigsaw/src/libcpp/tessellate/delaunay_tri_k.hpp @@ -22,12 +22,16 @@ * how they can obtain it for free, then you are not * required to make any arrangement with me.) * - * Disclaimer: Neither I nor: Columbia University, The - * Massachusetts Institute of Technology, The - * University of Sydney, nor The National Aeronautics - * and Space Administration warrant this code in any - * way whatsoever. This code is provided "as-is" to be - * used at your own risk. + * Disclaimer: Neither I nor THE CONTRIBUTORS warrant + * this code in any way whatsoever. This code is + * provided "as-is" to be used at your own risk. + * + * THE CONTRIBUTORS include: + * (a) The University of Sydney + * (b) The Massachusetts Institute of Technology + * (c) Columbia University + * (d) The National Aeronautics & Space Administration + * (e) Los Alamos National Laboratory * -------------------------------------------------------- * diff --git a/external/jigsaw/src/libcpp/tessellate/delaunay_tri_pred_2.hpp b/external/jigsaw/src/libcpp/tessellate/delaunay_tri_pred_2.hpp index 44c51ad..69eca19 100644 --- a/external/jigsaw/src/libcpp/tessellate/delaunay_tri_pred_2.hpp +++ b/external/jigsaw/src/libcpp/tessellate/delaunay_tri_pred_2.hpp @@ -22,16 +22,20 @@ * how they can obtain it for free, then you are not * required to make any arrangement with me.) * - * Disclaimer: Neither I nor: Columbia University, The - * Massachusetts Institute of Technology, The - * University of Sydney, nor The National Aeronautics - * and Space Administration warrant this code in any - * way whatsoever. This code is provided "as-is" to be - * used at your own risk. + * Disclaimer: Neither I nor THE CONTRIBUTORS warrant + * this code in any way whatsoever. This code is + * provided "as-is" to be used at your own risk. + * + * THE CONTRIBUTORS include: + * (a) The University of Sydney + * (b) The Massachusetts Institute of Technology + * (c) Columbia University + * (d) The National Aeronautics & Space Administration + * (e) Los Alamos National Laboratory * ------------------------------------------------------------ * - * Last updated: 01 March, 2019 + * Last updated: 01 Mar., 2019 * * Copyright 2013-2019 * Darren Engwirda diff --git a/external/jigsaw/src/libcpp/tessellate/delaunay_tri_pred_3.hpp b/external/jigsaw/src/libcpp/tessellate/delaunay_tri_pred_3.hpp index 7de9aad..f6c7b16 100644 --- a/external/jigsaw/src/libcpp/tessellate/delaunay_tri_pred_3.hpp +++ b/external/jigsaw/src/libcpp/tessellate/delaunay_tri_pred_3.hpp @@ -22,16 +22,20 @@ * how they can obtain it for free, then you are not * required to make any arrangement with me.) * - * Disclaimer: Neither I nor: Columbia University, The - * Massachusetts Institute of Technology, The - * University of Sydney, nor The National Aeronautics - * and Space Administration warrant this code in any - * way whatsoever. This code is provided "as-is" to be - * used at your own risk. + * Disclaimer: Neither I nor THE CONTRIBUTORS warrant + * this code in any way whatsoever. This code is + * provided "as-is" to be used at your own risk. + * + * THE CONTRIBUTORS include: + * (a) The University of Sydney + * (b) The Massachusetts Institute of Technology + * (c) Columbia University + * (d) The National Aeronautics & Space Administration + * (e) Los Alamos National Laboratory * ------------------------------------------------------------ * - * Last updated: 01 March, 2019 + * Last updated: 01 Mar., 2019 * * Copyright 2013-2019 * Darren Engwirda diff --git a/external/jigsaw/src/libcpp/tessellate/delaunay_tri_pred_4.hpp b/external/jigsaw/src/libcpp/tessellate/delaunay_tri_pred_4.hpp index fe5af0a..38c0db4 100644 --- a/external/jigsaw/src/libcpp/tessellate/delaunay_tri_pred_4.hpp +++ b/external/jigsaw/src/libcpp/tessellate/delaunay_tri_pred_4.hpp @@ -22,16 +22,20 @@ * how they can obtain it for free, then you are not * required to make any arrangement with me.) * - * Disclaimer: Neither I nor: Columbia University, The - * Massachusetts Institute of Technology, The - * University of Sydney, nor The National Aeronautics - * and Space Administration warrant this code in any - * way whatsoever. This code is provided "as-is" to be - * used at your own risk. + * Disclaimer: Neither I nor THE CONTRIBUTORS warrant + * this code in any way whatsoever. This code is + * provided "as-is" to be used at your own risk. + * + * THE CONTRIBUTORS include: + * (a) The University of Sydney + * (b) The Massachusetts Institute of Technology + * (c) Columbia University + * (d) The National Aeronautics & Space Administration + * (e) Los Alamos National Laboratory * ------------------------------------------------------------ * - * Last updated: 30 April, 2020 + * Last updated: 30 Apr., 2020 * * Copyright 2013-2020 * Darren Engwirda diff --git a/external/jigsaw/src/libcpp/tessellate/delaunay_tri_type_2.hpp b/external/jigsaw/src/libcpp/tessellate/delaunay_tri_type_2.hpp index b95599e..a783fb1 100644 --- a/external/jigsaw/src/libcpp/tessellate/delaunay_tri_type_2.hpp +++ b/external/jigsaw/src/libcpp/tessellate/delaunay_tri_type_2.hpp @@ -22,16 +22,20 @@ * how they can obtain it for free, then you are not * required to make any arrangement with me.) * - * Disclaimer: Neither I nor: Columbia University, The - * Massachusetts Institute of Technology, The - * University of Sydney, nor The National Aeronautics - * and Space Administration warrant this code in any - * way whatsoever. This code is provided "as-is" to be - * used at your own risk. + * Disclaimer: Neither I nor THE CONTRIBUTORS warrant + * this code in any way whatsoever. This code is + * provided "as-is" to be used at your own risk. + * + * THE CONTRIBUTORS include: + * (a) The University of Sydney + * (b) The Massachusetts Institute of Technology + * (c) Columbia University + * (d) The National Aeronautics & Space Administration + * (e) Los Alamos National Laboratory * ------------------------------------------------------------ * - * Last updated: 22 February, 2020 + * Last updated: 22 Feb., 2020 * * Copyright 2013-2020 * Darren Engwirda diff --git a/external/jigsaw/src/libcpp/tessellate/delaunay_tri_type_3.hpp b/external/jigsaw/src/libcpp/tessellate/delaunay_tri_type_3.hpp index 3f6a119..a882ef1 100644 --- a/external/jigsaw/src/libcpp/tessellate/delaunay_tri_type_3.hpp +++ b/external/jigsaw/src/libcpp/tessellate/delaunay_tri_type_3.hpp @@ -22,16 +22,20 @@ * how they can obtain it for free, then you are not * required to make any arrangement with me.) * - * Disclaimer: Neither I nor: Columbia University, The - * Massachusetts Institute of Technology, The - * University of Sydney, nor The National Aeronautics - * and Space Administration warrant this code in any - * way whatsoever. This code is provided "as-is" to be - * used at your own risk. + * Disclaimer: Neither I nor THE CONTRIBUTORS warrant + * this code in any way whatsoever. This code is + * provided "as-is" to be used at your own risk. + * + * THE CONTRIBUTORS include: + * (a) The University of Sydney + * (b) The Massachusetts Institute of Technology + * (c) Columbia University + * (d) The National Aeronautics & Space Administration + * (e) Los Alamos National Laboratory * ------------------------------------------------------------ * - * Last updated: 22 February, 2020 + * Last updated: 22 Feb., 2020 * * Copyright 2013-2020 * Darren Engwirda diff --git a/external/jigsaw/src/libcpp/tessellate/delaunay_tri_type_4.hpp b/external/jigsaw/src/libcpp/tessellate/delaunay_tri_type_4.hpp index 9100065..8ad4f02 100644 --- a/external/jigsaw/src/libcpp/tessellate/delaunay_tri_type_4.hpp +++ b/external/jigsaw/src/libcpp/tessellate/delaunay_tri_type_4.hpp @@ -22,16 +22,20 @@ * how they can obtain it for free, then you are not * required to make any arrangement with me.) * - * Disclaimer: Neither I nor: Columbia University, The - * Massachusetts Institute of Technology, The - * University of Sydney, nor The National Aeronautics - * and Space Administration warrant this code in any - * way whatsoever. This code is provided "as-is" to be - * used at your own risk. + * Disclaimer: Neither I nor THE CONTRIBUTORS warrant + * this code in any way whatsoever. This code is + * provided "as-is" to be used at your own risk. + * + * THE CONTRIBUTORS include: + * (a) The University of Sydney + * (b) The Massachusetts Institute of Technology + * (c) Columbia University + * (d) The National Aeronautics & Space Administration + * (e) Los Alamos National Laboratory * ------------------------------------------------------------ * - * Last updated: 30 April, 2020 + * Last updated: 30 Apr., 2020 * * Copyright 2013-2020 * Darren Engwirda diff --git a/external/jigsaw/src/libcpp/tessellate/delaunay_walk_mesh.inc b/external/jigsaw/src/libcpp/tessellate/delaunay_walk_mesh.inc index 8d21e59..0841c49 100644 --- a/external/jigsaw/src/libcpp/tessellate/delaunay_walk_mesh.inc +++ b/external/jigsaw/src/libcpp/tessellate/delaunay_walk_mesh.inc @@ -22,16 +22,20 @@ * how they can obtain it for free, then you are not * required to make any arrangement with me.) * - * Disclaimer: Neither I nor: Columbia University, The - * Massachusetts Institute of Technology, The - * University of Sydney, nor The National Aeronautics - * and Space Administration warrant this code in any - * way whatsoever. This code is provided "as-is" to be - * used at your own risk. + * Disclaimer: Neither I nor THE CONTRIBUTORS warrant + * this code in any way whatsoever. This code is + * provided "as-is" to be used at your own risk. + * + * THE CONTRIBUTORS include: + * (a) The University of Sydney + * (b) The Massachusetts Institute of Technology + * (c) Columbia University + * (d) The National Aeronautics & Space Administration + * (e) Los Alamos National Laboratory * -------------------------------------------------------- * - * Last updated: 18 February, 2019 + * Last updated: 18 Feb., 2019 * * Copyright 2013-2019 * Darren Engwirda diff --git a/external/jigsaw/src/libcpp/tessellate/laguerre_tri_pred_2.hpp b/external/jigsaw/src/libcpp/tessellate/laguerre_tri_pred_2.hpp index 36794d0..4b084e4 100644 --- a/external/jigsaw/src/libcpp/tessellate/laguerre_tri_pred_2.hpp +++ b/external/jigsaw/src/libcpp/tessellate/laguerre_tri_pred_2.hpp @@ -22,16 +22,20 @@ * how they can obtain it for free, then you are not * required to make any arrangement with me.) * - * Disclaimer: Neither I nor: Columbia University, The - * Massachusetts Institute of Technology, The - * University of Sydney, nor The National Aeronautics - * and Space Administration warrant this code in any - * way whatsoever. This code is provided "as-is" to be - * used at your own risk. + * Disclaimer: Neither I nor THE CONTRIBUTORS warrant + * this code in any way whatsoever. This code is + * provided "as-is" to be used at your own risk. + * + * THE CONTRIBUTORS include: + * (a) The University of Sydney + * (b) The Massachusetts Institute of Technology + * (c) Columbia University + * (d) The National Aeronautics & Space Administration + * (e) Los Alamos National Laboratory * ------------------------------------------------------------ * - * Last updated: 01 March, 2020 + * Last updated: 01 Mar., 2020 * * Copyright 2013-2020 * Darren Engwirda diff --git a/external/jigsaw/src/libcpp/tessellate/laguerre_tri_pred_3.hpp b/external/jigsaw/src/libcpp/tessellate/laguerre_tri_pred_3.hpp index 68154bc..d0446ca 100644 --- a/external/jigsaw/src/libcpp/tessellate/laguerre_tri_pred_3.hpp +++ b/external/jigsaw/src/libcpp/tessellate/laguerre_tri_pred_3.hpp @@ -22,16 +22,20 @@ * how they can obtain it for free, then you are not * required to make any arrangement with me.) * - * Disclaimer: Neither I nor: Columbia University, The - * Massachusetts Institute of Technology, The - * University of Sydney, nor The National Aeronautics - * and Space Administration warrant this code in any - * way whatsoever. This code is provided "as-is" to be - * used at your own risk. + * Disclaimer: Neither I nor THE CONTRIBUTORS warrant + * this code in any way whatsoever. This code is + * provided "as-is" to be used at your own risk. + * + * THE CONTRIBUTORS include: + * (a) The University of Sydney + * (b) The Massachusetts Institute of Technology + * (c) Columbia University + * (d) The National Aeronautics & Space Administration + * (e) Los Alamos National Laboratory * ------------------------------------------------------------ * - * Last updated: 01 March, 2020 + * Last updated: 01 Mar., 2020 * * Copyright 2013-2020 * Darren Engwirda diff --git a/external/jigsaw/src/libcpp/tessellate/laguerre_tri_pred_4.hpp b/external/jigsaw/src/libcpp/tessellate/laguerre_tri_pred_4.hpp index 51362b3..0409365 100644 --- a/external/jigsaw/src/libcpp/tessellate/laguerre_tri_pred_4.hpp +++ b/external/jigsaw/src/libcpp/tessellate/laguerre_tri_pred_4.hpp @@ -22,16 +22,20 @@ * how they can obtain it for free, then you are not * required to make any arrangement with me.) * - * Disclaimer: Neither I nor: Columbia University, The - * Massachusetts Institute of Technology, The - * University of Sydney, nor The National Aeronautics - * and Space Administration warrant this code in any - * way whatsoever. This code is provided "as-is" to be - * used at your own risk. + * Disclaimer: Neither I nor THE CONTRIBUTORS warrant + * this code in any way whatsoever. This code is + * provided "as-is" to be used at your own risk. + * + * THE CONTRIBUTORS include: + * (a) The University of Sydney + * (b) The Massachusetts Institute of Technology + * (c) Columbia University + * (d) The National Aeronautics & Space Administration + * (e) Los Alamos National Laboratory * ------------------------------------------------------------ * - * Last updated: 30 April, 2020 + * Last updated: 30 Apr., 2020 * * Copyright 2013-2020 * Darren Engwirda diff --git a/external/jigsaw/src/libcpp/textutil.hpp b/external/jigsaw/src/libcpp/textutil.hpp index f40049b..eb1e1c2 100644 --- a/external/jigsaw/src/libcpp/textutil.hpp +++ b/external/jigsaw/src/libcpp/textutil.hpp @@ -22,12 +22,16 @@ * how they can obtain it for free, then you are not * required to make any arrangement with me.) * - * Disclaimer: Neither I nor: Columbia University, The - * Massachusetts Institute of Technology, The - * University of Sydney, nor The National Aeronautics - * and Space Administration warrant this code in any - * way whatsoever. This code is provided "as-is" to be - * used at your own risk. + * Disclaimer: Neither I nor THE CONTRIBUTORS warrant + * this code in any way whatsoever. This code is + * provided "as-is" to be used at your own risk. + * + * THE CONTRIBUTORS include: + * (a) The University of Sydney + * (b) The Massachusetts Institute of Technology + * (c) Columbia University + * (d) The National Aeronautics & Space Administration + * (e) Los Alamos National Laboratory * -------------------------------------------------------- * @@ -53,12 +57,12 @@ */ template < - typename real_type + typename real_type > __static_call __inline_call std::string to_string_prec ( real_type const&_real, - std::size_t _prec + std::size_t _prec ) { std::stringstream _sstr ; diff --git a/external/jigsaw/src/libcpp/useropts.hpp b/external/jigsaw/src/libcpp/useropts.hpp index 2801c2d..fad9956 100644 --- a/external/jigsaw/src/libcpp/useropts.hpp +++ b/external/jigsaw/src/libcpp/useropts.hpp @@ -22,16 +22,20 @@ * how they can obtain it for free, then you are not * required to make any arrangement with me.) * - * Disclaimer: Neither I nor: Columbia University, The - * Massachusetts Institute of Technology, The - * University of Sydney, nor The National Aeronautics - * and Space Administration warrant this code in any - * way whatsoever. This code is provided "as-is" to be - * used at your own risk. + * Disclaimer: Neither I nor THE CONTRIBUTORS warrant + * this code in any way whatsoever. This code is + * provided "as-is" to be used at your own risk. + * + * THE CONTRIBUTORS include: + * (a) The University of Sydney + * (b) The Massachusetts Institute of Technology + * (c) Columbia University + * (d) The National Aeronautics & Space Administration + * (e) Los Alamos National Laboratory * ------------------------------------------------------------ * - * Last updated: 27 November, 2019 + * Last updated: 27 Nov., 2019 * * Copyright 2013-2019 * Darren Engwirda diff --git a/external/jigsaw/src/liblib/init_jig_t.hpp b/external/jigsaw/src/liblib/init_jig_t.hpp index 466d56c..0337732 100644 --- a/external/jigsaw/src/liblib/init_jig_t.hpp +++ b/external/jigsaw/src/liblib/init_jig_t.hpp @@ -22,18 +22,22 @@ * how they can obtain it for free, then you are not * required to make any arrangement with me.) * - * Disclaimer: Neither I nor: Columbia University, The - * Massachusetts Institute of Technology, The - * University of Sydney, nor The National Aeronautics - * and Space Administration warrant this code in any - * way whatsoever. This code is provided "as-is" to be - * used at your own risk. + * Disclaimer: Neither I nor THE CONTRIBUTORS warrant + * this code in any way whatsoever. This code is + * provided "as-is" to be used at your own risk. + * + * THE CONTRIBUTORS include: + * (a) The University of Sydney + * (b) The Massachusetts Institute of Technology + * (c) Columbia University + * (d) The National Aeronautics & Space Administration + * (e) Los Alamos National Laboratory * -------------------------------------------------------- * - * Last updated: 10 Jul., 2021 + * Last updated: 12 Dec., 2022 * - * Copyright 2013-2021 + * Copyright 2013-2022 * Darren Engwirda * d.engwirda@gmail.com * https://github.com/dengwirda/ @@ -60,6 +64,15 @@ { /*------------------------------------- MISC keywords */ _jcfg->_verbosity = (indx_t) +0 ; + _jcfg->_numthread = (indx_t) +0 ; + + if (_jcfg->_numthread <= 0 ) + # ifdef __use_openmp + _jcfg->_numthread = + omp_get_num_procs() ; + # else + _jcfg->_numthread = +1 ; + # endif//__use_openmp /*------------------------------------- BNDS keywords */ _jcfg->_bnds_kern = JIGSAW_BNDS_TRIACELL ; @@ -107,21 +120,26 @@ _jcfg->_mesh_siz2 = (real_t) _SIZ2 ; _jcfg->_mesh_siz3 = (real_t) _SIZ3 ; - _jcfg->_mesh_snk2 = (real_t) +1./5.; - _jcfg->_mesh_snk3 = (real_t) +1./3.; + _jcfg->_mesh_snk2 = (real_t) + 1./5. ; + _jcfg->_mesh_snk3 = (real_t) + 1./3. ; - _jcfg->_mesh_eps1 = (real_t) +1./3.; - _jcfg->_mesh_eps2 = (real_t) +1./3.; + _jcfg->_mesh_eps1 = (real_t) + 1./3. ; + _jcfg->_mesh_eps2 = (real_t) + 1./3. ; - _jcfg->_mesh_vol3 = (real_t) +0./1.; + _jcfg->_mesh_vol3 = (real_t) + 0./1. ; /*------------------------------------- OPTM keywords */ _jcfg->_optm_kern = JIGSAW_KERN_ODT_DQDX ; _jcfg->_optm_iter = (indx_t) +16; + _jcfg->_optm_cost = JIGSAW_KERN_AREA_LEN ; + + _jcfg->_optm_beta = (real_t) +0.4950 ; + _jcfg->_optm_zeta = (real_t) +0.8250 ; + _jcfg->_optm_qtol = (real_t) +1.E-04 ; - _jcfg->_optm_qlim = (real_t) +14./15.; + _jcfg->_optm_qlim = (real_t) +14./15.; // .9333... _jcfg->_optm_tria = (indx_t) +1 ; _jcfg->_optm_dual = (indx_t) +0 ; diff --git a/external/jigsaw/src/liblib/init_msh_t.hpp b/external/jigsaw/src/liblib/init_msh_t.hpp index c128a95..acbda4c 100644 --- a/external/jigsaw/src/liblib/init_msh_t.hpp +++ b/external/jigsaw/src/liblib/init_msh_t.hpp @@ -22,12 +22,16 @@ * how they can obtain it for free, then you are not * required to make any arrangement with me.) * - * Disclaimer: Neither I nor: Columbia University, The - * Massachusetts Institute of Technology, The - * University of Sydney, nor The National Aeronautics - * and Space Administration warrant this code in any - * way whatsoever. This code is provided "as-is" to be - * used at your own risk. + * Disclaimer: Neither I nor THE CONTRIBUTORS warrant + * this code in any way whatsoever. This code is + * provided "as-is" to be used at your own risk. + * + * THE CONTRIBUTORS include: + * (a) The University of Sydney + * (b) The Massachusetts Institute of Technology + * (c) Columbia University + * (d) The National Aeronautics & Space Administration + * (e) Los Alamos National Laboratory * -------------------------------------------------------- * diff --git a/external/jigsaw/src/liblib/load_jig_t.hpp b/external/jigsaw/src/liblib/load_jig_t.hpp index bf74c5a..5f60912 100644 --- a/external/jigsaw/src/liblib/load_jig_t.hpp +++ b/external/jigsaw/src/liblib/load_jig_t.hpp @@ -22,18 +22,22 @@ * how they can obtain it for free, then you are not * required to make any arrangement with me.) * - * Disclaimer: Neither I nor: Columbia University, The - * Massachusetts Institute of Technology, The - * University of Sydney, nor The National Aeronautics - * and Space Administration warrant this code in any - * way whatsoever. This code is provided "as-is" to be - * used at your own risk. + * Disclaimer: Neither I nor THE CONTRIBUTORS warrant + * this code in any way whatsoever. This code is + * provided "as-is" to be used at your own risk. + * + * THE CONTRIBUTORS include: + * (a) The University of Sydney + * (b) The Massachusetts Institute of Technology + * (c) Columbia University + * (d) The National Aeronautics & Space Administration + * (e) Los Alamos National Laboratory * -------------------------------------------------------- * - * Last updated: 29 October, 2019 + * Last updated: 12 Dec., 2022 * - * Copyright 2013-2019 + * Copyright 2013-2022 * Darren Engwirda * d.engwirda@gmail.com * https://github.com/dengwirda/ @@ -81,6 +85,13 @@ this-> _jjig->_verbosity = _verb; } + __normal_call void_type push_numthread ( + std::int32_t _nprt + ) + { + this-> + _jjig->_numthread = _nprt; + } /*------------------------------------- GEOM keywords */ __normal_call void_type push_geom_seed ( @@ -283,7 +294,6 @@ this-> _jjig->_optm_kern = _kern; } - __normal_call void_type push_optm_iter ( std::int32_t _iter ) @@ -291,6 +301,27 @@ this-> _jjig->_optm_iter = _iter; } + __normal_call void_type push_optm_cost ( + std::int32_t _cost + ) + { + this-> + _jjig->_optm_cost = _cost; + } + __normal_call void_type push_optm_beta ( + double _beta + ) + { + this-> + _jjig->_optm_beta = _beta; + } + __normal_call void_type push_optm_zeta ( + double _zeta + ) + { + this-> + _jjig->_optm_zeta = _zeta; + } __normal_call void_type push_optm_qtol ( double _qtol ) diff --git a/external/jigsaw/src/liblib/load_msh_t.hpp b/external/jigsaw/src/liblib/load_msh_t.hpp index 07bd194..027d7f8 100644 --- a/external/jigsaw/src/liblib/load_msh_t.hpp +++ b/external/jigsaw/src/liblib/load_msh_t.hpp @@ -22,12 +22,16 @@ * how they can obtain it for free, then you are not * required to make any arrangement with me.) * - * Disclaimer: Neither I nor: Columbia University, The - * Massachusetts Institute of Technology, The - * University of Sydney, nor The National Aeronautics - * and Space Administration warrant this code in any - * way whatsoever. This code is provided "as-is" to be - * used at your own risk. + * Disclaimer: Neither I nor THE CONTRIBUTORS warrant + * this code in any way whatsoever. This code is + * provided "as-is" to be used at your own risk. + * + * THE CONTRIBUTORS include: + * (a) The University of Sydney + * (b) The Massachusetts Institute of Technology + * (c) Columbia University + * (d) The National Aeronautics & Space Administration + * (e) Los Alamos National Laboratory * -------------------------------------------------------- * diff --git a/external/jigsaw/src/liblib/save_jig_t.hpp b/external/jigsaw/src/liblib/save_jig_t.hpp index 8c51609..7e6ab55 100644 --- a/external/jigsaw/src/liblib/save_jig_t.hpp +++ b/external/jigsaw/src/liblib/save_jig_t.hpp @@ -22,18 +22,22 @@ * how they can obtain it for free, then you are not * required to make any arrangement with me.) * - * Disclaimer: Neither I nor: Columbia University, The - * Massachusetts Institute of Technology, The - * University of Sydney, nor The National Aeronautics - * and Space Administration warrant this code in any - * way whatsoever. This code is provided "as-is" to be - * used at your own risk. + * Disclaimer: Neither I nor THE CONTRIBUTORS warrant + * this code in any way whatsoever. This code is + * provided "as-is" to be used at your own risk. + * + * THE CONTRIBUTORS include: + * (a) The University of Sydney + * (b) The Massachusetts Institute of Technology + * (c) Columbia University + * (d) The National Aeronautics & Space Administration + * (e) Los Alamos National Laboratory * -------------------------------------------------------- * - * Last updated: 16 July, 2020 + * Last updated: 12 Dec., 2022 * - * Copyright 2013-2020 + * Copyright 2013-2022 * Darren Engwirda * d.engwirda@gmail.com * https://github.com/dengwirda/ @@ -85,6 +89,9 @@ _file << "VERBOSITY = " << _jcfg->_verbosity << "\n" ; + _file << "NUMTHREAD = " << + _jcfg->_numthread << "\n" ; + /*--------------------------------- GEOM keywords */ _file << "GEOM_SEED = " << _jcfg->_geom_seed << "\n" ; @@ -196,10 +203,25 @@ _file << "OPTM_KERN = " << "H95+DQDX\n" ; + if (_jcfg->_optm_cost == + JIGSAW_KERN_AREA_LEN) + _file << "OPTM_COST = " + << "AREA-LEN\n" ; + else + if (_jcfg->_optm_cost == + JIGSAW_KERN_SKEW_COS) + _file << "OPTM_COST = " + << "SKEW-COS\n" ; + /*--------------------------------- OPTM keywords */ _file << "OPTM_ITER = " << _jcfg->_optm_iter << "\n" ; + _file << "OPTM_BETA = " << + _jcfg->_optm_beta << "\n" ; + _file << "OPTM_ZETA = " << + _jcfg->_optm_zeta << "\n" ; + _file << "OPTM_QTOL = " << _jcfg->_optm_qtol << "\n" ; _file << "OPTM_QLIM = " << diff --git a/external/jigsaw/src/liblib/save_msh_t.hpp b/external/jigsaw/src/liblib/save_msh_t.hpp index 11a1470..656c90b 100644 --- a/external/jigsaw/src/liblib/save_msh_t.hpp +++ b/external/jigsaw/src/liblib/save_msh_t.hpp @@ -22,16 +22,20 @@ * how they can obtain it for free, then you are not * required to make any arrangement with me.) * - * Disclaimer: Neither I nor: Columbia University, The - * Massachusetts Institute of Technology, The - * University of Sydney, nor The National Aeronautics - * and Space Administration warrant this code in any - * way whatsoever. This code is provided "as-is" to be - * used at your own risk. + * Disclaimer: Neither I nor THE CONTRIBUTORS warrant + * this code in any way whatsoever. This code is + * provided "as-is" to be used at your own risk. + * + * THE CONTRIBUTORS include: + * (a) The University of Sydney + * (b) The Massachusetts Institute of Technology + * (c) Columbia University + * (d) The National Aeronautics & Space Administration + * (e) Los Alamos National Laboratory * -------------------------------------------------------- * - * Last updated: 06 June, 2018 + * Last updated: 06 Jun., 2018 * * Copyright 2013-2018 * Darren Engwirda diff --git a/external/jigsaw/src/marche.hpp b/external/jigsaw/src/marche.hpp index 5cdd02a..9110168 100644 --- a/external/jigsaw/src/marche.hpp +++ b/external/jigsaw/src/marche.hpp @@ -14,9 +14,9 @@ * MARCHE: "fast-marching" eikonal equation solver. -------------------------------------------------------- * - * Last updated: 16 Apr., 2021 + * Last updated: 10 Jun., 2022 * - * Copyright 2013 -- 2021 + * Copyright 2013 -- 2022 * Darren Engwirda * d.engwirda@gmail.com * https://github.com/dengwirda @@ -41,12 +41,16 @@ * how they can obtain it for free, then you are not * required to make any arrangement with me.) * - * Disclaimer: Neither I nor: Columbia University, The - * Massachusetts Institute of Technology, The - * University of Sydney, nor the National Aeronautics - * and Space Administration warrant this code in any - * way whatsoever. This code is provided "as-is" to be - * used at your own risk. + * Disclaimer: Neither I nor THE CONTRIBUTORS warrant + * this code in any way whatsoever. This code is + * provided "as-is" to be used at your own risk. + * + * THE CONTRIBUTORS include: + * (a) The University of Sydney + * (b) The Massachusetts Institute of Technology + * (c) Columbia University + * (d) The National Aeronautics & Space Administration + * (e) Los Alamos National Laboratory * -------------------------------------------------------- */ @@ -96,6 +100,8 @@ hfun_data _ffun ; // FUNC data jcfg_data _jcfg ; + float _xoff[3] = {+0.f} ; // to origin + # ifdef __use_timers typename std ::chrono:: high_resolution_clock::time_point _ttic ; @@ -176,8 +182,15 @@ } if ((_retv = test_hfun ( - _jcfg, - _jlog, _ffun)) != __no_error) + _jcfg, _jlog , + _ffun, false)) != __no_error) + { + return _retv ; + } + + if ((_retv = separator ( + _jcfg, _jlog , + _ffun, _xoff)) != __no_error) { return _retv ; } @@ -199,7 +212,8 @@ _ttic = _time.now(); # endif//__use_timers - _ffun.init_hfun(_jcfg, true) ; + _ffun.init_hfun( + _jcfg, _xoff, true ) ; if (_jcfg._verbosity > 0 ) { @@ -208,8 +222,8 @@ " FFUN data summary...\n\n" ) ; if ((_retv = echo_hfun ( - _jcfg, - _jlog, _ffun)) != __no_error) + _jcfg, _jlog , + _ffun, false)) != __no_error) { return _retv ; } @@ -254,6 +268,7 @@ if ((_retv = save_hfun ( _jcfg, _jlog, + _xoff, _ffun,*_fmsh)) != __no_error) { return _retv ; @@ -281,6 +296,8 @@ { hfun_data _ffun ; // FUNC data + float _xoff[3] = {+0.f} ; // to origin + # ifdef __use_timers typename std ::chrono:: high_resolution_clock::time_point _ttic ; @@ -349,15 +366,10 @@ /*--------------------------------- setup *.JLOG file */ jlog_text _jlog(_jcfg) ; - _jlog.push(MARCHE:: - asciibanner) ; if(!_jcfg._jcfg_file.empty()) { /*--------------------------------- parse *.JCFG file */ - _jlog.push ( - " Reading CFG. file...\n\n" ) ; - # ifdef __use_timers _ttic = _time.now(); # endif//__use_timers @@ -368,6 +380,11 @@ return _retv ; } + _jlog._verbosity = + _jcfg._verbosity ; + + _jlog.push ( MARCHE::asciibanner ) ; + if ((_retv = test_jcfg ( _jcfg, _jlog)) != __no_error) { @@ -408,8 +425,15 @@ } if ((_retv = test_hfun ( - _jcfg, - _jlog, _ffun)) != __no_error) + _jcfg, _jlog , + _ffun, false)) != __no_error) + { + return _retv ; + } + + if ((_retv = separator ( + _jcfg, _jlog , + _ffun, _xoff)) != __no_error) { return _retv ; } @@ -431,7 +455,8 @@ _ttic = _time.now(); # endif//__use_timers - _ffun.init_hfun(_jcfg, true) ; + _ffun.init_hfun( + _jcfg, _xoff, true ) ; if (_jcfg._verbosity > 0 ) { @@ -440,8 +465,8 @@ " FFUN data summary...\n\n" ) ; if ((_retv = echo_hfun ( - _jcfg, - _jlog, _ffun)) != __no_error) + _jcfg, _jlog , + _ffun, false)) != __no_error) { return _retv ; } @@ -485,8 +510,8 @@ # endif//__use_timers if ((_retv = save_hfun ( - _jcfg, - _jlog, _ffun)) != __no_error) + _jcfg, _jlog, + _xoff, _ffun)) != __no_error) { return _retv ; } diff --git a/external/jigsaw/src/msh_copy.hpp b/external/jigsaw/src/msh_copy.hpp index 3dc1e0f..5eeee1f 100644 --- a/external/jigsaw/src/msh_copy.hpp +++ b/external/jigsaw/src/msh_copy.hpp @@ -22,18 +22,22 @@ * how they can obtain it for free, then you are not * required to make any arrangement with me.) * - * Disclaimer: Neither I nor: Columbia University, The - * Massachusetts Institute of Technology, The - * University of Sydney, nor The National Aeronautics - * and Space Administration warrant this code in any - * way whatsoever. This code is provided "as-is" to be - * used at your own risk. + * Disclaimer: Neither I nor THE CONTRIBUTORS warrant + * this code in any way whatsoever. This code is + * provided "as-is" to be used at your own risk. + * + * THE CONTRIBUTORS include: + * (a) The University of Sydney + * (b) The Massachusetts Institute of Technology + * (c) Columbia University + * (d) The National Aeronautics & Space Administration + * (e) Los Alamos National Laboratory * -------------------------------------------------------- * - * Last updated: 19 Apr., 2021 + * Last updated: 18 Jul., 2022 * - * Copyright 2013-2021 + * Copyright 2013-2022 * Darren Engwirda * d.engwirda@gmail.com * https://github.com/dengwirda/ @@ -46,6 +50,192 @@ # ifndef __MSH_COPY__ # define __MSH_COPY__ + template < + typename iptr_list + > + __normal_call void_type sort_node ( + mesh_data &_mesh , + iptr_list &_perm + ) + { + iptr_type static constexpr SIZE = +96 ; + + if (_mesh._ndim == +2 && + _mesh._kind == + jmsh_kind::euclidean_mesh) + { + /*---------------------------------- sort 2-dim. mesh */ + typedef geom_tree::aabb_item_node_k < + real_type, + iptr_type, 2> tree_item ; + + typedef geom_tree::aabb_tree< + tree_item, 2> tree_type ; + + tree_type _tree ; + + containers::array _item ; + containers::array< size_t > _itmp ; + + iptr_type _ipos = +0 ; + for (auto _iter = _mesh. + _euclidean_rdel_2d._tria._nset.head() ; + _iter != _mesh. + _euclidean_rdel_2d._tria._nset.tend() ; + ++_iter, ++_ipos) + { + if (_iter->mark() >= +0 && + _iter->fdim() <= +2 ) // is not isolated + { + _item.push_tail(); + _item.tail()->ipos () = _ipos ; + _item.tail()->pval(0) = + _iter->pval(0) ; + _item.tail()->pval(1) = + _iter->pval(1) ; + } + } + + _tree.load(_item.head(), _item.tend() , + SIZE , // pop.=#nodes per leaf + _tree.median_split , + 1.0) ; // set LONG=1, only div. by pop. + + _tree.dcmp(_itmp, _perm) ; + } + else + if (_mesh._ndim == +3 && + _mesh._kind == + jmsh_kind::euclidean_mesh) + { + /*---------------------------------- sort 3-dim. mesh */ + typedef geom_tree::aabb_item_node_k < + real_type, + iptr_type, 3> tree_item ; + + typedef geom_tree::aabb_tree< + tree_item, 3> tree_type ; + + tree_type _tree ; + + containers::array _item ; + containers::array< size_t > _itmp ; + + iptr_type _ipos = +0 ; + for (auto _iter = _mesh. + _euclidean_rdel_3d._tria._nset.head() ; + _iter != _mesh. + _euclidean_rdel_3d._tria._nset.tend() ; + ++_iter, ++_ipos) + { + if (_iter->mark() >= +0 && + _iter->fdim() <= +3 ) // is not isolated + { + _item.push_tail(); + _item.tail()->ipos () = _ipos ; + _item.tail()->pval(0) = + _iter->pval(0) ; + _item.tail()->pval(1) = + _iter->pval(1) ; + _item.tail()->pval(2) = + _iter->pval(2) ; + } + } + + _tree.load(_item.head(), _item.tend() , + SIZE , // pop.=#nodes per leaf + _tree.median_split , + 1.0) ; // set LONG=1, only div. by pop. + + _tree.dcmp(_itmp, _perm) ; + } + } + + + template < + typename cell_list , + typename iptr_list , + typename cell_perm + > + __normal_call void_type sort_cell ( + cell_list &_cell , + size_t _nsiz , + iptr_list &_nmap , + cell_perm &_perm + ) + { + class sort_pair + { + public : + /*------------------------ tuple for cell re-ordering */ + typename cell_list::item_type * + _cell ; + float _cost ; + + /*------------------------ construct inline from src. */ + __inline_call sort_pair ( + typename cell_list::item_type * + _psrc , + float const&_csrc + ) : + _cell (_psrc), + _cost((float)_csrc) {} + } ; + + class sort_pred + { + public : + /*------------------------ less-than op. for cost-tup */ + __inline_call + bool_type operator () ( + sort_pair const&_idat , + sort_pair const&_jdat + ) const + { return _idat._cost < _jdat._cost ; + } + } ; + + typedef + containers::array sort_list ; + + sort_list _sort ; + for (auto _iter = _cell._lptr.head() ; + _iter != _cell._lptr.tend() ; + ++_iter ) + { + for (auto _item = *_iter ; + _item != nullptr; + _item = _item->_next ) + { + auto _cost = // min. node indx + _nmap[_item->_data._node [0]] ; + for (auto + _inod = _nsiz; _inod-- != 1; ) + { + _cost = std::min(_cost, + _nmap[_item->_data._node[_inod]]) ; + } + + float _cval = (float)_cost; + + _sort.push_tail( + sort_pair(_item, _cval)); + } + } + + algorithms::qsort( _sort.head() , + _sort.tend() , + sort_pred () ) ; + + for (auto _iter = _sort.head() ; + _iter != _sort.tend() ; + ++_iter ) + { + _perm.push_tail( _iter->_cell ) ; + } + } + + /* -------------------------------------------------------- * COPY-MESH: copy rdel-complex to tria-complex. @@ -71,7 +261,9 @@ jmsh_kind::euclidean_mesh) { /*---------------------------------- copy 2-dim. mesh */ - containers::array _nmap ; + containers::array _nmap, _perm; + + sort_node(_mesh, _perm) ; _nmap.set_count(_mesh. _euclidean_rdel_2d._tria._nset.count(), @@ -80,50 +272,48 @@ _mesh._euclidean_mesh_2d._mesh. clear(containers::tight_alloc) ; - iptr_type _npos = +0 ; - for (auto _iter = _mesh. - _euclidean_rdel_2d._tria._nset.head() ; - _iter != _mesh. - _euclidean_rdel_2d._tria._nset.tend() ; - ++_iter, ++_npos) + for (auto _iter = _perm.head() ; + _iter != _perm.tend() ; + ++_iter ) { - if (_iter->mark() >= +0) - { + auto _nptr = _mesh. + _euclidean_rdel_2d._tria._nset.head() + *_iter ; + typename mesh_data:: euclidean_mesh_2d:: mesh_type::node_type _node ; - _node.pval(0) = _iter->pval(0) ; - _node.pval(1) = _iter->pval(1) ; + _node.pval(0) = _nptr->pval(0) ; + _node.pval(1) = _nptr->pval(1) ; - _node.pval(2) = _iter->pval(2) ; + _node.pval(2) = _nptr->pval(2) ; - _node.hidx () = _iter->idxh () ; + _node.hidx () = _nptr->idxh () ; - _node.itag () = _iter->part () ; - _node.fdim () = _iter->fdim () ; - _node.feat () = _iter->feat () ; + _node.itag () = _nptr->part () ; + _node.fdim () = _nptr->fdim () ; + _node.feat () = _nptr->feat () ; - _nmap[_npos] = + _nmap[ *_iter ] = _mesh._euclidean_mesh_2d. _mesh.push_node (_node, false) ; - } } _mesh._euclidean_rdel_2d._tria. clear(containers::tight_alloc) ; - for (auto _iter = _mesh. - _euclidean_rdel_2d._eset._lptr.head() ; - _iter != _mesh. - _euclidean_rdel_2d._eset._lptr.tend() ; + containers::array< + mesh_data::euclidean_rdel_2d:: + edge_list::item_type*> _eprm ; + + sort_cell(_mesh. + _euclidean_rdel_2d._eset, +2, _nmap, _eprm); + + for (auto _iter = _eprm.head() ; + _iter != _eprm.tend() ; ++_iter ) { - if(*_iter != nullptr) - { - for (auto _item = *_iter ; - _item != nullptr; - _item = _item->_next ) - { + auto _item = *_iter ; + typename mesh_data:: euclidean_mesh_2d:: mesh_type::edge_type _face; @@ -137,25 +327,24 @@ _mesh._euclidean_mesh_2d. _mesh.push_edge (_face, false) ; - } - } } _mesh._euclidean_rdel_2d._eset. clear(containers::tight_alloc) ; - for (auto _iter = _mesh. - _euclidean_rdel_2d._tset._lptr.head() ; - _iter != _mesh. - _euclidean_rdel_2d._tset._lptr.tend() ; + containers::array< + mesh_data::euclidean_rdel_2d:: + tria_list::item_type*> _tprm ; + + sort_cell(_mesh. + _euclidean_rdel_2d._tset, +3, _nmap, _tprm); + + for (auto _iter = _tprm.head() ; + _iter != _tprm.tend() ; ++_iter ) { - if(*_iter != nullptr) - { - for (auto _item = *_iter ; - _item != nullptr; - _item = _item->_next ) - { + auto _item = *_iter ; + typename mesh_data:: euclidean_mesh_2d:: mesh_type::tri3_type _face; @@ -171,8 +360,6 @@ _mesh._euclidean_mesh_2d. _mesh.push_tri3 (_face, false) ; - } - } } _mesh._euclidean_rdel_2d._tset. @@ -191,7 +378,9 @@ jmsh_kind::euclidean_mesh) { /*---------------------------------- copy 3-dim. mesh */ - containers::array _nmap ; + containers::array _nmap, _perm; + + sort_node(_mesh, _perm) ; _nmap.set_count(_mesh. _euclidean_rdel_3d._tria._nset.count(), @@ -200,51 +389,49 @@ _mesh._euclidean_mesh_3d._mesh. clear(containers::tight_alloc) ; - iptr_type _npos = +0 ; - for (auto _iter = _mesh. - _euclidean_rdel_3d._tria._nset.head() ; - _iter != _mesh. - _euclidean_rdel_3d._tria._nset.tend() ; - ++_iter, ++_npos) + for (auto _iter = _perm.head() ; + _iter != _perm.tend() ; + ++_iter ) { - if (_iter->mark() >= +0) - { + auto _nptr = _mesh. + _euclidean_rdel_3d._tria._nset.head() + *_iter ; + typename mesh_data:: euclidean_mesh_3d:: mesh_type::node_type _node ; - _node.pval(0) = _iter->pval(0) ; - _node.pval(1) = _iter->pval(1) ; - _node.pval(2) = _iter->pval(2) ; + _node.pval(0) = _nptr->pval(0) ; + _node.pval(1) = _nptr->pval(1) ; + _node.pval(2) = _nptr->pval(2) ; - _node.pval(3) = _iter->pval(3) ; + _node.pval(3) = _nptr->pval(3) ; - _node.hidx () = _iter->idxh () ; + _node.hidx () = _nptr->idxh () ; - _node.itag () = _iter->part () ; - _node.fdim () = _iter->fdim () ; - _node.feat () = _iter->feat () ; + _node.itag () = _nptr->part () ; + _node.fdim () = _nptr->fdim () ; + _node.feat () = _nptr->feat () ; - _nmap[_npos] = + _nmap[ *_iter ] = _mesh._euclidean_mesh_3d. _mesh.push_node (_node, false) ; - } } _mesh._euclidean_rdel_3d._tria. clear(containers::tight_alloc) ; - for (auto _iter = _mesh. - _euclidean_rdel_3d._eset._lptr.head() ; - _iter != _mesh. - _euclidean_rdel_3d._eset._lptr.tend() ; + containers::array< + mesh_data::euclidean_rdel_3d:: + edge_list::item_type*> _eprm ; + + sort_cell(_mesh. + _euclidean_rdel_3d._eset, +2, _nmap, _eprm); + + for (auto _iter = _eprm.head() ; + _iter != _eprm.tend() ; ++_iter ) { - if(*_iter != nullptr) - { - for (auto _item = *_iter ; - _item != nullptr; - _item = _item->_next ) - { + auto _item = *_iter ; + typename mesh_data:: euclidean_mesh_3d:: mesh_type::edge_type _face; @@ -258,25 +445,24 @@ _mesh._euclidean_mesh_3d. _mesh.push_edge (_face, false) ; - } - } } _mesh._euclidean_rdel_3d._eset. clear(containers::tight_alloc) ; - for (auto _iter = _mesh. - _euclidean_rdel_3d._fset._lptr.head() ; - _iter != _mesh. - _euclidean_rdel_3d._fset._lptr.tend() ; + containers::array< + mesh_data::euclidean_rdel_3d:: + face_list::item_type*> _fprm ; + + sort_cell(_mesh. + _euclidean_rdel_3d._fset, +3, _nmap, _fprm); + + for (auto _iter = _fprm.head() ; + _iter != _fprm.tend() ; ++_iter ) { - if(*_iter != nullptr) - { - for (auto _item = *_iter ; - _item != nullptr; - _item = _item->_next ) - { + auto _item = *_iter ; + typename mesh_data:: euclidean_mesh_3d:: mesh_type::tri3_type _face; @@ -292,25 +478,24 @@ _mesh._euclidean_mesh_3d. _mesh.push_tri3 (_face, false) ; - } - } } _mesh._euclidean_rdel_3d._fset. clear(containers::tight_alloc) ; - for (auto _iter = _mesh. - _euclidean_rdel_3d._tset._lptr.head() ; - _iter != _mesh. - _euclidean_rdel_3d._tset._lptr.tend() ; + containers::array< + mesh_data::euclidean_rdel_3d:: + tria_list::item_type*> _tprm ; + + sort_cell(_mesh. + _euclidean_rdel_3d._tset, +4, _nmap, _tprm); + + for (auto _iter = _tprm.head() ; + _iter != _tprm.tend() ; ++_iter ) { - if(*_iter != nullptr) - { - for (auto _item = *_iter ; - _item != nullptr; - _item = _item->_next ) - { + auto _item = *_iter ; + typename mesh_data:: euclidean_mesh_3d:: mesh_type::tri4_type _face; @@ -328,8 +513,6 @@ _mesh._euclidean_mesh_3d. _mesh.push_tri4 (_face, false) ; - } - } } _mesh._euclidean_rdel_3d._tset. diff --git a/external/jigsaw/src/msh_init.hpp b/external/jigsaw/src/msh_init.hpp index 685a4cd..bdfb17c 100644 --- a/external/jigsaw/src/msh_init.hpp +++ b/external/jigsaw/src/msh_init.hpp @@ -22,16 +22,20 @@ * how they can obtain it for free, then you are not * required to make any arrangement with me.) * - * Disclaimer: Neither I nor: Columbia University, The - * Massachusetts Institute of Technology, The - * University of Sydney, nor The National Aeronautics - * and Space Administration warrant this code in any - * way whatsoever. This code is provided "as-is" to be - * used at your own risk. + * Disclaimer: Neither I nor THE CONTRIBUTORS warrant + * this code in any way whatsoever. This code is + * provided "as-is" to be used at your own risk. + * + * THE CONTRIBUTORS include: + * (a) The University of Sydney + * (b) The Massachusetts Institute of Technology + * (c) Columbia University + * (d) The National Aeronautics & Space Administration + * (e) Los Alamos National Laboratory * -------------------------------------------------------- * - * Last updated: 27 July, 2020 + * Last updated: 27 Jul., 2020 * * Copyright 2013-2020 * Darren Engwirda diff --git a/external/jigsaw/src/msh_read.hpp b/external/jigsaw/src/msh_read.hpp index 304e0a7..b475efb 100644 --- a/external/jigsaw/src/msh_read.hpp +++ b/external/jigsaw/src/msh_read.hpp @@ -22,12 +22,16 @@ * how they can obtain it for free, then you are not * required to make any arrangement with me.) * - * Disclaimer: Neither I nor: Columbia University, The - * Massachusetts Institute of Technology, The - * University of Sydney, nor The National Aeronautics - * and Space Administration warrant this code in any - * way whatsoever. This code is provided "as-is" to be - * used at your own risk. + * Disclaimer: Neither I nor THE CONTRIBUTORS warrant + * this code in any way whatsoever. This code is + * provided "as-is" to be used at your own risk. + * + * THE CONTRIBUTORS include: + * (a) The University of Sydney + * (b) The Massachusetts Institute of Technology + * (c) Columbia University + * (d) The National Aeronautics & Space Administration + * (e) Los Alamos National Laboratory * -------------------------------------------------------- * diff --git a/external/jigsaw/src/msh_save.hpp b/external/jigsaw/src/msh_save.hpp index 6d2dd61..51a4b0f 100644 --- a/external/jigsaw/src/msh_save.hpp +++ b/external/jigsaw/src/msh_save.hpp @@ -22,18 +22,22 @@ * how they can obtain it for free, then you are not * required to make any arrangement with me.) * - * Disclaimer: Neither I nor: Columbia University, The - * Massachusetts Institute of Technology, The - * University of Sydney, nor The National Aeronautics - * and Space Administration warrant this code in any - * way whatsoever. This code is provided "as-is" to be - * used at your own risk. + * Disclaimer: Neither I nor THE CONTRIBUTORS warrant + * this code in any way whatsoever. This code is + * provided "as-is" to be used at your own risk. + * + * THE CONTRIBUTORS include: + * (a) The University of Sydney + * (b) The Massachusetts Institute of Technology + * (c) Columbia University + * (d) The National Aeronautics & Space Administration + * (e) Los Alamos National Laboratory * -------------------------------------------------------- * - * Last updated: 24 Feb., 2021 + * Last updated: 28 May, 2022 * - * Copyright 2013-2021 + * Copyright 2013-2022 * Darren Engwirda * d.engwirda@gmail.com * https://github.com/dengwirda/ @@ -46,6 +50,9 @@ # ifndef __MSH_SAVE__ # define __MSH_SAVE__ + class mshfile_tag {} ; + class _netcdf_tag {} ; + /* -------------------------------------------------------- * for C-style sprintf to C++ stream. @@ -88,3497 +95,14 @@ /* -------------------------------------------------------- - * SAVE-RDEL: save *.MSH output file. - -------------------------------------------------------- - */ - - template < - typename jlog_data - > - __normal_call iptr_type save_rdel ( - jcfg_data &_jcfg , - jlog_data &_jlog , - mesh_data &_rdel - ) - { - iptr_type _errv = __no_error ; - - __unreferenced(_jlog) ; - - try - { - containers::array _nmap; - - std::string _path, _name, _fext; - file_part( - _jcfg._mesh_file, _path, _name, _fext) ; - - std::ofstream _file; - _file.open( - _jcfg._mesh_file, - std::ofstream::out | std::ofstream::trunc) ; - - if (_file.is_open()) - { - if (_rdel._ndim == +2 && - _rdel._kind == - jmsh_kind::euclidean_mesh) - { - /*-------------------------- save 2-dim. mesh */ - _file << "# " << _name << ".msh" - << "; created by " ; - _file << __JGSWVSTR "\n" ; - _file << "MSHID=2;EUCLIDEAN-MESH \n" ; - _file << "NDIMS=2 \n" ; - - /*------------ index mapping for active nodes */ - _nmap.set_count(_rdel. - _euclidean_rdel_2d._tria._nset.count() , - containers::tight_alloc , -1); - - for (auto _iter = _rdel. - _euclidean_rdel_2d._eset._lptr.head(); - _iter != _rdel. - _euclidean_rdel_2d._eset._lptr.tend(); - ++_iter ) - { - if ( *_iter == nullptr) continue ; - - for (auto _item = *_iter ; - _item != nullptr; - _item = _item->_next ) - { - _nmap[_item-> - _data._node[0]] = 1 ; - _nmap[_item-> - _data._node[1]] = 1 ; - } - } - - for (auto _iter = _rdel. - _euclidean_rdel_2d._tset._lptr.head(); - _iter != _rdel. - _euclidean_rdel_2d._tset._lptr.tend(); - ++_iter ) - { - if ( *_iter == nullptr) continue ; - - for (auto _item = *_iter ; - _item != nullptr; - _item = _item->_next ) - { - _nmap[_item-> - _data._node[0]] = 1 ; - _nmap[_item-> - _data._node[1]] = 1 ; - _nmap[_item-> - _data._node[2]] = 1 ; - } - } - - iptr_type _last = +0; - for (auto _iter = _nmap.head() ; - _iter != _nmap.tend() ; - ++_iter ) - { - if ( *_iter >= +0) - { - *_iter = _last ++ ; - } - } - - if (_rdel._euclidean_rdel_2d. - _tria._nset.count() > 0) - { - /*-------------------------- write POINT data */ - _file << "POINT=" << _last << "\n" ; - - auto _next = +0, _roll = +0, - _npos = +0; - char _fbuf[PRINTCHUNK] ; - - for (auto _iter = _rdel. - _euclidean_rdel_2d._tria._nset.head(); - _iter != _rdel. - _euclidean_rdel_2d._tria._nset.tend(); - ++_iter, ++_npos) - { - if (_iter->mark() >= 0 && - _nmap[_npos ] >= 0) - { - PRINTCHARS(snprintf(&_fbuf[_next], - PRINTCHUNK, - "%.17g;%.17g;%d\n", - _iter->pval(0) , - _iter->pval(1) , - _iter->part()) , VERT2CHUNK ) - } - } - PRINTFINAL; - } - - if (_jcfg._iter_opts.dual() ) - { - if (_rdel._euclidean_rdel_2d. - _tria._nset.count() > 0) - { - /*-------------------------- write POWER data */ - _file << "POWER=" - << _last << ";1" << "\n" ; - - auto _next = +0, _roll = +0, - _npos = +0; - char _fbuf[PRINTCHUNK] ; - - for (auto _iter = _rdel. - _euclidean_rdel_2d._tria._nset.head(); - _iter != _rdel. - _euclidean_rdel_2d._tria._nset.tend(); - ++_iter, ++_npos) - { - if (_iter->mark() >= 0 && - _nmap[_npos ] >= 0) - { - PRINTCHARS(snprintf(&_fbuf[_next], - PRINTCHUNK, "%.17g\n" , - _iter->pval(2) ), VALUECHUNK) - } - } - PRINTFINAL; - } - } - - if (_rdel._euclidean_rdel_2d. - _eset.count() > +0) - { - /*-------------------------- write EDGE2 data */ - _file << "EDGE2=" << - _rdel._euclidean_rdel_2d. - _eset.count() << "\n" ; - - auto _next = +0, _roll = +0; - char _fbuf[PRINTCHUNK] ; - - for (auto _iter = _rdel. - _euclidean_rdel_2d._eset._lptr.head(); - _iter != _rdel. - _euclidean_rdel_2d._eset._lptr.tend(); - ++_iter ) - { - if ( *_iter == nullptr) continue ; - - for (auto _item = *_iter ; - _item != nullptr; - _item = _item->_next ) - { - PRINTCHARS(snprintf(&_fbuf[_next], - PRINTCHUNK, "%u;%u;%d\n", - _nmap[_item->_data._node[0]], - _nmap[_item->_data._node[1]], - _item->_data._part ), EDGE2CHUNK) - } - } - PRINTFINAL; - } - - if (_rdel._euclidean_rdel_2d. - _tset.count() > +0) - { - /*-------------------------- write TRIA3 data */ - _file << "TRIA3=" << - _rdel._euclidean_rdel_2d. - _tset.count() << "\n" ; - - auto _next = +0, _roll = +0; - char _fbuf[PRINTCHUNK] ; - - for (auto _iter = _rdel. - _euclidean_rdel_2d._tset._lptr.head(); - _iter != _rdel. - _euclidean_rdel_2d._tset._lptr.tend(); - ++_iter ) - { - if ( *_iter == nullptr) continue ; - - for (auto _item = *_iter ; - _item != nullptr; - _item = _item->_next ) - { - PRINTCHARS(snprintf(&_fbuf[_next], - PRINTCHUNK, "%u;%u;%u;%d\n", - _nmap[_item->_data._node[0]], - _nmap[_item->_data._node[1]], - _nmap[_item->_data._node[2]], - _item->_data._part ), TRIA3CHUNK) - } - } - PRINTFINAL; - } - - } - else - if (_rdel._ndim == +3 && - _rdel._kind == - jmsh_kind::euclidean_mesh) - { - /*-------------------------- save 3-dim. mesh */ - _file << "# " << _name << ".msh" - << "; created by " ; - _file << __JGSWVSTR "\n" ; - _file << "MSHID=2;EUCLIDEAN-MESH \n" ; - _file << "NDIMS=3 \n" ; - - /*------------ index mapping for active nodes */ - _nmap.set_count(_rdel. - _euclidean_rdel_3d._tria._nset.count() , - containers::tight_alloc, -1) ; - - for (auto _iter = _rdel. - _euclidean_rdel_3d._eset._lptr.head(); - _iter != _rdel. - _euclidean_rdel_3d._eset._lptr.tend(); - ++_iter ) - { - if ( *_iter == nullptr) continue ; - - for (auto _item = *_iter ; - _item != nullptr; - _item = _item->_next ) - { - _nmap[_item-> - _data._node[0]] = 1 ; - _nmap[_item-> - _data._node[1]] = 1 ; - } - } - - for (auto _iter = _rdel. - _euclidean_rdel_3d._fset._lptr.head(); - _iter != _rdel. - _euclidean_rdel_3d._fset._lptr.tend(); - ++_iter ) - { - if ( *_iter == nullptr) continue ; - - for (auto _item = *_iter ; - _item != nullptr; - _item = _item->_next ) - { - _nmap[_item-> - _data._node[0]] = 1 ; - _nmap[_item-> - _data._node[1]] = 1 ; - _nmap[_item-> - _data._node[2]] = 1 ; - } - } - - for (auto _iter = _rdel. - _euclidean_rdel_3d._tset._lptr.head(); - _iter != _rdel. - _euclidean_rdel_3d._tset._lptr.tend(); - ++_iter ) - { - if ( *_iter == nullptr) continue ; - - for (auto _item = *_iter ; - _item != nullptr; - _item = _item->_next ) - { - _nmap[_item-> - _data._node[0]] = 1 ; - _nmap[_item-> - _data._node[1]] = 1 ; - _nmap[_item-> - _data._node[2]] = 1 ; - _nmap[_item-> - _data._node[3]] = 1 ; - } - } - - iptr_type _last = +0; - for (auto _iter = _nmap.head() ; - _iter != _nmap.tend() ; - ++_iter ) - { - if ( *_iter >= +0) - { - *_iter = _last ++ ; - } - } - - if (_rdel._euclidean_rdel_3d. - _tria._nset.count() > 0) - { - /*-------------------------- write POINT data */ - _file << "POINT=" << _last << "\n" ; - - auto _next = +0, _roll = +0, - _npos = +0; - char _fbuf[PRINTCHUNK] ; - - for (auto _iter = _rdel. - _euclidean_rdel_3d._tria._nset.head(); - _iter != _rdel. - _euclidean_rdel_3d._tria._nset.tend(); - ++_iter, ++_npos) - { - if (_iter->mark() >= 0 && - _nmap[_npos ] >= 0) - { - PRINTCHARS(snprintf(&_fbuf[_next], - PRINTCHUNK, - "%.17g;%.17g;%.17g;%d\n", - _iter->pval(0) , - _iter->pval(1) , - _iter->pval(2) , - _iter->part()) , VERT3CHUNK ) - } - } - PRINTFINAL; - } - - if (_jcfg._iter_opts.dual() ) - { - if (_rdel._euclidean_rdel_3d. - _tria._nset.count() > 0) - { - /*-------------------------- write POWER data */ - _file << "POWER=" - << _last << ";1" << "\n" ; - - auto _next = +0, _roll = +0, - _npos = +0; - char _fbuf[PRINTCHUNK] ; - - for (auto _iter = _rdel. - _euclidean_rdel_3d._tria._nset.head(); - _iter != _rdel. - _euclidean_rdel_3d._tria._nset.tend(); - ++_iter, ++_npos) - { - if (_iter->mark() >= 0 && - _nmap[_npos ] >= 0) - { - PRINTCHARS(snprintf(&_fbuf[_next], - PRINTCHUNK, "%.17g\n" , - _iter->pval(3) ), VALUECHUNK) - } - } - PRINTFINAL; - } - } - - if (_rdel._euclidean_rdel_3d. - _eset.count() > +0) - { - /*-------------------------- write EDGE2 data */ - _file << "EDGE2=" << - _rdel._euclidean_rdel_3d. - _eset.count() << "\n" ; - - auto _next = +0, _roll = +0; - char _fbuf[PRINTCHUNK] ; - - for (auto _iter = _rdel. - _euclidean_rdel_3d._eset._lptr.head(); - _iter != _rdel. - _euclidean_rdel_3d._eset._lptr.tend(); - ++_iter ) - { - if ( *_iter == nullptr) continue ; - - for (auto _item = *_iter ; - _item != nullptr; - _item = _item->_next ) - { - PRINTCHARS(snprintf(&_fbuf[_next], - PRINTCHUNK, "%u;%u;%d\n", - _nmap[_item->_data._node[0]], - _nmap[_item->_data._node[1]], - _item->_data._part ), EDGE2CHUNK) - } - } - PRINTFINAL; - } - - if (_rdel._euclidean_rdel_3d. - _fset.count() > +0) - { - /*-------------------------- write TRIA3 data */ - _file << "TRIA3=" << - _rdel._euclidean_rdel_3d. - _fset.count() << "\n" ; - - auto _next = +0, _roll = +0; - char _fbuf[PRINTCHUNK] ; - - for (auto _iter = _rdel. - _euclidean_rdel_3d._fset._lptr.head(); - _iter != _rdel. - _euclidean_rdel_3d._fset._lptr.tend(); - ++_iter ) - { - if ( *_iter == nullptr) continue ; - - for (auto _item = *_iter ; - _item != nullptr; - _item = _item->_next ) - { - PRINTCHARS(snprintf(&_fbuf[_next], - PRINTCHUNK, "%u;%u;%u;%d\n", - _nmap[_item->_data._node[0]], - _nmap[_item->_data._node[1]], - _nmap[_item->_data._node[2]], - _item->_data._part ), TRIA3CHUNK) - } - } - PRINTFINAL; - } - - if (_rdel._euclidean_rdel_3d. - _tset.count() > +0) - { - /*-------------------------- write TRIA4 data */ - _file << "TRIA4=" << - _rdel._euclidean_rdel_3d. - _tset.count() << "\n" ; - - auto _next = +0, _roll = +0; - char _fbuf[PRINTCHUNK] ; - - for (auto _iter = _rdel. - _euclidean_rdel_3d._tset._lptr.head(); - _iter != _rdel. - _euclidean_rdel_3d._tset._lptr.tend(); - ++_iter ) - { - if ( *_iter == nullptr) continue ; - - for (auto _item = *_iter ; - _item != nullptr; - _item = _item->_next ) - { - PRINTCHARS(snprintf(&_fbuf[_next], - PRINTCHUNK, - "%u;%u;%u;%u;%d\n", - _nmap[_item->_data._node[0]], - _nmap[_item->_data._node[1]], - _nmap[_item->_data._node[2]], - _nmap[_item->_data._node[3]], - _item->_data._part ), TRIA4CHUNK) - } - } - PRINTFINAL; - } - - } - - } - else - { - _errv = __file_not_created ; - } - - _file.close(); - - } - catch (...) - { - _errv = __unknown_error ; - } - - return ( _errv ) ; - } - - /* - -------------------------------------------------------- - * SAVE-RDEL: save MSH_t output data. - -------------------------------------------------------- - */ - - template < - typename jlog_data - > - __normal_call iptr_type save_rdel ( - jcfg_data &_jcfg , - jlog_data &_jlog , - mesh_data &_rdel , - jigsaw_msh_t &_mmsh - ) - { - iptr_type _errv = __no_error ; - - try - { - containers::array _nmap; - - __unreferenced (_jlog) ; - __unreferenced (_jcfg) ; - - if (_rdel._ndim == +2 && // save 2-dim. mesh - _rdel._kind == - jmsh_kind::euclidean_mesh) - { - _mmsh._flags = JIGSAW_EUCLIDEAN_MESH ; - - /*------------ index mapping for active nodes */ - _nmap.set_count(_rdel. - _euclidean_rdel_2d._tria._nset.count() , - containers::tight_alloc, -1) ; - - for (auto _iter = _rdel. - _euclidean_rdel_2d._eset._lptr.head(); - _iter != _rdel. - _euclidean_rdel_2d._eset._lptr.tend(); - ++_iter ) - { - if ( *_iter == nullptr) continue ; - - for (auto _item = *_iter ; - _item != nullptr; - _item = _item->_next ) - { - _nmap[_item->_data._node[0]]=1 ; - _nmap[_item->_data._node[1]]=1 ; - } - } - - for (auto _iter = _rdel. - _euclidean_rdel_2d._tset._lptr.head(); - _iter != _rdel. - _euclidean_rdel_2d._tset._lptr.tend(); - ++_iter ) - { - if ( *_iter == nullptr) continue ; - - for (auto _item = *_iter ; - _item != nullptr; - _item = _item->_next ) - { - _nmap[_item->_data._node[0]]=1 ; - _nmap[_item->_data._node[1]]=1 ; - _nmap[_item->_data._node[2]]=1 ; - } - } - - iptr_type _last = +0; - for (auto _iter = _nmap.head() ; - _iter != _nmap.tend() ; - ++_iter ) - { - if ( *_iter >= +0) - { - *_iter = _last ++ ; - } - } - - if (_rdel._euclidean_rdel_2d. - _tria._nset.count() > 0) - { - /*-------------------------- write POINT data */ - jigsaw_alloc_vert2 ( - &_mmsh._vert2, _last) ; - - jigsaw_alloc_reals ( - &_mmsh._power, _last) ; - - iptr_type _npos = +0 ; - iptr_type _nout = +0 ; - for (auto _iter = _rdel. - _euclidean_rdel_2d._tria._nset.head(); - _iter != _rdel. - _euclidean_rdel_2d._tria._nset.tend(); - ++_iter, ++_npos) - { - if (_iter->mark() >= 0 && - _nmap[_npos ] >= 0 ) - { - _mmsh._vert2._data[_nout]. - _ppos[0] = _iter->pval(0) ; - _mmsh._vert2._data[_nout]. - _ppos[1] = _iter->pval(1) ; - - _mmsh._vert2._data[_nout]. - _itag = _iter->part () ; - - _mmsh._power. - _data[_nout] = _iter->pval(2) ; - - _nout = _nout + 1 ; - } - } - - _rdel._euclidean_rdel_2d._tria. - clear(containers::tight_alloc); - - } - - if (_rdel._euclidean_rdel_2d. - _eset.count() > +0) - { - /*-------------------------- write EDGE2 data */ - jigsaw_alloc_edge2 ( - &_mmsh._edge2,_rdel. - _euclidean_rdel_2d._eset.count()) ; - - iptr_type _eout = +0 ; - for (auto _iter = _rdel. - _euclidean_rdel_2d._eset._lptr.head(); - _iter != _rdel. - _euclidean_rdel_2d._eset._lptr.tend(); - ++_iter ) - { - if ( *_iter == nullptr) continue ; - - for (auto _item = *_iter ; - _item != nullptr; - _item = _item->_next ) - { - _mmsh._edge2._data[_eout]. - _node[0] = - _nmap[_item->_data._node[0]] ; - _mmsh._edge2._data[_eout]. - _node[1] = - _nmap[_item->_data._node[1]] ; - - _mmsh._edge2._data[_eout]. - _itag = _item->_data._part ; - - _eout = _eout + 1 ; - } - } - - _rdel._euclidean_rdel_2d._eset. - clear(containers::tight_alloc) ; - - } - - if (_rdel._euclidean_rdel_2d. - _tset.count() > +0) - { - /*-------------------------- write TRIA3 data */ - jigsaw_alloc_tria3 ( - &_mmsh._tria3,_rdel. - _euclidean_rdel_2d._tset.count()) ; - - iptr_type _tout = +0 ; - for (auto _iter = _rdel. - _euclidean_rdel_2d._tset._lptr.head(); - _iter != _rdel. - _euclidean_rdel_2d._tset._lptr.tend(); - ++_iter ) - { - if ( *_iter == nullptr) continue ; - - for (auto _item = *_iter ; - _item != nullptr; - _item = _item->_next ) - { - _mmsh._tria3._data[_tout]. - _node[0] = - _nmap[_item->_data._node[0]] ; - _mmsh._tria3._data[_tout]. - _node[1] = - _nmap[_item->_data._node[1]] ; - _mmsh._tria3._data[_tout]. - _node[2] = - _nmap[_item->_data._node[2]] ; - - _mmsh._tria3._data[_tout]. - _itag = _item->_data._part ; - - _tout = _tout + 1 ; - } - } - - _rdel._euclidean_rdel_2d._tset. - clear(containers::tight_alloc) ; - - } - - } - else - if (_rdel._ndim == +3 && // save 3-dim. mesh - _rdel._kind == - jmsh_kind::euclidean_mesh) - { - _mmsh._flags = JIGSAW_EUCLIDEAN_MESH ; - - /*------------ index mapping for active nodes */ - _nmap.set_count(_rdel. - _euclidean_rdel_3d._tria._nset.count() , - containers::tight_alloc, -1) ; - - for (auto _iter = _rdel. - _euclidean_rdel_3d._eset._lptr.head(); - _iter != _rdel. - _euclidean_rdel_3d._eset._lptr.tend(); - ++_iter ) - { - if ( *_iter == nullptr) continue ; - - for (auto _item = *_iter ; - _item != nullptr; - _item = _item->_next ) - { - _nmap[_item->_data._node[0]]=1 ; - _nmap[_item->_data._node[1]]=1 ; - } - } - - for (auto _iter = _rdel. - _euclidean_rdel_3d._fset._lptr.head(); - _iter != _rdel. - _euclidean_rdel_3d._fset._lptr.tend(); - ++_iter ) - { - if ( *_iter == nullptr) continue ; - - for (auto _item = *_iter ; - _item != nullptr; - _item = _item->_next ) - { - _nmap[_item->_data._node[0]]=1 ; - _nmap[_item->_data._node[1]]=1 ; - _nmap[_item->_data._node[2]]=1 ; - } - } - - for (auto _iter = _rdel. - _euclidean_rdel_3d._tset._lptr.head(); - _iter != _rdel. - _euclidean_rdel_3d._tset._lptr.tend(); - ++_iter ) - { - if ( *_iter == nullptr) continue ; - - for (auto _item = *_iter ; - _item != nullptr; - _item = _item->_next ) - { - _nmap[_item->_data._node[0]]=1 ; - _nmap[_item->_data._node[1]]=1 ; - _nmap[_item->_data._node[2]]=1 ; - _nmap[_item->_data._node[3]]=1 ; - } - } - - iptr_type _last = +0; - for (auto _iter = _nmap.head() ; - _iter != _nmap.tend() ; - ++_iter ) - { - if ( *_iter >= +0) - { - *_iter = _last ++ ; - } - } - - if (_rdel._euclidean_rdel_3d. - _tria._nset.count() > 0) - { - /*-------------------------- write POINT data */ - jigsaw_alloc_vert3 ( - &_mmsh._vert3 , _last); - - jigsaw_alloc_reals ( - &_mmsh._power , _last); - - iptr_type _npos = +0 ; - iptr_type _nout = +0 ; - for (auto _iter = _rdel. - _euclidean_rdel_3d._tria._nset.head(); - _iter != _rdel. - _euclidean_rdel_3d._tria._nset.tend(); - ++_iter, ++_npos) - { - if (_iter->mark() >= 0 && - _nmap[_npos ] >= 0 ) - { - _mmsh._vert3._data[_nout]. - _ppos[0] = _iter->pval(0) ; - _mmsh._vert3._data[_nout]. - _ppos[1] = _iter->pval(1) ; - _mmsh._vert3._data[_nout]. - _ppos[2] = _iter->pval(2) ; - - _mmsh._vert3._data[_nout]. - _itag = _iter->part () ; - - _mmsh._power. - _data[_nout] = _iter->pval(3) ; - - _nout = _nout + 1 ; - } - } - - _rdel._euclidean_rdel_3d._tria. - clear(containers::tight_alloc); - - } - - if (_rdel._euclidean_rdel_3d. - _eset.count() > +0) - { - /*-------------------------- write EDGE2 data */ - jigsaw_alloc_edge2 ( - &_mmsh._edge2,_rdel. - _euclidean_rdel_3d._eset.count()) ; - - iptr_type _eout = +0 ; - for (auto _iter = _rdel. - _euclidean_rdel_3d._eset._lptr.head(); - _iter != _rdel. - _euclidean_rdel_3d._eset._lptr.tend(); - ++_iter ) - { - if ( *_iter == nullptr) continue ; - - for (auto _item = *_iter ; - _item != nullptr; - _item = _item->_next ) - { - _mmsh._edge2._data[_eout]. - _node[0] = - _nmap[_item->_data._node[0]] ; - _mmsh._edge2._data[_eout]. - _node[1] = - _nmap[_item->_data._node[1]] ; - - _mmsh._edge2._data[_eout]. - _itag = _item->_data._part ; - - _eout = _eout + 1 ; - } - } - - _rdel._euclidean_rdel_3d._eset. - clear(containers::tight_alloc) ; - - } - - if (_rdel._euclidean_rdel_3d. - _fset.count() > +0) - { - /*-------------------------- write TRIA3 data */ - jigsaw_alloc_tria3 ( - &_mmsh._tria3,_rdel. - _euclidean_rdel_3d._fset.count()) ; - - iptr_type _fout = +0 ; - for (auto _iter = _rdel. - _euclidean_rdel_3d._fset._lptr.head(); - _iter != _rdel. - _euclidean_rdel_3d._fset._lptr.tend(); - ++_iter ) - { - if ( *_iter == nullptr) continue ; - - for (auto _item = *_iter ; - _item != nullptr; - _item = _item->_next ) - { - _mmsh._tria3._data[_fout]. - _node[0] = - _nmap[_item->_data._node[0]] ; - _mmsh._tria3._data[_fout]. - _node[1] = - _nmap[_item->_data._node[1]] ; - _mmsh._tria3._data[_fout]. - _node[2] = - _nmap[_item->_data._node[2]] ; - - _mmsh._tria3._data[_fout]. - _itag = _item->_data._part ; - - _fout = _fout + 1 ; - } - } - - _rdel._euclidean_rdel_3d._fset. - clear(containers::tight_alloc) ; - - } - - if (_rdel._euclidean_rdel_3d. - _tset.count() > +0) - { - /*-------------------------- write TRIA4 data */ - jigsaw_alloc_tria4 ( - &_mmsh._tria4,_rdel. - _euclidean_rdel_3d._tset.count()) ; - - iptr_type _tout = +0 ; - for (auto _iter = _rdel. - _euclidean_rdel_3d._tset._lptr.head(); - _iter != _rdel. - _euclidean_rdel_3d._tset._lptr.tend(); - ++_iter ) - { - if ( *_iter == nullptr) continue ; - - for (auto _item = *_iter ; - _item != nullptr; - _item = _item->_next ) - { - _mmsh._tria4._data[_tout]. - _node[0] = - _nmap[_item->_data._node[0]] ; - _mmsh._tria4._data[_tout]. - _node[1] = - _nmap[_item->_data._node[1]] ; - _mmsh._tria4._data[_tout]. - _node[2] = - _nmap[_item->_data._node[2]] ; - _mmsh._tria4._data[_tout]. - _node[3] = - _nmap[_item->_data._node[3]] ; - - _mmsh._tria4._data[_tout]. - _itag = _item->_data._part ; - - _tout = _tout + 1 ; - } - } - - _rdel._euclidean_rdel_3d._tset. - clear(containers::tight_alloc) ; - - } - - } - - } - catch (...) - { - _errv = __unknown_error ; - } - - return ( _errv ) ; - } - - /* - -------------------------------------------------------- - * SAVE-TRIA: save *.MSH output file. - -------------------------------------------------------- - */ - - template < - typename jlog_data - > - __normal_call iptr_type save_tria ( - jcfg_data &_jcfg , - jlog_data &_jlog , - mesh_data &_rdel - ) - { - iptr_type _errv = __no_error ; - - __unreferenced(_jlog) ; - - try - { - containers::array _nmap; - - std::string _path, _name, _fext; - file_part( - _jcfg._tria_file, _path, _name, _fext) ; - - std::ofstream _file; - _file.open( - _jcfg._tria_file, - std::ofstream::out | std::ofstream::trunc) ; - - if (_file.is_open()) - { - if (_rdel._ndim == +2 && - _rdel._kind == - jmsh_kind::euclidean_mesh) - { - /*-------------------------- save 2-dim. mesh */ - _file << "# " << _name << ".msh" - << "; created by " ; - _file << __JGSWVSTR "\n" ; - _file << "MSHID=2;EUCLIDEAN-MESH \n" ; - _file << "NDIMS=2 \n" ; - - /*------------ index mapping for active nodes */ - _nmap.set_count(_rdel. - _euclidean_rdel_2d._tria._nset.count() , - containers::tight_alloc, -1) ; - - iptr_type _ntri = +0; - for (auto _iter = _rdel. - _euclidean_rdel_2d._tria._tset.head(); - _iter != _rdel. - _euclidean_rdel_2d._tria._tset.tend(); - ++_iter ) - { - if (_iter->mark() < +0) continue ; - - _ntri += +1 ; - - _nmap[_iter->node(0)]=1; - _nmap[_iter->node(1)]=1; - _nmap[_iter->node(2)]=1; - } - - iptr_type _last = +0; - for (auto _iter = _nmap.head() ; - _iter != _nmap.tend() ; - ++_iter ) - { - if ( *_iter >= +0) - { - *_iter = _last ++ ; - } - } - - if (_rdel._euclidean_rdel_2d. - _tria._nset.count() > 0) - { - /*-------------------------- write POINT data */ - _file << "POINT=" << _last << "\n" ; - - auto _next = +0, _roll = +0, - _npos = +0; - char _fbuf[PRINTCHUNK] ; - - for (auto _iter = _rdel. - _euclidean_rdel_2d._tria._nset.head(); - _iter != _rdel. - _euclidean_rdel_2d._tria._nset.tend(); - ++_iter, ++_npos) - { - if (_iter->mark() >= 0 && - _nmap[_npos ] >= 0) - { - PRINTCHARS(snprintf(&_fbuf[_next], - PRINTCHUNK, - "%.17g;%.17g;+0\n", - _iter->pval(0) , - _iter->pval(1) ), VERT2CHUNK) - } - } - PRINTFINAL; - } - - if (_rdel._euclidean_rdel_2d. - _tria._tset.count() > 0) - { - /*-------------------------- write TRIA3 data */ - _file << "TRIA3=" << _ntri << "\n" ; - - auto _next = +0, _roll = +0; - char _fbuf[PRINTCHUNK] ; - - for (auto _iter = _rdel. - _euclidean_rdel_2d._tria._tset.head(); - _iter != _rdel. - _euclidean_rdel_2d._tria._tset.tend(); - ++_iter ) - { - if (_iter->mark() < +0) continue ; - - PRINTCHARS(snprintf(&_fbuf[_next], - PRINTCHUNK, "%u;%u;%u;+0\n", - _nmap[_iter->node(0)] , - _nmap[_iter->node(1)] , - _nmap[_iter->node(2)]),TRIA3CHUNK) - } - PRINTFINAL; - } - - } - else - if (_rdel._ndim == +3 && - _rdel._kind == - jmsh_kind::euclidean_mesh) - { - /*-------------------------- save 3-dim. mesh */ - _file << "# " << _name << ".msh" - << "; created by " ; - _file << __JGSWVSTR "\n" ; - _file << "MSHID=2;EUCLIDEAN-MESH \n" ; - _file << "NDIMS=3 \n" ; - - /*------------ index mapping for active nodes */ - _nmap.set_count(_rdel. - _euclidean_rdel_3d._tria._nset.count() , - containers::tight_alloc, -1) ; - - iptr_type _ntri = +0; - for (auto _iter = _rdel. - _euclidean_rdel_3d._tria._tset.head(); - _iter != _rdel. - _euclidean_rdel_3d._tria._tset.tend(); - ++_iter ) - { - if (_iter->mark() < +0) continue ; - - _ntri += +1 ; - - _nmap[_iter->node(0)]=1; - _nmap[_iter->node(1)]=1; - _nmap[_iter->node(2)]=1; - _nmap[_iter->node(3)]=1; - } - - iptr_type _last = +0; - for (auto _iter = _nmap.head() ; - _iter != _nmap.tend() ; - ++_iter ) - { - if ( *_iter >= +0) - { - *_iter = _last ++ ; - } - } - - if (_rdel._euclidean_rdel_3d. - _tria._nset.count() > 0) - { - /*-------------------------- write POINT data */ - _file << "POINT=" << _last << "\n" ; - - auto _next = +0, _roll = +0, - _npos = +0; - char _fbuf[PRINTCHUNK] ; - - for (auto _iter = _rdel. - _euclidean_rdel_3d._tria._nset.head(); - _iter != _rdel. - _euclidean_rdel_3d._tria._nset.tend(); - ++_iter, ++_npos) - { - if (_iter->mark() >= 0 && - _nmap[_npos ] >= 0) - { - PRINTCHARS(snprintf(&_fbuf[_next], - PRINTCHUNK, - "%.17g;%.17g;%.17g;+0\n", - _iter->pval(0) , - _iter->pval(1) , - _iter->pval(2) ), VERT3CHUNK) - } - } - PRINTFINAL; - } - - if (_rdel._euclidean_rdel_3d. - _tria._tset.count() > 0) - { - /*-------------------------- write TRIA3 data */ - _file << "TRIA4=" << _ntri << "\n" ; - - auto _next = +0, _roll = +0; - char _fbuf[PRINTCHUNK] ; - - for (auto _iter = _rdel. - _euclidean_rdel_3d._tria._tset.head(); - _iter != _rdel. - _euclidean_rdel_3d._tria._tset.tend(); - ++_iter ) - { - if (_iter->mark() < +0) continue ; - - PRINTCHARS(snprintf(&_fbuf[_next], - PRINTCHUNK, - "%u;%u;%u;%u;+0\n", - _nmap[_iter->node(0)] , - _nmap[_iter->node(1)] , - _nmap[_iter->node(2)] , - _nmap[_iter->node(3)]),TRIA4CHUNK) - } - PRINTFINAL; - } - - } - - } - else - { - _errv = __file_not_created ; - } - - _file.close(); - - } - catch (...) - { - _errv = __unknown_error ; - } - - return ( _errv ) ; - } - - /* - -------------------------------------------------------- - * SAVE-TRIA: save MSH_t output data. - -------------------------------------------------------- - */ - - template < - typename jlog_data - > - __normal_call iptr_type save_tria ( - jcfg_data &_jcfg , - jlog_data &_jlog , - mesh_data &_rdel , - jigsaw_msh_t &_mmsh - ) - { - iptr_type _errv = __no_error ; - - try - { - containers::array _nmap; - - __unreferenced (_jlog) ; - __unreferenced (_jcfg) ; - - if (_rdel._ndim == +2 && // save 2-dim. mesh - _rdel._kind == - jmsh_kind::euclidean_mesh) - { - _mmsh._flags = JIGSAW_EUCLIDEAN_MESH ; - - /*------------ index mapping for active nodes */ - _nmap.set_count(_rdel. - _euclidean_rdel_2d._tria._nset.count() , - containers::tight_alloc, -1) ; - - iptr_type _ntri = +0; - for (auto _iter = _rdel. - _euclidean_rdel_2d._tria._tset.head(); - _iter != _rdel. - _euclidean_rdel_2d._tria._tset.tend(); - ++_iter ) - { - if (_iter->mark() < +0) continue ; - - _ntri += +1 ; - - _nmap[_iter->node(0)]=1; - _nmap[_iter->node(1)]=1; - _nmap[_iter->node(2)]=1; - } - - iptr_type _last = +0; - for (auto _iter = _nmap.head() ; - _iter != _nmap.tend() ; - ++_iter ) - { - if ( *_iter >= +0) - { - *_iter = _last ++ ; - } - } - - if (_rdel._euclidean_rdel_2d. - _tria._nset.count() > 0) - { - /*-------------------------- write POINT data */ - jigsaw_alloc_vert2 ( - &_mmsh._vert2, _last) ; - - jigsaw_alloc_reals ( - &_mmsh._power, _last) ; - - iptr_type _npos = +0 ; - iptr_type _nout = +0 ; - for (auto _iter = _rdel. - _euclidean_rdel_2d._tria._nset.head(); - _iter != _rdel. - _euclidean_rdel_2d._tria._nset.tend(); - ++_iter, ++_npos) - { - if (_iter->mark() >= 0 && - _nmap[_npos ] >= 0 ) - { - _mmsh._vert2._data[_nout]. - _ppos[0] = _iter->pval(0) ; - _mmsh._vert2._data[_nout]. - _ppos[1] = _iter->pval(1) ; - - _mmsh._vert2. - _data[_nout]._itag = 0 ; - - _mmsh._power. - _data[_nout] = (real_type)+0. ; - - _nout = _nout + 1 ; - } - } - - _rdel._euclidean_rdel_2d. - _tria._nset. - clear(containers::tight_alloc); - - } - - if (_rdel._euclidean_rdel_2d. - _tria._tset.count() > +0) - { - /*-------------------------- write TRIA3 data */ - jigsaw_alloc_tria3 ( - &_mmsh._tria3, _ntri) ; - - iptr_type _tout = +0 ; - for (auto _iter = _rdel. - _euclidean_rdel_2d._tria._tset.head(); - _iter != _rdel. - _euclidean_rdel_2d._tria._tset.tend(); - ++_iter ) - { - if (_iter->mark() >= 0) - { - _mmsh._tria3._data[_tout]. - _node[0] = - _nmap[_iter->node(0)]; - _mmsh._tria3._data[_tout]. - _node[1] = - _nmap[_iter->node(1)]; - _mmsh._tria3._data[_tout]. - _node[2] = - _nmap[_iter->node(2)]; - - _mmsh._tria3. - _data[_tout]._itag = 0 ; - - _tout = _tout + 1 ; - } - } - - _rdel._euclidean_rdel_2d. - _tria._tset. - clear(containers::tight_alloc) ; - - } - - } - else - if (_rdel._ndim == +3 && // save 3-dim. mesh - _rdel._kind == - jmsh_kind::euclidean_mesh) - { - _mmsh._flags = JIGSAW_EUCLIDEAN_MESH ; - - /*------------ index mapping for active nodes */ - _nmap.set_count(_rdel. - _euclidean_rdel_3d._tria._nset.count() , - containers::tight_alloc, -1) ; - - iptr_type _ntri = +0; - for (auto _iter = _rdel. - _euclidean_rdel_3d._tria._tset.head(); - _iter != _rdel. - _euclidean_rdel_3d._tria._tset.tend(); - ++_iter ) - { - if (_iter->mark() < +0) continue ; - - _ntri += +1 ; - - _nmap[_iter->node(0)]=1; - _nmap[_iter->node(1)]=1; - _nmap[_iter->node(2)]=1; - _nmap[_iter->node(3)]=1; - } - - iptr_type _last = +0; - for (auto _iter = _nmap.head() ; - _iter != _nmap.tend() ; - ++_iter ) - { - if ( *_iter >= +0) - { - *_iter = _last ++ ; - } - } - - if (_rdel._euclidean_rdel_3d. - _tria._nset.count() > 0) - { - /*-------------------------- write POINT data */ - jigsaw_alloc_vert3 ( - &_mmsh._vert3 , _last); - - jigsaw_alloc_reals ( - &_mmsh._power , _last); - - iptr_type _npos = +0 ; - iptr_type _nout = +0 ; - for (auto _iter = _rdel. - _euclidean_rdel_3d._tria._nset.head(); - _iter != _rdel. - _euclidean_rdel_3d._tria._nset.tend(); - ++_iter, ++_npos) - { - if (_iter->mark() >= 0 && - _nmap[_npos ] >= 0 ) - { - _mmsh._vert3._data[_nout]. - _ppos[0] = _iter->pval(0) ; - _mmsh._vert3._data[_nout]. - _ppos[1] = _iter->pval(1) ; - _mmsh._vert3._data[_nout]. - _ppos[2] = _iter->pval(2) ; - - _mmsh._vert3. - _data[_nout]._itag = 0 ; - - _mmsh._power. - _data[_nout] = (real_type)+0. ; - - _nout = _nout + 1 ; - } - } - - _rdel._euclidean_rdel_3d. - _tria._nset. - clear(containers::tight_alloc); - - } - - if (_rdel._euclidean_rdel_3d. - _tria._tset.count() > +0) - { - /*-------------------------- write TRIA3 data */ - jigsaw_alloc_tria4 ( - &_mmsh._tria4, _ntri) ; - - iptr_type _tout = +0 ; - for (auto _iter = _rdel. - _euclidean_rdel_3d._tria._tset.head(); - _iter != _rdel. - _euclidean_rdel_3d._tria._tset.tend(); - ++_iter ) - { - if (_iter->mark() >= 0) - { - _mmsh._tria4._data[_tout]. - _node[0] = - _nmap[_iter->node(0)]; - _mmsh._tria4._data[_tout]. - _node[1] = - _nmap[_iter->node(1)]; - _mmsh._tria4._data[_tout]. - _node[2] = - _nmap[_iter->node(2)]; - _mmsh._tria4._data[_tout]. - _node[3] = - _nmap[_iter->node(3)]; - - _mmsh._tria4. - _data[_tout]._itag = 0 ; - - _tout = _tout + 1 ; - } - } - - _rdel._euclidean_rdel_3d. - _tria._tset. - clear(containers::tight_alloc) ; - - } - - } - - } - catch (...) - { - _errv = __unknown_error ; - } - - return ( _errv ) ; - } - - /* - -------------------------------------------------------- - * SAVE-MESH: save *.MSH output file. + * inc. low-level file write kernels. -------------------------------------------------------- */ - template < - typename jlog_data - > - __normal_call iptr_type save_mesh ( - jcfg_data &_jcfg , - jlog_data &_jlog , - mesh_data &_mesh - ) - { - iptr_type _errv = __no_error ; - - __unreferenced(_jlog) ; - - try - { - containers::array _nmap; - - std::string _path, _name, _fext; - file_part( - _jcfg._mesh_file, _path, _name, _fext) ; - - std::ofstream _file; - _file.open( - _jcfg._mesh_file, - std::ofstream::out | std::ofstream::trunc) ; - - if (_file.is_open()) - { - if (_mesh._ndim == +2 && - _mesh._kind == - jmsh_kind::euclidean_mesh) - { - /*-------------------------- save 2-dim. mesh */ - _file << "# " << _name << ".msh" - << "; created by " ; - _file << __JGSWVSTR "\n" ; - _file << "MSHID=3;EUCLIDEAN-MESH \n" ; - _file << "NDIMS=2 \n" ; - - /*------------ index mapping for active nodes */ - _nmap.set_count(_mesh. - _euclidean_mesh_2d._mesh.node().count() , - containers::tight_alloc, -1) ; - - iptr_type _nnN1 = +0 ; - iptr_type _nnE2 = +0 ; - iptr_type _nnT3 = +0 ; - iptr_type _nnQ4 = +0 ; - - for (auto _iter = _mesh. - _euclidean_mesh_2d._mesh.edge().head() ; - _iter != _mesh. - _euclidean_mesh_2d._mesh.edge().tend() ; - ++_iter ) - { - if (_iter->mark() >= +0 && - _iter->self() >= +1 ) - { - _nmap[_iter->node(0)] = +1 ; - _nmap[_iter->node(1)] = +1 ; - _nnE2 += +1 ; - } - } - - for (auto _iter = _mesh. - _euclidean_mesh_2d._mesh.tri3().head() ; - _iter != _mesh. - _euclidean_mesh_2d._mesh.tri3().tend() ; - ++_iter ) - { - if (_iter->mark() >= +0 && - _iter->self() >= +1 ) - { - _nmap[_iter->node(0)] = +1 ; - _nmap[_iter->node(1)] = +1 ; - _nmap[_iter->node(2)] = +1 ; - _nnT3 += +1 ; - } - } - - for (auto _iter = _mesh. - _euclidean_mesh_2d._mesh.quad().head() ; - _iter != _mesh. - _euclidean_mesh_2d._mesh.quad().tend() ; - ++_iter ) - { - if (_iter->mark() >= +0 && - _iter->self() >= +1 ) - { - _nmap[_iter->node(0)] = +1 ; - _nmap[_iter->node(1)] = +1 ; - _nmap[_iter->node(2)] = +1 ; - _nmap[_iter->node(3)] = +1 ; - _nnQ4 += +1 ; - } - } - - for (auto _iter = _nmap.head(); - _iter != _nmap.tend(); - ++_iter ) - { - if ( *_iter >= +0) - { - *_iter = _nnN1 ++ ; - } - } - - if (_nnN1 > +0) - { - /*-------------------------- write POINT data */ - _file << "POINT=" << _nnN1 << "\n" ; - - auto _next = +0, _roll = +0, - _npos = +0; - char _fbuf[PRINTCHUNK] ; - - for (auto _iter = _mesh. - _euclidean_mesh_2d._mesh.node().head() ; - _iter != _mesh. - _euclidean_mesh_2d._mesh.node().tend() ; - ++_iter, ++_npos) - { - if (_iter->mark() >= 0 && - _nmap[_npos ] >= 0 ) - { - PRINTCHARS(snprintf(&_fbuf[_next] , - PRINTCHUNK, - "%.17g;%.17g;%d\n" , - _iter->pval(0) , - _iter->pval(1) , - _iter->itag()) , VERT2CHUNK ) - } - } - PRINTFINAL; - } - - if (_nnN1 > +0) - { - /*-------------------------- write POWER data */ - if (_jcfg._iter_opts.dual() ) - { - _file << "POWER=" - << _nnN1 << ";1" << "\n" ; - - auto _next = +0, _roll = +0, - _npos = +0; - char _fbuf[PRINTCHUNK] ; - - for (auto _iter = _mesh. - _euclidean_mesh_2d._mesh.node().head() ; - _iter != _mesh. - _euclidean_mesh_2d._mesh.node().tend() ; - ++_iter, ++_npos) - { - if (_iter->mark() >= 0 && - _nmap[_npos ] >= 0) - { - PRINTCHARS(snprintf(&_fbuf[_next] , - PRINTCHUNK, "%.17g\n" , - _iter->pval(2) ), VALUECHUNK) - } - } - PRINTFINAL; - } - } - - if (_nnE2 > +0) - { - /*-------------------------- write EDGE2 data */ - _file << "EDGE2=" << _nnE2 << "\n" ; - - auto _next = +0, _roll = +0; - char _fbuf[PRINTCHUNK] ; - - for (auto _iter = _mesh. - _euclidean_mesh_2d._mesh.edge().head() ; - _iter != _mesh. - _euclidean_mesh_2d._mesh.edge().tend() ; - ++_iter ) - { - if (_iter->mark() >= 0 && - _iter->self() >= 1 ) - { - PRINTCHARS(snprintf(&_fbuf[_next] , - PRINTCHUNK, "%u;%u;%d\n", - _nmap[_iter->node(0)] , - _nmap[_iter->node(1)] , - _iter->itag()), EDGE2CHUNK) - } - } - PRINTFINAL; - } - - if (_nnT3 > +0) - { - /*-------------------------- write TRIA3 data */ - _file << "TRIA3=" << _nnT3 << "\n" ; - - auto _next = +0, _roll = +0; - char _fbuf[PRINTCHUNK] ; - - for (auto _iter = _mesh. - _euclidean_mesh_2d._mesh.tri3().head() ; - _iter != _mesh. - _euclidean_mesh_2d._mesh.tri3().tend() ; - ++_iter ) - { - if (_iter->mark() >= 0 && - _iter->self() >= 1 ) - { - PRINTCHARS(snprintf(&_fbuf[_next] , - PRINTCHUNK, "%u;%u;%u;%d\n", - _nmap[_iter->node(0)] , - _nmap[_iter->node(1)] , - _nmap[_iter->node(2)] , - _iter->itag()), TRIA3CHUNK) - } - } - PRINTFINAL; - } - - if (_nnQ4 > +0) - { - /*-------------------------- write QUAD4 data */ - _file << "QUAD4=" << _nnQ4 << "\n" ; - - auto _next = +0, _roll = +0; - char _fbuf[PRINTCHUNK] ; - - for (auto _iter = _mesh. - _euclidean_mesh_2d._mesh.quad().head() ; - _iter != _mesh. - _euclidean_mesh_2d._mesh.quad().tend() ; - ++_iter ) - { - if (_iter->mark() >= 0 && - _iter->self() >= 1 ) - { - PRINTCHARS(snprintf(&_fbuf[_next] , - PRINTCHUNK, - "%u;%u;%u;%u;%d\n", - _nmap[_iter->node(0)] , - _nmap[_iter->node(1)] , - _nmap[_iter->node(2)] , - _nmap[_iter->node(3)] , - _iter->itag()), QUAD4CHUNK) - } - } - PRINTFINAL; - } - - } - else - if (_mesh._ndim == +3 && - _mesh._kind == - jmsh_kind::euclidean_mesh) - { - /*-------------------------- save 3-dim. mesh */ - _file << "# " << _name << ".msh" - << "; created by " ; - _file << __JGSWVSTR "\n" ; - _file << "MSHID=3;EUCLIDEAN-MESH \n" ; - _file << "NDIMS=3 \n" ; - - /*------------ index mapping for active nodes */ - _nmap.set_count(_mesh. - _euclidean_mesh_3d._mesh.node().count() , - containers::tight_alloc, -1) ; - - iptr_type _nnN1 = +0 ; - iptr_type _nnE2 = +0 ; - iptr_type _nnT3 = +0 ; - iptr_type _nnQ4 = +0 ; - iptr_type _nnT4 = +0 ; - - for (auto _iter = _mesh. - _euclidean_mesh_3d._mesh.edge().head() ; - _iter != _mesh. - _euclidean_mesh_3d._mesh.edge().tend() ; - ++_iter ) - { - if (_iter->mark() >= +0 && - _iter->self() >= +1 ) - { - _nmap[_iter->node(0)] = +1 ; - _nmap[_iter->node(1)] = +1 ; - _nnE2 += +1 ; - } - } - - for (auto _iter = _mesh. - _euclidean_mesh_3d._mesh.tri3().head() ; - _iter != _mesh. - _euclidean_mesh_3d._mesh.tri3().tend() ; - ++_iter ) - { - if (_iter->mark() >= +0 && - _iter->self() >= +1 ) - { - _nmap[_iter->node(0)] = +1 ; - _nmap[_iter->node(1)] = +1 ; - _nmap[_iter->node(2)] = +1 ; - _nnT3 += +1 ; - } - } - - for (auto _iter = _mesh. - _euclidean_mesh_3d._mesh.quad().head() ; - _iter != _mesh. - _euclidean_mesh_3d._mesh.quad().tend() ; - ++_iter ) - { - if (_iter->mark() >= +0 && - _iter->self() >= +1 ) - { - _nmap[_iter->node(0)] = +1 ; - _nmap[_iter->node(1)] = +1 ; - _nmap[_iter->node(2)] = +1 ; - _nmap[_iter->node(3)] = +1 ; - _nnQ4 += +1 ; - } - } - - for (auto _iter = _mesh. - _euclidean_mesh_3d._mesh.tri4().head() ; - _iter != _mesh. - _euclidean_mesh_3d._mesh.tri4().tend() ; - ++_iter ) - { - if (_iter->mark() >= +0 && - _iter->self() >= +1 ) - { - _nmap[_iter->node(0)] = +1 ; - _nmap[_iter->node(1)] = +1 ; - _nmap[_iter->node(2)] = +1 ; - _nmap[_iter->node(3)] = +1 ; - _nnT4 += +1 ; - } - } - - for (auto _iter = _nmap.head(); - _iter != _nmap.tend(); - ++_iter ) - { - if ( *_iter >= +0) - { - *_iter = _nnN1 ++ ; - } - } - - if (_nnN1 > +0) - { - /*-------------------------- write POINT data */ - _file << "POINT=" << _nnN1 << "\n" ; - - auto _next = +0, _roll = +0, - _npos = +0; - char _fbuf[PRINTCHUNK] ; - - for (auto _iter = _mesh. - _euclidean_mesh_3d._mesh.node().head() ; - _iter != _mesh. - _euclidean_mesh_3d._mesh.node().tend() ; - ++_iter, ++_npos) - { - if (_iter->mark() >= 0 && - _nmap[_npos ] >= 0 ) - { - PRINTCHARS(snprintf(&_fbuf[_next] , - PRINTCHUNK, - "%.17g;%.17g;%.17g;%d\n" , - _iter->pval(0) , - _iter->pval(1) , - _iter->pval(2) , - _iter->itag()) , VERT3CHUNK ) - } - } - PRINTFINAL; - } - - if (_nnN1 > +0) - { - /*-------------------------- write POWER data */ - if (_jcfg._iter_opts.dual() ) - { - _file << "POWER=" - << _nnN1 << ";1" << "\n" ; - - auto _next = +0, _roll = +0, - _npos = +0; - char _fbuf[PRINTCHUNK] ; - - for (auto _iter = _mesh. - _euclidean_mesh_3d._mesh.node().head() ; - _iter != _mesh. - _euclidean_mesh_3d._mesh.node().tend() ; - ++_iter, ++_npos) - { - if (_iter->mark() >= 0 && - _nmap[_npos ] >= 0) - { - PRINTCHARS(snprintf(&_fbuf[_next] , - PRINTCHUNK, "%.17g\n" , - _iter->pval(3) ), VALUECHUNK) - } - } - PRINTFINAL; - } - } - - if (_nnE2 > +0) - { - /*-------------------------- write EDGE2 data */ - _file << "EDGE2=" << _nnE2 << "\n" ; - - auto _next = +0, _roll = +0; - char _fbuf[PRINTCHUNK] ; - - for (auto _iter = _mesh. - _euclidean_mesh_3d._mesh.edge().head() ; - _iter != _mesh. - _euclidean_mesh_3d._mesh.edge().tend() ; - ++_iter ) - { - if (_iter->mark() >= 0 && - _iter->self() >= 1 ) - { - PRINTCHARS(snprintf(&_fbuf[_next] , - PRINTCHUNK, "%u;%u;%d\n", - _nmap[_iter->node(0)] , - _nmap[_iter->node(1)] , - _iter->itag()), EDGE2CHUNK) - } - } - PRINTFINAL; - } - - if (_nnT3 > +0) - { - /*-------------------------- write TRIA3 data */ - _file << "TRIA3=" << _nnT3 << "\n" ; - - auto _next = +0, _roll = +0; - char _fbuf[PRINTCHUNK] ; - - for (auto _iter = _mesh. - _euclidean_mesh_3d._mesh.tri3().head() ; - _iter != _mesh. - _euclidean_mesh_3d._mesh.tri3().tend() ; - ++_iter ) - { - if (_iter->mark() >= 0 && - _iter->self() >= 1 ) - { - PRINTCHARS(snprintf(&_fbuf[_next] , - PRINTCHUNK, "%u;%u;%u;%d\n", - _nmap[_iter->node(0)] , - _nmap[_iter->node(1)] , - _nmap[_iter->node(2)] , - _iter->itag()), TRIA3CHUNK) - } - } - PRINTFINAL; - } - - if (_nnQ4 > +0) - { - /*-------------------------- write QUAD4 data */ - _file << "QUAD4=" << _nnQ4 << "\n" ; - - auto _next = +0, _roll = +0; - char _fbuf[PRINTCHUNK] ; - - for (auto _iter = _mesh. - _euclidean_mesh_3d._mesh.quad().head() ; - _iter != _mesh. - _euclidean_mesh_3d._mesh.quad().tend() ; - ++_iter ) - { - if (_iter->mark() >= 0 && - _iter->self() >= 1 ) - { - PRINTCHARS(snprintf(&_fbuf[_next] , - PRINTCHUNK, - "%u;%u;%u;%u;%d\n", - _nmap[_iter->node(0)] , - _nmap[_iter->node(1)] , - _nmap[_iter->node(2)] , - _nmap[_iter->node(3)] , - _iter->itag()), QUAD4CHUNK) - } - } - PRINTFINAL; - } - - if (_nnT4 > +0) - { - /*-------------------------- write TRIA4 data */ - _file << "TRIA4=" << _nnT4 << "\n" ; - - auto _next = +0, _roll = +0; - char _fbuf[PRINTCHUNK] ; - - for (auto _iter = _mesh. - _euclidean_mesh_3d._mesh.tri4().head() ; - _iter != _mesh. - _euclidean_mesh_3d._mesh.tri4().tend() ; - ++_iter ) - { - if (_iter->mark() >= 0 && - _iter->self() >= 1 ) - { - PRINTCHARS(snprintf(&_fbuf[_next] , - PRINTCHUNK, - "%u;%u;%u;%u;%d\n", - _nmap[_iter->node(0)] , - _nmap[_iter->node(1)] , - _nmap[_iter->node(2)] , - _nmap[_iter->node(3)] , - _iter->itag()), TRIA4CHUNK) - } - } - PRINTFINAL; - } - - } - - } - else - { - _errv = __file_not_created ; - } - - _file.close(); - - } - catch (...) - { - _errv = __unknown_error ; - } - - return ( _errv ) ; - } - - /* - -------------------------------------------------------- - * SAVE-MESH: save MSH_t output data. - -------------------------------------------------------- - */ - - template < - typename jlog_data - > - __normal_call iptr_type save_mesh ( - jcfg_data &_jcfg , - jlog_data &_jlog , - mesh_data &_mesh , - jigsaw_msh_t &_mmsh - ) - { - iptr_type _errv = __no_error ; - - try - { - containers::array _nmap ; - - __unreferenced (_jcfg) ; - __unreferenced (_jlog) ; - - if (_mesh._ndim == +2 && // save 2-dim. mesh - _mesh._kind == - jmsh_kind::euclidean_mesh) - { - _mmsh._flags = JIGSAW_EUCLIDEAN_MESH ; - - /*------------ index mapping for active nodes */ - _nmap.set_count(_mesh. - _euclidean_mesh_2d._mesh.node().count() , - containers::tight_alloc, -1) ; - - iptr_type _nnN1 = +0 ; - iptr_type _nnE2 = +0 ; - iptr_type _nnT3 = +0 ; - iptr_type _nnQ4 = +0 ; - - for (auto _iter = _mesh. - _euclidean_mesh_2d._mesh.edge().head() ; - _iter != _mesh. - _euclidean_mesh_2d._mesh.edge().tend() ; - ++_iter ) - { - if (_iter->mark() >= +0 && - _iter->self() >= +1 ) - { - _nmap[_iter->node(0)] = +1 ; - _nmap[_iter->node(1)] = +1 ; - _nnE2 += +1 ; - } - } - - for (auto _iter = _mesh. - _euclidean_mesh_2d._mesh.tri3().head() ; - _iter != _mesh. - _euclidean_mesh_2d._mesh.tri3().tend() ; - ++_iter ) - { - if (_iter->mark() >= +0 && - _iter->self() >= +1 ) - { - _nmap[_iter->node(0)] = +1 ; - _nmap[_iter->node(1)] = +1 ; - _nmap[_iter->node(2)] = +1 ; - _nnT3 += +1 ; - } - } - - for (auto _iter = _mesh. - _euclidean_mesh_2d._mesh.quad().head() ; - _iter != _mesh. - _euclidean_mesh_2d._mesh.quad().tend() ; - ++_iter ) - { - if (_iter->mark() >= +0 && - _iter->self() >= +1 ) - { - _nmap[_iter->node(0)] = +1 ; - _nmap[_iter->node(1)] = +1 ; - _nmap[_iter->node(2)] = +1 ; - _nmap[_iter->node(3)] = +1 ; - _nnQ4 += +1 ; - } - } - - for (auto _iter = _nmap.head(); - _iter != _nmap.tend(); - ++_iter ) - { - if ( *_iter >= +0) - { - *_iter = _nnN1 ++ ; - } - } - - if (_nnN1 > +0) - { - /*-------------------------- write POINT data */ - jigsaw_alloc_vert2 ( - &_mmsh._vert2, _nnN1) ; - - jigsaw_alloc_reals ( - &_mmsh._power, _nnN1) ; - - iptr_type _npos = +0 ; - iptr_type _nout = +0 ; - - for (auto _iter = _mesh. - _euclidean_mesh_2d._mesh.node().head() ; - _iter != _mesh. - _euclidean_mesh_2d._mesh.node().tend() ; - ++_iter, ++_npos) - { - if (_iter->mark() >= 0 && - _nmap[_npos ] >= 0 ) - { - _mmsh._vert2._data[_nout]. - _ppos[0] = _iter->pval(0) ; - _mmsh._vert2._data[_nout]. - _ppos[1] = _iter->pval(1) ; - - _mmsh._vert2._data[_nout]. - _itag = _iter->itag () ; - - _mmsh._power. - _data[_nout] = _iter->pval(2) ; - - _nout = _nout + 1 ; - } - } - - _mesh._euclidean_mesh_2d._mesh._llN1. - clear(containers::tight_alloc); - - _mesh._euclidean_mesh_2d._mesh._aaN1. - clear(containers::tight_alloc); - - } - - if (_nnE2 > +0) - { - /*-------------------------- write EDGE2 data */ - jigsaw_alloc_edge2 ( - &_mmsh._edge2, _nnE2) ; - - iptr_type _eout = +0 ; - for (auto _iter = _mesh. - _euclidean_mesh_2d._mesh.edge().head() ; - _iter != _mesh. - _euclidean_mesh_2d._mesh.edge().tend() ; - ++_iter ) - { - if (_iter->mark() >= 0 && - _iter->self() >= 1 ) - { - _mmsh._edge2. - _data[_eout]._node[0] - = _nmap[_iter->node(0)] ; - _mmsh._edge2. - _data[_eout]._node[1] - = _nmap[_iter->node(1)] ; - - _mmsh._edge2. - _data[_eout]. - _itag = _iter->itag() ; - - _eout = _eout + 1 ; - } - } - - _mesh._euclidean_mesh_2d._mesh._llE2. - clear(containers::tight_alloc); - - _mesh._euclidean_mesh_2d._mesh._aaE2. - clear(containers::tight_alloc); - - _mesh._euclidean_mesh_2d._mesh._mmE2. - clear(containers::tight_alloc); - - } - - if (_nnT3 > +0) - { - /*-------------------------- write TRIA3 data */ - jigsaw_alloc_tria3 ( - &_mmsh._tria3, _nnT3) ; - - iptr_type _tout = +0 ; - for (auto _iter = _mesh. - _euclidean_mesh_2d._mesh.tri3().head() ; - _iter != _mesh. - _euclidean_mesh_2d._mesh.tri3().tend() ; - ++_iter ) - { - if (_iter->mark() >= 0 && - _iter->self() >= 1 ) - { - _mmsh._tria3. - _data[_tout]._node[0] - = _nmap[_iter->node(0)] ; - _mmsh._tria3. - _data[_tout]._node[1] - = _nmap[_iter->node(1)] ; - _mmsh._tria3. - _data[_tout]._node[2] - = _nmap[_iter->node(2)] ; - - _mmsh._tria3. - _data[_tout]. - _itag = _iter->itag() ; - - _tout = _tout + 1 ; - } - } - - _mesh._euclidean_mesh_2d._mesh._llT3. - clear(containers::tight_alloc); - - _mesh._euclidean_mesh_2d._mesh._mmT3. - clear(containers::tight_alloc); - - } - - if (_nnQ4 > +0) - { - /*-------------------------- write QUAD4 data */ - jigsaw_alloc_quad4 ( - &_mmsh._quad4, _nnQ4) ; - - iptr_type _qout = +0 ; - for (auto _iter = _mesh. - _euclidean_mesh_2d._mesh.quad().head() ; - _iter != _mesh. - _euclidean_mesh_2d._mesh.quad().tend() ; - ++_iter ) - { - if (_iter->mark() >= 0 && - _iter->self() >= 1 ) - { - _mmsh._quad4. - _data[_qout]._node[0] - = _nmap[_iter->node(0)] ; - _mmsh._quad4. - _data[_qout]._node[1] - = _nmap[_iter->node(1)] ; - _mmsh._quad4. - _data[_qout]._node[2] - = _nmap[_iter->node(2)] ; - _mmsh._quad4. - _data[_qout]._node[3] - = _nmap[_iter->node(3)] ; - - _mmsh._quad4. - _data[_qout]. - _itag = _iter->itag() ; - - _qout = _qout + 1 ; - } - } - - _mesh._euclidean_mesh_2d._mesh._llQ4. - clear(containers::tight_alloc); - - _mesh._euclidean_mesh_2d._mesh._mmQ4. - clear(containers::tight_alloc); - - } - - } - else - if (_mesh._ndim == +3 && // save 3-dim. mesh - _mesh._kind == - jmsh_kind::euclidean_mesh) - { - _mmsh._flags = JIGSAW_EUCLIDEAN_MESH ; - - /*------------ index mapping for active nodes */ - _nmap.set_count(_mesh. - _euclidean_mesh_3d._mesh.node().count() , - containers::tight_alloc, -1) ; - - iptr_type _nnN1 = +0 ; - iptr_type _nnE2 = +0 ; - iptr_type _nnT3 = +0 ; - iptr_type _nnQ4 = +0 ; - iptr_type _nnT4 = +0 ; - - for (auto _iter = _mesh. - _euclidean_mesh_3d._mesh.edge().head() ; - _iter != _mesh. - _euclidean_mesh_3d._mesh.edge().tend() ; - ++_iter ) - { - if (_iter->mark() >= +0 && - _iter->self() >= +1 ) - { - _nmap[_iter->node(0)] = +1 ; - _nmap[_iter->node(1)] = +1 ; - _nnE2 += +1 ; - } - } - - for (auto _iter = _mesh. - _euclidean_mesh_3d._mesh.tri3().head() ; - _iter != _mesh. - _euclidean_mesh_3d._mesh.tri3().tend() ; - ++_iter ) - { - if (_iter->mark() >= +0 && - _iter->self() >= +1 ) - { - _nmap[_iter->node(0)] = +1 ; - _nmap[_iter->node(1)] = +1 ; - _nmap[_iter->node(2)] = +1 ; - _nnT3 += +1 ; - } - } - - for (auto _iter = _mesh. - _euclidean_mesh_3d._mesh.quad().head() ; - _iter != _mesh. - _euclidean_mesh_3d._mesh.quad().tend() ; - ++_iter ) - { - if (_iter->mark() >= +0 && - _iter->self() >= +1 ) - { - _nmap[_iter->node(0)] = +1 ; - _nmap[_iter->node(1)] = +1 ; - _nmap[_iter->node(2)] = +1 ; - _nmap[_iter->node(3)] = +1 ; - _nnQ4 += +1 ; - } - } - - for (auto _iter = _mesh. - _euclidean_mesh_3d._mesh.tri4().head() ; - _iter != _mesh. - _euclidean_mesh_3d._mesh.tri4().tend() ; - ++_iter ) - { - if (_iter->mark() >= +0 && - _iter->self() >= +1 ) - { - _nmap[_iter->node(0)] = +1 ; - _nmap[_iter->node(1)] = +1 ; - _nmap[_iter->node(2)] = +1 ; - _nmap[_iter->node(3)] = +1 ; - _nnT4 += +1 ; - } - } - - for (auto _iter = _nmap.head(); - _iter != _nmap.tend(); - ++_iter ) - { - if ( *_iter >= +0) - { - *_iter = _nnN1 ++ ; - } - } - - if (_nnN1 > +0) - { - /*-------------------------- write POINT data */ - jigsaw_alloc_vert3 ( - &_mmsh._vert3, _nnN1) ; - - jigsaw_alloc_reals ( - &_mmsh._power, _nnN1) ; - - iptr_type _npos = +0 ; - iptr_type _nout = +0 ; - - for (auto _iter = _mesh. - _euclidean_mesh_3d._mesh.node().head() ; - _iter != _mesh. - _euclidean_mesh_3d._mesh.node().tend() ; - ++_iter, ++_npos) - { - if (_iter->mark() >= 0 && - _nmap[_npos ] >= 0 ) - { - _mmsh._vert3._data[_nout]. - _ppos[0] = _iter->pval(0) ; - _mmsh._vert3._data[_nout]. - _ppos[1] = _iter->pval(1) ; - _mmsh._vert3._data[_nout]. - _ppos[2] = _iter->pval(2) ; - - _mmsh._vert3._data[_nout]. - _itag = _iter->itag () ; - - _mmsh._power. - _data[_nout] = _iter->pval(3) ; - - _nout = _nout + 1 ; - } - } - - _mesh._euclidean_mesh_3d._mesh._llN1. - clear(containers::tight_alloc); - - _mesh._euclidean_mesh_3d._mesh._aaN1. - clear(containers::tight_alloc); - - } - - if (_nnE2 > +0) - { - /*-------------------------- write EDGE2 data */ - jigsaw_alloc_edge2 ( - &_mmsh._edge2, _nnE2) ; - - iptr_type _eout = +0 ; - for (auto _iter = _mesh. - _euclidean_mesh_3d._mesh.edge().head() ; - _iter != _mesh. - _euclidean_mesh_3d._mesh.edge().tend() ; - ++_iter ) - { - if (_iter->mark() >= 0 && - _iter->self() >= 1 ) - { - _mmsh._edge2. - _data[_eout]._node[0] - = _nmap[_iter->node(0)] ; - _mmsh._edge2. - _data[_eout]._node[1] - = _nmap[_iter->node(1)] ; - - _mmsh._edge2. - _data[_eout]. - _itag = _iter->itag() ; - - _eout = _eout + 1 ; - } - } - - _mesh._euclidean_mesh_3d._mesh._llE2. - clear(containers::tight_alloc); - - _mesh._euclidean_mesh_3d._mesh._aaE2. - clear(containers::tight_alloc); - - _mesh._euclidean_mesh_3d._mesh._mmE2. - clear(containers::tight_alloc); - - } - - if (_nnT3 > +0) - { - /*-------------------------- write TRIA3 data */ - jigsaw_alloc_tria3 ( - &_mmsh._tria3, _nnT3) ; - - iptr_type _fout = +0 ; - for (auto _iter = _mesh. - _euclidean_mesh_3d._mesh.tri3().head() ; - _iter != _mesh. - _euclidean_mesh_3d._mesh.tri3().tend() ; - ++_iter ) - { - if (_iter->mark() >= 0 && - _iter->self() >= 1 ) - { - _mmsh._tria3. - _data[_fout]._node[0] - = _nmap[_iter->node(0)] ; - _mmsh._tria3. - _data[_fout]._node[1] - = _nmap[_iter->node(1)] ; - _mmsh._tria3. - _data[_fout]._node[2] - = _nmap[_iter->node(2)] ; - - _mmsh._tria3. - _data[_fout]. - _itag = _iter->itag() ; - - _fout = _fout + 1 ; - } - } - - _mesh._euclidean_mesh_3d._mesh._llT3. - clear(containers::tight_alloc); - - _mesh._euclidean_mesh_3d._mesh._aaT3. - clear(containers::tight_alloc); - - _mesh._euclidean_mesh_3d._mesh._mmT3. - clear(containers::tight_alloc); - - } - - if (_nnQ4 > +0) - { - /*-------------------------- write QUAD4 data */ - jigsaw_alloc_quad4 ( - &_mmsh._quad4, _nnQ4) ; - - iptr_type _fout = +0 ; - for (auto _iter = _mesh. - _euclidean_mesh_3d._mesh.quad().head() ; - _iter != _mesh. - _euclidean_mesh_3d._mesh.quad().tend() ; - ++_iter ) - { - if (_iter->mark() >= 0 && - _iter->self() >= 1 ) - { - _mmsh._quad4. - _data[_fout]._node[0] - = _nmap[_iter->node(0)] ; - _mmsh._quad4. - _data[_fout]._node[1] - = _nmap[_iter->node(1)] ; - _mmsh._quad4. - _data[_fout]._node[2] - = _nmap[_iter->node(2)] ; - _mmsh._quad4. - _data[_fout]._node[2] - = _nmap[_iter->node(2)] ; - - _mmsh._quad4. - _data[_fout]. - _itag = _iter->itag() ; - - _fout = _fout + 1 ; - } - } - - _mesh._euclidean_mesh_3d._mesh._llQ4. - clear(containers::tight_alloc); - - _mesh._euclidean_mesh_3d._mesh._aaQ4. - clear(containers::tight_alloc); - - _mesh._euclidean_mesh_3d._mesh._mmQ4. - clear(containers::tight_alloc); - - } - - if (_nnT4 > +0) - { - /*-------------------------- write TRIA4 data */ - jigsaw_alloc_tria4 ( - &_mmsh._tria4, _nnT4) ; - - iptr_type _tout = +0 ; - for (auto _iter = _mesh. - _euclidean_mesh_3d._mesh.tri4().head() ; - _iter != _mesh. - _euclidean_mesh_3d._mesh.tri4().tend() ; - ++_iter ) - { - if (_iter->mark() >= 0 && - _iter->self() >= 1 ) - { - _mmsh._tria4. - _data[_tout]._node[0] - = _nmap[_iter->node(0)] ; - _mmsh._tria4. - _data[_tout]._node[1] - = _nmap[_iter->node(1)] ; - _mmsh._tria4. - _data[_tout]._node[2] - = _nmap[_iter->node(2)] ; - _mmsh._tria4. - _data[_tout]._node[3] - = _nmap[_iter->node(3)] ; - - _mmsh._tria4. - _data[_tout]. - _itag = _iter->itag() ; - - _tout = _tout + 1 ; - } - } - - _mesh._euclidean_mesh_3d._mesh._llT4. - clear(containers::tight_alloc); - - _mesh._euclidean_mesh_3d._mesh._mmT4. - clear(containers::tight_alloc); - - } - - } - - } - catch (...) - { - _errv = __unknown_error ; - } - - return ( _errv ) ; - } - - /* - -------------------------------------------------------- - * SAVE-HFUN: save *.MSH output file. - -------------------------------------------------------- - */ - - template < - typename file_type , - typename list_type - > - __normal_call void_type save_vals ( - file_type &_file, - list_type &_list - ) - { - /*--------------------- save msh_t REALS data to file */ - auto _next = +0, _roll = +0 ; - char _fbuf[PRINTCHUNK] ; - - auto _this = _list.head() ; - - for (auto _iter = _this, - _last =(_list.tend() - 4); - _iter < _last; - _iter += +4, - _this += +4) - { - /*--------------------- (apparently) faster to unroll */ - PRINTCHARS(snprintf(&_fbuf[_next] , - PRINTCHUNK, - "%.9g\n%.9g\n%.9g\n%.9g\n" , - *(_iter + 0), *(_iter + 1) , - *(_iter + 2), *(_iter + 3) ) , - VALUECHUNK / +4) - } - - for (auto _iter = _this; - _iter < _list.tend() ; - _iter += +1) - { - /*--------------------- (apparently) faster to unroll */ - PRINTCHARS(snprintf(&_fbuf[_next] , - PRINTCHUNK, "%.9g\n", *_iter) , - VALUECHUNK / +1) - } - - { - /*--------------------- ensure last buffer is written */ - PRINTFINAL; - } - } - - template < - typename jlog_data - > - __normal_call iptr_type save_hfun ( - jcfg_data &_jcfg , - jlog_data &_jlog , - hfun_data &_ffun - ) - { - iptr_type _errv = __no_error ; - - // NB. this routine handles output for MARCHE --- this - // will *overwrite* the hfun-file input... - - __unreferenced(_jlog) ; - - try - { - std::string _path, _name, _fext; - file_part( - _jcfg._hfun_file, _path, _name, _fext) ; - - std::ofstream _file; - _file.open( - _jcfg._hfun_file, - std::ofstream::out | std::ofstream::trunc) ; - - if (_file.is_open()) - { - if (_ffun._ndim == +2 && - _ffun._kind == - jmsh_kind::euclidean_mesh) - { - /*-------------------------- save 2-dim. mesh */ - _file << "# " << _name << ".msh" - << "; created by " ; - _file << __JGSWVSTR "\n" ; - _file << "MSHID=3;EUCLIDEAN-MESH \n" ; - _file << "NDIMS=2 \n" ; - - /*-------------------------- count mesh items */ - iptr_type _nnum = +0 ; - iptr_type _tnum = +0 ; - - for (auto _iter = _ffun. - _euclidean_mesh_2d._mesh.node().head() ; - _iter != _ffun. - _euclidean_mesh_2d._mesh.node().tend() ; - ++_iter ) - { - if (_iter->mark() >= +0 && - _iter->self() >= +1 ) - { - _nnum += +1 ; - } - } - - for (auto _iter = _ffun. - _euclidean_mesh_2d._mesh.tri3().head() ; - _iter != _ffun. - _euclidean_mesh_2d._mesh.tri3().tend() ; - ++_iter ) - { - if (_iter->mark() >= +0 && - _iter->self() >= +1 ) - { - _tnum += +1 ; - } - } - - if (_nnum > +0) - { - /*-------------------------- write POINT data */ - _file << "POINT=" << _nnum << "\n" ; - - auto _next = +0, _roll = +0, - _npos = +0; - char _fbuf[PRINTCHUNK] ; - - for (auto _iter = _ffun. - _euclidean_mesh_2d._mesh.node().head() ; - _iter != _ffun. - _euclidean_mesh_2d._mesh.node().tend() ; - ++_iter, ++_npos) - { - if (_iter->mark() >= 0 ) - { - PRINTCHARS(snprintf(&_fbuf[_next] , - PRINTCHUNK, - "%.17g;%.17g;+0\n" , - _iter->pval(0) , - _iter->pval(1) ), VERT2CHUNK) - } - } - PRINTFINAL; - } - - if (_nnum > +0) - { - /*-------------------------- write VALUE data */ - _file << "VALUE=" - << _nnum << ";1" << "\n" ; - - save_vals(_file, - _ffun._euclidean_mesh_2d._hval); - } - - if (_tnum > +0) - { - /*-------------------------- write TRIA3 data */ - _file << "TRIA3=" << _tnum << "\n" ; - - auto _next = +0, _roll = +0; - char _fbuf[PRINTCHUNK] ; - - for (auto _iter = _ffun. - _euclidean_mesh_2d._mesh.tri3().head() ; - _iter != _ffun. - _euclidean_mesh_2d._mesh.tri3().tend() ; - ++_iter ) - { - if (_iter->mark() >= 0 && - _iter->self() >= 1 ) - { - PRINTCHARS(snprintf(&_fbuf[_next] , - PRINTCHUNK, "%u;%u;%u;+0\n", - _iter->node(0) , - _iter->node(1) , - _iter->node(2) ), TRIA3CHUNK) - } - } - PRINTFINAL; - } - - } - else - if (_ffun._ndim == +3 && - _ffun._kind == - jmsh_kind::euclidean_mesh) - { - /*-------------------------- save 3-dim. mesh */ - _file << "# " << _name << ".msh" - << "; created by " ; - _file << __JGSWVSTR "\n" ; - _file << "MSHID=3;EUCLIDEAN-MESH \n" ; - _file << "NDIMS=3 \n" ; - - /*-------------------------- count mesh items */ - iptr_type _nnum = +0 ; - iptr_type _tnum = +0 ; - - for (auto _iter = _ffun. - _euclidean_mesh_3d._mesh.node().head() ; - _iter != _ffun. - _euclidean_mesh_3d._mesh.node().tend() ; - ++_iter ) - { - if (_iter->mark() >= +0 && - _iter->self() >= +1 ) - { - _nnum += +1 ; - } - } - - for (auto _iter = _ffun. - _euclidean_mesh_3d._mesh.tri4().head() ; - _iter != _ffun. - _euclidean_mesh_3d._mesh.tri4().tend() ; - ++_iter ) - { - if (_iter->mark() >= +0 && - _iter->self() >= +1 ) - { - _tnum += +1 ; - } - } - - if (_nnum > +0) - { - /*-------------------------- write POINT data */ - _file << "POINT=" << _nnum << "\n" ; - - auto _next = +0, _roll = +0, - _npos = +0; - char _fbuf[PRINTCHUNK] ; - - for (auto _iter = _ffun. - _euclidean_mesh_3d._mesh.node().head() ; - _iter != _ffun. - _euclidean_mesh_3d._mesh.node().tend() ; - ++_iter, ++_npos) - { - if (_iter->mark() >= 0 ) - { - PRINTCHARS(snprintf(&_fbuf[_next] , - PRINTCHUNK, - "%.17g;%.17g;%.17g;+0\n" , - _iter->pval(0) , - _iter->pval(1) , - _iter->pval(2) ), VERT3CHUNK) - } - } - PRINTFINAL; - } - - if (_nnum > +0) - { - /*-------------------------- write VALUE data */ - _file << "VALUE=" - << _nnum << ";1" << "\n" ; - - save_vals(_file, - _ffun._euclidean_mesh_3d._hval); - } - - if (_tnum > +0) - { - /*-------------------------- write TRIA3 data */ - _file << "TRIA4=" << _tnum << "\n" ; - - auto _next = +0, _roll = +0; - char _fbuf[PRINTCHUNK] ; - - for (auto _iter = _ffun. - _euclidean_mesh_3d._mesh.tri4().head() ; - _iter != _ffun. - _euclidean_mesh_3d._mesh.tri4().tend() ; - ++_iter ) - { - if (_iter->mark() >= 0 && - _iter->self() >= 1 ) - { - PRINTCHARS(snprintf(&_fbuf[_next] , - PRINTCHUNK, - "%u;%u;%u;%u;+0\n" , - _iter->node(0) , - _iter->node(1) , - _iter->node(2) , - _iter->node(3) ), TRIA4CHUNK) - } - } - PRINTFINAL; - } - - } - else - if (_ffun._ndim == +2 && - _ffun._kind == - jmsh_kind::ellipsoid_mesh) - { - /*-------------------------- save 3-dim. mesh */ - _file << "# " << _name << ".msh" - << "; created by " ; - _file << __JGSWVSTR "\n" ; - _file << "MSHID=3;ELLIPSOID-MESH \n" ; - _file << "NDIMS=2 \n" ; - - /*-------------------------- write class data */ - { - char _fbuf [PRINTCHUNK] ; - auto _char = snprintf(&_fbuf[ 0 ] , - PRINTCHUNK, - "%.17g;%.17g;%.17g\n", - _ffun._ellipsoid_mesh_3d._radA , - _ffun._ellipsoid_mesh_3d._radB , - _ffun._ellipsoid_mesh_3d._radC) ; - - _file << "RADII=" - << std::string(_fbuf, _char) ; - } - - /*-------------------------- count mesh items */ - iptr_type _nnum = +0 ; - iptr_type _tnum = +0 ; - - for (auto _iter = _ffun. - _ellipsoid_mesh_3d._mesh.node().head() ; - _iter != _ffun. - _ellipsoid_mesh_3d._mesh.node().tend() ; - ++_iter ) - { - if (_iter->mark() >= +0 && - _iter->self() >= +1 ) - { - _nnum += +1 ; - } - } - - for (auto _iter = _ffun. - _ellipsoid_mesh_3d._mesh.tri3().head() ; - _iter != _ffun. - _ellipsoid_mesh_3d._mesh.tri3().tend() ; - ++_iter ) - { - if (_iter->mark() >= +0 && - _iter->self() >= +1 ) - { - _tnum += +1 ; - } - } - - if (_nnum > +0) - { - /*-------------------------- write POINT data */ - _file << "POINT=" << _nnum << "\n" ; - - auto _next = +0, _roll = +0, - _npos = +0; - char _fbuf[PRINTCHUNK] ; - - for (auto _iter = _ffun. - _ellipsoid_mesh_3d._mesh.node().head() ; - _iter != _ffun. - _ellipsoid_mesh_3d._mesh.node().tend() ; - ++_iter, ++_npos) - { - if (_iter->mark() >= +0) - { - real_type _ppos[3] ; - _ppos[0] =_iter->pval(0); - _ppos[1] =_iter->pval(1); - _ppos[2] =_iter->pval(2); - - real_type _apos[2] ; - _ffun._ellipsoid_mesh_3d. - toS2(_ppos, _apos); - - PRINTCHARS(snprintf(&_fbuf[_next] , - PRINTCHUNK , - "%.17g;%.17g;+0\n", - _apos[ 0], - _apos[ 1]) , VERT2CHUNK) - } - } - PRINTFINAL; - } - - if (_nnum > +0) - { - /*-------------------------- write VALUE data */ - _file << "VALUE=" - << _nnum << ";1" << "\n" ; - - save_vals(_file, - _ffun._ellipsoid_mesh_3d._hval); - } - - if (_tnum > +0) - { - /*-------------------------- write TRIA3 data */ - _file << "TRIA3=" << _tnum << "\n" ; - - auto _next = +0, _roll = +0; - char _fbuf[PRINTCHUNK] ; - - for (auto _iter = _ffun. - _ellipsoid_mesh_3d._mesh.tri3().head() ; - _iter != _ffun. - _ellipsoid_mesh_3d._mesh.tri3().tend() ; - ++_iter ) - { - if (_iter->mark() >= 0 && - _iter->self() >= 1 ) - { - PRINTCHARS(snprintf(&_fbuf[_next] , - PRINTCHUNK, "%u;%u;%u;+0\n", - _iter->node(0) , - _iter->node(1) , - _iter->node(2) ), TRIA3CHUNK) - } - } - PRINTFINAL; - } - - } - else - if (_ffun._ndim == +2 && - _ffun._kind == - jmsh_kind::euclidean_grid) - { - /*-------------------------- save 2-dim. grid */ - _file << "# " << _name << ".msh" - << "; created by " ; - _file << __JGSWVSTR "\n" ; - _file << "MSHID=3;EUCLIDEAN-GRID \n" ; - _file << "NDIMS=2 \n" ; - - /*-------------------------- write class data */ - - if (_ffun._euclidean_grid_2d. - _xpos.count() > +0) - { - /*-------------------------- write COORD data */ - _file << "COORD=1;" << - _ffun._euclidean_grid_2d. - _xpos.count() << "\n" ; - - save_vals(_file, - _ffun._euclidean_grid_2d._xpos); - } - - if (_ffun._euclidean_grid_2d. - _ypos.count() > +0) - { - /*-------------------------- write COORD data */ - _file << "COORD=2;" << - _ffun._euclidean_grid_2d. - _ypos.count() << "\n" ; - - save_vals(_file, - _ffun._euclidean_grid_2d._ypos); - } - - if (_ffun._euclidean_grid_2d. - _hmat.count() > +0) - { - /*-------------------------- write VALUE data */ - _file << "VALUE=" << - _ffun._euclidean_grid_2d. - _hmat.count() << ";1" "\n" ; - - save_vals(_file, - _ffun._euclidean_grid_2d._hmat); - } - - } - else - if (_ffun._ndim == +3 && - _ffun._kind == - jmsh_kind::euclidean_grid) - { - /*-------------------------- save 3-dim. grid */ - _file << "# " << _name << ".msh" - << "; created by " ; - _file << __JGSWVSTR "\n" ; - _file << "MSHID=3;EUCLIDEAN-GRID \n" ; - _file << "NDIMS=3 \n" ; - - /*-------------------------- write class data */ - - if (_ffun._euclidean_grid_3d. - _xpos.count() > +0) - { - /*-------------------------- write COORD data */ - _file << "COORD=1;" << - _ffun._euclidean_grid_3d. - _xpos.count() << "\n" ; - - save_vals(_file, - _ffun._euclidean_grid_3d._xpos); - } - - if (_ffun._euclidean_grid_3d. - _ypos.count() > +0) - { - /*-------------------------- write COORD data */ - _file << "COORD=2;" << - _ffun._euclidean_grid_3d. - _ypos.count() << "\n" ; - - save_vals(_file, - _ffun._euclidean_grid_3d._ypos); - } - - if (_ffun._euclidean_grid_3d. - _zpos.count() > +0) - { - /*-------------------------- write COORD data */ - _file << "COORD=3;" << - _ffun._euclidean_grid_3d. - _zpos.count() << "\n" ; - - save_vals(_file, - _ffun._euclidean_grid_3d._zpos); - } - - if (_ffun._euclidean_grid_3d. - _hmat.count() > +0) - { - /*-------------------------- write VALUE data */ - _file << "VALUE=" << - _ffun._euclidean_grid_3d. - _hmat.count() << ";1" "\n" ; - - save_vals(_file, - _ffun._euclidean_grid_3d._hmat); - } - - } - else - if (_ffun._ndim == +2 && - _ffun._kind == - jmsh_kind::ellipsoid_grid) - { - /*-------------------------- save 2-dim. grid */ - _file << "# " << _name << ".msh" - << "; created by " ; - _file << __JGSWVSTR "\n" ; - _file << "MSHID=3;ELLIPSOID-GRID \n" ; - _file << "NDIMS=2 \n" ; - - /*-------------------------- write class data */ - { - char _fbuf [PRINTCHUNK] ; - auto _char = snprintf(&_fbuf[ 0 ] , - PRINTCHUNK, - "%.17g;%.17g;%.17g\n", - _ffun._ellipsoid_grid_3d._radA , - _ffun._ellipsoid_grid_3d._radB , - _ffun._ellipsoid_grid_3d._radC) ; - - _file << "RADII=" - << std::string(_fbuf, _char) ; - } - - if (_ffun._ellipsoid_grid_3d. - _xpos.count() > +0) - { - /*-------------------------- write COORD data */ - _file << "COORD=1;" << - _ffun._ellipsoid_grid_3d. - _xpos.count() << "\n" ; - - save_vals(_file, - _ffun._ellipsoid_grid_3d._xpos); - } - - if (_ffun._ellipsoid_grid_3d. - _ypos.count() > +0) - { - /*-------------------------- write COORD data */ - _file << "COORD=2;" << - _ffun._ellipsoid_grid_3d. - _ypos.count() << "\n" ; - - save_vals(_file, - _ffun._ellipsoid_grid_3d._ypos); - } - - if (_ffun._ellipsoid_grid_3d. - _hmat.count() > +0) - { - /*-------------------------- write VALUE data */ - _file << "VALUE=" << - _ffun._ellipsoid_grid_3d. - _hmat.count() << ";1" "\n" ; - - save_vals(_file, - _ffun._ellipsoid_grid_3d._hmat); - } - - } - - } - else - { - _errv = __file_not_created ; - } - - _file.close(); - - } - catch (...) - { - _errv = __unknown_error ; - } - - return ( _errv ) ; - } - - /* - -------------------------------------------------------- - * SAVE-MESH: save MSH_t output data. - -------------------------------------------------------- - */ - - template < - typename jlog_data - > - __normal_call iptr_type save_hfun ( - jcfg_data &_jcfg , - jlog_data &_jlog , - hfun_data &_ffun , - jigsaw_msh_t &_fmsh - ) - { - iptr_type _errv = __no_error ; - - // NB. this routine handles output for MARCHE --- only - // *overwriting* the "value" arrays in FMSH, since all - // else is passed read-only... - - try - { - __unreferenced (_jcfg) ; - __unreferenced (_jlog) ; - - if (_ffun._ndim == +2 && // save 2-dim. mesh - _ffun._kind == - jmsh_kind::euclidean_mesh) - { - _fmsh._flags = JIGSAW_EUCLIDEAN_MESH ; - - if (_ffun._euclidean_mesh_2d. - _hval.count() > +0) - { - /*-------------------------- write VALUE data */ - __assert( _fmsh._value._size == - _ffun._euclidean_mesh_2d. - _hval.count() && - "savemsh: inconsistent VALUE array") ; - - iptr_type _ipos = +0 ; - for (auto _iter = _ffun. - _euclidean_mesh_2d._hval.head(); - _iter != _ffun. - _euclidean_mesh_2d._hval.tend(); - ++_iter, ++_ipos) - { - _fmsh._value. - _data[_ipos] = *_iter ; - } - } - - } - else - if (_ffun._ndim == +3 && // save 3-dim. mesh - _ffun._kind == - jmsh_kind::euclidean_mesh) - { - _fmsh._flags = JIGSAW_EUCLIDEAN_MESH ; - - if (_ffun._euclidean_mesh_3d. - _hval.count() > +0) - { - /*-------------------------- write VALUE data */ - __assert( _fmsh._value._size == - _ffun._euclidean_mesh_3d. - _hval.count() && - "savemsh: inconsistent VALUE array") ; - - iptr_type _ipos = +0 ; - for (auto _iter = _ffun. - _euclidean_mesh_3d._hval.head(); - _iter != _ffun. - _euclidean_mesh_3d._hval.tend(); - ++_iter, ++_ipos) - { - _fmsh._value. - _data[_ipos] = *_iter ; - } - } - - } - else - if (_ffun._ndim == +2 && // save 2-sph. mesh - _ffun._kind == - jmsh_kind::ellipsoid_mesh) - { - _fmsh._flags = JIGSAW_ELLIPSOID_MESH ; - - if (_ffun._ellipsoid_mesh_3d. - _hval.count() > +0) - { - /*-------------------------- write VALUE data */ - __assert( _fmsh._value._size == - _ffun._ellipsoid_mesh_3d. - _hval.count() && - "savemsh: inconsistent VALUE array") ; - - iptr_type _ipos = +0 ; - for (auto _iter = _ffun. - _ellipsoid_mesh_3d._hval.head(); - _iter != _ffun. - _ellipsoid_mesh_3d._hval.tend(); - ++_iter, ++_ipos) - { - _fmsh._value. - _data[_ipos] = *_iter ; - } - } - - } - else - if (_ffun._ndim == +2 && // save 2-dim. grid - _ffun._kind == - jmsh_kind::euclidean_grid) - { - _fmsh._flags = JIGSAW_EUCLIDEAN_GRID ; - - if (_ffun._euclidean_grid_2d. - _hmat.count() > +0) - { - /*-------------------------- write VALUE data */ - __assert( _fmsh._value._size == - _ffun._euclidean_grid_2d. - _hmat.count() && - "savemsh: inconsistent VALUE array") ; - - iptr_type _ipos = +0 ; - for (auto _iter = _ffun. - _euclidean_grid_2d._hmat.head(); - _iter != _ffun. - _euclidean_grid_2d._hmat.tend(); - ++_iter, ++_ipos) - { - _fmsh._value. - _data[_ipos] = *_iter ; - } - } - - } - else - if (_ffun._ndim == +3 && // save 3-dim. grid - _ffun._kind == - jmsh_kind::euclidean_grid) - { - _fmsh._flags = JIGSAW_EUCLIDEAN_GRID ; - - if (_ffun._euclidean_grid_3d. - _hmat.count() > +0) - { - /*-------------------------- write VALUE data */ - __assert( _fmsh._value._size == - _ffun._euclidean_grid_3d. - _hmat.count() && - "savemsh: inconsistent VALUE array") ; - - iptr_type _ipos = +0 ; - for (auto _iter = _ffun. - _euclidean_grid_3d._hmat.head(); - _iter != _ffun. - _euclidean_grid_3d._hmat.tend(); - ++_iter, ++_ipos) - { - _fmsh._value. - _data[_ipos] = *_iter ; - } - } - - } - else - if (_ffun._ndim == +2 && // save 2-sph. grid - _ffun._kind == - jmsh_kind::ellipsoid_grid) - { - _fmsh._flags = JIGSAW_ELLIPSOID_GRID ; - - if (_ffun._ellipsoid_grid_3d. - _hmat.count() > +0) - { - /*-------------------------- write VALUE data */ - __assert( _fmsh._value._size == - _ffun._ellipsoid_grid_3d. - _hmat.count() && - "savemsh: inconsistent VALUE array") ; - - iptr_type _ipos = +0 ; - for (auto _iter = _ffun. - _ellipsoid_grid_3d._hmat.head(); - _iter != _ffun. - _ellipsoid_grid_3d._hmat.tend(); - ++_iter, ++_ipos) - { - _fmsh._value. - _data[_ipos] = *_iter ; - } - } - - } - - } - catch (...) - { - _errv = __unknown_error ; - } - - return ( _errv ) ; - } +# include "rdt_save.inc" +# include "tri_save.inc" +# include "msh_save.inc" +# include "hfn_save.inc" # endif //__MSH_SAVE__ diff --git a/external/jigsaw/src/msh_save.inc b/external/jigsaw/src/msh_save.inc new file mode 100644 index 0000000..f879dd8 --- /dev/null +++ b/external/jigsaw/src/msh_save.inc @@ -0,0 +1,1619 @@ + + /* + -------------------------------------------------------- + * MSH-SAVE: parse MESH data into *.MSH / MSH_t. + -------------------------------------------------------- + * + * This program may be freely redistributed under the + * condition that the copyright notices (including this + * entire header) are not removed, and no compensation + * is received through use of the software. Private, + * research, and institutional use is free. You may + * distribute modified versions of this code UNDER THE + * CONDITION THAT THIS CODE AND ANY MODIFICATIONS MADE + * TO IT IN THE SAME FILE REMAIN UNDER COPYRIGHT OF THE + * ORIGINAL AUTHOR, BOTH SOURCE AND OBJECT CODE ARE + * MADE FREELY AVAILABLE WITHOUT CHARGE, AND CLEAR + * NOTICE IS GIVEN OF THE MODIFICATIONS. Distribution + * of this code as part of a commercial system is + * permissible ONLY BY DIRECT ARRANGEMENT WITH THE + * AUTHOR. (If you are not directly supplying this + * code to a customer, and you are instead telling them + * how they can obtain it for free, then you are not + * required to make any arrangement with me.) + * + * Disclaimer: Neither I nor THE CONTRIBUTORS warrant + * this code in any way whatsoever. This code is + * provided "as-is" to be used at your own risk. + * + * THE CONTRIBUTORS include: + * (a) The University of Sydney + * (b) The Massachusetts Institute of Technology + * (c) Columbia University + * (d) The National Aeronautics & Space Administration + * (e) Los Alamos National Laboratory + * + -------------------------------------------------------- + * + * Last updated: 30 May, 2022 + * + * Copyright 2013-2022 + * Darren Engwirda + * d.engwirda@gmail.com + * https://github.com/dengwirda/ + * + -------------------------------------------------------- + */ + + // from msh_save.hpp + + + /* + -------------------------------------------------------- + * SAVE-MESH: save *.MSH output file. + -------------------------------------------------------- + */ + + #define save_vert2(_mesh) \ + _file << "POINT=" << _nnN1 << "\n" ; \ + \ + auto _next = +0, _roll = +0, \ + _npos = +0; \ + char _fbuf[PRINTCHUNK] ; \ + \ + for (auto _iter = _mesh.node().head() ; \ + _iter != _mesh.node().tend() ; \ + ++_iter, ++_npos) \ + { \ + if (_iter->mark() >= 0 && \ + _nmap[_npos ] >= 0 ) \ + { \ + PRINTCHARS(snprintf(&_fbuf[_next] , \ + PRINTCHUNK, \ + "%.17g;%.17g;%d\n" , \ + _iter->pval(0) + _xoff[0] , \ + _iter->pval(1) + _xoff[1] , \ + _iter->itag()) , VERT2CHUNK ) \ + } \ + } \ + PRINTFINAL; \ + + + #define save_vert3(_mesh) \ + _file << "POINT=" << _nnN1 << "\n" ; \ + \ + auto _next = +0, _roll = +0, \ + _npos = +0; \ + char _fbuf[PRINTCHUNK] ; \ + \ + for (auto _iter = _mesh.node().head() ; \ + _iter != _mesh.node().tend() ; \ + ++_iter, ++_npos) \ + { \ + if (_iter->mark() >= 0 && \ + _nmap[_npos ] >= 0 ) \ + { \ + PRINTCHARS(snprintf(&_fbuf[_next] , \ + PRINTCHUNK, \ + "%.17g;%.17g;%.17g;%d\n", \ + _iter->pval(0) + _xoff[0] , \ + _iter->pval(1) + _xoff[1] , \ + _iter->pval(2) + _xoff[2] , \ + _iter->itag()) , VERT3CHUNK ) \ + } \ + } \ + PRINTFINAL; \ + + + #define save_vpwrk(_koff, _mesh) \ + _file << "POWER=" << _nnN1 << ";1" << "\n" ; \ + \ + auto _next = +0, _roll = +0, \ + _npos = +0; \ + char _fbuf[PRINTCHUNK] ; \ + \ + for (auto _iter = _mesh.node().head() ; \ + _iter != _mesh.node().tend() ; \ + ++_iter, ++_npos) \ + { \ + if (_iter->mark() >= 0 && \ + _nmap[_npos ] >= 0) \ + { \ + PRINTCHARS(snprintf(&_fbuf[_next] , \ + PRINTCHUNK, "%.17g\n" , \ + _iter->pval(_koff) ), VALUECHUNK) \ + } \ + } \ + PRINTFINAL; \ + + + #define save_edge2(_mesh) \ + _file << "EDGE2=" << _nnE2 << "\n" ; \ + \ + auto _next = +0, _roll = +0; \ + char _fbuf[PRINTCHUNK] ; \ + \ + for (auto _iter = _mesh.edge().head() ; \ + _iter != _mesh.edge().tend() ; \ + ++_iter ) \ + { \ + if (_iter->mark() >= 0 && \ + _iter->self() >= 1 ) \ + { \ + PRINTCHARS(snprintf(&_fbuf[_next] , \ + PRINTCHUNK, "%u;%u;%d\n", \ + _nmap[_iter->node(0)] , \ + _nmap[_iter->node(1)] , \ + _iter->itag()), EDGE2CHUNK) \ + } \ + } \ + PRINTFINAL; \ + + + #define save_tria3(_mesh) \ + _file << "TRIA3=" << _nnT3 << "\n" ; \ + \ + auto _next = +0, _roll = +0; \ + char _fbuf[PRINTCHUNK] ; \ + \ + for (auto _iter = _mesh.tri3().head() ; \ + _iter != _mesh.tri3().tend() ; \ + ++_iter ) \ + { \ + if (_iter->mark() >= 0 && \ + _iter->self() >= 1 ) \ + { \ + PRINTCHARS(snprintf(&_fbuf[_next] , \ + PRINTCHUNK, "%u;%u;%u;%d\n", \ + _nmap[_iter->node(0)] , \ + _nmap[_iter->node(1)] , \ + _nmap[_iter->node(2)] , \ + _iter->itag()), TRIA3CHUNK) \ + } \ + } \ + PRINTFINAL; \ + + + #define save_quad4(_mesh) \ + _file << "QUAD4=" << _nnQ4 << "\n" ; \ + \ + auto _next = +0, _roll = +0; \ + char _fbuf[PRINTCHUNK] ; \ + \ + for (auto _iter = _mesh.quad().head() ; \ + _iter != _mesh.quad().tend() ; \ + ++_iter ) \ + { \ + if (_iter->mark() >= 0 && \ + _iter->self() >= 1 ) \ + { \ + PRINTCHARS(snprintf(&_fbuf[_next] , \ + PRINTCHUNK, \ + "%u;%u;%u;%u;%d\n", \ + _nmap[_iter->node(0)] , \ + _nmap[_iter->node(1)] , \ + _nmap[_iter->node(2)] , \ + _nmap[_iter->node(3)] , \ + _iter->itag()), QUAD4CHUNK) \ + } \ + } \ + PRINTFINAL; \ + + + #define save_tria4(_mesh) \ + _file << "TRIA4=" << _nnT4 << "\n" ; \ + \ + auto _next = +0, _roll = +0; \ + char _fbuf[PRINTCHUNK] ; \ + \ + for (auto _iter = _mesh.tri4().head() ; \ + _iter != _mesh.tri4().tend() ; \ + ++_iter ) \ + { \ + if (_iter->mark() >= 0 && \ + _iter->self() >= 1 ) \ + { \ + PRINTCHARS(snprintf(&_fbuf[_next] , \ + PRINTCHUNK, \ + "%u;%u;%u;%u;%d\n", \ + _nmap[_iter->node(0)] , \ + _nmap[_iter->node(1)] , \ + _nmap[_iter->node(2)] , \ + _nmap[_iter->node(3)] , \ + _iter->itag()), TRIA4CHUNK) \ + } \ + } \ + PRINTFINAL; \ + + + template < + typename jlog_data + > + __normal_call iptr_type save_mesh ( + jcfg_data &_jcfg , + jlog_data &_jlog , + float *_xoff , + mesh_data &_mesh , + mshfile_tag const& + ) + { + iptr_type _errv = __no_error ; + + try + { + containers::array _nmap; + + __unreferenced(_jlog) ; + + std::string _path, _name, _fext; + file_part( + _jcfg._mesh_file, _path, _name, _fext) ; + + std::ofstream _file; + _file.open( + _jcfg._mesh_file, + std::ofstream::out | std::ofstream::trunc) ; + + if (_file.is_open()) + { + if (_mesh._ndim == +2 && + _mesh._kind == + jmsh_kind::euclidean_mesh) + { + /*-------------------------- save 2-dim. mesh */ + _file << "# " << _name << ".msh" + << "; created by " ; + _file << __JGSWVSTR "\n" ; + _file << "MSHID=3;EUCLIDEAN-MESH \n" ; + _file << "NDIMS=2 \n" ; + + /*------------ index mapping for active nodes */ + _nmap.set_count(_mesh. + _euclidean_mesh_2d._mesh.node().count() , + containers::tight_alloc, -1) ; + + iptr_type _nnN1 = +0 ; + iptr_type _nnE2 = +0 ; + iptr_type _nnT3 = +0 ; + iptr_type _nnQ4 = +0 ; + + for (auto _iter = _mesh. + _euclidean_mesh_2d._mesh.edge().head() ; + _iter != _mesh. + _euclidean_mesh_2d._mesh.edge().tend() ; + ++_iter ) + { + if (_iter->mark() >= +0 && + _iter->self() >= +1 ) + { + _nmap[_iter->node(0)] = +1 ; + _nmap[_iter->node(1)] = +1 ; + _nnE2 += +1 ; + } + } + + for (auto _iter = _mesh. + _euclidean_mesh_2d._mesh.tri3().head() ; + _iter != _mesh. + _euclidean_mesh_2d._mesh.tri3().tend() ; + ++_iter ) + { + if (_iter->mark() >= +0 && + _iter->self() >= +1 ) + { + _nmap[_iter->node(0)] = +1 ; + _nmap[_iter->node(1)] = +1 ; + _nmap[_iter->node(2)] = +1 ; + _nnT3 += +1 ; + } + } + + for (auto _iter = _mesh. + _euclidean_mesh_2d._mesh.quad().head() ; + _iter != _mesh. + _euclidean_mesh_2d._mesh.quad().tend() ; + ++_iter ) + { + if (_iter->mark() >= +0 && + _iter->self() >= +1 ) + { + _nmap[_iter->node(0)] = +1 ; + _nmap[_iter->node(1)] = +1 ; + _nmap[_iter->node(2)] = +1 ; + _nmap[_iter->node(3)] = +1 ; + _nnQ4 += +1 ; + } + } + + for (auto _iter = _nmap.head(); + _iter != _nmap.tend(); + ++_iter ) + { + if ( *_iter >= +0) + { + *_iter = _nnN1 ++ ; + } + } + + if (_nnN1 > +0) + { + /*-------------------------- write POINT data */ + save_vert2( + _mesh._euclidean_mesh_2d._mesh) + } + if (_nnN1 > +0) + { + /*-------------------------- write POWER data */ + save_vpwrk( + +2, _mesh._euclidean_mesh_2d._mesh) + } + + if (_nnE2 > +0) + { + /*-------------------------- write EDGE2 data */ + save_edge2( + _mesh._euclidean_mesh_2d._mesh) + } + if (_nnT3 > +0) + { + /*-------------------------- write TRIA3 data */ + save_tria3( + _mesh._euclidean_mesh_2d._mesh) + } + if (_nnQ4 > +0) + { + /*-------------------------- write QUAD4 data */ + save_quad4( + _mesh._euclidean_mesh_2d._mesh) + } + + } + else + if (_mesh._ndim == +3 && + _mesh._kind == + jmsh_kind::euclidean_mesh) + { + /*-------------------------- save 3-dim. mesh */ + _file << "# " << _name << ".msh" + << "; created by " ; + _file << __JGSWVSTR "\n" ; + _file << "MSHID=3;EUCLIDEAN-MESH \n" ; + _file << "NDIMS=3 \n" ; + + /*------------ index mapping for active nodes */ + _nmap.set_count(_mesh. + _euclidean_mesh_3d._mesh.node().count() , + containers::tight_alloc, -1) ; + + iptr_type _nnN1 = +0 ; + iptr_type _nnE2 = +0 ; + iptr_type _nnT3 = +0 ; + iptr_type _nnQ4 = +0 ; + iptr_type _nnT4 = +0 ; + + for (auto _iter = _mesh. + _euclidean_mesh_3d._mesh.edge().head() ; + _iter != _mesh. + _euclidean_mesh_3d._mesh.edge().tend() ; + ++_iter ) + { + if (_iter->mark() >= +0 && + _iter->self() >= +1 ) + { + _nmap[_iter->node(0)] = +1 ; + _nmap[_iter->node(1)] = +1 ; + _nnE2 += +1 ; + } + } + + for (auto _iter = _mesh. + _euclidean_mesh_3d._mesh.tri3().head() ; + _iter != _mesh. + _euclidean_mesh_3d._mesh.tri3().tend() ; + ++_iter ) + { + if (_iter->mark() >= +0 && + _iter->self() >= +1 ) + { + _nmap[_iter->node(0)] = +1 ; + _nmap[_iter->node(1)] = +1 ; + _nmap[_iter->node(2)] = +1 ; + _nnT3 += +1 ; + } + } + + for (auto _iter = _mesh. + _euclidean_mesh_3d._mesh.quad().head() ; + _iter != _mesh. + _euclidean_mesh_3d._mesh.quad().tend() ; + ++_iter ) + { + if (_iter->mark() >= +0 && + _iter->self() >= +1 ) + { + _nmap[_iter->node(0)] = +1 ; + _nmap[_iter->node(1)] = +1 ; + _nmap[_iter->node(2)] = +1 ; + _nmap[_iter->node(3)] = +1 ; + _nnQ4 += +1 ; + } + } + + for (auto _iter = _mesh. + _euclidean_mesh_3d._mesh.tri4().head() ; + _iter != _mesh. + _euclidean_mesh_3d._mesh.tri4().tend() ; + ++_iter ) + { + if (_iter->mark() >= +0 && + _iter->self() >= +1 ) + { + _nmap[_iter->node(0)] = +1 ; + _nmap[_iter->node(1)] = +1 ; + _nmap[_iter->node(2)] = +1 ; + _nmap[_iter->node(3)] = +1 ; + _nnT4 += +1 ; + } + } + + for (auto _iter = _nmap.head(); + _iter != _nmap.tend(); + ++_iter ) + { + if ( *_iter >= +0) + { + *_iter = _nnN1 ++ ; + } + } + + if (_nnN1 > +0) + { + /*-------------------------- write POINT data */ + save_vert3( + _mesh._euclidean_mesh_3d._mesh) + } + if (_nnN1 > +0) + { + /*-------------------------- write POWER data */ + save_vpwrk( + +3, _mesh._euclidean_mesh_3d._mesh) + } + if (_nnE2 > +0) + { + /*-------------------------- write EDGE2 data */ + save_edge2( + _mesh._euclidean_mesh_3d._mesh) + } + if (_nnT3 > +0) + { + /*-------------------------- write TRIA3 data */ + save_tria3( + _mesh._euclidean_mesh_3d._mesh) + } + if (_nnQ4 > +0) + { + /*-------------------------- write QUAD4 data */ + save_quad4( + _mesh._euclidean_mesh_3d._mesh) + } + if (_nnT4 > +0) + { + /*-------------------------- write TRIA4 data */ + save_tria4( + _mesh._euclidean_mesh_3d._mesh) + } + + } + + } + else + { + _errv = __file_not_created ; + } + + _file.close(); + + } + catch (...) + { + _errv = __unknown_error ; + } + + return ( _errv ) ; + } + + #undef save_vert2 + #undef save_vert3 + #undef save_vpwrk + #undef save_edge2 + #undef save_tria3 + #undef save_quad4 + #undef save_tria4 + + /* + -------------------------------------------------------- + * SAVE-MESH: save *.NC output file. + -------------------------------------------------------- + */ + + #ifdef __use_netcdf + + #define save_vert2(_mesh) \ + ncutil::def_dim( \ + _jcfg._mesh_file, "vert2_row", _nnN1); \ + ncutil::def_dim( \ + _jcfg._mesh_file, "vert2_col", +2) ; \ + \ + ncutil::def_var( \ + _jcfg._mesh_file, "vert2_pos", NC_DOUBLE, \ + "2-vertex coordinates" , \ + {"vert2_row", "vert2_col"} ) ; \ + ncutil::def_var( \ + _jcfg._mesh_file, "vert2_tag", NC_INT, \ + "2-vertex id-tags" , \ + {"vert2_row", "singleton"} ) ; \ + ncutil::def_var( \ + _jcfg._mesh_file, "power_val", NC_DOUBLE, \ + "vertex power values" , \ + {"vert2_row", "singleton"} ) ; \ + \ + _pos.clear(); _pos.set_alloc(_nnN1 * 2); \ + _tag.clear(); _tag.set_alloc(_nnN1 * 1); \ + _val.clear(); _val.set_alloc(_nnN1 * 1); \ + \ + auto _npos = +0; \ + for (auto _iter = _mesh.node().head() ; \ + _iter != _mesh.node().tend() ; \ + ++_iter, ++_npos) \ + { \ + if (_iter->mark() >= 0 && \ + _nmap[_npos ] >= 0 ) \ + { \ + _pos.push_tail( \ + _iter->pval(0) + _xoff[0]) ; \ + _pos.push_tail( \ + _iter->pval(1) + _xoff[1]) ; \ + \ + _tag.push_tail(_iter->itag ()) ; \ + \ + _val.push_tail(_iter->pval(2)) ; \ + } \ + } \ + \ + ncutil::put_var( \ + _jcfg._mesh_file, "vert2_pos", &_pos[0]) ; \ + ncutil::put_var( \ + _jcfg._mesh_file, "vert2_tag", &_tag[0]) ; \ + ncutil::put_var( \ + _jcfg._mesh_file, "power_val", &_val[0]) ; \ + + + #define save_vert3(_mesh) \ + ncutil::def_dim( \ + _jcfg._mesh_file, "vert3_row", _nnN1); \ + ncutil::def_dim( \ + _jcfg._mesh_file, "vert3_col", +3) ; \ + \ + ncutil::def_var( \ + _jcfg._mesh_file, "vert3_pos", NC_DOUBLE, \ + "3-vertex coordinates" , \ + {"vert3_row", "vert3_col"} ) ; \ + ncutil::def_var( \ + _jcfg._mesh_file, "vert3_tag", NC_INT, \ + "3-vertex id-tags" , \ + {"vert3_row", "singleton"} ) ; \ + ncutil::def_var( \ + _jcfg._mesh_file, "power_val", NC_DOUBLE, \ + "vertex power values" , \ + {"vert3_row", "singleton"} ) ; \ + \ + _pos.clear(); _pos.set_alloc(_nnN1 * 3); \ + _tag.clear(); _tag.set_alloc(_nnN1 * 1); \ + _val.clear(); _val.set_alloc(_nnN1 * 1); \ + \ + auto _npos = +0; \ + for (auto _iter = _mesh.node().head() ; \ + _iter != _mesh.node().tend() ; \ + ++_iter, ++_npos) \ + { \ + if (_iter->mark() >= 0 && \ + _nmap[_npos ] >= 0 ) \ + { \ + _pos.push_tail( \ + _iter->pval(0) + _xoff[0]) ; \ + _pos.push_tail( \ + _iter->pval(1) + _xoff[1]) ; \ + _pos.push_tail( \ + _iter->pval(2) + _xoff[2]) ; \ + \ + _tag.push_tail(_iter->itag ()) ; \ + \ + _val.push_tail(_iter->pval(3)) ; \ + } \ + } \ + \ + ncutil::put_var( \ + _jcfg._mesh_file, "vert3_pos", &_pos[0]) ; \ + ncutil::put_var( \ + _jcfg._mesh_file, "vert3_tag", &_tag[0]) ; \ + ncutil::put_var( \ + _jcfg._mesh_file, "power_val", &_val[0]) ; \ + + + #define save_edge2(_mesh) \ + ncutil::def_dim( \ + _jcfg._mesh_file, "edge2_row", _nnE2); \ + ncutil::def_dim( \ + _jcfg._mesh_file, "edge2_col", +2) ; \ + \ + ncutil::def_var( \ + _jcfg._mesh_file, "edge2_idx", NC_INT, \ + "2-node edge indexes" , \ + {"edge2_row", "edge2_col"} ) ; \ + ncutil::def_var( \ + _jcfg._mesh_file, "edge2_tag", NC_INT, \ + "2-node edge id-tags" , \ + {"edge2_row", "singleton"} ) ; \ + \ + _idx.clear(); _idx.set_alloc(_nnE2 * 2); \ + _tag.clear(); _tag.set_alloc(_nnE2 * 1); \ + \ + for (auto _iter = _mesh.edge().head() ; \ + _iter != _mesh.edge().tend() ; \ + ++_iter ) \ + { \ + if (_iter->mark() >= 0 && \ + _iter->self() >= 1 ) \ + { \ + _idx.push_tail( \ + _nmap[_iter->node(0)]) ; \ + _idx.push_tail( \ + _nmap[_iter->node(1)]) ; \ + \ + _tag.push_tail(_iter->itag ()) ; \ + } \ + } \ + \ + ncutil::put_var( \ + _jcfg._mesh_file, "edge2_idx", &_idx[0]) ; \ + ncutil::put_var( \ + _jcfg._mesh_file, "edge2_tag", &_tag[0]) ; \ + + + #define save_tria3(_mesh) \ + ncutil::def_dim( \ + _jcfg._mesh_file, "tria3_row", _nnT3); \ + ncutil::def_dim( \ + _jcfg._mesh_file, "tria3_col", +3) ; \ + \ + ncutil::def_var( \ + _jcfg._mesh_file, "tria3_idx", NC_INT, \ + "3-node tria indexes" , \ + {"tria3_row", "tria3_col"} ) ; \ + ncutil::def_var( \ + _jcfg._mesh_file, "tria3_tag", NC_INT, \ + "3-node tria id-tags" , \ + {"tria3_row", "singleton"} ) ; \ + \ + _idx.clear(); _idx.set_alloc(_nnT3 * 3); \ + _tag.clear(); _tag.set_alloc(_nnT3 * 1); \ + \ + for (auto _iter = _mesh.tri3().head() ; \ + _iter != _mesh.tri3().tend() ; \ + ++_iter ) \ + { \ + if (_iter->mark() >= 0 && \ + _iter->self() >= 1 ) \ + { \ + _idx.push_tail( \ + _nmap[_iter->node(0)]) ; \ + _idx.push_tail( \ + _nmap[_iter->node(1)]) ; \ + _idx.push_tail( \ + _nmap[_iter->node(2)]) ; \ + \ + _tag.push_tail(_iter->itag ()) ; \ + } \ + } \ + \ + ncutil::put_var( \ + _jcfg._mesh_file, "tria3_idx", &_idx[0]) ; \ + ncutil::put_var( \ + _jcfg._mesh_file, "tria3_tag", &_tag[0]) ; \ + + + #define save_quad4(_mesh) \ + ncutil::def_dim( \ + _jcfg._mesh_file, "quad4_row", _nnQ4); \ + ncutil::def_dim( \ + _jcfg._mesh_file, "quad4_col", +4) ; \ + \ + ncutil::def_var( \ + _jcfg._mesh_file, "quad4_idx", NC_INT, \ + "4-node quad indexes" , \ + {"quad4_row", "quad4_col"} ) ; \ + ncutil::def_var( \ + _jcfg._mesh_file, "quad4_tag", NC_INT, \ + "4-node quad id-tags" , \ + {"quad4_row", "singleton"} ) ; \ + \ + _idx.clear(); _idx.set_alloc(_nnQ4 * 4); \ + _tag.clear(); _tag.set_alloc(_nnQ4 * 1); \ + \ + for (auto _iter = _mesh.quad().head() ; \ + _iter != _mesh.quad().tend() ; \ + ++_iter ) \ + { \ + if (_iter->mark() >= 0 && \ + _iter->self() >= 1 ) \ + { \ + _idx.push_tail( \ + _nmap[_iter->node(0)]) ; \ + _idx.push_tail( \ + _nmap[_iter->node(1)]) ; \ + _idx.push_tail( \ + _nmap[_iter->node(2)]) ; \ + _idx.push_tail( \ + _nmap[_iter->node(3)]) ; \ + \ + _tag.push_tail(_iter->itag ()) ; \ + } \ + } \ + \ + ncutil::put_var( \ + _jcfg._mesh_file, "quad4_idx", &_idx[0]) ; \ + ncutil::put_var( \ + _jcfg._mesh_file, "quad4_tag", &_tag[0]) ; \ + + + #define save_tria4(_mesh) \ + ncutil::def_dim( \ + _jcfg._mesh_file, "tria4_row", _nnT4); \ + ncutil::def_dim( \ + _jcfg._mesh_file, "tria4_col", +4) ; \ + \ + ncutil::def_var( \ + _jcfg._mesh_file, "tria4_idx", NC_INT, \ + "4-node tria indexes" , \ + {"tria4_row", "tria4_col"} ) ; \ + ncutil::def_var( \ + _jcfg._mesh_file, "tria4_tag", NC_INT, \ + "4-node tria id-tags" , \ + {"tria4_row", "singleton"} ) ; \ + \ + _idx.clear(); _idx.set_alloc(_nnT4 * 4); \ + _tag.clear(); _tag.set_alloc(_nnT4 * 1); \ + \ + for (auto _iter = _mesh.tri4().head() ; \ + _iter != _mesh.tri4().tend() ; \ + ++_iter ) \ + { \ + if (_iter->mark() >= 0 && \ + _iter->self() >= 1 ) \ + { \ + _idx.push_tail( \ + _nmap[_iter->node(0)]) ; \ + _idx.push_tail( \ + _nmap[_iter->node(1)]) ; \ + _idx.push_tail( \ + _nmap[_iter->node(2)]) ; \ + _idx.push_tail( \ + _nmap[_iter->node(3)]) ; \ + \ + _tag.push_tail(_iter->itag ()) ; \ + } \ + } \ + \ + ncutil::put_var( \ + _jcfg._mesh_file, "tria4_idx", &_idx[0]) ; \ + ncutil::put_var( \ + _jcfg._mesh_file, "tria4_tag", &_tag[0]) ; \ + + + template < + typename jlog_data + > + __normal_call iptr_type save_mesh ( + jcfg_data &_jcfg , + jlog_data &_jlog , + float *_xoff , + mesh_data &_mesh , + _netcdf_tag const& + ) + { + iptr_type _errv = __no_error ; + + try + { + containers::array _nmap; + + __unreferenced(_jlog) ; + + std::string _path, _name, _fext; + file_part( + _jcfg._mesh_file, _path, _name, _fext) ; + + int _retv, _ncid; + if ((_retv = nc_create( + _jcfg._mesh_file.c_str(), + NC_CLOBBER|NC_NETCDF4, &_ncid))) + { + return __file_not_created; + } + + if (_mesh._ndim == +2 && + _mesh._kind == + jmsh_kind::euclidean_mesh) + { + /*-------------------------- save 2-dim. mesh */ + ncutil::put_str(_jcfg._mesh_file, + "title", + _name + "; created by " + __JGSWVSTR); + + ncutil::put_str(_jcfg._mesh_file, + "MSHID", "EUCLIDEAN-MESH" ) ; + + /*------------ index mapping for active nodes */ + _nmap.set_count(_mesh. + _euclidean_mesh_2d._mesh.node().count() , + containers::tight_alloc, -1) ; + + iptr_type _nnN1 = +0 ; + iptr_type _nnE2 = +0 ; + iptr_type _nnT3 = +0 ; + iptr_type _nnQ4 = +0 ; + + for (auto _iter = _mesh. + _euclidean_mesh_2d._mesh.edge().head() ; + _iter != _mesh. + _euclidean_mesh_2d._mesh.edge().tend() ; + ++_iter ) + { + if (_iter->mark() >= +0 && + _iter->self() >= +1 ) + { + _nmap[_iter->node(0)] = +1 ; + _nmap[_iter->node(1)] = +1 ; + _nnE2 += +1 ; + } + } + + for (auto _iter = _mesh. + _euclidean_mesh_2d._mesh.tri3().head() ; + _iter != _mesh. + _euclidean_mesh_2d._mesh.tri3().tend() ; + ++_iter ) + { + if (_iter->mark() >= +0 && + _iter->self() >= +1 ) + { + _nmap[_iter->node(0)] = +1 ; + _nmap[_iter->node(1)] = +1 ; + _nmap[_iter->node(2)] = +1 ; + _nnT3 += +1 ; + } + } + + for (auto _iter = _mesh. + _euclidean_mesh_2d._mesh.quad().head() ; + _iter != _mesh. + _euclidean_mesh_2d._mesh.quad().tend() ; + ++_iter ) + { + if (_iter->mark() >= +0 && + _iter->self() >= +1 ) + { + _nmap[_iter->node(0)] = +1 ; + _nmap[_iter->node(1)] = +1 ; + _nmap[_iter->node(2)] = +1 ; + _nmap[_iter->node(3)] = +1 ; + _nnQ4 += +1 ; + } + } + + for (auto _iter = _nmap.head(); + _iter != _nmap.tend(); + ++_iter ) + { + if ( *_iter >= +0) + { + *_iter = _nnN1 ++ ; + } + } + + ncutil::def_dim( + _jcfg._mesh_file, "singleton", +1); + + containers::array _pos; + containers::array _idx; + containers::array _tag; + containers::array _val; + + if (_nnN1 > +0) + { + /*-------------------------- write POINT data */ + save_vert2( + _mesh._euclidean_mesh_2d._mesh) + } + if (_nnE2 > +0) + { + /*-------------------------- write EDGE2 data */ + save_edge2( + _mesh._euclidean_mesh_2d._mesh) + } + if (_nnT3 > +0) + { + /*-------------------------- write TRIA3 data */ + save_tria3( + _mesh._euclidean_mesh_2d._mesh) + } + if (_nnQ4 > +0) + { + /*-------------------------- write QUAD4 data */ + save_quad4( + _mesh._euclidean_mesh_2d._mesh) + } + + } + else + if (_mesh._ndim == +3 && + _mesh._kind == + jmsh_kind::euclidean_mesh) + { + /*-------------------------- save 3-dim. mesh */ + ncutil::put_str(_jcfg._mesh_file, + "title", + _name + "; created by " + __JGSWVSTR); + + ncutil::put_str(_jcfg._mesh_file, + "MSHID", "EUCLIDEAN-MESH" ) ; + + /*------------ index mapping for active nodes */ + _nmap.set_count(_mesh. + _euclidean_mesh_3d._mesh.node().count() , + containers::tight_alloc, -1) ; + + iptr_type _nnN1 = +0 ; + iptr_type _nnE2 = +0 ; + iptr_type _nnT3 = +0 ; + iptr_type _nnQ4 = +0 ; + iptr_type _nnT4 = +0 ; + + for (auto _iter = _mesh. + _euclidean_mesh_3d._mesh.edge().head() ; + _iter != _mesh. + _euclidean_mesh_3d._mesh.edge().tend() ; + ++_iter ) + { + if (_iter->mark() >= +0 && + _iter->self() >= +1 ) + { + _nmap[_iter->node(0)] = +1 ; + _nmap[_iter->node(1)] = +1 ; + _nnE2 += +1 ; + } + } + + for (auto _iter = _mesh. + _euclidean_mesh_3d._mesh.tri3().head() ; + _iter != _mesh. + _euclidean_mesh_3d._mesh.tri3().tend() ; + ++_iter ) + { + if (_iter->mark() >= +0 && + _iter->self() >= +1 ) + { + _nmap[_iter->node(0)] = +1 ; + _nmap[_iter->node(1)] = +1 ; + _nmap[_iter->node(2)] = +1 ; + _nnT3 += +1 ; + } + } + + for (auto _iter = _mesh. + _euclidean_mesh_3d._mesh.quad().head() ; + _iter != _mesh. + _euclidean_mesh_3d._mesh.quad().tend() ; + ++_iter ) + { + if (_iter->mark() >= +0 && + _iter->self() >= +1 ) + { + _nmap[_iter->node(0)] = +1 ; + _nmap[_iter->node(1)] = +1 ; + _nmap[_iter->node(2)] = +1 ; + _nmap[_iter->node(3)] = +1 ; + _nnQ4 += +1 ; + } + } + + for (auto _iter = _mesh. + _euclidean_mesh_3d._mesh.tri4().head() ; + _iter != _mesh. + _euclidean_mesh_3d._mesh.tri4().tend() ; + ++_iter ) + { + if (_iter->mark() >= +0 && + _iter->self() >= +1 ) + { + _nmap[_iter->node(0)] = +1 ; + _nmap[_iter->node(1)] = +1 ; + _nmap[_iter->node(2)] = +1 ; + _nmap[_iter->node(3)] = +1 ; + _nnT4 += +1 ; + } + } + + for (auto _iter = _nmap.head(); + _iter != _nmap.tend(); + ++_iter ) + { + if ( *_iter >= +0) + { + *_iter = _nnN1 ++ ; + } + } + + ncutil::def_dim( + _jcfg._mesh_file, "singleton", +1); + + containers::array _pos; + containers::array _idx; + containers::array _tag; + containers::array _val; + + if (_nnN1 > +0) + { + /*-------------------------- write POINT data */ + save_vert3( + _mesh._euclidean_mesh_3d._mesh) + } + if (_nnE2 > +0) + { + /*-------------------------- write EDGE2 data */ + save_edge2( + _mesh._euclidean_mesh_3d._mesh) + } + if (_nnT3 > +0) + { + /*-------------------------- write TRIA3 data */ + save_tria3( + _mesh._euclidean_mesh_3d._mesh) + } + if (_nnQ4 > +0) + { + /*-------------------------- write QUAD4 data */ + save_quad4( + _mesh._euclidean_mesh_3d._mesh) + } + if (_nnT4 > +0) + { + /*-------------------------- write TRIA4 data */ + save_tria4( + _mesh._euclidean_mesh_3d._mesh) + } + + } + } + catch (...) + { + _errv = __unknown_error ; + } + + return ( _errv ) ; + } + + #undef save_vert2 + #undef save_vert3 + #undef save_edge2 + #undef save_tria3 + #undef save_quad4 + #undef save_tria4 + + #endif //__use_netcdf + + /* + -------------------------------------------------------- + * SAVE-MESH: save MSH_t output data. + -------------------------------------------------------- + */ + + #define save_vert2(_mesh) \ + jigsaw_alloc_vert2(&_mmsh._vert2, _nnN1) ; \ + jigsaw_alloc_reals(&_mmsh._power, _nnN1) ; \ + \ + iptr_type _npos = +0 ; \ + iptr_type _nout = +0 ; \ + \ + for (auto _iter = _mesh.node().head() ; \ + _iter != _mesh.node().tend() ; \ + ++_iter, ++_npos) \ + { \ + if (_iter->mark() >= 0 && \ + _nmap[_npos ] >= 0 ) \ + { \ + _mmsh._vert2._data[_nout]. \ + _ppos[0] = _iter->pval(0) + _xoff[0] ; \ + _mmsh._vert2._data[_nout]. \ + _ppos[1] = _iter->pval(1) + _xoff[1] ; \ + \ + _mmsh._vert2._data[_nout]. \ + _itag = _iter->itag () ; \ + \ + _mmsh._power. \ + _data[_nout] = _iter->pval(2) ; \ + \ + _nout = _nout + 1 ; \ + } \ + } \ + \ + _mesh._llN1.clear(containers::tight_alloc); \ + _mesh._aaN1.clear(containers::tight_alloc); \ + + + #define save_vert3(_mesh) \ + jigsaw_alloc_vert3(&_mmsh._vert3, _nnN1) ; \ + jigsaw_alloc_reals(&_mmsh._power, _nnN1) ; \ + \ + iptr_type _npos = +0 ; \ + iptr_type _nout = +0 ; \ + \ + for (auto _iter = _mesh.node().head() ; \ + _iter != _mesh.node().tend() ; \ + ++_iter, ++_npos) \ + { \ + if (_iter->mark() >= 0 && \ + _nmap[_npos ] >= 0 ) \ + { \ + _mmsh._vert3._data[_nout]. \ + _ppos[0] = _iter->pval(0) + _xoff[0] ; \ + _mmsh._vert3._data[_nout]. \ + _ppos[1] = _iter->pval(1) + _xoff[1] ; \ + _mmsh._vert3._data[_nout]. \ + _ppos[2] = _iter->pval(2) + _xoff[2] ; \ + \ + _mmsh._vert3._data[_nout]. \ + _itag = _iter->itag () ; \ + \ + _mmsh._power. \ + _data[_nout] = _iter->pval(3) ; \ + \ + _nout = _nout + 1 ; \ + } \ + } \ + \ + _mesh._llN1.clear(containers::tight_alloc); \ + _mesh._aaN1.clear(containers::tight_alloc); \ + + + #define save_edge2(_mesh) \ + jigsaw_alloc_edge2(&_mmsh._edge2, _nnE2) ; \ + \ + iptr_type _eout = +0 ; \ + for (auto _iter = _mesh.edge().head() ; \ + _iter != _mesh.edge().tend() ; \ + ++_iter ) \ + { \ + if (_iter->mark() >= 0 && \ + _iter->self() >= 1 ) \ + { \ + _mmsh._edge2._data[_eout]. \ + _node[0] = _nmap[_iter->node(0)] ; \ + _mmsh._edge2._data[_eout]. \ + _node[1] = _nmap[_iter->node(1)] ; \ + \ + _mmsh._edge2. \ + _data[_eout]._itag = _iter->itag() ; \ + \ + _eout = _eout + 1 ; \ + } \ + } \ + \ + _mesh._llE2.clear(containers::tight_alloc); \ + _mesh._mmE2.clear(containers::tight_alloc); \ + + + #define save_tria3(_mesh) \ + jigsaw_alloc_tria3(&_mmsh._tria3, _nnT3) ; \ + \ + iptr_type _fout = +0 ; \ + for (auto _iter = _mesh.tri3().head() ; \ + _iter != _mesh.tri3().tend() ; \ + ++_iter ) \ + { \ + if (_iter->mark() >= 0 && \ + _iter->self() >= 1 ) \ + { \ + _mmsh._tria3._data[_fout]. \ + _node[0] = _nmap[_iter->node(0)] ; \ + _mmsh._tria3._data[_fout]. \ + _node[1] = _nmap[_iter->node(1)] ; \ + _mmsh._tria3._data[_fout]. \ + _node[2] = _nmap[_iter->node(2)] ; \ + \ + _mmsh._tria3. \ + _data[_fout]._itag = _iter->itag() ; \ + \ + _fout = _fout + 1 ; \ + } \ + } \ + \ + _mesh._llT3.clear(containers::tight_alloc); \ + _mesh._mmT3.clear(containers::tight_alloc); \ + + + #define save_quad4(_mesh) \ + jigsaw_alloc_quad4(&_mmsh._quad4, _nnQ4) ; \ + \ + iptr_type _fout = +0 ; \ + for (auto _iter = _mesh.quad().head() ; \ + _iter != _mesh.quad().tend() ; \ + ++_iter ) \ + { \ + if (_iter->mark() >= 0 && \ + _iter->self() >= 1 ) \ + { \ + _mmsh._quad4._data[_fout]. \ + _node[0] = _nmap[_iter->node(0)] ; \ + _mmsh._quad4._data[_fout]. \ + _node[1] = _nmap[_iter->node(1)] ; \ + _mmsh._quad4._data[_fout]. \ + _node[2] = _nmap[_iter->node(2)] ; \ + _mmsh._quad4._data[_fout]. \ + _node[2] = _nmap[_iter->node(2)] ; \ + \ + _mmsh._quad4. \ + _data[_fout]._itag = _iter->itag() ; \ + \ + _fout = _fout + 1 ; \ + } \ + } \ + \ + _mesh._llQ4.clear(containers::tight_alloc); \ + _mesh._mmQ4.clear(containers::tight_alloc); \ + + + #define save_tria4(_mesh) \ + jigsaw_alloc_tria4(&_mmsh._tria4, _nnT4) ; \ + \ + iptr_type _tout = +0 ; \ + for (auto _iter = _mesh.tri4().head() ; \ + _iter != _mesh.tri4().tend() ; \ + ++_iter ) \ + { \ + if (_iter->mark() >= 0 && \ + _iter->self() >= 1 ) \ + { \ + _mmsh._tria4._data[_tout]. \ + _node[0] = _nmap[_iter->node(0)] ; \ + _mmsh._tria4._data[_tout]. \ + _node[1] = _nmap[_iter->node(1)] ; \ + _mmsh._tria4._data[_tout]. \ + _node[2] = _nmap[_iter->node(2)] ; \ + _mmsh._tria4._data[_tout]. \ + _node[3] = _nmap[_iter->node(3)] ; \ + \ + _mmsh._tria4. \ + _data[_tout]._itag = _iter->itag() ; \ + \ + _tout = _tout + 1 ; \ + } \ + } \ + \ + _mesh._llT4.clear(containers::tight_alloc); \ + _mesh._mmT4.clear(containers::tight_alloc); \ + + + template < + typename jlog_data + > + __normal_call iptr_type save_mesh ( + jcfg_data &_jcfg , + jlog_data &_jlog , + float *_xoff , + mesh_data &_mesh , + jigsaw_msh_t &_mmsh + ) + { + iptr_type _errv = __no_error ; + + try + { + containers::array _nmap ; + + __unreferenced (_jcfg) ; + __unreferenced (_jlog) ; + + if (_mesh._ndim == +2 && // save 2-dim. mesh + _mesh._kind == + jmsh_kind::euclidean_mesh) + { + _mmsh._flags = JIGSAW_EUCLIDEAN_MESH ; + + /*------------ index mapping for active nodes */ + _nmap.set_count(_mesh. + _euclidean_mesh_2d._mesh.node().count() , + containers::tight_alloc, -1) ; + + iptr_type _nnN1 = +0 ; + iptr_type _nnE2 = +0 ; + iptr_type _nnT3 = +0 ; + iptr_type _nnQ4 = +0 ; + + for (auto _iter = _mesh. + _euclidean_mesh_2d._mesh.edge().head() ; + _iter != _mesh. + _euclidean_mesh_2d._mesh.edge().tend() ; + ++_iter ) + { + if (_iter->mark() >= +0 && + _iter->self() >= +1 ) + { + _nmap[_iter->node(0)] = +1 ; + _nmap[_iter->node(1)] = +1 ; + _nnE2 += +1 ; + } + } + + for (auto _iter = _mesh. + _euclidean_mesh_2d._mesh.tri3().head() ; + _iter != _mesh. + _euclidean_mesh_2d._mesh.tri3().tend() ; + ++_iter ) + { + if (_iter->mark() >= +0 && + _iter->self() >= +1 ) + { + _nmap[_iter->node(0)] = +1 ; + _nmap[_iter->node(1)] = +1 ; + _nmap[_iter->node(2)] = +1 ; + _nnT3 += +1 ; + } + } + + for (auto _iter = _mesh. + _euclidean_mesh_2d._mesh.quad().head() ; + _iter != _mesh. + _euclidean_mesh_2d._mesh.quad().tend() ; + ++_iter ) + { + if (_iter->mark() >= +0 && + _iter->self() >= +1 ) + { + _nmap[_iter->node(0)] = +1 ; + _nmap[_iter->node(1)] = +1 ; + _nmap[_iter->node(2)] = +1 ; + _nmap[_iter->node(3)] = +1 ; + _nnQ4 += +1 ; + } + } + + for (auto _iter = _nmap.head(); + _iter != _nmap.tend(); + ++_iter ) + { + if ( *_iter >= +0) + { + *_iter = _nnN1 ++ ; + } + } + + if (_nnN1 > +0) + { + /*-------------------------- write POINT data */ + save_vert2( + _mesh._euclidean_mesh_2d._mesh) + } + if (_nnE2 > +0) + { + /*-------------------------- write EDGE2 data */ + save_edge2( + _mesh._euclidean_mesh_2d._mesh) + } + if (_nnT3 > +0) + { + /*-------------------------- write TRIA3 data */ + save_tria3( + _mesh._euclidean_mesh_2d._mesh) + } + if (_nnQ4 > +0) + { + /*-------------------------- write QUAD4 data */ + save_quad4( + _mesh._euclidean_mesh_2d._mesh) + } + + } + else + if (_mesh._ndim == +3 && // save 3-dim. mesh + _mesh._kind == + jmsh_kind::euclidean_mesh) + { + _mmsh._flags = JIGSAW_EUCLIDEAN_MESH ; + + /*------------ index mapping for active nodes */ + _nmap.set_count(_mesh. + _euclidean_mesh_3d._mesh.node().count() , + containers::tight_alloc, -1) ; + + iptr_type _nnN1 = +0 ; + iptr_type _nnE2 = +0 ; + iptr_type _nnT3 = +0 ; + iptr_type _nnQ4 = +0 ; + iptr_type _nnT4 = +0 ; + + for (auto _iter = _mesh. + _euclidean_mesh_3d._mesh.edge().head() ; + _iter != _mesh. + _euclidean_mesh_3d._mesh.edge().tend() ; + ++_iter ) + { + if (_iter->mark() >= +0 && + _iter->self() >= +1 ) + { + _nmap[_iter->node(0)] = +1 ; + _nmap[_iter->node(1)] = +1 ; + _nnE2 += +1 ; + } + } + + for (auto _iter = _mesh. + _euclidean_mesh_3d._mesh.tri3().head() ; + _iter != _mesh. + _euclidean_mesh_3d._mesh.tri3().tend() ; + ++_iter ) + { + if (_iter->mark() >= +0 && + _iter->self() >= +1 ) + { + _nmap[_iter->node(0)] = +1 ; + _nmap[_iter->node(1)] = +1 ; + _nmap[_iter->node(2)] = +1 ; + _nnT3 += +1 ; + } + } + + for (auto _iter = _mesh. + _euclidean_mesh_3d._mesh.quad().head() ; + _iter != _mesh. + _euclidean_mesh_3d._mesh.quad().tend() ; + ++_iter ) + { + if (_iter->mark() >= +0 && + _iter->self() >= +1 ) + { + _nmap[_iter->node(0)] = +1 ; + _nmap[_iter->node(1)] = +1 ; + _nmap[_iter->node(2)] = +1 ; + _nmap[_iter->node(3)] = +1 ; + _nnQ4 += +1 ; + } + } + + for (auto _iter = _mesh. + _euclidean_mesh_3d._mesh.tri4().head() ; + _iter != _mesh. + _euclidean_mesh_3d._mesh.tri4().tend() ; + ++_iter ) + { + if (_iter->mark() >= +0 && + _iter->self() >= +1 ) + { + _nmap[_iter->node(0)] = +1 ; + _nmap[_iter->node(1)] = +1 ; + _nmap[_iter->node(2)] = +1 ; + _nmap[_iter->node(3)] = +1 ; + _nnT4 += +1 ; + } + } + + for (auto _iter = _nmap.head(); + _iter != _nmap.tend(); + ++_iter ) + { + if ( *_iter >= +0) + { + *_iter = _nnN1 ++ ; + } + } + + if (_nnN1 > +0) + { + /*-------------------------- write POINT data */ + save_vert3( + _mesh._euclidean_mesh_3d._mesh) + } + if (_nnE2 > +0) + { + /*-------------------------- write EDGE2 data */ + save_edge2( + _mesh._euclidean_mesh_3d._mesh) + } + if (_nnT3 > +0) + { + /*-------------------------- write TRIA3 data */ + save_tria3( + _mesh._euclidean_mesh_3d._mesh) + } + if (_nnQ4 > +0) + { + /*-------------------------- write QUAD4 data */ + save_quad4( + _mesh._euclidean_mesh_3d._mesh) + } + if (_nnT4 > +0) + { + /*-------------------------- write TRIA4 data */ + save_tria4( + _mesh._euclidean_mesh_3d._mesh) + } + + } + + } + catch (...) + { + _errv = __unknown_error ; + } + + return ( _errv ) ; + } + + #undef save_vert2 + #undef save_vert3 + #undef save_edge2 + #undef save_tria3 + #undef save_quad4 + #undef save_tria4 + + /* + -------------------------------------------------------- + * SAVE-MESH: save to *.MSH or *.NC + -------------------------------------------------------- + */ + + template < + typename jlog_data + > + __normal_call iptr_type save_mesh ( + jcfg_data &_jcfg , + jlog_data &_jlog , + float *_xoff , + mesh_data &_mesh + ) + { + iptr_type _errv = __no_error ; + + try + { + /*------------------------- disambiguate via file-ext */ + std::string _path, _name, _fext; + file_part( + _jcfg._mesh_file, _path, _name, _fext) ; + + if(_fext.find("msh") != std::string::npos) + { + return save_mesh(_jcfg, _jlog, + _xoff, _mesh, mshfile_tag()) ; + } + else + if(_fext.find( "nc") != std::string::npos) + { + # ifdef __use_netcdf + return save_mesh(_jcfg, _jlog, + _xoff, _mesh, _netcdf_tag()) ; + # else + return __netcdf_not_available; + # endif + } + } + catch (...) + { + _errv = __unknown_error ; // can't get here?? + } + + return ( _errv ) ; + } + + + diff --git a/external/jigsaw/src/netcdf/ncutil.h b/external/jigsaw/src/netcdf/ncutil.h new file mode 100644 index 0000000..2749f96 --- /dev/null +++ b/external/jigsaw/src/netcdf/ncutil.h @@ -0,0 +1,517 @@ + + /* + -------------------------------------------------------- + * NCUTIL: simple interface to the NetCDF library. + -------------------------------------------------------- + * + * This program may be freely redistributed under the + * condition that the copyright notices (including this + * entire header) are not removed, and no compensation + * is received through use of the software. Private, + * research, and institutional use is free. You may + * distribute modified versions of this code UNDER THE + * CONDITION THAT THIS CODE AND ANY MODIFICATIONS MADE + * TO IT IN THE SAME FILE REMAIN UNDER COPYRIGHT OF THE + * ORIGINAL AUTHOR, BOTH SOURCE AND OBJECT CODE ARE + * MADE FREELY AVAILABLE WITHOUT CHARGE, AND CLEAR + * NOTICE IS GIVEN OF THE MODIFICATIONS. Distribution + * of this code as part of a commercial system is + * permissible ONLY BY DIRECT ARRANGEMENT WITH THE + * AUTHOR. (If you are not directly supplying this + * code to a customer, and you are instead telling them + * how they can obtain it for free, then you are not + * required to make any arrangement with me.) + * + * Disclaimer: Neither I nor THE CONTRIBUTORS warrant + * this code in any way whatsoever. This code is + * provided "as-is" to be used at your own risk. + * + * THE CONTRIBUTORS include: + * (a) The University of Sydney + * (b) The Massachusetts Institute of Technology + * (c) Columbia University + * (d) The National Aeronautics & Space Administration + * (e) Los Alamos National Laboratory + * + -------------------------------------------------------- + * + * Last updated: 20 May, 2022 + * + * Copyright 2022-- + * Darren Engwirda + * d.engwirda@gmail.com + * https://github.com/dengwirda/ + * + -------------------------------------------------------- + */ + +# include +# include +# include + +# include "netcdf.h" + +# pragma once + +# ifndef __NCUTIL__ +# define __NCUTIL__ + + namespace ncutil { + + /* + -------------------------------------------------------- + * GET/PUT-DIM: handlers for NetCDF dimensions + -------------------------------------------------------- + */ + + __inline_call void def_dim ( + std::string const&_file, // name of file + std::string const&_name, // name of dimension + size_t _dlen // length of dimension + ) + { + int _retv, _ncid, _dtag; + + if ((_retv = nc_open(_file.c_str(), NC_WRITE, &_ncid))) + throw std::invalid_argument( + "Can't open " + _file + + " for write: " + std::to_string(_retv)); + + if ((_retv = nc_def_dim( + _ncid, _name.c_str(), _dlen, &_dtag))) + { + nc_close(_ncid) ; + throw std::invalid_argument( + "Error putting dimension " + + _name + " :" + std::to_string(_retv)); + } + + if ((_retv = nc_close(_ncid))) + throw std::invalid_argument( + "Error handling " + + _file + " close: " + std::to_string(_retv)); + } + + __inline_call void get_dim ( + std::string const&_file, // name of file + std::string const&_name, // name of dimension + size_t &_dlen // length of dimension + ) + { + int _retv, _ncid, _dtag; + + if ((_retv = nc_open(_file.c_str(), NC_NOWRITE, &_ncid))) + throw std::invalid_argument( + "Can't open " + _file + + " for read.: " + std::to_string(_retv)); + + if ((_retv = nc_inq_dimid(_ncid, _name.c_str(), &_dtag))) + { + nc_close(_ncid) ; + throw std::invalid_argument( + "Error getting dimension " + + _name + " : " + std::to_string(_retv)); + } + + if ((_retv = nc_inq_dimlen(_ncid, _dtag, &_dlen))) + { + nc_close(_ncid) ; + throw std::invalid_argument( + "Error getting dimension " + + _name + " : " + std::to_string(_retv)); + } + + if ((_retv = nc_close(_ncid))) + throw std::invalid_argument( + "Error handling " + + _file + " close: " + std::to_string(_retv)); + } + + /* + -------------------------------------------------------- + * GET/PUT-ATT: handlers for NetCDF attributes + -------------------------------------------------------- + */ + + template < + typename data_type + > + __inline_call void get_att ( + std::string const&_file, // name of file + std::string const&_name, // name of attribute + __write_ptr(data_type) _vals, // ptr to attr. value array + int _vtag = NC_GLOBAL // NetCDF varid; default global + ) + { + int _retv, _ncid; + + if ((_retv = nc_open(_file.c_str(), NC_NOWRITE, &_ncid))) + throw std::invalid_argument( + "Can't open " + _file + + " for read.: " + std::to_string(_retv)); + + if ((_retv = nc_get_att(_ncid, + _vtag, _name.c_str (), (void *) _vals))) + { + nc_close(_ncid) ; + throw std::invalid_argument( + "Error getting attribute " + + _name + ": " + std::to_string(_retv)); + } + + if ((_retv = nc_close(_ncid))) + throw std::invalid_argument( + "Error handling " + + _file + " close: " + std::to_string(_retv)); + } + + __inline_call void get_str ( + std::string const&_file, // name of file + std::string const&_name, // name of attribute + std::string &_vals, // attr. string + int _vtag = NC_GLOBAL // NetCDF varid; default global + ) + { + int _retv, _ncid; + size_t _slen; + + if ((_retv = nc_open(_file.c_str(), NC_NOWRITE, &_ncid))) + throw std::invalid_argument( + "Can't open " + _file + + " for read.: " + std::to_string(_retv)); + + if ((_retv = nc_inq_attlen( + _ncid, _vtag, _name.c_str(), &_slen))) + { + nc_close(_ncid) ; + throw std::invalid_argument( + "Error getting attribute " + + _name + ": " + std::to_string(_retv)); + } + + _vals.resize(_slen + 1) ; // note: init to null + if ((_retv = nc_get_att_text( + _ncid, _vtag, _name.c_str(), &_vals[0]))) + { + nc_close(_ncid) ; + throw std::invalid_argument( + "Error getting attribute " + + _name + ": " + std::to_string(_retv)); + } + + if ((_retv = nc_close(_ncid))) + throw std::invalid_argument( + "Error handling " + + _file + " close: " + std::to_string(_retv)); + } + + template < + typename data_type + > + __inline_call void put_att ( + std::string const&_file, // name of file + std::string const&_name, // name of attribute + nc_type _type, // NetCDF data-type + data_type const&_vals, // single attr. value + int _vtag = NC_GLOBAL // NetCDF varid; default global + ) + { + int _retv, _ncid; + + if ((_retv = nc_open(_file.c_str(), NC_WRITE, &_ncid))) + throw std::invalid_argument( + "Can't open " + _file + + " for write: " + std::to_string(_retv)); + + if ((_retv = nc_put_att( + _ncid, _vtag, + _name.c_str(), _type, +1, (void *) &_vals))) + { + nc_close(_ncid) ; + throw std::invalid_argument( + "Error putting attribute " + + _name + ": " + std::to_string(_retv)); + } + + if ((_retv = nc_close(_ncid))) + throw std::invalid_argument( + "Error handling " + + _file + " close: " + std::to_string(_retv)); + } + + __inline_call void put_str ( + std::string const&_file, // name of file + std::string const&_name, // name of attribute + std::string const&_vals, // attr. string + int _vtag = NC_GLOBAL // NetCDF varid; default global + ) + { + int _retv, _ncid; + + if ((_retv = nc_open(_file.c_str(), NC_WRITE, &_ncid))) + throw std::invalid_argument( + "Can't open " + _file + + " for read.: " + std::to_string(_retv)); + + if ((_retv = nc_put_att_text(_ncid, _vtag, + _name.c_str (), _vals.size(), _vals.c_str()))) + { + nc_close(_ncid) ; + throw std::invalid_argument( + "Error getting attribute " + + _name + ": " + std::to_string(_retv)); + } + + if ((_retv = nc_close(_ncid))) + throw std::invalid_argument( + "Error handling " + + _file + " close: " + std::to_string(_retv)); + } + + template < + typename data_type + > + __inline_call void put_att ( + std::string const&_file, // name of file + std::string const&_name, // name of attribute + nc_type _type, // NetCDF data-type + size_t _nval, // length of attr. value array + __const_ptr(data_type) _vals, // ptr to att. value array + int _vtag = NC_GLOBAL // NetCDF varid; default global + ) + { + int _retv, _ncid; + + if ((_retv = nc_open(_file.c_str(), NC_WRITE, &_ncid))) + throw std::invalid_argument( + "Can't open " + _file + + " for write: " + std::to_string(_retv)); + + if ((_retv = nc_put_att( + _ncid, _vtag , + _name.c_str(), _type, _nval, (void *) _vals))) + { + nc_close(_ncid) ; + throw std::invalid_argument( + "Error putting attribute " + + _name + ": " + std::to_string(_retv)); + } + + if ((_retv = nc_close(_ncid))) + throw std::invalid_argument( + "Error handling " + + _file + " close: " + std::to_string(_retv)); + } + + /* + -------------------------------------------------------- + * GET/PUT-VAR: handlers for NetCDF variables + -------------------------------------------------------- + */ + + __inline_call void def_var ( + std::string const&_file, // name of file + std::string const&_name, // name of variable + nc_type _type, // NetCDF data-type + std::string const&_long, // NetCDF long_name + std::initializer_list _dims // dim. name list + ) + { + int _retv, _ncid, _vtag, _dtag[256]; + int _idim = +0; + + if (_dims.size() > +256) + throw std::invalid_argument( + "Error putting variable " + + _name + " : too many dimensions!"); + + if ((_retv = nc_open(_file.c_str(), NC_WRITE, &_ncid))) + throw std::invalid_argument( + "Can't open " + _file + + " for write: " + std::to_string(_retv)); + + for (auto _elem : _dims) + { + if ((_retv = nc_inq_dimid( + _ncid, _elem.c_str(), &_dtag[ _idim++ ]))) + { + nc_close(_ncid) ; + throw std::invalid_argument( + "Error putting variable " + + _name + " : " + std::to_string(_retv)); + } + } + + if ((_retv = nc_def_var( + _ncid, _name.c_str(), + _type, _dims.size (), _dtag, &_vtag))) + { + nc_close(_ncid) ; + throw std::invalid_argument( + "Error putting variable " + + _name + ": " + std::to_string(_retv)); + } + + if ((_retv = nc_put_att_text(_ncid, _vtag, + "long_name", _long.size(), _long.c_str()))) + { + nc_close(_ncid) ; + throw std::invalid_argument( + "Error putting variable " + + _name + ": " + std::to_string(_retv)); + } + + if ((_retv = nc_close(_ncid))) + throw std::invalid_argument( + "Error handling " + + _file + " close: " + std::to_string(_retv)); + } + + template < + typename data_type + > + __inline_call void get_var ( + std::string const&_file, // name of file + std::string const&_name, // name of variable + __write_ptr(data_type) _vals // ptr to var. value array + ) + { + int _retv, _ncid, _vtag; + + if ((_retv = nc_open(_file.c_str(), NC_NOWRITE, &_ncid))) + throw std::invalid_argument( + "Can't open " + _file + + " for read.: " + std::to_string(_retv)); + + if ((_retv = nc_inq_varid(_ncid, _name.c_str(), &_vtag))) + { + nc_close(_ncid) ; + throw std::invalid_argument( + "Error getting variable " + + _name + " : " + std::to_string(_retv)); + } + + if ((_retv = nc_get_var(_ncid, _vtag, (void *) _vals))) + { + nc_close(_ncid) ; + throw std::invalid_argument( + "Error getting variable " + + _name + ": " + std::to_string(_retv)); + } + + if ((_retv = nc_close(_ncid))) + throw std::invalid_argument( + "Error handling " + + _file + " close: " + std::to_string(_retv)); + } + + template < + typename data_type + > + __inline_call void put_var ( + std::string const&_file, // name of file + std::string const&_name, // name of variable + __const_ptr(data_type) _vals // ptr to var. value array + ) + { + int _retv, _ncid, _vtag; + + if ((_retv = nc_open(_file.c_str(), NC_WRITE, &_ncid))) + throw std::invalid_argument( + "Can't open " + _file + + " for write: " + std::to_string(_retv)); + + if ((_retv = nc_inq_varid(_ncid, _name.c_str(), &_vtag))) + { + nc_close(_ncid) ; + throw std::invalid_argument( + "Error putting variable " + + _name + " : " + std::to_string(_retv)); + } + + if ((_retv = nc_put_var(_ncid, _vtag, (void *) _vals))) + { + nc_close(_ncid) ; + throw std::invalid_argument( + "Error putting variable " + + _name + ": " + std::to_string(_retv)); + } + + if ((_retv = nc_close(_ncid))) + throw std::invalid_argument( + "Error handling " + + _file + " close: " + std::to_string(_retv)); + } + + /* + -------------------------------------------------------- + * GET/PUT-TAG: handlers for NetCDF ID tags. + -------------------------------------------------------- + */ + + int static const NC_VARIABLE = 100; + int static const NC_ATTRIBUTE = 101; + int static const NC_DIMENSION = 102; + + __inline_call void get_tag ( + std::string const&_file, // name of file + std::string const&_name, // name of dim./att./var. + int _kind, int &_itag, // kind and idtag of name + int _vtag = NC_GLOBAL // NetCDF varid; default global + ) + { + int _retv, _ncid; + + if ((_retv = nc_open(_file.c_str(), NC_NOWRITE, &_ncid))) + throw std::invalid_argument( + "Can't open " + _file + + " for read.: " + std::to_string(_retv)); + + if (_kind == NC_DIMENSION) + { + if ((_retv = nc_inq_dimid( + _ncid, _name.c_str(), &_itag))) + { + nc_close(_ncid) ; + throw std::invalid_argument( + "Error getting attribute " + + _name + ": " + std::to_string(_retv)); + } + } + else + if (_kind == NC_VARIABLE) + { + if ((_retv = nc_inq_varid( + _ncid, _name.c_str(), &_itag))) + { + nc_close(_ncid) ; + throw std::invalid_argument( + "Error getting attribute " + + _name + ": " + std::to_string(_retv)); + } + } + else + if (_kind == NC_ATTRIBUTE) + { + if ((_retv = nc_inq_attid( + _ncid, _vtag, _name.c_str(), &_itag))) + { + nc_close(_ncid) ; + throw std::invalid_argument( + "Error getting attribute " + + _name + ": " + std::to_string(_retv)); + } + } + + if ((_retv = nc_close(_ncid))) + throw std::invalid_argument( + "Error handling " + + _file + " close: " + std::to_string(_retv)); + } + + } + +# endif //__NCUTIL__ + + + diff --git a/external/jigsaw/src/netcdf/lib_netcdf.h b/external/jigsaw/src/netcdf/netcdf.h similarity index 100% rename from external/jigsaw/src/netcdf/lib_netcdf.h rename to external/jigsaw/src/netcdf/netcdf.h diff --git a/external/jigsaw/src/offset.hpp b/external/jigsaw/src/offset.hpp new file mode 100644 index 0000000..49a6646 --- /dev/null +++ b/external/jigsaw/src/offset.hpp @@ -0,0 +1,267 @@ + + /* + -------------------------------------------------------- + * OFFSET: return domain separators. + -------------------------------------------------------- + * + * This program may be freely redistributed under the + * condition that the copyright notices (including this + * entire header) are not removed, and no compensation + * is received through use of the software. Private, + * research, and institutional use is free. You may + * distribute modified versions of this code UNDER THE + * CONDITION THAT THIS CODE AND ANY MODIFICATIONS MADE + * TO IT IN THE SAME FILE REMAIN UNDER COPYRIGHT OF THE + * ORIGINAL AUTHOR, BOTH SOURCE AND OBJECT CODE ARE + * MADE FREELY AVAILABLE WITHOUT CHARGE, AND CLEAR + * NOTICE IS GIVEN OF THE MODIFICATIONS. Distribution + * of this code as part of a commercial system is + * permissible ONLY BY DIRECT ARRANGEMENT WITH THE + * AUTHOR. (If you are not directly supplying this + * code to a customer, and you are instead telling them + * how they can obtain it for free, then you are not + * required to make any arrangement with me.) + * + * Disclaimer: Neither I nor THE CONTRIBUTORS warrant + * this code in any way whatsoever. This code is + * provided "as-is" to be used at your own risk. + * + * THE CONTRIBUTORS include: + * (a) The University of Sydney + * (b) The Massachusetts Institute of Technology + * (c) Columbia University + * (d) The National Aeronautics & Space Administration + * (e) Los Alamos National Laboratory + * + -------------------------------------------------------- + * + * Last updated: 18 Aug., 2021 + * + * Copyright 2013-2021 + * Darren Engwirda + * d.engwirda@gmail.com + * https://github.com/dengwirda/ + * + -------------------------------------------------------- + */ + +# pragma once + +# ifndef __OFFSET__ +# define __OFFSET__ + + /* + -------------------------------------------------------- + * SEPARATOR: return offset to domain "centre" + -------------------------------------------------------- + */ + + template < + typename jlog_data + > + __normal_call iptr_type separator ( + jcfg_data &_jcfg, + jlog_data &_jlog, + geom_data &_geom, + float *_xoff + ) + { + iptr_type _errv = __no_error ; + + __unreferenced(_jcfg) ; + __unreferenced(_jlog) ; + + /*--------------------------------- find GEOM offsets */ + double _xmid[3] = { +0. } ; + + if (_geom._ndim == +2 && + _geom._kind == + jmsh_kind::euclidean_mesh) + { + /*--------------------------------- euclidean-mesh-2d */ + for (auto _iter = _geom. + _euclidean_mesh_2d._tria.node().head(); + _iter != _geom. + _euclidean_mesh_2d._tria.node().tend(); + ++_iter ) + { + _xmid[0] += _iter->pval(0); + _xmid[1] += _iter->pval(1); + } + + _xoff[0] = (float)(_xmid[0] / + _geom._euclidean_mesh_2d._tria.node().count()); + _xoff[1] = (float)(_xmid[1] / + _geom._euclidean_mesh_2d._tria.node().count()); + } + else + if (_geom._ndim == +3 && + _geom._kind == + jmsh_kind::euclidean_mesh) + { + /*--------------------------------- euclidean-mesh-3d */ + for (auto _iter = _geom. + _euclidean_mesh_3d._tria.node().head(); + _iter != _geom. + _euclidean_mesh_3d._tria.node().tend(); + ++_iter ) + { + _xmid[0] += _iter->pval(0); + _xmid[1] += _iter->pval(1); + _xmid[2] += _iter->pval(2); + } + + _xoff[0] = (float)(_xmid[0] / + _geom._euclidean_mesh_3d._tria.node().count()); + _xoff[1] = (float)(_xmid[1] / + _geom._euclidean_mesh_3d._tria.node().count()); + _xoff[2] = (float)(_xmid[2] / + _geom._euclidean_mesh_3d._tria.node().count()); + } + + return ( _errv ) ; + } + + template < + typename jlog_data + > + __normal_call iptr_type separator ( + jcfg_data &_jcfg, + jlog_data &_jlog, + hfun_data &_hfun, + float *_xoff + ) + { + iptr_type _errv = __no_error ; + + __unreferenced(_jcfg) ; + __unreferenced(_jlog) ; + + /*--------------------------------- find GEOM offsets */ + double _xmid[3] = { +0. } ; + + if (_hfun._ndim == +2 && + _hfun._kind == + jmsh_kind::euclidean_mesh) + { + /*--------------------------------- euclidean-mesh-2d */ + for (auto _iter = _hfun. + _euclidean_mesh_2d._mesh.node().head(); + _iter != _hfun. + _euclidean_mesh_2d._mesh.node().tend(); + ++_iter ) + { + _xmid[0] += _iter->pval(0); + _xmid[1] += _iter->pval(1); + } + + _xoff[0] = (float)(_xmid[0] / + _hfun._euclidean_mesh_2d._mesh.node().count()); + _xoff[1] = (float)(_xmid[1] / + _hfun._euclidean_mesh_2d._mesh.node().count()); + } + else + if (_hfun._ndim == +3 && + _hfun._kind == + jmsh_kind::euclidean_mesh) + { + /*--------------------------------- euclidean-mesh-3d */ + for (auto _iter = _hfun. + _euclidean_mesh_3d._mesh.node().head(); + _iter != _hfun. + _euclidean_mesh_3d._mesh.node().tend(); + ++_iter ) + { + _xmid[0] += _iter->pval(0); + _xmid[1] += _iter->pval(1); + _xmid[2] += _iter->pval(2); + } + + _xoff[0] = (float)(_xmid[0] / + _hfun._euclidean_mesh_3d._mesh.node().count()); + _xoff[1] = (float)(_xmid[1] / + _hfun._euclidean_mesh_3d._mesh.node().count()); + _xoff[2] = (float)(_xmid[2] / + _hfun._euclidean_mesh_3d._mesh.node().count()); + } + else + if (_hfun._ndim == +2 && + _hfun._kind == + jmsh_kind::euclidean_grid) + { + /*--------------------------------- euclidean-grid-2d */ + for (auto _iter = _hfun. + _euclidean_grid_2d._xpos.head(); + _iter != _hfun. + _euclidean_grid_2d._xpos.tend(); + ++_iter ) + { + _xmid[0] += *_iter; + } + + _xoff[0] = (float)(_xmid[0] / + _hfun._euclidean_grid_2d._xpos.count()) ; + + for (auto _iter = _hfun. + _euclidean_grid_2d._ypos.head(); + _iter != _hfun. + _euclidean_grid_2d._ypos.tend(); + ++_iter ) + { + _xmid[1] += *_iter; + } + + _xoff[1] = (float)(_xmid[1] / + _hfun._euclidean_grid_2d._ypos.count()) ; + } + else + if (_hfun._ndim == +3 && + _hfun._kind == + jmsh_kind::euclidean_grid) + { + /*--------------------------------- euclidean-grid-3d */ + for (auto _iter = _hfun. + _euclidean_grid_3d._xpos.head(); + _iter != _hfun. + _euclidean_grid_3d._xpos.tend(); + ++_iter ) + { + _xmid[0] += *_iter; + } + + _xoff[0] = (float)(_xmid[0] / + _hfun._euclidean_grid_3d._xpos.count()) ; + + for (auto _iter = _hfun. + _euclidean_grid_3d._ypos.head(); + _iter != _hfun. + _euclidean_grid_3d._ypos.tend(); + ++_iter ) + { + _xmid[1] += *_iter; + } + + _xoff[1] = (float)(_xmid[1] / + _hfun._euclidean_grid_3d._ypos.count()) ; + + for (auto _iter = _hfun. + _euclidean_grid_3d._zpos.head(); + _iter != _hfun. + _euclidean_grid_3d._zpos.tend(); + ++_iter ) + { + _xmid[2] += *_iter; + } + + _xoff[2] = (float)(_xmid[2] / + _hfun._euclidean_grid_3d._zpos.count()) ; + } + + return ( _errv ) ; + } + + +# endif //__OFFSET__ + + + diff --git a/external/jigsaw/src/rdt_save.inc b/external/jigsaw/src/rdt_save.inc new file mode 100644 index 0000000..32e4f24 --- /dev/null +++ b/external/jigsaw/src/rdt_save.inc @@ -0,0 +1,1415 @@ + + /* + -------------------------------------------------------- + * MSH-SAVE: parse MESH data into *.MSH / MSH_t. + -------------------------------------------------------- + * + * This program may be freely redistributed under the + * condition that the copyright notices (including this + * entire header) are not removed, and no compensation + * is received through use of the software. Private, + * research, and institutional use is free. You may + * distribute modified versions of this code UNDER THE + * CONDITION THAT THIS CODE AND ANY MODIFICATIONS MADE + * TO IT IN THE SAME FILE REMAIN UNDER COPYRIGHT OF THE + * ORIGINAL AUTHOR, BOTH SOURCE AND OBJECT CODE ARE + * MADE FREELY AVAILABLE WITHOUT CHARGE, AND CLEAR + * NOTICE IS GIVEN OF THE MODIFICATIONS. Distribution + * of this code as part of a commercial system is + * permissible ONLY BY DIRECT ARRANGEMENT WITH THE + * AUTHOR. (If you are not directly supplying this + * code to a customer, and you are instead telling them + * how they can obtain it for free, then you are not + * required to make any arrangement with me.) + * + * Disclaimer: Neither I nor THE CONTRIBUTORS warrant + * this code in any way whatsoever. This code is + * provided "as-is" to be used at your own risk. + * + * THE CONTRIBUTORS include: + * (a) The University of Sydney + * (b) The Massachusetts Institute of Technology + * (c) Columbia University + * (d) The National Aeronautics & Space Administration + * (e) Los Alamos National Laboratory + * + -------------------------------------------------------- + * + * Last updated: 30 May, 2022 + * + * Copyright 2013-2022 + * Darren Engwirda + * d.engwirda@gmail.com + * https://github.com/dengwirda/ + * + -------------------------------------------------------- + */ + + // from msh_save.hpp + + + /* + -------------------------------------------------------- + * SAVE-RDEL: save *.MSH output file. + -------------------------------------------------------- + */ + + #define save_vert2(_mesh) \ + _file << "POINT=" << _last << "\n" ; \ + \ + auto _next = +0, _roll = +0, \ + _npos = +0; \ + char _fbuf[PRINTCHUNK] ; \ + \ + for (auto _iter = _mesh._nset.head(); \ + _iter != _mesh._nset.tend(); \ + ++_iter, ++_npos) \ + { \ + if (_iter->mark() >= 0 && \ + _nmap[_npos ] >= 0) \ + { \ + PRINTCHARS(snprintf(&_fbuf[_next], \ + PRINTCHUNK, \ + "%.17g;%.17g;%d\n", \ + _iter->pval(0) + _xoff[0] , \ + _iter->pval(1) + _xoff[1] , \ + _iter->part()) , VERT2CHUNK ) \ + } \ + } \ + PRINTFINAL; \ + + + #define save_vert3(_mesh) \ + _file << "POINT=" << _last << "\n" ; \ + \ + auto _next = +0, _roll = +0, \ + _npos = +0; \ + char _fbuf[PRINTCHUNK] ; \ + \ + for (auto _iter = _mesh._nset.head(); \ + _iter != _mesh._nset.tend(); \ + ++_iter, ++_npos) \ + { \ + if (_iter->mark() >= 0 && \ + _nmap[_npos ] >= 0) \ + { \ + PRINTCHARS(snprintf(&_fbuf[_next], \ + PRINTCHUNK, \ + "%.17g;%.17g;%.17g;%d\n", \ + _iter->pval(0) + _xoff[0] , \ + _iter->pval(1) + _xoff[1] , \ + _iter->pval(2) + _xoff[2] , \ + _iter->part()) , VERT3CHUNK ) \ + } \ + } \ + PRINTFINAL; \ + + + #define save_vpwrk(_koff, _mesh) \ + _file << "POWER=" << _last << ";1" << "\n"; \ + \ + auto _next = +0, _roll = +0, \ + _npos = +0; \ + char _fbuf[PRINTCHUNK] ; \ + \ + for (auto _iter = _mesh._nset.head(); \ + _iter != _mesh._nset.tend(); \ + ++_iter, ++_npos) \ + { \ + if (_iter->mark() >= 0 && \ + _nmap[_npos ] >= 0) \ + { \ + PRINTCHARS(snprintf(&_fbuf[_next], \ + PRINTCHUNK, "%.17g\n" , \ + _iter->pval(_koff) ), VALUECHUNK) \ + } \ + } \ + PRINTFINAL; \ + + + #define save_edge2(_list) \ + _file << "EDGE2=" << _list.count() << "\n" ; \ + \ + auto _next = +0, _roll = +0; \ + char _fbuf[PRINTCHUNK] ; \ + \ + for (auto _iter = _list._lptr.head(); \ + _iter != _list._lptr.tend(); \ + ++_iter ) \ + { \ + if ( *_iter == nullptr) continue ; \ + \ + for (auto _item = *_iter ; \ + _item != nullptr; \ + _item = _item->_next ) \ + { \ + PRINTCHARS(snprintf(&_fbuf[_next], \ + PRINTCHUNK, "%u;%u;%d\n", \ + _nmap[_item->_data._node[0]], \ + _nmap[_item->_data._node[1]], \ + _item->_data._part ), EDGE2CHUNK) \ + } \ + } \ + PRINTFINAL; \ + + + #define save_tria3(_list) \ + _file << "TRIA3=" << _list.count() << "\n" ; \ + \ + auto _next = +0, _roll = +0; \ + char _fbuf[PRINTCHUNK] ; \ + \ + for (auto _iter = _list._lptr.head(); \ + _iter != _list._lptr.tend(); \ + ++_iter ) \ + { \ + if ( *_iter == nullptr) continue ; \ + \ + for (auto _item = *_iter ; \ + _item != nullptr; \ + _item = _item->_next ) \ + { \ + PRINTCHARS(snprintf(&_fbuf[_next], \ + PRINTCHUNK, "%u;%u;%u;%d\n", \ + _nmap[_item->_data._node[0]], \ + _nmap[_item->_data._node[1]], \ + _nmap[_item->_data._node[2]], \ + _item->_data._part ), TRIA3CHUNK) \ + } \ + } \ + PRINTFINAL; \ + + + #define save_tria4(_list) \ + _file << "TRIA4=" << _list.count() << "\n" ; \ + \ + auto _next = +0, _roll = +0; \ + char _fbuf[PRINTCHUNK] ; \ + \ + for (auto _iter = _list._lptr.head(); \ + _iter != _list._lptr.tend(); \ + ++_iter ) \ + { \ + if ( *_iter == nullptr) continue ; \ + \ + for (auto _item = *_iter ; \ + _item != nullptr; \ + _item = _item->_next ) \ + { \ + PRINTCHARS(snprintf(&_fbuf[_next], \ + PRINTCHUNK, \ + "%u;%u;%u;%u;%d\n", \ + _nmap[_item->_data._node[0]], \ + _nmap[_item->_data._node[1]], \ + _nmap[_item->_data._node[2]], \ + _nmap[_item->_data._node[3]], \ + _item->_data._part ), TRIA4CHUNK) \ + } \ + } \ + PRINTFINAL; \ + + template < + typename jlog_data + > + __normal_call iptr_type save_rdel ( + jcfg_data &_jcfg , + jlog_data &_jlog , + float *_xoff , + mesh_data &_rdel , + mshfile_tag const& + ) + { + iptr_type _errv = __no_error ; + + try + { + containers::array _nmap; + + __unreferenced(_jlog) ; + + std::string _path, _name, _fext; + file_part( + _jcfg._mesh_file, _path, _name, _fext) ; + + std::ofstream _file; + _file.open( + _jcfg._mesh_file, + std::ofstream::out | std::ofstream::trunc) ; + + if (_file.is_open()) + { + if (_rdel._ndim == +2 && + _rdel._kind == + jmsh_kind::euclidean_mesh) + { + /*-------------------------- save 2-dim. mesh */ + _file << "# " << _name << ".msh" + << "; created by " ; + _file << __JGSWVSTR "\n" ; + _file << "MSHID=2;EUCLIDEAN-MESH \n" ; + _file << "NDIMS=2 \n" ; + + /*------------ index mapping for active nodes */ + _nmap.set_count(_rdel. + _euclidean_rdel_2d._tria._nset.count() , + containers::tight_alloc , -1); + + for (auto _iter = _rdel. + _euclidean_rdel_2d._eset._lptr.head(); + _iter != _rdel. + _euclidean_rdel_2d._eset._lptr.tend(); + ++_iter ) + { + if ( *_iter == nullptr) continue ; + + for (auto _item = *_iter ; + _item != nullptr; + _item = _item->_next ) + { + _nmap[_item->_data._node[0]] = 1 ; + _nmap[_item->_data._node[1]] = 1 ; + } + } + + for (auto _iter = _rdel. + _euclidean_rdel_2d._tset._lptr.head(); + _iter != _rdel. + _euclidean_rdel_2d._tset._lptr.tend(); + ++_iter ) + { + if ( *_iter == nullptr) continue ; + + for (auto _item = *_iter ; + _item != nullptr; + _item = _item->_next ) + { + _nmap[_item->_data._node[0]] = 1 ; + _nmap[_item->_data._node[1]] = 1 ; + _nmap[_item->_data._node[2]] = 1 ; + } + } + + iptr_type _last = +0; + for (auto _iter = _nmap.head() ; + _iter != _nmap.tend() ; + ++_iter ) + { + if ( *_iter >= +0) *_iter = _last ++ ; + } + + if (_last > +0) + { + /*-------------------------- write POINT data */ + save_vert2( + _rdel._euclidean_rdel_2d._tria) + } + if (_last > +0) + { + /*-------------------------- write POWER data */ + save_vpwrk( + +2, _rdel._euclidean_rdel_2d._tria) + } + if (_rdel._euclidean_rdel_2d. + _eset.count() > +0) + { + /*-------------------------- write EDGE2 data */ + save_edge2( + _rdel._euclidean_rdel_2d._eset) + } + if (_rdel._euclidean_rdel_2d. + _tset.count() > +0) + { + /*-------------------------- write TRIA3 data */ + save_tria3( + _rdel._euclidean_rdel_2d._tset) + } + + } + else + if (_rdel._ndim == +3 && + _rdel._kind == + jmsh_kind::euclidean_mesh) + { + /*-------------------------- save 3-dim. mesh */ + _file << "# " << _name << ".msh" + << "; created by " ; + _file << __JGSWVSTR "\n" ; + _file << "MSHID=2;EUCLIDEAN-MESH \n" ; + _file << "NDIMS=3 \n" ; + + /*------------ index mapping for active nodes */ + _nmap.set_count(_rdel. + _euclidean_rdel_3d._tria._nset.count() , + containers::tight_alloc, -1) ; + + for (auto _iter = _rdel. + _euclidean_rdel_3d._eset._lptr.head(); + _iter != _rdel. + _euclidean_rdel_3d._eset._lptr.tend(); + ++_iter ) + { + if ( *_iter == nullptr) continue ; + + for (auto _item = *_iter ; + _item != nullptr; + _item = _item->_next ) + { + _nmap[_item->_data._node[0]] = 1 ; + _nmap[_item->_data._node[1]] = 1 ; + } + } + + for (auto _iter = _rdel. + _euclidean_rdel_3d._fset._lptr.head(); + _iter != _rdel. + _euclidean_rdel_3d._fset._lptr.tend(); + ++_iter ) + { + if ( *_iter == nullptr) continue ; + + for (auto _item = *_iter ; + _item != nullptr; + _item = _item->_next ) + { + _nmap[_item->_data._node[0]] = 1 ; + _nmap[_item->_data._node[1]] = 1 ; + _nmap[_item->_data._node[2]] = 1 ; + } + } + + for (auto _iter = _rdel. + _euclidean_rdel_3d._tset._lptr.head(); + _iter != _rdel. + _euclidean_rdel_3d._tset._lptr.tend(); + ++_iter ) + { + if ( *_iter == nullptr) continue ; + + for (auto _item = *_iter ; + _item != nullptr; + _item = _item->_next ) + { + _nmap[_item->_data._node[0]] = 1 ; + _nmap[_item->_data._node[1]] = 1 ; + _nmap[_item->_data._node[2]] = 1 ; + _nmap[_item->_data._node[3]] = 1 ; + } + } + + iptr_type _last = +0; + for (auto _iter = _nmap.head() ; + _iter != _nmap.tend() ; + ++_iter ) + { + if ( *_iter >= +0) *_iter = _last ++ ; + } + + if (_last > +0) + { + /*-------------------------- write POINT data */ + save_vert3( + _rdel._euclidean_rdel_3d._tria) + } + if (_last > +0) + { + /*-------------------------- write POWER data */ + save_vpwrk( + +3, _rdel._euclidean_rdel_3d._tria) + } + if (_rdel._euclidean_rdel_3d. + _eset.count() > +0) + { + /*-------------------------- write EDGE2 data */ + save_edge2( + _rdel._euclidean_rdel_3d._eset) + } + if (_rdel._euclidean_rdel_3d. + _fset.count() > +0) + { + /*-------------------------- write TRIA3 data */ + save_tria3( + _rdel._euclidean_rdel_3d._fset) + } + if (_rdel._euclidean_rdel_3d. + _tset.count() > +0) + { + /*-------------------------- write TRIA4 data */ + save_tria4( + _rdel._euclidean_rdel_3d._tset) + } + + } + + } + else + { + _errv = __file_not_created ; + } + + _file.close(); + + } + catch (...) + { + _errv = __unknown_error ; + } + + return ( _errv ) ; + } + + #undef save_vert2 + #undef save_vert3 + #undef save_vpwrk + #undef save_edge2 + #undef save_tria3 + #undef save_tria4 + + /* + -------------------------------------------------------- + * SAVE-RDEL: save *.NC output file. + -------------------------------------------------------- + */ + + #ifdef __use_netcdf + + #define save_vert2(_mesh) \ + ncutil::def_dim( \ + _jcfg._mesh_file, "vert2_row", _last); \ + ncutil::def_dim( \ + _jcfg._mesh_file, "vert2_col", +2) ; \ + \ + ncutil::def_var( \ + _jcfg._mesh_file, "vert2_pos", NC_DOUBLE, \ + "2-vertex coordinates" , \ + {"vert2_row", "vert2_col"} ) ; \ + ncutil::def_var( \ + _jcfg._mesh_file, "vert2_tag", NC_INT, \ + "2-vertex id-tags" , \ + {"vert2_row", "singleton"} ) ; \ + ncutil::def_var( \ + _jcfg._mesh_file, "power_val", NC_DOUBLE, \ + "vertex power values" , \ + {"vert2_row", "singleton"} ) ; \ + \ + _pos.clear(); _pos.set_alloc(_last * 2); \ + _tag.clear(); _tag.set_alloc(_last * 1); \ + _val.clear(); _val.set_alloc(_last * 1); \ + \ + auto _npos = +0; \ + for (auto _iter = _mesh._nset.head() ; \ + _iter != _mesh._nset.tend() ; \ + ++_iter, ++_npos) \ + { \ + if (_iter->mark() >= 0 && \ + _nmap[_npos ] >= 0 ) \ + { \ + _pos.push_tail( \ + _iter->pval(0) + _xoff[0]) ; \ + _pos.push_tail( \ + _iter->pval(1) + _xoff[1]) ; \ + \ + _tag.push_tail (0) ; \ + \ + _val.push_tail(_iter->pval(2)) ; \ + } \ + } \ + \ + ncutil::put_var( \ + _jcfg._mesh_file, "vert2_pos", &_pos[0]) ; \ + ncutil::put_var( \ + _jcfg._mesh_file, "vert2_tag", &_tag[0]) ; \ + ncutil::put_var( \ + _jcfg._mesh_file, "power_val", &_val[0]) ; \ + + + #define save_vert3(_mesh) \ + ncutil::def_dim( \ + _jcfg._mesh_file, "vert3_row", _last); \ + ncutil::def_dim( \ + _jcfg._mesh_file, "vert3_col", +3) ; \ + \ + ncutil::def_var( \ + _jcfg._mesh_file, "vert3_pos", NC_DOUBLE, \ + "3-vertex coordinates" , \ + {"vert3_row", "vert3_col"} ) ; \ + ncutil::def_var( \ + _jcfg._mesh_file, "vert3_tag", NC_INT, \ + "3-vertex id-tags" , \ + {"vert3_row", "singleton"} ) ; \ + ncutil::def_var( \ + _jcfg._mesh_file, "power_val", NC_DOUBLE, \ + "vertex power values" , \ + {"vert3_row", "singleton"} ) ; \ + \ + _pos.clear(); _pos.set_alloc(_last * 3); \ + _tag.clear(); _tag.set_alloc(_last * 1); \ + _val.clear(); _val.set_alloc(_last * 1); \ + \ + auto _npos = +0; \ + for (auto _iter = _mesh._nset.head() ; \ + _iter != _mesh._nset.tend() ; \ + ++_iter, ++_npos) \ + { \ + if (_iter->mark() >= 0 && \ + _nmap[_npos ] >= 0 ) \ + { \ + _pos.push_tail( \ + _iter->pval(0) + _xoff[0]) ; \ + _pos.push_tail( \ + _iter->pval(1) + _xoff[1]) ; \ + _pos.push_tail( \ + _iter->pval(2) + _xoff[2]) ; \ + \ + _tag.push_tail (0) ; \ + \ + _val.push_tail(_iter->pval(3)) ; \ + } \ + } \ + \ + ncutil::put_var( \ + _jcfg._mesh_file, "vert3_pos", &_pos[0]) ; \ + ncutil::put_var( \ + _jcfg._mesh_file, "vert3_tag", &_tag[0]) ; \ + ncutil::put_var( \ + _jcfg._mesh_file, "power_val", &_val[0]) ; \ + + + #define save_edge2(_list) \ + auto _nnum = _list.count (); \ + ncutil::def_dim( \ + _jcfg._mesh_file, "edge2_row", _nnum); \ + ncutil::def_dim( \ + _jcfg._mesh_file, "edge2_col", +2) ; \ + \ + ncutil::def_var( \ + _jcfg._mesh_file, "edge2_idx", NC_INT, \ + "2-node edge indexes" , \ + {"edge2_row", "edge2_col"} ) ; \ + ncutil::def_var( \ + _jcfg._mesh_file, "edge2_tag", NC_INT, \ + "2-node edge id-tags" , \ + {"edge2_row", "singleton"} ) ; \ + \ + _idx.clear(); _idx.set_alloc(_nnum * 2); \ + _tag.clear(); _tag.set_alloc(_nnum * 1); \ + \ + for (auto _iter = _list._lptr.head(); \ + _iter != _list._lptr.tend(); \ + ++_iter ) \ + { \ + if ( *_iter == nullptr) continue ; \ + \ + for (auto _item = *_iter ; \ + _item != nullptr; \ + _item = _item->_next ) \ + { \ + _idx.push_tail( \ + _nmap[_item->_data._node [0]]) ; \ + _idx.push_tail( \ + _nmap[_item->_data._node [1]]) ; \ + \ + _tag.push_tail(_item->_data._part) ; \ + } \ + } \ + \ + ncutil::put_var( \ + _jcfg._mesh_file, "edge2_idx", &_idx[0]) ; \ + ncutil::put_var( \ + _jcfg._mesh_file, "edge2_tag", &_tag[0]) ; \ + + + #define save_tria3(_list) \ + auto _nnum = _list.count (); \ + ncutil::def_dim( \ + _jcfg._mesh_file, "tria3_row", _nnum); \ + ncutil::def_dim( \ + _jcfg._mesh_file, "tria3_col", +3) ; \ + \ + ncutil::def_var( \ + _jcfg._mesh_file, "tria3_idx", NC_INT, \ + "3-node tria indexes" , \ + {"tria3_row", "tria3_col"} ) ; \ + ncutil::def_var( \ + _jcfg._mesh_file, "tria3_tag", NC_INT, \ + "3-node tria id-tags" , \ + {"tria3_row", "singleton"} ) ; \ + \ + _idx.clear(); _idx.set_alloc(_nnum * 3); \ + _tag.clear(); _tag.set_alloc(_nnum * 1); \ + \ + for (auto _iter = _list._lptr.head(); \ + _iter != _list._lptr.tend(); \ + ++_iter ) \ + { \ + if ( *_iter == nullptr) continue ; \ + \ + for (auto _item = *_iter ; \ + _item != nullptr; \ + _item = _item->_next ) \ + { \ + _idx.push_tail( \ + _nmap[_item->_data._node [0]]) ; \ + _idx.push_tail( \ + _nmap[_item->_data._node [1]]) ; \ + _idx.push_tail( \ + _nmap[_item->_data._node [2]]) ; \ + \ + _tag.push_tail(_item->_data._part) ; \ + } \ + } \ + \ + ncutil::put_var( \ + _jcfg._mesh_file, "tria3_idx", &_idx[0]) ; \ + ncutil::put_var( \ + _jcfg._mesh_file, "tria3_tag", &_tag[0]) ; \ + + + #define save_tria4(_list) \ + auto _nnum = _list.count (); \ + ncutil::def_dim( \ + _jcfg._mesh_file, "tria4_row", _nnum); \ + ncutil::def_dim( \ + _jcfg._mesh_file, "tria4_col", +4) ; \ + \ + ncutil::def_var( \ + _jcfg._mesh_file, "tria4_idx", NC_INT, \ + "4-node tria indexes" , \ + {"tria4_row", "tria4_col"} ) ; \ + ncutil::def_var( \ + _jcfg._mesh_file, "tria4_tag", NC_INT, \ + "4-node tria id-tags" , \ + {"tria4_row", "singleton"} ) ; \ + \ + _idx.clear(); _idx.set_alloc(_nnum * 4); \ + _tag.clear(); _tag.set_alloc(_nnum * 1); \ + \ + for (auto _iter = _list._lptr.head(); \ + _iter != _list._lptr.tend(); \ + ++_iter ) \ + { \ + if ( *_iter == nullptr) continue ; \ + \ + for (auto _item = *_iter ; \ + _item != nullptr; \ + _item = _item->_next ) \ + { \ + _idx.push_tail( \ + _nmap[_item->_data._node [0]]) ; \ + _idx.push_tail( \ + _nmap[_item->_data._node [1]]) ; \ + _idx.push_tail( \ + _nmap[_item->_data._node [2]]) ; \ + _idx.push_tail( \ + _nmap[_item->_data._node [3]]) ; \ + \ + _tag.push_tail(_item->_data._part) ; \ + } \ + } \ + \ + ncutil::put_var( \ + _jcfg._mesh_file, "tria4_idx", &_idx[0]) ; \ + ncutil::put_var( \ + _jcfg._mesh_file, "tria4_tag", &_tag[0]) ; \ + + + template < + typename jlog_data + > + __normal_call iptr_type save_rdel ( + jcfg_data &_jcfg , + jlog_data &_jlog , + float *_xoff , + mesh_data &_rdel , + _netcdf_tag const& + ) + { + iptr_type _errv = __no_error ; + + try + { + containers::array _nmap; + + __unreferenced(_jlog) ; + + std::string _path, _name, _fext; + file_part( + _jcfg._mesh_file, _path, _name, _fext) ; + + int _retv, _ncid; + if ((_retv = nc_create( + _jcfg._tria_file.c_str(), + NC_CLOBBER|NC_NETCDF4, &_ncid))) + { + return __file_not_created; + } + + if (_rdel._ndim == +2 && + _rdel._kind == + jmsh_kind::euclidean_mesh) + { + /*-------------------------- save 2-dim. mesh */ + ncutil::put_str(_jcfg._tria_file, + "title", + _name + "; created by " + __JGSWVSTR); + + ncutil::put_str(_jcfg._tria_file, + "MSHID", "EUCLIDEAN-MESH" ) ; + + /*------------ index mapping for active nodes */ + _nmap.set_count(_rdel. + _euclidean_rdel_2d._tria._nset.count() , + containers::tight_alloc , -1); + + for (auto _iter = _rdel. + _euclidean_rdel_2d._eset._lptr.head(); + _iter != _rdel. + _euclidean_rdel_2d._eset._lptr.tend(); + ++_iter ) + { + if ( *_iter == nullptr) continue ; + + for (auto _item = *_iter ; + _item != nullptr; + _item = _item->_next ) + { + _nmap[_item->_data._node[0]] = 1 ; + _nmap[_item->_data._node[1]] = 1 ; + } + } + + for (auto _iter = _rdel. + _euclidean_rdel_2d._tset._lptr.head(); + _iter != _rdel. + _euclidean_rdel_2d._tset._lptr.tend(); + ++_iter ) + { + if ( *_iter == nullptr) continue ; + + for (auto _item = *_iter ; + _item != nullptr; + _item = _item->_next ) + { + _nmap[_item->_data._node[0]] = 1 ; + _nmap[_item->_data._node[1]] = 1 ; + _nmap[_item->_data._node[2]] = 1 ; + } + } + + iptr_type _last = +0; + for (auto _iter = _nmap.head() ; + _iter != _nmap.tend() ; + ++_iter ) + { + if ( *_iter >= +0) *_iter = _last ++ ; + } + + ncutil::def_dim( + _jcfg._mesh_file, "singleton", +1); + + containers::array _pos; + containers::array _idx; + containers::array _tag; + containers::array _val; + + if (_last > +0) + { + /*-------------------------- write POINT data */ + save_vert2( + _rdel._euclidean_rdel_2d._tria) + } + if (_rdel._euclidean_rdel_2d. + _eset.count() > +0) + { + /*-------------------------- write EDGE2 data */ + save_edge2( + _rdel._euclidean_rdel_2d._eset) + } + if (_rdel._euclidean_rdel_2d. + _tset.count() > +0) + { + /*-------------------------- write TRIA3 data */ + save_tria3( + _rdel._euclidean_rdel_2d._tset) + } + + } + else + if (_rdel._ndim == +3 && + _rdel._kind == + jmsh_kind::euclidean_mesh) + { + /*-------------------------- save 3-dim. mesh */ + ncutil::put_str(_jcfg._tria_file, + "title", + _name + "; created by " + __JGSWVSTR); + + ncutil::put_str(_jcfg._tria_file, + "MSHID", "EUCLIDEAN-MESH" ) ; + + /*------------ index mapping for active nodes */ + _nmap.set_count(_rdel. + _euclidean_rdel_3d._tria._nset.count() , + containers::tight_alloc, -1) ; + + for (auto _iter = _rdel. + _euclidean_rdel_3d._eset._lptr.head(); + _iter != _rdel. + _euclidean_rdel_3d._eset._lptr.tend(); + ++_iter ) + { + if ( *_iter == nullptr) continue ; + + for (auto _item = *_iter ; + _item != nullptr; + _item = _item->_next ) + { + _nmap[_item->_data._node[0]] = 1 ; + _nmap[_item->_data._node[1]] = 1 ; + } + } + + for (auto _iter = _rdel. + _euclidean_rdel_3d._fset._lptr.head(); + _iter != _rdel. + _euclidean_rdel_3d._fset._lptr.tend(); + ++_iter ) + { + if ( *_iter == nullptr) continue ; + + for (auto _item = *_iter ; + _item != nullptr; + _item = _item->_next ) + { + _nmap[_item->_data._node[0]] = 1 ; + _nmap[_item->_data._node[1]] = 1 ; + _nmap[_item->_data._node[2]] = 1 ; + } + } + + for (auto _iter = _rdel. + _euclidean_rdel_3d._tset._lptr.head(); + _iter != _rdel. + _euclidean_rdel_3d._tset._lptr.tend(); + ++_iter ) + { + if ( *_iter == nullptr) continue ; + + for (auto _item = *_iter ; + _item != nullptr; + _item = _item->_next ) + { + _nmap[_item->_data._node[0]] = 1 ; + _nmap[_item->_data._node[1]] = 1 ; + _nmap[_item->_data._node[2]] = 1 ; + _nmap[_item->_data._node[3]] = 1 ; + } + } + + iptr_type _last = +0; + for (auto _iter = _nmap.head() ; + _iter != _nmap.tend() ; + ++_iter ) + { + if ( *_iter >= +0) *_iter = _last ++ ; + } + + ncutil::def_dim( + _jcfg._mesh_file, "singleton", +1); + + containers::array _pos; + containers::array _idx; + containers::array _tag; + containers::array _val; + + if (_last > +0) + { + /*-------------------------- write POINT data */ + save_vert3( + _rdel._euclidean_rdel_3d._tria) + } + if (_rdel._euclidean_rdel_3d. + _eset.count() > +0) + { + /*-------------------------- write EDGE2 data */ + save_edge2( + _rdel._euclidean_rdel_3d._eset) + } + if (_rdel._euclidean_rdel_3d. + _fset.count() > +0) + { + /*-------------------------- write TRIA3 data */ + save_tria3( + _rdel._euclidean_rdel_3d._fset) + } + if (_rdel._euclidean_rdel_3d. + _tset.count() > +0) + { + /*-------------------------- write TRIA4 data */ + save_tria4( + _rdel._euclidean_rdel_3d._tset) + } + + } + } + catch (...) + { + _errv = __unknown_error ; + } + + return ( _errv ) ; + } + + #undef save_vert2 + #undef save_vert3 + #undef save_edge2 + #undef save_tria3 + #undef save_tria4 + + #endif //__use_netcdf + + /* + -------------------------------------------------------- + * SAVE-RDEL: save MSH_t output data. + -------------------------------------------------------- + */ + + #define save_vert2(_mesh) \ + jigsaw_alloc_vert2(&_mmsh._vert2, _last) ; \ + jigsaw_alloc_reals(&_mmsh._power, _last) ; \ + \ + iptr_type _npos = +0 ; \ + iptr_type _nout = +0 ; \ + \ + for (auto _iter = _mesh._nset.head(); \ + _iter != _mesh._nset.tend(); \ + ++_iter, ++_npos) \ + { \ + if (_iter->mark() >= 0 && \ + _nmap[_npos ] >= 0 ) \ + { \ + _mmsh._vert2._data[_nout]. \ + _ppos[0] = _iter->pval(0) + _xoff[0] ; \ + _mmsh._vert2._data[_nout]. \ + _ppos[1] = _iter->pval(1) + _xoff[1] ; \ + \ + _mmsh._vert2._data[_nout]. \ + _itag = _iter->part () ; \ + \ + _mmsh._power. \ + _data[_nout] = _iter->pval(2) ; \ + \ + _nout = _nout + 1 ; \ + } \ + } \ + \ + _mesh.clear (containers::tight_alloc); \ + + + #define save_vert3(_mesh) \ + jigsaw_alloc_vert3(&_mmsh._vert3, _last) ; \ + jigsaw_alloc_reals(&_mmsh._power, _last) ; \ + \ + iptr_type _npos = +0 ; \ + iptr_type _nout = +0 ; \ + \ + for (auto _iter = _mesh._nset.head(); \ + _iter != _mesh._nset.tend(); \ + ++_iter, ++_npos) \ + { \ + if (_iter->mark() >= 0 && \ + _nmap[_npos ] >= 0 ) \ + { \ + _mmsh._vert3._data[_nout]. \ + _ppos[0] = _iter->pval(0) + _xoff[0] ; \ + _mmsh._vert3._data[_nout]. \ + _ppos[1] = _iter->pval(1) + _xoff[1] ; \ + _mmsh._vert3._data[_nout]. \ + _ppos[2] = _iter->pval(2) + _xoff[2] ; \ + \ + _mmsh._vert3._data[_nout]. \ + _itag = _iter->part () ; \ + \ + _mmsh._power. \ + _data[_nout] = _iter->pval(3) ; \ + \ + _nout = _nout + 1 ; \ + } \ + } \ + \ + _mesh.clear (containers::tight_alloc); \ + + + #define save_edge2(_list) \ + jigsaw_alloc_edge2 ( \ + &_mmsh._edge2, _list.count()) ; \ + \ + iptr_type _eout = +0 ; \ + \ + for (auto _iter = _list._lptr.head(); \ + _iter != _list._lptr.tend(); \ + ++_iter ) \ + { \ + if ( *_iter == nullptr) continue ; \ + \ + for (auto _item = *_iter ; \ + _item != nullptr; \ + _item = _item->_next ) \ + { \ + _mmsh._edge2._data[_eout]. \ + _node[0] = \ + _nmap[_item->_data._node[0]] ; \ + _mmsh._edge2._data[_eout]. \ + _node[1] = \ + _nmap[_item->_data._node[1]] ; \ + \ + _mmsh._edge2._data[_eout]. \ + _itag = _item->_data._part ; \ + \ + _eout = _eout + 1 ; \ + } \ + } \ + \ + _list.clear (containers::tight_alloc); \ + + + #define save_tria3(_list) \ + jigsaw_alloc_tria3 ( \ + &_mmsh._tria3, _list.count()) ; \ + \ + iptr_type _tout = +0 ; \ + \ + for (auto _iter = _list._lptr.head(); \ + _iter != _list._lptr.tend(); \ + ++_iter ) \ + { \ + if ( *_iter == nullptr) continue ; \ + \ + for (auto _item = *_iter ; \ + _item != nullptr; \ + _item = _item->_next ) \ + { \ + _mmsh._tria3._data[_tout]. \ + _node[0] = \ + _nmap[_item->_data._node[0]] ; \ + _mmsh._tria3._data[_tout]. \ + _node[1] = \ + _nmap[_item->_data._node[1]] ; \ + _mmsh._tria3._data[_tout]. \ + _node[2] = \ + _nmap[_item->_data._node[2]] ; \ + \ + _mmsh._tria3._data[_tout]. \ + _itag = _item->_data._part ; \ + \ + _tout = _tout + 1 ; \ + } \ + } \ + \ + _list.clear (containers::tight_alloc); \ + + + #define save_tria4(_list) \ + jigsaw_alloc_tria4 ( \ + &_mmsh._tria4, _list.count()) ; \ + \ + iptr_type _tout = +0 ; \ + \ + for (auto _iter = _list._lptr.head(); \ + _iter != _list._lptr.tend(); \ + ++_iter ) \ + { \ + if ( *_iter == nullptr) continue ; \ + \ + for (auto _item = *_iter ; \ + _item != nullptr; \ + _item = _item->_next ) \ + { \ + _mmsh._tria4._data[_tout]. \ + _node[0] = \ + _nmap[_item->_data._node[0]] ; \ + _mmsh._tria4._data[_tout]. \ + _node[1] = \ + _nmap[_item->_data._node[1]] ; \ + _mmsh._tria4._data[_tout]. \ + _node[2] = \ + _nmap[_item->_data._node[2]] ; \ + _mmsh._tria4._data[_tout]. \ + _node[3] = \ + _nmap[_item->_data._node[3]] ; \ + \ + _mmsh._tria4._data[_tout]. \ + _itag = _item->_data._part ; \ + \ + _tout = _tout + 1 ; \ + } \ + } \ + \ + _list.clear (containers::tight_alloc); \ + + + template < + typename jlog_data + > + __normal_call iptr_type save_rdel ( + jcfg_data &_jcfg , + jlog_data &_jlog , + float *_xoff , + mesh_data &_rdel , + jigsaw_msh_t &_mmsh + ) + { + iptr_type _errv = __no_error ; + + try + { + containers::array _nmap; + + __unreferenced (_jlog) ; + __unreferenced (_jcfg) ; + + if (_rdel._ndim == +2 && // save 2-dim. mesh + _rdel._kind == + jmsh_kind::euclidean_mesh) + { + _mmsh._flags = JIGSAW_EUCLIDEAN_MESH ; + + /*------------ index mapping for active nodes */ + _nmap.set_count(_rdel. + _euclidean_rdel_2d._tria._nset.count() , + containers::tight_alloc, -1) ; + + for (auto _iter = _rdel. + _euclidean_rdel_2d._eset._lptr.head(); + _iter != _rdel. + _euclidean_rdel_2d._eset._lptr.tend(); + ++_iter ) + { + if ( *_iter == nullptr) continue ; + + for (auto _item = *_iter ; + _item != nullptr; + _item = _item->_next ) + { + _nmap[_item->_data._node[0]]=1 ; + _nmap[_item->_data._node[1]]=1 ; + } + } + + for (auto _iter = _rdel. + _euclidean_rdel_2d._tset._lptr.head(); + _iter != _rdel. + _euclidean_rdel_2d._tset._lptr.tend(); + ++_iter ) + { + if ( *_iter == nullptr) continue ; + + for (auto _item = *_iter ; + _item != nullptr; + _item = _item->_next ) + { + _nmap[_item->_data._node[0]]=1 ; + _nmap[_item->_data._node[1]]=1 ; + _nmap[_item->_data._node[2]]=1 ; + } + } + + iptr_type _last = +0; + for (auto _iter = _nmap.head() ; + _iter != _nmap.tend() ; + ++_iter ) + { + if ( *_iter >= +0) *_iter = _last ++ ; + } + + if (_last > +0) + { + /*-------------------------- write POINT data */ + save_vert2( + _rdel._euclidean_rdel_2d._tria) + } + if (_rdel._euclidean_rdel_2d. + _eset.count() > +0) + { + /*-------------------------- write EDGE2 data */ + save_edge2( + _rdel._euclidean_rdel_2d._eset) + } + if (_rdel._euclidean_rdel_2d. + _tset.count() > +0) + { + /*-------------------------- write TRIA3 data */ + save_tria3( + _rdel._euclidean_rdel_2d._tset) + } + + } + else + if (_rdel._ndim == +3 && // save 3-dim. mesh + _rdel._kind == + jmsh_kind::euclidean_mesh) + { + _mmsh._flags = JIGSAW_EUCLIDEAN_MESH ; + + /*------------ index mapping for active nodes */ + _nmap.set_count(_rdel. + _euclidean_rdel_3d._tria._nset.count() , + containers::tight_alloc, -1) ; + + for (auto _iter = _rdel. + _euclidean_rdel_3d._eset._lptr.head(); + _iter != _rdel. + _euclidean_rdel_3d._eset._lptr.tend(); + ++_iter ) + { + if ( *_iter == nullptr) continue ; + + for (auto _item = *_iter ; + _item != nullptr; + _item = _item->_next ) + { + _nmap[_item->_data._node[0]]=1 ; + _nmap[_item->_data._node[1]]=1 ; + } + } + + for (auto _iter = _rdel. + _euclidean_rdel_3d._fset._lptr.head(); + _iter != _rdel. + _euclidean_rdel_3d._fset._lptr.tend(); + ++_iter ) + { + if ( *_iter == nullptr) continue ; + + for (auto _item = *_iter ; + _item != nullptr; + _item = _item->_next ) + { + _nmap[_item->_data._node[0]]=1 ; + _nmap[_item->_data._node[1]]=1 ; + _nmap[_item->_data._node[2]]=1 ; + } + } + + for (auto _iter = _rdel. + _euclidean_rdel_3d._tset._lptr.head(); + _iter != _rdel. + _euclidean_rdel_3d._tset._lptr.tend(); + ++_iter ) + { + if ( *_iter == nullptr) continue ; + + for (auto _item = *_iter ; + _item != nullptr; + _item = _item->_next ) + { + _nmap[_item->_data._node[0]]=1 ; + _nmap[_item->_data._node[1]]=1 ; + _nmap[_item->_data._node[2]]=1 ; + _nmap[_item->_data._node[3]]=1 ; + } + } + + iptr_type _last = +0; + for (auto _iter = _nmap.head() ; + _iter != _nmap.tend() ; + ++_iter ) + { + if ( *_iter >= +0) *_iter = _last ++ ; + } + + if (_last > +0) + { + /*-------------------------- write POINT data */ + save_vert3( + _rdel._euclidean_rdel_3d._tria) + } + if (_rdel._euclidean_rdel_3d. + _eset.count() > +0) + { + /*-------------------------- write EDGE2 data */ + save_edge2( + _rdel._euclidean_rdel_3d._eset) + } + if (_rdel._euclidean_rdel_3d. + _fset.count() > +0) + { + /*-------------------------- write TRIA3 data */ + save_tria3( + _rdel._euclidean_rdel_3d._fset) + } + if (_rdel._euclidean_rdel_3d. + _tset.count() > +0) + { + /*-------------------------- write TRIA4 data */ + save_tria4( + _rdel._euclidean_rdel_3d._tset) + } + + } + + } + catch (...) + { + _errv = __unknown_error ; + } + + return ( _errv ) ; + } + + #undef save_vert2 + #undef save_vert3 + #undef save_edge2 + #undef save_tria3 + #undef save_tria4 + + /* + -------------------------------------------------------- + * SAVE-RDEL: save to *.MSH or *.NC + -------------------------------------------------------- + */ + + template < + typename jlog_data + > + __normal_call iptr_type save_rdel ( + jcfg_data &_jcfg , + jlog_data &_jlog , + float *_xoff , + mesh_data &_rdel + ) + { + iptr_type _errv = __no_error ; + + try + { + /*------------------------- disambiguate via file-ext */ + std::string _path, _name, _fext; + file_part( + _jcfg._mesh_file, _path, _name, _fext) ; + + if(_fext.find("msh") != std::string::npos) + { + return save_rdel(_jcfg, _jlog, + _xoff, _rdel, mshfile_tag()) ; + } + else + if(_fext.find( "nc") != std::string::npos) + { + # ifdef __use_netcdf + return save_rdel(_jcfg, _jlog, + _xoff, _rdel, _netcdf_tag()) ; + # else + return __netcdf_not_available; + # endif + } + } + catch (...) + { + _errv = __unknown_error ; // can't get here?? + } + + return ( _errv ) ; + } + + + diff --git a/external/jigsaw/src/tri_save.inc b/external/jigsaw/src/tri_save.inc new file mode 100644 index 0000000..0f6a81b --- /dev/null +++ b/external/jigsaw/src/tri_save.inc @@ -0,0 +1,1030 @@ + + /* + -------------------------------------------------------- + * MSH-SAVE: parse MESH data into *.MSH / MSH_t. + -------------------------------------------------------- + * + * This program may be freely redistributed under the + * condition that the copyright notices (including this + * entire header) are not removed, and no compensation + * is received through use of the software. Private, + * research, and institutional use is free. You may + * distribute modified versions of this code UNDER THE + * CONDITION THAT THIS CODE AND ANY MODIFICATIONS MADE + * TO IT IN THE SAME FILE REMAIN UNDER COPYRIGHT OF THE + * ORIGINAL AUTHOR, BOTH SOURCE AND OBJECT CODE ARE + * MADE FREELY AVAILABLE WITHOUT CHARGE, AND CLEAR + * NOTICE IS GIVEN OF THE MODIFICATIONS. Distribution + * of this code as part of a commercial system is + * permissible ONLY BY DIRECT ARRANGEMENT WITH THE + * AUTHOR. (If you are not directly supplying this + * code to a customer, and you are instead telling them + * how they can obtain it for free, then you are not + * required to make any arrangement with me.) + * + * Disclaimer: Neither I nor THE CONTRIBUTORS warrant + * this code in any way whatsoever. This code is + * provided "as-is" to be used at your own risk. + * + * THE CONTRIBUTORS include: + * (a) The University of Sydney + * (b) The Massachusetts Institute of Technology + * (c) Columbia University + * (d) The National Aeronautics & Space Administration + * (e) Los Alamos National Laboratory + * + -------------------------------------------------------- + * + * Last updated: 30 May, 2022 + * + * Copyright 2013-2022 + * Darren Engwirda + * d.engwirda@gmail.com + * https://github.com/dengwirda/ + * + -------------------------------------------------------- + */ + + // from msh_save.hpp + + + /* + -------------------------------------------------------- + * SAVE-TRIA: save *.MSH output file. + -------------------------------------------------------- + */ + + #define save_vert2(_mesh) \ + _file << "POINT=" << _last << "\n" ; \ + \ + auto _next = +0, _roll = +0, \ + _npos = +0; \ + char _fbuf[PRINTCHUNK] ; \ + \ + for (auto _iter = _mesh._nset.head(); \ + _iter != _mesh._nset.tend(); \ + ++_iter, ++_npos) \ + { \ + if (_iter->mark() >= 0 && \ + _nmap[_npos ] >= 0) \ + { \ + PRINTCHARS(snprintf(&_fbuf[_next], \ + PRINTCHUNK, \ + "%.17g;%.17g;+0\n", \ + _iter->pval(0) + _xoff[0] , \ + _iter->pval(1) + _xoff[1]), \ + VERT2CHUNK) \ + } \ + } \ + PRINTFINAL; \ + + + #define save_vert3(_mesh) \ + _file << "POINT=" << _last << "\n" ; \ + \ + auto _next = +0, _roll = +0, \ + _npos = +0; \ + char _fbuf[PRINTCHUNK] ; \ + \ + for (auto _iter = _mesh._nset.head(); \ + _iter != _mesh._nset.tend(); \ + ++_iter, ++_npos) \ + { \ + if (_iter->mark() >= 0 && \ + _nmap[_npos ] >= 0) \ + { \ + PRINTCHARS(snprintf(&_fbuf[_next], \ + PRINTCHUNK, \ + "%.17g;%.17g;%.17g;+0\n", \ + _iter->pval(0) + _xoff[0] , \ + _iter->pval(1) + _xoff[1] , \ + _iter->pval(2) + _xoff[2]), \ + VERT3CHUNK) \ + } \ + } \ + PRINTFINAL; \ + + + #define save_vpwrk(_koff, _mesh) \ + _file << "POWER=" << _last << ";1" << "\n" ; \ + \ + auto _next = +0, _roll = +0, \ + _npos = +0; \ + char _fbuf[PRINTCHUNK] ; \ + \ + for (auto _iter = _mesh._nset.head(); \ + _iter != _mesh._nset.tend(); \ + ++_iter, ++_npos) \ + { \ + if (_iter->mark() >= 0 && \ + _nmap[_npos ] >= 0) \ + { \ + PRINTCHARS(snprintf(&_fbuf[_next] , \ + PRINTCHUNK, "%.17g\n" , \ + _iter->pval(_koff) ), VALUECHUNK) \ + } \ + } \ + PRINTFINAL; \ + + + #define save_tria3(_mesh) \ + _file << "TRIA3=" << _ntri << "\n" ; \ + \ + auto _next = +0, _roll = +0; \ + char _fbuf[PRINTCHUNK] ; \ + \ + for (auto _iter = _mesh._tset.head(); \ + _iter != _mesh._tset.tend(); \ + ++_iter ) \ + { \ + if (_iter->mark() < +0) continue ; \ + \ + PRINTCHARS(snprintf(&_fbuf[_next], \ + PRINTCHUNK, "%u;%u;%u;+0\n", \ + _nmap[_iter->node(0)] , \ + _nmap[_iter->node(1)] , \ + _nmap[_iter->node(2)]),TRIA3CHUNK) \ + } \ + PRINTFINAL; \ + + + #define save_tria4(_mesh) \ + _file << "TRIA4=" << _ntri << "\n" ; \ + \ + auto _next = +0, _roll = +0; \ + char _fbuf[PRINTCHUNK] ; \ + \ + for (auto _iter = _mesh._tset.head(); \ + _iter != _mesh._tset.tend(); \ + ++_iter ) \ + { \ + if (_iter->mark() < +0) continue ; \ + \ + PRINTCHARS(snprintf(&_fbuf[_next], \ + PRINTCHUNK, \ + "%u;%u;%u;%u;+0\n", \ + _nmap[_iter->node(0)] , \ + _nmap[_iter->node(1)] , \ + _nmap[_iter->node(2)] , \ + _nmap[_iter->node(3)]),TRIA4CHUNK) \ + } \ + PRINTFINAL; \ + + + template < + typename jlog_data + > + __normal_call iptr_type save_tria ( + jcfg_data &_jcfg , + jlog_data &_jlog , + float *_xoff , + mesh_data &_rdel , + mshfile_tag const& + ) + { + iptr_type _errv = __no_error ; + + try + { + containers::array _nmap; + + __unreferenced(_jlog) ; + + std::string _path, _name, _fext; + file_part( + _jcfg._tria_file, _path, _name, _fext) ; + + std::ofstream _file; + _file.open( + _jcfg._tria_file, + std::ofstream::out | std::ofstream::trunc) ; + + if (_file.is_open()) + { + if (_rdel._ndim == +2 && + _rdel._kind == + jmsh_kind::euclidean_mesh) + { + /*-------------------------- save 2-dim. mesh */ + _file << "# " << _name << ".msh" + << "; created by " ; + _file << __JGSWVSTR "\n" ; + _file << "MSHID=2;EUCLIDEAN-MESH \n" ; + _file << "NDIMS=2 \n" ; + + /*------------ index mapping for active nodes */ + _nmap.set_count(_rdel. + _euclidean_rdel_2d._tria._nset.count() , + containers::tight_alloc, -1) ; + + iptr_type _ntri = +0; + for (auto _iter = _rdel. + _euclidean_rdel_2d._tria._tset.head(); + _iter != _rdel. + _euclidean_rdel_2d._tria._tset.tend(); + ++_iter ) + { + if (_iter->mark() < +0) continue ; + + _ntri += +1 ; + + _nmap[_iter->node(0)] = 1; + _nmap[_iter->node(1)] = 1; + _nmap[_iter->node(2)] = 1; + } + + iptr_type _last = +0; + for (auto _iter = _nmap.head() ; + _iter != _nmap.tend() ; + ++_iter ) + { + if ( *_iter >= +0) *_iter = _last ++ ; + } + + if (_last > +0) + { + /*-------------------------- write POINT data */ + save_vert2( + _rdel._euclidean_rdel_2d._tria) + } + if (_last > +0) + { + /*-------------------------- write POWER data */ + save_vpwrk( + +2, _rdel._euclidean_rdel_2d._tria) + } + if (_ntri > +0) + { + /*-------------------------- write TRIA3 data */ + save_tria3( + _rdel._euclidean_rdel_2d._tria) + } + + } + else + if (_rdel._ndim == +3 && + _rdel._kind == + jmsh_kind::euclidean_mesh) + { + /*-------------------------- save 3-dim. mesh */ + _file << "# " << _name << ".msh" + << "; created by " ; + _file << __JGSWVSTR "\n" ; + _file << "MSHID=2;EUCLIDEAN-MESH \n" ; + _file << "NDIMS=3 \n" ; + + /*------------ index mapping for active nodes */ + _nmap.set_count(_rdel. + _euclidean_rdel_3d._tria._nset.count() , + containers::tight_alloc, -1) ; + + iptr_type _ntri = +0; + for (auto _iter = _rdel. + _euclidean_rdel_3d._tria._tset.head(); + _iter != _rdel. + _euclidean_rdel_3d._tria._tset.tend(); + ++_iter ) + { + if (_iter->mark() < +0) continue ; + + _ntri += +1 ; + + _nmap[_iter->node(0)] = 1; + _nmap[_iter->node(1)] = 1; + _nmap[_iter->node(2)] = 1; + _nmap[_iter->node(3)] = 1; + } + + iptr_type _last = +0; + for (auto _iter = _nmap.head() ; + _iter != _nmap.tend() ; + ++_iter ) + { + if ( *_iter >= +0) *_iter = _last ++ ; + } + + if (_last > +0) + { + /*-------------------------- write POINT data */ + save_vert3( + _rdel._euclidean_rdel_3d._tria) + } + if (_last > +0) + { + /*-------------------------- write POWER data */ + save_vpwrk( + +3, _rdel._euclidean_rdel_3d._tria) + } + if (_ntri > +0) + { + /*-------------------------- write TRIA4 data */ + save_tria4( + _rdel._euclidean_rdel_3d._tria) + } + + } + + } + else + { + _errv = __file_not_created ; + } + + _file.close(); + + } + catch (...) + { + _errv = __unknown_error ; + } + + return ( _errv ) ; + } + + #undef save_vert2 + #undef save_vert3 + #undef save_vpwrk + #undef save_tria3 + #undef save_tria4 + + /* + -------------------------------------------------------- + * SAVE-TRIA: save *.NC output file. + -------------------------------------------------------- + */ + + #ifdef __use_netcdf + + #define save_vert2(_mesh) \ + ncutil::def_dim( \ + _jcfg._tria_file, "vert2_row", _last); \ + ncutil::def_dim( \ + _jcfg._tria_file, "vert2_col", +2) ; \ + \ + ncutil::def_var( \ + _jcfg._tria_file, "vert2_pos", NC_DOUBLE, \ + "2-vertex coordinates" , \ + {"vert2_row", "vert2_col"} ) ; \ + ncutil::def_var( \ + _jcfg._tria_file, "vert2_tag", NC_INT, \ + "2-vertex id-tags" , \ + {"vert2_row", "singleton"} ) ; \ + ncutil::def_var( \ + _jcfg._tria_file, "power_val", NC_DOUBLE, \ + "vertex power values" , \ + {"vert2_row", "singleton"} ) ; \ + \ + _pos.clear(); _pos.set_alloc(_last * 2); \ + _tag.clear(); _tag.set_alloc(_last * 1); \ + _val.clear(); _val.set_alloc(_last * 1); \ + \ + auto _npos = +0; \ + for (auto _iter = _mesh._nset.head() ; \ + _iter != _mesh._nset.tend() ; \ + ++_iter, ++_npos) \ + { \ + if (_iter->mark() >= 0 && \ + _nmap[_npos ] >= 0 ) \ + { \ + _pos.push_tail( \ + _iter->pval(0) + _xoff[0]) ; \ + _pos.push_tail( \ + _iter->pval(1) + _xoff[1]) ; \ + \ + _tag.push_tail (0) ; \ + \ + _val.push_tail(_iter->pval(2)) ; \ + } \ + } \ + \ + ncutil::put_var( \ + _jcfg._tria_file, "vert2_pos", &_pos[0]) ; \ + ncutil::put_var( \ + _jcfg._tria_file, "vert2_tag", &_tag[0]) ; \ + ncutil::put_var( \ + _jcfg._tria_file, "power_val", &_val[0]) ; \ + + + #define save_vert3(_mesh) \ + ncutil::def_dim( \ + _jcfg._tria_file, "vert3_row", _last); \ + ncutil::def_dim( \ + _jcfg._tria_file, "vert3_col", +3) ; \ + \ + ncutil::def_var( \ + _jcfg._tria_file, "vert3_pos", NC_DOUBLE, \ + "3-vertex coordinates" , \ + {"vert3_row", "vert3_col"} ) ; \ + ncutil::def_var( \ + _jcfg._tria_file, "vert3_tag", NC_INT, \ + "3-vertex id-tags" , \ + {"vert3_row", "singleton"} ) ; \ + ncutil::def_var( \ + _jcfg._tria_file, "power_val", NC_DOUBLE, \ + "vertex power values" , \ + {"vert3_row", "singleton"} ) ; \ + \ + _pos.clear(); _pos.set_alloc(_last * 3); \ + _tag.clear(); _tag.set_alloc(_last * 1); \ + _val.clear(); _val.set_alloc(_last * 1); \ + \ + auto _npos = +0; \ + for (auto _iter = _mesh._nset.head() ; \ + _iter != _mesh._nset.tend() ; \ + ++_iter, ++_npos) \ + { \ + if (_iter->mark() >= 0 && \ + _nmap[_npos ] >= 0 ) \ + { \ + _pos.push_tail( \ + _iter->pval(0) + _xoff[0]) ; \ + _pos.push_tail( \ + _iter->pval(1) + _xoff[1]) ; \ + _pos.push_tail( \ + _iter->pval(2) + _xoff[2]) ; \ + \ + _tag.push_tail (0) ; \ + \ + _val.push_tail(_iter->pval(3)) ; \ + } \ + } \ + \ + ncutil::put_var( \ + _jcfg._tria_file, "vert3_pos", &_pos[0]) ; \ + ncutil::put_var( \ + _jcfg._tria_file, "vert3_tag", &_tag[0]) ; \ + ncutil::put_var( \ + _jcfg._tria_file, "power_val", &_val[0]) ; \ + + + #define save_tria3(_mesh) \ + ncutil::def_dim( \ + _jcfg._tria_file, "tria3_row", _ntri); \ + ncutil::def_dim( \ + _jcfg._tria_file, "tria3_col", +3) ; \ + \ + ncutil::def_var( \ + _jcfg._tria_file, "tria3_idx", NC_INT, \ + "3-node tria indexes" , \ + {"tria3_row", "tria3_col"} ) ; \ + ncutil::def_var( \ + _jcfg._tria_file, "tria3_tag", NC_INT, \ + "3-node tria id-tags" , \ + {"tria3_row", "singleton"} ) ; \ + \ + _idx.clear(); _idx.set_alloc(_ntri * 3); \ + _tag.clear(); _tag.set_alloc(_ntri * 1); \ + \ + for (auto _iter = _mesh._tset.head() ; \ + _iter != _mesh._tset.tend() ; \ + ++_iter ) \ + { \ + if (_iter->mark() >= 0) \ + { \ + _idx.push_tail( \ + _nmap[_iter->node(0)]) ; \ + _idx.push_tail( \ + _nmap[_iter->node(1)]) ; \ + _idx.push_tail( \ + _nmap[_iter->node(2)]) ; \ + \ + _tag.push_tail(0) ; \ + } \ + } \ + \ + ncutil::put_var( \ + _jcfg._tria_file, "tria3_idx", &_idx[0]) ; \ + ncutil::put_var( \ + _jcfg._tria_file, "tria3_tag", &_tag[0]) ; \ + + + #define save_tria4(_mesh) \ + ncutil::def_dim( \ + _jcfg._tria_file, "tria4_row", _ntri); \ + ncutil::def_dim( \ + _jcfg._tria_file, "tria4_col", +4) ; \ + \ + ncutil::def_var( \ + _jcfg._tria_file, "tria4_idx", NC_INT, \ + "4-node tria indexes" , \ + {"tria4_row", "tria4_col"} ) ; \ + ncutil::def_var( \ + _jcfg._tria_file, "tria4_tag", NC_INT, \ + "4-node tria id-tags" , \ + {"tria4_row", "singleton"} ) ; \ + \ + _idx.clear(); _idx.set_alloc(_ntri * 4); \ + _tag.clear(); _tag.set_alloc(_ntri * 1); \ + \ + for (auto _iter = _mesh._tset.head() ; \ + _iter != _mesh._tset.tend() ; \ + ++_iter ) \ + { \ + if (_iter->mark() >= 0) \ + { \ + _idx.push_tail( \ + _nmap[_iter->node(0)]) ; \ + _idx.push_tail( \ + _nmap[_iter->node(1)]) ; \ + _idx.push_tail( \ + _nmap[_iter->node(2)]) ; \ + _idx.push_tail( \ + _nmap[_iter->node(3)]) ; \ + \ + _tag.push_tail(0) ; \ + } \ + } \ + \ + ncutil::put_var( \ + _jcfg._tria_file, "tria4_idx", &_idx[0]) ; \ + ncutil::put_var( \ + _jcfg._tria_file, "tria4_tag", &_tag[0]) ; \ + + + template < + typename jlog_data + > + __normal_call iptr_type save_tria ( + jcfg_data &_jcfg , + jlog_data &_jlog , + float *_xoff , + mesh_data &_rdel , + _netcdf_tag const& + ) + { + iptr_type _errv = __no_error ; + + try + { + containers::array _nmap; + + __unreferenced(_jlog) ; + + std::string _path, _name, _fext; + file_part( + _jcfg._tria_file, _path, _name, _fext) ; + + int _retv, _ncid; + if ((_retv = nc_create( + _jcfg._tria_file.c_str(), + NC_CLOBBER|NC_NETCDF4, &_ncid))) + { + return __file_not_created; + } + + if (_rdel._ndim == +2 && + _rdel._kind == + jmsh_kind::euclidean_mesh) + { + /*-------------------------- save 2-dim. mesh */ + ncutil::put_str(_jcfg._tria_file, + "title", + _name + "; created by " + __JGSWVSTR); + + ncutil::put_str(_jcfg._tria_file, + "MSHID", "EUCLIDEAN-MESH" ) ; + + /*------------ index mapping for active nodes */ + _nmap.set_count(_rdel. + _euclidean_rdel_2d._tria._nset.count() , + containers::tight_alloc, -1) ; + + iptr_type _ntri = +0; + for (auto _iter = _rdel. + _euclidean_rdel_2d._tria._tset.head(); + _iter != _rdel. + _euclidean_rdel_2d._tria._tset.tend(); + ++_iter ) + { + if (_iter->mark() < +0) continue ; + + _ntri += +1 ; + + _nmap[_iter->node(0)] = 1; + _nmap[_iter->node(1)] = 1; + _nmap[_iter->node(2)] = 1; + } + + iptr_type _last = +0; + for (auto _iter = _nmap.head() ; + _iter != _nmap.tend() ; + ++_iter ) + { + if ( *_iter >= +0) *_iter = _last ++ ; + } + + ncutil::def_dim( + _jcfg._tria_file, "singleton", +1); + + containers::array _pos; + containers::array _idx; + containers::array _tag; + containers::array _val; + + if (_last > +0) + { + /*-------------------------- write POINT data */ + save_vert2( + _rdel._euclidean_rdel_2d._tria) + } + if (_ntri > +0) + { + /*-------------------------- write TRIA3 data */ + save_tria3( + _rdel._euclidean_rdel_2d._tria) + } + + } + else + if (_rdel._ndim == +3 && + _rdel._kind == + jmsh_kind::euclidean_mesh) + { + /*-------------------------- save 3-dim. mesh */ + ncutil::put_str(_jcfg._tria_file, + "title", + _name + "; created by " + __JGSWVSTR); + + ncutil::put_str(_jcfg._tria_file, + "MSHID", "EUCLIDEAN-MESH" ) ; + + /*------------ index mapping for active nodes */ + _nmap.set_count(_rdel. + _euclidean_rdel_3d._tria._nset.count() , + containers::tight_alloc, -1) ; + + iptr_type _ntri = +0; + for (auto _iter = _rdel. + _euclidean_rdel_3d._tria._tset.head(); + _iter != _rdel. + _euclidean_rdel_3d._tria._tset.tend(); + ++_iter ) + { + if (_iter->mark() < +0) continue ; + + _ntri += +1 ; + + _nmap[_iter->node(0)] = 1; + _nmap[_iter->node(1)] = 1; + _nmap[_iter->node(2)] = 1; + _nmap[_iter->node(3)] = 1; + } + + iptr_type _last = +0; + for (auto _iter = _nmap.head() ; + _iter != _nmap.tend() ; + ++_iter ) + { + if ( *_iter >= +0) *_iter = _last ++ ; + } + + ncutil::def_dim( + _jcfg._tria_file, "singleton", +1); + + containers::array _pos; + containers::array _idx; + containers::array _tag; + containers::array _val; + + if (_last > +0) + { + /*-------------------------- write POINT data */ + save_vert3( + _rdel._euclidean_rdel_3d._tria) + } + if (_ntri > +0) + { + /*-------------------------- write TRIA3 data */ + save_tria4( + _rdel._euclidean_rdel_3d._tria) + } + + } + } + catch (...) + { + _errv = __unknown_error ; + } + + return ( _errv ) ; + } + + #undef save_vert2 + #undef save_vert3 + #undef save_tria3 + #undef save_tria4 + + #endif //__use_netcdf + + /* + -------------------------------------------------------- + * SAVE-TRIA: save MSH_t output data. + -------------------------------------------------------- + */ + + #define save_vert2(_mesh) \ + jigsaw_alloc_vert2(&_mmsh._vert2, _last) ; \ + jigsaw_alloc_reals(&_mmsh._power, _last) ; \ + \ + iptr_type _npos = +0 ; \ + iptr_type _nout = +0 ; \ + \ + for (auto _iter = _mesh._nset.head(); \ + _iter != _mesh._nset.tend(); \ + ++_iter, ++_npos) \ + { \ + if (_iter->mark() >= 0 && \ + _nmap[_npos ] >= 0 ) \ + { \ + _mmsh._vert2._data[_nout]. \ + _ppos[0] = _iter->pval(0) + _xoff[0] ; \ + _mmsh._vert2._data[_nout]. \ + _ppos[1] = _iter->pval(1) + _xoff[1] ; \ + \ + _mmsh._vert2. _data[_nout]._itag = 0 ; \ + \ + _mmsh._power. \ + _data[_nout] = _iter->pval(2) ; \ + \ + _nout = _nout + 1 ; \ + } \ + } \ + \ + _mesh._nset.clear(containers::tight_alloc) ;\ + + + #define save_vert3(_mesh) \ + jigsaw_alloc_vert3(&_mmsh._vert3, _last) ; \ + jigsaw_alloc_reals(&_mmsh._power, _last) ; \ + \ + iptr_type _npos = +0 ; \ + iptr_type _nout = +0 ; \ + \ + for (auto _iter = _mesh._nset.head(); \ + _iter != _mesh._nset.tend(); \ + ++_iter, ++_npos) \ + { \ + if (_iter->mark() >= 0 && \ + _nmap[_npos ] >= 0 ) \ + { \ + _mmsh._vert3._data[_nout]. \ + _ppos[0] = _iter->pval(0) + _xoff[0] ; \ + _mmsh._vert3._data[_nout]. \ + _ppos[1] = _iter->pval(1) + _xoff[1] ; \ + _mmsh._vert3._data[_nout]. \ + _ppos[2] = _iter->pval(2) + _xoff[2] ; \ + \ + _mmsh._vert3. _data[_nout]._itag = 0 ; \ + \ + _mmsh._power. \ + _data[_nout] = _iter->pval(3) ; \ + \ + _nout = _nout + 1 ; \ + } \ + } \ + \ + _mesh._nset.clear(containers::tight_alloc) ;\ + + + #define save_tria3(_mesh) \ + jigsaw_alloc_tria3(&_mmsh._tria3, _ntri) ; \ + \ + iptr_type _tout = +0 ; \ + \ + for (auto _iter = _mesh._tset.head(); \ + _iter != _mesh._tset.tend(); \ + ++_iter ) \ + { \ + if (_iter->mark() >= 0) \ + { \ + _mmsh._tria3._data[_tout]. \ + _node[0] = _nmap[_iter->node(0)]; \ + _mmsh._tria3._data[_tout]. \ + _node[1] = _nmap[_iter->node(1)]; \ + _mmsh._tria3._data[_tout]. \ + _node[2] = _nmap[_iter->node(2)]; \ + \ + _mmsh._tria3._data[_tout]._itag = 0 ; \ + \ + _tout = _tout + 1 ; \ + } \ + } \ + \ + _mesh._tset.clear(containers::tight_alloc) ;\ + + + #define save_tria4(_mesh) \ + jigsaw_alloc_tria4(&_mmsh._tria4, _ntri) ; \ + \ + iptr_type _tout = +0 ; \ + \ + for (auto _iter = _mesh._tset.head(); \ + _iter != _mesh._tset.tend(); \ + ++_iter ) \ + { \ + if (_iter->mark() >= 0) \ + { \ + _mmsh._tria4._data[_tout]. \ + _node[0] = _nmap[_iter->node(0)]; \ + _mmsh._tria4._data[_tout]. \ + _node[1] = _nmap[_iter->node(1)]; \ + _mmsh._tria4._data[_tout]. \ + _node[2] = _nmap[_iter->node(2)]; \ + _mmsh._tria4._data[_tout]. \ + _node[3] = _nmap[_iter->node(3)]; \ + \ + _mmsh._tria4._data[_tout]._itag = 0 ; \ + \ + _tout = _tout + 1 ; \ + } \ + } \ + \ + _mesh._tset.clear(containers::tight_alloc) ;\ + + + template < + typename jlog_data + > + __normal_call iptr_type save_tria ( + jcfg_data &_jcfg , + jlog_data &_jlog , + float *_xoff , + mesh_data &_rdel , + jigsaw_msh_t &_mmsh + ) + { + iptr_type _errv = __no_error ; + + try + { + containers::array _nmap; + + __unreferenced (_jlog) ; + __unreferenced (_jcfg) ; + + if (_rdel._ndim == +2 && // save 2-dim. mesh + _rdel._kind == + jmsh_kind::euclidean_mesh) + { + _mmsh._flags = JIGSAW_EUCLIDEAN_MESH ; + + /*------------ index mapping for active nodes */ + _nmap.set_count(_rdel. + _euclidean_rdel_2d._tria._nset.count() , + containers::tight_alloc, -1) ; + + iptr_type _ntri = +0; + for (auto _iter = _rdel. + _euclidean_rdel_2d._tria._tset.head(); + _iter != _rdel. + _euclidean_rdel_2d._tria._tset.tend(); + ++_iter ) + { + if (_iter->mark() < +0) continue ; + + _ntri += +1 ; + + _nmap[_iter->node(0)] = 1; + _nmap[_iter->node(1)] = 1; + _nmap[_iter->node(2)] = 1; + } + + iptr_type _last = +0; + for (auto _iter = _nmap.head() ; + _iter != _nmap.tend() ; + ++_iter ) + { + if ( *_iter >= +0) *_iter = _last ++ ; + } + + if (_last > +0) + { + /*-------------------------- write POINT data */ + save_vert2( + _rdel._euclidean_rdel_2d._tria) + } + if (_ntri > +0) + { + /*-------------------------- write TRIA3 data */ + save_tria3( + _rdel._euclidean_rdel_2d._tria) + } + + } + else + if (_rdel._ndim == +3 && // save 3-dim. mesh + _rdel._kind == + jmsh_kind::euclidean_mesh) + { + _mmsh._flags = JIGSAW_EUCLIDEAN_MESH ; + + /*------------ index mapping for active nodes */ + _nmap.set_count(_rdel. + _euclidean_rdel_3d._tria._nset.count() , + containers::tight_alloc, -1) ; + + iptr_type _ntri = +0; + for (auto _iter = _rdel. + _euclidean_rdel_3d._tria._tset.head(); + _iter != _rdel. + _euclidean_rdel_3d._tria._tset.tend(); + ++_iter ) + { + if (_iter->mark() < +0) continue ; + + _ntri += +1 ; + + _nmap[_iter->node(0)] = 1; + _nmap[_iter->node(1)] = 1; + _nmap[_iter->node(2)] = 1; + _nmap[_iter->node(3)] = 1; + } + + iptr_type _last = +0; + for (auto _iter = _nmap.head() ; + _iter != _nmap.tend() ; + ++_iter ) + { + if ( *_iter >= +0) *_iter = _last ++ ; + } + + if (_last > +0) + { + /*-------------------------- write POINT data */ + save_vert3( + _rdel._euclidean_rdel_3d._tria) + } + if (_ntri > +0) + { + /*-------------------------- write TRIA3 data */ + save_tria4( + _rdel._euclidean_rdel_3d._tria) + } + + } + + } + catch (...) + { + _errv = __unknown_error ; + } + + return ( _errv ) ; + } + + #undef save_vert2 + #undef save_vert3 + #undef save_tria3 + #undef save_tria4 + + /* + -------------------------------------------------------- + * SAVE-TRIA: save to *.MSH or *.NC + -------------------------------------------------------- + */ + + template < + typename jlog_data + > + __normal_call iptr_type save_tria ( + jcfg_data &_jcfg , + jlog_data &_jlog , + float *_xoff , + mesh_data &_rdel + ) + { + iptr_type _errv = __no_error ; + + try + { + /*------------------------- disambiguate via file-ext */ + std::string _path, _name, _fext; + file_part( + _jcfg._tria_file, _path, _name, _fext) ; + + if(_fext.find("msh") != std::string::npos) + { + return save_tria(_jcfg, _jlog, + _xoff, _rdel, mshfile_tag()) ; + } + else + if(_fext.find( "nc") != std::string::npos) + { + # ifdef __use_netcdf + return save_tria(_jcfg, _jlog, + _xoff, _rdel, _netcdf_tag()) ; + # else + return __netcdf_not_available; + # endif + } + } + catch (...) + { + _errv = __unknown_error ; // can't get here?? + } + + return ( _errv ) ; + } + + + diff --git a/external/jigsaw/src/tripod.hpp b/external/jigsaw/src/tripod.hpp index 8686a83..608bc9a 100644 --- a/external/jigsaw/src/tripod.hpp +++ b/external/jigsaw/src/tripod.hpp @@ -14,9 +14,9 @@ * TRIPOD: a "restricted" delaunay tessellator. -------------------------------------------------------- * - * Last updated: 16 Apr., 2021 + * Last updated: 10 Jun., 2022 * - * Copyright 2013 -- 2021 + * Copyright 2013 -- 2022 * Darren Engwirda * d.engwirda@gmail.com * https://github.com/dengwirda @@ -41,12 +41,16 @@ * how they can obtain it for free, then you are not * required to make any arrangement with me.) * - * Disclaimer: Neither I nor: Columbia University, The - * Massachusetts Institute of Technology, The - * University of Sydney, nor the National Aeronautics - * and Space Administration warrant this code in any - * way whatsoever. This code is provided "as-is" to be - * used at your own risk. + * Disclaimer: Neither I nor THE CONTRIBUTORS warrant + * this code in any way whatsoever. This code is + * provided "as-is" to be used at your own risk. + * + * THE CONTRIBUTORS include: + * (a) The University of Sydney + * (b) The Massachusetts Institute of Technology + * (c) Columbia University + * (d) The National Aeronautics & Space Administration + * (e) Los Alamos National Laboratory * -------------------------------------------------------- */ @@ -296,6 +300,8 @@ mesh_data _mesh ; // TRIA data jcfg_data _jcfg ; // CFG. data + float _xoff[3] = {+0.f} ; // to origin + # ifdef __use_timers typename std ::chrono:: high_resolution_clock::time_point _ttic ; @@ -360,27 +366,34 @@ # endif//__use_timers } - if (_imsh != nullptr ) + if (_gmsh != nullptr ) { - /*--------------------------------- parse *.INIT data */ + /*--------------------------------- parse *.GEOM data */ _jlog.push ( __jloglndv "\n" ) ; _jlog.push ( - " Reading INIT data...\n\n" ) ; + " Reading GEOM data...\n\n" ) ; # ifdef __use_timers _ttic = _time.now(); # endif//__use_timers - if ((_retv = copy_init ( - _jcfg, _jlog, - _mesh,*_imsh)) != __no_error) + if ((_retv = copy_geom ( + _jcfg, _jlog , + _geom,*_gmsh)) != __no_error) { return _retv ; } - if ((_retv = test_init ( + if ((_retv = test_geom ( _jcfg, - _jlog, _mesh)) != __no_error) + _jlog, _geom)) != __no_error) + { + return _retv ; + } + + if ((_retv = separator ( + _jcfg, _jlog , + _geom, _xoff)) != __no_error) { return _retv ; } @@ -391,26 +404,28 @@ # endif//__use_timers } - if (_imsh != nullptr ) + if (_gmsh != nullptr ) { - /*--------------------------------- initialise i.c.'s */ + /*--------------------------------- parse *.GEOM data */ _jlog.push ( __jloglndv "\n" ) ; _jlog.push ( - " Forming INIT data...\n\n" ) ; + " Forming GEOM data...\n\n" ) ; # ifdef __use_timers _ttic = _time.now(); # endif//__use_timers + _geom.init_geom(_jcfg, _xoff) ; + if (_jcfg._verbosity > 0 ) { _jlog.push ( - " INIT data summary...\n\n" ) ; + " GEOM data summary...\n\n" ) ; - if ((_retv = echo_init ( + if ((_retv = echo_geom ( _jcfg, - _jlog, _mesh)) != __no_error) + _jlog, _geom)) != __no_error) { return _retv ; } @@ -423,27 +438,27 @@ # endif//__use_timers } - if (_gmsh != nullptr ) + if (_imsh != nullptr ) { - /*--------------------------------- parse *.GEOM data */ + /*--------------------------------- parse *.INIT data */ _jlog.push ( __jloglndv "\n" ) ; _jlog.push ( - " Reading GEOM data...\n\n" ) ; + " Reading INIT data...\n\n" ) ; # ifdef __use_timers _ttic = _time.now(); # endif//__use_timers - if ((_retv = copy_geom ( - _jcfg, _jlog , - _geom,*_gmsh)) != __no_error) + if ((_retv = copy_init ( + _jcfg, _jlog, + _mesh,*_imsh)) != __no_error) { return _retv ; } - if ((_retv = test_geom ( + if ((_retv = test_init ( _jcfg, - _jlog, _geom)) != __no_error) + _jlog, _mesh)) != __no_error) { return _retv ; } @@ -454,28 +469,29 @@ # endif//__use_timers } - if (_gmsh != nullptr ) + if (_imsh != nullptr ) { - /*--------------------------------- parse *.GEOM data */ + /*--------------------------------- initialise i.c.'s */ _jlog.push ( __jloglndv "\n" ) ; _jlog.push ( - " Forming GEOM data...\n\n" ) ; + " Forming INIT data...\n\n" ) ; # ifdef __use_timers _ttic = _time.now(); # endif//__use_timers - _geom.init_geom(_jcfg) ; + _mesh.init_mesh( + _jcfg, _xoff, false) ; if (_jcfg._verbosity > 0 ) { _jlog.push ( - " GEOM data summary...\n\n" ) ; + " INIT data summary...\n\n" ) ; - if ((_retv = echo_geom ( + if ((_retv = echo_init ( _jcfg, - _jlog, _geom)) != __no_error) + _jlog, _mesh)) != __no_error) { return _retv ; } @@ -530,6 +546,7 @@ if ((_retv = save_rdel ( _jcfg, _jlog , + _xoff, _mesh,*_mmsh)) != __no_error) { return _retv ; @@ -541,6 +558,7 @@ if ((_retv = save_tria ( _jcfg, _jlog , + _xoff, _mesh,*_mmsh)) != __no_error) { return _retv ; @@ -571,6 +589,8 @@ geom_data _geom ; // GEOM data mesh_data _mesh ; // TRIA data + float _xoff[3] = {+0.f} ; // to origin + # ifdef __use_timers typename std ::chrono:: high_resolution_clock::time_point _ttic ; @@ -639,15 +659,10 @@ /*--------------------------------- setup *.JLOG file */ jlog_text _jlog(_jcfg) ; - _jlog.push(TRIPOD:: - asciibanner) ; if(!_jcfg._jcfg_file.empty()) { /*--------------------------------- parse *.JCFG file */ - _jlog.push ( - " Reading CFG. file...\n\n" ) ; - # ifdef __use_timers _ttic = _time.now(); # endif//__use_timers @@ -658,6 +673,11 @@ return _retv ; } + _jlog._verbosity = + _jcfg._verbosity ; + + _jlog.push ( TRIPOD::asciibanner ) ; + if ((_retv = test_jcfg ( _jcfg, _jlog)) != __no_error) { @@ -679,27 +699,34 @@ # endif//__use_timers } - if(!_jcfg._init_file.empty()) + if(!_jcfg._geom_file.empty()) { - /*--------------------------------- parse *.INIT file */ + /*--------------------------------- parse *.GEOM file */ _jlog.push ( __jloglndv "\n" ) ; _jlog.push ( - " Reading INIT file...\n\n" ) ; + " Reading GEOM file...\n\n" ) ; # ifdef __use_timers _ttic = _time.now(); # endif//__use_timers - if ((_retv = read_init ( + if ((_retv = read_geom ( _jcfg, - _jlog, _mesh)) != __no_error) + _jlog, _geom)) != __no_error) { return _retv ; } - if ((_retv = test_init ( + if ((_retv = test_geom ( _jcfg, - _jlog, _mesh)) != __no_error) + _jlog, _geom)) != __no_error) + { + return _retv ; + } + + if ((_retv = separator ( + _jcfg, _jlog , + _geom, _xoff)) != __no_error) { return _retv ; } @@ -710,26 +737,28 @@ # endif//__use_timers } - if(!_jcfg._init_file.empty()) + if(!_jcfg._geom_file.empty()) { - /*--------------------------------- initialise i.c.'s */ + /*--------------------------------- assemble geometry */ _jlog.push ( __jloglndv "\n" ) ; _jlog.push ( - " Forming INIT data...\n\n" ) ; + " Forming GEOM data...\n\n" ) ; # ifdef __use_timers _ttic = _time.now(); # endif//__use_timers + _geom.init_geom(_jcfg, _xoff) ; + if (_jcfg._verbosity > 0 ) { _jlog.push ( - " INIT data summary...\n\n" ) ; + " GEOM data summary...\n\n" ) ; - if ((_retv = echo_init ( + if ((_retv = echo_geom ( _jcfg, - _jlog, _mesh)) != __no_error) + _jlog, _geom)) != __no_error) { return _retv ; } @@ -742,27 +771,27 @@ # endif//__use_timers } - if(!_jcfg._geom_file.empty()) + if(!_jcfg._init_file.empty()) { - /*--------------------------------- parse *.GEOM file */ + /*--------------------------------- parse *.INIT file */ _jlog.push ( __jloglndv "\n" ) ; _jlog.push ( - " Reading GEOM file...\n\n" ) ; + " Reading INIT file...\n\n" ) ; # ifdef __use_timers _ttic = _time.now(); # endif//__use_timers - if ((_retv = read_geom ( + if ((_retv = read_init ( _jcfg, - _jlog, _geom)) != __no_error) + _jlog, _mesh)) != __no_error) { return _retv ; } - if ((_retv = test_geom ( + if ((_retv = test_init ( _jcfg, - _jlog, _geom)) != __no_error) + _jlog, _mesh)) != __no_error) { return _retv ; } @@ -773,28 +802,29 @@ # endif//__use_timers } - if(!_jcfg._geom_file.empty()) + if(!_jcfg._init_file.empty()) { - /*--------------------------------- assemble geometry */ + /*--------------------------------- initialise i.c.'s */ _jlog.push ( __jloglndv "\n" ) ; _jlog.push ( - " Forming GEOM data...\n\n" ) ; + " Forming INIT data...\n\n" ) ; # ifdef __use_timers _ttic = _time.now(); # endif//__use_timers - _geom.init_geom(_jcfg) ; + _mesh.init_mesh( + _jcfg, _xoff, false) ; if (_jcfg._verbosity > 0 ) { _jlog.push ( - " GEOM data summary...\n\n" ) ; + " INIT data summary...\n\n" ) ; - if ((_retv = echo_geom ( + if ((_retv = echo_init ( _jcfg, - _jlog, _geom)) != __no_error) + _jlog, _mesh)) != __no_error) { return _retv ; } @@ -845,8 +875,8 @@ # endif//__use_timers if ((_retv = save_tria ( - _jcfg, - _jlog, _mesh)) != __no_error) + _jcfg, _jlog, + _xoff, _mesh)) != __no_error) { return _retv ; } @@ -873,8 +903,8 @@ { if ((_retv = save_rdel ( - _jcfg, - _jlog, _mesh)) != __no_error) + _jcfg, _jlog, + _xoff, _mesh)) != __no_error) { return _retv ; } @@ -884,8 +914,8 @@ { if ((_retv = save_tria ( - _jcfg, - _jlog, _mesh)) != __no_error) + _jcfg, _jlog, + _xoff, _mesh)) != __no_error) { return _retv ; } diff --git a/external/jigsaw/uni/CMakeLists.txt b/external/jigsaw/uni/CMakeLists.txt index 9007bed..01f2a1b 100644 --- a/external/jigsaw/uni/CMakeLists.txt +++ b/external/jigsaw/uni/CMakeLists.txt @@ -16,47 +16,127 @@ endif () message (">> LIBJIGSAW LOCATION: ${LIBJIGSAW}") -add_executable (test_1 test_1.c) -target_link_libraries (test_1 ${LIBJIGSAW}) -set_target_properties(test_1 PROPERTIES INSTALL_RPATH_USE_LINK_PATH TRUE) -install (TARGETS test_1 DESTINATION "${PROJECT_SOURCE_DIR}") - -add_executable (test_2 test_2.c) -target_link_libraries (test_2 ${LIBJIGSAW}) -set_target_properties(test_2 PROPERTIES INSTALL_RPATH_USE_LINK_PATH TRUE) -install (TARGETS test_2 DESTINATION "${PROJECT_SOURCE_DIR}") - -add_executable (test_3 test_3.c) -target_link_libraries (test_3 ${LIBJIGSAW}) -set_target_properties(test_3 PROPERTIES INSTALL_RPATH_USE_LINK_PATH TRUE) -install (TARGETS test_3 DESTINATION "${PROJECT_SOURCE_DIR}") - -add_executable (test_4 test_4.c) -target_link_libraries (test_4 ${LIBJIGSAW}) -set_target_properties(test_4 PROPERTIES INSTALL_RPATH_USE_LINK_PATH TRUE) -install (TARGETS test_4 DESTINATION "${PROJECT_SOURCE_DIR}") - -add_executable (test_5 test_5.c) -target_link_libraries (test_5 ${LIBJIGSAW}) -set_target_properties(test_5 PROPERTIES INSTALL_RPATH_USE_LINK_PATH TRUE) -install (TARGETS test_5 DESTINATION "${PROJECT_SOURCE_DIR}") - -add_executable (test_6 test_6.c) -target_link_libraries (test_6 ${LIBJIGSAW}) -set_target_properties(test_6 PROPERTIES INSTALL_RPATH_USE_LINK_PATH TRUE) -install (TARGETS test_6 DESTINATION "${PROJECT_SOURCE_DIR}") - -add_executable (test_7 test_7.c) -target_link_libraries (test_7 ${LIBJIGSAW}) -set_target_properties(test_7 PROPERTIES INSTALL_RPATH_USE_LINK_PATH TRUE) -install (TARGETS test_7 DESTINATION "${PROJECT_SOURCE_DIR}") - -add_executable (test_8 test_8.c) -target_link_libraries (test_8 ${LIBJIGSAW}) -set_target_properties(test_8 PROPERTIES INSTALL_RPATH_USE_LINK_PATH TRUE) -install (TARGETS test_8 DESTINATION "${PROJECT_SOURCE_DIR}") - -add_executable (test_9 test_9.c) -target_link_libraries (test_9 ${LIBJIGSAW}) -set_target_properties(test_9 PROPERTIES INSTALL_RPATH_USE_LINK_PATH TRUE) -install (TARGETS test_9 DESTINATION "${PROJECT_SOURCE_DIR}") +add_executable (test_all test_all.c) +target_link_libraries (test_all ${LIBJIGSAW}) +set_target_properties(test_all PROPERTIES INSTALL_RPATH_USE_LINK_PATH TRUE) +install (TARGETS test_all DESTINATION "${PROJECT_SOURCE_DIR}") + +add_executable (test2d_a test2d_a.c) +target_link_libraries (test2d_a ${LIBJIGSAW}) +set_target_properties(test2d_a PROPERTIES INSTALL_RPATH_USE_LINK_PATH TRUE) +install (TARGETS test2d_a DESTINATION "${PROJECT_SOURCE_DIR}") + +add_executable (test3d_a test3d_a.c) +target_link_libraries (test3d_a ${LIBJIGSAW}) +set_target_properties(test3d_a PROPERTIES INSTALL_RPATH_USE_LINK_PATH TRUE) +install (TARGETS test3d_a DESTINATION "${PROJECT_SOURCE_DIR}") + +add_executable (test2s_a test2s_a.c) +target_link_libraries (test2s_a ${LIBJIGSAW}) +set_target_properties(test2s_a PROPERTIES INSTALL_RPATH_USE_LINK_PATH TRUE) +install (TARGETS test2s_a DESTINATION "${PROJECT_SOURCE_DIR}") + +add_executable (test2d_b test2d_b.c) +target_link_libraries (test2d_b ${LIBJIGSAW}) +set_target_properties(test2d_b PROPERTIES INSTALL_RPATH_USE_LINK_PATH TRUE) +install (TARGETS test2d_b DESTINATION "${PROJECT_SOURCE_DIR}") + +add_executable (test3d_b test3d_b.c) +target_link_libraries (test3d_b ${LIBJIGSAW}) +set_target_properties(test3d_b PROPERTIES INSTALL_RPATH_USE_LINK_PATH TRUE) +install (TARGETS test3d_b DESTINATION "${PROJECT_SOURCE_DIR}") + +add_executable (test2s_b test2s_b.c) +target_link_libraries (test2s_b ${LIBJIGSAW}) +set_target_properties(test2s_b PROPERTIES INSTALL_RPATH_USE_LINK_PATH TRUE) +install (TARGETS test2s_b DESTINATION "${PROJECT_SOURCE_DIR}") + +add_executable (test2d_c test2d_c.c) +target_link_libraries (test2d_c ${LIBJIGSAW}) +set_target_properties(test2d_c PROPERTIES INSTALL_RPATH_USE_LINK_PATH TRUE) +install (TARGETS test2d_c DESTINATION "${PROJECT_SOURCE_DIR}") + +add_executable (test3d_c test3d_c.c) +target_link_libraries (test3d_c ${LIBJIGSAW}) +set_target_properties(test3d_c PROPERTIES INSTALL_RPATH_USE_LINK_PATH TRUE) +install (TARGETS test3d_c DESTINATION "${PROJECT_SOURCE_DIR}") + +add_executable (test2s_c test2s_c.c) +target_link_libraries (test2s_c ${LIBJIGSAW}) +set_target_properties(test2s_c PROPERTIES INSTALL_RPATH_USE_LINK_PATH TRUE) +install (TARGETS test2s_c DESTINATION "${PROJECT_SOURCE_DIR}") + +add_executable (test2d_d test2d_d.c) +target_link_libraries (test2d_d ${LIBJIGSAW}) +set_target_properties(test2d_d PROPERTIES INSTALL_RPATH_USE_LINK_PATH TRUE) +install (TARGETS test2d_d DESTINATION "${PROJECT_SOURCE_DIR}") + +add_executable (test3d_d test3d_d.c) +target_link_libraries (test3d_d ${LIBJIGSAW}) +set_target_properties(test3d_d PROPERTIES INSTALL_RPATH_USE_LINK_PATH TRUE) +install (TARGETS test3d_d DESTINATION "${PROJECT_SOURCE_DIR}") + +add_executable (test2d_e test2d_e.c) +target_link_libraries (test2d_e ${LIBJIGSAW}) +set_target_properties(test2d_e PROPERTIES INSTALL_RPATH_USE_LINK_PATH TRUE) +install (TARGETS test2d_e DESTINATION "${PROJECT_SOURCE_DIR}") + +add_executable (test3d_e test3d_e.c) +target_link_libraries (test3d_e ${LIBJIGSAW}) +set_target_properties(test3d_e PROPERTIES INSTALL_RPATH_USE_LINK_PATH TRUE) +install (TARGETS test3d_e DESTINATION "${PROJECT_SOURCE_DIR}") + +add_executable (test2s_e test2s_e.c) +target_link_libraries (test2s_e ${LIBJIGSAW}) +set_target_properties(test2s_e PROPERTIES INSTALL_RPATH_USE_LINK_PATH TRUE) +install (TARGETS test2s_e DESTINATION "${PROJECT_SOURCE_DIR}") + +add_executable (test2d_f test2d_f.c) +target_link_libraries (test2d_f ${LIBJIGSAW}) +set_target_properties(test2d_f PROPERTIES INSTALL_RPATH_USE_LINK_PATH TRUE) +install (TARGETS test2d_f DESTINATION "${PROJECT_SOURCE_DIR}") + +add_executable (test3d_f test3d_f.c) +target_link_libraries (test3d_f ${LIBJIGSAW}) +set_target_properties(test3d_f PROPERTIES INSTALL_RPATH_USE_LINK_PATH TRUE) +install (TARGETS test3d_f DESTINATION "${PROJECT_SOURCE_DIR}") + +add_executable (test2s_f test2s_f.c) +target_link_libraries (test2s_f ${LIBJIGSAW}) +set_target_properties(test2s_f PROPERTIES INSTALL_RPATH_USE_LINK_PATH TRUE) +install (TARGETS test2s_f DESTINATION "${PROJECT_SOURCE_DIR}") + +add_executable (test2d_g test2d_g.c) +target_link_libraries (test2d_g ${LIBJIGSAW}) +set_target_properties(test2d_g PROPERTIES INSTALL_RPATH_USE_LINK_PATH TRUE) +install (TARGETS test2d_g DESTINATION "${PROJECT_SOURCE_DIR}") + +add_executable (test3d_g test3d_g.c) +target_link_libraries (test3d_g ${LIBJIGSAW}) +set_target_properties(test3d_g PROPERTIES INSTALL_RPATH_USE_LINK_PATH TRUE) +install (TARGETS test3d_g DESTINATION "${PROJECT_SOURCE_DIR}") + +add_executable (test2s_g test2s_g.c) +target_link_libraries (test2s_g ${LIBJIGSAW}) +set_target_properties(test2s_g PROPERTIES INSTALL_RPATH_USE_LINK_PATH TRUE) +install (TARGETS test2s_g DESTINATION "${PROJECT_SOURCE_DIR}") + +add_executable (test2d_h test2d_h.c) +target_link_libraries (test2d_h ${LIBJIGSAW}) +set_target_properties(test2d_h PROPERTIES INSTALL_RPATH_USE_LINK_PATH TRUE) +install (TARGETS test2d_h DESTINATION "${PROJECT_SOURCE_DIR}") + +add_executable (test2s_h test2s_h.c) +target_link_libraries (test2s_h ${LIBJIGSAW}) +set_target_properties(test2s_h PROPERTIES INSTALL_RPATH_USE_LINK_PATH TRUE) +install (TARGETS test2s_h DESTINATION "${PROJECT_SOURCE_DIR}") + +add_executable (test2d_i test2d_i.c) +target_link_libraries (test2d_i ${LIBJIGSAW}) +set_target_properties(test2d_i PROPERTIES INSTALL_RPATH_USE_LINK_PATH TRUE) +install (TARGETS test2d_i DESTINATION "${PROJECT_SOURCE_DIR}") + +add_executable (test2s_i test2s_i.c) +target_link_libraries (test2s_i ${LIBJIGSAW}) +set_target_properties(test2s_i PROPERTIES INSTALL_RPATH_USE_LINK_PATH TRUE) +install (TARGETS test2s_i DESTINATION "${PROJECT_SOURCE_DIR}") diff --git a/external/jigsaw/uni/README.md b/external/jigsaw/uni/README.md new file mode 100644 index 0000000..2024f98 --- /dev/null +++ b/external/jigsaw/uni/README.md @@ -0,0 +1,21 @@ +## `UNIT-TESTS: various benchmarks for JIGSAW` + +A set of unit tests designed to exercise various `JIGSAW`, `TRIPOD` and `MARCHE` functionality: + + * TEST2D_X.c: 2D Cartesian test cases, with X = {A, B, ..., etc}. + * TEST3D_X.c: 3D Cartesian test cases, with X = {A, B, ..., etc}. + * TEST2S_X.c: 2D Spherical test cases, with X = {A, B, ..., etc}. + + * TESTKZ_A.c: Mesh a simple domain. + * TESTKZ_B.c: Mesh with user-defined h(x) input (a structured 'grid'). + * TESTKZ_C.c: Mesh with user-defined h(x) input (unstructured 'mesh'). + * TESTKZ_D.c: Mesh 'multi-part' geometry with tags. + * TESTKZ_E.c: Mesh with imposed initial conditions. + * TESTKZ_F.c: Build 'restricted' DTs, using TRIPOD. + * TESTKZ_G.c: Build conventional DTs, using TRIPOD. + * TESTKZ_H.c: Solve: |dh/dx| <= G, using MARCHE (a structured 'grid'). + * TESTKZ_I.c: Solve: |dh/dx| <= G, using MARCHE (unstructured 'mesh'). + +See `JIGSAW`'s base `README` for build information via `cmake`. + + diff --git a/external/jigsaw/uni/print.h b/external/jigsaw/uni/print.h new file mode 100644 index 0000000..b144901 --- /dev/null +++ b/external/jigsaw/uni/print.h @@ -0,0 +1,149 @@ + +# pragma once + +# ifndef __JIGSAW_PRINT__ +# define __JIGSAW_PRINT__ + +# include "stdio.h" + + void output_msh_data_2 ( + jigsaw_msh_t *_mesh + ) + { + /*-------------------------------- helper: print msh. */ + if (_mesh->_vert2._size > 0) + printf("\n VERT2: \n\n") ; + + for (size_t _ipos = +0; + _ipos != _mesh->_vert2._size ; + ++_ipos ) + { + printf("%1.4f, %1.4f\n" , + _mesh->_vert2. + _data[_ipos]._ppos[0], + _mesh->_vert2. + _data[_ipos]._ppos[1] + ) ; + } + + if (_mesh->_edge2._size > 0) + printf("\n EDGE2: \n\n") ; + + for (size_t _ipos = +0; + _ipos != _mesh->_edge2._size ; + ++_ipos ) + { + printf("%d, %d, %d\n", + _mesh->_edge2. + _data[_ipos]._node[0], + _mesh->_edge2. + _data[_ipos]._node[1], + _mesh->_edge2. + _data[_ipos]._itag + ) ; + } + + if (_mesh->_tria3._size > 0) + printf("\n TRIA3: \n\n") ; + + for (size_t _ipos = +0; + _ipos != _mesh->_tria3._size ; + ++_ipos ) + { + printf("%d, %d, %d, %d\n", + _mesh->_tria3. + _data[_ipos]._node[0], + _mesh->_tria3. + _data[_ipos]._node[1], + _mesh->_tria3. + _data[_ipos]._node[2], + _mesh->_tria3. + _data[_ipos]._itag + ) ; + } + } + + void output_msh_data_3 ( + jigsaw_msh_t *_mesh + ) + { + /*-------------------------------- helper: print msh. */ + if (_mesh->_vert3._size > 0) + printf("\n VERT3: \n\n") ; + + for (size_t _ipos = +0; + _ipos != _mesh->_vert3._size ; + ++_ipos ) + { + printf("%1.4f, %1.4f, %1.4f\n" , + _mesh->_vert3. + _data[_ipos]._ppos[0], + _mesh->_vert3. + _data[_ipos]._ppos[1], + _mesh->_vert3. + _data[_ipos]._ppos[2] + ) ; + } + + if (_mesh->_edge2._size > 0) + printf("\n EDGE2: \n\n") ; + + for (size_t _ipos = +0; + _ipos != _mesh->_edge2._size ; + ++_ipos ) + { + printf("%d, %d, %d\n", + _mesh->_edge2. + _data[_ipos]._node[0], + _mesh->_edge2. + _data[_ipos]._node[1], + _mesh->_edge2. + _data[_ipos]._itag + ) ; + } + + if (_mesh->_tria3._size > 0) + printf("\n TRIA3: \n\n") ; + + for (size_t _ipos = +0; + _ipos != _mesh->_tria3._size ; + ++_ipos ) + { + printf("%d, %d, %d, %d\n", + _mesh->_tria3. + _data[_ipos]._node[0], + _mesh->_tria3. + _data[_ipos]._node[1], + _mesh->_tria3. + _data[_ipos]._node[2], + _mesh->_tria3. + _data[_ipos]._itag + ) ; + } + + if (_mesh->_tria4._size > 0) + printf("\n TRIA4: \n\n") ; + + for (size_t _ipos = +0; + _ipos != _mesh->_tria4._size ; + ++_ipos ) + { + printf("%d, %d, %d, %d, %d \n" , + _mesh->_tria4. + _data[_ipos]._node[0], + _mesh->_tria4. + _data[_ipos]._node[1], + _mesh->_tria4. + _data[_ipos]._node[2], + _mesh->_tria4. + _data[_ipos]._node[3], + _mesh->_tria4. + _data[_ipos]._itag + ) ; + } + } + +# endif //__JIGSAW_PRINT__ + + + diff --git a/external/jigsaw/uni/test_1.c b/external/jigsaw/uni/test2d_a.c similarity index 61% rename from external/jigsaw/uni/test_1.c rename to external/jigsaw/uni/test2d_a.c index f2b047b..4ab02c4 100644 --- a/external/jigsaw/uni/test_1.c +++ b/external/jigsaw/uni/test2d_a.c @@ -1,15 +1,16 @@ -// gcc -Wall -Wextra test_1.c -Xlinker -rpath=../lib -// -L ../lib -ljigsaw -o test_1 +// gcc -Wall -Wextra test2d_a.c -Xlinker -rpath=../lib +// -L ../lib -ljigsaw -o test2d_a -// A simple example to start: use JIGSAW to mesh a square -// domain. +// A simple example to start: use JIGSAW to mesh a plain +// domain in E^2. # include "../inc/lib_jigsaw.h" +# include "print.h" # include "stdio.h" - int main () + int test2d_a (int _verb) { int _retv = 0; @@ -68,7 +69,7 @@ /*-------------------------------- build JIGSAW tria. */ - _jjig._verbosity = +1 ; + _jjig._verbosity = _verb; _jjig._hfun_hmax = 0.25 ; _jjig._hfun_scal = @@ -77,52 +78,29 @@ _jjig._mesh_dims = +2 ; _retv = jigsaw ( - &_jjig , // the config. opts - &_geom , // geom. data - NULL , // empty init. data - NULL , // empty hfun. data - &_mesh ) ; + & _jjig , // the config. opt. + & _geom , // geom. data + NULL , // empty init. obj. + NULL , // empty hfun. obj. + & _mesh ) ; /*-------------------------------- print JIGSAW tria. */ - printf("\n VERT2: \n\n") ; - - for (size_t _ipos = +0; - _ipos != _mesh._vert2._size ; - ++_ipos ) - { - printf("%1.4f, %1.4f\n", - _mesh._vert2. - _data[_ipos]._ppos[0], - _mesh._vert2. - _data[_ipos]._ppos[1] - ) ; - } - - printf("\n TRIA3: \n\n") ; - - for (size_t _ipos = +0; - _ipos != _mesh._tria3._size ; - ++_ipos ) - { - printf("%d, %d, %d\n", - _mesh._tria3. - _data[_ipos]._node[0], - _mesh._tria3. - _data[_ipos]._node[1], - _mesh._tria3. - _data[_ipos]._node[2] - ) ; - } + if (_verb > 0 ) + output_msh_data_2(&_mesh); jigsaw_free_msh_t(&_mesh); printf ( - "JIGSAW returned code : %d \n",_retv); + "[2d_a] JIGSAW returned code : %d \n", _retv) ; return _retv ; } +# ifndef __SKIP_MAIN__ + int main () { return test2d_a(1) ; } +# endif//__SKIP_MAIN__ + diff --git a/external/jigsaw/uni/test_3.c b/external/jigsaw/uni/test2d_b.c similarity index 70% rename from external/jigsaw/uni/test_3.c rename to external/jigsaw/uni/test2d_b.c index 5530023..4bb2860 100644 --- a/external/jigsaw/uni/test_3.c +++ b/external/jigsaw/uni/test2d_b.c @@ -1,15 +1,16 @@ -// gcc -Wall -Wextra test_3.c -Xlinker -rpath=../lib -// -L ../lib -ljigsaw -o test_3 +// gcc -Wall -Wextra test2d_b.c -Xlinker -rpath=../lib +// -L ../lib -ljigsaw -o test2d_b // Use JIGSAW to mesh a simple geometry with user-defined -// mesh-spacing data defined on a "grid". +// mesh-spacing data defined on a "grid" in E^2. # include "../inc/lib_jigsaw.h" +# include "print.h" # include "stdio.h" - int main () + int test2d_b (int _verb) { int _retv = 0; @@ -89,7 +90,7 @@ -------------------------------------------------------- */ - real_t _hfun_xgrid[3] = { // setup hfun. + real_t _hfun_xgrid[3] = { // setup hfun. 0., .5, 1. } ; @@ -98,8 +99,8 @@ } ; fp32_t _hfun_value[9] = { - .3, .2, .3, .2, .1, .2, .3, - .2, .3 + .3f, .2f, .3f, .2f, .1f, .2f, .3f, + .2f, .3f } ; _hfun._flags @@ -116,63 +117,43 @@ /*-------------------------------- build JIGSAW tria. */ - _jjig._verbosity = +1 ; + _jjig._verbosity = _verb; _jjig._hfun_scal = - JIGSAW_HFUN_ABSOLUTE ; + JIGSAW_HFUN_ABSOLUTE; _jjig._hfun_hmax = 1. ; _jjig._hfun_hmin = 0. ; - _jjig._mesh_dims = +2 ; + _jjig._geom_feat = +1 ; // do "sharp" geom. + _jjig._mesh_top1 = +1 ; + + _jjig._mesh_dims = +2 ; _retv = jigsaw ( - &_jjig , // the config. opts - &_geom , // geom. data - NULL , // empty init. data - &_hfun , // hfun. data - &_mesh ) ; + & _jjig , // the config. opt. + & _geom , // geom. data + NULL , // empty init. obj. + & _hfun , // hfun. data + & _mesh ) ; /*-------------------------------- print JIGSAW tria. */ - printf("\n VERT2: \n\n") ; - - for (size_t _ipos = +0; - _ipos != _mesh._vert2._size ; - ++_ipos ) - { - printf("%1.4f, %1.4f\n", - _mesh._vert2. - _data[_ipos]._ppos[0], - _mesh._vert2. - _data[_ipos]._ppos[1] - ) ; - } - - printf("\n TRIA3: \n\n") ; - - for (size_t _ipos = +0; - _ipos != _mesh._tria3._size ; - ++_ipos ) - { - printf("%i, %i, %i\n", - _mesh._tria3. - _data[_ipos]._node[0], - _mesh._tria3. - _data[_ipos]._node[1], - _mesh._tria3. - _data[_ipos]._node[2] - ) ; - } + if (_verb > 0 ) + output_msh_data_2(&_mesh); jigsaw_free_msh_t(&_mesh); printf ( - "JIGSAW returned code : %d \n",_retv); + "[2d_b] JIGSAW returned code : %d \n", _retv) ; return _retv ; } +# ifndef __SKIP_MAIN__ + int main () { return test2d_b(1) ; } +# endif//__SKIP_MAIN__ + diff --git a/external/jigsaw/uni/test_2.c b/external/jigsaw/uni/test2d_c.c similarity index 69% rename from external/jigsaw/uni/test_2.c rename to external/jigsaw/uni/test2d_c.c index dd2189c..d825b8e 100644 --- a/external/jigsaw/uni/test_2.c +++ b/external/jigsaw/uni/test2d_c.c @@ -1,15 +1,16 @@ -// gcc -Wall -Wextra test_2.c -Xlinker -rpath=../lib -// -L ../lib -ljigsaw -o test_2 +// gcc -Wall -Wextra test2d_c.c -Xlinker -rpath=../lib +// -L ../lib -ljigsaw -o test2d_c // Use JIGSAW to mesh a simple geometry with user-defined -// mesh-spacing data defined on a "mesh". +// mesh-spacing data defined on a "mesh" in E^2. # include "../inc/lib_jigsaw.h" +# include "print.h" # include "stdio.h" - int main () + int test2d_c (int _verb) { int _retv = 0; @@ -46,7 +47,7 @@ -------------------------------------------------------- */ - jigsaw_VERT2_t _geom_vert2[4] = { // setup geom. + jigsaw_VERT2_t _geom_vert2[4] = { // setup geom. { {0., 0.}, +0 } , { {1., 0.}, +0 } , { {1., 1.}, +0 } , @@ -87,7 +88,7 @@ -------------------------------------------------------- */ - jigsaw_VERT2_t _hfun_vert2[5] = { // setup hfun. + jigsaw_VERT2_t _hfun_vert2[5] = { // setup hfun. { {0., 0.}, +0 } , { {1., 0.}, +0 } , { {1., 1.}, +0 } , @@ -98,12 +99,12 @@ jigsaw_TRIA3_t _hfun_tria3[4] = { { {+0, +1, +4}, +0 } , { {+1, +2, +4}, +0 } , - { {+2, +3, +4}, +4 } , + { {+2, +3, +4}, +0 } , { {+3, +0, +4}, +0 } } ; fp32_t _hfun_value[5] = { - .2, .2, .2, .2, .5 + .2f, .2f, .2f, .2f, .5f } ; _hfun._flags @@ -120,63 +121,50 @@ /*-------------------------------- build JIGSAW tria. */ - _jjig._verbosity = +1 ; + _jjig._verbosity = _verb; _jjig._hfun_scal = - JIGSAW_HFUN_ABSOLUTE ; + JIGSAW_HFUN_ABSOLUTE; _jjig._hfun_hmax = 1. ; _jjig._hfun_hmin = 0. ; - _jjig._mesh_dims = +2 ; + _jjig._geom_feat = +1 ; // do "sharp" geom. + _jjig._mesh_top1 = +1 ; + + _jjig._mesh_dims = +2 ; + + _jjig._mesh_kern = // non-default opts + JIGSAW_KERN_DELAUNAY; + _jjig._optm_kern = + JIGSAW_KERN_CVT_DQDX; + _jjig._optm_cost = + JIGSAW_KERN_SKEW_COS; _retv = jigsaw ( - &_jjig , // the config. opts - &_geom , // geom. data - NULL , // empty init. data - &_hfun , // hfun. data - &_mesh ) ; + & _jjig , // the config. opts + & _geom , // geom. data + NULL , // empty init. data + & _hfun , // hfun. data + & _mesh ) ; /*-------------------------------- print JIGSAW tria. */ - printf("\n VERT2: \n\n") ; - - for (size_t _ipos = +0; - _ipos != _mesh._vert2._size ; - ++_ipos ) - { - printf("%1.4f, %1.4f\n", - _mesh._vert2. - _data[_ipos]._ppos[0], - _mesh._vert2. - _data[_ipos]._ppos[1] - ) ; - } - - printf("\n TRIA3: \n\n") ; - - for (size_t _ipos = +0; - _ipos != _mesh._tria3._size ; - ++_ipos ) - { - printf("%i, %i, %i\n", - _mesh._tria3. - _data[_ipos]._node[0], - _mesh._tria3. - _data[_ipos]._node[1], - _mesh._tria3. - _data[_ipos]._node[2] - ) ; - } + if (_verb > 0 ) + output_msh_data_2(&_mesh); jigsaw_free_msh_t(&_mesh); printf ( - "JIGSAW returned code : %d \n",_retv); + "[2d_c] JIGSAW returned code : %d \n", _retv) ; return _retv ; } +# ifndef __SKIP_MAIN__ + int main () { return test2d_c(1) ; } +# endif//__SKIP_MAIN__ + diff --git a/external/jigsaw/uni/test_4.c b/external/jigsaw/uni/test2d_d.c similarity index 60% rename from external/jigsaw/uni/test_4.c rename to external/jigsaw/uni/test2d_d.c index f0ea3ae..fb8872a 100644 --- a/external/jigsaw/uni/test_4.c +++ b/external/jigsaw/uni/test2d_d.c @@ -1,15 +1,16 @@ -// gcc -Wall -Wextra test_4.c -Xlinker -rpath=../lib -// -L ../lib -ljigsaw -o test_4 +// gcc -Wall -Wextra test2d_d.c -Xlinker -rpath=../lib +// -L ../lib -ljigsaw -o test2d_d -// An example that uses JIGSAW to mesh "multiply-connected" -// geometry. +// Use JIGSAW to mesh "multi-part" geometry defined in +// E^2. Cells inherit part information via ID-tags. # include "../inc/lib_jigsaw.h" +# include "print.h" # include "stdio.h" - int main () + int test2d_d (int _verb) { int _retv = 0; @@ -43,8 +44,8 @@ -------------------------------------------------------- */ - indx_t _ITAG = - JIGSAW_EDGE2_TAG ; + indx_t _ITAG + = JIGSAW_EDGE2_TAG ; jigsaw_VERT2_t _vert2[8] = { // setup geom. { {0., 0.}, +0 } , @@ -68,11 +69,19 @@ { {+7, +4}, +0 } } ; - jigsaw_BOUND_t _bound[4] = { - { +0, +0, _ITAG}, - { +0, +1, _ITAG}, - { +0, +2, _ITAG}, - { +0, +3, _ITAG}, + jigsaw_BOUND_t _bound[12]= { + { +1, +0, _ITAG}, + { +1, +1, _ITAG}, + { +1, +2, _ITAG}, + { +1, +3, _ITAG}, + { +1, +4, _ITAG}, + { +1, +5, _ITAG}, + { +1, +6, _ITAG}, + { +1, +7, _ITAG}, + { +2, +4, _ITAG}, // inner geom. + { +2, +5, _ITAG}, + { +2, +6, _ITAG}, + { +2, +7, _ITAG}, } ; _geom._flags @@ -85,65 +94,42 @@ _geom._edge2._size = +8 ; _geom._bound._data = &_bound[0] ; - _geom._bound._size = +4 ; + _geom._bound._size = +12; /*-------------------------------- build JIGSAW tria. */ - _jjig._verbosity = +1 ; + _jjig._verbosity = _verb; - _jjig._hfun_hmax = 0.20 ; + _jjig._hfun_hmax = 0.25 ; _jjig._hfun_scal = JIGSAW_HFUN_RELATIVE; _jjig._mesh_dims = +2 ; _retv = jigsaw ( - &_jjig , // the config. opts - &_geom , // geom. data - NULL , // empty init. data - NULL , // empty hfun. data - &_mesh ) ; + & _jjig , // the config. opts + & _geom , // geom. data + NULL , // empty init. data + NULL , // empty hfun. data + & _mesh ) ; /*-------------------------------- print JIGSAW tria. */ - printf("\n VERT2: \n\n") ; - - for (size_t _ipos = +0; - _ipos != _mesh._vert2._size ; - ++_ipos ) - { - printf("%1.4f, %1.4f\n", - _mesh._vert2. - _data[_ipos]._ppos[0], - _mesh._vert2. - _data[_ipos]._ppos[1] - ) ; - } - - printf("\n TRIA3: \n\n") ; - - for (size_t _ipos = +0; - _ipos != _mesh._tria3._size ; - ++_ipos ) - { - printf("%d, %d, %d\n", - _mesh._tria3. - _data[_ipos]._node[0], - _mesh._tria3. - _data[_ipos]._node[1], - _mesh._tria3. - _data[_ipos]._node[2] - ) ; - } + if (_verb > 0 ) + output_msh_data_2(&_mesh); jigsaw_free_msh_t(&_mesh); printf ( - "JIGSAW returned code : %d \n",_retv); + "[2d_d] JIGSAW returned code : %d \n", _retv) ; return _retv ; } +# ifndef __SKIP_MAIN__ + int main () { return test2d_d(1) ; } +# endif//__SKIP_MAIN__ + diff --git a/external/jigsaw/uni/test_6.c b/external/jigsaw/uni/test2d_e.c similarity index 58% rename from external/jigsaw/uni/test_6.c rename to external/jigsaw/uni/test2d_e.c index dbae51d..5055250 100644 --- a/external/jigsaw/uni/test_6.c +++ b/external/jigsaw/uni/test2d_e.c @@ -1,15 +1,16 @@ -// gcc -Wall -Wextra test_6.c -Xlinker -rpath=../lib -// -L ../lib -ljigsaw -o test_6 +// gcc -Wall -Wextra test2d_e.c -Xlinker -rpath=../lib +// -L ../lib -ljigsaw -o test2d_e -// Use JIGSAW to mesh a simple domain, but starting from -// user-defined initial-conditions. +// Use JIGSAW to mesh a simple domain in E^2, starting +// from user-defined initial-conditions. # include "../inc/lib_jigsaw.h" +# include "print.h" # include "stdio.h" - int main () + int test2d_e (int _verb) { int _retv = 0; @@ -46,14 +47,14 @@ -------------------------------------------------------- */ - jigsaw_VERT2_t _vert2[4] = { // setup geom. + jigsaw_VERT2_t _geom_vert2[4] = { // setup geom. { {0., 0.}, +0 } , { {1., 0.}, +0 } , { {1., 1.}, +0 } , { {0., 1.}, +0 } } ; - jigsaw_EDGE2_t _edge2[4] = { + jigsaw_EDGE2_t _geom_edge2[4] = { { {+0, +1}, +0 } , { {+1, +2}, +0 } , { {+2, +3}, +0 } , @@ -63,22 +64,22 @@ _geom._flags = JIGSAW_EUCLIDEAN_MESH; - _geom._vert2._data = &_vert2[0] ; + _geom._vert2._data = &_geom_vert2[0] ; _geom._vert2._size = +4 ; - _geom._edge2._data = &_edge2[0] ; + _geom._edge2._data = &_geom_edge2[0] ; _geom._edge2._size = +4 ; /*-------------------------------- form init. config. */ - jigsaw_VERT2_t _point[4] = { + jigsaw_VERT2_t _init_vert2[4] = { { {0., 0.}, +0 } , { {0., .5}, +0 } , { {0., 1.}, +0 } , { {.5, .5}, +0 } } ; - jigsaw_EDGE2_t _edges[2] = { + jigsaw_EDGE2_t _init_edge2[2] = { { {+0, +1}, -1 } , // -1 => "un-refinable" { {+1, +2}, -1 } } ; @@ -86,17 +87,17 @@ _init._flags = JIGSAW_EUCLIDEAN_MESH; - _init._vert2._data = &_point[0] ; + _init._vert2._data = &_init_vert2[0] ; _init._vert2._size = +4 ; - _init._edge2._data = &_edges[0] ; + _init._edge2._data = &_init_edge2[0] ; _init._edge2._size = +2 ; /*-------------------------------- build JIGSAW tria. */ - _jjig._verbosity = +1 ; + _jjig._verbosity = _verb; - _jjig._hfun_hmax = 0.33 ; + _jjig._hfun_hmax = 1./3.; _jjig._hfun_scal = JIGSAW_HFUN_RELATIVE; @@ -104,55 +105,30 @@ _jjig._geom_feat = +1 ; _jjig._mesh_top1 = +1 ; - //_jjig._optm_iter = +0 ; - _retv = jigsaw ( - &_jjig , // the config. opts - &_geom , // geom. data - &_init , // init. data - NULL , // empty hfun. data - &_mesh ) ; + & _jjig , // the config. opts + & _geom , // geom. data + & _init , // init. data + NULL , // empty hfun. data + & _mesh ) ; /*-------------------------------- print JIGSAW tria. */ - printf("\n VERT2: \n\n") ; - - for (size_t _ipos = +0; - _ipos != _mesh._vert2._size ; - ++_ipos ) - { - printf("%1.4f, %1.4f\n", - _mesh._vert2. - _data[_ipos]._ppos[0], - _mesh._vert2. - _data[_ipos]._ppos[1] - ) ; - } - - printf("\n TRIA3: \n\n") ; - - for (size_t _ipos = +0; - _ipos != _mesh._tria3._size ; - ++_ipos ) - { - printf("%d, %d, %d\n", - _mesh._tria3. - _data[_ipos]._node[0], - _mesh._tria3. - _data[_ipos]._node[1], - _mesh._tria3. - _data[_ipos]._node[2] - ) ; - } + if (_verb > 0 ) + output_msh_data_2(&_mesh); jigsaw_free_msh_t(&_mesh); printf ( - "JIGSAW returned code : %d \n",_retv); + "[2d_e] JIGSAW returned code : %d \n", _retv) ; return _retv ; } +# ifndef __SKIP_MAIN__ + int main () { return test2d_e(1) ; } +# endif//__SKIP_MAIN__ + diff --git a/external/jigsaw/uni/test_5.c b/external/jigsaw/uni/test2d_f.c similarity index 57% rename from external/jigsaw/uni/test_5.c rename to external/jigsaw/uni/test2d_f.c index ad8ef72..7c4d8f7 100644 --- a/external/jigsaw/uni/test_5.c +++ b/external/jigsaw/uni/test2d_f.c @@ -1,14 +1,19 @@ -// gcc -Wall -Wextra test_5.c -Xlinker -rpath=../lib -// -L ../lib -ljigsaw -o test_5 +// gcc -Wall -Wextra test2d_f.c -Xlinker -rpath=../lib +// -L ../lib -ljigsaw -o test2d_f -// An example that uses TRIPOD to build a "restricted" DT. +// Uses TRIPOD to build a "restricted" DT, given a set +// points and a geometry in E^2. Compared to JIGSAW, +// TRIPOD computes a "restricted" triangulation (given +// a set of points a priori), rather than generating a +// mesh dynamically. # include "../inc/lib_jigsaw.h" +# include "print.h" # include "stdio.h" - int main () + int test2d_f (int _verb) { int _retv = 0; @@ -45,32 +50,32 @@ -------------------------------------------------------- */ - jigsaw_VERT2_t _vert2[4] = { // setup geom. + jigsaw_VERT2_t _geom_vert2[4] = { // setup geom. { {0., 0.}, +0 } , { {1., 0.}, +0 } , { {1., 1.}, +0 } , { {0., 1.}, +0 } } ; - jigsaw_EDGE2_t _edge2[4] = { - { {+0, +1}, +0 } , - { {+1, +2}, +0 } , - { {+2, +3}, +0 } , - { {+3, +0}, +0 } + jigsaw_EDGE2_t _geom_edge2[4] = { + { {+0, +1}, +1 } , + { {+1, +2}, +2 } , + { {+2, +3}, +3 } , + { {+3, +0}, +4 } } ; _geom._flags = JIGSAW_EUCLIDEAN_MESH; - _geom._vert2._data = &_vert2[0] ; + _geom._vert2._data = &_geom_vert2[0] ; _geom._vert2._size = +4 ; - _geom._edge2._data = &_edge2[0] ; + _geom._edge2._data = &_geom_edge2[0] ; _geom._edge2._size = +4 ; /*-------------------------------- pts to triangulate */ - jigsaw_VERT2_t _point[9] = { + jigsaw_VERT2_t _init_vert2[9] = { { {0., 0.}, +0 } , { {1., 0.}, +0 } , { {1., 1.}, +0 } , @@ -85,61 +90,38 @@ _init._flags = JIGSAW_EUCLIDEAN_MESH; - _init._vert2._data = &_point[0] ; + _init._vert2._data = &_init_vert2[0] ; _init._vert2._size = +9 ; /*-------------------------------- build TRIPOD r-DT. */ - _jjig._verbosity = +1 ; + _jjig._verbosity = _verb; _jjig._mesh_dims = +2 ; _retv = tripod ( - &_jjig , // the config. opts - &_init , // init. data - &_geom , // geom. data - &_tria ) ; + & _jjig , // the config. opts + & _init , // init. data + & _geom , // geom. data + & _tria ) ; /*-------------------------------- print TRIPOD r-DT. */ - printf("\n VERT2: \n\n") ; - - for (size_t _ipos = +0; - _ipos != _tria._vert2._size ; - ++_ipos ) - { - printf("%1.4f, %1.4f\n", - _tria._vert2. - _data[_ipos]._ppos[0], - _tria._vert2. - _data[_ipos]._ppos[1] - ) ; - } - - printf("\n TRIA3: \n\n") ; - - for (size_t _ipos = +0; - _ipos != _tria._tria3._size ; - ++_ipos ) - { - printf("%d, %d, %d\n", - _tria._tria3. - _data[_ipos]._node[0], - _tria._tria3. - _data[_ipos]._node[1], - _tria._tria3. - _data[_ipos]._node[2] - ) ; - } + if (_verb > 0 ) + output_msh_data_2(&_tria); jigsaw_free_msh_t(&_tria); printf ( - "TRIPOD returned code : %d \n",_retv); + "[2d_f] TRIPOD returned code : %d \n", _retv) ; return _retv ; } +# ifndef __SKIP_MAIN__ + int main () { return test2d_f(1) ; } +# endif//__SKIP_MAIN__ + diff --git a/external/jigsaw/uni/test2d_g.c b/external/jigsaw/uni/test2d_g.c new file mode 100644 index 0000000..b4634b0 --- /dev/null +++ b/external/jigsaw/uni/test2d_g.c @@ -0,0 +1,79 @@ + +// gcc -Wall -Wextra test2d_g.c -Xlinker -rpath=../lib +// -L ../lib -ljigsaw -o test2d_g + +// Uses TRIPOD to build an (unconstrained) DT in E^2, +// comparable to more conventional Delaunay tessellation +// approaches. + +# include "../inc/lib_jigsaw.h" + +# include "print.h" +# include "stdio.h" + + int test2d_g (int _verb) + { + int _retv = 0; + + /*-------------------------------- setup JIGSAW types */ + jigsaw_jig_t _jjig ; + jigsaw_init_jig_t(&_jjig) ; + + jigsaw_msh_t _init ; + jigsaw_init_msh_t(&_init) ; + + jigsaw_msh_t _tria ; + jigsaw_init_msh_t(&_tria) ; + + /*-------------------------------- pts to triangulate */ + + jigsaw_VERT2_t _init_vert2[9] = { + { {0., 0.}, +0 } , + { {2., 0.}, +0 } , + { {1., 2.}, +0 } , + { {0., 1.}, +0 } , + { {.5, .0}, +0 } , + { {1., .7}, +0 } , + { {.6, 1.}, +0 } , + { {.0, .4}, +0 } , + { {.3, .3}, +0 } + } ; + + _init._flags + = JIGSAW_EUCLIDEAN_MESH; + + _init._vert2._data = &_init_vert2[0] ; + _init._vert2._size = +9 ; + + /*-------------------------------- build TRIPOD r-DT. */ + + _jjig._verbosity = _verb; + + _jjig._mesh_dims = +2 ; + + _retv = tripod ( + & _jjig , // the config. opts + & _init , // init. data + NULL , // empty geom. data + & _tria ) ; + + /*-------------------------------- print TRIPOD r-DT. */ + + if (_verb > 0 ) + output_msh_data_2(&_tria); + + jigsaw_free_msh_t(&_tria); + + printf ( + "[2d_g] TRIPOD returned code : %d \n", _retv) ; + + + return _retv ; + } + +# ifndef __SKIP_MAIN__ + int main () { return test2d_g(1) ; } +# endif//__SKIP_MAIN__ + + + diff --git a/external/jigsaw/uni/test_8.c b/external/jigsaw/uni/test2d_h.c similarity index 74% rename from external/jigsaw/uni/test_8.c rename to external/jigsaw/uni/test2d_h.c index 32c28f9..efff8f2 100644 --- a/external/jigsaw/uni/test_8.c +++ b/external/jigsaw/uni/test2d_h.c @@ -1,14 +1,19 @@ -// gcc -Wall -Wextra test_8.c -Xlinker -rpath=../lib -// -L ../lib -ljigsaw -o test_8 +// gcc -Wall -Wextra test2d_h.c -Xlinker -rpath=../lib +// -L ../lib -ljigsaw -o test2d_h // Use MARCHE to set "gradient-limits" on mesh-spacing data +// +// ensures: |GRAD(h)| <= slope_limit(x), +// +// via a "fast-marching" solver for the Hamilton-Jacobi eq. # include "../inc/lib_jigsaw.h" +# include "print.h" # include "stdio.h" - int main () + int test2d_h (int _verb) { int _retv = 0; @@ -48,13 +53,13 @@ } ; fp32_t _hfun_value[9] = { - 2., 2., 2., 2., 1., 2., 2., - 2., 2. + 2.f, 2.f, 2.f, 2.f, 1.f, 2.f, 2.f, + 2.f, 2.f } ; fp32_t _hfun_slope[9] = { - .4, .4, .4, .4, .1, .4, .4, - .4, .4 + .4f, .4f, .4f, .4f, .1f, .4f, .4f, + .4f, .4f } ; _hfun._flags @@ -74,14 +79,16 @@ /*-------------------------------- build MARCHE hfun. */ - _jjig._verbosity = +1 ; + _jjig._verbosity = _verb; _retv = marche ( - &_jjig , // the config. opts - &_hfun ) ; // the spacing h(x) + & _jjig , // the config. opts + & _hfun ) ; // the spacing h(x) /*-------------------------------- print MARCHE hfun. */ + if (_verb > 0 ) + { printf("\n VALUE: \n\n") ; for (size_t _ipos = +0; @@ -92,13 +99,18 @@ _hfun._value._data[_ipos] ) ; } + } printf ( - "MARCHE returned code : %d \n",_retv); + "[2d_h] MARCHE returned code : %d \n", _retv) ; return _retv ; } +# ifndef __SKIP_MAIN__ + int main () { return test2d_h(1) ; } +# endif//__SKIP_MAIN__ + diff --git a/external/jigsaw/uni/test_7.c b/external/jigsaw/uni/test2d_i.c similarity index 77% rename from external/jigsaw/uni/test_7.c rename to external/jigsaw/uni/test2d_i.c index bbe4e58..fad73b9 100644 --- a/external/jigsaw/uni/test_7.c +++ b/external/jigsaw/uni/test2d_i.c @@ -1,14 +1,19 @@ -// gcc -Wall -Wextra test_7.c -Xlinker -rpath=../lib -// -L ../lib -ljigsaw -o test_7 +// gcc -Wall -Wextra test2d_i.c -Xlinker -rpath=../lib +// -L ../lib -ljigsaw -o test2d_i // Use MARCHE to set "gradient-limits" on mesh-spacing data +// +// ensures: |GRAD(h)| <= slope_limit(x), +// +// via a "fast-marching" solver for the Hamilton-Jacobi eq. # include "../inc/lib_jigsaw.h" +# include "print.h" # include "stdio.h" - int main () + int test2d_i (int _verb) { int _retv = 0; @@ -48,16 +53,16 @@ jigsaw_TRIA3_t _hfun_tria3[4] = { { {+0, +1, +4}, +0 } , { {+1, +2, +4}, +0 } , - { {+2, +3, +4}, +4 } , + { {+2, +3, +4}, +0 } , { {+3, +0, +4}, +0 } } ; fp32_t _hfun_value[5] = { - 2., 2., 2., 2., 1. + 2.f, 2.f, 2.f, 2.f, 1.f } ; fp32_t _hfun_slope[1] = { - .1 + .1f } ; _hfun._flags @@ -77,14 +82,16 @@ /*-------------------------------- build MARCHE hfun. */ - _jjig._verbosity = +1 ; + _jjig._verbosity = _verb; _retv = marche ( - &_jjig , // the config. opts - &_hfun ) ; // the spacing h(x) + & _jjig , // the config. opts + & _hfun ) ; // the spacing h(x) /*-------------------------------- print MARCHE hfun. */ + if (_verb > 0 ) + { printf("\n VALUE: \n\n") ; for (size_t _ipos = +0; @@ -95,13 +102,18 @@ _hfun._value._data[_ipos] ) ; } + } printf ( - "MARCHE returned code : %d \n",_retv); + "[2d_i] MARCHE returned code : %d \n", _retv) ; return _retv ; } +# ifndef __SKIP_MAIN__ + int main () { return test2d_i(1) ; } +# endif//__SKIP_MAIN__ + diff --git a/external/jigsaw/uni/test2s_a.c b/external/jigsaw/uni/test2s_a.c new file mode 100644 index 0000000..9df3b39 --- /dev/null +++ b/external/jigsaw/uni/test2s_a.c @@ -0,0 +1,74 @@ + +// gcc -Wall -Wextra test2s_a.c -Xlinker -rpath=../lib +// -L ../lib -ljigsaw -o test2s_a + +// A simple example to start: use JIGSAW to mesh a plain +// domain in S^2. + +# include "../inc/lib_jigsaw.h" + +# include "print.h" +# include "stdio.h" + + int test2s_a (int _verb) + { + int _retv = 0; + + /*-------------------------------- setup JIGSAW types */ + jigsaw_jig_t _jjig ; + jigsaw_init_jig_t(&_jjig) ; + + jigsaw_msh_t _geom ; + jigsaw_init_msh_t(&_geom) ; + + jigsaw_msh_t _mesh ; + jigsaw_init_msh_t(&_mesh) ; + + /*-------------------------------- setup JIGSAW geom. */ + + real_t _radii[3] = {+1., +1., +1. + } ; + + _geom._flags = + JIGSAW_ELLIPSOID_MESH ; + + _geom._radii._data = &_radii[0] ; + _geom._radii._size = +3 ; + + /*-------------------------------- build JIGSAW tria. */ + + _jjig._verbosity = _verb; + + _jjig._hfun_hmax = 0.80 ; + _jjig._hfun_scal = + JIGSAW_HFUN_ABSOLUTE; + + _jjig._mesh_dims = +2 ; + + _retv = jigsaw ( + & _jjig , // the config. opt. + & _geom , // geom. data + NULL , // empty init. obj. + NULL , // empty hfun. obj. + & _mesh ) ; + + /*-------------------------------- print JIGSAW tria. */ + + if (_verb > 0 ) + output_msh_data_3(&_mesh); + + jigsaw_free_msh_t(&_mesh); + + printf ( + "[2s_a] JIGSAW returned code : %d \n", _retv) ; + + + return _retv ; + } + +# ifndef __SKIP_MAIN__ + int main () { return test2s_a(1) ; } +# endif//__SKIP_MAIN__ + + + diff --git a/external/jigsaw/uni/test2s_b.c b/external/jigsaw/uni/test2s_b.c new file mode 100644 index 0000000..0e0446e --- /dev/null +++ b/external/jigsaw/uni/test2s_b.c @@ -0,0 +1,133 @@ + +// gcc -Wall -Wextra test2s_b.c -Xlinker -rpath=../lib +// -L ../lib -ljigsaw -o test2s_b + +// Use JIGSAW to mesh a simple geometry with user-defined +// mesh-spacing data defined on a "grid" in S^2. + +# include "../inc/lib_jigsaw.h" + +# include "print.h" +# include "stdio.h" + + int test2s_b (int _verb) + { + int _retv = 0; + + /*-------------------------------- setup JIGSAW types */ + jigsaw_jig_t _jjig ; + jigsaw_init_jig_t(&_jjig) ; + + jigsaw_msh_t _geom ; + jigsaw_init_msh_t(&_geom) ; + + jigsaw_msh_t _hfun ; + jigsaw_init_msh_t(&_hfun) ; + + jigsaw_msh_t _mesh ; + jigsaw_init_msh_t(&_mesh) ; + + /*-------------------------------- setup JIGSAW geom. */ + + real_t _radii[3] = {+1., +1., +1. + } ; + + _geom._flags = + JIGSAW_ELLIPSOID_MESH ; + + _geom._radii._data = &_radii[0] ; + _geom._radii._size = +3 ; + + /* + -------------------------------------------------------- + * JIGSAW's "grid" uses a column-major numbering: + -------------------------------------------------------- + * + * v:5 + * v:2 o-------o-------o v:8 + * | | | + * | | | + * | v:4 | + * v:1 o-------o-------o v:7 + * | | | + * | | | + * | | | + * v:0 o-------o-------o v:6 + * v:3 + * + -------------------------------------------------------- + */ + + real_t PI = 3.14159265358979323846 ; + + real_t _hfun_xgrid[3] = { // setup hfun. + -1.0 * PI, 0.0, +1.0 * PI + } ; + + real_t _hfun_ygrid[3] = { + -0.5 * PI, 0.0, +0.5 * PI + } ; + + fp32_t _hfun_value[9] = { + .5f, 1.f, .5f, .5f, 1.f, .5f, .5f, + 1.f, .5f + } ; + + _hfun._flags + = JIGSAW_ELLIPSOID_GRID; + + _hfun._xgrid._data = &_hfun_xgrid[0] ; + _hfun._xgrid._size = +3 ; + + _hfun._ygrid._data = &_hfun_ygrid[0] ; + _hfun._ygrid._size = +3 ; + + _hfun._value._data = &_hfun_value[0] ; + _hfun._value._size = +9 ; + + /*-------------------------------- build JIGSAW tria. */ + + _jjig._verbosity = _verb; + + _jjig._hfun_scal = + JIGSAW_HFUN_ABSOLUTE; + + _jjig._hfun_hmax = 1. ; + _jjig._hfun_hmin = 0. ; + + _jjig._mesh_dims = +2 ; + + _jjig._mesh_kern = // non-default opts + JIGSAW_KERN_DELAUNAY; + _jjig._optm_kern = + JIGSAW_KERN_CVT_DQDX; + _jjig._optm_cost = + JIGSAW_KERN_SKEW_COS; + + _retv = jigsaw ( + & _jjig , // the config. opt. + & _geom , // geom. data + NULL , // empty init. obj. + & _hfun , // hfun. data + & _mesh ) ; + + /*-------------------------------- print JIGSAW tria. */ + + if (_verb > 0 ) + output_msh_data_3(&_mesh); + + jigsaw_free_msh_t(&_mesh); + + printf ( + "[2s_b] JIGSAW returned code : %d \n", _retv) ; + + + return _retv ; + } + +# ifndef __SKIP_MAIN__ + int main () { return test2s_b(1) ; } +# endif//__SKIP_MAIN__ + + + diff --git a/external/jigsaw/uni/test2s_c.c b/external/jigsaw/uni/test2s_c.c new file mode 100644 index 0000000..46b5753 --- /dev/null +++ b/external/jigsaw/uni/test2s_c.c @@ -0,0 +1,126 @@ + +// gcc -Wall -Wextra test2s_c.c -Xlinker -rpath=../lib +// -L ../lib -ljigsaw -o test2s_c + +// Use JIGSAW to mesh a simple geometry with user-defined +// mesh-spacing data defined on a "mesh" in S^2. + +# include "../inc/lib_jigsaw.h" + +# include "print.h" +# include "stdio.h" + + int test2s_c (int _verb) + { + int _retv = 0; + + /*-------------------------------- setup JIGSAW types */ + jigsaw_jig_t _jjig ; + jigsaw_init_jig_t(&_jjig) ; + + jigsaw_msh_t _geom ; + jigsaw_init_msh_t(&_geom) ; + + jigsaw_msh_t _hfun ; + jigsaw_init_msh_t(&_hfun) ; + + jigsaw_msh_t _mesh ; + jigsaw_init_msh_t(&_mesh) ; + + /*-------------------------------- setup JIGSAW geom. */ + + real_t _radii[3] = {+1., +1., +1. + } ; + + _geom._flags = + JIGSAW_ELLIPSOID_MESH ; + + _geom._radii._data = &_radii[0] ; + _geom._radii._size = +3 ; + + /*-------------------------------- setup JIGSAW hfun. */ + + real_t PI = 3.14159265358979323846 ; + + jigsaw_VERT2_t _hfun_vert2[9] = { // setup hfun. + { {-1. * PI, -0.5 * PI}, +0 } , + { {+0. * PI, -0.5 * PI}, +0 } , + { {+1. * PI, -0.5 * PI}, +0 } , + { {-1. * PI, +0.0 * PI}, +0 } , + { {+0. * PI, +0.0 * PI}, +0 } , + { {+1. * PI, +0.0 * PI}, +0 } , + { {-1. * PI, +0.5 * PI}, +0 } , + { {+0. * PI, +0.5 * PI}, +0 } , + { {+1. * PI, +0.5 * PI}, +0 } + } ; + + jigsaw_TRIA3_t _hfun_tria3[8] = { + { {+0, +1, +3}, +0 } , + { {+3, +1, +4}, +0 } , + { {+1, +2, +4}, +0 } , + { {+4, +2, +5}, +0 } , + { {+3, +4, +6}, +0 } , + { {+6, +4, +7}, +0 } , + { {+4, +5, +7}, +0 } , + { {+7, +5, +8}, +0 } + } ; + + fp32_t _hfun_value[9] = { + 1.f, 1.f, 1.f, 1.f, 1.f, 1.f, .5f, + .5f, .5f + } ; + + _hfun._flags + = JIGSAW_ELLIPSOID_MESH; + + _hfun._vert2._data = &_hfun_vert2[0] ; + _hfun._vert2._size = +9 ; + + _hfun._tria3._data = &_hfun_tria3[0] ; + _hfun._tria3._size = +8 ; + + _hfun._value._data = &_hfun_value[0] ; + _hfun._value._size = +9 ; + + /*-------------------------------- build JIGSAW tria. */ + + _jjig._verbosity = _verb; + + _jjig._hfun_scal = + JIGSAW_HFUN_ABSOLUTE; + + _jjig._hfun_hmax = 1. ; + _jjig._hfun_hmin = 0. ; + + _jjig._mesh_dims = +2 ; + + _jjig._mesh_kern = + JIGSAW_KERN_DELAUNAY; + + _retv = jigsaw ( + & _jjig , // the config. opt. + & _geom , // geom. data + NULL , // empty init. obj. + & _hfun , // hfun. data + & _mesh ) ; + + /*-------------------------------- print JIGSAW tria. */ + + if (_verb > 0 ) + output_msh_data_3(&_mesh); + + jigsaw_free_msh_t(&_mesh); + + printf ( + "[2s_c] JIGSAW returned code : %d \n", _retv) ; + + + return _retv ; + } + +# ifndef __SKIP_MAIN__ + int main () { return test2s_c(1) ; } +# endif//__SKIP_MAIN__ + + + diff --git a/external/jigsaw/uni/test2s_e.c b/external/jigsaw/uni/test2s_e.c new file mode 100644 index 0000000..3907110 --- /dev/null +++ b/external/jigsaw/uni/test2s_e.c @@ -0,0 +1,108 @@ + +// gcc -Wall -Wextra test2s_e.c -Xlinker -rpath=../lib +// -L ../lib -ljigsaw -o test2s_e + +// Use JIGSAW to mesh a simple domain in S^2, starting +// from user-defined initial-conditions. + +# include "../inc/lib_jigsaw.h" + +# include "print.h" +# include "stdio.h" + + int test2s_e (int _verb) + { + int _retv = 0; + + /*-------------------------------- setup JIGSAW types */ + jigsaw_jig_t _jjig ; + jigsaw_init_jig_t(&_jjig) ; + + jigsaw_msh_t _geom ; + jigsaw_init_msh_t(&_geom) ; + + jigsaw_msh_t _init ; + jigsaw_init_msh_t(&_init) ; + + jigsaw_msh_t _mesh ; + jigsaw_init_msh_t(&_mesh) ; + + /*-------------------------------- setup JIGSAW geom. */ + + real_t PI = 3.14159265358979323846 ; + + real_t _radii[3] = {+1., +1., +1. + } ; + + _geom._flags = + JIGSAW_ELLIPSOID_MESH ; + + _geom._radii._data = &_radii[0] ; + _geom._radii._size = +3 ; + + /*-------------------------------- setup JIGSAW init. */ + + jigsaw_VERT2_t _init_vert2[8] = { + { {-1.0 * PI, +0.0 * PI}, +0 } , + { {-.33 * PI, +0.0 * PI}, +0 } , + { {+.33 * PI, +0.0 * PI}, +0 } , + { {+1.0 * PI, +0.0 * PI}, +0 } , + { {+0.0 * PI, +0.5 * PI}, +0 } , + { {+0.0 * PI, -0.5 * PI}, +0 } , + { {+0.0 * PI, +.25 * PI}, +0 } , + { {+0.0 * PI, -.25 * PI}, +0 } , + } ; + + jigsaw_EDGE2_t _init_edge2[1] = { + { {+6, +7}, -1 } , // -1 => "un-refinable" + } ; + + _init._flags + = JIGSAW_ELLIPSOID_MESH ; + + _init._radii._data = &_radii[0] ; + _init._radii._size = +3 ; + + _init._vert2._data = &_init_vert2[0] ; + _init._vert2._size = +8 ; + + _init._edge2._data = &_init_edge2[0] ; + _init._edge2._size = +1 ; + + /*-------------------------------- build JIGSAW tria. */ + + _jjig._verbosity = _verb; + + _jjig._hfun_hmax = 1./3.; + _jjig._hfun_scal = + JIGSAW_HFUN_RELATIVE; + + _jjig._mesh_dims = +2 ; + + _retv = jigsaw ( + & _jjig , // the config. opts + & _geom , // geom. data + & _init , // init. data + NULL , // empty hfun. data + & _mesh ) ; + + /*-------------------------------- print JIGSAW tria. */ + + if (_verb > 0 ) + output_msh_data_3(&_mesh); + + jigsaw_free_msh_t(&_mesh); + + printf ( + "[2s_e] JIGSAW returned code : %d \n", _retv) ; + + + return _retv ; + } + +# ifndef __SKIP_MAIN__ + int main () { return test2s_e(1) ; } +# endif//__SKIP_MAIN__ + + + diff --git a/external/jigsaw/uni/test2s_f.c b/external/jigsaw/uni/test2s_f.c new file mode 100644 index 0000000..1215547 --- /dev/null +++ b/external/jigsaw/uni/test2s_f.c @@ -0,0 +1,110 @@ + +// gcc -Wall -Wextra test2s_f.c -Xlinker -rpath=../lib +// -L ../lib -ljigsaw -o test2s_f + +// Uses TRIPOD to build a "restricted" DT, given a set +// points and a geometry in S^2. Compared to JIGSAW, +// TRIPOD computes a "restricted" triangulation (given +// a set of points a priori), rather than generating a +// mesh dynamically. + +# include "../inc/lib_jigsaw.h" + +# include "print.h" +# include "stdio.h" + + int test2s_f (int _verb) + { + int _retv = 0; + + /*-------------------------------- setup JIGSAW types */ + jigsaw_jig_t _jjig ; + jigsaw_init_jig_t(&_jjig) ; + + jigsaw_msh_t _geom ; + jigsaw_init_msh_t(&_geom) ; + + jigsaw_msh_t _init ; + jigsaw_init_msh_t(&_init) ; + + jigsaw_msh_t _tria ; + jigsaw_init_msh_t(&_tria) ; + + /*-------------------------------- setup JIGSAW geom. */ + + real_t PI = 3.14159265358979323846 ; + + jigsaw_VERT2_t _point[6] = { + { {0., -0.5 * PI}, +0 } , + { {0., +0.5 * PI}, +0 } , + { {-1.0 * PI, 0.}, +0 } , + { {-0.5 * PI, 0.}, +0 } , + { {+0.0 * PI, 0.}, +0 } , + { {+0.5 * PI, 0.}, +0 } , + } ; + + jigsaw_EDGE2_t _edges[4] = { + { {2, 3}, +1} , + { {3, 4}, +2} , + { {4, 5}, +3} , + { {5, 2}, +4} , + } ; + + real_t _radii[3] = {+1., +1., +1. + } ; + + _geom._flags = + JIGSAW_ELLIPSOID_MESH ; + + _geom._radii._data = &_radii[0] ; + _geom._radii._size = +3 ; + + _geom._vert2._data = &_point[0] ; + _geom._vert2._size = +6 ; + + _geom._edge2._data = &_edges[0] ; + _geom._edge2._size = +4 ; + + /*-------------------------------- form init. config. */ + + _init._flags + = JIGSAW_ELLIPSOID_MESH; + + _init._radii._data = &_radii[0] ; + _init._radii._size = +3 ; + + _init._vert2._data = &_point[0] ; + _init._vert2._size = +6 ; + + /*-------------------------------- build TRIPOD r-DT. */ + + _jjig._verbosity = _verb; + + _jjig._mesh_dims = +2 ; + + _retv = tripod ( + & _jjig , // the config. opts + & _init , // init. data + & _geom , // geom. data + & _tria ) ; + + /*-------------------------------- print TRIPOD r-DT. */ + + if (_verb > 0 ) + output_msh_data_3(&_tria); + + jigsaw_free_msh_t(&_tria); + + printf ( + "[2s_f] TRIPOD returned code : %d \n", _retv) ; + + + return _retv ; + } + +# ifndef __SKIP_MAIN__ + int main () { return test2s_f(1) ; } +# endif//__SKIP_MAIN__ + + + diff --git a/external/jigsaw/uni/test2s_g.c b/external/jigsaw/uni/test2s_g.c new file mode 100644 index 0000000..f374848 --- /dev/null +++ b/external/jigsaw/uni/test2s_g.c @@ -0,0 +1,102 @@ + +// gcc -Wall -Wextra test2s_g.c -Xlinker -rpath=../lib +// -L ../lib -ljigsaw -o test2s_g + +// Uses TRIPOD to build an (unconstrained) DT in S^2, +// comparable to more conventional Delaunay tessellation +// approaches. + +# include "../inc/lib_jigsaw.h" + +# include "print.h" +# include "stdio.h" + + int test2s_g (int _verb) + { + int _retv = 0; + + /*-------------------------------- setup JIGSAW types */ + jigsaw_jig_t _jjig ; + jigsaw_init_jig_t(&_jjig) ; + + jigsaw_msh_t _geom ; + jigsaw_init_msh_t(&_geom) ; + + jigsaw_msh_t _init ; + jigsaw_init_msh_t(&_init) ; + + jigsaw_msh_t _tria ; + jigsaw_init_msh_t(&_tria) ; + + /*-------------------------------- setup JIGSAW geom. */ + + real_t _radii[3] = {+1., +1., +1. + } ; + + _geom._flags = + JIGSAW_ELLIPSOID_MESH ; + + _geom._radii._data = &_radii[0] ; + _geom._radii._size = +3 ; + + /*-------------------------------- pts to triangulate */ + + real_t PI = 3.14159265358979323846 ; + indx_t _next = 0; + + jigsaw_VERT2_t _point[45] ; + + for (size_t _ipos = 0; _ipos < 9; ++_ipos) + for (size_t _jpos = 0; _jpos < 5; ++_jpos) + { + _point[_next]._ppos[0] = + -0.80 * PI + _ipos * 0.20 * PI ; + _point[_next]._ppos[1] = + -0.40 * PI + _jpos * 0.20 * PI ; + + _point[_next]._itag = +0 ; + + _next += +1; + } + + _init._flags + = JIGSAW_ELLIPSOID_MESH; + + _init._radii._data = &_radii[0] ; + _init._radii._size = +3 ; + + _init._vert2._data = &_point[0] ; + _init._vert2._size = +45; + + /*-------------------------------- build TRIPOD r-DT. */ + + _jjig._verbosity = _verb; + + _jjig._mesh_dims = +2 ; + + _retv = tripod ( + & _jjig , // the config. opts + & _init , // init. data + & _geom , // geom. data + & _tria ) ; + + /*-------------------------------- print TRIPOD r-DT. */ + + if (_verb > 0 ) + output_msh_data_3(&_tria); + + jigsaw_free_msh_t(&_tria); + + printf ( + "[2s_g] TRIPOD returned code : %d \n", _retv) ; + + + return _retv ; + } + +# ifndef __SKIP_MAIN__ + int main () { return test2s_g(1) ; } +# endif//__SKIP_MAIN__ + + + diff --git a/external/jigsaw/uni/test2s_h.c b/external/jigsaw/uni/test2s_h.c new file mode 100644 index 0000000..04cd9a4 --- /dev/null +++ b/external/jigsaw/uni/test2s_h.c @@ -0,0 +1,106 @@ + +// gcc -Wall -Wextra test2s_h.c -Xlinker -rpath=../lib +// -L ../lib -ljigsaw -o test2s_h + +// Use MARCHE to set "gradient-limits" on mesh-spacing data +// +// ensures: |GRAD(h)| <= slope_limit(x), +// +// via a "fast-marching" solver for the Hamilton-Jacobi eq. + +# include "../inc/lib_jigsaw.h" + +# include "print.h" +# include "stdio.h" + + int test2s_h (int _verb) + { + int _retv = 0; + + /*-------------------------------- setup JIGSAW types */ + jigsaw_jig_t _jjig ; + jigsaw_init_jig_t(&_jjig) ; + + jigsaw_msh_t _hfun ; + jigsaw_init_msh_t(&_hfun) ; + + /*-------------------------------- setup JIGSAW hfun. */ + + real_t PI = 3.14159265358979323846 ; + + real_t _radii[3] = {+1., +1., +1. + } ; + + real_t _hfun_xgrid[3] = { + -1.0 * PI, 0.0 * PI, +1.0 * PI + } ; + + real_t _hfun_ygrid[3] = { + -0.5 * PI, 0.0 * PI, +0.5 * PI + } ; + + fp32_t _hfun_value[9] = { + 2.f, 2.f, 2.f, 2.f, 1.f, 2.f, 2.f, + 2.f, 2.f + } ; + + fp32_t _hfun_slope[9] = { + .4f, .4f, .4f, .4f, .1f, .4f, .4f, + .4f, .4f + } ; + + _hfun._flags = + JIGSAW_ELLIPSOID_GRID ; + + _hfun._radii._data = &_radii[0] ; + _hfun._radii._size = +3 ; + + _hfun._xgrid._data = &_hfun_xgrid[0] ; + _hfun._xgrid._size = +3 ; + + _hfun._ygrid._data = &_hfun_ygrid[0] ; + _hfun._ygrid._size = +3 ; + + _hfun._value._data = &_hfun_value[0] ; + _hfun._value._size = +9 ; + + _hfun._slope._data = &_hfun_slope[0] ; + _hfun._slope._size = +9 ; + + /*-------------------------------- build MARCHE hfun. */ + + _jjig._verbosity = _verb; + + _retv = marche ( + & _jjig , // the config. opts + & _hfun ) ; // the spacing h(x) + + /*-------------------------------- print MARCHE hfun. */ + + if (_verb > 0 ) + { + printf("\n VALUE: \n\n") ; + + for (size_t _ipos = +0; + _ipos != _hfun._value._size ; + ++_ipos ) + { + printf("%1.4f\n", + _hfun._value._data[_ipos] + ) ; + } + } + + printf ( + "[2s_h] MARCHE returned code : %d \n", _retv) ; + + + return _retv ; + } + +# ifndef __SKIP_MAIN__ + int main () { return test2s_h(1) ; } +# endif//__SKIP_MAIN__ + + + diff --git a/external/jigsaw/uni/test2s_i.c b/external/jigsaw/uni/test2s_i.c new file mode 100644 index 0000000..3fd6921 --- /dev/null +++ b/external/jigsaw/uni/test2s_i.c @@ -0,0 +1,115 @@ + +// gcc -Wall -Wextra test2s_i.c -Xlinker -rpath=../lib +// -L ../lib -ljigsaw -o test2s_i + +// Use MARCHE to set "gradient-limits" on mesh-spacing data +// +// ensures: |GRAD(h)| <= slope_limit(x), +// +// via a "fast-marching" solver for the Hamilton-Jacobi eq. + +# include "../inc/lib_jigsaw.h" + +# include "print.h" +# include "stdio.h" + + int test2s_i (int _verb) + { + int _retv = 0; + + /*-------------------------------- setup JIGSAW types */ + jigsaw_jig_t _jjig ; + jigsaw_init_jig_t(&_jjig) ; + + jigsaw_msh_t _hfun ; + jigsaw_init_msh_t(&_hfun) ; + + /*-------------------------------- setup JIGSAW hfun. */ + + real_t PI = 3.14159265358979323846 ; + + real_t _radii[3] = {+1., +1., +1. + } ; + + jigsaw_VERT2_t _hfun_vert2[6] = { + { {-1.0 * PI, +0.0 * PI}, +0 } , + { {-.33 * PI, +0.0 * PI}, +0 } , + { {+.33 * PI, +0.0 * PI}, +0 } , + { {+1.0 * PI, +0.0 * PI}, +0 } , + { {+0.0 * PI, +0.5 * PI}, +0 } , + { {+0.0 * PI, -0.5 * PI}, +0 } , + } ; + + jigsaw_TRIA3_t _hfun_tria3[6] = { + { {+0, +1, +4}, +0 } , + { {+1, +2, +4}, +0 } , + { {+2, +3, +4}, +0 } , + { {+1, +0, +5}, +0 } , + { {+2, +1, +5}, +0 } , + { {+3, +2, +5}, +0 } , + } ; + + fp32_t _hfun_value[6] = { + 2.f, 2.f, 2.f, 2.f, 1.f, 2.f + } ; + + fp32_t _hfun_slope[1] = { + .1f + } ; + + _hfun._flags + = JIGSAW_ELLIPSOID_MESH; + + _hfun._radii._data = &_radii[0] ; + _hfun._radii._size = +3 ; + + _hfun._vert2._data = &_hfun_vert2[0] ; + _hfun._vert2._size = +6 ; + + _hfun._tria3._data = &_hfun_tria3[0] ; + _hfun._tria3._size = +6 ; + + _hfun._value._data = &_hfun_value[0] ; + _hfun._value._size = +6 ; + + _hfun._slope._data = &_hfun_slope[0] ; + _hfun._slope._size = +1 ; + + + /*-------------------------------- build MARCHE hfun. */ + + _jjig._verbosity = _verb; + + _retv = marche ( + & _jjig , // the config. opts + & _hfun ) ; // the spacing h(x) + + /*-------------------------------- print MARCHE hfun. */ + + if (_verb > 0 ) + { + printf("\n VALUE: \n\n") ; + + for (size_t _ipos = +0; + _ipos != _hfun._value._size ; + ++_ipos ) + { + printf("%1.4f\n", + _hfun._value._data[_ipos] + ) ; + } + } + + printf ( + "[2s_i] MARCHE returned code : %d \n", _retv) ; + + + return _retv ; + } + +# ifndef __SKIP_MAIN__ + int main () { return test2s_i(1) ; } +# endif//__SKIP_MAIN__ + + + diff --git a/external/jigsaw/uni/test3d_a.c b/external/jigsaw/uni/test3d_a.c new file mode 100644 index 0000000..74c9858 --- /dev/null +++ b/external/jigsaw/uni/test3d_a.c @@ -0,0 +1,103 @@ + +// gcc -Wall -Wextra test3d_a.c -Xlinker -rpath=../lib +// -L ../lib -ljigsaw -o test3d_a + +// A simple example to start: use JIGSAW to mesh a plain +// domain in E^3. + +# include "../inc/lib_jigsaw.h" + +# include "print.h" +# include "stdio.h" + + int test3d_a (int _verb) + { + int _retv = 0; + + /*-------------------------------- setup JIGSAW types */ + jigsaw_jig_t _jjig ; + jigsaw_init_jig_t(&_jjig) ; + + jigsaw_msh_t _geom ; + jigsaw_init_msh_t(&_geom) ; + + jigsaw_msh_t _mesh ; + jigsaw_init_msh_t(&_mesh) ; + + /*-------------------------------- setup JIGSAW geom. */ + + jigsaw_VERT3_t _vert3[8] = { // setup geom. + { {0., 0., 0.}, +0 } , + { {1., 0., 0.}, +0 } , + { {1., 1., 0.}, +0 } , + { {0., 1., 0.}, +0 } , + { {0., 0., 1.}, +0 } , + { {1., 0., 1.}, +0 } , + { {1., 1., 1.}, +0 } , + { {0., 1., 1.}, +0 } + } ; + + jigsaw_TRIA3_t _tria3[12] = { + { {+0, +1, +2}, +0 } , + { {+0, +2, +3}, +0 } , + { {+4, +5, +6}, +0 } , + { {+4, +6, +7}, +0 } , + { {+0, +1, +5}, +0 } , + { {+0, +5, +4}, +0 } , + { {+1, +2, +6}, +0 } , + { {+1, +6, +5}, +0 } , + { {+2, +3, +7}, +0 } , + { {+2, +7, +6}, +0 } , + { {+3, +7, +4}, +0 } , + { {+3, +4, +0}, +0 } + } ; + + _geom._flags + = JIGSAW_EUCLIDEAN_MESH; + + _geom._vert3._data = &_vert3[0] ; + _geom._vert3._size = +8 ; + + _geom._tria3._data = &_tria3[0] ; + _geom._tria3._size = +12; + + /*-------------------------------- build JIGSAW tria. */ + + _jjig._verbosity = _verb; + + _jjig._hfun_hmax = .675 ; // uniform spacing + _jjig._hfun_scal = + JIGSAW_HFUN_RELATIVE; + + _jjig._geom_feat = +1 ; // do "sharp" geom. + _jjig._mesh_top1 = +1 ; + + _jjig._mesh_dims = +3 ; // make 3-dim cell + + _retv = jigsaw ( + & _jjig , // the config. opt. + & _geom , // geom. data + NULL , // empty init. obj. + NULL , // empty hfun. obj. + & _mesh ) ; + + /*-------------------------------- print JIGSAW tria. */ + + if (_verb > 0 ) + output_msh_data_3(&_mesh); + + jigsaw_free_msh_t(&_mesh); + + printf ( + "[3d_a] JIGSAW returned code : %d \n", _retv) ; + + + return _retv ; + } + +# ifndef __SKIP_MAIN__ + int main () { return test3d_a(1) ; } +# endif//__SKIP_MAIN__ + + + diff --git a/external/jigsaw/uni/test3d_b.c b/external/jigsaw/uni/test3d_b.c new file mode 100644 index 0000000..5778858 --- /dev/null +++ b/external/jigsaw/uni/test3d_b.c @@ -0,0 +1,142 @@ + +// gcc -Wall -Wextra test3d_b.c -Xlinker -rpath=../lib +// -L ../lib -ljigsaw -o test3d_b + +// Use JIGSAW to mesh a simple geometry with user-defined +// mesh-spacing data defined on a "grid" in E^3. + +# include "../inc/lib_jigsaw.h" + +# include "print.h" +# include "stdio.h" + + int test3d_b (int _verb) + { + int _retv = 0; + + /*-------------------------------- setup JIGSAW types */ + jigsaw_jig_t _jjig ; + jigsaw_init_jig_t(&_jjig) ; + + jigsaw_msh_t _geom ; + jigsaw_init_msh_t(&_geom) ; + + jigsaw_msh_t _hfun ; + jigsaw_init_msh_t(&_hfun) ; + + jigsaw_msh_t _mesh ; + jigsaw_init_msh_t(&_mesh) ; + + /*-------------------------------- setup JIGSAW geom. */ + + jigsaw_VERT3_t _vert3[8] = { // setup geom. + { {0., 0., 0.}, +0 } , + { {1., 0., 0.}, +0 } , + { {1., 1., 0.}, +0 } , + { {0., 1., 0.}, +0 } , + { {0., 0., 1.}, +0 } , + { {1., 0., 1.}, +0 } , + { {1., 1., 1.}, +0 } , + { {0., 1., 1.}, +0 } + } ; + + jigsaw_TRIA3_t _tria3[12] = { + { {+0, +1, +2}, +0 } , + { {+0, +2, +3}, +0 } , + { {+4, +5, +6}, +0 } , + { {+4, +6, +7}, +0 } , + { {+0, +1, +5}, +0 } , + { {+0, +5, +4}, +0 } , + { {+1, +2, +6}, +0 } , + { {+1, +6, +5}, +0 } , + { {+2, +3, +7}, +0 } , + { {+2, +7, +6}, +0 } , + { {+3, +7, +4}, +0 } , + { {+3, +4, +0}, +0 } + } ; + + _geom._flags + = JIGSAW_EUCLIDEAN_MESH; + + _geom._vert3._data = &_vert3[0] ; + _geom._vert3._size = +8 ; + + _geom._tria3._data = &_tria3[0] ; + _geom._tria3._size = +12; + + /*-------------------------------- setup JIGSAW hfun. */ + + real_t _hfun_xgrid[2] = { // setup hfun. + 0., 1. + } ; + + real_t _hfun_ygrid[2] = { + 0., 1. + } ; + + real_t _hfun_zgrid[2] = { + 0., 1. + } ; + + fp32_t _hfun_value[8] = { + .6f, .6f, .6f, .6f, + .3f, .3f, .3f, .3f + } ; + + _hfun._flags + = JIGSAW_EUCLIDEAN_GRID; + + _hfun._xgrid._data = &_hfun_xgrid[0] ; + _hfun._xgrid._size = +2 ; + + _hfun._ygrid._data = &_hfun_ygrid[0] ; + _hfun._ygrid._size = +2 ; + + _hfun._zgrid._data = &_hfun_zgrid[0] ; + _hfun._zgrid._size = +2 ; + + _hfun._value._data = &_hfun_value[0] ; + _hfun._value._size = +8 ; + + /*-------------------------------- build JIGSAW tria. */ + + _jjig._verbosity = _verb; + + _jjig._hfun_scal = + JIGSAW_HFUN_ABSOLUTE; + + _jjig._hfun_hmax = 1. ; + _jjig._hfun_hmin = 0. ; + + _jjig._geom_feat = +1 ; // do "sharp" geom. + _jjig._mesh_top1 = +1 ; + + _jjig._mesh_dims = +3 ; // make 3-dim cell + + _retv = jigsaw ( + & _jjig , // the config. opt. + & _geom , // geom. data + NULL , // empty init. obj. + & _hfun , // hfun. data + & _mesh ) ; + + /*-------------------------------- print JIGSAW tria. */ + + if (_verb > 0 ) + output_msh_data_3(&_mesh); + + jigsaw_free_msh_t(&_mesh); + + printf ( + "[3d_b] JIGSAW returned code : %d \n", _retv) ; + + + return _retv ; + } + +# ifndef __SKIP_MAIN__ + int main () { return test3d_b(1) ; } +# endif//__SKIP_MAIN__ + + + diff --git a/external/jigsaw/uni/test3d_c.c b/external/jigsaw/uni/test3d_c.c new file mode 100644 index 0000000..df498b8 --- /dev/null +++ b/external/jigsaw/uni/test3d_c.c @@ -0,0 +1,159 @@ + +// gcc -Wall -Wextra test3d_c.c -Xlinker -rpath=../lib +// -L ../lib -ljigsaw -o test3d_c + +// Use JIGSAW to mesh a simple geometry with user-defined +// mesh-spacing data defined on a "mesh" in E^3. + +# include "../inc/lib_jigsaw.h" + +# include "print.h" +# include "stdio.h" + + int test3d_c (int _verb) + { + int _retv = 0; + + /*-------------------------------- setup JIGSAW types */ + jigsaw_jig_t _jjig ; + jigsaw_init_jig_t(&_jjig) ; + + jigsaw_msh_t _geom ; + jigsaw_init_msh_t(&_geom) ; + + jigsaw_msh_t _hfun ; + jigsaw_init_msh_t(&_hfun) ; + + jigsaw_msh_t _mesh ; + jigsaw_init_msh_t(&_mesh) ; + + /*-------------------------------- setup JIGSAW geom. */ + + jigsaw_VERT3_t _geom_vert3[8] = { // setup geom. + { {0., 0., 0.}, +0 } , + { {1., 0., 0.}, +0 } , + { {1., 1., 0.}, +0 } , + { {0., 1., 0.}, +0 } , + { {0., 0., 1.}, +0 } , + { {1., 0., 1.}, +0 } , + { {1., 1., 1.}, +0 } , + { {0., 1., 1.}, +0 } + } ; + + jigsaw_TRIA3_t _geom_tria3[12] = { + { {+0, +1, +2}, +0 } , + { {+0, +2, +3}, +0 } , + { {+4, +5, +6}, +0 } , + { {+4, +6, +7}, +0 } , + { {+0, +1, +5}, +0 } , + { {+0, +5, +4}, +0 } , + { {+1, +2, +6}, +0 } , + { {+1, +6, +5}, +0 } , + { {+2, +3, +7}, +0 } , + { {+2, +7, +6}, +0 } , + { {+3, +7, +4}, +0 } , + { {+3, +4, +0}, +0 } + } ; + + _geom._flags + = JIGSAW_EUCLIDEAN_MESH; + + _geom._vert3._data = &_geom_vert3[0] ; + _geom._vert3._size = +8 ; + + _geom._tria3._data = &_geom_tria3[0] ; + _geom._tria3._size = +12; + + /*-------------------------------- setup JIGSAW hfun. */ + + jigsaw_VERT3_t _hfun_vert3[9] = { // setup hfun. + { {.5, .5, 0.}, +0 } , + { {0., 0., 0.}, +0 } , + { {1., 0., 0.}, +0 } , + { {1., 1., 0.}, +0 } , + { {0., 1., 0.}, +0 } , + { {0., 0., 1.}, +0 } , + { {1., 0., 1.}, +0 } , + { {1., 1., 1.}, +0 } , + { {0., 1., 1.}, +0 } , + } ; + + jigsaw_TRIA4_t _hfun_tria4[10] = { + { {0, 5, 2, 1}, +0 } , + { {0, 6, 5, 2}, +0 } , + { {7, 0, 6, 2}, +0 } , + { {7, 0, 3, 2}, +0 } , + { {8, 0, 5, 1}, +0 } , + { {8, 0, 4, 1}, +0 } , + { {8, 0, 6, 5}, +0 } , + { {8, 7, 0, 6}, +0 } , + { {8, 0, 4, 3}, +0 } , + { {8, 7, 0, 3}, +0 } , + } ; + + fp32_t _hfun_value[9]= { + .5f, .5f, .5f, .5f, .5f, + 1.f, 1.f, 1.f, 1.f + } ; + + _hfun._flags + = JIGSAW_EUCLIDEAN_MESH; + + _hfun._vert3._data = &_hfun_vert3[0] ; + _hfun._vert3._size = +9 ; + + _hfun._tria4._data = &_hfun_tria4[0] ; + _hfun._tria4._size = +10; + + _hfun._value._data = &_hfun_value[0] ; + _hfun._value._size = +9 ; + + /*-------------------------------- build JIGSAW tria. */ + + _jjig._verbosity = _verb; + + _jjig._hfun_scal = + JIGSAW_HFUN_ABSOLUTE; + + _jjig._hfun_hmax = 1. ; + _jjig._hfun_hmin = 0. ; + + _jjig._geom_feat = +1 ; // do "sharp" geom. + _jjig._mesh_top1 = +1 ; + + _jjig._mesh_dims = +3 ; // make 3-dim cell + + _jjig._mesh_kern = // non-default opts + JIGSAW_KERN_DELAUNAY; + _jjig._optm_kern = + JIGSAW_KERN_CVT_DQDX; + _jjig._optm_cost = + JIGSAW_KERN_SKEW_COS; + + _retv = jigsaw ( + & _jjig , // the config. opt. + & _geom , // geom. data + NULL , // empty init. obj. + & _hfun , // hfun. data + & _mesh ) ; + + /*-------------------------------- print JIGSAW tria. */ + + if (_verb > 0 ) + output_msh_data_3(&_mesh); + + jigsaw_free_msh_t(&_mesh); + + printf ( + "[3d_c] JIGSAW returned code : %d \n", _retv) ; + + + return _retv ; + } + +# ifndef __SKIP_MAIN__ + int main () { return test3d_c(1) ; } +# endif//__SKIP_MAIN__ + + + diff --git a/external/jigsaw/uni/test3d_d.c b/external/jigsaw/uni/test3d_d.c new file mode 100644 index 0000000..d60a87d --- /dev/null +++ b/external/jigsaw/uni/test3d_d.c @@ -0,0 +1,174 @@ + +// gcc -Wall -Wextra test3d_d.c -Xlinker -rpath=../lib +// -L ../lib -ljigsaw -o test3d_d + +// Use JIGSAW to mesh "multi-part" geometry defined in +// E^3. Cells inherit part information via ID-tags. + +# include "../inc/lib_jigsaw.h" + +# include "print.h" +# include "stdio.h" + + int test3d_d (int _verb) + { + int _retv = 0; + + /*-------------------------------- setup JIGSAW types */ + jigsaw_jig_t _jjig ; + jigsaw_init_jig_t(&_jjig) ; + + jigsaw_msh_t _geom ; + jigsaw_init_msh_t(&_geom) ; + + jigsaw_msh_t _mesh ; + jigsaw_init_msh_t(&_mesh) ; + + /*-------------------------------- setup JIGSAW geom. */ + + indx_t _ITAG + = JIGSAW_TRIA3_TAG ; + + jigsaw_VERT3_t _geom_vert3[16] = { // setup geom. + { {0., 0., 0.}, +0 } , // outer cube + { {3., 0., 0.}, +0 } , + { {3., 3., 0.}, +0 } , + { {0., 3., 0.}, +0 } , + { {0., 0., 3.}, +0 } , + { {3., 0., 3.}, +0 } , + { {3., 3., 3.}, +0 } , + { {0., 3., 3.}, +0 } , + { {1., 1., 1.}, +0 } , // inner cube + { {2., 1., 1.}, +0 } , + { {2., 2., 1.}, +0 } , + { {1., 2., 1.}, +0 } , + { {1., 1., 2.}, +0 } , + { {2., 1., 2.}, +0 } , + { {2., 2., 2.}, +0 } , + { {1., 2., 2.}, +0 } , + } ; + + jigsaw_TRIA3_t _geom_tria3[24] = { + { { 0, 1, 2}, +0 } , // outer cube + { { 0, 2, 3}, +0 } , + { { 4, 5, 6}, +0 } , + { { 4, 6, 7}, +0 } , + { { 0, 1, 5}, +0 } , + { { 0, 5, 4}, +0 } , + { { 1, 2, 6}, +0 } , + { { 1, 6, 5}, +0 } , + { { 2, 3, 7}, +0 } , + { { 2, 7, 6}, +0 } , + { { 3, 7, 4}, +0 } , + { { 3, 4, 0}, +0 } , + { { 8, 9, 10}, +0 } , // inner cube + { { 8, 10, 11}, +0 } , + { {12, 13, 14}, +0 } , + { {12, 14, 15}, +0 } , + { { 8, 9, 13}, +0 } , + { { 8, 13, 12}, +0 } , + { { 9, 10, 14}, +0 } , + { { 9, 14, 13}, +0 } , + { {10, 11, 15}, +0 } , + { {10, 15, 14}, +0 } , + { {11, 15, 12}, +0 } , + { {11, 12, 8}, +0 } , + } ; + + jigsaw_BOUND_t _geom_bound[36]= { + { +1, 0, _ITAG}, + { +1, 1, _ITAG}, + { +1, 2, _ITAG}, + { +1, 3, _ITAG}, + { +1, 4, _ITAG}, + { +1, 5, _ITAG}, + { +1, 6, _ITAG}, + { +1, 7, _ITAG}, + { +1, 8, _ITAG}, + { +1, 9, _ITAG}, + { +1, 10, _ITAG}, + { +1, 11, _ITAG}, + { +1, 12, _ITAG}, + { +1, 13, _ITAG}, + { +1, 14, _ITAG}, + { +1, 15, _ITAG}, + { +1, 16, _ITAG}, + { +1, 17, _ITAG}, + { +1, 18, _ITAG}, + { +1, 19, _ITAG}, + { +1, 20, _ITAG}, + { +1, 21, _ITAG}, + { +1, 22, _ITAG}, + { +1, 23, _ITAG}, + { +2, 12, _ITAG}, // inner geom. + { +2, 13, _ITAG}, + { +2, 14, _ITAG}, + { +2, 15, _ITAG}, + { +2, 16, _ITAG}, + { +2, 17, _ITAG}, + { +2, 18, _ITAG}, + { +2, 19, _ITAG}, + { +2, 20, _ITAG}, + { +2, 21, _ITAG}, + { +2, 22, _ITAG}, + { +2, 23, _ITAG}, + } ; + + _geom._flags + = JIGSAW_EUCLIDEAN_MESH; + + _geom._vert3._data = &_geom_vert3[0] ; + _geom._vert3._size = +16; + + _geom._tria3._data = &_geom_tria3[0] ; + _geom._tria3._size = +24; + + _geom._bound._data = &_geom_bound[0] ; + _geom._bound._size = +36; + + /*-------------------------------- build JIGSAW tria. */ + + _jjig._verbosity = _verb; + + _jjig._hfun_hmax = 3./3.; + _jjig._hfun_scal = + JIGSAW_HFUN_RELATIVE; + + _jjig._mesh_rad2 = 1.50 ; + _jjig._mesh_rad3 = 2.50 ; + + _jjig._geom_feat = +1 ; // do "sharp" geom. + _jjig._mesh_top1 = +1 ; + + _jjig._mesh_dims = +3 ; // make 3-dim cell + + _jjig._mesh_kern = + JIGSAW_KERN_DELAUNAY; + + _retv = jigsaw ( + & _jjig , // the config. opt. + & _geom , // geom. data + NULL , // empty init. obj. + NULL , // empty hfun. obj. + & _mesh ) ; + + /*-------------------------------- print JIGSAW tria. */ + + if (_verb > 0 ) + output_msh_data_3(&_mesh); + + jigsaw_free_msh_t(&_mesh); + + printf ( + "[3d_d] JIGSAW returned code : %d \n", _retv) ; + + + return _retv ; + } + +# ifndef __SKIP_MAIN__ + int main () { return test3d_d(1) ; } +# endif//__SKIP_MAIN__ + + + diff --git a/external/jigsaw/uni/test3d_e.c b/external/jigsaw/uni/test3d_e.c new file mode 100644 index 0000000..9581b57 --- /dev/null +++ b/external/jigsaw/uni/test3d_e.c @@ -0,0 +1,129 @@ + +// gcc -Wall -Wextra test3d_e.c -Xlinker -rpath=../lib +// -L ../lib -ljigsaw -o test3d_e + +// Use JIGSAW to mesh a simple domain in E^3, starting +// from user-defined initial-conditions. + +# include "../inc/lib_jigsaw.h" + +# include "print.h" +# include "stdio.h" + + int test3d_e (int _verb) + { + int _retv = 0; + + /*-------------------------------- setup JIGSAW types */ + jigsaw_jig_t _jjig ; + jigsaw_init_jig_t(&_jjig) ; + + jigsaw_msh_t _geom ; + jigsaw_init_msh_t(&_geom) ; + + jigsaw_msh_t _init ; + jigsaw_init_msh_t(&_init) ; + + jigsaw_msh_t _mesh ; + jigsaw_init_msh_t(&_mesh) ; + + /*-------------------------------- setup JIGSAW geom. */ + + jigsaw_VERT3_t _geom_vert3[8] = { // setup geom. + { {0., 0., 0.}, +0 } , + { {3., 0., 0.}, +0 } , + { {3., 3., 0.}, +0 } , + { {0., 3., 0.}, +0 } , + { {0., 0., 3.}, +0 } , + { {3., 0., 3.}, +0 } , + { {3., 3., 3.}, +0 } , + { {0., 3., 3.}, +0 } , + } ; + + jigsaw_TRIA3_t _geom_tria3[12] = { + { { 0, 1, 2}, +0 } , + { { 0, 2, 3}, +0 } , + { { 4, 5, 6}, +0 } , + { { 4, 6, 7}, +0 } , + { { 0, 1, 5}, +0 } , + { { 0, 5, 4}, +0 } , + { { 1, 2, 6}, +0 } , + { { 1, 6, 5}, +0 } , + { { 2, 3, 7}, +0 } , + { { 2, 7, 6}, +0 } , + { { 3, 7, 4}, +0 } , + { { 3, 4, 0}, +0 } , + } ; + + _geom._flags + = JIGSAW_EUCLIDEAN_MESH; + + _geom._vert3._data = &_geom_vert3[0] ; + _geom._vert3._size = +8 ; + + _geom._tria3._data = &_geom_tria3[0] ; + _geom._tria3._size = +12; + + /*-------------------------------- form init. config. */ + + jigsaw_VERT3_t _init_vert3[2] = { + { {0., 1.5, 1.25}, +0 } , + { {0., 1.5, 1.75}, +0 } , + } ; + + jigsaw_EDGE2_t _init_edge2[1] = { + { {+0, +1}, -1 } , // -1 => "un-refinable" + } ; + + _init._flags + = JIGSAW_EUCLIDEAN_MESH; + + _init._vert3._data = &_init_vert3[0] ; + _init._vert3._size = +2 ; + + _init._edge2._data = &_init_edge2[0] ; + _init._edge2._size = +1 ; + + /*-------------------------------- build JIGSAW tria. */ + + _jjig._verbosity = _verb; + + _jjig._hfun_hmax = 1./1.; + _jjig._hfun_scal = + JIGSAW_HFUN_RELATIVE; + + _jjig._mesh_rad2 = 1.50 ; + _jjig._mesh_rad3 = 2.50 ; + + _jjig._geom_feat = +1 ; // do "sharp" geom. + _jjig._mesh_top1 = +1 ; + + _jjig._mesh_dims = +3 ; // make 3-dim cell + + _retv = jigsaw ( + & _jjig , // the config. opt. + & _geom , // geom. data + & _init , // init. data + NULL , // empty hfun. obj. + & _mesh ) ; + + /*-------------------------------- print JIGSAW tria. */ + + if (_verb > 0 ) + output_msh_data_3(&_mesh); + + jigsaw_free_msh_t(&_mesh); + + printf ( + "[3d_e] JIGSAW returned code : %d \n", _retv) ; + + + return _retv ; + } + +# ifndef __SKIP_MAIN__ + int main () { return test3d_e(1) ; } +# endif//__SKIP_MAIN__ + + + diff --git a/external/jigsaw/uni/test3d_f.c b/external/jigsaw/uni/test3d_f.c new file mode 100644 index 0000000..ed44b6f --- /dev/null +++ b/external/jigsaw/uni/test3d_f.c @@ -0,0 +1,121 @@ + +// gcc -Wall -Wextra test3d_f.c -Xlinker -rpath=../lib +// -L ../lib -ljigsaw -o test3d_f + +// Uses TRIPOD to build a "restricted" DT, given a set +// points and a geometry in E^3. Compared to JIGSAW, +// TRIPOD computes a "restricted" triangulation (given +// a set of points a priori), rather than generating a +// mesh dynamically. + +# include "../inc/lib_jigsaw.h" + +# include "print.h" +# include "stdio.h" + + int test3d_f (int _verb) + { + int _retv = 0; + + /*-------------------------------- setup JIGSAW types */ + jigsaw_jig_t _jjig ; + jigsaw_init_jig_t(&_jjig) ; + + jigsaw_msh_t _geom ; + jigsaw_init_msh_t(&_geom) ; + + jigsaw_msh_t _init ; + jigsaw_init_msh_t(&_init) ; + + jigsaw_msh_t _tria ; + jigsaw_init_msh_t(&_tria) ; + + /*-------------------------------- setup JIGSAW geom. */ + + jigsaw_VERT3_t _geom_vert3[8] = { // setup geom. + { {0., 0., 0.}, +0 } , + { {5., 0., 0.}, +0 } , + { {5., 5., 0.}, +0 } , + { {0., 5., 0.}, +0 } , + { {0., 0., 5.}, +0 } , + { {5., 0., 5.}, +0 } , + { {5., 5., 5.}, +0 } , + { {0., 5., 5.}, +0 } , + } ; + + jigsaw_TRIA3_t _geom_tria3[12] = { + { { 0, 1, 2}, +0 } , + { { 0, 2, 3}, +0 } , + { { 4, 5, 6}, +0 } , + { { 4, 6, 7}, +0 } , + { { 0, 1, 5}, +0 } , + { { 0, 5, 4}, +0 } , + { { 1, 2, 6}, +0 } , + { { 1, 6, 5}, +0 } , + { { 2, 3, 7}, +0 } , + { { 2, 7, 6}, +0 } , + { { 3, 7, 4}, +0 } , + { { 3, 4, 0}, +0 } , + } ; + + _geom._flags + = JIGSAW_EUCLIDEAN_MESH; + + _geom._vert3._data = &_geom_vert3[0] ; + _geom._vert3._size = +8 ; + + _geom._tria3._data = &_geom_tria3[0] ; + _geom._tria3._size = +12; + + /*-------------------------------- form init. config. */ + + jigsaw_VERT3_t _init_vert3[9] = { + { {0., 0., 0.}, +0 } , + { {5., 0., 0.}, +0 } , + { {5., 5., 0.}, +0 } , + { {0., 5., 0.}, +0 } , + { {0., 0., 5.}, +0 } , + { {5., 0., 5.}, +0 } , + { {5., 5., 5.}, +0 } , + { {0., 5., 5.}, +0 } , + { {0., 0., 3.}, +0 } , + } ; + + _init._flags + = JIGSAW_EUCLIDEAN_MESH; + + _init._vert3._data = &_init_vert3[0] ; + _init._vert3._size = +9 ; + + /*-------------------------------- build TRIPOD r-DT. */ + + _jjig._verbosity = _verb; + + _jjig._mesh_dims = +3 ; + + _retv = tripod ( + & _jjig , // the config. opts + & _init , // init. data + & _geom , // geom. data + & _tria ) ; + + /*-------------------------------- print TRIPOD r-DT. */ + + if (_verb > 0 ) + output_msh_data_3(&_tria); + + jigsaw_free_msh_t(&_tria); + + printf ( + "[3d_f] TRIPOD returned code : %d \n", _retv) ; + + + return _retv ; + } + +# ifndef __SKIP_MAIN__ + int main () { return test3d_f(1) ; } +# endif//__SKIP_MAIN__ + + + diff --git a/external/jigsaw/uni/test3d_g.c b/external/jigsaw/uni/test3d_g.c new file mode 100644 index 0000000..559ce54 --- /dev/null +++ b/external/jigsaw/uni/test3d_g.c @@ -0,0 +1,79 @@ + +// gcc -Wall -Wextra test3d_g.c -Xlinker -rpath=../lib +// -L ../lib -ljigsaw -o test3d_g + +// Uses TRIPOD to build an (unconstrained) DT in E^3, +// comparable to more conventional Delaunay tessellation +// approaches. + +# include "../inc/lib_jigsaw.h" + +# include "print.h" +# include "stdio.h" + + int test3d_g (int _verb) + { + int _retv = 0; + + /*-------------------------------- setup JIGSAW types */ + jigsaw_jig_t _jjig ; + jigsaw_init_jig_t(&_jjig) ; + + jigsaw_msh_t _init ; + jigsaw_init_msh_t(&_init) ; + + jigsaw_msh_t _tria ; + jigsaw_init_msh_t(&_tria) ; + + /*-------------------------------- pts to triangulate */ + + jigsaw_VERT3_t _init_vert3[9] = { + { {0., 0., 0.}, +0 } , + { {5., 1., 0.}, +0 } , + { {5., 5., 1.}, +0 } , + { {2., 5., 0.}, +0 } , + { {0., 2., 5.}, +0 } , + { {5., 1., 5.}, +0 } , + { {5., 6., 5.}, +0 } , + { {0., 5., 5.}, +0 } , + { {1., 0., 3.}, +0 } , + } ; + + _init._flags + = JIGSAW_EUCLIDEAN_MESH; + + _init._vert3._data = &_init_vert3[0] ; + _init._vert3._size = +9 ; + + /*-------------------------------- build TRIPOD r-DT. */ + + _jjig._verbosity = _verb; + + _jjig._mesh_dims = +3 ; + + _retv = tripod ( + & _jjig , // the config. opts + & _init , // init. data + NULL , // empty geom. data + & _tria ) ; + + /*-------------------------------- print TRIPOD r-DT. */ + + if (_verb > 0 ) + output_msh_data_3(&_tria); + + jigsaw_free_msh_t(&_tria); + + printf ( + "[3d_g] TRIPOD returned code : %d \n", _retv) ; + + + return _retv ; + } + +# ifndef __SKIP_MAIN__ + int main () { return test3d_g(1) ; } +# endif//__SKIP_MAIN__ + + + diff --git a/external/jigsaw/uni/test_9.c b/external/jigsaw/uni/test_9.c deleted file mode 100644 index 9de3c5a..0000000 --- a/external/jigsaw/uni/test_9.c +++ /dev/null @@ -1,99 +0,0 @@ - -// gcc -Wall -Wextra test_9.c -Xlinker -rpath=../lib -// -L ../lib -ljigsaw -o test_9 - -// Use JIGSAW to generate a uniform mesh for a spheroidal -// domain. - -# include "../inc/lib_jigsaw.h" - -# include "stdio.h" - - int main () - { - int _retv = 0; - - /*-------------------------------- setup JIGSAW types */ - jigsaw_jig_t _jjig ; - jigsaw_init_jig_t(&_jjig) ; - - jigsaw_msh_t _geom ; - jigsaw_init_msh_t(&_geom) ; - - jigsaw_msh_t _mesh ; - jigsaw_init_msh_t(&_mesh) ; - - /*-------------------------------- setup JIGSAW geom. */ - - real_t _radii[3] = {+1., +1., +1. - } ; - - _geom._flags = - JIGSAW_ELLIPSOID_MESH ; - - _geom._radii._data = &_radii[0] ; - _geom._radii._size = +3 ; - - /*-------------------------------- build JIGSAW tria. */ - - _jjig._verbosity = +1 ; - - _jjig._hfun_hmax = 0.80 ; - _jjig._hfun_scal = - JIGSAW_HFUN_ABSOLUTE; - - _jjig._mesh_dims = +2 ; - - _retv = jigsaw ( - &_jjig , // the config. opts - &_geom , // geom. data - NULL , // empty init. data - NULL , // empty hfun. data - &_mesh ) ; - - /*-------------------------------- print JIGSAW tria. */ - - printf("\n VERT3: \n\n") ; - - for (size_t _ipos = +0; - _ipos != _mesh._vert3._size ; - ++_ipos ) - { - printf( - "%1.4f, %1.4f, %1.4f\n", - _mesh._vert3. - _data[_ipos]._ppos[0], - _mesh._vert3. - _data[_ipos]._ppos[1], - _mesh._vert3. - _data[_ipos]._ppos[2] - ) ; - } - - printf("\n TRIA3: \n\n") ; - - for (size_t _ipos = +0; - _ipos != _mesh._tria3._size ; - ++_ipos ) - { - printf("%d, %d, %d\n", - _mesh._tria3. - _data[_ipos]._node[0], - _mesh._tria3. - _data[_ipos]._node[1], - _mesh._tria3. - _data[_ipos]._node[2] - ) ; - } - - jigsaw_free_msh_t(&_mesh); - - printf ( - "JIGSAW returned code : %d \n",_retv); - - - return _retv ; - } - - - diff --git a/external/jigsaw/uni/test_all.c b/external/jigsaw/uni/test_all.c new file mode 100644 index 0000000..fbbce67 --- /dev/null +++ b/external/jigsaw/uni/test_all.c @@ -0,0 +1,108 @@ + +// gcc -Wall -Wextra test_all.c -Xlinker -rpath=../lib +// -L ../lib -ljigsaw -o test_all + +// Call all unit tests and bail-out on any failed runs + +# define __SKIP_MAIN__ + +# include "test2d_a.c" +# include "test2d_b.c" +# include "test2d_c.c" +# include "test2d_d.c" +# include "test2d_e.c" +# include "test2d_f.c" +# include "test2d_g.c" +# include "test2d_h.c" +# include "test2d_i.c" + +# include "test2s_a.c" +# include "test2s_b.c" +# include "test2s_c.c" +// include "test2s_d.c" +# include "test2s_e.c" +# include "test2s_f.c" +# include "test2s_g.c" +# include "test2s_h.c" +# include "test2s_i.c" + +# include "test3d_a.c" +# include "test3d_b.c" +# include "test3d_c.c" +# include "test3d_d.c" +# include "test3d_e.c" +# include "test3d_f.c" +# include "test3d_g.c" +// include "test3d_h.c" +// include "test3d_i.c" + + int main () + { + int _retv = 0; + int _verb =-1; // verbosity + + /*---------------------------------- run all 2d tests */ + if ((_retv = test2d_a(_verb)) != 0) + return _retv ; + if ((_retv = test2d_b(_verb)) != 0) + return _retv ; + if ((_retv = test2d_c(_verb)) != 0) + return _retv ; + if ((_retv = test2d_d(_verb)) != 0) + return _retv ; + if ((_retv = test2d_e(_verb)) != 0) + return _retv ; + if ((_retv = test2d_f(_verb)) != 0) + return _retv ; + if ((_retv = test2d_g(_verb)) != 0) + return _retv ; + if ((_retv = test2d_h(_verb)) != 0) + return _retv ; + if ((_retv = test2d_i(_verb)) != 0) + return _retv ; + + /*---------------------------------- run all 2s tests */ + if ((_retv = test2s_a(_verb)) != 0) + return _retv ; + if ((_retv = test2s_b(_verb)) != 0) + return _retv ; + if ((_retv = test2s_c(_verb)) != 0) + return _retv ; + // if ((_retv = test2s_d(_verb)) != 0) + // return _retv ; + if ((_retv = test2s_e(_verb)) != 0) + return _retv ; + if ((_retv = test2s_f(_verb)) != 0) + return _retv ; + if ((_retv = test2s_g(_verb)) != 0) + return _retv ; + if ((_retv = test2s_h(_verb)) != 0) + return _retv ; + if ((_retv = test2s_i(_verb)) != 0) + return _retv ; + + /*---------------------------------- run all 3d tests */ + if ((_retv = test3d_a(_verb)) != 0) + return _retv ; + if ((_retv = test3d_b(_verb)) != 0) + return _retv ; + if ((_retv = test3d_c(_verb)) != 0) + return _retv ; + if ((_retv = test3d_d(_verb)) != 0) + return _retv ; + if ((_retv = test3d_e(_verb)) != 0) + return _retv ; + if ((_retv = test3d_f(_verb)) != 0) + return _retv ; + if ((_retv = test3d_g(_verb)) != 0) + return _retv ; + // if ((_retv = test3d_h(_verb)) != 0) + // return _retv ; + // if ((_retv = test3d_i(_verb)) != 0) + // return _retv ; + + return _retv ; + } + + + diff --git a/external/jigsaw/version.txt b/external/jigsaw/version.txt index 6d7c0aa..7934a70 100644 --- a/external/jigsaw/version.txt +++ b/external/jigsaw/version.txt @@ -13,21 +13,38 @@ # JIGSAW: an unstructured mesh generation library #------------------------------------------------------------ + * Version 1.0.0: + + - Initial support for thread-parallelism in optim. + phase. + + * Version 0.9.15: -------------- - Use of "symmetric" Gauss-Seidel sweeping within mesh optimisation kernels. + - New "skewed-cosine" optimisation metric, useful + to build "well-centred" primal-dual meshes. + + - New "momentum" type optimisation approach, with + the two-parameter quasi-hyperbolic method (QHM) + implemented. + + - Support "masked-out" entries in MARCHE solvers. + - Fix a point-location bug wrt. unstructured h(x) data types. - Modify refinement rules to "defer" insertion of points that encroach on boundaries. (Typically) - leads to slightly sparser tessellatons. + leads to slightly sparser tessellations. - Support ellipsoidal-type initial conditions. + - Translate-to-origin to reduce precision issues. + - BREAKING: encode h(x) values as 32-bit floating point data, to support "very-large" h(x) types. diff --git a/jigsawpy/__init__.py b/jigsawpy/__init__.py index f3e2ce0..67f8f9b 100644 --- a/jigsawpy/__init__.py +++ b/jigsawpy/__init__.py @@ -13,9 +13,9 @@ * JIGSAW: Interface to the JIGSAW meshing library. ------------------------------------------------------------ * - * Last updated: 19 Apr., 2021 + * Last updated: 10 Jan., 2023 * - * Copyright 2019-2021 + * Copyright 2019-2023 * Darren Engwirda * d.engwirda@gmail.com * https://github.com/dengwirda @@ -40,12 +40,16 @@ * how they can obtain it for free, then you are not * required to make any arrangement with me.) * - * Disclaimer: Neither I nor: Columbia University, The - * Massachusetts Institute of Technology, The - * University of Sydney, nor The National Aeronautics - * and Space Administration warrant this code in any - * way whatsoever. This code is provided "as-is" to be - * used at your own risk. + * Disclaimer: Neither I nor THE CONTRIBUTORS warrant + * this code in any way whatsoever. This code is + * provided "as-is" to be used at your own risk. + * + * THE CONTRIBUTORS include: + * (a) The University of Sydney + * (b) The Massachusetts Institute of Technology + * (c) Columbia University + * (d) The National Aeronautics & Space Administration + * (e) Los Alamos National Laboratory * ------------------------------------------------------------ """ diff --git a/jigsawpy/bisect.py b/jigsawpy/bisect.py index 6f21e8b..d677356 100644 --- a/jigsawpy/bisect.py +++ b/jigsawpy/bisect.py @@ -47,7 +47,7 @@ def bisect(mesh): """ if (not isinstance(mesh, jigsaw_msh_t)): - raise Exception( + raise TypeError( "Incorrect type: MESH.") certify(mesh) diff --git a/jigsawpy/certify.py b/jigsawpy/certify.py index 1d09493..311aa7c 100644 --- a/jigsawpy/certify.py +++ b/jigsawpy/certify.py @@ -10,7 +10,7 @@ def certifyarray(data, stag): return data.size >= +1 - raise Exception("Invalid " + stag + " type.") + raise TypeError("Invalid " + stag + " type.") return False @@ -18,19 +18,19 @@ def certifyarray(data, stag): def certifyradii(data, stag): if (data.size != +3): - raise Exception("Invalid " + stag + " size.") + raise ValueError("Invalid " + stag + " size.") if (data.ndim != +1): - raise Exception("Invalid " + stag + " size.") + raise ValueError("Invalid " + stag + " size.") if (data.dtype != jigsaw_msh_t.REALS_t): - raise Exception("Invalid " + stag + " type.") + raise TypeError("Invalid " + stag + " type.") if (not np.isfinite(data).all()): - raise Exception("Invalid " + stag + " data.") + raise ValueError("Invalid " + stag + " data.") if (np.any(data <= 0.)): - raise Exception("Invalid " + stag + " data.") + raise ValueError("Invalid " + stag + " data.") return @@ -38,16 +38,16 @@ def certifyradii(data, stag): def certifypoint(data, stag, KIND): if (data.ndim != +1): - raise Exception("Invalid " + stag + " size.") + raise ValueError("Invalid " + stag + " size.") if (data.dtype != KIND): - raise Exception("Invalid " + stag + " type.") + raise TypeError("Invalid " + stag + " type.") if (not np.isfinite(data["coord"]).all()): - raise Exception("Invalid " + stag + " data.") + raise ValueError("Invalid " + stag + " data.") if (not np.isfinite(data["IDtag"]).all()): - raise Exception("Invalid " + stag + " data.") + raise ValueError("Invalid " + stag + " data.") return @@ -56,10 +56,10 @@ def certifyvalue(vals, stag): if (vals.dtype != jigsaw_msh_t.REALS_t and vals.dtype != jigsaw_msh_t.FLT32_t): - raise Exception("Invalid " + stag + " type.") + raise TypeError("Invalid " + stag + " type.") if (not np.isfinite(vals).all()): - raise Exception("Invalid " + stag + " data.") + raise ValueError("Invalid " + stag + " data.") return @@ -67,19 +67,19 @@ def certifyvalue(vals, stag): def certifycells(cell, stag, KIND): if (cell.ndim != +1): - raise Exception("Invalid " + stag + " size.") + raise ValueError("Invalid " + stag + " size.") if (cell.dtype != KIND): - raise Exception("Invalid " + stag + " type.") + raise TypeError("Invalid " + stag + " type.") if (not np.isfinite(cell["index"]).all()): - raise Exception("Invalid " + stag + " data.") + raise ValueError("Invalid " + stag + " data.") if (np.any(cell["index"] < +0)): - raise Exception("Invalid " + stag + " data.") + raise ValueError("Invalid " + stag + " data.") if (not np.isfinite(cell["IDtag"]).all()): - raise Exception("Invalid " + stag + " data.") + raise ValueError("Invalid " + stag + " data.") return @@ -87,25 +87,25 @@ def certifycells(cell, stag, KIND): def certifyindex(data, stag, KIND): if (data.ndim != +1): - raise Exception("Invalid " + stag + " size.") + raise ValueError("Invalid " + stag + " size.") if (data.dtype != KIND): - raise Exception("Invalid " + stag + " type.") + raise TypeError("Invalid " + stag + " type.") if (not np.isfinite(data["IDtag"]).all()): - raise Exception("Invalid " + stag + " data.") + raise ValueError("Invalid " + stag + " data.") if (not np.isfinite(data["index"]).all()): - raise Exception("Invalid " + stag + " data.") + raise ValueError("Invalid " + stag + " data.") if (np.any(data["index"] < +0)): - raise Exception("Invalid " + stag + " data.") + raise ValueError("Invalid " + stag + " data.") if (not np.isfinite(data["cells"]).all()): - raise Exception("Invalid " + stag + " data.") + raise ValueError("Invalid " + stag + " data.") if (np.any(data["cells"] < +0)): - raise Exception("Invalid " + stag + " data.") + raise ValueError("Invalid " + stag + " data.") return @@ -194,13 +194,13 @@ def certifymesht(mesh): def certifycoord(data, stag): if (data.ndim != +1): - raise Exception("Invalid " + stag + " size.") + raise ValueError("Invalid " + stag + " size.") if (data.dtype != jigsaw_msh_t.REALS_t): - raise Exception("Invalid " + stag + " type.") + raise TypeError("Invalid " + stag + " type.") if (not np.isfinite(data).all()): - raise Exception("Invalid " + stag + " data.") + raise ValueError("Invalid " + stag + " data.") return @@ -209,18 +209,18 @@ def certifyNDmat(data, stag, dims): if (data.size > 1 and data.ndim != len(dims)): - raise Exception("Invalid " + stag + " size.") + raise ValueError("Invalid " + stag + " size.") if (data.size > 1 and data.size != np.prod(dims)): - raise Exception("Invalid " + stag + " size.") + raise ValueError("Invalid " + stag + " size.") if (data.dtype != jigsaw_msh_t.REALS_t and data.dtype != jigsaw_msh_t.FLT32_t): - raise Exception("Invalid " + stag + " type.") + raise TypeError("Invalid " + stag + " type.") if (not np.isfinite(data).all()): - raise Exception("Invalid " + stag + " data.") + raise ValueError("Invalid " + stag + " data.") return @@ -273,10 +273,10 @@ def certify(mesh): if (mesh is None): return if (not isinstance(mesh, jigsaw_msh_t)): - raise Exception("Invalid MESH structure.") + raise TypeError("Invalid MESH structure.") if (not isinstance(mesh.mshID, str)): - raise Exception("Invalid MESH.MSHID tag.") + raise TypeError("Invalid MESH.MSHID tag.") if (mesh.mshID.lower() in ["euclidean-mesh", "ellipsoid-mesh"]): @@ -291,6 +291,6 @@ def certify(mesh): certifygridt(mesh) else: - raise Exception("Invalid MESH.MSHID tag.") + raise ValueError("Invalid MESH.MSHID tag.") return diff --git a/jigsawpy/def_t.py b/jigsawpy/def_t.py index a2a232d..aaa313f 100644 --- a/jigsawpy/def_t.py +++ b/jigsawpy/def_t.py @@ -9,14 +9,19 @@ class jigsaw_def_t: #--------------------------------- return codes for JIGSAW . - JIGSAW_UNKNOWN_ERROR = +1 + JIGSAW_UNKNOWN_ERROR = -1 JIGSAW_NO_ERROR = +0 JIGSAW_FILE_NOT_LOCATED = +2 JIGSAW_FILE_NOT_CREATED = +3 + JIGSAW_NETCDF_NOT_FOUND = +9 + JIGSAW_INVALID_ARGUMENT = +4 + JIGSAW_INVALID_INDEXING = +5 + JIGSAW_INVALID_USEROPTS = +6 + JIGSAW_INVALID_ARRAYDIM = +7 #--------------------------------- constants for libJIGSAW . @@ -51,3 +56,6 @@ class jigsaw_def_t: JIGSAW_KERN_ODT_DQDX = +404 JIGSAW_KERN_CVT_DQDX = +405 JIGSAW_KERN_H95_DQDX = +406 + + JIGSAW_KERN_AREA_LEN = +410 + JIGSAW_KERN_SKEW_COS = +411 diff --git a/jigsawpy/jig_l.py b/jigsawpy/jig_l.py index 33946cc..c1287a8 100644 --- a/jigsawpy/jig_l.py +++ b/jigsawpy/jig_l.py @@ -14,6 +14,12 @@ class libsaw_jig_t(ct.Structure): ("verbosity", indx_t), + # NUMTHREAD - {default=0} control for thread-parallel + # implementations. Set NUMTHREAD <= 0 to autodetect a + # machine's max-thread allocation. + + ("numthread", indx_t), + # GEOM-SEED - {default = 8} number of "seed" vertices # used to initialise mesh generation. @@ -222,6 +228,34 @@ class libsaw_jig_t(ct.Structure): ("optm_iter", indx_t), + # OPTM_COST - {default='area-len'} mesh optimisation + # cost metric, choice of area-length (COST='area-len') + # or skewed-cosine (COST='skew-cos') functions. + # The area-length metric is symmetric wrt. both small + # and large cell angles, and is typically appropriate + # for simplex-only meshes. The skewed-cosine metric + # is based on an asymmetric penalisation of large cell + # angles, and may be useful for staggered primal-dual + # tessellations. + + ("optm_cost", indx_t), + + # OPTM_BETA - {default=0.4667} "momentum"-type weight + # for gradient descent updates, such that + # DX' = BETA * DX(K-1) + (1-BETA) * DX(K). + # Momentum typically improves the convergence of mesh + # optimisation. + + ("optm_beta", real_t), + + # OPTM_ZETA - {default=0.7500} "momentum"-type weight + # for search direction updates, such that + # DX* = ZETA * DX' (K) + (1-ZETA) * DX(K). + # Momentum typically improves the convergence of mesh + # optimisation. + + ("optm_zeta", real_t), + # OPTM_QTOL - {default=1.E-04} tolerance on mesh cost # function for convergence. Iteration on a given node # is terminated if adjacent element cost-functions are @@ -229,7 +263,7 @@ class libsaw_jig_t(ct.Structure): ("optm_qtol", real_t), - # OPTM_QLIM - {default=0.9375} threshold on mesh cost + # OPTM_QLIM - {default=0.9333} threshold on mesh cost # function above which gradient-based optimisation is # attempted. diff --git a/jigsawpy/jig_t.py b/jigsawpy/jig_t.py index b12658c..d61028e 100644 --- a/jigsawpy/jig_t.py +++ b/jigsawpy/jig_t.py @@ -176,12 +176,34 @@ isation iterations. Set ITER=N to see progress after N iterations. + OPTS.OPTM_COST - {default='area-len'} mesh optimisation + cost metric, choice of area-length (COST='area-len') + or skewed-cosine (COST='skew-cos') functions. + The area-length metric is symmetric wrt. both small + and large cell angles, and is typically appropriate + for simplex-only meshes. The skewed-cosine metric + is based on an asymmetric penalisation of large cell + angles, and may be useful for staggered primal-dual + tessellations. + + OPTS.OPTM_BETA - {default=0.4950} "momentum"-type weight + for gradient descent updates, such that + DX' = BETA * DX(K-1) + (1-BETA) * DX(K). + Momentum typically improves the convergence of mesh + optimisation. + + OPTS.OPTM_ZETA - {default=0.8250} "momentum"-type weight + for search direction updates, such that + DX* = ZETA * DX' (K) + (1-ZETA) * DX(K). + Momentum typically improves the convergence of mesh + optimisation. + OPTS.OPTM_QTOL - {default=1.E-04} tolerance on mesh cost function for convergence. Iteration on a given node is terminated if adjacent element cost-functions are improved by less than QTOL. - OPTS.OPTM_QLIM - {default=0.9375} threshold on mesh cost + OPTS.OPTM_QLIM - {default=0.9333} threshold on mesh cost function above which gradient-based optimisation is attempted. @@ -203,6 +225,10 @@ OPTS.VERBOSITY - {default=0} verbosity of log-file gene- rated by JIGSAW. Set VERBOSITY >= 1 for more output. + OPTS.NUMTHREAD - {default=0} control for thread-parallel + implementations. Set NUMTHREAD <= 0 to autodetect a + machine's max-thread allocation. + See also MSH_t @@ -216,6 +242,8 @@ def __init__(self): #------------------------------------------ MISC options self.verbosity = None + self.numthread = None + self.jcfg_file = None self.tria_file = None @@ -283,9 +311,14 @@ def __init__(self): #------------------------------------------ OPTM options self.optm_kern = None - + self.optm_iter = None + self.optm_cost = None + + self.optm_beta = None + self.optm_zeta = None + self.optm_qtol = None self.optm_qlim = None diff --git a/jigsawpy/jigsaw.py b/jigsawpy/jigsaw.py index d5646df..2fda9b7 100644 --- a/jigsawpy/jigsaw.py +++ b/jigsawpy/jigsaw.py @@ -41,11 +41,11 @@ def jigsaw(opts, mesh=None): jexename = Path() if (not isinstance(opts, jigsaw_jig_t)): - raise Exception("Incorrect type: OPTS.") + raise TypeError("Incorrect type: OPTS.") if (mesh is not None and not isinstance(mesh, jigsaw_msh_t)): - raise Exception("Incorrect type: MESH.") + raise TypeError("Incorrect type: MESH.") savejig(opts.jcfg_file, opts) @@ -87,7 +87,7 @@ def jigsaw(opts, mesh=None): else: - raise Exception("JIGSAW executable not found!") + raise ValueError("JIGSAW executable not found") return @@ -108,11 +108,11 @@ def tripod(opts, tria=None): jexename = Path() if (not isinstance(opts, jigsaw_jig_t)): - raise Exception("Incorrect type: OPTS.") + raise TypeError("Incorrect type: OPTS.") if (tria is not None and not isinstance(tria, jigsaw_msh_t)): - raise Exception("Incorrect type: TRIA.") + raise TypeError("Incorrect type: TRIA.") savejig(opts.jcfg_file, opts) @@ -154,7 +154,7 @@ def tripod(opts, tria=None): else: - raise Exception("TRIPOD executable not found!") + raise ValueError("TRIPOD executable not found") return @@ -182,11 +182,11 @@ def marche(opts, ffun=None): jexename = Path() if (not isinstance(opts, jigsaw_jig_t)): - raise Exception("Incorrect type: OPTS.") + raise TypeError("Incorrect type: OPTS.") if (ffun is not None and not isinstance(ffun, jigsaw_msh_t)): - raise Exception("Incorrect type: FFUN.") + raise TypeError("Incorrect type: FFUN.") savejig(opts.jcfg_file, opts) @@ -228,7 +228,7 @@ def marche(opts, ffun=None): else: - raise Exception("MARCHE executable not found!") + raise ValueError("MARCHE executable not found") return @@ -240,25 +240,23 @@ def jitter(opts, imax, ibad, mesh=None): """ if (not isinstance(opts, jigsaw_jig_t)): - raise Exception("Incorrect type: OPTS.") + raise TypeError("Incorrect type: OPTS.") if (mesh is not None and not isinstance(mesh, jigsaw_msh_t)): - raise Exception("Incorrect type: MESH.") + raise TypeError("Incorrect type: MESH.") if (mesh is None): mesh = jigsaw_msh_t() #--------- call JIGSAW iteratively; try to improve topology. OPTS = copy.deepcopy(opts) - best = metric(mesh); next = mesh; done = False - for iter in range(imax): - if (next.point is not None and - next.point.size != +0): + if (mesh.point is not None and + mesh.point.size != +0): - nvrt = next.point.size + nvrt = mesh.point.size keep = np.full( (nvrt), True, dtype=bool) @@ -274,53 +272,41 @@ def jitter(opts, imax, ibad, mesh=None): OPTS.init_file = str(path / name) - if (next.tria3 is not None and - next.tria3.size != +0): + if (mesh.tria3 is not None and + mesh.tria3.size != +0): #------------------------------ mark any irregular nodes vdeg = trideg2( - next.point["coord"], - next.tria3["index"]) + mesh.point["coord"], + mesh.tria3["index"]) ierr = np.abs(vdeg - 6) # err in topo. deg. ierr[vdeg > 6] = ierr[vdeg > 6] * 2 - ierr = ierr[next.tria3["index"]] + ierr = ierr[mesh.tria3["index"]] M = np.sum(ierr, axis=1) >= ibad - keep[next.tria3["index"][M, :]] = False + keep[mesh.tria3["index"][M, :]] = False - if (next.edge2 is not None and - next.edge2.size != +0): + if (mesh.edge2 is not None and + mesh.edge2.size != +0): - keep[next.edge2["index"][:, :]] = False + keep[mesh.edge2["index"][:, :]] = True - if (np.count_nonzero(keep) <= +8): + if (np.count_nonzero(keep) <= 32): #------------------------------ don't delete everything! keep = np.full( (nvrt), True, dtype=bool) - done = np.all(keep) - #------------------------------ keep nodes far from seam init = jigsaw_msh_t() - init.point = next.point[keep] + init.point = mesh.point[keep] - savemsh(OPTS.init_file, init, - OPTS.mesh_tags) + savemsh(OPTS.init_file, init) #------------------------------ call JIGSAW with new ICs - jigsaw (OPTS, next) # noqa - - cost = metric(next) - - if (cost > best): - #------------------------------ keep "best" mesh so far! - mesh = copy.deepcopy(next) - best = cost - - if (done): return + jigsaw (OPTS, mesh) # noqa return @@ -332,23 +318,24 @@ def tetris(opts, nlev, mesh=None): """ if (not isinstance(opts, jigsaw_jig_t)): - raise Exception("Incorrect type: OPTS.") + raise TypeError("Incorrect type: OPTS.") if (mesh is not None and not isinstance(mesh, jigsaw_msh_t)): - raise Exception("Incorrect type: MESH.") + raise TypeError("Incorrect type: MESH.") + + if (mesh is None): mesh = jigsaw_msh_t() #---------------------------- call JIGSAW via inc. bisection SCAL = +2. ** nlev OPTS = copy.deepcopy(opts) - flag = +1 - + while (nlev >= +0): if (opts.optm_qlim is not None): #------------------------ create/write current QLIM data scal = min( - 2.0, (nlev + 1) ** (1. / 4.)) + 2.0, (nlev + 1) ** (1. / 8.)) QLIM = opts.optm_qlim @@ -356,9 +343,9 @@ def tetris(opts, nlev, mesh=None): else: scal = min( - 2.0, (nlev + 1) ** (1. / 4.)) + 2.0, (nlev + 1) ** (1. / 8.)) - QLIM = 0.93750 + QLIM = 0.93333 OPTS.optm_qlim = QLIM / scal @@ -394,24 +381,10 @@ def tetris(opts, nlev, mesh=None): HFUN.value = HFUN.value * SCAL - savemsh(OPTS.hfun_file, HFUN, - OPTS.hfun_tags) + savemsh(OPTS.hfun_file, HFUN) - if (nlev <= 1 or flag == 0): #------------------------ call JIGSAW kernel at this lev - ninc = min(64, nlev ** 2) - - flag = +1 - - jitter(OPTS, 2 + ninc, 3, mesh) - - else: - - ninc = min(64, nlev ** 2) - - flag = +0 - - jitter(OPTS, 2 + ninc, 2, mesh) + jitter(OPTS, 4 + (nlev > 0) * 44, 3, mesh) nlev = nlev - 1 SCAL = SCAL / 2. @@ -433,8 +406,7 @@ def tetris(opts, nlev, mesh=None): bisect(mesh) attach(mesh) - savemsh(OPTS.init_file, mesh, - OPTS.init_tags) + savemsh(OPTS.init_file, mesh) else: #------------------------ create/write current INIT data @@ -451,8 +423,7 @@ def tetris(opts, nlev, mesh=None): bisect(mesh) attach(mesh) - savemsh(OPTS.init_file, mesh, - OPTS.mesh_tags) + savemsh(OPTS.init_file, mesh) return @@ -464,11 +435,13 @@ def refine(opts, nlev, mesh=None): """ if (not isinstance(opts, jigsaw_jig_t)): - raise Exception("Incorrect type: OPTS.") + raise TypeError("Incorrect type: OPTS.") if (mesh is not None and not isinstance(mesh, jigsaw_msh_t)): - raise Exception("Incorrect type: MESH.") + raise TypeError("Incorrect type: MESH.") + + if (mesh is None): mesh = jigsaw_msh_t() #---------------------------- call JIGSAW via inc. bisection opts.mesh_iter = +0 @@ -501,28 +474,30 @@ def refine(opts, nlev, mesh=None): bisect(mesh) attach(mesh) - savemsh(opts.init_file, mesh, - opts.mesh_tags) + savemsh(opts.init_file, mesh) return -def icosahedron(opts, nlev, mesh): +def icosahedron(opts, nlev, mesh=None): """ ICOSAHEDRON Nth-level icosahedral mesh of the ellipsoid. """ if (not isinstance(opts, jigsaw_jig_t)): - raise Exception("Incorrect type: OPTS.") + raise TypeError("Incorrect type: OPTS.") - if (not isinstance(mesh, jigsaw_msh_t)): - raise Exception("Incorrect type: MESH.") + if (mesh is not None and not + isinstance(mesh, jigsaw_msh_t)): + raise TypeError("Incorrect type: MESH.") geom = jigsaw_msh_t() loadmsh(opts.geom_file, geom) + if (mesh is None): mesh = jigsaw_msh_t() + #-------------------------------- setup icosahedron geometry la = math.atan(0.5) @@ -585,22 +560,25 @@ def icosahedron(opts, nlev, mesh): return -def cubedsphere(opts, nlev, mesh): +def cubedsphere(opts, nlev, mesh=None): """ CUBEDSPHERE Nth-level cubedsphere mesh of the ellipsoid. """ if (not isinstance(opts, jigsaw_jig_t)): - raise Exception("Incorrect type: OPTS.") + raise TypeError("Incorrect type: OPTS.") - if (not isinstance(mesh, jigsaw_msh_t)): - raise Exception("Incorrect type: MESH.") + if (mesh is not None and not + isinstance(mesh, jigsaw_msh_t)): + raise TypeError("Incorrect type: MESH.") geom = jigsaw_msh_t() loadmsh(opts.geom_file, geom) + if (mesh is None): mesh = jigsaw_msh_t() + #-------------------------------- setup cubedsphere geometry aval = math.atan( +math.sqrt(+2.0) / +2.0) diff --git a/jigsawpy/libsaw.py b/jigsawpy/libsaw.py index 24b1117..ca6faec 100644 --- a/jigsawpy/libsaw.py +++ b/jigsawpy/libsaw.py @@ -76,7 +76,7 @@ JLIB = ct.cdll.LoadLibrary(str(JLIBNAME)) else: - raise Exception("JIGSAW lib. not found!") + raise ValueError("JIGSAW lib. not found") def is_type_t(data, kind): @@ -94,7 +94,7 @@ def put_jig_t(jigt, jigl): if (jigt is None): return if (not isinstance(jigt, jigsaw_jig_t)): - raise Exception("OPTS not JIG_t") + raise TypeError("OPTS not JIG_t") #--------------------------------- assign "kernels" opt. if (isinstance(jigt.hfun_scal, str)): @@ -107,7 +107,7 @@ def put_jig_t(jigt, jigl): defs.JIGSAW_HFUN_RELATIVE elif (jigt.hfun_scal is not None): - raise Exception("HFUN-SCAL type") + raise TypeError("HFUN-SCAL type") if (isinstance(jigt.bnds_kern, str)): if (jigt.bnds_kern.lower() == "triacell"): @@ -119,7 +119,7 @@ def put_jig_t(jigt, jigl): defs.JIGSAW_BNDS_DUALCELL elif (jigt.bnds_kern is not None): - raise Exception("BNDS-KERN type") + raise TypeError("BNDS-KERN type") if (isinstance(jigt.mesh_kern, str)): if (jigt.mesh_kern.lower() == "delfront"): @@ -131,7 +131,7 @@ def put_jig_t(jigt, jigl): defs.JIGSAW_KERN_DELAUNAY elif (jigt.mesh_kern is not None): - raise Exception("MESH-KERN type") + raise TypeError("MESH-KERN type") if (isinstance(jigt.optm_kern, str)): if (jigt.optm_kern.lower() == "odt+dqdx"): @@ -147,168 +147,195 @@ def put_jig_t(jigt, jigl): defs.JIGSAW_KERN_H95_DQDX elif (jigt.optm_kern is not None): - raise Exception("OPTM-KERN type") + raise TypeError("OPTM-KERN type") + + if (isinstance(jigt.optm_cost, str)): + if (jigt.optm_cost.lower() == "area-len"): + jigl.optm_cost = \ + defs.JIGSAW_KERN_AREA_LEN + + if (jigt.optm_cost.lower() == "skew-cos"): + jigl.optm_cost = \ + defs.JIGSAW_KERN_SKEW_COS + + elif (jigt.optm_cost is not None): + raise TypeError("OPTM-COST type") #--------------------------------- assign MISC user-opt. if (is_type_t(jigt.verbosity, int)): jigl.verbosity = indx_t(jigt.verbosity) elif (jigt.verbosity is not None): - raise Exception("VERBOSITY type") + raise TypeError("VERBOSITY type") + + if (is_type_t(jigt.numthread, int)): + jigl.numthread = indx_t(jigt.numthread) + elif (jigt.numthread is not None): + raise TypeError("NUMTHREAD type") #--------------------------------- assign GEOM user-opt. if (is_type_t(jigt.geom_seed, int)): jigl.geom_seed = indx_t(jigt.geom_seed) elif (jigt.geom_seed is not None): - raise Exception("GEOM-SEED type") + raise TypeError("GEOM-SEED type") if (is_type_t(jigt.geom_feat, bool)): jigl.geom_feat = indx_t(jigt.geom_feat) elif (jigt.geom_feat is not None): - raise Exception("GEOM-FEAT type") + raise TypeError("GEOM-FEAT type") if (is_type_t(jigt.geom_eta1, float)): jigl.geom_eta1 = real_t(jigt.geom_eta1) elif (jigt.geom_eta1 is not None): - raise Exception("GEOM-ETA1 type") + raise TypeError("GEOM-ETA1 type") if (is_type_t(jigt.geom_eta2, float)): jigl.geom_eta2 = real_t(jigt.geom_eta2) elif (jigt.geom_eta2 is not None): - raise Exception("GEOM-ETA2 type") + raise TypeError("GEOM-ETA2 type") #--------------------------------- assign INIT user-opt. if (is_type_t(jigt.init_near, float)): jigl.init_near = real_t(jigt.init_near) elif (jigt.init_near is not None): - raise Exception("INIT-NEAR type") + raise TypeError("INIT-NEAR type") #--------------------------------- assign HFUN user-opt. if (is_type_t(jigt.hfun_hmax, float)): jigl.hfun_hmax = real_t(jigt.hfun_hmax) elif (jigt.hfun_hmax is not None): - raise Exception("HFUN-HMAX type") + raise TypeError("HFUN-HMAX type") if (is_type_t(jigt.hfun_hmin, float)): jigl.hfun_hmin = real_t(jigt.hfun_hmin) elif (jigt.hfun_hmin is not None): - raise Exception("HFUN-HMIN type") + raise TypeError("HFUN-HMIN type") #--------------------------------- assign MESH user-opt. if (is_type_t(jigt.mesh_dims, int)): jigl.mesh_dims = indx_t(jigt.mesh_dims) elif (jigt.mesh_dims is not None): - raise Exception("MESH-DIMS type") + raise TypeError("MESH-DIMS type") if (is_type_t(jigt.mesh_iter, int)): jigl.mesh_iter = indx_t(jigt.mesh_iter) elif (jigt.mesh_iter is not None): - raise Exception("MESH-ITER type") + raise TypeError("MESH-ITER type") if (is_type_t(jigt.mesh_top1, bool)): jigl.mesh_top1 = indx_t(jigt.mesh_top1) elif (jigt.mesh_top1 is not None): - raise Exception("MESH-TOP1 type") + raise TypeError("MESH-TOP1 type") if (is_type_t(jigt.mesh_top2, bool)): jigl.mesh_top2 = indx_t(jigt.mesh_top2) elif (jigt.mesh_top2 is not None): - raise Exception("MESH-TOP2 type") + raise TypeError("MESH-TOP2 type") if (is_type_t(jigt.mesh_rad2, float)): jigl.mesh_rad2 = real_t(jigt.mesh_rad2) elif (jigt.mesh_rad2 is not None): - raise Exception("MESH-RAD2 type") + raise TypeError("MESH-RAD2 type") if (is_type_t(jigt.mesh_rad3, float)): jigl.mesh_rad3 = real_t(jigt.mesh_rad3) elif (jigt.mesh_rad3 is not None): - raise Exception("MESH-RAD3 type") + raise TypeError("MESH-RAD3 type") if (is_type_t(jigt.mesh_siz1, float)): jigl.mesh_siz1 = real_t(jigt.mesh_siz1) elif (jigt.mesh_siz1 is not None): - raise Exception("MESH-SIZ1 type") + raise TypeError("MESH-SIZ1 type") if (is_type_t(jigt.mesh_siz2, float)): jigl.mesh_siz2 = real_t(jigt.mesh_siz2) elif (jigt.mesh_siz2 is not None): - raise Exception("MESH-SIZ2 type") + raise TypeError("MESH-SIZ2 type") if (is_type_t(jigt.mesh_siz3, float)): jigl.mesh_siz3 = real_t(jigt.mesh_siz3) elif (jigt.mesh_siz3 is not None): - raise Exception("MESH-SIZ3 type") + raise TypeError("MESH-SIZ3 type") if (is_type_t(jigt.mesh_off2, float)): jigl.mesh_off2 = real_t(jigt.mesh_off2) elif (jigt.mesh_off2 is not None): - raise Exception("MESH-OFF2 type") + raise TypeError("MESH-OFF2 type") if (is_type_t(jigt.mesh_off3, float)): jigl.mesh_off3 = real_t(jigt.mesh_off3) elif (jigt.mesh_off3 is not None): - raise Exception("MESH-OFF3 type") + raise TypeError("MESH-OFF3 type") if (is_type_t(jigt.mesh_snk2, float)): jigl.mesh_snk2 = real_t(jigt.mesh_snk2) elif (jigt.mesh_snk2 is not None): - raise Exception("MESH-SNK2 type") + raise TypeError("MESH-SNK2 type") if (is_type_t(jigt.mesh_snk3, float)): jigl.mesh_snk3 = real_t(jigt.mesh_snk3) elif (jigt.mesh_snk3 is not None): - raise Exception("MESH-SNK3 type") + raise TypeError("MESH-SNK3 type") if (is_type_t(jigt.mesh_eps1, float)): jigl.mesh_eps1 = real_t(jigt.mesh_eps1) elif (jigt.mesh_eps1 is not None): - raise Exception("MESH-EPS1 type") + raise TypeError("MESH-EPS1 type") if (is_type_t(jigt.mesh_eps2, float)): jigl.mesh_eps2 = real_t(jigt.mesh_eps2) elif (jigt.mesh_eps2 is not None): - raise Exception("MESH-EPS2 type") + raise TypeError("MESH-EPS2 type") if (is_type_t(jigt.mesh_vol3, float)): jigl.mesh_vol3 = real_t(jigt.mesh_vol3) elif (jigt.mesh_vol3 is not None): - raise Exception("MESH-VOL3 type") + raise TypeError("MESH-VOL3 type") #--------------------------------- assign OPTM user-opt. if (is_type_t(jigt.optm_iter, int)): jigl.optm_iter = indx_t(jigt.optm_iter) elif (jigt.optm_iter is not None): - raise Exception("OPTM-ITER type") + raise TypeError("OPTM-ITER type") + + if (is_type_t(jigt.optm_beta, float)): + jigl.optm_beta = real_t(jigt.optm_beta) + elif (jigt.optm_beta is not None): + raise TypeError("OPTM-BETA type") + + if (is_type_t(jigt.optm_zeta, float)): + jigl.optm_zeta = real_t(jigt.optm_zeta) + elif (jigt.optm_zeta is not None): + raise TypeError("OPTM-ZETA type") if (is_type_t(jigt.optm_qtol, float)): jigl.optm_qtol = real_t(jigt.optm_qtol) elif (jigt.optm_qtol is not None): - raise Exception("OPTM-QTOL type") + raise TypeError("OPTM-QTOL type") if (is_type_t(jigt.optm_qlim, float)): jigl.optm_qlim = real_t(jigt.optm_qlim) elif (jigt.optm_qlim is not None): - raise Exception("OPTM-QLIM type") + raise TypeError("OPTM-QLIM type") if (is_type_t(jigt.optm_tria, bool)): jigl.optm_tria = indx_t(jigt.optm_tria) elif (jigt.optm_tria is not None): - raise Exception("OPTM-TRIA type") + raise TypeError("OPTM-TRIA type") if (is_type_t(jigt.optm_dual, bool)): jigl.optm_dual = indx_t(jigt.optm_dual) elif (jigt.optm_dual is not None): - raise Exception("OPTM-DUAL type") + raise TypeError("OPTM-DUAL type") if (is_type_t(jigt.optm_zip_, bool)): jigl.optm_zip_ = indx_t(jigt.optm_zip_) elif (jigt.optm_zip_ is not None): - raise Exception("OPTM-ZIP_ type") + raise TypeError("OPTM-ZIP_ type") if (is_type_t(jigt.optm_div_, bool)): jigl.optm_div_ = indx_t(jigt.optm_div_) elif (jigt.optm_div_ is not None): - raise Exception("OPTM-DIV_ type") + raise TypeError("OPTM-DIV_ type") return @@ -486,14 +513,10 @@ def put_msh_t(msht, mshl): msht.slope = np.asfortranarray( msht.slope, dtype=np.float32) - print(msht.slope.shape) - mshl.slope.size = msht.slope.size mshl.slope.data = \ put_ptr_t(msht.slope, fp32_t) - print(mshl.slope.size) - return @@ -709,7 +732,7 @@ def jigsaw(opts, geom, mesh, init=None, hfun=None): ct.byref(mmsh)) if (retv != +0): - raise Exception( + raise ValueError( "JIGSAW returned code: " + str(retv)) #--------------------------------- copy buffers to MSH_t @@ -763,7 +786,7 @@ def tripod(opts, init, tria, geom=None): ct.byref(tmsh)) if (retv != +0): - raise Exception( + raise ValueError( "TRIPOD returned code: " + str(retv)) #--------------------------------- copy buffers to MSH_t @@ -814,7 +837,7 @@ def marche(opts, ffun): ct.byref(fmsh)) if (retv != +0): - raise Exception( + raise ValueError( "MARCHE returned code: " + str(retv)) return diff --git a/jigsawpy/loadjig.py b/jigsawpy/loadjig.py index ceda699..3be3e03 100644 --- a/jigsawpy/loadjig.py +++ b/jigsawpy/loadjig.py @@ -18,10 +18,10 @@ def loadjig(name, opts): """ if (not isinstance(name, str)): - raise Exception("Incorrect type: NAME.") + raise TypeError("Incorrect type: NAME.") if (not isinstance(opts, jigsaw_jig_t)): - raise Exception("Incorrect type: OPTS.") + raise TypeError("Incorrect type: OPTS.") with Path(name).open("r") as fptr: while (True): @@ -43,6 +43,9 @@ def loadjig(name, opts): if (item == "VERBOSITY"): opts.verbosity = int(ltag[1]) + if (item == "NUMTHREAD"): + opts.numthread = int(ltag[1]) + if (item == "TRIA_FILE"): opts.tria_file = ltag[1].strip() @@ -141,10 +144,17 @@ def loadjig(name, opts): #-------------------------------------- OPTM options if (item == "OPTM_KERN"): opts.optm_kern = ltag[1].strip() + if (item == "OPTM_COST"): + opts.optm_cost = ltag[1].strip() if (item == "OPTM_ITER"): opts.optm_iter = int(ltag[1]) + if (item == "OPTM_BETA"): + opts.optm_beta = float(ltag[1]) + if (item == "OPTM_ZETA"): + opts.optm_zeta = float(ltag[1]) + if (item == "OPTM_QTOL"): opts.optm_qtol = float(ltag[1]) if (item == "OPTM_QLIM"): diff --git a/jigsawpy/loadmsh.py b/jigsawpy/loadmsh.py index dc4eebd..2e03011 100644 --- a/jigsawpy/loadmsh.py +++ b/jigsawpy/loadmsh.py @@ -40,7 +40,7 @@ def loadradii(mesh, fptr, ltag): mesh.radii[2] = float(rtag[2]) else: - raise Exception("Invalid RADII: " + ltag) + raise ValueError("Invalid RADII: " + ltag) return @@ -107,7 +107,7 @@ def loadpoint(mesh, fptr, ltag): mesh.vert3 = loadvert3(fptr, ltag) else: - raise Exception("Invalid NDIMS: " + ltag) + raise ValueError("Invalid NDIMS: " + ltag) return @@ -124,7 +124,7 @@ def loadseeds(mesh, fptr, ltag): mesh.seed3 = loadvert3(fptr, ltag) else: - raise Exception("Invalid NDIMS: " + ltag) + raise ValueError("Invalid NDIMS: " + ltag) return @@ -555,11 +555,11 @@ def sanitise_grid(mesh, data): #--------------------------- reshape data to 2-dim array if (mesh.xgrid is None or mesh.xgrid.size == 0): - raise Exception("Invalid XGRID") + raise ValueError("Invalid XGRID") if (mesh.ygrid is None or mesh.ygrid.size == 0): - raise Exception("Invalid YGRID") + raise ValueError("Invalid YGRID") num1 = mesh.ygrid.size num2 = mesh.xgrid.size @@ -577,15 +577,15 @@ def sanitise_grid(mesh, data): #--------------------------- reshape data to 3-dim array if (mesh.xgrid is None or mesh.xgrid.size == 0): - raise Exception("Invalid XGRID") + raise ValueError("Invalid XGRID") if (mesh.ygrid is None or mesh.ygrid.size == 0): - raise Exception("Invalid YGRID") + raise ValueError("Invalid YGRID") if (mesh.zgrid is None or mesh.zgrid.size == 0): - raise Exception("Invalid ZGRID") + raise ValueError("Invalid ZGRID") num1 = mesh.ygrid.size num2 = mesh.xgrid.size @@ -618,10 +618,10 @@ def loadmsh(name, mesh): """ if (not isinstance(name, str)): - raise Exception("Incorrect type: NAME.") + raise TypeError("Incorrect type: NAME.") if (not isinstance(mesh, jigsaw_msh_t)): - raise Exception("Incorrect type: MESH.") + raise TypeError("Incorrect type: MESH.") with Path(name).open("r") as fptr: while (True): diff --git a/jigsawpy/msh_t.py b/jigsawpy/msh_t.py index b08d1b6..d325d33 100644 --- a/jigsawpy/msh_t.py +++ b/jigsawpy/msh_t.py @@ -229,7 +229,7 @@ def point(self, verts): self.vert3 = verts; return - raise Exception("Invalid POINT type") + raise TypeError("Invalid POINT type") @property def seeds(self): @@ -257,4 +257,4 @@ def seeds(self, seeds): self.seed3 = seeds; return - raise Exception("Invalid SEEDS type") + raise TypeError("Invalid SEEDS type") diff --git a/jigsawpy/parse/saveoff.py b/jigsawpy/parse/saveoff.py index 8730eaf..c0c02e0 100644 --- a/jigsawpy/parse/saveoff.py +++ b/jigsawpy/parse/saveoff.py @@ -162,10 +162,10 @@ def saveoff(name, mesh): """ if (not isinstance(name, str)): - raise Exception("Incorrect type: NAME.") + raise TypeError("Incorrect type: NAME.") if (not isinstance(mesh, jigsaw_msh_t)): - raise Exception("Incorrect type: MESH.") + raise TypeError("Incorrect type: MESH.") certify(mesh) @@ -186,7 +186,7 @@ def saveoff(name, mesh): save_mesh_file(mesh, fptr) else: - raise Exception( + raise ValueError( "MESH.mshID is not supported!!") return diff --git a/jigsawpy/parse/savevtk.py b/jigsawpy/parse/savevtk.py index 2e205e5..a31cbd7 100644 --- a/jigsawpy/parse/savevtk.py +++ b/jigsawpy/parse/savevtk.py @@ -356,10 +356,10 @@ def savevtk(name, mesh): """ if (not isinstance(name, str)): - raise Exception("Incorrect type: NAME.") + raise TypeError("Incorrect type: NAME.") if (not isinstance(mesh, jigsaw_msh_t)): - raise Exception("Incorrect type: MESH.") + raise TypeError("Incorrect type: MESH.") certify(mesh) @@ -388,7 +388,7 @@ def savevtk(name, mesh): save_grid_file(mesh, fptr) else: - raise Exception( + raise ValueError( "MESH.mshID is not supported!!") return diff --git a/jigsawpy/parse/savewav.py b/jigsawpy/parse/savewav.py index 1f6ced8..f7ac9dc 100644 --- a/jigsawpy/parse/savewav.py +++ b/jigsawpy/parse/savewav.py @@ -130,10 +130,10 @@ def savewav(name, mesh): """ if (not isinstance(name, str)): - raise Exception("Incorrect type: NAME.") + raise TypeError("Incorrect type: NAME.") if (not isinstance(mesh, jigsaw_msh_t)): - raise Exception("Incorrect type: MESH.") + raise TypeError("Incorrect type: MESH.") certify(mesh) @@ -154,7 +154,7 @@ def savewav(name, mesh): save_mesh_file(mesh, fptr) else: - raise Exception( + raise ValueError( "MESH.mshID is not supported!!") return diff --git a/jigsawpy/project.py b/jigsawpy/project.py index 839d7cd..e4c5a1c 100644 --- a/jigsawpy/project.py +++ b/jigsawpy/project.py @@ -27,13 +27,13 @@ def project(mesh, proj, sign): """ if (not isinstance(mesh, jigsaw_msh_t)): - raise Exception("Incorrect type: MESH.") + raise TypeError("Incorrect type: MESH.") if (not isinstance(proj, jigsaw_prj_t)): - raise Exception("Incorrect type: PROJ.") + raise TypeError("Incorrect type: PROJ.") if (not isinstance(sign, str)): - raise Exception("Incorrect type: SIGN.") + raise TypeError("Incorrect type: SIGN.") certify(mesh) @@ -67,7 +67,7 @@ def project(mesh, proj, sign): else: - raise Exception( + raise ValueError( "Projection operator not suppoted.") #----------------------------------- setup proj.'d object @@ -88,7 +88,7 @@ def project(mesh, proj, sign): else: - raise Exception( + raise ValueError( "Incorrect projection PRJID flags.") mesh.point["coord"][:, 0] = XNEW @@ -140,7 +140,7 @@ def project(mesh, proj, sign): else: - raise Exception( + raise ValueError( "Projection operator not suppoted.") #----------------------------------- setup proj.'d object @@ -164,7 +164,7 @@ def project(mesh, proj, sign): else: - raise Exception( + raise ValueError( "Incorrect projection PRJID flags.") mesh.point["IDtag"] = +0 diff --git a/jigsawpy/savejig.py b/jigsawpy/savejig.py index 5d95ca4..3cb9fef 100644 --- a/jigsawpy/savejig.py +++ b/jigsawpy/savejig.py @@ -8,7 +8,7 @@ def savechar(fptr, sval, stag): if (isinstance(sval, str)): fptr.write(" " + stag + "=" + sval + "\n") else: - raise Exception( + raise TypeError( "Invalid [CHARA] data: OPTS." + stag) return @@ -20,7 +20,7 @@ def saveints(fptr, ival, stag): fptr.write( " " + stag + "=" + str(ival) + "\n") else: - raise Exception( + raise TypeError( "Invalid [INDEX] data: OPTS." + stag) return @@ -32,7 +32,7 @@ def savereal(fptr, fval, stag): fptr.write( " " + stag + "=" + str(fval) + "\n") else: - raise Exception( + raise TypeError( "Invalid [FLOAT] data: OPTS." + stag) return @@ -46,7 +46,7 @@ def savebool(fptr, bval, stag): else: fptr.write(" " + stag + "=FALSE\n") else: - raise Exception( + raise TypeError( "Invalid [BOOLS] data: OPTS." + stag) return @@ -67,10 +67,10 @@ def savejig(name, opts): """ if (not isinstance(name, str)): - raise Exception("Incorrect type: NAME.") + raise TypeError("Incorrect type: NAME.") if (not isinstance(opts, jigsaw_jig_t)): - raise Exception("Incorrect type: OPTS.") + raise TypeError("Incorrect type: OPTS.") fext = Path(name).suffix @@ -87,6 +87,9 @@ def savejig(name, opts): if (opts.verbosity is not None): saveints(fptr, opts.verbosity, "VERBOSITY") + if (opts.numthread is not None): + saveints(fptr, opts.numthread, "NUMTHREAD") + if (opts.tria_file is not None): savechar(fptr, opts.tria_file, "TRIA_FILE") if (opts.bnds_file is not None): @@ -184,10 +187,17 @@ def savejig(name, opts): #------------------------------------------ OPTM options if (opts.optm_kern is not None): savechar(fptr, opts.optm_kern, "OPTM_KERN") + if (opts.optm_cost is not None): + savechar(fptr, opts.optm_cost, "OPTM_COST") if (opts.optm_iter is not None): saveints(fptr, opts.optm_iter, "OPTM_ITER") + if (opts.optm_beta is not None): + savereal(fptr, opts.optm_beta, "OPTM_BETA") + if (opts.optm_zeta is not None): + savereal(fptr, opts.optm_zeta, "OPTM_ZETA") + if (opts.optm_qtol is not None): savereal(fptr, opts.optm_qtol, "OPTM_QTOL") if (opts.optm_qlim is not None): diff --git a/jigsawpy/savemsh.py b/jigsawpy/savemsh.py index a23ce45..da61d8a 100644 --- a/jigsawpy/savemsh.py +++ b/jigsawpy/savemsh.py @@ -595,7 +595,7 @@ def save_grid_file(mesh, fptr, args, kind): return -def savemsh(name, mesh, tags=None): +def savemsh(name, mesh): """ SAVEMSH: save a JIGSAW MSH object to file. @@ -610,10 +610,10 @@ def savemsh(name, mesh, tags=None): """ if (not isinstance(name, str)): - raise Exception("Incorrect type: NAME.") + raise TypeError("Incorrect type: NAME.") if (not isinstance(mesh, jigsaw_msh_t)): - raise Exception("Incorrect type: MESH.") + raise TypeError("Incorrect type: MESH.") certify(mesh) @@ -621,7 +621,7 @@ class stub(object): pass args = stub() ## savmsh params args.kind = "ascii" - args.nver = + 3 + args.nver = 3 fext = Path(name).suffix @@ -629,13 +629,6 @@ class stub(object): pass kind = mesh.mshID.lower() - if (tags is not None): - #----------------------------------- parse savmsh params - stag = tags.lower().split(";") - for this in stag: - if "binary" in this: - args.kind = "binary" - with Path(name).open("w") as fptr: #----------------------------------- write JIGSAW object fptr.write( diff --git a/jigsawpy/tools/orthoball.py b/jigsawpy/tools/orthoball.py index e51d22d..8940e55 100644 --- a/jigsawpy/tools/orthoball.py +++ b/jigsawpy/tools/orthoball.py @@ -132,7 +132,7 @@ def pwrbal1(ppos, ppwr, tri1): np.squeeze((rad1 + rad2) / +2.00) else: - raise Exception("Unsupported dimension.") + raise ValueError("Unsupported dimension.") return ball @@ -298,7 +298,7 @@ def pwrbal2(ppos, ppwr, tri2): ) else: - raise Exception("Unsupported dimension.") + raise ValueError("Unsupported dimension.") return ball @@ -407,6 +407,6 @@ def pwrbal3(ppos, ppwr, tri3): ) else: - raise Exception("Unsupported dimension.") + raise ValueError("Unsupported dimension.") return ball diff --git a/jigsawpy/tools/predicate.py b/jigsawpy/tools/predicate.py index 7f8a7da..1579734 100644 --- a/jigsawpy/tools/predicate.py +++ b/jigsawpy/tools/predicate.py @@ -12,28 +12,28 @@ def istri_1(ppos, tri1): #--------------------------------------- some simple checks! if (not isinstance(ppos, np.ndarray)): - raise Exception("Invalid type: PPOS.") + raise TypeError("Invalid type: PPOS.") if (not isinstance(tri1, np.ndarray)): - raise Exception("Invalid type: TRIA.") + raise TypeError("Invalid type: TRIA.") if (ppos.ndim != +2): - raise Exception("Invalid PPOS ndims.") + raise ValueError("Invalid PPOS ndims.") if (ppos.shape[1] < +2): - raise Exception("Invalid PPOS shape.") + raise ValueError("Invalid PPOS shape.") nump = ppos.shape[0] if (tri1.ndim != +2): - raise Exception("Invalid TRIA ndims.") + raise ValueError("Invalid TRIA ndims.") if (tri1.shape[1] < +2): - raise Exception("Invalid TRIA shape.") + raise ValueError("Invalid TRIA shape.") if (np.min(tri1[:, 0:1]) < +0 or np.max(tri1[:, 0:1]) >= nump): - raise Exception("Invalid TRIA index.") + raise IndexError("Invalid TRIA index.") return okay @@ -48,28 +48,28 @@ def istri_2(ppos, tri2): #--------------------------------------- some simple checks! if (not isinstance(ppos, np.ndarray)): - raise Exception("Invalid type: PPOS.") + raise TypeError("Invalid type: PPOS.") if (not isinstance(tri2, np.ndarray)): - raise Exception("Invalid type: TRIA.") + raise TypeError("Invalid type: TRIA.") if (ppos.ndim != +2): - raise Exception("Invalid PPOS ndims.") + raise ValueError("Invalid PPOS ndims.") if (ppos.shape[1] < +2): - raise Exception("Invalid PPOS shape.") + raise ValueError("Invalid PPOS shape.") nump = ppos.shape[0] if (tri2.ndim != +2): - raise Exception("Invalid TRIA ndims.") + raise ValueError("Invalid TRIA ndims.") if (tri2.shape[1] < +3): - raise Exception("Invalid TRIA shape.") + raise ValueError("Invalid TRIA shape.") if (np.min(tri2[:, 0:2]) < +0 or np.max(tri2[:, 0:2]) >= nump): - raise Exception("Invalid TRIA index.") + raise IndexError("Invalid TRIA index.") return okay @@ -84,28 +84,28 @@ def istri_3(ppos, tri3): #--------------------------------------- some simple checks! if (not isinstance(ppos, np.ndarray)): - raise Exception("Invalid type: PPOS.") + raise TypeError("Invalid type: PPOS.") if (not isinstance(tri3, np.ndarray)): - raise Exception("Invalid type: TRIA.") + raise TypeError("Invalid type: TRIA.") if (ppos.ndim != +2): - raise Exception("Invalid PPOS ndims.") + raise ValueError("Invalid PPOS ndims.") if (ppos.shape[1] < +3): - raise Exception("Invalid PPOS shape.") + raise ValueError("Invalid PPOS shape.") nump = ppos.shape[0] if (tri3.ndim != +2): - raise Exception("Invalid TRIA ndims.") + raise ValueError("Invalid TRIA ndims.") if (tri3.shape[1] < +4): - raise Exception("Invalid TRIA shape.") + raise ValueError("Invalid TRIA shape.") if (np.min(tri3[:, 0:3]) < +0 or np.max(tri3[:, 0:3]) >= nump): - raise Exception("Invalid TRIA index.") + raise IndexError("Invalid TRIA index.") return okay @@ -145,7 +145,7 @@ def trivol2(ppos, tri2): vol2 = 0.5 * vol2 else: - raise Exception( + raise ValueError( "Invalid dimension X**d!!") return vol2 @@ -193,7 +193,7 @@ def trivol3(ppos, tri3): vol3 = vdet / 6.0 else: - raise Exception( + raise ValueError( "Invalid dimension X**d!!") return vol3 diff --git a/jigsawpy/tools/scorecard.py b/jigsawpy/tools/scorecard.py index 10e7582..620abb8 100644 --- a/jigsawpy/tools/scorecard.py +++ b/jigsawpy/tools/scorecard.py @@ -168,9 +168,12 @@ def triang2(ppos, tri2): dcos = np.empty( (tri2.shape[0], 3), dtype=ppos.dtype) - ee11 = normal1(ppos, tri2[:, (0, 1)]) - ee22 = normal1(ppos, tri2[:, (1, 2)]) - ee33 = normal1(ppos, tri2[:, (2, 0)]) + ee11 = ppos[tri2[:, 1], :] \ + - ppos[tri2[:, 0], :] + ee22 = ppos[tri2[:, 2], :] \ + - ppos[tri2[:, 1], :] + ee33 = ppos[tri2[:, 0], :] \ + - ppos[tri2[:, 2], :] ll11 = np.sqrt(np.sum( ee11 ** 2, axis=1, keepdims=True)) @@ -387,7 +390,7 @@ def pwrscr2(ppos, ppwr, tri2): ll33 = +0.25 * np.sum( vvec ** 2, axis=1, keepdims=True) - lf00 = (ll11 + ll22 + ll33) / 3.0 + lf00 = (ll11 * ll11 * ll33) ** (1./3) #--------------------------------------- form quality metric qf00 = +1.00 - df00 / lf00 @@ -533,8 +536,8 @@ def pwrscr3(ppos, ppwr, tri3): ll66 = +0.25 * np.sum( vvec ** 2, axis=1, keepdims=True) - lt00 = (ll11 + ll22 + ll33 + - ll44 + ll55 + ll66) / 6.0 + lt00 = (ll11 * ll22 * ll33 + + ll44 * ll55 * ll66) ** (1./6) #--------------------------------------- form quality metric qt00 = +1.00 - dt00 / lt00 @@ -613,7 +616,7 @@ def centre2(ppos, ppwr, tri2): sgn3 = np.sum(nrm3 * nrm1, axis=1) else: - raise Exception("Unsupported dimension.") + raise ValueError("Unsupported dimension.") #------------------------------------- interior if same sign return np.logical_and.reduce(( @@ -671,7 +674,7 @@ def centre3(ppos, ppwr, tri3): ppos[tri3[:, 0], :], ball) else: - raise Exception("Unsupported dimension.") + raise ValueError("Unsupported dimension.") #------------------------------------- interior if same sign return np.logical_and.reduce(( diff --git a/requirements.txt b/requirements.txt new file mode 100644 index 0000000..f1c7422 --- /dev/null +++ b/requirements.txt @@ -0,0 +1,3 @@ +numpy +scipy +packaging diff --git a/setup.py b/setup.py index 37fcb5f..374404f 100644 --- a/setup.py +++ b/setup.py @@ -5,6 +5,7 @@ import shutil from setuptools import setup, find_packages, Command +from packaging import version NAME = "jigsawpy" DESCRIPTION = \ @@ -12,7 +13,7 @@ AUTHOR = "Darren Engwirda" AUTHOR_EMAIL = "d.engwirda@gmail.com" URL = "https://github.com/dengwirda/" -VERSION = "0.3.6" +VERSION = "1.0.0" REQUIRES_PYTHON = ">=3.6.0" KEYWORDS = "Mesh-generation Delaunay Voronoi" @@ -21,7 +22,7 @@ ] CLASSIFY = [ - "Development Status :: 4 - Beta", + "Development Status :: 5 - Production/Stable", "Operating System :: OS Independent", "Intended Audience :: Science/Research", "Programming Language :: Python", @@ -44,6 +45,18 @@ LONG_DESCRIPTION = DESCRIPTION +def get_cmake_version(): + try: + out = subprocess.check_output( + ["cmake", "--version"]).decode("utf-8") + sln = out.splitlines()[0] + ver = sln.split()[2] + return ver + + except: + print("cmake not found!") + + class build_external(Command): description = "build external JIGSAW dependencies" @@ -101,18 +114,27 @@ def run(self): self.announce("cmake complie", level=3) - compilecall = ["cmake", "--build", ".", - "--config", "Release", - "--target", "install"] + ver = get_cmake_version() + if version.parse(ver) < version.parse("3.12"): + compilecall = [ + "cmake", "--build", ".", + "--config", "Release", + "--target", "install" + ] + else: + compilecall = [ + "cmake", "--build", ".", + "--config", "Release", + "--target", "install", + "--parallel", "4" + ] subprocess.run(compilecall, check=True) self.announce("cmake cleanup", level=3) - shutil.copytree( - exesrc_path, exedst_path) - shutil.copytree( - libsrc_path, libdst_path) + shutil.copytree(exesrc_path, exedst_path) + shutil.copytree(libsrc_path, libdst_path) finally: os.chdir(cwd_pointer)